mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
* data/glr.c (ATTRIBUTE_UNUSED): Remove, since it infringes on the user's name space. All uses changed to __attribute__ ((__unused__)). (yyFail, yyMemoryExhausted, yyreportAmbiguity): Add __attribute__ ((__noreturn__)). * etc/clcommit: Remove. We weren't using it, and it failed "make maintainer-distcheck". * Makefile.maint: Merge from coreutils. (CVS_LIST, CVS_LIST_EXCEPT): New macros. (syntax-check-rules): Change list of rules as described below. (sc_cast_of_alloca_return_value, sc_dd_max_sym_length): (sc_file_system, sc_obsolete_symbols, sc_prohibit_atoi_atof): (sc_prohibit_jm_in_m4, sc_root_tests, sc_tight_scope): (sc_trailing_space): New rules. (sc_xalloc_h_in_src): Remove. (sc_cast_of_argument_to_free, sc_cast_of_x_alloc_return_value): (sc_space_tab, sc_error_exit_success, sc_changelog): (sc_system_h_headers, sc_sun_os_names, sc_unmarked_diagnostics): (makefile-check, po-check, author_mark_check): (makefile_path_separator_check, copyright-check): Use grep -n, to make it easier to find violations. Use CVS_LIST and CVS_LIST_EXCEPT. (header_regexp, h_re): Remove. (dd_c): New macro. (sc_dd_max_sym_length, .re-list, news-date-check): New rules. (my-distcheck): Use more-modern GCC flags. (signatures, %.asc): Remove. (rel-files, announcement): Remove signatures. Restore old updating code, even though we don't use it, so that we're the same as coreutils. (alpha, beta, major): Depend on news-date-check. Make the upload commands. * data/c.m4, data/lalr1.cc, data/yacc.c: Normalize white space. * lib/abitset.h, lib/bbitset.h, lib/bitset.h: Likewise. * lib/bitset_stats.c, lib/ebitset.h, lib/lbitset.c: Likewise. * lib/libitset.h, lib/timevar.c, lib/vbitset.h: Likewise. * src/Makefile.am, src/gram.c, src/muscle_tab.h: Likewise. * src/parse-gram.y, src/system.h, src/tables.c, src/vcg.c: Likewise. * src/vcg_defaults.h, tests/cxx-type.at, tests/existing.at: Likewise. * tests/sets.at: Likewise. * data/m4sugar/m4sugar.m4: Sync from Autoconf, except that we comment out the Autoconf version number. * doc/bison.texinfo (Calc++ Scanner): Don't use atoi, as it's error-prone and "make maintainer-distcheck" rejects it. * lib/subpipe.c: Include <fcntl.h> without checking for HAVE_FCNTL_H. Indent calls to "error" to pacify "make maintainer-distcheck", when the calls are not intended to be translated. * m4/subpipe.m4 (BISON_PREREQ_SUBPIPE): Don't check for fcntl.h. * src/Makefile.am (DEFS): Use +=, to pacify "make maintainer-distcheck". (bison_SOURCES): Add scan-skel.h. (sc_tight_scope): New rule, from coreutils. * src/files.c (src_extension, header_extension): Now static, not extern. * src/getargs.c (short_options): Likewise. * src/muscle_tab.c (muscle_table): Likewise. * src/parse-gram.y (current_class, current_type, current_prec): Likewise. * src/reader.c (grammar_end, previous_rule_end): Likewise. * src/getargs.h: Redo comments to pacify "make maintainer-distcheck". * src/main.c (main): Cast bindtextdomain and textdomain calls to void, to avoid warning when NLS is disabled. * src/output.c: Include scan-skel.h. (scan_skel): Remove decl, since scan-skel.h does this. (output_skeleton): Indent calls to "error" to pacify "make maintainer-distcheck". * src/print_graph.c: Don't include <obstack.h>, as system.h does this. * src/reader.h (gram_end, gram_lineno): New decls to pacify "make maintainer-distcheck". * src/scan-skel.l (skel_lex, skel_get_lineno, skel_get_in): (skel_get_out, skel_get_leng, skel_get_text, skel_set_lineno): (skel_set_in, skel_set_out, skel_get_debug, skel_set_debug): (skel_lex_destroy, scan_skel): Move these decls to... * src/scan-skel.h: New file. * src/uniqstr.c (uniqstr_assert): Indent calls to "error" to pacify "make maintainer-distcheck". * tests/Makefile.am ($(srcdir)/package.m4): Use $(VAR), not @VAR@. * tests/torture.at: Revamp to avoid misuse of atoi that "make maintainer-distcheck" complained about.
169 lines
4.0 KiB
C
169 lines
4.0 KiB
C
/* Subprocesses with pipes.
|
|
|
|
Copyright (C) 2002, 2004, 2005 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 2, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
|
|
/* Written by Paul Eggert <eggert@twinsun.com>
|
|
and Florian Krohm <florian@edamail.fishkill.ibm.com>. */
|
|
|
|
#if HAVE_CONFIG_H
|
|
# include <config.h>
|
|
#endif
|
|
|
|
#include "subpipe.h"
|
|
|
|
#include <errno.h>
|
|
|
|
#include <signal.h>
|
|
#if ! defined SIGCHLD && defined SIGCLD
|
|
# define SIGCHLD SIGCLD
|
|
#endif
|
|
|
|
#include <stdlib.h>
|
|
|
|
#if HAVE_UNISTD_H
|
|
# include <unistd.h>
|
|
#endif
|
|
#ifndef STDIN_FILENO
|
|
# define STDIN_FILENO 0
|
|
#endif
|
|
#ifndef STDOUT_FILENO
|
|
# define STDOUT_FILENO 1
|
|
#endif
|
|
#if ! HAVE_DUP2 && ! defined dup2
|
|
# include <fcntl.h>
|
|
# define dup2(f, t) (close (t), fcntl (f, F_DUPFD, t))
|
|
#endif
|
|
|
|
#if HAVE_SYS_WAIT_H
|
|
# include <sys/wait.h>
|
|
#endif
|
|
#ifndef WEXITSTATUS
|
|
# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
|
|
#endif
|
|
#ifndef WIFEXITED
|
|
# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
|
|
#endif
|
|
|
|
#if HAVE_VFORK_H
|
|
# include <vfork.h>
|
|
#endif
|
|
#if ! HAVE_WORKING_VFORK
|
|
# define vfork fork
|
|
#endif
|
|
|
|
#include "error.h"
|
|
#include "unistd-safer.h"
|
|
|
|
#include "gettext.h"
|
|
#define _(Msgid) gettext (Msgid)
|
|
|
|
|
|
/* Initialize this module. */
|
|
|
|
void
|
|
init_subpipe (void)
|
|
{
|
|
#ifdef SIGCHLD
|
|
/* System V fork+wait does not work if SIGCHLD is ignored. */
|
|
signal (SIGCHLD, SIG_DFL);
|
|
#endif
|
|
}
|
|
|
|
|
|
/* Create a subprocess that is run as a filter. ARGV is the
|
|
NULL-terminated argument vector for the subprocess. Store read and
|
|
write file descriptors for communication with the subprocess into
|
|
FD[0] and FD[1]: input meant for the process can be written into
|
|
FD[0], and output from the process can be read from FD[1]. Return
|
|
the subprocess id.
|
|
|
|
To avoid deadlock, the invoker must not let incoming data pile up
|
|
in FD[1] while writing data to FD[0]. */
|
|
|
|
pid_t
|
|
create_subpipe (char const * const *argv, int fd[2])
|
|
{
|
|
int pipe_fd[2];
|
|
int child_fd[2];
|
|
pid_t pid;
|
|
|
|
if (pipe (child_fd) != 0
|
|
|| (child_fd[0] = fd_safer (child_fd[0])) < 0
|
|
|| (fd[0] = fd_safer (child_fd[1])) < 0
|
|
|| pipe (pipe_fd) != 0
|
|
|| (fd[1] = fd_safer (pipe_fd[0])) < 0
|
|
|| (child_fd[1] = fd_safer (pipe_fd[1])) < 0)
|
|
error (EXIT_FAILURE, errno,
|
|
"pipe");
|
|
|
|
pid = vfork ();
|
|
if (pid < 0)
|
|
error (EXIT_FAILURE, errno,
|
|
"fork");
|
|
|
|
if (! pid)
|
|
{
|
|
/* Child. */
|
|
close (fd[0]);
|
|
close (fd[1]);
|
|
dup2 (child_fd[0], STDIN_FILENO);
|
|
close (child_fd[0]);
|
|
dup2 (child_fd[1], STDOUT_FILENO);
|
|
close (child_fd[1]);
|
|
|
|
/* The cast to (char **) rather than (char * const *) is needed
|
|
for portability to older hosts with a nonstandard prototype
|
|
for execvp. */
|
|
execvp (argv[0], (char **) argv);
|
|
|
|
_exit (errno == ENOENT ? 127 : 126);
|
|
}
|
|
|
|
/* Parent. */
|
|
close (child_fd[0]);
|
|
close (child_fd[1]);
|
|
return pid;
|
|
}
|
|
|
|
|
|
/* Wait for the subprocess to exit. */
|
|
|
|
void
|
|
reap_subpipe (pid_t pid, char const *program)
|
|
{
|
|
#if HAVE_WAITPID || defined waitpid
|
|
int wstatus;
|
|
if (waitpid (pid, &wstatus, 0) < 0)
|
|
error (EXIT_FAILURE, errno,
|
|
"waitpid");
|
|
else
|
|
{
|
|
int status = WIFEXITED (wstatus) ? WEXITSTATUS (wstatus) : -1;
|
|
if (status)
|
|
error (EXIT_FAILURE, 0,
|
|
_(status == 126
|
|
? "subsidiary program `%s' could not be invoked"
|
|
: status == 127
|
|
? "subsidiary program `%s' not found"
|
|
: status < 0
|
|
? "subsidiary program `%s' failed"
|
|
: "subsidiary program `%s' failed (exit status %d)"),
|
|
program, status);
|
|
}
|
|
#endif
|
|
}
|