{
int ret = -1;
char **macsList = NULL;
- char **newMacsList = NULL;
if ((macsList = virHashLookup(mgr->macs, domain)) &&
virStringListHasString((const char**) macsList, mac)) {
goto cleanup;
}
- if (!(newMacsList = virStringListAdd((const char **) macsList, mac)) ||
- virHashUpdateEntry(mgr->macs, domain, newMacsList) < 0)
+ if (virStringListAdd(&macsList, mac) < 0 ||
+ virHashUpdateEntry(mgr->macs, domain, macsList) < 0)
goto cleanup;
- newMacsList = NULL;
- virStringListFree(macsList);
ret = 0;
cleanup:
- virStringListFree(newMacsList);
return ret;
}
* @strings: a NULL-terminated array of strings
* @item: string to add
*
- * Creates new strings list with all strings duplicated and @item
- * at the end of the list. Callers is responsible for freeing
- * both @strings and returned list.
+ * Appends @item into string list @strings. If *@strings is not
+ * allocated yet new string list is created.
+ *
+ * Returns: 0 on success,
+ * -1 otherwise
*/
-char **
-virStringListAdd(const char **strings,
+int
+virStringListAdd(char ***strings,
const char *item)
{
- char **ret = NULL;
- size_t i = virStringListLength(strings);
-
- if (VIR_ALLOC_N(ret, i + 2) < 0)
- goto error;
-
- for (i = 0; strings && strings[i]; i++) {
- if (VIR_STRDUP(ret[i], strings[i]) < 0)
- goto error;
- }
+ size_t i = virStringListLength((const char **) *strings);
- if (VIR_STRDUP(ret[i], item) < 0)
- goto error;
+ if (VIR_EXPAND_N(*strings, i, 2) < 0 ||
+ VIR_STRDUP((*strings)[i - 2], item) < 0)
+ return -1;
- return ret;
- error:
- virStringListFree(ret);
- return NULL;
+ return 0;
}
const char *delim)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-char **virStringListAdd(const char **strings,
- const char *item);
+int virStringListAdd(char ***strings,
+ const char *item);
void virStringListRemove(char ***strings,
const char *item);
size_t i;
for (i = 0; data->tokens[i]; i++) {
- char **tmp = virStringListAdd((const char **)list, data->tokens[i]);
- if (!tmp)
+ if (virStringListAdd(&list, data->tokens[i]) < 0)
goto cleanup;
- virStringListFree(list);
- list = tmp;
- tmp = NULL;
}
if (!list &&