master xplshn/aruu / cmd / posix / env.c
 1/* See LICENSE file for copyright and license details. */
 2
 3#include <errno.h>
 4#include <stdio.h>
 5#include <stdlib.h>
 6#include <string.h>
 7#include <unistd.h>
 8
 9#include "util.h"
10#include "wexec.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  {
30    // ?man -i: interactive mode or prompt for confirmation
31    case 'i':
32      *environ = NULL;
33      break;
34    // ?man -u:str: unbuffered output
35    case 'u':
36      if (unsetenv(EARGF(usage())) < 0)
37        eprintf("unsetenv:");
38      break;
39    default:
40      usage();
41  }
42  ARGEND
43
44  for (; *argv && strchr(*argv, '='); argc--, argv++)
45    putenv(*argv);
46
47  if (*argv) {
48    wexecvp_self(*argv, argv);
49    savederrno = errno;
50    weprintf("wexecvp %s:", *argv);
51    _exit(126 + (savederrno == ENOENT));
52  }
53
54  for (; *environ; environ++)
55    puts(*environ);
56
57  return fshut(stdout, "<stdout>");
58}