master xplshn/aruu / cmd / posix / env.c
 1/* See LICENSE file for copyright and license details. */
 2
 3
 4#include <errno.h>
 5#include <stdio.h>
 6#include <stdlib.h>
 7#include <string.h>
 8#include <unistd.h>
 9
10#include "util.h"
11
12extern char **environ;
13
14static void
15usage(void)
16{
17	eprintf("usage: %s [-i] [-u var] ... [var=value] ... [cmd [arg ...]]\n", argv0);
18}
19
20// ?man env: run command in modified environment
21// ?man arguments: ... [var=value] ... [cmd [arg ...
22// ?man set environment variables and run a command
23int
24main(int argc, char *argv[])
25{
26	int savederrno;
27
28	ARGBEGIN {
29	// ?man -i: interactive mode or prompt for confirmation
30	case 'i':
31		*environ = NULL;
32		break;
33	// ?man -u:str: unbuffered output
34	case 'u':
35		if (unsetenv(EARGF(usage())) < 0)
36			eprintf("unsetenv:");
37		break;
38	default:
39		usage();
40	} ARGEND
41
42	for (; *argv && strchr(*argv, '='); argc--, argv++)
43		putenv(*argv);
44
45	if (*argv) {
46		execvp(*argv, argv);
47		savederrno = errno;
48		weprintf("execvp %s:", *argv);
49		_exit(126 + (savederrno == ENOENT));
50	}
51
52	for (; *environ; environ++)
53		puts(*environ);
54
55	return fshut(stdout, "<stdout>");
56}