FILE *tty_stream;
int c, savec;
- tty_stream = xfopen(CURRENT_TTY, "r");
+ tty_stream = xfopen_for_read(CURRENT_TTY);
fputs(" ?...", stderr);
fflush(stderr);
c = savec = getc(tty_stream);
#if ENABLE_FEATURE_XARGS_SUPPORT_ZERO_TERM
static xlist_t *process0_stdin(xlist_t *list_arg,
- const char *eof_str ATTRIBUTE_UNUSED, size_t mc, char *buf)
+ const char *eof_str UNUSED_PARAM, size_t mc, char *buf)
{
int c; /* current char */
char *s = NULL; /* start word */
OPTBIT_UPTO_NUMBER,
OPTBIT_UPTO_SIZE,
OPTBIT_EOF_STRING,
- USE_FEATURE_XARGS_SUPPORT_CONFIRMATION(OPTBIT_INTERACTIVE,)
- USE_FEATURE_XARGS_SUPPORT_TERMOPT( OPTBIT_TERMINATE ,)
- USE_FEATURE_XARGS_SUPPORT_ZERO_TERM( OPTBIT_ZEROTERM ,)
-
- OPT_VERBOSE = 1<<OPTBIT_VERBOSE ,
- OPT_NO_EMPTY = 1<<OPTBIT_NO_EMPTY ,
- OPT_UPTO_NUMBER = 1<<OPTBIT_UPTO_NUMBER,
- OPT_UPTO_SIZE = 1<<OPTBIT_UPTO_SIZE ,
- OPT_EOF_STRING = 1<<OPTBIT_EOF_STRING ,
- OPT_INTERACTIVE = USE_FEATURE_XARGS_SUPPORT_CONFIRMATION((1<<OPTBIT_INTERACTIVE)) + 0,
- OPT_TERMINATE = USE_FEATURE_XARGS_SUPPORT_TERMOPT( (1<<OPTBIT_TERMINATE )) + 0,
- OPT_ZEROTERM = USE_FEATURE_XARGS_SUPPORT_ZERO_TERM( (1<<OPTBIT_ZEROTERM )) + 0,
+ OPTBIT_EOF_STRING1,
+ IF_FEATURE_XARGS_SUPPORT_CONFIRMATION(OPTBIT_INTERACTIVE,)
+ IF_FEATURE_XARGS_SUPPORT_TERMOPT( OPTBIT_TERMINATE ,)
+ IF_FEATURE_XARGS_SUPPORT_ZERO_TERM( OPTBIT_ZEROTERM ,)
+
+ OPT_VERBOSE = 1 << OPTBIT_VERBOSE ,
+ OPT_NO_EMPTY = 1 << OPTBIT_NO_EMPTY ,
+ OPT_UPTO_NUMBER = 1 << OPTBIT_UPTO_NUMBER,
+ OPT_UPTO_SIZE = 1 << OPTBIT_UPTO_SIZE ,
+ OPT_EOF_STRING = 1 << OPTBIT_EOF_STRING , /* GNU: -e[<param>] */
+ OPT_EOF_STRING1 = 1 << OPTBIT_EOF_STRING1, /* SUS: -E<param> */
+ OPT_INTERACTIVE = IF_FEATURE_XARGS_SUPPORT_CONFIRMATION((1 << OPTBIT_INTERACTIVE)) + 0,
+ OPT_TERMINATE = IF_FEATURE_XARGS_SUPPORT_TERMOPT( (1 << OPTBIT_TERMINATE )) + 0,
+ OPT_ZEROTERM = IF_FEATURE_XARGS_SUPPORT_ZERO_TERM( (1 << OPTBIT_ZEROTERM )) + 0,
};
-#define OPTION_STR "+trn:s:e::" \
- USE_FEATURE_XARGS_SUPPORT_CONFIRMATION("p") \
- USE_FEATURE_XARGS_SUPPORT_TERMOPT( "x") \
- USE_FEATURE_XARGS_SUPPORT_ZERO_TERM( "0")
+#define OPTION_STR "+trn:s:e::E:" \
+ IF_FEATURE_XARGS_SUPPORT_CONFIRMATION("p") \
+ IF_FEATURE_XARGS_SUPPORT_TERMOPT( "x") \
+ IF_FEATURE_XARGS_SUPPORT_ZERO_TERM( "0")
int xargs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int xargs_main(int argc, char **argv)
int n_max_arg;
size_t n_chars = 0;
long orig_arg_max;
- const char *eof_str = "_";
+ const char *eof_str = NULL;
unsigned opt;
size_t n_max_chars;
#if ENABLE_FEATURE_XARGS_SUPPORT_ZERO_TERM
#define read_args process_stdin
#endif
- opt = getopt32(argv, OPTION_STR, &max_args, &max_chars, &eof_str);
+ opt = getopt32(argv, OPTION_STR, &max_args, &max_chars, &eof_str, &eof_str);
+
+ /* -E ""? You may wonder why not just omit -E?
+ * This is used for portability:
+ * old xargs was using "_" as default for -E / -e */
+ if ((opt & OPT_EOF_STRING1) && eof_str[0] == '\0')
+ eof_str = NULL;
if (opt & OPT_ZEROTERM)
- USE_FEATURE_XARGS_SUPPORT_ZERO_TERM(read_args = process0_stdin);
+ IF_FEATURE_XARGS_SUPPORT_ZERO_TERM(read_args = process0_stdin);
argv += optind;
argc -= optind;
if (child_error > 0 && child_error != 123) {
break;
}
- }
+ } /* while */
if (ENABLE_FEATURE_CLEAN_UP)
free(max_chars);
return child_error;