X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=daemon%2Fguestfsd.c;h=a243c0beaf96de5d2bbcda59b3875c1d966e4814;hb=0d112d58af8b2c28de9ee4ae5b0ed3527757bdfe;hp=9d110d732031e7483a0b40d812a890ec4a4ecedb;hpb=843514eef9dc6d04d71e031ba9ddb16e2beb9a04;p=libguestfs.git diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index 9d110d7..a243c0b 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -231,6 +231,38 @@ usage (void) } int +add_string (char ***argv, int *size, int *alloc, const char *str) +{ + char **new_argv; + char *new_str; + + if (*size >= *alloc) { + *alloc += 64; + new_argv = realloc (*argv, *alloc * sizeof (char *)); + if (new_argv == NULL) { + reply_with_perror ("realloc"); + free_strings (*argv); + return -1; + } + *argv = new_argv; + } + + if (str) { + new_str = strdup (str); + if (new_str == NULL) { + reply_with_perror ("strdup"); + free_strings (*argv); + } + } else + new_str = NULL; + + (*argv)[*size] = new_str; + + (*size)++; + return 0; +} + +int count_strings (char **argv) { int argc; @@ -240,6 +272,20 @@ count_strings (char **argv) return argc; } +static int +compare (const void *vp1, const void *vp2) +{ + char * const *p1 = (char * const *) vp1; + char * const *p2 = (char * const *) vp2; + return strcmp (*p1, *p2); +} + +void +sort_strings (char **argv, int len) +{ + qsort (argv, len, sizeof (char *), compare); +} + void free_strings (char **argv) { @@ -250,6 +296,16 @@ free_strings (char **argv) free (argv); } +void +free_stringslen (char **argv, int len) +{ + int i; + + for (i = 0; i < len; ++i) + free (argv[i]); + free (argv); +} + /* This is a more sane version of 'system(3)' for running external * commands. It uses fork/execvp, so we don't need to worry about * quoting of parameters, and it allows us to capture any error