Date: Sat, 21 Apr 2001 13:19:57 -0700 From: Dima Dorfman <dima@unixfreak.org> To: Jordan Hubbard <jkh@osd.bsdi.com> Cc: freebsd-current@FreeBSD.ORG, olli@secnetix.de Subject: Re: cp -d dir patch for review (or 'xargs'?) Message-ID: <20010421201957.D12FD3E09@bazooka.unixfreak.org> In-Reply-To: <20010421130719H.jkh@osd.bsdi.com>; from jkh@osd.bsdi.com on "Sat, 21 Apr 2001 13:07:19 -0700"
next in thread | previous in thread | raw e-mail | index | archive | help
Jordan Hubbard <jkh@osd.bsdi.com> writes: > > And to come back on topic: Portable scripts also should > > _not_ assume that there are no limits on the length of > > shell commands. On the other hand, portable scripts can > > legitimately assume that xargs supports -i and -I, which > > ours doesn't. > > Agreed on both counts. I guess we should fix that. I don't have a copy of SuSv2 or anything else that defines -I and -i, but from what I can gather, -i is the same as "-I {}" and -I allows things like this: dima@spike% ./xargs -I [] echo CMD LINE [] ARGS < test CMD LINE this is the contents of the test file ARGS dima@spike% ./xargs -I [] echo CMD [] LINE ARGS < test CMD this is the contents of the test file LINE ARGS dima@spike% ./xargs -I [] echo [] CMD LINE ARGS < test this is the contents of the test file CMD LINE ARGS Does that mean everyone is blind and missed my arrogant cross-post of the amazingly short patch to do this, or are we just interested in discussing it and not testing the implementation? ;-) FWIW, I'm not sure the patch is entirely correct; xargs' processing of this stuff looks like black magic. It works, but I'm not sure if I failed to cater to some other weird assumptions it makes. This is why it'd help if someone would at least look at it. Thanks, Dima Dorfman dima@unixfreak.org Index: xargs.c =================================================================== RCS file: /st/src/FreeBSD/src/usr.bin/xargs/xargs.c,v retrieving revision 1.9 diff -u -r1.9 xargs.c --- xargs.c 1999/08/28 01:07:50 1.9 +++ xargs.c 2001/04/21 20:15:27 @@ -73,6 +73,8 @@ int cnt, indouble, insingle, nargs, nflag, nline, xflag, wasquoted; char **av, *argp, **ep = env; long arg_max; + int apargs = 0; + char **avv, *replstr = NULL; /* * POSIX.2 limits the exec line length to ARG_MAX - 2K. Running that @@ -96,8 +98,14 @@ nline -= strlen(*ep++) + 1 + sizeof(*ep); } nflag = xflag = wasquoted = 0; - while ((ch = getopt(argc, argv, "0n:s:tx")) != -1) + while ((ch = getopt(argc, argv, "0I:in:s:tx")) != -1) switch(ch) { + case 'I': + replstr = optarg; + break; + case 'i': + replstr = "{}"; + break; case 'n': nflag = 1; if ((nargs = atoi(optarg)) <= 0) @@ -144,6 +152,13 @@ else { cnt = 0; do { + if (replstr && strcmp(*argv, replstr) == 0) { + apargs = 1; + *argv++; + for (avv = argv; *avv; *avv++) + cnt += strlen(*avv) + 1; + break; + } cnt += strlen(*bxp++ = *argv) + 1; } while (*++argv); } @@ -211,6 +226,8 @@ if (xp == exp || p > ebp || ch == EOF) { if (xflag && xp != exp && p > ebp) errx(1, "insufficient space for arguments"); + for (avv = argv; apargs && *avv; *avv++) + strlen(*xp++ = *avv) + 1; *xp = NULL; run(av); if (ch == EOF) @@ -253,6 +270,8 @@ if (xflag) errx(1, "insufficient space for arguments"); + for (avv = argv; apargs && *avv; *avv++) + strlen(*xp++ = *avv) + 1; *xp = NULL; run(av); xp = bxp; To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010421201957.D12FD3E09>