"adb reverse" currently does not work over tcpip (i.e. on a device connected by "adb connect"): <https://issuetracker.google.com/issues/37066218> To work around the problem, if the call to "adb reverse" fails, then fallback to "adb forward", and reverse the client/server roles. Keep the "adb reverse" mode as the default because it does not involve connection retries: when using "adb forward", the client must try to connect successively until the server listens. Due to the tunnel, every connect() will succeed, so the client must attempt to read() to detect a connection failure. For this purpose, when using the "adb forward" mode, the server initially writes a dummy byte, read by the client. Fixes <https://github.com/Genymobile/scrcpy/issues/5>.
53 lines
1.7 KiB
C
53 lines
1.7 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_forward_remove(const char *serial, uint16_t local_port);
|
|
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);
|
|
process_t adb_remove_path(const char *serial, const char *path);
|
|
|
|
// 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
|