From 385d06c5001db61ad29fc87d601182424022fad7 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 20 Jan 2009 16:27:27 -0800 Subject: [PATCH] process: New function process_escape_args(). --- lib/process.c | 53 +++++++++++++++++++++++++++++---------------------- lib/process.h | 1 + 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/lib/process.c b/lib/process.c index 087ca6b8..c3e3de5c 100644 --- a/lib/process.c +++ b/lib/process.c @@ -107,6 +107,33 @@ process_init(void) } } +char * +process_escape_args(char **argv) +{ + struct ds ds = DS_EMPTY_INITIALIZER; + char **argp; + for (argp = argv; *argp; argp++) { + const char *arg = *argp; + const char *p; + if (argp != argv) { + ds_put_char(&ds, ' '); + } + if (arg[strcspn(arg, " \t\r\n\v\\")]) { + ds_put_char(&ds, '"'); + for (p = arg; *p; p++) { + if (*p == '\\' || *p == '\"') { + ds_put_char(&ds, '\\'); + } + ds_put_char(&ds, *p); + } + ds_put_char(&ds, '"'); + } else { + ds_put_cstr(&ds, arg); + } + } + return ds_cstr(&ds); +} + /* Starts a subprocess with the arguments in the null-terminated argv[] array. * argv[0] is used as the name of the process. Searches the PATH environment * variable to find the program to execute. @@ -131,29 +158,9 @@ process_start(char **argv, process_init(); if (VLOG_IS_DBG_ENABLED()) { - struct ds ds = DS_EMPTY_INITIALIZER; - char **argp; - for (argp = argv; *argp; argp++) { - const char *arg = *argp; - const char *p; - if (argp != argv) { - ds_put_char(&ds, ' '); - } - if (arg[strcspn(arg, " \t\r\n\v\\")]) { - ds_put_char(&ds, '"'); - for (p = arg; *p; p++) { - if (*p == '\\' || *p == '\"') { - ds_put_char(&ds, '\\'); - } - ds_put_char(&ds, *p); - } - ds_put_char(&ds, '"'); - } else { - ds_put_cstr(&ds, arg); - } - } - VLOG_DBG("starting subprocess: %s", ds_cstr(&ds)); - ds_destroy(&ds); + char *args = process_escape_args(argv); + VLOG_DBG("starting subprocess: %s", args); + free(args); } /* execvp() will search PATH too, but the error in that case is more diff --git a/lib/process.h b/lib/process.h index fcdd9130..ee7876e1 100644 --- a/lib/process.h +++ b/lib/process.h @@ -39,6 +39,7 @@ struct process; void process_init(void); +char *process_escape_args(char **argv); int process_start(char **argv, const int *keep_fds, size_t n_keep_fds, const int *null_fds, size_t n_null_fds, -- 2.30.2