comment all fields
[oweals/busybox.git] / findutils / xargs.c
index 8d7e813b5d0d0ef280f3d9b2db93768677412dc2..c3a892695fd801393e75bcffdc3999b7a442f376 100644 (file)
@@ -1,3 +1,4 @@
+/* vi: set sw=4 ts=4: */
 /*
  * Mini xargs implementation for busybox
  * Options are supported: "-prtx -n max_arg -s max_chars -e[ouf_str]"
@@ -5,29 +6,18 @@
  * (C) 2002,2003 by Vladimir Oleynik <dzo@simtreas.ru>
  *
  * Special thanks
- * - Mark Whitley and Glenn McGrath for stimul to rewrote :)
+ * - Mark Whitley and Glenn McGrath for stimulus to rewrite :)
  * - Mike Rendell <michael@cs.mun.ca>
  * and David MacKenzie <djm@gnu.ai.mit.edu>.
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
  *
  * xargs is described in the Single Unix Specification v3 at
  * http://www.opengroup.org/onlinepubs/007904975/utilities/xargs.html
  *
  */
 
+#include "busybox.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -37,7 +27,6 @@
 #include <fcntl.h>
 #include <sys/types.h>
 #include <sys/wait.h>
-#include "busybox.h"
 
 /* COMPAT:  SYSV version defaults size (and has a max value of) to 470.
    We try to make it as large as possible. */
 static int xargs_exec(char *const *args)
 {
        pid_t p;
-       volatile int exec_errno = 0;    /* shared vfork stack */
+       volatile int exec_errno = 0;    /* shared vfork stack */
 
        if ((p = vfork()) >= 0) {
                if (p == 0) {
                        /* vfork -- child */
                        execvp(args[0], args);
-                       exec_errno = errno;     /* set error to shared stack */
+                       exec_errno = errno;     /* set error to shared stack */
                        _exit(1);
                } else {
                        /* vfork -- parent */
@@ -96,12 +85,12 @@ static int xargs_exec(char *const *args)
                                        return 124;
                                }
                                if (WIFSTOPPED(status)) {
-                                       bb_error_msg("%s: stopped by signal %d", 
+                                       bb_error_msg("%s: stopped by signal %d",
                                                args[0], WSTOPSIG(status));
                                        return 125;
                                }
                                if (WIFSIGNALED(status)) {
-                                       bb_error_msg("%s: terminated by signal %d", 
+                                       bb_error_msg("%s: terminated by signal %d",
                                                args[0], WTERMSIG(status));
                                        return 125;
                                }
@@ -129,7 +118,7 @@ static int eof_stdin_detected;
                    || (c) == '\f' || (c) == '\v')
 
 #ifdef CONFIG_FEATURE_XARGS_SUPPORT_QUOTES
-static xlist_t *process_stdin(xlist_t * list_arg, 
+static xlist_t *process_stdin(xlist_t * list_arg,
        const char *eof_str, size_t mc, char *buf)
 {
 #define NORM      0
@@ -137,18 +126,18 @@ static xlist_t *process_stdin(xlist_t * list_arg,
 #define BACKSLASH 2
 #define SPACE     4
 
-       char *s = NULL;         /* start word */
-       char *p = NULL;         /* pointer to end word */
-       char q = 0;             /* quote char */
+       char *s = NULL;         /* start word */
+       char *p = NULL;         /* pointer to end word */
+       char q = 0;             /* quote char */
        char state = NORM;
        char eof_str_detected = 0;
-       size_t line_l = 0;      /* size loaded args line */
-       int c;                  /* current char */
+       size_t line_l = 0;      /* size loaded args line */
+       int c;                  /* current char */
        xlist_t *cur;
        xlist_t *prev;
 
        for (prev = cur = list_arg; cur; cur = cur->link) {
-               line_l += cur->lenght;  /* previous allocated */
+               line_l += cur->lenght;  /* previous allocated */
                if (prev != cur)
                        prev = prev->link;
        }
@@ -192,15 +181,15 @@ unexpected_eof:
                                        state = QUOTE;
                                } else {
 set:
-                                       if ((p - buf) >= mc)
+                                       if ((size_t)(p - buf) >= mc)
                                                bb_error_msg_and_die("argument line too long");
                                        *p++ = c;
                                }
                        }
                }
-               if (state == SPACE) {   /* word's delimiter or EOF detected */
+               if (state == SPACE) {   /* word's delimiter or EOF detected */
                        if (q) {
-                               bb_error_msg_and_die("unmatched %s quote", 
+                               bb_error_msg_and_die("unmatched %s quote",
                                        q == '\'' ? "single" : "double");
                        }
                        /* word loaded */
@@ -234,20 +223,20 @@ set:
 }
 #else
 /* The variant does not support single quotes, double quotes or backslash */
-static xlist_t *process_stdin(xlist_t * list_arg, 
+static xlist_t *process_stdin(xlist_t * list_arg,
        const char *eof_str, size_t mc, char *buf)
 {
 
-       int c;                  /* current char */
+       int c;                  /* current char */
        int eof_str_detected = 0;
-       char *s = NULL;         /* start word */
-       char *p = NULL;         /* pointer to end word */
-       size_t line_l = 0;      /* size loaded args line */
+       char *s = NULL;         /* start word */
+       char *p = NULL;         /* pointer to end word */
+       size_t line_l = 0;      /* size loaded args line */
        xlist_t *cur;
        xlist_t *prev;
 
        for (prev = cur = list_arg; cur; cur = cur->link) {
-               line_l += cur->lenght;  /* previous allocated */
+               line_l += cur->lenght;  /* previous allocated */
                if (prev != cur)
                        prev = prev->link;
        }
@@ -269,7 +258,7 @@ static xlist_t *process_stdin(xlist_t * list_arg,
                if ((p - buf) >= mc)
                        bb_error_msg_and_die("argument line too long");
                *p++ = c == EOF ? 0 : c;
-               if (c == EOF) { /* word's delimiter or EOF detected */
+               if (c == EOF) { /* word's delimiter or EOF detected */
                        /* word loaded */
                        if (eof_str) {
                                eof_str_detected = strcmp(s, eof_str) == 0;
@@ -311,9 +300,7 @@ static int xargs_ask_confirmation(void)
        int c, savec;
 
        if (!tty_stream) {
-               tty_stream = fopen("/dev/tty", "r");
-               if (!tty_stream)
-                       bb_perror_msg_and_die("/dev/tty");
+               tty_stream = bb_xfopen(CURRENT_TTY, "r");
                /* pranoidal security by vodz */
                fcntl(fileno(tty_stream), F_SETFD, FD_CLOEXEC);
        }
@@ -340,18 +327,18 @@ static int xargs_ask_confirmation(void)
 #endif
 
 #ifdef CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM
-static xlist_t *process0_stdin(xlist_t * list_arg, const char *eof_str,
+static xlist_t *process0_stdin(xlist_t * list_arg, const char *eof_str ATTRIBUTE_UNUSED,
                                                           size_t mc, char *buf)
 {
-       int c;                  /* current char */
-       char *s = NULL;         /* start word */
-       char *p = NULL;         /* pointer to end word */
-       size_t line_l = 0;      /* size loaded args line */
+       int c;                  /* current char */
+       char *s = NULL;         /* start word */
+       char *p = NULL;         /* pointer to end word */
+       size_t line_l = 0;      /* size loaded args line */
        xlist_t *cur;
        xlist_t *prev;
 
        for (prev = cur = list_arg; cur; cur = cur->link) {
-               line_l += cur->lenght;  /* previous allocated */
+               line_l += cur->lenght;  /* previous allocated */
                if (prev != cur)
                        prev = prev->link;
        }
@@ -366,10 +353,10 @@ static xlist_t *process0_stdin(xlist_t * list_arg, const char *eof_str,
                }
                if (s == NULL)
                        s = p = buf;
-               if ((p - buf) >= mc)
+               if ((size_t)(p - buf) >= mc)
                        bb_error_msg_and_die("argument line too long");
                *p++ = c;
-               if (c == 0) {   /* word's delimiter or EOF detected */
+               if (c == 0) {   /* word's delimiter or EOF detected */
                        /* word loaded */
                        size_t lenght = (p - buf);
 
@@ -395,9 +382,9 @@ static xlist_t *process0_stdin(xlist_t * list_arg, const char *eof_str,
 }
 
 # define READ_ARGS(l, e, nmc, mc) (*read_args)(l, e, nmc, mc)
-# define OPT_INC_0 1   /* future use */
+# define OPT_INC_0 1    /* future use */
 #else
-# define OPT_INC_0 0   /* future use */
+# define OPT_INC_0 0    /* future use */
 # define READ_ARGS(l, e, nmc, mc) process_stdin(l, e, nmc, mc)
 #endif /* CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM */
 
@@ -410,7 +397,7 @@ static xlist_t *process0_stdin(xlist_t * list_arg, const char *eof_str,
 #ifdef CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION
 #define OPT_INTERACTIVE (1<<5)
 #else
-#define OPT_INTERACTIVE (0)    /* require for algorithm &| */
+#define OPT_INTERACTIVE (0)     /* require for algorithm &| */
 #endif
 #define OPT_TERMINATE   (1<<(5+OPT_INC_P))
 #define OPT_ZEROTERM    (1<<(5+OPT_INC_P+OPT_INC_X))
@@ -438,7 +425,7 @@ int xargs_main(int argc, char **argv)
 #endif
 
 #ifdef CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION
-       bb_opt_complementaly = "pt";
+       bb_opt_complementally = "pt";
 #endif
 
        opt = bb_getopt_ulflags(argc, argv, "+trn:s:e::"
@@ -464,7 +451,7 @@ int xargs_main(int argc, char **argv)
        orig_arg_max = ARG_MAX;
        if (orig_arg_max == -1)
                orig_arg_max = LONG_MAX;
-       orig_arg_max -= 2048;   /* POSIX.2 requires subtracting 2048.  */
+       orig_arg_max -= 2048;   /* POSIX.2 requires subtracting 2048.  */
        if ((opt & OPT_UPTO_SIZE)) {
                n_max_chars = bb_xgetularg10_bnd(max_chars, 1, orig_arg_max);
                for (i = 0; i < a; i++) {
@@ -496,8 +483,8 @@ int xargs_main(int argc, char **argv)
                read_args = process0_stdin;
 #endif
 
-       while ((list = READ_ARGS(list, eof_str, n_max_chars, max_chars)) != NULL || 
-               (opt & OPT_NO_EMPTY) == 0) 
+       while ((list = READ_ARGS(list, eof_str, n_max_chars, max_chars)) != NULL ||
+               (opt & OPT_NO_EMPTY) == 0)
        {
                opt |= OPT_NO_EMPTY;
                n = 0;
@@ -574,7 +561,7 @@ const char *bb_applet_name = "debug stuff usage";
 
 void bb_show_usage(void)
 {
-       fprintf(stderr, "Usage: %s [-p] [-r] [-t] -[x] [-n max_arg] [-s max_chars]\n", 
+       fprintf(stderr, "Usage: %s [-p] [-r] [-t] -[x] [-n max_arg] [-s max_chars]\n",
                bb_applet_name);
        exit(1);
 }