]> Projects (at) Tadryanom (dot) Me - AdrOS.git/commitdiff
fix(ulibc): rename __environ to environ for POSIX compliance
authorTulio A M Mendes <[email protected]>
Fri, 3 Apr 2026 19:52:43 +0000 (16:52 -0300)
committerTulio A M Mendes <[email protected]>
Fri, 3 Apr 2026 19:52:43 +0000 (16:52 -0300)
Replace __environ with environ as the primary environment pointer
symbol throughout ulibc and userland commands. POSIX specifies
'environ' as the standard name (IEEE Std 1003.1).

Files changed:
- user/ulibc/src/stdlib.c: environ as primary symbol, update getenv()
- user/ulibc/src/environ.c: all references updated
- user/ulibc/src/execvp.c: pass environ to execve()
- user/ulibc/include/unistd.h: declare extern environ
- user/cmds/env/env.c: use environ
- user/cmds/printenv/printenv.c: use environ

user/cmds/env/env.c
user/cmds/printenv/printenv.c
user/ulibc/include/unistd.h
user/ulibc/src/environ.c
user/ulibc/src/execvp.c
user/ulibc/src/stdlib.c

index f81a359eebafe71dc1233d7782959601f62b5d6b..f02177d21a2e946a14ad6f72374cce061304ebd2 100644 (file)
 #include <string.h>
 #include <unistd.h>
 
