don't remap internal-use syscall macros to nonexistent time32 syscalls
[musl] / src / env / unsetenv.c
index 3569335..b14c4c9 100644 (file)
@@ -1,31 +1,28 @@
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <unistd.h>
 
-extern char **__environ;
-extern char **__env_map;
+static void dummy(char *old, char *new) {}
+weak_alias(dummy, __env_rm_add);
 
 int unsetenv(const char *name)
 {
-       int i, j;
-       size_t l = strlen(name);
-
-       if (!*name || strchr(name, '=')) {
+       size_t l = __strchrnul(name, '=') - name;
+       if (!l || name[l]) {
                errno = EINVAL;
                return -1;
        }
-again:
-       for (i=0; __environ[i] && (memcmp(name, __environ[i], l) || __environ[i][l] != '='); i++);
-       if (__environ[i]) {
-               if (__env_map) {
-                       for (j=0; __env_map[j] && __env_map[j] != __environ[i]; j++);
-                       free (__env_map[j]);
-                       for (; __env_map[j]; j++)
-                               __env_map[j] = __env_map[j+1];
-               }
-               for (; __environ[i]; i++)
-                       __environ[i] = __environ[i+1];
-               goto again;
+       if (__environ) {
+               char **e = __environ, **eo = e;
+               for (; *e; e++)
+                       if (!strncmp(name, *e, l) && l[*e] == '=')
+                               __env_rm_add(*e, 0);
+                       else if (eo != e)
+                               *eo++ = *e;
+                       else
+                               eo++;
+               if (eo != e) *eo = 0;
        }
        return 0;
 }