Files
findutils/lib/buildcmd.h

145 lines
4.6 KiB
C
Raw Permalink Normal View History

/* buildcmd.[ch] -- build command lines from a stream of arguments
Copyright (C) 2005-2025 Free Software Foundation, Inc.
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 3 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
all: prefer https:// URLs where possible Change from http:// to https:// URLs for the following: www.gnu.org, gnu.org, savannah.gnu.org, git.sv.gnu.org, lists.gnu.org, translationproject.org, cve.mitre.org, cwe.mitre.org, xkcd.com, standards.ieee.org, and gcc.gnu.org. * COPYING: Do the above replacement. * ChangeLog-2013: Likewise. * NEWS: Likewise. * README: Likewise. * README-hacking: Likewise. * build-aux/Makefile.am: Likewise. * build-aux/check-testfiles.sh: Likewise. * build-aux/gen-changelog.sh: Likewise. * build-aux/man-lint.sh: Likewise. * build-aux/src-sniff.py: Likewise. * cfg.mk: Likewise. * configure.ac: Likewise. * doc/Makefile.am: Likewise. * doc/find-maint.texi: Likewise. * doc/find.texi: Likewise. * find/defs.h: Likewise. * find/exec.c: Likewise. * find/find.1: Likewise. * find/finddata.c: Likewise. * find/fstype.c: Likewise. * find/ftsfind.c: Likewise. * find/oldfind.c: Likewise. * find/parser.c: Likewise. * find/pred.c: Likewise. * find/print.c: Likewise. * find/print.h: Likewise. * find/sharefile.c: Likewise. * find/sharefile.h: Likewise. * find/testsuite/Makefile.am: Likewise. * find/testsuite/binary_locations.sh: Likewise. * find/testsuite/checklists.py: Likewise. * find/testsuite/config/unix.exp: Likewise. * find/testsuite/find.gnu/name-period.exp: Likewise. * find/testsuite/find.posix/depth1.exp: Likewise. * find/testsuite/sv-34079.sh: Likewise. * find/testsuite/sv-34976-execdir-fd-leak.sh: Likewise. * find/testsuite/sv-48030-exec-plus-bug.sh: Likewise. * find/testsuite/sv-48180-refuse-noop.sh: Likewise. * find/testsuite/sv-52220.sh: Likewise. * find/testsuite/sv-bug-32043.sh: Likewise. * find/testsuite/test_escape_c.sh: Likewise. * find/testsuite/test_escapechars.sh: Likewise. * find/testsuite/test_inode.sh: Likewise. * find/testsuite/test_type-list.sh: Likewise. * find/tree.c: Likewise. * find/util.c: Likewise. * gnulib-local/lib/gcc-function-attributes.h: Likewise. * lib/bugreports.c: Likewise. * lib/bugreports.h: Likewise. * lib/buildcmd.c: Likewise. * lib/buildcmd.h: Likewise. * lib/check-regexprops.sh: Likewise. * lib/dircallback.c: Likewise. * lib/dircallback.h: Likewise. * lib/extendbuf.c: Likewise. * lib/extendbuf.h: Likewise. * lib/fdleak.c: Likewise. * lib/fdleak.h: Likewise. * lib/findutils-version.c: Likewise. * lib/findutils-version.h: Likewise. * lib/listfile.c: Likewise. * lib/listfile.h: Likewise. * lib/printquoted.c: Likewise. * lib/printquoted.h: Likewise. * lib/qmark.c: Likewise. * lib/regexprops.c: Likewise. * lib/regextype.c: Likewise. * lib/regextype.h: Likewise. * lib/safe-atoi.c: Likewise. * lib/safe-atoi.h: Likewise. * lib/splitstring.c: Likewise. * lib/splitstring.h: Likewise. * lib/test_splitstring.c: Likewise. * lib/unused-result.h: Likewise. * locate/frcode.c: Likewise. * locate/locate.1: Likewise. * locate/locate.c: Likewise. * locate/locatedb.5: Likewise. * locate/locatedb.h: Likewise. * locate/testsuite/Makefile.am: Likewise. * locate/testsuite/config/unix.exp: Likewise. * locate/updatedb.1: Likewise. * locate/updatedb.sh: Likewise. * locate/word_io.c: Likewise. * po/fetch-po-files: Likewise. * xargs/testsuite/Makefile.am: Likewise. * xargs/testsuite/config/unix.exp: Likewise. * xargs/xargs.1: Likewise. * xargs/xargs.c: Likewise.
2017-10-23 00:19:34 +02:00
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/*
* Written by James Youngman.
*/
#ifndef INC_BUILDCMD_H
# define INC_BUILDCMD_H 1
# include <stdbool.h>
struct buildcmd_state
{
Merge Leslie Polzer's SOC 2007 changes for better ARG_MAX support 2008-03-23 Leslie Polzer <leslie.polzer@gmx.net> Merge Leslie Polzer's ARG_MAX enhancements to xargs which were produced as part of the Google Summer of Code 2007. These changes fix Savannah bug #22708. * find/pred.c (launch): The struct buildcmd_control* argument is no longer const. * find/defs.h: Likewise * lib/buildcmd.c (bc_do_insert): The struct buildcmd_control* argument is no longer const. (bc_push_arg): Likewise. (cb_exec_noop): Likewise. (get_stringv_len): New function; measures the length of a NULL-terminated argv sequence. (bc_do_exec): Rename from do_exec, and make global. Modify the function to react to exec failing with E2BIG by trying again with fewer arguments. * xargs/xargs.1: Mention that xargs automatically adopts to the situation where exec fails with E2BIG. * xargs/xargs.c: (parent): New variable, the PID of the parent process. (main): initialise the variable 'parent'. Don't fail immediately due to lack of space when the environment is large. Call xargs_do_exec via bc_do_exec. (xargs_do_exec): The struct buildcmd_control* argument is no longer const. When exec fails in the child, communicate the errno value back to the parent through a pipe which is close-on-exec; this allows us to accurately determine the cause of the failure and also to distinguish exec failures from all possible exit codes in the child. (wait_for_proc): If the utility cannot be found or cannot be run, we now find out about this by reading an errno value from the pipe, so this means that exit codes 126 and 127 in the child no longer have a special interpretation. * NEWS: mention these changes.
2008-03-24 00:13:23 +00:00
/* Number of valid elements in `cmd_argv', including terminating NULL. */
size_t cmd_argc; /* 0 */
/* The list of args being built. */
char **cmd_argv; /* NULL */
/* Number of elements allocated for `cmd_argv'. */
Eliminate some compiler warnings. * find/find.c: Remove definition of SAFE_CHDIR, which we don't use. * find/defs.h: Remove redundant declaration of launch. * find/parser.c (parse_false): Cast unused arguments to void. (parse_print0): Likewise. (pred_context): Likewise. (parse_newerXY): Add some parens for slightly greater clarity. (make_segment): Avoid switch-missing-default-case warning by turning it into an if statement. (check_path_safety): Remove unused argument. (insert_exec_ok): Don't pass the unwanted arugment to check_path_safety. (get_relative_timestamp): silence compiler warning by adding a case for the remaining enumberation value rather than using default. * find/pred.c (months): the strings can be const char*, rather than just char*. (ctime_format): change TIME_BUF_LEN to an integer constant to avoid signed/unsigned comparison. (blank_rtrim): Change to new-style function definition(!) and remove unnecessary parentheses around a return value. * lib/buildcmd.c: Omit redundant declaration of environ. * find/tree.c (get_expr): Make static. (cost_assoc): make the name field const. (prec_assoc): make the prec_name field const. (op_assoc): make the type_name field const. (type_name): turn into an ANSI function definition(!). (prec_name): Likewise! Also remove spurious parentheses around return value. (prec_name): Remove spurious parentheses around return value. * lib/buildcmd.h (buildcmd_state): change types of several fields to size_t: cmd_argc, cmd_argv_alloc, largest_successful_arg_count, smallest_failed_arg_count. (buildcmd_control): change types of several fields to size_t: max_arg_count, initial_argc, lines_per_exec, args_per_exec.
2011-06-14 23:14:21 +01:00
size_t cmd_argv_alloc;
/* Storage for elements of `cmd_argv'. */
char *argbuf;
/* Number of chars being used in `cmd_argv'. */
2005-12-23 18:24:20 +00:00
size_t cmd_argv_chars;
2005-01-15 09:32:49 +00:00
/* Number of chars being used in `cmd_argv' for the initial args.. */
2005-12-23 18:24:20 +00:00
size_t cmd_initial_argv_chars;
2005-01-15 09:32:49 +00:00
/* User context information. */
void *usercontext;
/* to-do flag. */
int todo;
/* Directory in which to perform the exec. */
int dir_fd;
Fix Savannah bug#27328, segfault if the initial exec for "find -exec" fails, and Savannah bug #27975: Infinite loop for -exec [..] {} +. 2009-11-29 James Youngman <jay@gnu.org> Fix Savannah bug#27328, segfault if the initial exec for "find -exec" fails. Also bug #27975: Infinite loop for -exec [..] {} +. * lib/buildcmd.h (struct buildcmd_state): Introduce largest_successful_arg_count and smallest_failed_arg_count in order to avoid an assumption that we understand how the operatingn system interprets ARG_MAX and the assumption that the compile-time ARG_MAX value (or the equivalent from sysconf()) is avtually correct. (struct buildcmd_control): Change the calling convention of the exec callback to allow us to pass the argument list separately. (bc_args_exceed_testing_limit): declare this new funciton. * lib/buildcmd.c (bc_args_complete): New function, NULL-terminates the argv list. We use this instead of passing NULL to bc_push_arg(). (update_limit): New function. Decides how many arguments to pass to the invoked command on the next attempt. (copy_args): Build an argument list containing all the initial arguments plus some of the other args (the number to be used is decided by update_limit). (bc_do_exec): Avoid special-casing the first call to exec. Use update_limit to decide how many arguments to pass and copy_args to build the argument list. The new form of the loop should fix Savannah bug #27328. (bc_push_arg): Drop support for passing NULL as an argument (to terminate the arg list we just pass in a special argument instead). (bc_args_exceed_testing_limit): New function, returns nonzero if the argument list exceeds a testing limit (used for failure injection by tests). (exceeds): New support function, implementing part of bc_args_exceed_testing_limit. (bc_init_state): Initialise largest_successful_arg_count and smallest_failed_arg_count. * find/defs.h (struct exec_val): New member last_child_status. This stores the status of the most recently completed child. * find/pred.c (new_impl_pred_exec): Use last_child_status. (launch): Use the new calling convention for the exec callback. Set last_child_status. Call bc_args_exceed_testing_limit() to do failure injection for unit tests. * find/util.c (do_complete_pending_execdirs): Call bc_do_exec rather than calling launch directly in order to allow for breaking the argument list up if it's too long. * xargs/xargs.c (xargs_do_exec): Update to use the new caling convention for the exec callback. Signed-off-by: James Youngman <jay@gnu.org>
2009-11-29 14:52:54 +00:00
/* Summary of what we think the argv limits are. */
Eliminate some compiler warnings. * find/find.c: Remove definition of SAFE_CHDIR, which we don't use. * find/defs.h: Remove redundant declaration of launch. * find/parser.c (parse_false): Cast unused arguments to void. (parse_print0): Likewise. (pred_context): Likewise. (parse_newerXY): Add some parens for slightly greater clarity. (make_segment): Avoid switch-missing-default-case warning by turning it into an if statement. (check_path_safety): Remove unused argument. (insert_exec_ok): Don't pass the unwanted arugment to check_path_safety. (get_relative_timestamp): silence compiler warning by adding a case for the remaining enumberation value rather than using default. * find/pred.c (months): the strings can be const char*, rather than just char*. (ctime_format): change TIME_BUF_LEN to an integer constant to avoid signed/unsigned comparison. (blank_rtrim): Change to new-style function definition(!) and remove unnecessary parentheses around a return value. * lib/buildcmd.c: Omit redundant declaration of environ. * find/tree.c (get_expr): Make static. (cost_assoc): make the name field const. (prec_assoc): make the prec_name field const. (op_assoc): make the type_name field const. (type_name): turn into an ANSI function definition(!). (prec_name): Likewise! Also remove spurious parentheses around return value. (prec_name): Remove spurious parentheses around return value. * lib/buildcmd.h (buildcmd_state): change types of several fields to size_t: cmd_argc, cmd_argv_alloc, largest_successful_arg_count, smallest_failed_arg_count. (buildcmd_control): change types of several fields to size_t: max_arg_count, initial_argc, lines_per_exec, args_per_exec.
2011-06-14 23:14:21 +01:00
size_t largest_successful_arg_count;
size_t smallest_failed_arg_count;
};
struct buildcmd_control
{
/* If true, exit if lines_per_exec or args_per_exec is exceeded. */
int exit_if_size_exceeded; /* false */
/* POSIX limits on the argument length. */
size_t posix_arg_size_max;
size_t posix_arg_size_min;
/* The maximum number of characters that can be used per command line. */
2005-12-23 18:24:20 +00:00
size_t arg_max;
2005-11-24 01:41:47 +00:00
/* max_arg_count: the maximum number of arguments that can be used.
*
* Many systems include the size of the pointers in ARG_MAX.
* Linux on PPC fails if we just subtract 1 here.
*
* However, not all systems define ARG_MAX. Our bc_get_arg_max()
* function returns a useful value even if ARG_MAX is not defined.
* However, sometimes, max_arg_count is LONG_MAX!
*/
Eliminate some compiler warnings. * find/find.c: Remove definition of SAFE_CHDIR, which we don't use. * find/defs.h: Remove redundant declaration of launch. * find/parser.c (parse_false): Cast unused arguments to void. (parse_print0): Likewise. (pred_context): Likewise. (parse_newerXY): Add some parens for slightly greater clarity. (make_segment): Avoid switch-missing-default-case warning by turning it into an if statement. (check_path_safety): Remove unused argument. (insert_exec_ok): Don't pass the unwanted arugment to check_path_safety. (get_relative_timestamp): silence compiler warning by adding a case for the remaining enumberation value rather than using default. * find/pred.c (months): the strings can be const char*, rather than just char*. (ctime_format): change TIME_BUF_LEN to an integer constant to avoid signed/unsigned comparison. (blank_rtrim): Change to new-style function definition(!) and remove unnecessary parentheses around a return value. * lib/buildcmd.c: Omit redundant declaration of environ. * find/tree.c (get_expr): Make static. (cost_assoc): make the name field const. (prec_assoc): make the prec_name field const. (op_assoc): make the type_name field const. (type_name): turn into an ANSI function definition(!). (prec_name): Likewise! Also remove spurious parentheses around return value. (prec_name): Remove spurious parentheses around return value. * lib/buildcmd.h (buildcmd_state): change types of several fields to size_t: cmd_argc, cmd_argv_alloc, largest_successful_arg_count, smallest_failed_arg_count. (buildcmd_control): change types of several fields to size_t: max_arg_count, initial_argc, lines_per_exec, args_per_exec.
2011-06-14 23:14:21 +01:00
size_t max_arg_count;
2005-11-24 01:41:47 +00:00
/* The length of `replace_pat'. */
size_t rplen;
/* If nonzero, then instead of putting the args from stdin at
the end of the command argument list, they are each stuck into the
initial args, replacing each occurrence of the `replace_pat' in the
initial args. */
const char *replace_pat;
/* Number of initial arguments given on the command line. */
size_t initial_argc; /* 0 */
/* exec callback. */
Fix Savannah bug#27328, segfault if the initial exec for "find -exec" fails, and Savannah bug #27975: Infinite loop for -exec [..] {} +. 2009-11-29 James Youngman <jay@gnu.org> Fix Savannah bug#27328, segfault if the initial exec for "find -exec" fails. Also bug #27975: Infinite loop for -exec [..] {} +. * lib/buildcmd.h (struct buildcmd_state): Introduce largest_successful_arg_count and smallest_failed_arg_count in order to avoid an assumption that we understand how the operatingn system interprets ARG_MAX and the assumption that the compile-time ARG_MAX value (or the equivalent from sysconf()) is avtually correct. (struct buildcmd_control): Change the calling convention of the exec callback to allow us to pass the argument list separately. (bc_args_exceed_testing_limit): declare this new funciton. * lib/buildcmd.c (bc_args_complete): New function, NULL-terminates the argv list. We use this instead of passing NULL to bc_push_arg(). (update_limit): New function. Decides how many arguments to pass to the invoked command on the next attempt. (copy_args): Build an argument list containing all the initial arguments plus some of the other args (the number to be used is decided by update_limit). (bc_do_exec): Avoid special-casing the first call to exec. Use update_limit to decide how many arguments to pass and copy_args to build the argument list. The new form of the loop should fix Savannah bug #27328. (bc_push_arg): Drop support for passing NULL as an argument (to terminate the arg list we just pass in a special argument instead). (bc_args_exceed_testing_limit): New function, returns nonzero if the argument list exceeds a testing limit (used for failure injection by tests). (exceeds): New support function, implementing part of bc_args_exceed_testing_limit. (bc_init_state): Initialise largest_successful_arg_count and smallest_failed_arg_count. * find/defs.h (struct exec_val): New member last_child_status. This stores the status of the most recently completed child. * find/pred.c (new_impl_pred_exec): Use last_child_status. (launch): Use the new calling convention for the exec callback. Set last_child_status. Call bc_args_exceed_testing_limit() to do failure injection for unit tests. * find/util.c (do_complete_pending_execdirs): Call bc_do_exec rather than calling launch directly in order to allow for breaking the argument list up if it's too long. * xargs/xargs.c (xargs_do_exec): Update to use the new caling convention for the exec callback. Signed-off-by: James Youngman <jay@gnu.org>
2009-11-29 14:52:54 +00:00
int (*exec_callback)(struct buildcmd_control *, void *usercontext, int argc, char **argv);
2009-04-13 13:33:24 +01:00
/* If nonzero, the maximum number of nonblank lines from stdin to use
per command line. */
unsigned long lines_per_exec; /* 0 */
/* The maximum number of arguments to use per command line. */
Eliminate some compiler warnings. * find/find.c: Remove definition of SAFE_CHDIR, which we don't use. * find/defs.h: Remove redundant declaration of launch. * find/parser.c (parse_false): Cast unused arguments to void. (parse_print0): Likewise. (pred_context): Likewise. (parse_newerXY): Add some parens for slightly greater clarity. (make_segment): Avoid switch-missing-default-case warning by turning it into an if statement. (check_path_safety): Remove unused argument. (insert_exec_ok): Don't pass the unwanted arugment to check_path_safety. (get_relative_timestamp): silence compiler warning by adding a case for the remaining enumberation value rather than using default. * find/pred.c (months): the strings can be const char*, rather than just char*. (ctime_format): change TIME_BUF_LEN to an integer constant to avoid signed/unsigned comparison. (blank_rtrim): Change to new-style function definition(!) and remove unnecessary parentheses around a return value. * lib/buildcmd.c: Omit redundant declaration of environ. * find/tree.c (get_expr): Make static. (cost_assoc): make the name field const. (prec_assoc): make the prec_name field const. (op_assoc): make the type_name field const. (type_name): turn into an ANSI function definition(!). (prec_name): Likewise! Also remove spurious parentheses around return value. (prec_name): Remove spurious parentheses around return value. * lib/buildcmd.h (buildcmd_state): change types of several fields to size_t: cmd_argc, cmd_argv_alloc, largest_successful_arg_count, smallest_failed_arg_count. (buildcmd_control): change types of several fields to size_t: max_arg_count, initial_argc, lines_per_exec, args_per_exec.
2011-06-14 23:14:21 +01:00
size_t args_per_exec;
};
enum BC_INIT_STATUS
{
BC_INIT_OK = 0,
BC_INIT_ENV_TOO_BIG,
BC_INIT_CANNOT_ACCOMODATE_HEADROOM
};
extern size_t bc_size_of_environment (void);
Merge Leslie Polzer's SOC 2007 changes for better ARG_MAX support 2008-03-23 Leslie Polzer <leslie.polzer@gmx.net> Merge Leslie Polzer's ARG_MAX enhancements to xargs which were produced as part of the Google Summer of Code 2007. These changes fix Savannah bug #22708. * find/pred.c (launch): The struct buildcmd_control* argument is no longer const. * find/defs.h: Likewise * lib/buildcmd.c (bc_do_insert): The struct buildcmd_control* argument is no longer const. (bc_push_arg): Likewise. (cb_exec_noop): Likewise. (get_stringv_len): New function; measures the length of a NULL-terminated argv sequence. (bc_do_exec): Rename from do_exec, and make global. Modify the function to react to exec failing with E2BIG by trying again with fewer arguments. * xargs/xargs.1: Mention that xargs automatically adopts to the situation where exec fails with E2BIG. * xargs/xargs.c: (parent): New variable, the PID of the parent process. (main): initialise the variable 'parent'. Don't fail immediately due to lack of space when the environment is large. Call xargs_do_exec via bc_do_exec. (xargs_do_exec): The struct buildcmd_control* argument is no longer const. When exec fails in the child, communicate the errno value back to the parent through a pipe which is close-on-exec; this allows us to accurately determine the cause of the failure and also to distinguish exec failures from all possible exit codes in the child. (wait_for_proc): If the utility cannot be found or cannot be run, we now find out about this by reading an errno value from the pipe, so this means that exit codes 126 and 127 in the child no longer have a special interpretation. * NEWS: mention these changes.
2008-03-24 00:13:23 +00:00
extern void bc_do_insert (struct buildcmd_control *ctl,
struct buildcmd_state *state,
char *arg, size_t arglen,
const char *prefix, size_t pfxlen,
const char *linebuf, size_t lblen,
int initial_args);
Merge Leslie Polzer's SOC 2007 changes for better ARG_MAX support 2008-03-23 Leslie Polzer <leslie.polzer@gmx.net> Merge Leslie Polzer's ARG_MAX enhancements to xargs which were produced as part of the Google Summer of Code 2007. These changes fix Savannah bug #22708. * find/pred.c (launch): The struct buildcmd_control* argument is no longer const. * find/defs.h: Likewise * lib/buildcmd.c (bc_do_insert): The struct buildcmd_control* argument is no longer const. (bc_push_arg): Likewise. (cb_exec_noop): Likewise. (get_stringv_len): New function; measures the length of a NULL-terminated argv sequence. (bc_do_exec): Rename from do_exec, and make global. Modify the function to react to exec failing with E2BIG by trying again with fewer arguments. * xargs/xargs.1: Mention that xargs automatically adopts to the situation where exec fails with E2BIG. * xargs/xargs.c: (parent): New variable, the PID of the parent process. (main): initialise the variable 'parent'. Don't fail immediately due to lack of space when the environment is large. Call xargs_do_exec via bc_do_exec. (xargs_do_exec): The struct buildcmd_control* argument is no longer const. When exec fails in the child, communicate the errno value back to the parent through a pipe which is close-on-exec; this allows us to accurately determine the cause of the failure and also to distinguish exec failures from all possible exit codes in the child. (wait_for_proc): If the utility cannot be found or cannot be run, we now find out about this by reading an errno value from the pipe, so this means that exit codes 126 and 127 in the child no longer have a special interpretation. * NEWS: mention these changes.
2008-03-24 00:13:23 +00:00
extern void bc_do_exec (struct buildcmd_control *ctl,
struct buildcmd_state *state);
Merge Leslie Polzer's SOC 2007 changes for better ARG_MAX support 2008-03-23 Leslie Polzer <leslie.polzer@gmx.net> Merge Leslie Polzer's ARG_MAX enhancements to xargs which were produced as part of the Google Summer of Code 2007. These changes fix Savannah bug #22708. * find/pred.c (launch): The struct buildcmd_control* argument is no longer const. * find/defs.h: Likewise * lib/buildcmd.c (bc_do_insert): The struct buildcmd_control* argument is no longer const. (bc_push_arg): Likewise. (cb_exec_noop): Likewise. (get_stringv_len): New function; measures the length of a NULL-terminated argv sequence. (bc_do_exec): Rename from do_exec, and make global. Modify the function to react to exec failing with E2BIG by trying again with fewer arguments. * xargs/xargs.1: Mention that xargs automatically adopts to the situation where exec fails with E2BIG. * xargs/xargs.c: (parent): New variable, the PID of the parent process. (main): initialise the variable 'parent'. Don't fail immediately due to lack of space when the environment is large. Call xargs_do_exec via bc_do_exec. (xargs_do_exec): The struct buildcmd_control* argument is no longer const. When exec fails in the child, communicate the errno value back to the parent through a pipe which is close-on-exec; this allows us to accurately determine the cause of the failure and also to distinguish exec failures from all possible exit codes in the child. (wait_for_proc): If the utility cannot be found or cannot be run, we now find out about this by reading an errno value from the pipe, so this means that exit codes 126 and 127 in the child no longer have a special interpretation. * NEWS: mention these changes.
2008-03-24 00:13:23 +00:00
extern void bc_push_arg (struct buildcmd_control *ctl,
struct buildcmd_state *state,
const char *arg, size_t len,
const char *prefix, size_t pfxlen,
int initial_args);
extern void bc_init_state(const struct buildcmd_control *ctl,
struct buildcmd_state *state,
void *usercontext);
extern enum BC_INIT_STATUS bc_init_controlinfo(struct buildcmd_control *ctl,
size_t arglen_headroom);
2005-12-23 18:24:20 +00:00
extern size_t bc_get_arg_max(void);
extern void bc_use_sensible_arg_max(struct buildcmd_control *ctl);
extern void bc_clear_args(const struct buildcmd_control *ctl,
struct buildcmd_state *state);
bool bc_args_exceed_testing_limit(char **argv);
#endif