diff --git a/cat/virt-filesystems.c b/cat/virt-filesystems.c index 46f813c29..4eb00e936 100644 --- a/cat/virt-filesystems.c +++ b/cat/virt-filesystems.c @@ -841,35 +841,6 @@ parents_of_vg (char *vg) return ret; } -static char * -join_comma (char **strings) -{ - size_t i, count; - char *ret; - - for (count = i = 0; strings[i] != NULL; ++i) { - if (i > 0) - count++; - count += strlen (strings[i]); - } - - ret = malloc (count + 1); - if (ret == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } - - for (count = i = 0; strings[i] != NULL; ++i) { - if (i > 0) - ret[count++] = ','; - strcpy (&ret[count], strings[i]); - count += strlen (strings[i]); - } - ret[count] = 0; - - return ret; -} - static void write_row (const char *name, const char *type, const char *vfs_type, const char *vfs_label, int mbr_id, @@ -916,7 +887,7 @@ write_row (const char *name, const char *type, } if ((columns & COLUMN_PARENTS)) { /* Internally comma-separated field. */ - parents_str = join_comma (parents); + parents_str = guestfs___join_strings (",", parents); strings[len++] = parents_str; } if ((columns & COLUMN_UUID)) diff --git a/src/guestfs-internal-frontend.h b/src/guestfs-internal-frontend.h index eba1c0e01..c8d8da02c 100644 --- a/src/guestfs-internal-frontend.h +++ b/src/guestfs-internal-frontend.h @@ -94,6 +94,8 @@ extern char *guestfs___safe_asprintf (guestfs_h *g, const char *fs, ...) /* utils.c */ extern void guestfs___free_string_list (char **); extern size_t guestfs___count_strings (char *const *); +extern char *guestfs___concat_strings (char *const *); +extern char *guestfs___join_strings (const char *sep, char *const *); extern char *guestfs___exit_status_to_string (int status, const char *cmd_name, char *buffer, size_t buflen); extern int guestfs___random_string (char *ret, size_t len); extern char *guestfs___drive_name (size_t index, char *ret); diff --git a/src/utils.c b/src/utils.c index 54d9d7eeb..f8d2509d3 100644 --- a/src/utils.c +++ b/src/utils.c @@ -60,6 +60,48 @@ guestfs___count_strings (char *const *argv) return r; } +/* Note that near-identical functions exist in the daemon. */ +char * +guestfs___concat_strings (char *const *argv) +{ + return guestfs___join_strings ("", argv); +} + +char * +guestfs___join_strings (const char *sep, char *const *argv) +{ + size_t i, len, seplen, rlen; + char *r; + + seplen = strlen (sep); + + 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], sep, seplen); + rlen += seplen; + } + len = strlen (argv[i]); + memcpy (&r[rlen], argv[i], len); + rlen += len; + } + r[rlen] = '\0'; + + return r; +} + /* Translate a wait/system exit status into a printable string. The * string must be freed by the caller. */