+/* vi: set sw=4 ts=4: */
/*
* Mini xargs implementation for busybox
* Options are supported: "-prtx -n max_arg -s max_chars -e[ouf_str]"
* (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>
#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 */
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;
}
|| (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
#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;
}
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 */
}
#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;
}
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;
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);
}
#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;
}
}
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);
}
# 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 */
#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))
#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::"
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++) {
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;
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);
}