|
Re: env - <command> -<opt> bug: env tries to eat -<opt>: msg#00158linux.busybox
Denis, # ./busybox env - echo zzz 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 diff -ru busybox.orig/coreutils/env.c busybox/coreutils/env.c --- busybox.orig/coreutils/env.c 2003-07-25 12:34:44.000000000 +0400 +++ busybox/coreutils/env.c 2003-07-25 13:52:03.000000000 +0400 @@ -33,32 +33,58 @@ * output error checking. */ +/* + * Modified by Vladimir Oleynik <andersen@xxxxxxxxxxxx> (C) 2003 + * - corretion "-" option usage + * - multiple "-u unsetenv" support + * - GNU long option support + * - save errno after exec failed before bb_perror_msg() + */ + + #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> +#include <getopt.h> #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; - argv += optind; + 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 @@ } 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 @@ /* * 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 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change - * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change> + * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change + * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change> * * 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 _______________________________________________ busybox mailing list busybox@xxxxxxxxxxxxxxxx http://codepoet.org/mailman/listinfo/busybox |
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | Re: losetup+mount can only do ro mounts. util-linux ones work :(: 00158, Denis Vlasenko |
|---|---|
| Next by Date: | Re: ash 'source' command: 00158, Vladimir N. Oleynik |
| Previous by Thread: | env - <command> -<opt> bug: env tries to eat -<opt>i: 00158, Denis Vlasenko |
| Next by Thread: | Re: env - <command> -<opt> bug: env tries to eat -<opt>: 00158, Erik Andersen |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |