diff --git a/app/src/cli.c b/app/src/cli.c index 2c759850..f822572a 100644 --- a/app/src/cli.c +++ b/app/src/cli.c @@ -652,6 +652,7 @@ guess_record_format(const char *filename) { #define OPT_SHORTCUT_MOD 1021 #define OPT_NO_KEY_REPEAT 1022 #define OPT_USE_SSH 1024 +#define OPT_SSH_ENDPOINT 1025 bool scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) { @@ -687,6 +688,7 @@ scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) { {"serial", required_argument, NULL, 's'}, {"shortcut-mod", required_argument, NULL, OPT_SHORTCUT_MOD}, {"show-touches", no_argument, NULL, 't'}, + {"ssh-endpoint", required_argument, NULL, OPT_SSH_ENDPOINT}, {"stay-awake", no_argument, NULL, 'w'}, {"turn-screen-off", no_argument, NULL, 'S'}, {"verbosity", required_argument, NULL, 'V'}, @@ -801,6 +803,9 @@ scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) { case OPT_WINDOW_TITLE: opts->window_title = optarg; break; + case OPT_SSH_ENDPOINT: + opts->ssh_endpoint = optarg; + break; case OPT_WINDOW_X: if (!parse_window_position(optarg, &opts->window_x)) { return false; diff --git a/app/src/command.c b/app/src/command.c index 81047b7a..b702dd4d 100644 --- a/app/src/command.c +++ b/app/src/command.c @@ -102,6 +102,24 @@ show_adb_err_msg(enum process_result err, const char *const argv[]) { } } +process_t +ssh_execute(const char *endpoint, const char *const adb_cmd[], size_t len) { + const char *cmd[len + 3]; + int i = 2; + process_t process; + cmd[0] = "ssh"; + cmd[1] = endpoint; + + memcpy(&cmd[i], adb_cmd, len * sizeof(const char *)); + cmd[len + i] = NULL; + enum process_result r = cmd_execute(cmd, &process); + if (r != PROCESS_SUCCESS) { + show_adb_err_msg(r, cmd); + return PROCESS_NONE; + } + return process; +} + process_t adb_execute(const char *serial, const char *const adb_cmd[], size_t len) { const char *cmd[len + 4]; diff --git a/app/src/command.h b/app/src/command.h index 28f9fbcf..f196f304 100644 --- a/app/src/command.h +++ b/app/src/command.h @@ -57,6 +57,9 @@ cmd_terminate(process_t pid); bool cmd_simple_wait(process_t pid, exit_code_t *exit_code); +process_t +ssh_execute(const char *serial, const char *const adb_cmd[], size_t len); + process_t adb_execute(const char *serial, const char *const adb_cmd[], size_t len); diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index 45068cbb..ad1b1255 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -319,6 +319,8 @@ scrcpy(const struct scrcpy_options *options) { .stay_awake = options->stay_awake, .codec_options = options->codec_options, .force_adb_forward = options->force_adb_forward, + .use_ssh = options->use_ssh, + .ssh_endpoint = options->ssh_endpoint, }; if (!server_start(&server, options->serial, ¶ms)) { return false; diff --git a/app/src/scrcpy.h b/app/src/scrcpy.h index 6065a513..22d4a510 100644 --- a/app/src/scrcpy.h +++ b/app/src/scrcpy.h @@ -51,6 +51,7 @@ struct scrcpy_options { const char *push_target; const char *render_driver; const char *codec_options; + const char *ssh_endpoint; enum sc_log_level log_level; enum sc_record_format record_format; struct sc_port_range port_range; @@ -125,6 +126,7 @@ struct scrcpy_options { .disable_screensaver = false, \ .forward_key_repeat = true, \ .use_ssh = false, \ + .ssh_endpoint = NULL, \ } bool diff --git a/app/src/server.c b/app/src/server.c index 05b2cf91..7159abf4 100644 --- a/app/src/server.c +++ b/app/src/server.c @@ -265,6 +265,7 @@ execute_server(struct server *server, const struct server_params *params) { sprintf(display_id_string, "%"PRIu16, params->display_id); const char *const cmd[] = { "shell", + params->use_ssh ? "ANDROID_DATA=/data" : "UNUSED_ENV_VAR=/data", "CLASSPATH=" DEVICE_SERVER_PATH, "app_process", #ifdef SERVER_DEBUGGER @@ -306,7 +307,10 @@ execute_server(struct server *server, const struct server_params *params) { // Port: 5005 // Then click on "Debug" #endif - return adb_execute(server->serial, cmd, sizeof(cmd) / sizeof(cmd[0])); + if (params->use_ssh) + return ssh_execute(params->ssh_endpoint, cmd, sizeof(cmd) / sizeof(cmd[0])); + else + return adb_execute(server->serial, cmd, sizeof(cmd) / sizeof(cmd[0])); } static socket_t diff --git a/app/src/server.h b/app/src/server.h index 254afe30..4697300c 100644 --- a/app/src/server.h +++ b/app/src/server.h @@ -48,6 +48,7 @@ struct server_params { enum sc_log_level log_level; const char *crop; const char *codec_options; + const char *ssh_endpoint; struct sc_port_range port_range; uint16_t max_size; uint32_t bit_rate; @@ -58,6 +59,7 @@ struct server_params { bool show_touches; bool stay_awake; bool force_adb_forward; + bool use_ssh; }; // init default values