--- README | 2 +- xargs.1 | 6 +++++- xargs.c | 28 +++++++++++++++++++++++++--- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/README b/README index 68a921c..e8b16b0 100644 --- a/README +++ b/README _AT_@ -99,7 +99,7 @@ The following tools are implemented: #*|o wc . =*|x which . =*|x whoami . -=*|o xargs (-p) +=*|o xargs . =*|x yes . The complement of sbase is ubase[1] which is Linux-specific and diff --git a/xargs.1 b/xargs.1 index 47cc194..1015756 100644 --- a/xargs.1 +++ b/xargs.1 _AT_@ -6,7 +6,7 @@ .Nd construct argument lists and execute command .Sh SYNOPSIS .Nm -.Op Fl rtx +.Op Fl prtx .Op Fl E Ar eofstr .Op Fl n Ar num .Op Fl s Ar num _AT_@ -36,6 +36,10 @@ newlines, may be escaped by a backslash. Use at most .Ar num arguments per command line. +.It Fl p +Prompt before running each command. Run the command only if the response +starts with 'y' or 'Y'. Implies +.Fl t . .It Fl r Do not run the command if there are no arguments. Normally the command is executed at least once even if there are no arguments. diff --git a/xargs.c b/xargs.c index 0d5dd53..5b3d214 100644 --- a/xargs.c +++ b/xargs.c _AT_@ -26,7 +26,7 @@ static size_t argbsz; static size_t argbpos; static size_t maxargs = 0; static int nerrors = 0; -static int rflag = 0, nflag = 0, tflag = 0, xflag = 0; +static int nflag = 0, pflag = 0, rflag = 0, tflag = 0, xflag = 0; static char *argb; static char *cmd[NARGS]; static char *eofstr; _AT_@ -162,15 +162,34 @@ spawn(void) int savederrno; int first = 1; char **p; + FILE *tty; + int ch, savedch; - if (tflag) { + if (pflag || tflag) { for (p = cmd; *p; p++) { if (!first) fputc(' ', stderr); fputs(*p, stderr); first = 0; } + } + + if (!pflag && tflag) fputc('\n', stderr); + + if (pflag) { + fputs(" ?...", stderr); + + tty = fopen("/dev/tty", "r"); + if (!tty) + return; + ch = savedch = fgetc(tty); + while (ch != EOF && ch != '\n') + ch = getc(tty); + fclose(tty); + + if (savedch != 'y' && savedch != 'Y') + return; } switch (fork()) { _AT_@ -188,7 +207,7 @@ spawn(void) static void usage(void) { - eprintf("usage: %s [-rtx] [-E eofstr] [-n num] [-s num] " + eprintf("usage: %s [-prtx] [-E eofstr] [-n num] [-s num] " "[cmd [arg ...]]\n", argv0); } _AT_@ -210,6 +229,9 @@ main(int argc, char *argv[]) nflag = 1; maxargs = estrtonum(EARGF(usage()), 1, MIN(SIZE_MAX, LLONG_MAX)); break; + case 'p': + pflag = 1; + break; case 'r': rflag = 1; break; -- 2.1.4Received on Tue Feb 16 2016 - 06:42:53 CET
This archive was generated by hypermail 2.3.0 : Tue Feb 16 2016 - 06:48:21 CET