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 tarball for details. 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 15/* BB_AUDIT SUSv3 compliant */ 16/* http://www.opengroup.org/onlinepubs/007904975/utilities/env.html */ 17 18/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) 19 * 20 * Fixed bug involving exit return codes if execvp fails. Also added 21 * output error checking. 22 */ 23 24/* 25 * Modified by Vladimir Oleynik <dzo@simtreas.ru> (C) 2003 26 * - correct "-" option usage 27 * - multiple "-u unsetenv" support 28 * - GNU long option support 29 * - use xfunc_error_retval 30 */ 31 32/* This is a NOEXEC applet. Be very careful! */ 33 34#include "libbb.h" 35 36#if ENABLE_FEATURE_ENV_LONG_OPTIONS 37static const char env_longopts[] ALIGN1 = 38 "ignore-environment\0" No_argument "i" 39 "unset\0" Required_argument "u" 40 ; 41#endif 42 43int env_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 44int env_main(int argc UNUSED_PARAM, char **argv) 45{ 46 char **ep; 47 unsigned opt; 48 llist_t *unset_env = NULL; 49 50 opt_complementary = "u::"; 51#if ENABLE_FEATURE_ENV_LONG_OPTIONS 52 applet_long_options = env_longopts; 53#endif 54 opt = getopt32(argv, "+iu:", &unset_env); 55 argv += optind; 56 if (*argv && LONE_DASH(argv[0])) { 57 opt |= 1; 58 ++argv; 59 } 60 if (opt & 1) { 61 clearenv(); 62 } 63 while (unset_env) { 64 char *var = llist_pop(&unset_env); 65 /* This does not handle -uVAR=VAL 66 * (coreutils _sets_ the variable in that case): */ 67 /*unsetenv(var);*/ 68 /* This does, but uses somewhan undocumented feature that 69 * putenv("name_without_equal_sign") unsets the variable: */ 70 putenv(var); 71 } 72 73 while (*argv && (strchr(*argv, '=') != NULL)) { 74 if (putenv(*argv) < 0) { 75 bb_perror_msg_and_die("putenv"); 76 } 77 ++argv; 78 } 79 80 if (*argv) { 81 BB_EXECVP(*argv, argv); 82 /* SUSv3-mandated exit codes. */ 83 xfunc_error_retval = (errno == ENOENT) ? 127 : 126; 84 bb_simple_perror_msg_and_die(*argv); 85 } 86 87 for (ep = environ; *ep; ep++) { 88 puts(*ep); 89 } 90 91 fflush_stdout_and_exit(EXIT_SUCCESS); 92} 93 94/* 95 * Copyright (c) 1988, 1993, 1994 96 * The Regents of the University of California. All rights reserved. 97 * 98 * Redistribution and use in source and binary forms, with or without 99 * modification, are permitted provided that the following conditions 100 * are met: 101 * 1. Redistributions of source code must retain the above copyright 102 * notice, this list of conditions and the following disclaimer. 103 * 2. Redistributions in binary form must reproduce the above copyright 104 * notice, this list of conditions and the following disclaimer in the 105 * documentation and/or other materials provided with the distribution. 106 * 107 * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change 108 * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change> 109 * 110 * 4. Neither the name of the University nor the names of its contributors 111 * may be used to endorse or promote products derived from this software 112 * without specific prior written permission. 113 * 114 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 115 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 116 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 117 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 118 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 119 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 120 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 121 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 122 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 123 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 124 * SUCH DAMAGE. 125 */ 126