#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;
}
#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;
}
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
#include "errno.h"
#include <stddef.h>
-extern char** __environ;
+extern char** environ;
static char* _env_storage[128];
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;
}
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);
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);
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;
}
_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;
}
}
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;
}
#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");
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;
p++;
}
args[i] = (const char*)0;
- return execve(path, (char* const*)args, __environ);
+ return execve(path, (char* const*)args, environ);
}
#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.
}
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;
}