tools/virsh.c: New helper function vshStringToArray. tools/virsh.h: Declare vshStringToArray. tools/virsh-domain.c: use the helper in cmdUndefine. --- tools/virsh-domain.c | 19 ++----------------- tools/virsh.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ tools/virsh.h | 1 + 3 files changed, 47 insertions(+), 17 deletions(-) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index f0ec742..27d5dc1 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -2443,23 +2443,8 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd) /* tokenize the string from user and save it's parts into an array */ if (volumes) { - /* count the delimiters */ - volume_tok = volumes; - nvolume_tokens = 1; /* we need at least one member */ - while (*volume_tok) { - if (*(volume_tok++) == ',') - nvolume_tokens++; - } - - volume_tokens = vshCalloc(ctl, nvolume_tokens, sizeof(char *)); - - /* tokenize the input string */ - nvolume_tokens = 0; - volume_tok = volumes; - do { - volume_tokens[nvolume_tokens] = strsep(&volume_tok, ","); - nvolume_tokens++; - } while (volume_tok); + if ((nvolume_tokens = vshStringToArray(volumes, &volume_tokens)) < 0) + goto cleanup; } if ((nvolumes = virXPathNodeSet("./devices/disk", ctxt, diff --git a/tools/virsh.c b/tools/virsh.c index 5cf3237..684f7ca 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -166,6 +166,50 @@ vshPrettyCapacity(unsigned long long val, const char **unit) } } +/* + * Convert the strings separated by ',' into array. The caller + * must free the returned array after use. + * + * Returns the length of the filled array on success, or -1 + * on error. + */ +int +vshStringToArray(char *str, + char ***array) +{ + char *str_tok = NULL; + unsigned int nstr_tokens = 0; + char **arr = NULL; + + /* tokenize the string from user and save it's parts into an array */ + if (str) { + nstr_tokens = 1; + + /* count the delimiters */ + str_tok = str; + while (*str_tok) { + if (*str_tok == ',') + nstr_tokens++; + str_tok++; + } + + if (VIR_ALLOC_N(arr, nstr_tokens) < 0) { + virReportOOMError(); + return -1; + } + + /* tokenize the input string */ + nstr_tokens = 0; + str_tok = str; + do { + arr[nstr_tokens] = strsep(&str_tok, ","); + nstr_tokens++; + } while (str_tok); + } + + *array = arr; + return nstr_tokens; +} virErrorPtr last_error; diff --git a/tools/virsh.h b/tools/virsh.h index 8923f94..2a9c6a2 100644 --- a/tools/virsh.h +++ b/tools/virsh.h @@ -328,6 +328,7 @@ int vshAskReedit(vshControl *ctl, const char *msg); int vshStreamSink(virStreamPtr st, const char *bytes, size_t nbytes, void *opaque); double vshPrettyCapacity(unsigned long long val, const char **unit); +int vshStringToArray(char *str, char ***array); /* Typedefs, function prototypes for job progress reporting. * There are used by some long lingering commands like -- 1.7.7.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list