From 05df91a3ac5801fc1f12101ab09f56626b296e83 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Mon, 28 Jul 2003 07:42:19 +0000 Subject: [PATCH] last_patch98 from vodz: Denis, ># ./busybox env - echo zzz >zzz ># ./busybox echo -n zzz >zzz ># ./busybox env - echo -n zzz >env: invalid option -- n > > obviously, env tried to understand -n as env's option > instead of blindly passing it to echo... > >BusyBox v1.00-pre1 (2003.07.16-07:53+0000) multi-call binary > >Usage: env [-iu] [-] [name=value]... [command] Ah, you found very old problem. Last patch also have: - multiple "-u unsetenv" support - GNU long option support - save errno after exec failed before bb_perror_msg() --w vodz --- coreutils/env.c | 53 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/coreutils/env.c b/coreutils/env.c index a07bd324c..d8a76e364 100644 --- a/coreutils/env.c +++ b/coreutils/env.c @@ -33,32 +33,58 @@ * output error checking. */ +/* + * Modified by Vladimir Oleynik (C) 2003 + * - corretion "-" option usage + * - multiple "-u unsetenv" support + * - GNU long option support + * - save errno after exec failed before bb_perror_msg() + */ + + #include #include #include #include #include +#include #include "busybox.h" + +static const struct option env_long_options[] = { + { "ignore-environment", 0, NULL, 'i' }, + { "unset", 1, NULL, 'u' }, + { 0, 0, 0, 0 } +}; + extern int env_main(int argc, char** argv) { char **ep, *p; char *cleanenv[1] = { NULL }; unsigned long opt; + llist_t *unset_env; + extern char **environ; - opt = bb_getopt_ulflags(argc, argv, "iu:", &p); - if(opt & 1) - environ = cleanenv; - if(opt & 2) - unsetenv(p); + bb_opt_complementaly = "u*"; + bb_applet_long_options = env_long_options; + + opt = bb_getopt_ulflags(argc, argv, "+iu:", &unset_env); argv += optind; - if (*argv && (argv[0][0] == '-') && !argv[0][1]) { - environ = cleanenv; + opt |= 1; ++argv; } + if(opt & 1) + environ = cleanenv; + else if(opt & 2) { + while(unset_env) { + unsetenv(unset_env->data); + unset_env = unset_env->link; + } + } + while (*argv && ((p = strchr(*argv, '=')) != NULL)) { if (putenv(*argv) < 0) { bb_perror_msg_and_die("putenv"); @@ -67,9 +93,12 @@ extern int env_main(int argc, char** argv) } if (*argv) { + int er; + execvp(*argv, argv); - bb_perror_msg("%s", *argv); /* Avoid multibyte problems. */ - return (errno == ENOENT) ? 127 : 126; /* SUSv3-mandated exit codes. */ + er = errno; + bb_perror_msg("%s", *argv); /* Avoid multibyte problems. */ + return (er == ENOENT) ? 127 : 126; /* SUSv3-mandated exit codes. */ } for (ep = environ; *ep; ep++) { @@ -81,7 +110,7 @@ extern int env_main(int argc, char** argv) /* * Copyright (c) 1988, 1993, 1994 - * The Regents of the University of California. All rights reserved. + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -92,8 +121,8 @@ extern int env_main(int argc, char** argv) * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * 3. + * 3. * * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software