Re: [PATCH 3/3] ash: exec: -a option for setting zeroth arg
On Wed, 12 Apr 2017, Denys Vlasenko wrote: > I committed a change which implements "exec -a" > in a slightly different way. Please try current git. Works for me. Thanks a lot! BR, Kaarle ___ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox
Re: [PATCH 3/3] ash: exec: -a option for setting zeroth arg
On Tue, Apr 11, 2017 at 11:58 PM, Kaarle Ritvanenwrote: > -execcmd(int argc UNUSED_PARAM, char **argv) > +execcmd(int argc, char **argv) > { > - if (argv[1]) { > + int opt; > + char *argv0 = NULL; > + char *cmdname = NULL; > + > + GETOPT_RESET > + while ((opt = getopt(argc, argv, "a:")) != -1) (1) The rest of ash does not use getopt(). (2) Did you test this with, say, "exec stty -a" command? I committed a change which implements "exec -a" in a slightly different way. Please try current git. ___ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox
Re: [PATCH 2/3] ash: shellexec: rename variable
On Tue, Apr 11, 2017 at 11:58 PM, Kaarle Ritvanenwrote: > Signed-off-by: Kaarle Ritvanen > --- > shell/ash.c | 8 > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/shell/ash.c b/shell/ash.c > index 983f7b1..58ae950 100644 > --- a/shell/ash.c > +++ b/shell/ash.c > @@ -7748,7 +7748,7 @@ static void shellexec(char **, const char *, int) > NORETURN; > static void > shellexec(char **argv, const char *path, int idx) > { > - char *cmdname; > + char *cmdpath; This would introduce gratuitous difference from dash source. Let's not do that. dash often have patches worth backporting, and every difference makes backporting harder. ___ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox
Re: [PATCH 1/3] libbb: GETOPT_RESET macro
On Tue, Apr 11, 2017 at 11:58 PM, Kaarle Ritvanenwrote: > Signed-off-by: Kaarle Ritvanen > --- > include/libbb.h| 19 +++ > libbb/getopt32.c | 8 +--- > libbb/vfork_daemon_rexec.c | 28 ++-- > runit/sv.c | 7 +-- > shell/shell_common.c | 8 +--- > util-linux/getopt.c| 7 +-- > 6 files changed, 25 insertions(+), 52 deletions(-) > > diff --git a/include/libbb.h b/include/libbb.h > index 0407163..eb78619 100644 > --- a/include/libbb.h > +++ b/include/libbb.h > @@ -1178,6 +1178,25 @@ extern uint32_t option_mask32; > extern uint32_t getopt32(char **argv, const char *applet_opts, ...) > FAST_FUNC; > > > +/* BSD-derived getopt() functions require that optind be set to 1 in > + * order to reset getopt() state. This used to be generally accepted > + * way of resetting getopt(). However, glibc's getopt() > + * has additional getopt() state beyond optind, and requires that > + * optind be set to zero to reset its state. So the unfortunate state of > + * affairs is that BSD-derived versions of getopt() misbehave if > + * optind is set to 0 in order to reset getopt(), and glibc's getopt() > + * will core dump if optind is set 1 in order to reset getopt(). > + * > + * More modern versions of BSD require that optreset be set to 1 in > + * order to reset getopt(). Sigh. Standards, anyone? > + */ > +#ifdef __GLIBC__ > +#define GETOPT_RESET optind = 0; > +#else /* BSD style */ > +#define GETOPT_RESET optind = 1; > +#endif I think function-style macro is better: +#ifdef __GLIBC__ +#define GETOPT_RESET() (optind = 0) +#else /* BSD style */ +#define GETOPT_RESET() (optind = 1) +#endif Applied with this edit. Thanks. ___ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox
Re: [PATCH 3/3] ash: exec: -a option for setting zeroth arg
On Wed, 12 Apr 2017, Kang-Che Sung wrote: > Back in January 2017, a person named Patrick Pief has suggested a similar > patch > to add "exec -a" support: > > http://lists.busybox.net/pipermail/busybox/2017-January/085146.html > > Is your patch same as his or is there any difference? My patch parses the '-a' option in execcmd, thus not affecting the behavior of shellexec when called from evalcommand. In addition, my patch uses getopt, making it a bit easier to add more options later. Is there any reason not to merge my or Patrick's patch? If you prefer my patch, I can make the changes requested by Bartosz. BR, Kaarle ___ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox
Re: [PATCH 3/3] ash: exec: -a option for setting zeroth arg
Back in January 2017, a person named Patrick Pief has suggested a similar patch to add "exec -a" support: http://lists.busybox.net/pipermail/busybox/2017-January/085146.html Is your patch same as his or is there any difference? ___ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox
Re: [PATCH 1/3] libbb: GETOPT_RESET macro
2017-04-11 23:58 GMT+02:00 Kaarle Ritvanen: > Signed-off-by: Kaarle Ritvanen > --- > include/libbb.h| 19 +++ > libbb/getopt32.c | 8 +--- > libbb/vfork_daemon_rexec.c | 28 ++-- > runit/sv.c | 7 +-- > shell/shell_common.c | 8 +--- > util-linux/getopt.c| 7 +-- > 6 files changed, 25 insertions(+), 52 deletions(-) > > diff --git a/include/libbb.h b/include/libbb.h > index 0407163..eb78619 100644 > --- a/include/libbb.h > +++ b/include/libbb.h > @@ -1178,6 +1178,25 @@ extern uint32_t option_mask32; > extern uint32_t getopt32(char **argv, const char *applet_opts, ...) > FAST_FUNC; > > > +/* BSD-derived getopt() functions require that optind be set to 1 in > + * order to reset getopt() state. This used to be generally accepted > + * way of resetting getopt(). However, glibc's getopt() > + * has additional getopt() state beyond optind, and requires that > + * optind be set to zero to reset its state. So the unfortunate state of > + * affairs is that BSD-derived versions of getopt() misbehave if > + * optind is set to 0 in order to reset getopt(), and glibc's getopt() > + * will core dump if optind is set 1 in order to reset getopt(). > + * > + * More modern versions of BSD require that optreset be set to 1 in s/optreset/optind > + * order to reset getopt(). Sigh. Standards, anyone? > + */ > +#ifdef __GLIBC__ > +#define GETOPT_RESET optind = 0; > +#else /* BSD style */ > +#define GETOPT_RESET optind = 1; > +#endif > + This should be #define GETOPT_RESET() do { \ optind = 0; \ } while (0) > + > /* Having next pointer as a first member allows easy creation > * of "llist-compatible" structs, and using llist_FOO functions > * on them. > diff --git a/libbb/getopt32.c b/libbb/getopt32.c > index 497fc01..38fac14 100644 > --- a/libbb/getopt32.c > +++ b/libbb/getopt32.c > @@ -576,13 +576,7 @@ getopt32(char **argv, const char *applet_opts, ...) > * run_nofork_applet() does this, but we might end up here > * also via gunzip_main() -> gzip_main(). Play safe. > */ > -#ifdef __GLIBC__ > - optind = 0; > -#else /* BSD style */ > - optind = 1; > - /* optreset = 1; */ > -#endif > - /* optarg = NULL; opterr = 0; optopt = 0; - do we need this?? */ > + GETOPT_RESET > > /* Note: just "getopt() <= 0" will not work well for > * "fake" short options, like this one: > diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c > index 2e7dc2d..e2a6b39 100644 > --- a/libbb/vfork_daemon_rexec.c > +++ b/libbb/vfork_daemon_rexec.c > @@ -121,28 +121,8 @@ int FAST_FUNC run_nofork_applet(int applet_no, char > **argv) > > /* In case getopt() or getopt32() was already called: > * reset the libc getopt() function, which keeps internal state. > -* > -* BSD-derived getopt() functions require that optind be set to 1 in > -* order to reset getopt() state. This used to be generally accepted > -* way of resetting getopt(). However, glibc's getopt() > -* has additional getopt() state beyond optind, and requires that > -* optind be set to zero to reset its state. So the unfortunate > state of > -* affairs is that BSD-derived versions of getopt() misbehave if > -* optind is set to 0 in order to reset getopt(), and glibc's getopt() > -* will core dump if optind is set 1 in order to reset getopt(). > -* > -* More modern versions of BSD require that optreset be set to 1 in > -* order to reset getopt(). Sigh. Standards, anyone? > */ > -#ifdef __GLIBC__ > - optind = 0; > -#else /* BSD style */ > - optind = 1; > - /* optreset = 1; */ > -#endif > - /* optarg = NULL; opterr = 1; optopt = 63; - do we need this too? */ > - /* (values above are what they initialized to in glibc and uclibc) */ > - /* option_mask32 = 0; - not needed, no applet depends on it being 0 */ > + GETOPT_RESET > > argc = 1; > while (argv[argc]) > @@ -167,11 +147,7 @@ int FAST_FUNC run_nofork_applet(int applet_no, char > **argv) > restore_nofork_data(); > > /* Other globals can be simply reset to defaults */ > -#ifdef __GLIBC__ > - optind = 0; > -#else /* BSD style */ > - optind = 1; > -#endif > + GETOPT_RESET > > return rc & 0xff; /* don't confuse people with "exitcodes" >255 */ > } > diff --git a/runit/sv.c b/runit/sv.c > index 9e21322..4ba5df7 100644 > --- a/runit/sv.c > +++ b/runit/sv.c > @@ -688,12 +688,7 @@ int svc_main(int argc UNUSED_PARAM, char **argv) > /* getopt32() was already called: > * reset the libc getopt() function, which keeps internal state. > */ > -#ifdef __GLIBC__ > - optind = 0; > -#else /* BSD style */ > - optind = 1;