2017-06-02 17:59:28 +08:00
|
|
|
/* Capture output from a subprocess.
|
2021-01-03 03:32:25 +08:00
|
|
|
Copyright (C) 2017-2021 Free Software Foundation, Inc.
|
2017-06-02 17:59:28 +08:00
|
|
|
This file is part of the GNU C Library.
|
|
|
|
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
The GNU C Library 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
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
|
|
License along with the GNU C Library; if not, see
|
Prefer https to http for gnu.org and fsf.org URLs
Also, change sources.redhat.com to sourceware.org.
This patch was automatically generated by running the following shell
script, which uses GNU sed, and which avoids modifying files imported
from upstream:
sed -ri '
s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g
s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g
' \
$(find $(git ls-files) -prune -type f \
! -name '*.po' \
! -name 'ChangeLog*' \
! -path COPYING ! -path COPYING.LIB \
! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \
! -path manual/texinfo.tex ! -path scripts/config.guess \
! -path scripts/config.sub ! -path scripts/install-sh \
! -path scripts/mkinstalldirs ! -path scripts/move-if-change \
! -path INSTALL ! -path locale/programs/charmap-kw.h \
! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \
! '(' -name configure \
-execdir test -f configure.ac -o -f configure.in ';' ')' \
! '(' -name preconfigure \
-execdir test -f preconfigure.ac ';' ')' \
-print)
and then by running 'make dist-prepare' to regenerate files built
from the altered files, and then executing the following to cleanup:
chmod a+x sysdeps/unix/sysv/linux/riscv/configure
# Omit irrelevant whitespace and comment-only changes,
# perhaps from a slightly-different Autoconf version.
git checkout -f \
sysdeps/csky/configure \
sysdeps/hppa/configure \
sysdeps/riscv/configure \
sysdeps/unix/sysv/linux/csky/configure
# Omit changes that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines
git checkout -f \
sysdeps/powerpc/powerpc64/ppc-mcount.S \
sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
# Omit change that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline
git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 13:40:42 +08:00
|
|
|
<https://www.gnu.org/licenses/>. */
|
2017-06-02 17:59:28 +08:00
|
|
|
|
|
|
|
#ifndef SUPPORT_CAPTURE_SUBPROCESS_H
|
|
|
|
#define SUPPORT_CAPTURE_SUBPROCESS_H
|
|
|
|
|
|
|
|
#include <support/xmemstream.h>
|
|
|
|
|
|
|
|
struct support_capture_subprocess
|
|
|
|
{
|
|
|
|
struct xmemstream out;
|
|
|
|
struct xmemstream err;
|
|
|
|
int status;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Invoke CALLBACK (CLOSURE) in a subprocess and capture standard
|
|
|
|
output, standard error, and the exit status. The out.buffer and
|
|
|
|
err.buffer members in the result are null-terminated strings which
|
|
|
|
can be examined by the caller (out.out and err.out are NULL). */
|
|
|
|
struct support_capture_subprocess support_capture_subprocess
|
|
|
|
(void (*callback) (void *), void *closure);
|
|
|
|
|
support: Add support_capture_subprogram
Its API is similar to support_capture_subprocess, but rather creates a
new process based on the input path and arguments. Under the hoods it
uses posix_spawn to create the new process.
It also allows the use of other support_capture_* functions to check
for expected results and free the resources.
Checked on x86_64-linux-gnu.
* support/Makefile (libsupport-routines): Add support_subprocess,
xposix_spawn, xposix_spawn_file_actions_addclose, and
xposix_spawn_file_actions_adddup2.
(tst-support_capture_subprocess-ARGS): New rule.
* support/capture_subprocess.h (support_capture_subprogram): New
prototype.
* support/support_capture_subprocess.c (support_capture_subprocess):
Refactor to use support_subprocess and support_capture_poll.
(support_capture_subprogram): New function.
* support/tst-support_capture_subprocess.c (write_mode_to_str,
str_to_write_mode, test_common, parse_int, handle_restart,
do_subprocess, do_subprogram, do_multiple_tests): New functions.
(do_test): Add support_capture_subprogram tests.
* support/subprocess.h: New file.
* support/support_subprocess.c: Likewise.
* support/xposix_spawn.c: Likewise.
* support/xposix_spawn_file_actions_addclose.c: Likewise.
* support/xposix_spawn_file_actions_adddup2.c: Likewise.
* support/xspawn.h: Likewise.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
2019-04-13 04:39:53 +08:00
|
|
|
/* Issue FILE with ARGV arguments by using posix_spawn and capture standard
|
|
|
|
output, standard error, and the exit status. The out.buffer and err.buffer
|
|
|
|
are handle as support_capture_subprocess. */
|
|
|
|
struct support_capture_subprocess support_capture_subprogram
|
|
|
|
(const char *file, char *const argv[]);
|
|
|
|
|
2021-04-09 23:25:45 +08:00
|
|
|
/* Copy the running program into a setgid binary and run it with CHILD_ID
|
|
|
|
argument. If execution is successful, return the exit status of the child
|
|
|
|
program, otherwise return a non-zero failure exit code. */
|
|
|
|
int support_capture_subprogram_self_sgid
|
|
|
|
(char *child_id);
|
|
|
|
|
2017-06-02 17:59:28 +08:00
|
|
|
/* Deallocate the subprocess data captured by
|
|
|
|
support_capture_subprocess. */
|
|
|
|
void support_capture_subprocess_free (struct support_capture_subprocess *);
|
|
|
|
|
2017-06-02 21:50:36 +08:00
|
|
|
enum support_capture_allow
|
|
|
|
{
|
|
|
|
/* No output is allowed. */
|
|
|
|
sc_allow_none = 0x01,
|
|
|
|
/* Output to stdout is permitted. */
|
|
|
|
sc_allow_stdout = 0x02,
|
|
|
|
/* Output to standard error is permitted. */
|
|
|
|
sc_allow_stderr = 0x04,
|
|
|
|
};
|
|
|
|
|
2018-11-29 02:59:45 +08:00
|
|
|
/* Check that the subprocess exited and that only the allowed outputs
|
|
|
|
happened. If STATUS_OR_SIGNAL is nonnegative, it is the expected
|
|
|
|
(decoded) exit status of the process, as returned by WEXITSTATUS.
|
|
|
|
If STATUS_OR_SIGNAL is negative, -STATUS_OR_SIGNAL is the expected
|
|
|
|
termination signal, as returned by WTERMSIG. ALLOWED is a
|
|
|
|
combination of support_capture_allow flags. Report errors under
|
|
|
|
the CONTEXT message. */
|
2017-06-02 21:50:36 +08:00
|
|
|
void support_capture_subprocess_check (struct support_capture_subprocess *,
|
2018-11-29 02:59:45 +08:00
|
|
|
const char *context,
|
|
|
|
int status_or_signal, int allowed)
|
2017-06-02 21:50:36 +08:00
|
|
|
__attribute__ ((nonnull (1, 2)));
|
|
|
|
|
2017-06-02 17:59:28 +08:00
|
|
|
#endif /* SUPPORT_CAPTURE_SUBPROCESS_H */
|