diff options
-rw-r--r-- | daemon/daemon.h | 7 | ||||
-rw-r--r-- | daemon/guestfsd.c | 41 |
2 files changed, 48 insertions, 0 deletions
diff --git a/daemon/daemon.h b/daemon/daemon.h index 27c27c01..6349d393 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -59,6 +59,13 @@ extern int is_power_of_2 (unsigned long v); extern void sort_device_names (char **argv, size_t len); extern int compare_device_names (const char *a, const char *b); +/* Concatenate strings, optionally with a separator string between + * each. On error, these return NULL but do NOT call reply_with_* nor + * free anything. + */ +extern char *concat_strings (char *const *argv); +extern char *join_strings (const char *separator, char *const *argv); + #define command(out,err,name,...) commandf((out),(err),0,(name),__VA_ARGS__) #define commandr(out,err,name,...) commandrf((out),(err),0,(name),__VA_ARGS__) #define commandv(out,err,argv) commandvf((out),(err),0,(argv)) diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index e1645a02..f888cdc6 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -574,6 +574,47 @@ sort_device_names (char **argv, size_t len) qsort (argv, len, sizeof (char *), compare_device_names_vp); } +char * +concat_strings (char *const *argv) +{ + return join_strings ("", argv); +} + +char * +join_strings (const char *separator, char *const *argv) +{ + size_t i, len, seplen, rlen; + char *r; + + seplen = strlen (separator); + + len = 0; + for (i = 0; argv[i] != NULL; ++i) { + if (i > 0) + len += seplen; + len += strlen (argv[i]); + } + len++; /* for final \0 */ + + r = malloc (len); + if (r == NULL) + return NULL; + + rlen = 0; + for (i = 0; argv[i] != NULL; ++i) { + if (i > 0) { + memcpy (&r[rlen], separator, seplen); + rlen += seplen; + } + len = strlen (argv[i]); + memcpy (&r[rlen], argv[i], len); + rlen += len; + } + r[rlen] = '\0'; + + return r; +} + /* Easy ways to run external commands. For full documentation, see * 'commandrvf' below. */ |