]> git.proxmox.com Git - mirror_qemu.git/blobdiff - util/envlist.c
qemu-docs: Update options for graphical frontends
[mirror_qemu.git] / util / envlist.c
index ff99fc44e97329e6bd8f0ea19b7ea26503d62830..db937c04276110db06144132bd3caa2fff398dc7 100644 (file)
@@ -1,41 +1,34 @@
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
+#include "qemu/osdep.h"
 #include "qemu/queue.h"
 #include "qemu/envlist.h"
 
 struct envlist_entry {
-       const char *ev_var;                     /* actual env value */
-       QLIST_ENTRY(envlist_entry) ev_link;
+    const char *ev_var;            /* actual env value */
+    QLIST_ENTRY(envlist_entry) ev_link;
 };
 
 struct envlist {
-       QLIST_HEAD(, envlist_entry) el_entries; /* actual entries */
-       size_t el_count;                        /* number of entries */
+    QLIST_HEAD(, envlist_entry) el_entries; /* actual entries */
+    size_t el_count;                        /* number of entries */
 };
 
 static int envlist_parse(envlist_t *envlist,
     const char *env, int (*)(envlist_t *, const char *));
 
 /*
- * Allocates new envlist and returns pointer to that or
- * NULL in case of error.
+ * Allocates new envlist and returns pointer to it.
  */
 envlist_t *
 envlist_create(void)
 {
-       envlist_t *envlist;
+    envlist_t *envlist;
 
-       if ((envlist = malloc(sizeof (*envlist))) == NULL)
-               return (NULL);
+    envlist = g_malloc(sizeof(*envlist));
 
-       QLIST_INIT(&envlist->el_entries);
-       envlist->el_count = 0;
+    QLIST_INIT(&envlist->el_entries);
+    envlist->el_count = 0;
 
-       return (envlist);
+    return (envlist);
 }
 
 /*
@@ -44,18 +37,18 @@ envlist_create(void)
 void
 envlist_free(envlist_t *envlist)
 {
-       struct envlist_entry *entry;
+    struct envlist_entry *entry;
 
-       assert(envlist != NULL);
+    assert(envlist != NULL);
 
-       while (envlist->el_entries.lh_first != NULL) {
-               entry = envlist->el_entries.lh_first;
-               QLIST_REMOVE(entry, ev_link);
+    while (envlist->el_entries.lh_first != NULL) {
+        entry = envlist->el_entries.lh_first;
+        QLIST_REMOVE(entry, ev_link);
 
-               free((char *)entry->ev_var);
-               free(entry);
-       }
-       free(envlist);
+        g_free((char *)entry->ev_var);
+        g_free(entry);
+    }
+    g_free(envlist);
 }
 
 /*
@@ -72,7 +65,7 @@ envlist_free(envlist_t *envlist)
 int
 envlist_parse_set(envlist_t *envlist, const char *env)
 {
-       return (envlist_parse(envlist, env, &envlist_setenv));
+    return (envlist_parse(envlist, env, &envlist_setenv));
 }
 
 /*
@@ -84,7 +77,7 @@ envlist_parse_set(envlist_t *envlist, const char *env)
 int
 envlist_parse_unset(envlist_t *envlist, const char *env)
 {
-       return (envlist_parse(envlist, env, &envlist_unsetenv));
+    return (envlist_parse(envlist, env, &envlist_unsetenv));
 }
 
 /*
@@ -97,32 +90,31 @@ static int
 envlist_parse(envlist_t *envlist, const char *env,
     int (*callback)(envlist_t *, const char *))
 {
-       char *tmpenv, *envvar;
-       char *envsave = NULL;
-
-       assert(callback != NULL);
-
-       if ((envlist == NULL) || (env == NULL))
-               return (EINVAL);
-
-       /*
-        * We need to make temporary copy of the env string
-        * as strtok_r(3) modifies it while it tokenizes.
-        */
-       if ((tmpenv = strdup(env)) == NULL)
-               return (errno);
-
-       envvar = strtok_r(tmpenv, ",", &envsave);
-       while (envvar != NULL) {
-               if ((*callback)(envlist, envvar) != 0) {
-                       free(tmpenv);
-                       return (errno);
-               }
-               envvar = strtok_r(NULL, ",", &envsave);
-       }
-
-       free(tmpenv);
-       return (0);
+    char *tmpenv, *envvar;
+    char *envsave = NULL;
+    int ret = 0;
+    assert(callback != NULL);
+
+    if ((envlist == NULL) || (env == NULL))
+        return (EINVAL);
+
+    tmpenv = g_strdup(env);
+    envsave = tmpenv;
+
+    do {
+        envvar = strchr(tmpenv, ',');
+        if (envvar != NULL) {
+            *envvar = '\0';
+        }
+        if ((*callback)(envlist, tmpenv) != 0) {
+            ret = errno;
+            break;
+        }
+        tmpenv = envvar + 1;
+    } while (envvar != NULL);
+
+    g_free(envsave);
+    return ret;
 }
 
 /*
@@ -134,46 +126,42 @@ envlist_parse(envlist_t *envlist, const char *env,
 int
 envlist_setenv(envlist_t *envlist, const char *env)
 {
-       struct envlist_entry *entry = NULL;
-       const char *eq_sign;
-       size_t envname_len;
-
-       if ((envlist == NULL) || (env == NULL))
-               return (EINVAL);
-
-       /* find out first equals sign in given env */
-       if ((eq_sign = strchr(env, '=')) == NULL)
-               return (EINVAL);
-       envname_len = eq_sign - env + 1;
-
-       /*
-        * If there already exists variable with given name
-        * we remove and release it before allocating a whole
-        * new entry.
-        */
-       for (entry = envlist->el_entries.lh_first; entry != NULL;
-           entry = entry->ev_link.le_next) {
-               if (strncmp(entry->ev_var, env, envname_len) == 0)
-                       break;
-       }
-
-       if (entry != NULL) {
-               QLIST_REMOVE(entry, ev_link);
-               free((char *)entry->ev_var);
-               free(entry);
-       } else {
-               envlist->el_count++;
-       }
-
-       if ((entry = malloc(sizeof (*entry))) == NULL)
-               return (errno);
-       if ((entry->ev_var = strdup(env)) == NULL) {
-               free(entry);
-               return (errno);
-       }
-       QLIST_INSERT_HEAD(&envlist->el_entries, entry, ev_link);
-
-       return (0);
+    struct envlist_entry *entry = NULL;
+    const char *eq_sign;
+    size_t envname_len;
+
+    if ((envlist == NULL) || (env == NULL))
+        return (EINVAL);
+
+    /* find out first equals sign in given env */
+    if ((eq_sign = strchr(env, '=')) == NULL)
+        return (EINVAL);
+    envname_len = eq_sign - env + 1;
+
+    /*
+     * If there already exists variable with given name
+     * we remove and release it before allocating a whole
+     * new entry.
+     */
+    for (entry = envlist->el_entries.lh_first; entry != NULL;
+        entry = entry->ev_link.le_next) {
+        if (strncmp(entry->ev_var, env, envname_len) == 0)
+            break;
+    }
+
+    if (entry != NULL) {
+        QLIST_REMOVE(entry, ev_link);
+        g_free((char *)entry->ev_var);
+        g_free(entry);
+    } else {
+        envlist->el_count++;
+    }
+
+    entry = g_malloc(sizeof(*entry));
+    entry->ev_var = g_strdup(env);
+    QLIST_INSERT_HEAD(&envlist->el_entries, entry, ev_link);
+
+    return (0);
 }
 
 /*
@@ -183,64 +171,62 @@ envlist_setenv(envlist_t *envlist, const char *env)
 int
 envlist_unsetenv(envlist_t *envlist, const char *env)
 {
-       struct envlist_entry *entry;
-       size_t envname_len;
-
-       if ((envlist == NULL) || (env == NULL))
-               return (EINVAL);
-
-       /* env is not allowed to contain '=' */
-       if (strchr(env, '=') != NULL)
-               return (EINVAL);
-
-       /*
-        * Find out the requested entry and remove
-        * it from the list.
-        */
-       envname_len = strlen(env);
-       for (entry = envlist->el_entries.lh_first; entry != NULL;
-           entry = entry->ev_link.le_next) {
-               if (strncmp(entry->ev_var, env, envname_len) == 0)
-                       break;
-       }
-       if (entry != NULL) {
-               QLIST_REMOVE(entry, ev_link);
-               free((char *)entry->ev_var);
-               free(entry);
-
-               envlist->el_count--;
-       }
-       return (0);
+    struct envlist_entry *entry;
+    size_t envname_len;
+
+    if ((envlist == NULL) || (env == NULL))
+        return (EINVAL);
+
+    /* env is not allowed to contain '=' */
+    if (strchr(env, '=') != NULL)
+        return (EINVAL);
+
+    /*
+     * Find out the requested entry and remove
+     * it from the list.
+     */
+    envname_len = strlen(env);
+    for (entry = envlist->el_entries.lh_first; entry != NULL;
+        entry = entry->ev_link.le_next) {
+        if (strncmp(entry->ev_var, env, envname_len) == 0)
+            break;
+    }
+    if (entry != NULL) {
+        QLIST_REMOVE(entry, ev_link);
+        g_free((char *)entry->ev_var);
+        g_free(entry);
+
+        envlist->el_count--;
+    }
+    return (0);
 }
 
 /*
  * Returns given envlist as array of strings (in same form that
  * global variable environ is).  Caller must free returned memory
- * by calling free(3) for each element and for the array.  Returned
- * array and given envlist are not related (no common references).
+ * by calling g_free for each element and the array.
+ * Returned array and given envlist are not related (no common
+ * references).
  *
  * If caller provides count pointer, number of items in array is
- * stored there.  In case of error, NULL is returned and no memory
- * is allocated.
+ * stored there.
  */
 char **
 envlist_to_environ(const envlist_t *envlist, size_t *count)
 {
-       struct envlist_entry *entry;
-       char **env, **penv;
+    struct envlist_entry *entry;
+    char **env, **penv;
 
-       penv = env = malloc((envlist->el_count + 1) * sizeof (char *));
-       if (env == NULL)
-               return (NULL);
+    penv = env = g_new(char *, envlist->el_count + 1);
 
-       for (entry = envlist->el_entries.lh_first; entry != NULL;
-           entry = entry->ev_link.le_next) {
-               *(penv++) = strdup(entry->ev_var);
-       }
-       *penv = NULL; /* NULL terminate the list */
+    for (entry = envlist->el_entries.lh_first; entry != NULL;
+        entry = entry->ev_link.le_next) {
+        *(penv++) = g_strdup(entry->ev_var);
+    }
+    *penv = NULL; /* NULL terminate the list */
 
-       if (count != NULL)
-               *count = envlist->el_count;
+    if (count != NULL)
+        *count = envlist->el_count;
 
-       return (env);
+    return (env);
 }