From 7229e3cce033591127148523197c9fd56a1ab78d Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Fri, 22 Oct 2021 18:51:20 +0200 Subject: [PATCH] Extract util function to build a local file path Finding a local file in the scrcpy directory may be useful for files other than scrcpy-server in the future. --- app/src/server.c | 40 ++-------------------------------------- app/src/util/process.c | 42 ++++++++++++++++++++++++++++++++++++++++++ app/src/util/process.h | 5 +++++ 3 files changed, 49 insertions(+), 38 deletions(-) diff --git a/app/src/server.c b/app/src/server.c index e3c8c344..7c0d3d3f 100644 --- a/app/src/server.c +++ b/app/src/server.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -51,48 +50,13 @@ get_server_path(void) { // the absolute path is hardcoded return server_path; #else - - // use scrcpy-server in the same directory as the executable - char *executable_path = get_executable_path(); - if (!executable_path) { - LOGE("Could not get executable path, " - "using " SERVER_FILENAME " from current directory"); - // not found, use current directory - return strdup(SERVER_FILENAME); - } - - // dirname() does not work correctly everywhere, so get the parent - // directory manually. - // See - char *p = strrchr(executable_path, PATH_SEPARATOR); - if (!p) { - LOGE("Unexpected executable path: \"%s\" (it should contain a '%c')", - executable_path, PATH_SEPARATOR); - free(executable_path); - return strdup(SERVER_FILENAME); - } - - *p = '\0'; // modify executable_path in place - char *dir = executable_path; - size_t dirlen = strlen(dir); - - // sizeof(SERVER_FILENAME) gives statically the size including the null byte - size_t len = dirlen + 1 + sizeof(SERVER_FILENAME); - char *server_path = malloc(len); + char *server_path = get_local_file_path(SERVER_FILENAME); if (!server_path) { - LOGE("Could not alloc server path string, " + LOGE("Could not get local file path, " "using " SERVER_FILENAME " from current directory"); - free(executable_path); return strdup(SERVER_FILENAME); } - memcpy(server_path, dir, dirlen); - server_path[dirlen] = PATH_SEPARATOR; - memcpy(&server_path[dirlen + 1], SERVER_FILENAME, sizeof(SERVER_FILENAME)); - // the final null byte has been copied with SERVER_FILENAME - - free(executable_path); - LOGD("Using server (portable): %s", server_path); return server_path; #endif diff --git a/app/src/util/process.c b/app/src/util/process.c index 5edeeee6..a9af4d67 100644 --- a/app/src/util/process.c +++ b/app/src/util/process.c @@ -1,5 +1,6 @@ #include "process.h" +#include #include "log.h" bool @@ -19,3 +20,44 @@ process_check_success(process_t proc, const char *name, bool close) { } return true; } + +char * +get_local_file_path(const char *name) { + char *executable_path = get_executable_path(); + if (!executable_path) { + return NULL; + } + + // dirname() does not work correctly everywhere, so get the parent + // directory manually. + // See + char *p = strrchr(executable_path, PATH_SEPARATOR); + if (!p) { + LOGE("Unexpected executable path: \"%s\" (it should contain a '%c')", + executable_path, PATH_SEPARATOR); + free(executable_path); + return NULL; + } + + *p = '\0'; // modify executable_path in place + char *dir = executable_path; + size_t dirlen = strlen(dir); + size_t namelen = strlen(name); + + size_t len = dirlen + namelen + 2; // +2: '/' and '\0' + char *file_path = malloc(len); + if (!file_path) { + LOGE("Could not alloc path"); + free(executable_path); + return NULL; + } + + memcpy(file_path, dir, dirlen); + file_path[dirlen] = PATH_SEPARATOR; + // namelen + 1 to copy the final '\0' + memcpy(&file_path[dirlen + 1], name, namelen + 1); + + free(executable_path); + + return file_path; +} diff --git a/app/src/util/process.h b/app/src/util/process.h index 7838a848..6aca6bf5 100644 --- a/app/src/util/process.h +++ b/app/src/util/process.h @@ -74,6 +74,11 @@ search_executable(const char *file); char * get_executable_path(void); +// Return the absolute path of a file in the same directory as he executable. +// May be NULL on error. To be freed by free(). +char * +get_local_file_path(const char *name); + // returns true if the file exists and is not a directory bool is_regular_file(const char *path);