From 52f5c6d4c17e7a43591b487b46fe3c16c73897e4 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sun, 2 May 2021 15:01:18 +0200 Subject: [PATCH] server_params_copy --- app/src/scrcpy.c | 11 +++++---- app/src/server.c | 63 +++++++++++++++++++++++++++++++++++++++++++++--- app/src/server.h | 10 +++++--- 3 files changed, 72 insertions(+), 12 deletions(-) diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index e847037e..a5b023cf 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -243,10 +243,6 @@ av_log_callback(void *avcl, int level, const char *fmt, va_list vl) { bool scrcpy(const struct scrcpy_options *options) { - if (!server_init(&server)) { - return false; - } - bool ret = false; bool server_started = false; @@ -279,7 +275,12 @@ scrcpy(const struct scrcpy_options *options) { .force_adb_forward = options->force_adb_forward, .power_off_on_close = options->power_off_on_close, }; - if (!server_start(&server, options->serial, ¶ms)) { + + if (!server_init(&server, ¶ms)) { + return false; + } + + if (!server_start(&server, options->serial)) { goto end; } diff --git a/app/src/server.c b/app/src/server.c index c95f95a7..4925078b 100644 --- a/app/src/server.c +++ b/app/src/server.c @@ -352,8 +352,61 @@ close_socket(socket_t socket) { } } +static void +server_params_destroy(struct server_params *params) { + // The server stores a copy of the params provided by the user + free((char *) params->crop); + free((char *) params->codec_options); + free((char *) params->encoder_name); +} + +static bool +server_params_copy(struct server_params *dst, const struct server_params *src) { + // params reference user-allocated memory, so we must copy them to handle + // them from a separate thread + + *dst = *src; + + dst->crop = NULL; + dst->codec_options = NULL; + dst->encoder_name = NULL; + + if (src->crop) { + dst->crop = strdup(src->crop); + if (!dst->crop) { + goto error; + } + } + + if (src->codec_options) { + dst->codec_options = strdup(src->codec_options); + if (!dst->codec_options) { + goto error; + } + } + + if (src->encoder_name) { + dst->encoder_name = strdup(src->encoder_name); + if (!dst->encoder_name) { + goto error; + } + } + + return true; + +error: + server_params_destroy(dst); + return false; +}; + + bool -server_init(struct server *server) { +server_init(struct server *server, const struct server_params *params) { + if (!server_params_copy(&server->params, params)) { + LOGE("Could not copy server params"); + return false; + } + server->serial = NULL; server->process = PROCESS_NONE; atomic_flag_clear_explicit(&server->server_socket_closed, @@ -361,12 +414,14 @@ server_init(struct server *server) { bool ok = sc_mutex_init(&server->mutex); if (!ok) { + server_params_destroy(&server->params); return false; } ok = sc_cond_init(&server->process_terminated_cond); if (!ok) { sc_mutex_destroy(&server->mutex); + server_params_destroy(&server->params); return false; } @@ -407,8 +462,9 @@ run_wait_server(void *data) { } bool -server_start(struct server *server, const char *serial, - const struct server_params *params) { +server_start(struct server *server, const char *serial) { + const struct server_params *params = &server->params; + if (serial) { server->serial = strdup(serial); if (!server->serial) { @@ -558,4 +614,5 @@ server_destroy(struct server *server) { free(server->serial); sc_cond_destroy(&server->process_terminated_cond); sc_mutex_destroy(&server->mutex); + server_params_destroy(&server->params); } diff --git a/app/src/server.h b/app/src/server.h index 38e0024d..eca29530 100644 --- a/app/src/server.h +++ b/app/src/server.h @@ -47,16 +47,18 @@ struct server { uint16_t local_port; // selected from port_range bool tunnel_enabled; bool tunnel_forward; // use "adb forward" instead of "adb reverse" + + // The internal allocated strings are copies owned by the server + struct server_params params; }; -// init default values +// init server fields bool -server_init(struct server *server); +server_init(struct server *server, const struct server_params *params); // push, enable tunnel et start the server bool -server_start(struct server *server, const char *serial, - const struct server_params *params); +server_start(struct server *server, const char *serial); // block until the communication with the server is established bool