changed environment handling to decrease namespace pollution
This commit is contained in:
parent
a6d0f40fc8
commit
81ce150a96
4 changed files with 35 additions and 11 deletions
|
@ -11,6 +11,7 @@ getw.c
|
||||||
opendir.c
|
opendir.c
|
||||||
popen.c
|
popen.c
|
||||||
putenv.c
|
putenv.c
|
||||||
|
environ.c
|
||||||
putw.c
|
putw.c
|
||||||
readdir.c
|
readdir.c
|
||||||
rewinddir.c
|
rewinddir.c
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
clean:
|
clean:
|
||||||
rm -f getgrent.o getopt.o getpass.o getpw.o getw.o putw.o putenv.o \
|
rm -f getgrent.o getopt.o getpass.o getpw.o getw.o putw.o putenv.o \
|
||||||
popen.o sleep.o termcap.o fdopen.o closedir.o getdents.o \
|
environ.o popen.o sleep.o termcap.o fdopen.o closedir.o \
|
||||||
opendir.o readdir.o rewinddir.o seekdir.o telldir.o OLIST
|
getdents.o opendir.o readdir.o rewinddir.o seekdir.o \
|
||||||
|
telldir.o OLIST
|
||||||
|
|
20
lang/cem/libcc.ansi/misc/environ.c
Normal file
20
lang/cem/libcc.ansi/misc/environ.c
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* environ.c - define the variable environ
|
||||||
|
*/
|
||||||
|
/* $Header$ */
|
||||||
|
/*
|
||||||
|
* This file defines the variable environ and initializes it with a magic
|
||||||
|
* value. The C run-time start-off routine tests whether the variable
|
||||||
|
* environ is initialized with this value. If it is not, it is assumed
|
||||||
|
* that it is defined by the user. Only two bytes are tested, since we
|
||||||
|
* don't know the endian-ness and alignment restrictions of the machine.
|
||||||
|
* This means that the low-order two-bytes should be equal to the
|
||||||
|
* high-order two-bytes on machines with four-byte pointers. In fact, all
|
||||||
|
* the bytes in the pointer are the same, just in case.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if _EM_PSIZE==2
|
||||||
|
char **environ = (char **) 0x5353;
|
||||||
|
#else
|
||||||
|
char **environ = (char **) 0x53535353;
|
||||||
|
#endif
|
|
@ -10,17 +10,18 @@
|
||||||
#define ENTRY_INC 10
|
#define ENTRY_INC 10
|
||||||
#define rounded(x) (((x / ENTRY_INC) + 1) * ENTRY_INC)
|
#define rounded(x) (((x / ENTRY_INC) + 1) * ENTRY_INC)
|
||||||
|
|
||||||
extern const char **environ;
|
extern const char **_envp;
|
||||||
|
extern const char **environ; /* environ is a shadow name for _envp */
|
||||||
|
|
||||||
int
|
int
|
||||||
putenv(char *name)
|
putenv(char *name)
|
||||||
{
|
{
|
||||||
register const char **v = environ;
|
register const char **v = _envp;
|
||||||
register char *r;
|
register char *r;
|
||||||
static int size = 0;
|
static int size = 0;
|
||||||
/* When size != 0, it contains the number of entries in the
|
/* When size != 0, it contains the number of entries in the
|
||||||
* table (including the final NULL pointer). This means that the
|
* table (including the final NULL pointer). This means that the
|
||||||
* last non-null entry is environ[size - 2].
|
* last non-null entry is _envp[size - 2].
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!name) return 0;
|
if (!name) return 0;
|
||||||
|
@ -47,7 +48,7 @@ putenv(char *name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*r = '=';
|
*r = '=';
|
||||||
v = environ;
|
v = _envp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!size) {
|
if (!size) {
|
||||||
|
@ -61,17 +62,18 @@ putenv(char *name)
|
||||||
if (!(v = malloc(rounded(i) * sizeof(char **))))
|
if (!(v = malloc(rounded(i) * sizeof(char **))))
|
||||||
return 1;
|
return 1;
|
||||||
size = i;
|
size = i;
|
||||||
p = environ;
|
p = _envp;
|
||||||
environ = v;
|
_envp = v;
|
||||||
while (*v++ = *p++); /* copy the environment */
|
while (*v++ = *p++); /* copy the environment */
|
||||||
v = environ;
|
v = _envp;
|
||||||
} else if (!(size % ENTRY_INC)) {
|
} else if (!(size % ENTRY_INC)) {
|
||||||
if (!(v = realloc(environ, rounded(size) * sizeof(char **))))
|
if (!(v = realloc(_envp, rounded(size) * sizeof(char **))))
|
||||||
return 1;
|
return 1;
|
||||||
environ = v;
|
_envp = v;
|
||||||
}
|
}
|
||||||
v[size - 1] = name;
|
v[size - 1] = name;
|
||||||
v[size] = NULL;
|
v[size] = NULL;
|
||||||
size++;
|
size++;
|
||||||
|
environ = _envp;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue