oops, _envp should have been _penvp
This commit is contained in:
parent
e1a20fe944
commit
c937359a4e
4 changed files with 27 additions and 18 deletions
|
@ -53,7 +53,7 @@ _penvp
|
|||
loc 21331 /* == 0x5353 */
|
||||
bne *1
|
||||
/* environ contains the magic value. Assume it's our own environ */
|
||||
lae _envp
|
||||
lae _penvp
|
||||
loi _EM_PSIZE
|
||||
lae environ
|
||||
sti _EM_PSIZE
|
||||
|
|
|
@ -10,18 +10,18 @@
|
|||
#define ENTRY_INC 10
|
||||
#define rounded(x) (((x / ENTRY_INC) + 1) * ENTRY_INC)
|
||||
|
||||
extern const char **_envp;
|
||||
extern const char **environ; /* environ is a shadow name for _envp */
|
||||
extern const char **_penvp;
|
||||
extern const char **environ; /* environ is a shadow name for _penvp */
|
||||
|
||||
int
|
||||
putenv(char *name)
|
||||
{
|
||||
register const char **v = _envp;
|
||||
register const char **v = _penvp;
|
||||
register char *r;
|
||||
static int size = 0;
|
||||
/* When size != 0, it contains the number of entries in the
|
||||
* table (including the final NULL pointer). This means that the
|
||||
* last non-null entry is _envp[size - 2].
|
||||
* last non-null entry is _penvp[size - 2].
|
||||
*/
|
||||
|
||||
if (!name) return 0;
|
||||
|
@ -48,7 +48,7 @@ putenv(char *name)
|
|||
}
|
||||
}
|
||||
*r = '=';
|
||||
v = _envp;
|
||||
v = _penvp;
|
||||
}
|
||||
|
||||
if (!size) {
|
||||
|
@ -62,18 +62,18 @@ putenv(char *name)
|
|||
if (!(v = malloc(rounded(i) * sizeof(char **))))
|
||||
return 1;
|
||||
size = i;
|
||||
p = _envp;
|
||||
_envp = v;
|
||||
p = _penvp;
|
||||
_penvp = v;
|
||||
while (*v++ = *p++); /* copy the environment */
|
||||
v = _envp;
|
||||
v = _penvp;
|
||||
} else if (!(size % ENTRY_INC)) {
|
||||
if (!(v = realloc(_envp, rounded(size) * sizeof(char **))))
|
||||
if (!(v = realloc(_penvp, rounded(size) * sizeof(char **))))
|
||||
return 1;
|
||||
_envp = v;
|
||||
_penvp = v;
|
||||
}
|
||||
v[size - 1] = name;
|
||||
v[size] = NULL;
|
||||
size++;
|
||||
environ = _envp;
|
||||
environ = _penvp;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -6,12 +6,12 @@
|
|||
|
||||
#include <stdlib.h>
|
||||
|
||||
extern const char **environ;
|
||||
extern const char **_penvp;
|
||||
|
||||
char *
|
||||
getenv(const char *name)
|
||||
{
|
||||
register const char **v = environ;
|
||||
register const char **v = _penvp;
|
||||
register const char *p, *q;
|
||||
|
||||
if (v == NULL || name == NULL)
|
||||
|
|
|
@ -10,11 +10,19 @@
|
|||
extern int _fork(void);
|
||||
extern int _wait(int *);
|
||||
extern void _exit(int);
|
||||
extern void _execl(char *, ...);
|
||||
extern void _execve(const char *path, const char ** argv, const char ** envp);
|
||||
extern void _close(int);
|
||||
|
||||
#define FAIL 127
|
||||
|
||||
extern const char **_penvp;
|
||||
static const char *exec_tab[] = {
|
||||
"sh", /* argv[0] */
|
||||
"-c", /* argument to the shell */
|
||||
NULL, /* to be filled with user command */
|
||||
NULL /* terminating NULL */
|
||||
};
|
||||
|
||||
int
|
||||
system(const char *str)
|
||||
{
|
||||
|
@ -27,8 +35,9 @@ system(const char *str)
|
|||
for (i = 3; i <= 20; i++)
|
||||
_close(i);
|
||||
if (!str) str = "cd ."; /* just testing for a shell */
|
||||
_execl("/bin/sh", "sh", "-c", str, (char *) NULL);
|
||||
/* get here if execl fails ... */
|
||||
exec_tab[2] = str; /* fill in command */
|
||||
_execve("/bin/sh", exec_tab, _penvp);
|
||||
/* get here if execve fails ... */
|
||||
_exit(FAIL); /* see manual page */
|
||||
}
|
||||
while ((waitval = _wait(&exitstatus)) != pid) {
|
||||
|
@ -39,7 +48,7 @@ system(const char *str)
|
|||
exitstatus = -1;
|
||||
}
|
||||
if (!str) {
|
||||
if (exitstatus == FAIL << 8) /* execl() failed */
|
||||
if (exitstatus == FAIL << 8) /* execve() failed */
|
||||
exitstatus = 0;
|
||||
else exitstatus = 1; /* /bin/sh exists */
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue