busybox/coreutils/env.c
<<
>>
Prefs
   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