]> git.proxmox.com Git - mirror_qemu.git/blobdiff - util/envlist.c
i386/kvm: Fix build with -m32
[mirror_qemu.git] / util / envlist.c
index ff99fc44e97329e6bd8f0ea19b7ea26503d62830..2bcc13f09415484edeca0edf3633e063fea51936 100644 (file)
@@ -1,9 +1,4 @@
-#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"
 
@@ -21,16 +16,14 @@ 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;
 
-       if ((envlist = malloc(sizeof (*envlist))) == NULL)
-               return (NULL);
+       envlist = g_malloc(sizeof(*envlist));
 
        QLIST_INIT(&envlist->el_entries);
        envlist->el_count = 0;
@@ -52,10 +45,10 @@ envlist_free(envlist_t *envlist)
                entry = envlist->el_entries.lh_first;
                QLIST_REMOVE(entry, ev_link);
 
-               free((char *)entry->ev_var);
-               free(entry);
+               g_free((char *)entry->ev_var);
+               g_free(entry);
        }
-       free(envlist);
+       g_free(envlist);
 }
 
 /*
@@ -99,30 +92,29 @@ envlist_parse(envlist_t *envlist, const char *env,
 {
        char *tmpenv, *envvar;
        char *envsave = NULL;
-
-       assert(callback != NULL);
+    int ret = 0;
+    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);
+       tmpenv = g_strdup(env);
+    envsave = tmpenv;
+
+    do {
+        envvar = strchr(tmpenv, ',');
+        if (envvar != NULL) {
+            *envvar = '\0';
+        }
+        if ((*callback)(envlist, tmpenv) != 0) {
+            ret = errno;
+            break;
                }
-               envvar = strtok_r(NULL, ",", &envsave);
-       }
+        tmpenv = envvar + 1;
+    } while (envvar != NULL);
 
-       free(tmpenv);
-       return (0);
+    g_free(envsave);
+    return ret;
 }
 
 /*
@@ -159,18 +151,14 @@ envlist_setenv(envlist_t *envlist, const char *env)
 
        if (entry != NULL) {
                QLIST_REMOVE(entry, ev_link);
-               free((char *)entry->ev_var);
-               free(entry);
+               g_free((char *)entry->ev_var);
+               g_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);
-       }
+       entry = g_malloc(sizeof(*entry));
+       entry->ev_var = g_strdup(env);
        QLIST_INSERT_HEAD(&envlist->el_entries, entry, ev_link);
 
        return (0);
@@ -205,8 +193,8 @@ envlist_unsetenv(envlist_t *envlist, const char *env)
        }
        if (entry != NULL) {
                QLIST_REMOVE(entry, ev_link);
-               free((char *)entry->ev_var);
-               free(entry);
+               g_free((char *)entry->ev_var);
+               g_free(entry);
 
                envlist->el_count--;
        }
@@ -216,12 +204,12 @@ envlist_unsetenv(envlist_t *envlist, const char *env)
 /*
  * 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)
@@ -229,13 +217,11 @@ envlist_to_environ(const envlist_t *envlist, size_t *count)
        struct envlist_entry *entry;
        char **env, **penv;
 
-       penv = env = malloc((envlist->el_count + 1) * sizeof (char *));
-       if (env == NULL)
-               return (NULL);
+       penv = env = g_malloc((envlist->el_count + 1) * sizeof(char *));
 
        for (entry = envlist->el_entries.lh_first; entry != NULL;
            entry = entry->ev_link.le_next) {
-               *(penv++) = strdup(entry->ev_var);
+               *(penv++) = g_strdup(entry->ev_var);
        }
        *penv = NULL; /* NULL terminate the list */