9b056f5091
SDL_net is not very suitable for scrcpy. For example, SDLNet_TCP_Accept() is non-blocking, so we have to wrap it by calling many SDL_Net-specific functions to make it blocking. But above all, SDLNet_TCP_Open() is a server socket only when no IP is provided; otherwise, it's a client socket. Therefore, it is not possible to create a server socket bound to localhost, so it accepts connections from anywhere. This is a problem for scrcpy, because on start, the application listens for nearly 1 second until it accepts the first connection, supposedly from the device. If someone on the local network manages to connect to the server socket first, then they can stream arbitrary H.264 video. This may be troublesome, for example during a public presentation ;-) Provide our own simplified API (net.h) instead, implemented for the different platforms.
50 lines
1.5 KiB
C
50 lines
1.5 KiB
C
#ifndef COMMAND_H
|
|
#define COMMAND_H
|
|
|
|
#include <inttypes.h>
|
|
#include <SDL2/SDL_stdinc.h>
|
|
#include <SDL2/SDL_platform.h>
|
|
|
|
// <https://stackoverflow.com/a/44383330/1987178>
|
|
#ifdef _WIN32
|
|
# ifdef _WIN64
|
|
# define PRIsizet PRIu64
|
|
# define PRIexitcode "lu"
|
|
# else
|
|
# define PRIsizet PRIu32
|
|
# define PRIexitcode "u"
|
|
# endif
|
|
#else
|
|
# define PRIsizet "zu"
|
|
# define PRIexitcode "d"
|
|
#endif
|
|
|
|
#ifdef __WINDOWS__
|
|
# include <winsock2.h> // not needed here, but must never be included AFTER windows.h
|
|
# include <windows.h>
|
|
# define PROCESS_NONE NULL
|
|
typedef HANDLE process_t;
|
|
typedef DWORD exit_code_t;
|
|
#else
|
|
# include <sys/types.h>
|
|
# define PROCESS_NONE -1
|
|
typedef pid_t process_t;
|
|
typedef int exit_code_t;
|
|
#endif
|
|
# define NO_EXIT_CODE -1
|
|
|
|
process_t cmd_execute(const char *path, const char *const argv[]);
|
|
SDL_bool cmd_terminate(process_t pid);
|
|
SDL_bool cmd_simple_wait(process_t pid, exit_code_t *exit_code);
|
|
|
|
process_t adb_execute(const char *serial, const char *const adb_cmd[], int len);
|
|
process_t adb_forward(const char *serial, uint16_t local_port, const char *device_socket_name);
|
|
process_t adb_reverse(const char *serial, const char *device_socket_name, uint16_t local_port);
|
|
process_t adb_reverse_remove(const char *serial, const char *device_socket_name);
|
|
process_t adb_push(const char *serial, const char *local, const char *remote);
|
|
|
|
// convenience function to wait for a successful process execution
|
|
// automatically log process errors with the provided process name
|
|
SDL_bool process_check_success(process_t process, const char *name);
|
|
|
|
#endif
|