84 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*	env 1.1 - Set environment for command		Author: Kees J. Bot
 | |
|  *								17 Dec 1997
 | |
|  */
 | |
| #define nil 0
 | |
| #include <sys/types.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <unistd.h>
 | |
| #include <errno.h>
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
| 	int i;
 | |
| 	int iflag= 0;
 | |
| 	int aflag= 0;
 | |
| 	extern char **environ;
 | |
| 
 | |
| 	i= 1;
 | |
| 	while (i < argc && argv[i][0] == '-') {
 | |
| 		char *opt= argv[i++] + 1;
 | |
| 
 | |
| 		if (opt[0] == '-' && opt[1] == 0) break;	/* -- */
 | |
| 
 | |
| 		if (opt[0] == 0) iflag= 1;			/* - */
 | |
| 
 | |
| 		while (*opt != 0) switch (*opt++) {
 | |
| 		case 'i':
 | |
| 			iflag= 1;	/* Clear environment. */
 | |
| 			break;
 | |
| 		case 'a':		/* Specify arg 0 separately. */
 | |
| 			aflag= 1;
 | |
| 			break;
 | |
| 		default:
 | |
| 			fprintf(stderr,
 | |
| 		"Usage: env [-ia] [name=value] ... [utility [argument ...]]\n");
 | |
| 			exit(1);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/* Clear the environment if -i. */
 | |
| 	if (iflag) *environ= nil;
 | |
| 
 | |
| 	/* Set the new environment strings. */
 | |
| 	while (i < argc && strchr(argv[i], '=') != nil) {
 | |
| 		if (putenv(argv[i]) != 0) {
 | |
| 			fprintf(stderr, "env: Setting '%s' failed: %s\n",
 | |
| 				argv[i], strerror(errno));
 | |
| 			exit(1);
 | |
| 		}
 | |
| 		i++;
 | |
| 	}
 | |
| 
 | |
| 	/* Environment settings and command may be separated with '--'.
 | |
| 	 * This is for compatibility with other envs, we don't advertise it.
 | |
| 	 */
 | |
| 	if (i < argc && strcmp(argv[i], "--") == 0) i++;
 | |
| 
 | |
| 	if (i >= argc) {
 | |
| 		/* No utility given; print environment. */
 | |
| 		char **ep;
 | |
| 
 | |
| 		for (ep= environ; *ep != nil; ep++) {
 | |
| 			if (puts(*ep) == EOF) {
 | |
| 				fprintf(stderr, "env: %s\n", strerror(errno));
 | |
| 				exit(1);
 | |
| 			}
 | |
| 		}
 | |
| 		return 0;
 | |
| 	} else {
 | |
| 		char *util, **args;
 | |
| 		int err;
 | |
| 
 | |
| 		util= argv[i];
 | |
| 		args= argv + i;
 | |
| 		if (aflag) args++;
 | |
| 		(void) execvp(util, args);
 | |
| 		err= errno;
 | |
| 		fprintf(stderr, "env: Can't execute %s: %s\n",
 | |
| 			util, strerror(err));
 | |
| 		return err == ENOENT ? 127 : 126;
 | |
| 	}
 | |
| }
 | 