-extern char** __environ;
+extern char** environ;
 
 int main(int argc, char** argv) {
     if (argc <= 1) {
         /* Print all environment variables */
-        if (__environ) {
-            for (int i = 0; __environ[i]; i++)
-                printf("%s\n", __environ[i]);
+        if (environ) {
+            for (int i = 0; environ[i]; i++)
+                printf("%s\n", environ[i]);
         }
         return 0;
     }
     /* env COMMAND ARGS... — run command with current environment */
-    execve(argv[1], &argv[1], __environ);
+    execve(argv[1], &argv[1], environ);
     fprintf(stderr, "env: %s: not found\n", argv[1]);
     return 127;
 }
index 2921bcec36cd8ba36943aa224b9d651bc9383aa3..841a716547418ea96072d965de00842959fdc65b 100644 (file)
 #include <stdio.h>
 #include <string.h>
 
-extern char** __environ;
+extern char** environ;
 
 int main(int argc, char** argv) {
-    if (!__environ) return 1;
+    if (!environ) return 1;
     if (argc <= 1) {
-        for (int i = 0; __environ[i]; i++)
-            printf("%s\n", __environ[i]);
+        for (int i = 0; environ[i]; i++)
+            printf("%s\n", environ[i]);
         return 0;
     }
     for (int i = 1; i < argc; i++) {
         int found = 0;
         int nlen = (int)strlen(argv[i]);
-        for (int j = 0; __environ[j]; j++) {
-            if (strncmp(__environ[j], argv[i], (size_t)nlen) == 0 && __environ[j][nlen] == '=') {
-                printf("%s\n", __environ[j] + nlen + 1);
+        for (int j = 0; environ[j]; j++) {
+            if (strncmp(environ[j], argv[i], (size_t)nlen) == 0 && environ[j][nlen] == '=') {
+                printf("%s\n", environ[j] + nlen + 1);
                 found = 1;
                 break;
             }
index a4af376b03c98b03ab6ecd1f69da28649b0c6d79..31244d0d62ce98552bece3e48e4ae3f4164beff7 100644 (file)
@@ -121,7 +121,7 @@ int     tcsetpgrp(int fd, int pgrp);
 long    confstr(int name, char* buf, size_t len);
 void*   sbrk(int increment);
 
-/* Environment pointer (set by crt0) */
-extern char** __environ;
+/* Environment pointer (set by crt0) — POSIX standard name */
+extern char** environ;
 
 #endif
index a6c1d660d7719a4346bf3824185b648a6fc25472..bffafe69d205d705c8082d12a83d41df62e53fc6 100644 (file)
@@ -12,7 +12,7 @@
 #include "errno.h"
 #include <stddef.h>
 
-extern char** __environ;
+extern char** environ;
 
 static char* _env_storage[128];
 static int _env_owned = 0;
@@ -20,14 +20,14 @@ static int _env_owned = 0;
 static void _ensure_own_environ(void) {
     if (_env_owned) return;
     int count = 0;
-    if (__environ) {
-        for (; __environ[count]; count++) {
+    if (environ) {
+        for (; environ[count]; count++) {
             if (count >= 126) break;
-            _env_storage[count] = __environ[count];
+            _env_storage[count] = environ[count];
         }
     }
     _env_storage[count] = (char*)0;
-    __environ = _env_storage;
+    environ = _env_storage;
     _env_owned = 1;
 }
 
@@ -41,8 +41,8 @@ int setenv(const char* name, const char* value, int overwrite) {
 
     size_t nlen = strlen(name);
     /* Check if already exists */
-    for (int i = 0; __environ[i]; i++) {
-        if (strncmp(__environ[i], name, nlen) == 0 && __environ[i][nlen] == '=') {
+    for (int i = 0; environ[i]; i++) {
+        if (strncmp(environ[i], name, nlen) == 0 && environ[i][nlen] == '=') {
             if (!overwrite) return 0;
             /* Replace in-place */
             size_t vlen = strlen(value);
@@ -51,14 +51,14 @@ int setenv(const char* name, const char* value, int overwrite) {
             memcpy(buf, name, nlen);
             buf[nlen] = '=';
             memcpy(buf + nlen + 1, value, vlen + 1);
-            __environ[i] = buf;
+            environ[i] = buf;
             return 0;
         }
     }
 
     /* Count entries */
     int count = 0;
-    while (__environ[count]) count++;
+    while (environ[count]) count++;
     if (count >= 126) { errno = ENOMEM; return -1; }
 
     size_t vlen = strlen(value);
@@ -68,8 +68,8 @@ int setenv(const char* name, const char* value, int overwrite) {
     buf[nlen] = '=';
     memcpy(buf + nlen + 1, value, vlen + 1);
 
-    __environ[count] = buf;
-    __environ[count + 1] = (char*)0;
+    environ[count] = buf;
+    environ[count + 1] = (char*)0;
     return 0;
 }
 
@@ -82,11 +82,11 @@ int unsetenv(const char* name) {
     _ensure_own_environ();
 
     size_t nlen = strlen(name);
-    for (int i = 0; __environ[i]; i++) {
-        if (strncmp(__environ[i], name, nlen) == 0 && __environ[i][nlen] == '=') {
+    for (int i = 0; environ[i]; i++) {
+        if (strncmp(environ[i], name, nlen) == 0 && environ[i][nlen] == '=') {
             /* Shift remaining entries down */
-            for (int j = i; __environ[j]; j++)
-                __environ[j] = __environ[j + 1];
+            for (int j = i; environ[j]; j++)
+                environ[j] = environ[j + 1];
             return 0;
         }
     }
@@ -104,17 +104,17 @@ int putenv(char* string) {
     size_t nlen = (size_t)(eq - string);
 
     /* Replace existing or append */
-    for (int i = 0; __environ[i]; i++) {
-        if (strncmp(__environ[i], string, nlen + 1) == 0) {
-            __environ[i] = string;
+    for (int i = 0; environ[i]; i++) {
+        if (strncmp(environ[i], string, nlen + 1) == 0) {
+            environ[i] = string;
             return 0;
         }
     }
 
     int count = 0;
-    while (__environ[count]) count++;
+    while (environ[count]) count++;
     if (count >= 126) { errno = ENOMEM; return -1; }
-    __environ[count] = string;
-    __environ[count + 1] = (char*)0;
+    environ[count] = string;
+    environ[count + 1] = (char*)0;
     return 0;
 }
index 94b91f3b45223de7f30d3b62bcb0521a5ede75db..2ffbdbf524060fc8307dcd082049bc3fb87b9d09 100644 (file)
 #include "errno.h"
 #include <stddef.h>
 
-extern char** __environ;
+extern char** environ;
 
 int execvp(const char* file, char* const argv[]) {
     if (!file || !*file) { errno = ENOENT; return -1; }
 
     /* If file contains '/', use it directly */
     if (strchr(file, '/'))
-        return execve(file, argv, __environ);
+        return execve(file, argv, environ);
 
     /* Search PATH */
     const char* path = getenv("PATH");
@@ -44,7 +44,7 @@ int execvp(const char* file, char* const argv[]) {
         buf[dlen] = '/';
         memcpy(buf + dlen + 1, file, flen + 1);
 
-        execve(buf, argv, __environ);
+        execve(buf, argv, environ);
         /* If ENOENT, try next; otherwise fail */
         if (errno != ENOENT) return -1;
 
@@ -79,5 +79,5 @@ int execl(const char* path, const char* arg, ...) {
         p++;
     }
     args[i] = (const char*)0;
-    return execve(path, (char* const*)args, __environ);
+    return execve(path, (char* const*)args, environ);
 }
index 90de1c2b5cc164b8a9d86e06776a3256237894d9..56f49655219af9bce5a70096df5fba7be8f86b71 100644 (file)
@@ -11,8 +11,9 @@
 #include "unistd.h"
 #include "string.h"
 
-/* Global environment pointer — set by crt0 from execve stack layout */
-char** __environ = 0;
+/* Global environment pointer — set by crt0 from execve stack layout.
+ * POSIX name is 'environ'. */
+char** environ = 0;
 
 /*
  * Free-list allocator using brk() syscall.
@@ -253,10 +254,10 @@ long strtol(const char* nptr, char** endptr, int base) {
 }
 
 char* getenv(const char* name) {
-    extern char** __environ;
-    if (!name || !__environ) return (char*)0;
+    extern char** environ;
+    if (!name || !environ) return (char*)0;
     size_t len = strlen(name);
-    for (char** e = __environ; *e; e++) {
+    for (char** e = environ; *e; e++) {
         if (strncmp(*e, name, len) == 0 && (*e)[len] == '=')
             return *e + len + 1;
     }