pdp11v/usr/src/cmd/env.c
/* @(#)env.c 1.4 */
/*
* env [ - ] [ name=value ]... [command arg...]
* set environment, then execute command (or print environment)
* - says start fresh, otherwise merge with inherited environment
*/
#include <stdio.h>
#define NENV 100
char *newenv[NENV];
char *nullp = NULL;
extern char **environ;
extern errno;
extern char *sys_errlist[];
char *nvmatch(), *strchr();
void exit();
main(argc, argv, envp)
register char **argv, **envp;
{
argc--;
argv++;
if (argc && strcmp(*argv, "-") == 0) {
envp = &nullp;
argc--;
argv++;
}
for (; *envp != NULL; envp++)
if (strchr(*envp, '=') != NULL)
addname(*envp);
while (*argv != NULL && strchr(*argv, '=') != NULL)
addname(*argv++);
if (*argv == NULL)
print(0); /* doesn't return */
else {
environ = newenv;
(void) execvp(*argv, argv);
(void) fputs(sys_errlist[errno], stderr);
(void) fputs(": ", stderr);
(void) fputs(*argv, stderr);
(void) putc('\n', stderr);
exit(1);
}
}
addname(arg)
register char *arg;
{
register char **p;
for (p = newenv; *p != NULL; p++) {
if (p >= &newenv[NENV-1]) {
(void) fputs("too many values in environment\n", stderr);
print(1); /* doesn't return */
}
if (nvmatch(arg, *p) != NULL)
break;
}
*p = arg;
}
print(code)
{
register char **p = newenv;
while (*p != NULL)
(void) puts(*p++);
exit(code);
}
/*
* s1 is either name, or name=value
* s2 is name=value
* if names match, return value of s2, else NULL
*/
char *
nvmatch(s1, s2)
register char *s1, *s2;
{
while (*s1 == *s2++)
if (*s1++ == '=')
return(s2);
if (*s1 == '\0' && *(s2-1) == '=')
return(s2);
return(NULL);
}