diff options
Diffstat (limited to 'src/openvpn/argv.c')
-rw-r--r-- | src/openvpn/argv.c | 370 |
1 files changed, 199 insertions, 171 deletions
diff --git a/src/openvpn/argv.c b/src/openvpn/argv.c index 596e59c..cc813ed 100644 --- a/src/openvpn/argv.c +++ b/src/openvpn/argv.c @@ -5,7 +5,7 @@ * packet encryption, packet authentication, and * packet compression. * - * Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net> + * Copyright (C) 2002-2017 OpenVPN Technologies, Inc. <sales@openvpn.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 @@ -40,276 +40,304 @@ #include "options.h" static void -argv_init (struct argv *a) +argv_init(struct argv *a) { - a->capacity = 0; - a->argc = 0; - a->argv = NULL; + a->capacity = 0; + a->argc = 0; + a->argv = NULL; } struct argv -argv_new (void) +argv_new(void) { - struct argv ret; - argv_init (&ret); - return ret; + struct argv ret; + argv_init(&ret); + return ret; } void -argv_reset (struct argv *a) +argv_reset(struct argv *a) { - size_t i; - for (i = 0; i < a->argc; ++i) - free (a->argv[i]); - free (a->argv); - argv_init (a); + size_t i; + for (i = 0; i < a->argc; ++i) + free(a->argv[i]); + free(a->argv); + argv_init(a); } static void -argv_extend (struct argv *a, const size_t newcap) +argv_extend(struct argv *a, const size_t newcap) { - if (newcap > a->capacity) + if (newcap > a->capacity) { - char **newargv; - size_t i; - ALLOC_ARRAY_CLEAR (newargv, char *, newcap); - for (i = 0; i < a->argc; ++i) - newargv[i] = a->argv[i]; - free (a->argv); - a->argv = newargv; - a->capacity = newcap; + char **newargv; + size_t i; + ALLOC_ARRAY_CLEAR(newargv, char *, newcap); + for (i = 0; i < a->argc; ++i) + newargv[i] = a->argv[i]; + free(a->argv); + a->argv = newargv; + a->capacity = newcap; } } static void -argv_grow (struct argv *a, const size_t add) +argv_grow(struct argv *a, const size_t add) { - const size_t newargc = a->argc + add + 1; - ASSERT (newargc > a->argc); - argv_extend (a, adjust_power_of_2 (newargc)); + const size_t newargc = a->argc + add + 1; + ASSERT(newargc > a->argc); + argv_extend(a, adjust_power_of_2(newargc)); } static void -argv_append (struct argv *a, char *str) /* str must have been malloced or be NULL */ +argv_append(struct argv *a, char *str) /* str must have been malloced or be NULL */ { - argv_grow (a, 1); - a->argv[a->argc++] = str; + argv_grow(a, 1); + a->argv[a->argc++] = str; } static struct argv -argv_clone (const struct argv *a, const size_t headroom) +argv_clone(const struct argv *a, const size_t headroom) { - struct argv r; - size_t i; + struct argv r; + size_t i; - argv_init (&r); - for (i = 0; i < headroom; ++i) - argv_append (&r, NULL); - if (a) + argv_init(&r); + for (i = 0; i < headroom; ++i) + argv_append(&r, NULL); + if (a) { - for (i = 0; i < a->argc; ++i) - argv_append (&r, string_alloc (a->argv[i], NULL)); + for (i = 0; i < a->argc; ++i) + argv_append(&r, string_alloc(a->argv[i], NULL)); } - return r; + return r; } struct argv -argv_insert_head (const struct argv *a, const char *head) +argv_insert_head(const struct argv *a, const char *head) { - struct argv r; - r = argv_clone (a, 1); - r.argv[0] = string_alloc (head, NULL); - return r; + struct argv r; + r = argv_clone(a, 1); + r.argv[0] = string_alloc(head, NULL); + return r; } static char * -argv_term (const char **f) +argv_term(const char **f) { - const char *p = *f; - const char *term = NULL; - size_t termlen = 0; + const char *p = *f; + const char *term = NULL; + size_t termlen = 0; - if (*p == '\0') - return NULL; + if (*p == '\0') + { + return NULL; + } - while (true) + while (true) { - const int c = *p; - if (c == '\0') - break; - if (term) + const int c = *p; + if (c == '\0') { - if (!isspace (c)) - ++termlen; - else break; } - else + if (term) + { + if (!isspace(c)) + { + ++termlen; + } + else + { + break; + } + } + else { - if (!isspace (c)) + if (!isspace(c)) { - term = p; - termlen = 1; + term = p; + termlen = 1; } } - ++p; + ++p; } - *f = p; + *f = p; - if (term) + if (term) + { + char *ret; + ASSERT(termlen > 0); + ret = malloc(termlen + 1); + check_malloc_return(ret); + memcpy(ret, term, termlen); + ret[termlen] = '\0'; + return ret; + } + else { - char *ret; - ASSERT (termlen > 0); - ret = malloc (termlen + 1); - check_malloc_return (ret); - memcpy (ret, term, termlen); - ret[termlen] = '\0'; - return ret; + return NULL; } - else - return NULL; } const char * -argv_str (const struct argv *a, struct gc_arena *gc, const unsigned int flags) +argv_str(const struct argv *a, struct gc_arena *gc, const unsigned int flags) { - if (a->argv) - return print_argv ((const char **)a->argv, gc, flags); - else - return ""; + if (a->argv) + { + return print_argv((const char **)a->argv, gc, flags); + } + else + { + return ""; + } } void -argv_msg (const int msglev, const struct argv *a) +argv_msg(const int msglev, const struct argv *a) { - struct gc_arena gc = gc_new (); - msg (msglev, "%s", argv_str (a, &gc, 0)); - gc_free (&gc); + struct gc_arena gc = gc_new(); + msg(msglev, "%s", argv_str(a, &gc, 0)); + gc_free(&gc); } void -argv_msg_prefix (const int msglev, const struct argv *a, const char *prefix) +argv_msg_prefix(const int msglev, const struct argv *a, const char *prefix) { - struct gc_arena gc = gc_new (); - msg (msglev, "%s: %s", prefix, argv_str (a, &gc, 0)); - gc_free (&gc); + struct gc_arena gc = gc_new(); + msg(msglev, "%s: %s", prefix, argv_str(a, &gc, 0)); + gc_free(&gc); } static void -argv_printf_arglist (struct argv *a, const char *format, va_list arglist) +argv_printf_arglist(struct argv *a, const char *format, va_list arglist) { - char *term; - const char *f = format; + char *term; + const char *f = format; - argv_extend (a, 1); /* ensure trailing NULL */ + argv_extend(a, 1); /* ensure trailing NULL */ - while ((term = argv_term (&f)) != NULL) + while ((term = argv_term(&f)) != NULL) { - if (term[0] == '%') + if (term[0] == '%') { - if (!strcmp (term, "%s")) + if (!strcmp(term, "%s")) { - char *s = va_arg (arglist, char *); - if (!s) - s = ""; - argv_append (a, string_alloc (s, NULL)); + char *s = va_arg(arglist, char *); + if (!s) + { + s = ""; + } + argv_append(a, string_alloc(s, NULL)); } - else if (!strcmp (term, "%d")) + else if (!strcmp(term, "%d")) { - char numstr[64]; - openvpn_snprintf (numstr, sizeof (numstr), "%d", va_arg (arglist, int)); - argv_append (a, string_alloc (numstr, NULL)); + char numstr[64]; + openvpn_snprintf(numstr, sizeof(numstr), "%d", va_arg(arglist, int)); + argv_append(a, string_alloc(numstr, NULL)); } - else if (!strcmp (term, "%u")) + else if (!strcmp(term, "%u")) { - char numstr[64]; - openvpn_snprintf (numstr, sizeof (numstr), "%u", va_arg (arglist, unsigned int)); - argv_append (a, string_alloc (numstr, NULL)); + char numstr[64]; + openvpn_snprintf(numstr, sizeof(numstr), "%u", va_arg(arglist, unsigned int)); + argv_append(a, string_alloc(numstr, NULL)); } - else if (!strcmp (term, "%s/%d")) + else if (!strcmp(term, "%s/%d")) { - char numstr[64]; - char *s = va_arg (arglist, char *); - - if (!s) - s = ""; - - openvpn_snprintf (numstr, sizeof (numstr), "%d", va_arg (arglist, int)); - - { - const size_t len = strlen(s) + strlen(numstr) + 2; - char *combined = (char *) malloc (len); - check_malloc_return (combined); - - strcpy (combined, s); - strcat (combined, "/"); - strcat (combined, numstr); - argv_append (a, combined); - } + char numstr[64]; + char *s = va_arg(arglist, char *); + + if (!s) + { + s = ""; + } + + openvpn_snprintf(numstr, sizeof(numstr), "%d", va_arg(arglist, int)); + + { + const size_t len = strlen(s) + strlen(numstr) + 2; + char *combined = (char *) malloc(len); + check_malloc_return(combined); + + strcpy(combined, s); + strcat(combined, "/"); + strcat(combined, numstr); + argv_append(a, combined); + } } - else if (!strcmp (term, "%s%sc")) + else if (!strcmp(term, "%s%sc")) { - char *s1 = va_arg (arglist, char *); - char *s2 = va_arg (arglist, char *); - char *combined; - - if (!s1) s1 = ""; - if (!s2) s2 = ""; - combined = (char *) malloc (strlen(s1) + strlen(s2) + 1); - check_malloc_return (combined); - strcpy (combined, s1); - strcat (combined, s2); - argv_append (a, combined); + char *s1 = va_arg(arglist, char *); + char *s2 = va_arg(arglist, char *); + char *combined; + + if (!s1) + { + s1 = ""; + } + if (!s2) + { + s2 = ""; + } + combined = (char *) malloc(strlen(s1) + strlen(s2) + 1); + check_malloc_return(combined); + strcpy(combined, s1); + strcat(combined, s2); + argv_append(a, combined); } - else - ASSERT (0); - free (term); + else + { + ASSERT(0); + } + free(term); } - else + else { - argv_append (a, term); + argv_append(a, term); } } } void -argv_printf (struct argv *a, const char *format, ...) +argv_printf(struct argv *a, const char *format, ...) { - va_list arglist; - argv_reset (a); - va_start (arglist, format); - argv_printf_arglist (a, format, arglist); - va_end (arglist); - } + va_list arglist; + argv_reset(a); + va_start(arglist, format); + argv_printf_arglist(a, format, arglist); + va_end(arglist); +} void -argv_printf_cat (struct argv *a, const char *format, ...) +argv_printf_cat(struct argv *a, const char *format, ...) { - va_list arglist; - va_start (arglist, format); - argv_printf_arglist (a, format, arglist); - va_end (arglist); + va_list arglist; + va_start(arglist, format); + argv_printf_arglist(a, format, arglist); + va_end(arglist); } void -argv_parse_cmd (struct argv *a, const char *s) +argv_parse_cmd(struct argv *a, const char *s) { - int nparms; - char *parms[MAX_PARMS + 1]; - struct gc_arena gc = gc_new (); + int nparms; + char *parms[MAX_PARMS + 1]; + struct gc_arena gc = gc_new(); - argv_reset (a); - argv_extend (a, 1); /* ensure trailing NULL */ + argv_reset(a); + argv_extend(a, 1); /* ensure trailing NULL */ - nparms = parse_line (s, parms, MAX_PARMS, "SCRIPT-ARGV", 0, D_ARGV_PARSE_CMD, &gc); - if (nparms) + nparms = parse_line(s, parms, MAX_PARMS, "SCRIPT-ARGV", 0, D_ARGV_PARSE_CMD, &gc); + if (nparms) + { + int i; + for (i = 0; i < nparms; ++i) + argv_append(a, string_alloc(parms[i], NULL)); + } + else { - int i; - for (i = 0; i < nparms; ++i) - argv_append (a, string_alloc (parms[i], NULL)); + argv_append(a, string_alloc(s, NULL)); } - else - argv_append (a, string_alloc (s, NULL)); - gc_free (&gc); + gc_free(&gc); } |