commit ec59ea3508bd670fa1743b75d390451cedfb7c1f
parent 070569b2fee195711c81d5013e12d637d5593772
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Tue, 8 Nov 2022 21:30:45 +0100
libc/posix: Fix _environ and _execve definition
_environ cannot be a const double pointer but a pointer to a const
pointer. It was working before because the prototype of _execve was
also wrong and a cast was added in getenv() to adapt the type.
Diffstat:
7 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/include/bits/darwin/sys.h b/include/bits/darwin/sys.h
@@ -23,10 +23,12 @@ typedef int pid_t;
struct sigaction;
struct rusage;
-extern int _execve(const char *, const char *[], const char *[]);
+extern int _execve(const char *, const char *[], char *const []);
extern int _fork(void);
extern pid_t _getpid(void);
extern int _kill(pid_t, int);
extern int _sigaction(int, struct sigaction *, struct sigaction *);
extern pid_t _wait4(pid_t, int *, int, struct rusage *);
extern pid_t _waitpid(pid_t, int *, int);
+
+extern char **_environ;
diff --git a/include/bits/dragonfly/sys.h b/include/bits/dragonfly/sys.h
@@ -23,10 +23,12 @@ typedef int pid_t;
struct sigaction;
struct rusage;
-extern int _execve(const char *, const char *[], const char *[]);
+extern int _execve(const char *, const char *[], char *const []);
extern int _fork(void);
extern pid_t _getpid(void);
extern int _kill(pid_t, int);
extern int _sigaction(int, struct sigaction *, struct sigaction *);
extern pid_t _wait4(pid_t, int *, int, struct rusage *);
extern pid_t _waitpid(pid_t, int *, int);
+
+extern char **_environ;
diff --git a/include/bits/linux/sys.h b/include/bits/linux/sys.h
@@ -23,10 +23,12 @@ typedef int pid_t;
struct sigaction;
struct rusage;
-extern int _execve(const char *, const char *[], const char *[]);
+extern int _execve(const char *, const char *[], char *const []);
extern int _fork(void);
extern pid_t _getpid(void);
extern int _kill(pid_t, int);
extern int _sigaction(int, struct sigaction *, struct sigaction *);
extern pid_t _wait4(pid_t, int *, int, struct rusage *);
extern pid_t _waitpid(pid_t, int *, int);
+
+extern char **_environ;
diff --git a/include/bits/netbsd/sys.h b/include/bits/netbsd/sys.h
@@ -23,10 +23,12 @@ typedef int pid_t;
struct sigaction;
struct rusage;
-extern int _execve(const char *, const char *[], const char *[]);
+extern int _execve(const char *, const char *[], char *const []);
extern int _fork(void);
extern pid_t _getpid(void);
extern int _kill(pid_t, int);
extern int _sigaction(int, struct sigaction *, struct sigaction *);
extern pid_t _wait4(pid_t, int *, int, struct rusage *);
extern pid_t _waitpid(pid_t, int *, int);
+
+extern char **_environ;
diff --git a/include/bits/openbsd/sys.h b/include/bits/openbsd/sys.h
@@ -23,10 +23,12 @@ typedef int pid_t;
struct sigaction;
struct rusage;
-extern int _execve(const char *, const char *[], const char *[]);
+extern int _execve(const char *, const char *[], char *const []);
extern int _fork(void);
extern pid_t _getpid(void);
extern int _kill(pid_t, int);
extern int _sigaction(int, struct sigaction *, struct sigaction *);
extern pid_t _wait4(pid_t, int *, int, struct rusage *);
extern pid_t _waitpid(pid_t, int *, int);
+
+extern char **_environ;
diff --git a/src/libc/arch/posix/getenv.c b/src/libc/arch/posix/getenv.c
@@ -1,19 +1,19 @@
+#include <sys.h>
+
#include <stdlib.h>
#include <string.h>
#undef getenv
-extern const char **_environ;
-
char *
getenv(const char *name)
{
- const char **p, *s;
+ char **p, *s;
size_t len = strlen(name);
for (p = _environ; s = *p; ++p) {
if (!strncmp(name, s, len) && s[len] == '=')
- return (char *) s + len + 1;
+ return s + len + 1;
}
return NULL;
}
diff --git a/src/libc/arch/posix/system.c b/src/libc/arch/posix/system.c
@@ -9,8 +9,6 @@
#undef system
-extern const char **_environ;
-
int
system(const char *cmd)
{