diff options
Diffstat (limited to 'src/Process.cpp')
-rw-r--r-- | src/Process.cpp | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/src/Process.cpp b/src/Process.cpp index c5fcf0f..c02753a 100644 --- a/src/Process.cpp +++ b/src/Process.cpp @@ -40,12 +40,13 @@ namespace gsr { return num_args; } - bool exec_program_daemonized(const char **args) { + bool exec_program_daemonized(const char **args, bool debug) { /* 1 argument */ if(args[0] == nullptr) return false; - debug_print_args(args); + if(debug) + debug_print_args(args); const pid_t pid = vfork(); if(pid == -1) { @@ -72,7 +73,7 @@ namespace gsr { return true; } - pid_t exec_program(const char **args, int *read_fd) { + pid_t exec_program(const char **args, int *read_fd, bool debug) { if(read_fd) *read_fd = -1; @@ -84,7 +85,8 @@ namespace gsr { if(pipe(fds) == -1) return -1; - debug_print_args(args); + if(debug) + debug_print_args(args); const pid_t pid = vfork(); if(pid == -1) { @@ -110,10 +112,10 @@ namespace gsr { } } - int exec_program_get_stdout(const char **args, std::string &result) { + int exec_program_get_stdout(const char **args, std::string &result, bool debug) { result.clear(); int read_fd = -1; - const pid_t process_id = exec_program(args, &read_fd); + const pid_t process_id = exec_program(args, &read_fd, debug); if(process_id == -1) return -1; @@ -128,8 +130,6 @@ namespace gsr { exit_status = -1; break; } - - buffer[bytes_read] = '\0'; result.append(buffer, bytes_read); } @@ -152,7 +152,7 @@ namespace gsr { return exit_status; } - int exec_program_on_host_get_stdout(const char **args, std::string &result) { + int exec_program_on_host_get_stdout(const char **args, std::string &result, bool debug) { if(count_num_args(args) > 64 - 3) { fprintf(stderr, "Error: too many arguments when trying to launch \"%s\"\n", args[0]); return -1; @@ -170,17 +170,27 @@ namespace gsr { } modified_args[i] = arg; } - return exec_program_get_stdout(modified_args, result); + return exec_program_get_stdout(modified_args, result, debug); } else { - return exec_program_get_stdout(args, result); + return exec_program_get_stdout(args, result, debug); + } + } + + static const char *get_basename(const char *path, int size) { + for(int i = size - 1; i >= 0; --i) { + if(path[i] == '/') + return path + i + 1; } + return path; } // |output_buffer| should be at least PATH_MAX in size bool read_cmdline_arg0(const char *filepath, char *output_buffer, int output_buffer_size) { output_buffer[0] = '\0'; + const char *arg0_start = NULL; const char *arg0_end = NULL; + int arg0_size = 0; int fd = open(filepath, O_RDONLY); if(fd == -1) return false; @@ -190,13 +200,16 @@ namespace gsr { if(bytes_read == -1) goto err; - arg0_end = (const char*)memchr(buffer, '\0', bytes_read); + arg0_start = buffer; + arg0_end = (const char*)memchr(arg0_start, '\0', bytes_read); if(!arg0_end) goto err; - if((arg0_end - buffer) + 1 <= output_buffer_size) { - memcpy(output_buffer, buffer, arg0_end - buffer); - output_buffer[arg0_end - buffer] = '\0'; + arg0_start = get_basename(arg0_start, arg0_end - arg0_start); + arg0_size = arg0_end - arg0_start; + if(arg0_size + 1 <= output_buffer_size) { + memcpy(output_buffer, arg0_start, arg0_size); + output_buffer[arg0_size] = '\0'; close(fd); return true; } |