summaryrefslogtreecommitdiff
path: root/coreutils/env.c (plain)
blob: e91eddb5c8b4015b0827df7f44ffad3f0af500ef
1/* vi: set sw=4 ts=4: */
2/*
3 * env implementation for busybox
4 *
5 * Copyright (c) 1988, 1993, 1994
6 * The Regents of the University of California. All rights reserved.
7 *
8 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
9 *
10 * Original copyright notice is retained at the end of this file.
11 *
12 * Modified for BusyBox by Erik Andersen <andersen@codepoet.org>
13 */
14/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
15 *
16 * Fixed bug involving exit return codes if execvp fails. Also added
17 * output error checking.
18 */
19/*
20 * Modified by Vladimir Oleynik <dzo@simtreas.ru> (C) 2003
21 * - correct "-" option usage
22 * - multiple "-u unsetenv" support
23 * - GNU long option support
24 * - use xfunc_error_retval
25 */
26//config:config ENV
27//config: bool "env"
28//config: default y
29//config: help
30//config: env is used to set an environment variable and run
31//config: a command; without options it displays the current
32//config: environment.
33//config:
34//config:config FEATURE_ENV_LONG_OPTIONS
35//config: bool "Enable long options"
36//config: default y
37//config: depends on ENV && LONG_OPTS
38//config: help
39//config: Support long options for the env applet.
40
41//applet:IF_ENV(APPLET_NOEXEC(env, env, BB_DIR_USR_BIN, BB_SUID_DROP, env))
42
43//kbuild:lib-$(CONFIG_ENV) += env.o
44
45/* BB_AUDIT SUSv3 compliant */
46/* http://www.opengroup.org/onlinepubs/007904975/utilities/env.html */
47
48//usage:#define env_trivial_usage
49//usage: "[-iu] [-] [name=value]... [PROG ARGS]"
50//usage:#define env_full_usage "\n\n"
51//usage: "Print the current environment or run PROG after setting up\n"
52//usage: "the specified environment\n"
53//usage: "\n -, -i Start with an empty environment"
54//usage: "\n -u Remove variable from the environment"
55
56#include "libbb.h"
57
58#if ENABLE_FEATURE_ENV_LONG_OPTIONS
59static const char env_longopts[] ALIGN1 =
60 "ignore-environment\0" No_argument "i"
61 "unset\0" Required_argument "u"
62 ;
63#endif
64
65int env_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
66int env_main(int argc UNUSED_PARAM, char **argv)
67{
68 unsigned opts;
69 llist_t *unset_env = NULL;
70
71#if ENABLE_FEATURE_ENV_LONG_OPTIONS
72 applet_long_options = env_longopts;
73#endif
74 opts = getopt32(argv, "+iu:+", &unset_env);
75 argv += optind;
76 if (argv[0] && LONE_DASH(argv[0])) {
77 opts |= 1;
78 ++argv;
79 }
80 if (opts & 1) {
81 clearenv();
82 }
83 while (unset_env) {
84 char *var = llist_pop(&unset_env);
85 /* This does not handle -uVAR=VAL
86 * (coreutils _sets_ the variable in that case): */
87 /*unsetenv(var);*/
88 /* This does, but uses somewhan undocumented feature that
89 * putenv("name_without_equal_sign") unsets the variable: */
90 putenv(var);
91 }
92
93 while (*argv && (strchr(*argv, '=') != NULL)) {
94 if (putenv(*argv) < 0) {
95 bb_perror_msg_and_die("putenv");
96 }
97 ++argv;
98 }
99
100 if (argv[0]) {
101 BB_EXECVP_or_die(argv);
102 }
103
104 if (environ) { /* clearenv() may set environ == NULL! */
105 char **ep;
106 for (ep = environ; *ep; ep++) {
107 puts(*ep);
108 }
109 }
110
111 fflush_stdout_and_exit(EXIT_SUCCESS);
112}
113
114/*
115 * Copyright (c) 1988, 1993, 1994
116 * The Regents of the University of California. All rights reserved.
117 *
118 * Redistribution and use in source and binary forms, with or without
119 * modification, are permitted provided that the following conditions
120 * are met:
121 * 1. Redistributions of source code must retain the above copyright
122 * notice, this list of conditions and the following disclaimer.
123 * 2. Redistributions in binary form must reproduce the above copyright
124 * notice, this list of conditions and the following disclaimer in the
125 * documentation and/or other materials provided with the distribution.
126 *
127 * 3. BSD Advertising Clause omitted per the July 22, 1999 licensing change
128 * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
129 *
130 * 4. Neither the name of the University nor the names of its contributors
131 * may be used to endorse or promote products derived from this software
132 * without specific prior written permission.
133 *
134 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
135 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
136 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
137 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
138 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
139 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
140 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
141 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
142 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
143 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
144 * SUCH DAMAGE.
145 */
146