diff options
Diffstat (limited to 'support')
115 files changed, 0 insertions, 7176 deletions
diff --git a/support/Makefile b/support/Makefile deleted file mode 100644 index 20b0343ade..0000000000 --- a/support/Makefile +++ /dev/null @@ -1,146 +0,0 @@ -# Makefile for support library, used only at build and test time -# Copyright (C) 2016-2017 Free Software Foundation, Inc. -# 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 -# <http://www.gnu.org/licenses/>. - -subdir := support - -include ../Makeconfig - -extra-libs := libsupport -extra-libs-others = $(extra-libs) -extra-libs-noinstall := $(extra-libs) - -libsupport-routines = \ - check \ - check_addrinfo \ - check_dns_packet \ - check_hostent \ - check_netent \ - delayed_exit \ - ignore_stderr \ - oom_error \ - resolv_test \ - set_fortify_handler \ - support-xstat \ - support_become_root \ - support_can_chroot \ - support_capture_subprocess \ - support_capture_subprocess_check \ - support_enter_network_namespace \ - support_format_address_family \ - support_format_addrinfo \ - support_format_dns_packet \ - support_format_herrno \ - support_format_hostent \ - support_format_netent \ - support_isolate_in_subprocess \ - support_record_failure \ - support_run_diff \ - support_shared_allocate \ - support_write_file_string \ - support_test_main \ - support_test_verify_impl \ - temp_file \ - write_message \ - xaccept \ - xaccept4 \ - xasprintf \ - xbind \ - xcalloc \ - xchroot \ - xclose \ - xconnect \ - xdup2 \ - xfclose \ - xfopen \ - xfork \ - xgetsockname \ - xlisten \ - xmalloc \ - xmemstream \ - xmkdir \ - xmmap \ - xmunmap \ - xopen \ - xpipe \ - xpoll \ - xpthread_attr_destroy \ - xpthread_attr_init \ - xpthread_attr_setdetachstate \ - xpthread_attr_setstacksize \ - xpthread_barrier_destroy \ - xpthread_barrier_init \ - xpthread_barrier_wait \ - xpthread_cancel \ - xpthread_check_return \ - xpthread_cond_wait \ - xpthread_create \ - xpthread_detach \ - xpthread_join \ - xpthread_mutex_consistent \ - xpthread_mutex_destroy \ - xpthread_mutex_init \ - xpthread_mutex_lock \ - xpthread_mutex_unlock \ - xpthread_mutexattr_destroy \ - xpthread_mutexattr_init \ - xpthread_mutexattr_setprotocol \ - xpthread_mutexattr_setpshared \ - xpthread_mutexattr_setrobust \ - xpthread_mutexattr_settype \ - xpthread_once \ - xpthread_sigmask \ - xpthread_spin_lock \ - xpthread_spin_unlock \ - xrealloc \ - xrecvfrom \ - xsendto \ - xsetsockopt \ - xsocket \ - xstrdup \ - xwaitpid \ - xwrite \ - -libsupport-static-only-routines := $(libsupport-routines) -# Only build one variant of the library. -libsupport-inhibit-o := .os -ifeq ($(build-shared),yes) -libsupport-inhibit-o += .o -endif - -tests = \ - README-testing \ - tst-support-namespace \ - tst-support_capture_subprocess \ - tst-support_format_dns_packet \ - tst-support_record_failure \ - -ifeq ($(run-built-tests),yes) -tests-special = \ - $(objpfx)tst-support_record_failure-2.out - -$(objpfx)tst-support_record_failure-2.out: tst-support_record_failure-2.sh \ - $(objpfx)tst-support_record_failure - $(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \ - '$(run-program-env)' '$(test-program-prefix-after-env)' \ - > $@; \ - $(evaluate-test) -endif - -$(objpfx)tst-support_format_dns_packet: $(common-objpfx)resolv/libresolv.so - -include ../Rules diff --git a/support/README b/support/README deleted file mode 100644 index 476cfcda59..0000000000 --- a/support/README +++ /dev/null @@ -1,29 +0,0 @@ -This subdirectory contains infrastructure which is not put into -installed libraries, but may be linked into programs (installed or -not) and tests. - -# Error-checking wrappers - -These wrappers test for error return codes an terminate the process on -error. They are declared in these header files: - -* support.h -* xsignal.h -* xthread.h - -In general, new wrappers should be added to support.h if possible. -However, support.h must remain fully compatible with C90 and therefore -cannot include headers which use identifers not reserved in C90. If -the wrappers need additional types, additional headers such as -signal.h need to be introduced. - -# Test framework - -The test framework provides a main program for tests, including a -timeout for hanging tests. See README-testing.c for a minimal -example, and test-driver.c for details how to use it. The following -header files provide related declarations: - -* check.h -* temp_file.h -* test-driver.h diff --git a/support/README-testing.c b/support/README-testing.c deleted file mode 100644 index 9d289c3020..0000000000 --- a/support/README-testing.c +++ /dev/null @@ -1,19 +0,0 @@ -/* This file contains an example test case which shows minimal use of - the test framework. Additional testing hooks are described in - <support/test-driver.c>. */ - -/* This function will be called from the test driver. */ -static int -do_test (void) -{ - if (3 == 5) - /* Indicate failure. */ - return 1; - else - /* Indicate success. */ - return 0; -} - -/* This file references do_test above and contains the definition of - the main function. */ -#include <support/test-driver.c> diff --git a/support/capture_subprocess.h b/support/capture_subprocess.h deleted file mode 100644 index 43caf9bce4..0000000000 --- a/support/capture_subprocess.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Capture output from a subprocess. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#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); - -/* Deallocate the subprocess data captured by - support_capture_subprocess. */ -void support_capture_subprocess_free (struct support_capture_subprocess *); - -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, -}; - -/* Check that the subprocess exited with STATUS and that only the - allowed outputs happened. ALLOWED is a combination of - support_capture_allow flags. Report errors under the CONTEXT - message. */ -void support_capture_subprocess_check (struct support_capture_subprocess *, - const char *context, int status, - int allowed) - __attribute__ ((nonnull (1, 2))); - -#endif /* SUPPORT_CAPTURE_SUBPROCESS_H */ diff --git a/support/check.c b/support/check.c deleted file mode 100644 index 592f2bc856..0000000000 --- a/support/check.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Support code for reporting test results. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check.h> - -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <support/test-driver.h> - -static void -print_failure (const char *file, int line, const char *format, va_list ap) -{ - printf ("error: %s:%d: ", file, line); - vprintf (format, ap); - puts (""); -} - -int -support_print_failure_impl (const char *file, int line, - const char *format, ...) -{ - support_record_failure (); - va_list ap; - va_start (ap, format); - print_failure (file, line, format, ap); - va_end (ap); - return 1; -} - -void -support_exit_failure_impl (int status, const char *file, int line, - const char *format, ...) -{ - if (status != EXIT_SUCCESS && status != EXIT_UNSUPPORTED) - support_record_failure (); - va_list ap; - va_start (ap, format); - print_failure (file, line, format, ap); - va_end (ap); - exit (status); -} diff --git a/support/check.h b/support/check.h deleted file mode 100644 index 1d244a3557..0000000000 --- a/support/check.h +++ /dev/null @@ -1,94 +0,0 @@ -/* Functionality for reporting test results. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_CHECK_H -#define SUPPORT_CHECK_H - -#include <sys/cdefs.h> - -__BEGIN_DECLS - -/* Record a test failure, print the failure message to standard output - and return 1. */ -#define FAIL_RET(...) \ - return support_print_failure_impl (__FILE__, __LINE__, __VA_ARGS__) - -/* Print the failure message and terminate the process with STATUS. - Record a the process as failed if STATUS is neither EXIT_SUCCESS - nor EXIT_UNSUPPORTED. */ -#define FAIL_EXIT(status, ...) \ - support_exit_failure_impl (status, __FILE__, __LINE__, __VA_ARGS__) - -/* Record a test failure, print the failure message and terminate with - exit status 1. */ -#define FAIL_EXIT1(...) \ - support_exit_failure_impl (1, __FILE__, __LINE__, __VA_ARGS__) - -/* Print failure message and terminate with as unsupported test (exit - status of 77). */ -#define FAIL_UNSUPPORTED(...) \ - support_exit_failure_impl (77, __FILE__, __LINE__, __VA_ARGS__) - -/* Record a test failure (but continue executing) if EXPR evaluates to - false. */ -#define TEST_VERIFY(expr) \ - ({ \ - if (expr) \ - ; \ - else \ - support_test_verify_impl (-1, __FILE__, __LINE__, #expr); \ - }) - -/* Record a test failure and exit if EXPR evaluates to false. */ -#define TEST_VERIFY_EXIT(expr) \ - ({ \ - if (expr) \ - ; \ - else \ - support_test_verify_impl (1, __FILE__, __LINE__, #expr); \ - }) - -int support_print_failure_impl (const char *file, int line, - const char *format, ...) - __attribute__ ((nonnull (1), format (printf, 3, 4))); -void support_exit_failure_impl (int exit_status, - const char *file, int line, - const char *format, ...) - __attribute__ ((noreturn, nonnull (2), format (printf, 4, 5))); -void support_test_verify_impl (int status, const char *file, int line, - const char *expr); - -/* Record a test failure. This function returns and does not - terminate the process. The failure counter is stored in a shared - memory mapping, so that failures reported in child processes are - visible to the parent process and test driver. This function - depends on initialization by an ELF constructor, so it can only be - invoked after the test driver has run. Note that this function - does not support reporting failures from a DSO. */ -void support_record_failure (void); - -/* Internal function called by the test driver. */ -int support_report_failure (int status) - __attribute__ ((weak, warn_unused_result)); - -/* Internal function used to test the failure recording framework. */ -void support_record_failure_reset (void); - -__END_DECLS - -#endif /* SUPPORT_CHECK_H */ diff --git a/support/check_addrinfo.c b/support/check_addrinfo.c deleted file mode 100644 index 55895ace3c..0000000000 --- a/support/check_addrinfo.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Compare struct addrinfo values against a formatted string. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check_nss.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> -#include <support/format_nss.h> -#include <support/run_diff.h> - -void -check_addrinfo (const char *query_description, struct addrinfo *ai, int ret, - const char *expected) -{ - char *formatted = support_format_addrinfo (ai, ret); - if (strcmp (formatted, expected) != 0) - { - support_record_failure (); - printf ("error: addrinfo comparison failure\n"); - if (query_description != NULL) - printf ("query: %s\n", query_description); - support_run_diff ("expected", expected, - "actual", formatted); - } - free (formatted); -} diff --git a/support/check_dns_packet.c b/support/check_dns_packet.c deleted file mode 100644 index d2a31bed7b..0000000000 --- a/support/check_dns_packet.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Check that a DNS packet buffer has the expected contents. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check_nss.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> -#include <support/format_nss.h> -#include <support/run_diff.h> - -void -check_dns_packet (const char *query_description, - const unsigned char *buffer, size_t length, - const char *expected) -{ - char *formatted = support_format_dns_packet (buffer, length); - if (strcmp (formatted, expected) != 0) - { - support_record_failure (); - printf ("error: packet comparison failure\n"); - if (query_description != NULL) - printf ("query: %s\n", query_description); - support_run_diff ("expected", expected, "actual", formatted); - } - free (formatted); -} diff --git a/support/check_hostent.c b/support/check_hostent.c deleted file mode 100644 index 890d672d50..0000000000 --- a/support/check_hostent.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Compare struct hostent values against a formatted string. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check_nss.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> -#include <support/format_nss.h> -#include <support/run_diff.h> - -void -check_hostent (const char *query_description, struct hostent *h, - const char *expected) -{ - char *formatted = support_format_hostent (h); - if (strcmp (formatted, expected) != 0) - { - support_record_failure (); - printf ("error: hostent comparison failure\n"); - if (query_description != NULL) - printf ("query: %s\n", query_description); - support_run_diff ("expected", expected, - "actual", formatted); - } - free (formatted); -} diff --git a/support/check_netent.c b/support/check_netent.c deleted file mode 100644 index daa3083fd1..0000000000 --- a/support/check_netent.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Compare struct netent values against a formatted string. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check_nss.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> -#include <support/format_nss.h> -#include <support/run_diff.h> - -void -check_netent (const char *query_description, struct netent *e, - const char *expected) -{ - char *formatted = support_format_netent (e); - if (strcmp (formatted, expected) != 0) - { - support_record_failure (); - printf ("error: netent comparison failure\n"); - if (query_description != NULL) - printf ("query: %s\n", query_description); - support_run_diff ("expected", expected, - "actual", formatted); - } - free (formatted); -} diff --git a/support/check_nss.h b/support/check_nss.h deleted file mode 100644 index 2893f2c295..0000000000 --- a/support/check_nss.h +++ /dev/null @@ -1,42 +0,0 @@ -/* Test verification functions for NSS- and DNS-related data. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_CHECK_NSS_H -#define SUPPORT_CHECK_NSS_H - -#include <netdb.h> -#include <sys/cdefs.h> - -__BEGIN_DECLS - -/* Compare the data structures against the expected values (which have - to be formatted according to the support_format_* functions in - <support/format_nss.h>). If there is a difference, a delayed test - failure is recorded, and a diff is written to standard output. */ -void check_addrinfo (const char *query_description, - struct addrinfo *, int ret, const char *expected); -void check_dns_packet (const char *query_description, - const unsigned char *, size_t, const char *expected); -void check_hostent (const char *query_description, - struct hostent *, const char *expected); -void check_netent (const char *query_description, - struct netent *, const char *expected); - -__END_DECLS - -#endif /* SUPPORT_CHECK_NSS_H */ diff --git a/support/delayed_exit.c b/support/delayed_exit.c deleted file mode 100644 index 67442f95df..0000000000 --- a/support/delayed_exit.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Time-triggered process termination. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> -#include <support/xsignal.h> - -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> -#include <time.h> - -static void * -delayed_exit_thread (void *seconds_as_ptr) -{ - int seconds = (uintptr_t) seconds_as_ptr; - struct timespec delay = { seconds, 0 }; - struct timespec remaining = { 0 }; - if (nanosleep (&delay, &remaining) != 0) - FAIL_EXIT1 ("nanosleep: %m"); - /* Exit the process sucessfully. */ - exit (0); - return NULL; -} - -void -delayed_exit (int seconds) -{ - /* Create the new thread with all signals blocked. */ - sigset_t all_blocked; - sigfillset (&all_blocked); - sigset_t old_set; - xpthread_sigmask (SIG_SETMASK, &all_blocked, &old_set); - /* Create a detached thread. */ - pthread_t thr = xpthread_create - (NULL, delayed_exit_thread, (void *) (uintptr_t) seconds); - xpthread_detach (thr); - /* Restore the original signal mask. */ - xpthread_sigmask (SIG_SETMASK, &old_set, NULL); -} diff --git a/support/format_nss.h b/support/format_nss.h deleted file mode 100644 index fb4597c238..0000000000 --- a/support/format_nss.h +++ /dev/null @@ -1,41 +0,0 @@ -/* String formatting functions for NSS- and DNS-related data. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_FORMAT_NSS_H -#define SUPPORT_FORMAT_NSS_H - -#include <netdb.h> -#include <sys/cdefs.h> - -__BEGIN_DECLS - -/* The following functions format their arguments as human-readable - strings (which can span multiple lines). The caller must free the - returned buffer. For NULL pointers or failure status arguments, - error variables such as h_errno and errno are included in the - result. */ -char *support_format_address_family (int); -char *support_format_addrinfo (struct addrinfo *, int ret); -char *support_format_dns_packet (const unsigned char *buffer, size_t length); -char *support_format_herrno (int); -char *support_format_hostent (struct hostent *); -char *support_format_netent (struct netent *); - -__END_DECLS - -#endif /* SUPPORT_FORMAT_NSS_H */ diff --git a/support/ignore_stderr.c b/support/ignore_stderr.c deleted file mode 100644 index 7b77a2cd56..0000000000 --- a/support/ignore_stderr.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Avoid all the buffer overflow messages on stderr. - Copyright (C) 2015-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/support.h> - -#include <fcntl.h> -#include <paths.h> -#include <stdlib.h> -#include <unistd.h> - -void -ignore_stderr (void) -{ - int fd = open (_PATH_DEVNULL, O_WRONLY); - if (fd == -1) - close (STDERR_FILENO); - else - { - dup2 (fd, STDERR_FILENO); - close (fd); - } - setenv ("LIBC_FATAL_STDERR_", "1", 1); -} diff --git a/support/namespace.h b/support/namespace.h deleted file mode 100644 index e1ccaa1ef0..0000000000 --- a/support/namespace.h +++ /dev/null @@ -1,65 +0,0 @@ -/* Entering namespaces for test case isolation. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_NAMESPACE_H -#define SUPPORT_NAMESPACE_H - -#include <stdbool.h> -#include <sys/cdefs.h> - -__BEGIN_DECLS - -/* Attempts to become root (or acquire root-like privileges), possibly - with the help of user namespaces. Return true if (restricted) root - privileges could be attained in some way. Print diagnostics to - standard output. - - Note that this function generally has to be called before a process - becomes multi-threaded, otherwise it may fail with insufficient - privileges on systems which would support this operation for - single-threaded processes. */ -bool support_become_root (void); - -/* Return true if this process can perform a chroot operation. In - general, this is only possible if support_become_root has been - called. Note that the actual test is performed in a subprocess, - after fork, so that the file system root of the original process is - not changed. */ -bool support_can_chroot (void); - -/* Enter a network namespace (and a UTS namespace if possible) and - configure the loopback interface. Return true if a network - namespace could be created. Print diagnostics to standard output. - If a network namespace could be created, but networking in it could - not be configured, terminate the process. It is recommended to - call support_become_root before this function so that the process - has sufficient privileges. */ -bool support_enter_network_namespace (void); - -/* Return true if support_enter_network_namespace managed to enter a - UTS namespace. */ -bool support_in_uts_namespace (void); - -/* Invoke CALLBACK (CLOSURE) in a subprocess created using fork. - Terminate the calling process if the subprocess exits with a - non-zero exit status. */ -void support_isolate_in_subprocess (void (*callback) (void *), void *closure); - -__END_DECLS - -#endif diff --git a/support/oom_error.c b/support/oom_error.c deleted file mode 100644 index 7816978273..0000000000 --- a/support/oom_error.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Reporting out-of-memory errors. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/support.h> - -#include <stdio.h> -#include <stdlib.h> - -void -oom_error (const char *function, size_t size) -{ - printf ("%s: unable to allocate %zu bytes: %m\n", function, size); - exit (1); -} diff --git a/support/resolv_test.c b/support/resolv_test.c deleted file mode 100644 index 050cd7154b..0000000000 --- a/support/resolv_test.c +++ /dev/null @@ -1,1202 +0,0 @@ -/* DNS test framework and libresolv redirection. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/resolv_test.h> - -#include <arpa/inet.h> -#include <errno.h> -#include <fcntl.h> -#include <nss.h> -#include <resolv.h> -#include <search.h> -#include <stdlib.h> -#include <string.h> -#include <support/check.h> -#include <support/namespace.h> -#include <support/support.h> -#include <support/test-driver.h> -#include <support/xsocket.h> -#include <support/xthread.h> -#include <support/xunistd.h> -#include <sys/uio.h> -#include <unistd.h> - -/* Response builder. */ - -enum - { - max_response_length = 65536 - }; - -/* List of pointers to be freed. The hash table implementation - (struct hsearch_data) does not provide a way to deallocate all - objects, so this approach is used to avoid memory leaks. */ -struct to_be_freed -{ - struct to_be_freed *next; - void *ptr; -}; - -struct resolv_response_builder -{ - const unsigned char *query_buffer; - size_t query_length; - - size_t offset; /* Bytes written so far in buffer. */ - ns_sect section; /* Current section in the DNS packet. */ - unsigned int truncate_bytes; /* Bytes to remove at end of response. */ - bool drop; /* Discard generated response. */ - bool close; /* Close TCP client connection. */ - - /* Offset of the two-byte RDATA length field in the currently - written RDATA sub-structure. 0 if no RDATA is being written. */ - size_t current_rdata_offset; - - /* Hash table for locating targets for label compression. */ - struct hsearch_data compression_offsets; - /* List of pointers which need to be freed. Used for domain names - involved in label compression. */ - struct to_be_freed *to_be_freed; - - /* Must be last. Not zeroed for performance reasons. */ - unsigned char buffer[max_response_length]; -}; - -/* Response builder. */ - -/* Add a pointer to the list of pointers to be freed when B is - deallocated. */ -static void -response_push_pointer_to_free (struct resolv_response_builder *b, void *ptr) -{ - if (ptr == NULL) - return; - struct to_be_freed *e = xmalloc (sizeof (*e)); - *e = (struct to_be_freed) {b->to_be_freed, ptr}; - b->to_be_freed = e; -} - -void -resolv_response_init (struct resolv_response_builder *b, - struct resolv_response_flags flags) -{ - if (b->offset > 0) - FAIL_EXIT1 ("response_init: called at offset %zu", b->offset); - if (b->query_length < 12) - FAIL_EXIT1 ("response_init called for a query of size %zu", - b->query_length); - if (flags.rcode > 15) - FAIL_EXIT1 ("response_init: invalid RCODE %u", flags.rcode); - - /* Copy the transaction ID. */ - b->buffer[0] = b->query_buffer[0]; - b->buffer[1] = b->query_buffer[1]; - - /* Initialize the flags. */ - b->buffer[2] = 0x80; /* Mark as response. */ - b->buffer[2] |= b->query_buffer[2] & 0x01; /* Copy the RD bit. */ - if (flags.tc) - b->buffer[2] |= 0x02; - b->buffer[3] = 0x80 | flags.rcode; /* Always set RA. */ - - /* Fill in the initial section count values. */ - b->buffer[4] = flags.qdcount >> 8; - b->buffer[5] = flags.qdcount; - b->buffer[6] = flags.ancount >> 8; - b->buffer[7] = flags.ancount; - b->buffer[8] = flags.nscount >> 8; - b->buffer[9] = flags.nscount; - b->buffer[10] = flags.adcount >> 8; - b->buffer[11] = flags.adcount; - - b->offset = 12; -} - -void -resolv_response_section (struct resolv_response_builder *b, ns_sect section) -{ - if (b->offset == 0) - FAIL_EXIT1 ("resolv_response_section: response_init not called before"); - if (section < b->section) - FAIL_EXIT1 ("resolv_response_section: cannot go back to previous section"); - b->section = section; -} - -/* Add a single byte to B. */ -static inline void -response_add_byte (struct resolv_response_builder *b, unsigned char ch) -{ - if (b->offset == max_response_length) - FAIL_EXIT1 ("DNS response exceeds 64 KiB limit"); - b->buffer[b->offset] = ch; - ++b->offset; -} - -/* Add a 16-bit word VAL to B, in big-endian format. */ -static void -response_add_16 (struct resolv_response_builder *b, uint16_t val) -{ - response_add_byte (b, val >> 8); - response_add_byte (b, val); -} - -/* Increment the pers-section record counter in the packet header. */ -static void -response_count_increment (struct resolv_response_builder *b) -{ - unsigned int offset = b->section; - offset = 4 + 2 * offset; - ++b->buffer[offset + 1]; - if (b->buffer[offset + 1] == 0) - { - /* Carry. */ - ++b->buffer[offset]; - if (b->buffer[offset] == 0) - /* Overflow. */ - FAIL_EXIT1 ("too many records in section"); - } -} - -void -resolv_response_add_question (struct resolv_response_builder *b, - const char *name, uint16_t class, uint16_t type) -{ - if (b->offset == 0) - FAIL_EXIT1 ("resolv_response_add_question: " - "resolv_response_init not called"); - if (b->section != ns_s_qd) - FAIL_EXIT1 ("resolv_response_add_question: " - "must be called in the question section"); - - resolv_response_add_name (b, name); - response_add_16 (b, type); - response_add_16 (b, class); - - response_count_increment (b); -} - -void -resolv_response_add_name (struct resolv_response_builder *b, - const char *const origname) -{ - /* Normalized name. */ - char *name; - /* Normalized name with case preserved. */ - char *name_case; - { - size_t namelen = strlen (origname); - /* Remove trailing dots. FIXME: Handle trailing quoted dots. */ - while (namelen > 0 && origname[namelen - 1] == '.') - --namelen; - name = xmalloc (namelen + 1); - name_case = xmalloc (namelen + 1); - /* Copy and convert to lowercase. FIXME: This needs to normalize - escaping as well. */ - for (size_t i = 0; i < namelen; ++i) - { - char ch = origname[i]; - name_case[i] = ch; - if ('A' <= ch && ch <= 'Z') - ch = ch - 'A' + 'a'; - name[i] = ch; - } - name[namelen] = 0; - name_case[namelen] = 0; - } - char *name_start = name; - char *name_case_start = name_case; - - bool compression = false; - while (*name) - { - /* Search for a previous name we can reference. */ - ENTRY new_entry = - { - .key = name, - .data = (void *) (uintptr_t) b->offset, - }; - - /* If the label can be a compression target because it is at a - reachable offset, add it to the hash table. */ - ACTION action; - if (b->offset < (1 << 12)) - action = ENTER; - else - action = FIND; - - /* Search for known compression offsets in the hash table. */ - ENTRY *e; - if (hsearch_r (new_entry, action, &e, &b->compression_offsets) == 0) - { - if (action == FIND && errno == ESRCH) - /* Fall through. */ - e = NULL; - else - FAIL_EXIT1 ("hsearch_r failure in name compression: %m"); - } - - /* The name is known. Reference the previous location. */ - if (e != NULL && e->data != new_entry.data) - { - size_t old_offset = (uintptr_t) e->data; - response_add_byte (b, 0xC0 | (old_offset >> 8)); - response_add_byte (b, old_offset); - compression = true; - break; - } - - /* The name does not exist yet. Write one label. First, add - room for the label length. */ - size_t buffer_label_offset = b->offset; - response_add_byte (b, 0); - - /* Copy the label. */ - while (true) - { - char ch = *name_case; - if (ch == '\0') - break; - ++name; - ++name_case; - if (ch == '.') - break; - /* FIXME: Handle escaping. */ - response_add_byte (b, ch); - } - - /* Patch in the label length. */ - size_t label_length = b->offset - buffer_label_offset - 1; - if (label_length == 0) - FAIL_EXIT1 ("empty label in name compression: %s", origname); - if (label_length > 63) - FAIL_EXIT1 ("label too long in name compression: %s", origname); - b->buffer[buffer_label_offset] = label_length; - - /* Continue with the tail of the name and the next label. */ - } - - if (compression) - { - /* If we found an immediate match for the name, we have not put - it into the hash table, and can free it immediately. */ - if (name == name_start) - free (name_start); - else - response_push_pointer_to_free (b, name_start); - } - else - { - /* Terminate the sequence of labels. With compression, this is - implicit in the compression reference. */ - response_add_byte (b, 0); - response_push_pointer_to_free (b, name_start); - } - - free (name_case_start); -} - -void -resolv_response_open_record (struct resolv_response_builder *b, - const char *name, - uint16_t class, uint16_t type, uint32_t ttl) -{ - if (b->section == ns_s_qd) - FAIL_EXIT1 ("resolv_response_open_record called in question section"); - if (b->current_rdata_offset != 0) - FAIL_EXIT1 ("resolv_response_open_record called with open record"); - - resolv_response_add_name (b, name); - response_add_16 (b, type); - response_add_16 (b, class); - response_add_16 (b, ttl >> 16); - response_add_16 (b, ttl); - - b->current_rdata_offset = b->offset; - /* Add room for the RDATA length. */ - response_add_16 (b, 0); -} - - -void -resolv_response_close_record (struct resolv_response_builder *b) -{ - size_t rdata_offset = b->current_rdata_offset; - if (rdata_offset == 0) - FAIL_EXIT1 ("response_close_record called without open record"); - size_t rdata_length = b->offset - rdata_offset - 2; - if (rdata_length > 65535) - FAIL_EXIT1 ("RDATA length %zu exceeds limit", rdata_length); - b->buffer[rdata_offset] = rdata_length >> 8; - b->buffer[rdata_offset + 1] = rdata_length; - response_count_increment (b); - b->current_rdata_offset = 0; -} - -void -resolv_response_add_data (struct resolv_response_builder *b, - const void *data, size_t length) -{ - size_t remaining = max_response_length - b->offset; - if (remaining < length) - FAIL_EXIT1 ("resolv_response_add_data: not enough room for %zu bytes", - length); - memcpy (b->buffer + b->offset, data, length); - b->offset += length; -} - -void -resolv_response_drop (struct resolv_response_builder *b) -{ - b->drop = true; -} - -void -resolv_response_close (struct resolv_response_builder *b) -{ - b->close = true; -} - -void -resolv_response_truncate_data (struct resolv_response_builder *b, size_t count) -{ - if (count > 65535) - FAIL_EXIT1 ("resolv_response_truncate_data: argument too large: %zu", - count); - b->truncate_bytes = count; -} - - -size_t -resolv_response_length (const struct resolv_response_builder *b) -{ - return b->offset; -} - -unsigned char * -resolv_response_buffer (const struct resolv_response_builder *b) -{ - unsigned char *result = xmalloc (b->offset); - memcpy (result, b->buffer, b->offset); - return result; -} - -static struct resolv_response_builder * -response_builder_allocate - (const unsigned char *query_buffer, size_t query_length) -{ - struct resolv_response_builder *b = xmalloc (sizeof (*b)); - memset (b, 0, offsetof (struct resolv_response_builder, buffer)); - b->query_buffer = query_buffer; - b->query_length = query_length; - TEST_VERIFY_EXIT (hcreate_r (10000, &b->compression_offsets) != 0); - return b; -} - -static void -response_builder_free (struct resolv_response_builder *b) -{ - struct to_be_freed *current = b->to_be_freed; - while (current != NULL) - { - struct to_be_freed *next = current->next; - free (current->ptr); - free (current); - current = next; - } - hdestroy_r (&b->compression_offsets); - free (b); -} - -/* DNS query processing. */ - -/* Data extracted from the question section of a DNS packet. */ -struct query_info -{ - char qname[MAXDNAME]; - uint16_t qclass; - uint16_t qtype; - struct resolv_edns_info edns; -}; - -/* Update *INFO from the specified DNS packet. */ -static void -parse_query (struct query_info *info, - const unsigned char *buffer, size_t length) -{ - HEADER hd; - _Static_assert (sizeof (hd) == 12, "DNS header size"); - if (length < sizeof (hd)) - FAIL_EXIT1 ("malformed DNS query: too short: %zu bytes", length); - memcpy (&hd, buffer, sizeof (hd)); - - if (ntohs (hd.qdcount) != 1) - FAIL_EXIT1 ("malformed DNS query: wrong question count: %d", - (int) ntohs (hd.qdcount)); - if (ntohs (hd.ancount) != 0) - FAIL_EXIT1 ("malformed DNS query: wrong answer count: %d", - (int) ntohs (hd.ancount)); - if (ntohs (hd.nscount) != 0) - FAIL_EXIT1 ("malformed DNS query: wrong authority count: %d", - (int) ntohs (hd.nscount)); - if (ntohs (hd.arcount) > 1) - FAIL_EXIT1 ("malformed DNS query: wrong additional count: %d", - (int) ntohs (hd.arcount)); - - int ret = dn_expand (buffer, buffer + length, buffer + sizeof (hd), - info->qname, sizeof (info->qname)); - if (ret < 0) - FAIL_EXIT1 ("malformed DNS query: cannot uncompress QNAME"); - - /* Obtain QTYPE and QCLASS. */ - size_t remaining = length - (12 + ret); - struct - { - uint16_t qtype; - uint16_t qclass; - } qtype_qclass; - if (remaining < sizeof (qtype_qclass)) - FAIL_EXIT1 ("malformed DNS query: " - "query lacks QCLASS/QTYPE, QNAME: %s", info->qname); - memcpy (&qtype_qclass, buffer + 12 + ret, sizeof (qtype_qclass)); - info->qclass = ntohs (qtype_qclass.qclass); - info->qtype = ntohs (qtype_qclass.qtype); - - memset (&info->edns, 0, sizeof (info->edns)); - if (ntohs (hd.arcount) > 0) - { - /* Parse EDNS record. */ - struct __attribute__ ((packed, aligned (1))) - { - uint8_t root; - uint16_t rtype; - uint16_t payload; - uint8_t edns_extended_rcode; - uint8_t edns_version; - uint16_t flags; - uint16_t rdatalen; - } rr; - _Static_assert (sizeof (rr) == 11, "EDNS record size"); - - if (remaining < 4 + sizeof (rr)) - FAIL_EXIT1 ("mailformed DNS query: no room for EDNS record"); - memcpy (&rr, buffer + 12 + ret + 4, sizeof (rr)); - if (rr.root != 0) - FAIL_EXIT1 ("malformed DNS query: invalid OPT RNAME: %d\n", rr.root); - if (rr.rtype != htons (41)) - FAIL_EXIT1 ("malformed DNS query: invalid OPT type: %d\n", - ntohs (rr.rtype)); - info->edns.active = true; - info->edns.extended_rcode = rr.edns_extended_rcode; - info->edns.version = rr.edns_version; - info->edns.flags = ntohs (rr.flags); - info->edns.payload_size = ntohs (rr.payload); - } -} - - -/* Main testing framework. */ - -/* Per-server information. One struct is allocated for each test - server. */ -struct resolv_test_server -{ - /* Local address of the server. UDP and TCP use the same port. */ - struct sockaddr_in address; - - /* File descriptor of the UDP server, or -1 if this server is - disabled. */ - int socket_udp; - - /* File descriptor of the TCP server, or -1 if this server is - disabled. */ - int socket_tcp; - - /* Counter of the number of responses processed so far. */ - size_t response_number; - - /* Thread handles for the server threads (if not disabled in the - configuration). */ - pthread_t thread_udp; - pthread_t thread_tcp; -}; - -/* Main struct for keeping track of libresolv redirection and - testing. */ -struct resolv_test -{ - /* After initialization, any access to the struct must be performed - while this lock is acquired. */ - pthread_mutex_t lock; - - /* Data for each test server. */ - struct resolv_test_server servers[resolv_max_test_servers]; - - /* Used if config.single_thread_udp is true. */ - pthread_t thread_udp_single; - - struct resolv_redirect_config config; - bool termination_requested; -}; - -/* Function implementing a server thread. */ -typedef void (*thread_callback) (struct resolv_test *, int server_index); - -/* Storage for thread-specific data, for passing to the - thread_callback function. */ -struct thread_closure -{ - struct resolv_test *obj; /* Current test object. */ - thread_callback callback; /* Function to call. */ - int server_index; /* Index of the implemented server. */ -}; - -/* Wrap response_callback as a function which can be passed to - pthread_create. */ -static void * -thread_callback_wrapper (void *arg) -{ - struct thread_closure *closure = arg; - closure->callback (closure->obj, closure->server_index); - free (closure); - return NULL; -} - -/* Start a server thread for the specified SERVER_INDEX, implemented - by CALLBACK. */ -static pthread_t -start_server_thread (struct resolv_test *obj, int server_index, - thread_callback callback) -{ - struct thread_closure *closure = xmalloc (sizeof (*closure)); - *closure = (struct thread_closure) - { - .obj = obj, - .callback = callback, - .server_index = server_index, - }; - return xpthread_create (NULL, thread_callback_wrapper, closure); -} - -/* Process one UDP query. Return false if a termination requested has - been detected. */ -static bool -server_thread_udp_process_one (struct resolv_test *obj, int server_index) -{ - unsigned char query[512]; - struct sockaddr_storage peer; - socklen_t peerlen = sizeof (peer); - size_t length = xrecvfrom (obj->servers[server_index].socket_udp, - query, sizeof (query), 0, - (struct sockaddr *) &peer, &peerlen); - /* Check for termination. */ - { - bool termination_requested; - xpthread_mutex_lock (&obj->lock); - termination_requested = obj->termination_requested; - xpthread_mutex_unlock (&obj->lock); - if (termination_requested) - return false; - } - - - struct query_info qinfo; - parse_query (&qinfo, query, length); - if (test_verbose > 0) - { - if (test_verbose > 1) - printf ("info: UDP server %d: incoming query:" - " %zd bytes, %s/%u/%u, tnxid=0x%02x%02x\n", - server_index, length, qinfo.qname, qinfo.qclass, qinfo.qtype, - query[0], query[1]); - else - printf ("info: UDP server %d: incoming query:" - " %zd bytes, %s/%u/%u\n", - server_index, length, qinfo.qname, qinfo.qclass, qinfo.qtype); - } - - struct resolv_response_context ctx = - { - .query_buffer = query, - .query_length = length, - .server_index = server_index, - .tcp = false, - .edns = qinfo.edns, - }; - struct resolv_response_builder *b = response_builder_allocate (query, length); - obj->config.response_callback - (&ctx, b, qinfo.qname, qinfo.qclass, qinfo.qtype); - - if (b->drop) - { - if (test_verbose) - printf ("info: UDP server %d: dropping response to %s/%u/%u\n", - server_index, qinfo.qname, qinfo.qclass, qinfo.qtype); - } - else - { - if (test_verbose) - { - if (b->offset >= 12) - printf ("info: UDP server %d: sending response:" - " %zu bytes, RCODE %d (for %s/%u/%u)\n", - server_index, b->offset, b->buffer[3] & 0x0f, - qinfo.qname, qinfo.qclass, qinfo.qtype); - else - printf ("info: UDP server %d: sending response: %zu bytes" - " (for %s/%u/%u)\n", - server_index, b->offset, - qinfo.qname, qinfo.qclass, qinfo.qtype); - if (b->truncate_bytes > 0) - printf ("info: truncated by %u bytes\n", b->truncate_bytes); - } - size_t to_send = b->offset; - if (to_send < b->truncate_bytes) - to_send = 0; - else - to_send -= b->truncate_bytes; - - /* Ignore most errors here because the other end may have closed - the socket. */ - if (sendto (obj->servers[server_index].socket_udp, - b->buffer, to_send, 0, - (struct sockaddr *) &peer, peerlen) < 0) - TEST_VERIFY_EXIT (errno != EBADF); - } - response_builder_free (b); - return true; -} - -/* UDP thread_callback function. Variant for one thread per - server. */ -static void -server_thread_udp (struct resolv_test *obj, int server_index) -{ - while (server_thread_udp_process_one (obj, server_index)) - ; -} - -/* Single-threaded UDP processing function, for the single_thread_udp - case. */ -static void * -server_thread_udp_single (void *closure) -{ - struct resolv_test *obj = closure; - - struct pollfd fds[resolv_max_test_servers]; - for (int server_index = 0; server_index < resolv_max_test_servers; - ++server_index) - if (obj->config.servers[server_index].disable_udp) - fds[server_index] = (struct pollfd) {.fd = -1}; - else - { - fds[server_index] = (struct pollfd) - { - .fd = obj->servers[server_index].socket_udp, - .events = POLLIN - }; - - /* Make the socket non-blocking. */ - int flags = fcntl (obj->servers[server_index].socket_udp, F_GETFL, 0); - if (flags < 0) - FAIL_EXIT1 ("fcntl (F_GETFL): %m"); - flags |= O_NONBLOCK; - if (fcntl (obj->servers[server_index].socket_udp, F_SETFL, flags) < 0) - FAIL_EXIT1 ("fcntl (F_SETFL): %m"); - } - - while (true) - { - xpoll (fds, resolv_max_test_servers, -1); - for (int server_index = 0; server_index < resolv_max_test_servers; - ++server_index) - if (fds[server_index].revents != 0) - { - if (!server_thread_udp_process_one (obj, server_index)) - goto out; - fds[server_index].revents = 0; - } - } - - out: - return NULL; -} - -/* Start the single UDP handler thread (for the single_thread_udp - case). */ -static void -start_server_thread_udp_single (struct resolv_test *obj) -{ - obj->thread_udp_single - = xpthread_create (NULL, server_thread_udp_single, obj); -} - -/* Data describing a TCP client connect. */ -struct tcp_thread_closure -{ - struct resolv_test *obj; - int server_index; - int client_socket; -}; - -/* Read a complete DNS query packet. If EOF_OK, an immediate - end-of-file condition is acceptable. */ -static bool -read_fully (int fd, void *buf, size_t len, bool eof_ok) -{ - const void *const end = buf + len; - while (buf < end) - { - ssize_t ret = read (fd, buf, end - buf); - if (ret == 0) - { - if (!eof_ok) - { - support_record_failure (); - printf ("error: unexpected EOF on TCP connection\n"); - } - return false; - } - else if (ret < 0) - { - if (!eof_ok || errno != ECONNRESET) - { - support_record_failure (); - printf ("error: TCP read: %m\n"); - } - return false; - } - buf += ret; - eof_ok = false; - } - return true; -} - -/* Write an array of iovecs. Terminate the process on failure. */ -static void -writev_fully (int fd, struct iovec *buffers, size_t count) -{ - while (count > 0) - { - /* Skip zero-length write requests. */ - if (buffers->iov_len == 0) - { - ++buffers; - --count; - continue; - } - /* Try to rewrite the remaing buffers. */ - ssize_t ret = writev (fd, buffers, count); - if (ret < 0) - FAIL_EXIT1 ("writev: %m"); - if (ret == 0) - FAIL_EXIT1 ("writev: invalid return value zero"); - /* Find the buffers that were successfully written. */ - while (ret > 0) - { - if (count == 0) - FAIL_EXIT1 ("internal writev consistency failure"); - /* Current buffer was partially written. */ - if (buffers->iov_len > (size_t) ret) - { - buffers->iov_base += ret; - buffers->iov_len -= ret; - ret = 0; - } - else - { - ret -= buffers->iov_len; - buffers->iov_len = 0; - ++buffers; - --count; - } - } - } -} - -/* Thread callback for handling a single established TCP connection to - a client. */ -static void * -server_thread_tcp_client (void *arg) -{ - struct tcp_thread_closure *closure = arg; - - while (true) - { - /* Read packet length. */ - uint16_t query_length; - if (!read_fully (closure->client_socket, - &query_length, sizeof (query_length), true)) - break; - query_length = ntohs (query_length); - - /* Read the packet. */ - unsigned char *query_buffer = xmalloc (query_length); - read_fully (closure->client_socket, query_buffer, query_length, false); - - struct query_info qinfo; - parse_query (&qinfo, query_buffer, query_length); - if (test_verbose > 0) - { - if (test_verbose > 1) - printf ("info: UDP server %d: incoming query:" - " %d bytes, %s/%u/%u, tnxid=0x%02x%02x\n", - closure->server_index, query_length, - qinfo.qname, qinfo.qclass, qinfo.qtype, - query_buffer[0], query_buffer[1]); - else - printf ("info: TCP server %d: incoming query:" - " %u bytes, %s/%u/%u\n", - closure->server_index, query_length, - qinfo.qname, qinfo.qclass, qinfo.qtype); - } - - struct resolv_response_context ctx = - { - .query_buffer = query_buffer, - .query_length = query_length, - .server_index = closure->server_index, - .tcp = true, - .edns = qinfo.edns, - }; - struct resolv_response_builder *b = response_builder_allocate - (query_buffer, query_length); - closure->obj->config.response_callback - (&ctx, b, qinfo.qname, qinfo.qclass, qinfo.qtype); - - if (b->drop) - { - if (test_verbose) - printf ("info: TCP server %d: dropping response to %s/%u/%u\n", - closure->server_index, - qinfo.qname, qinfo.qclass, qinfo.qtype); - } - else - { - if (test_verbose) - printf ("info: TCP server %d: sending response: %zu bytes" - " (for %s/%u/%u)\n", - closure->server_index, b->offset, - qinfo.qname, qinfo.qclass, qinfo.qtype); - uint16_t length = htons (b->offset); - size_t to_send = b->offset; - if (to_send < b->truncate_bytes) - to_send = 0; - else - to_send -= b->truncate_bytes; - struct iovec buffers[2] = - { - {&length, sizeof (length)}, - {b->buffer, to_send} - }; - writev_fully (closure->client_socket, buffers, 2); - } - bool close_flag = b->close; - response_builder_free (b); - free (query_buffer); - if (close_flag) - break; - } - - xclose (closure->client_socket); - free (closure); - return NULL; -} - -/* thread_callback for the TCP case. Accept connections and create a - new thread for each client. */ -static void -server_thread_tcp (struct resolv_test *obj, int server_index) -{ - while (true) - { - /* Get the client conenction. */ - int client_socket = xaccept - (obj->servers[server_index].socket_tcp, NULL, NULL); - - /* Check for termination. */ - xpthread_mutex_lock (&obj->lock); - if (obj->termination_requested) - { - xpthread_mutex_unlock (&obj->lock); - xclose (client_socket); - break; - } - xpthread_mutex_unlock (&obj->lock); - - /* Spawn a new thread for handling this connection. */ - struct tcp_thread_closure *closure = xmalloc (sizeof (*closure)); - *closure = (struct tcp_thread_closure) - { - .obj = obj, - .server_index = server_index, - .client_socket = client_socket, - }; - - pthread_t thr - = xpthread_create (NULL, server_thread_tcp_client, closure); - /* TODO: We should keep track of this thread so that we can - block in resolv_test_end until it has exited. */ - xpthread_detach (thr); - } -} - -/* Create UDP and TCP server sockets. */ -static void -make_server_sockets (struct resolv_test_server *server) -{ - while (true) - { - server->socket_udp = xsocket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); - server->socket_tcp = xsocket (AF_INET, SOCK_STREAM, IPPROTO_TCP); - - /* Pick the address for the UDP socket. */ - server->address = (struct sockaddr_in) - { - .sin_family = AF_INET, - .sin_addr = {.s_addr = htonl (INADDR_LOOPBACK)} - }; - xbind (server->socket_udp, - (struct sockaddr *)&server->address, sizeof (server->address)); - - /* Retrieve the address. */ - socklen_t addrlen = sizeof (server->address); - xgetsockname (server->socket_udp, - (struct sockaddr *)&server->address, &addrlen); - - /* Bind the TCP socket to the same address. */ - { - int on = 1; - xsetsockopt (server->socket_tcp, SOL_SOCKET, SO_REUSEADDR, - &on, sizeof (on)); - } - if (bind (server->socket_tcp, - (struct sockaddr *)&server->address, - sizeof (server->address)) != 0) - { - /* Port collision. The UDP bind succeeded, but the TCP BIND - failed. We assume here that the kernel will pick the - next local UDP address randomly. */ - if (errno == EADDRINUSE) - { - xclose (server->socket_udp); - xclose (server->socket_tcp); - continue; - } - FAIL_EXIT1 ("TCP bind: %m"); - } - xlisten (server->socket_tcp, 5); - break; - } -} - -/* One-time initialization of NSS. */ -static void -resolv_redirect_once (void) -{ - /* Only use nss_dns. */ - __nss_configure_lookup ("hosts", "dns"); - __nss_configure_lookup ("networks", "dns"); - /* Enter a network namespace for isolation and firewall state - cleanup. The tests will still work if these steps fail, but they - may be less reliable. */ - support_become_root (); - support_enter_network_namespace (); -} -pthread_once_t resolv_redirect_once_var = PTHREAD_ONCE_INIT; - -void -resolv_test_init (void) -{ - /* Perform one-time initialization of NSS. */ - xpthread_once (&resolv_redirect_once_var, resolv_redirect_once); -} - -/* Copy the search path from CONFIG.search to the _res object. */ -static void -set_search_path (struct resolv_redirect_config config) -{ - memset (_res.defdname, 0, sizeof (_res.defdname)); - memset (_res.dnsrch, 0, sizeof (_res.dnsrch)); - - char *current = _res.defdname; - char *end = current + sizeof (_res.defdname); - - for (unsigned int i = 0; - i < sizeof (config.search) / sizeof (config.search[0]); ++i) - { - if (config.search[i] == NULL) - continue; - - size_t length = strlen (config.search[i]) + 1; - size_t remaining = end - current; - TEST_VERIFY_EXIT (length <= remaining); - memcpy (current, config.search[i], length); - _res.dnsrch[i] = current; - current += length; - } -} - -struct resolv_test * -resolv_test_start (struct resolv_redirect_config config) -{ - /* Apply configuration defaults. */ - if (config.nscount == 0) - config.nscount = resolv_max_test_servers; - - struct resolv_test *obj = xmalloc (sizeof (*obj)); - *obj = (struct resolv_test) { - .config = config, - .lock = PTHREAD_MUTEX_INITIALIZER, - }; - - resolv_test_init (); - - /* Create all the servers, to reserve the necessary ports. */ - for (int server_index = 0; server_index < config.nscount; ++server_index) - make_server_sockets (obj->servers + server_index); - - /* Start server threads. Disable the server ports, as - requested. */ - for (int server_index = 0; server_index < config.nscount; ++server_index) - { - struct resolv_test_server *server = obj->servers + server_index; - if (config.servers[server_index].disable_udp) - { - xclose (server->socket_udp); - server->socket_udp = -1; - } - else if (!config.single_thread_udp) - server->thread_udp = start_server_thread (obj, server_index, - server_thread_udp); - if (config.servers[server_index].disable_tcp) - { - xclose (server->socket_tcp); - server->socket_tcp = -1; - } - else - server->thread_tcp = start_server_thread (obj, server_index, - server_thread_tcp); - } - if (config.single_thread_udp) - start_server_thread_udp_single (obj); - - int timeout = 1; - - /* Initialize libresolv. */ - TEST_VERIFY_EXIT (res_init () == 0); - - /* Disable IPv6 name server addresses. The code below only - overrides the IPv4 addresses. */ - __res_iclose (&_res, true); - _res._u._ext.nscount = 0; - - /* Redirect queries to the server socket. */ - if (test_verbose) - { - printf ("info: old timeout value: %d\n", _res.retrans); - printf ("info: old retry attempt value: %d\n", _res.retry); - printf ("info: old _res.options: 0x%lx\n", _res.options); - printf ("info: old _res.nscount value: %d\n", _res.nscount); - printf ("info: old _res.ndots value: %d\n", _res.ndots); - } - _res.retrans = timeout; - _res.retry = 4; - _res.nscount = config.nscount; - _res.options = RES_INIT | RES_RECURSE | RES_DEFNAMES | RES_DNSRCH; - _res.ndots = 1; - if (test_verbose) - { - printf ("info: new timeout value: %d\n", _res.retrans); - printf ("info: new retry attempt value: %d\n", _res.retry); - printf ("info: new _res.options: 0x%lx\n", _res.options); - printf ("info: new _res.nscount value: %d\n", _res.nscount); - printf ("info: new _res.ndots value: %d\n", _res.ndots); - } - for (int server_index = 0; server_index < config.nscount; ++server_index) - { - _res.nsaddr_list[server_index] = obj->servers[server_index].address; - if (test_verbose) - { - char buf[256]; - TEST_VERIFY_EXIT - (inet_ntop (AF_INET, &obj->servers[server_index].address.sin_addr, - buf, sizeof (buf)) != NULL); - printf ("info: server %d: %s/%u\n", - server_index, buf, - htons (obj->servers[server_index].address.sin_port)); - } - } - - set_search_path (config); - - return obj; -} - -void -resolv_test_end (struct resolv_test *obj) -{ - res_close (); - - xpthread_mutex_lock (&obj->lock); - obj->termination_requested = true; - xpthread_mutex_unlock (&obj->lock); - - /* Send trigger packets to unblock the server threads. */ - for (int server_index = 0; server_index < obj->config.nscount; - ++server_index) - { - if (!obj->config.servers[server_index].disable_udp) - { - int sock = xsocket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); - xsendto (sock, "", 1, 0, - (struct sockaddr *) &obj->servers[server_index].address, - sizeof (obj->servers[server_index].address)); - xclose (sock); - } - if (!obj->config.servers[server_index].disable_tcp) - { - int sock = xsocket (AF_INET, SOCK_STREAM, IPPROTO_TCP); - xconnect (sock, - (struct sockaddr *) &obj->servers[server_index].address, - sizeof (obj->servers[server_index].address)); - xclose (sock); - } - } - - if (obj->config.single_thread_udp) - xpthread_join (obj->thread_udp_single); - - /* Wait for the server threads to terminate. */ - for (int server_index = 0; server_index < obj->config.nscount; - ++server_index) - { - if (!obj->config.servers[server_index].disable_udp) - { - if (!obj->config.single_thread_udp) - xpthread_join (obj->servers[server_index].thread_udp); - xclose (obj->servers[server_index].socket_udp); - } - if (!obj->config.servers[server_index].disable_tcp) - { - xpthread_join (obj->servers[server_index].thread_tcp); - xclose (obj->servers[server_index].socket_tcp); - } - } - - free (obj); -} diff --git a/support/resolv_test.h b/support/resolv_test.h deleted file mode 100644 index 6498751569..0000000000 --- a/support/resolv_test.h +++ /dev/null @@ -1,180 +0,0 @@ -/* DNS test framework and libresolv redirection. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_RESOLV_TEST_H -#define SUPPORT_RESOLV_TEST_H - -#include <arpa/nameser.h> -#include <stdbool.h> -#include <sys/cdefs.h> - -__BEGIN_DECLS - -/* Information about EDNS properties of a DNS query. */ -struct resolv_edns_info -{ - bool active; - uint8_t extended_rcode; - uint8_t version; - uint16_t flags; - uint16_t payload_size; -}; - -/* This struct provides context information when the response callback - specified in struct resolv_redirect_config is invoked. */ -struct resolv_response_context -{ - const unsigned char *query_buffer; - size_t query_length; - int server_index; - bool tcp; - struct resolv_edns_info edns; -}; - -/* This opaque struct is used to construct responses from within the - response callback function. */ -struct resolv_response_builder; - -/* This opaque struct collects information about the resolver testing - currently in progress. */ -struct resolv_test; - -enum - { - /* Maximum number of test servers supported by the framework. */ - resolv_max_test_servers = 3, - }; - -/* Configuration settings specific to individual test servers. */ -struct resolv_redirect_server_config -{ - bool disable_tcp; /* If true, no TCP server is listening. */ - bool disable_udp; /* If true, no UDP server is listening. */ -}; - -/* Instructions for setting up the libresolv redirection. */ -struct resolv_redirect_config -{ - /* The response_callback function is called for every incoming DNS - packet, over UDP or TCP. It must be specified, the other - configuration settings are optional. */ - void (*response_callback) (const struct resolv_response_context *, - struct resolv_response_builder *, - const char *qname, - uint16_t qclass, uint16_t qtype); - - /* Per-server configuration. */ - struct resolv_redirect_server_config servers[resolv_max_test_servers]; - - /* Search path entries. The first entry serves as the default - domain name as well. */ - const char *search[7]; - - /* Number of servers to activate in resolv. 0 means the default, - resolv_max_test_servers. */ - int nscount; - - /* If true, use a single thread to process all UDP queries. This - may results in more predictable ordering of queries and - responses. */ - bool single_thread_udp; -}; - -/* Configure NSS to use, nss_dns only for aplicable databases, and try - to put the process into a network namespace for better isolation. - This may have to be called before resolv_test_start, before the - process creates any threads. Otherwise, initialization is - performed by resolv_test_start implicitly. */ -void resolv_test_init (void); - -/* Initiate resolver testing. This updates the _res variable as - needed. As a side effect, NSS is reconfigured to use nss_dns only - for aplicable databases, and the process may enter a network - namespace for better isolation. */ -struct resolv_test *resolv_test_start (struct resolv_redirect_config); - -/* Call this function at the end of resolver testing, to free - resources and report pending errors (if any). */ -void resolv_test_end (struct resolv_test *); - -/* The remaining facilities in this file are used for constructing - response packets from the response_callback function. */ - -/* Special settings for constructing responses from the callback. */ -struct resolv_response_flags -{ - /* 4-bit response code to incorporate into the response. */ - unsigned char rcode; - - /* If true, the TC (truncation) flag will be set. */ - bool tc; - - /* Initial section count values. Can be used to artificially - increase the counts, for malformed packet testing.*/ - unsigned short qdcount; - unsigned short ancount; - unsigned short nscount; - unsigned short adcount; -}; - -/* Begin a new response with the requested flags. Must be called - first. */ -void resolv_response_init (struct resolv_response_builder *, - struct resolv_response_flags); - -/* Switches to the section in the response packet. Only forward - movement is supported. */ -void resolv_response_section (struct resolv_response_builder *, ns_sect); - -/* Add a question record to the question section. */ -void resolv_response_add_question (struct resolv_response_builder *, - const char *name, uint16_t class, - uint16_t type); -/* Starts a new resource record with the specified owner name, class, - type, and TTL. Data is supplied with resolv_response_add_data or - resolv_response_add_name. */ -void resolv_response_open_record (struct resolv_response_builder *, - const char *name, uint16_t class, - uint16_t type, uint32_t ttl); - -/* Add unstructed bytes to the RDATA part of a resource record. */ -void resolv_response_add_data (struct resolv_response_builder *, - const void *, size_t); - -/* Add a compressed domain name to the RDATA part of a resource - record. */ -void resolv_response_add_name (struct resolv_response_builder *, - const char *name); - -/* Mark the end of the constructed record. Must be called last. */ -void resolv_response_close_record (struct resolv_response_builder *); - -/* Drop this query packet (that is, do not send a response, not even - an empty packet). */ -void resolv_response_drop (struct resolv_response_builder *); - -/* In TCP mode, close the connection after this packet (if a response - is sent). */ -void resolv_response_close (struct resolv_response_builder *); - -/* The size of the response packet built so far. */ -size_t resolv_response_length (const struct resolv_response_builder *); - -__END_DECLS - -#endif /* SUPPORT_RESOLV_TEST_H */ diff --git a/support/run_diff.h b/support/run_diff.h deleted file mode 100644 index f65b5dd22c..0000000000 --- a/support/run_diff.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Invoke the system diff tool to compare two strings. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_RUN_DIFF_H -#define SUPPORT_RUN_DIFF_H - -/* Compare the two NUL-terminated strings LEFT and RIGHT using the - diff tool. Label the sides of the diff with LEFT_LABEL and - RIGHT_LABEL, respectively. - - This function assumes that LEFT and RIGHT are different - strings. */ -void support_run_diff (const char *left_label, const char *left, - const char *right_label, const char *right); - -#endif /* SUPPORT_RUN_DIFF_H */ diff --git a/support/set_fortify_handler.c b/support/set_fortify_handler.c deleted file mode 100644 index f434a8082a..0000000000 --- a/support/set_fortify_handler.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Set signal handler for use in fortify tests. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/support.h> - -#include <signal.h> - -void -set_fortify_handler (void (*handler) (int sig)) -{ - struct sigaction sa; - - sa.sa_handler = handler; - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - - sigaction (SIGABRT, &sa, NULL); - ignore_stderr (); -} diff --git a/support/support-xstat.c b/support/support-xstat.c deleted file mode 100644 index 86a81ec601..0000000000 --- a/support/support-xstat.c +++ /dev/null @@ -1,30 +0,0 @@ -/* stat64 with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -/* NB: Non-standard file name to avoid sysdeps override for xstat. */ - -#include <support/check.h> -#include <support/xunistd.h> -#include <sys/stat.h> - -void -xstat (const char *path, struct stat64 *result) -{ - if (stat64 (path, result) != 0) - FAIL_EXIT1 ("stat64 (\"%s\"): %m", path); -} diff --git a/support/support.h b/support/support.h deleted file mode 100644 index 4b5f04c2cc..0000000000 --- a/support/support.h +++ /dev/null @@ -1,74 +0,0 @@ -/* Common extra functions. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -/* This header file should only contain definitions compatible with - C90. (Using __attribute__ is fine because <features.h> provides a - fallback.) */ - -#ifndef SUPPORT_H -#define SUPPORT_H - -#include <stddef.h> -#include <sys/cdefs.h> - -__BEGIN_DECLS - -/* Write a message to standard output. Can be used in signal - handlers. */ -void write_message (const char *message) __attribute__ ((nonnull (1))); - -/* Avoid all the buffer overflow messages on stderr. */ -void ignore_stderr (void); - -/* Set fortification error handler. Used when tests want to verify that bad - code is caught by the library. */ -void set_fortify_handler (void (*handler) (int sig)); - -/* Report an out-of-memory error for the allocation of SIZE bytes in - FUNCTION, terminating the process. */ -void oom_error (const char *function, size_t size) - __attribute__ ((nonnull (1))); - -/* Return a pointer to a memory region of SIZE bytes. The memory is - initialized to zero and will be shared with subprocesses (across - fork). The returned pointer must be freed using - support_shared_free; it is not compatible with the malloc - functions. */ -void *support_shared_allocate (size_t size); - -/* Deallocate a pointer returned by support_shared_allocate. */ -void support_shared_free (void *); - -/* Write CONTENTS to the file PATH. Create or truncate the file as - needed. The file mode is 0666 masked by the umask. Terminate the - process on error. */ -void support_write_file_string (const char *path, const char *contents); - -/* Error-checking wrapper functions which terminate the process on - error. */ - -void *xmalloc (size_t) __attribute__ ((malloc)); -void *xcalloc (size_t n, size_t s) __attribute__ ((malloc)); -void *xrealloc (void *p, size_t n); -char *xasprintf (const char *format, ...) - __attribute__ ((format (printf, 1, 2), malloc)); -char *xstrdup (const char *); - -__END_DECLS - -#endif /* SUPPORT_H */ diff --git a/support/support_become_root.c b/support/support_become_root.c deleted file mode 100644 index 3fa0bd4ac0..0000000000 --- a/support/support_become_root.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Acquire root privileges. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/namespace.h> - -#include <sched.h> -#include <stdio.h> -#include <unistd.h> - -bool -support_become_root (void) -{ -#ifdef CLONE_NEWUSER - if (unshare (CLONE_NEWUSER | CLONE_NEWNS) == 0) - /* Even if we do not have UID zero, we have extended privileges at - this point. */ - return true; -#endif - if (setuid (0) != 0) - { - printf ("warning: could not become root outside namespace (%m)\n"); - return false; - } - return true; -} diff --git a/support/support_can_chroot.c b/support/support_can_chroot.c deleted file mode 100644 index 0dfd2deb54..0000000000 --- a/support/support_can_chroot.c +++ /dev/null @@ -1,65 +0,0 @@ -/* Return true if the process can perform a chroot operation. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stdio.h> -#include <support/check.h> -#include <support/namespace.h> -#include <support/support.h> -#include <sys/stat.h> -#include <unistd.h> -#include <xunistd.h> - -static void -callback (void *closure) -{ - int *result = closure; - struct stat64 before; - xstat ("/dev", &before); - if (chroot ("/dev") != 0) - { - *result = errno; - return; - } - struct stat64 after; - xstat ("/", &after); - TEST_VERIFY (before.st_dev == after.st_dev); - TEST_VERIFY (before.st_ino == after.st_ino); - *result = 0; -} - -bool -support_can_chroot (void) -{ - int *result = support_shared_allocate (sizeof (*result)); - *result = 0; - support_isolate_in_subprocess (callback, result); - bool ok = *result == 0; - if (!ok) - { - static bool already_warned; - if (!already_warned) - { - already_warned = true; - errno = *result; - printf ("warning: this process does not support chroot: %m\n"); - } - } - support_shared_free (result); - return ok; -} diff --git a/support/support_capture_subprocess.c b/support/support_capture_subprocess.c deleted file mode 100644 index 030f124252..0000000000 --- a/support/support_capture_subprocess.c +++ /dev/null @@ -1,108 +0,0 @@ -/* Capture output from a subprocess. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/capture_subprocess.h> - -#include <errno.h> -#include <stdlib.h> -#include <support/check.h> -#include <support/xunistd.h> -#include <support/xsocket.h> - -static void -transfer (const char *what, struct pollfd *pfd, struct xmemstream *stream) -{ - if (pfd->revents != 0) - { - char buf[1024]; - ssize_t ret = TEMP_FAILURE_RETRY (read (pfd->fd, buf, sizeof (buf))); - if (ret < 0) - { - support_record_failure (); - printf ("error: reading from subprocess %s: %m", what); - pfd->events = 0; - pfd->revents = 0; - } - else if (ret == 0) - { - /* EOF reached. Stop listening. */ - pfd->events = 0; - pfd->revents = 0; - } - else - /* Store the data just read. */ - TEST_VERIFY (fwrite (buf, ret, 1, stream->out) == 1); - } -} - -struct support_capture_subprocess -support_capture_subprocess (void (*callback) (void *), void *closure) -{ - struct support_capture_subprocess result; - xopen_memstream (&result.out); - xopen_memstream (&result.err); - - int stdout_pipe[2]; - xpipe (stdout_pipe); - int stderr_pipe[2]; - xpipe (stderr_pipe); - - TEST_VERIFY (fflush (stdout) == 0); - TEST_VERIFY (fflush (stderr) == 0); - - pid_t pid = xfork (); - if (pid == 0) - { - xclose (stdout_pipe[0]); - xclose (stderr_pipe[0]); - xdup2 (stdout_pipe[1], STDOUT_FILENO); - xdup2 (stderr_pipe[1], STDERR_FILENO); - callback (closure); - _exit (0); - } - xclose (stdout_pipe[1]); - xclose (stderr_pipe[1]); - - struct pollfd fds[2] = - { - { .fd = stdout_pipe[0], .events = POLLIN }, - { .fd = stderr_pipe[0], .events = POLLIN }, - }; - - do - { - xpoll (fds, 2, -1); - transfer ("stdout", &fds[0], &result.out); - transfer ("stderr", &fds[1], &result.err); - } - while (fds[0].events != 0 || fds[1].events != 0); - xclose (stdout_pipe[0]); - xclose (stderr_pipe[0]); - - xfclose_memstream (&result.out); - xfclose_memstream (&result.err); - xwaitpid (pid, &result.status, 0); - return result; -} - -void -support_capture_subprocess_free (struct support_capture_subprocess *p) -{ - free (p->out.buffer); - free (p->err.buffer); -} diff --git a/support/support_capture_subprocess_check.c b/support/support_capture_subprocess_check.c deleted file mode 100644 index 708c89f331..0000000000 --- a/support/support_capture_subprocess_check.c +++ /dev/null @@ -1,67 +0,0 @@ -/* Verify capture output from a subprocess. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <stdbool.h> -#include <stdio.h> -#include <support/capture_subprocess.h> -#include <support/check.h> - -static void -print_context (const char *context, bool *failed) -{ - if (*failed) - /* Do not duplicate message. */ - return; - support_record_failure (); - printf ("error: subprocess failed: %s\n", context); -} - -void -support_capture_subprocess_check (struct support_capture_subprocess *proc, - const char *context, int status, - int allowed) -{ - TEST_VERIFY ((allowed & sc_allow_none) - || (allowed & sc_allow_stdout) - || (allowed & sc_allow_stderr)); - TEST_VERIFY (!((allowed & sc_allow_none) - && ((allowed & sc_allow_stdout) - || (allowed & sc_allow_stderr)))); - - bool failed = false; - if (proc->status != status) - { - print_context (context, &failed); - printf ("error: expected exit status: %d\n", status); - printf ("error: actual exit status: %d\n", status); - } - if (!(allowed & sc_allow_stdout) && proc->out.length != 0) - { - print_context (context, &failed); - printf ("error: unexpected output from subprocess\n"); - fwrite (proc->out.buffer, proc->out.length, 1, stdout); - puts ("\n"); - } - if (!(allowed & sc_allow_stderr) && proc->err.length != 0) - { - print_context (context, &failed); - printf ("error: unexpected error output from subprocess\n"); - fwrite (proc->err.buffer, proc->err.length, 1, stdout); - puts ("\n"); - } -} diff --git a/support/support_enter_network_namespace.c b/support/support_enter_network_namespace.c deleted file mode 100644 index 28b0ee29cf..0000000000 --- a/support/support_enter_network_namespace.c +++ /dev/null @@ -1,75 +0,0 @@ -/* Enter a network namespace. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/namespace.h> - -#include <net/if.h> -#include <sched.h> -#include <stdio.h> -#include <string.h> -#include <support/check.h> -#include <support/xsocket.h> -#include <support/xunistd.h> -#include <sys/ioctl.h> -#include <unistd.h> - -static bool in_uts_namespace; - -bool -support_enter_network_namespace (void) -{ -#ifdef CLONE_NEWUTS - if (unshare (CLONE_NEWUTS) == 0) - in_uts_namespace = true; - else - printf ("warning: unshare (CLONE_NEWUTS) failed: %m\n"); -#endif - -#ifdef CLONE_NEWNET - if (unshare (CLONE_NEWNET) == 0) - { - /* Bring up the loopback interface. */ - int fd = xsocket (AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0); - struct ifreq req; - strcpy (req.ifr_name, "lo"); - TEST_VERIFY_EXIT (ioctl (fd, SIOCGIFFLAGS, &req) == 0); - bool already_up = req.ifr_flags & IFF_UP; - if (already_up) - /* This means that we likely have not achieved isolation from - the parent namespace. */ - printf ("warning: loopback interface already exists" - " in new network namespace\n"); - else - { - req.ifr_flags |= IFF_UP | IFF_RUNNING; - TEST_VERIFY_EXIT (ioctl (fd, SIOCSIFFLAGS, &req) == 0); - } - xclose (fd); - - return !already_up; - } -#endif - printf ("warning: could not enter network namespace\n"); - return false; -} - -bool -support_in_uts_namespace (void) -{ - return in_uts_namespace; -} diff --git a/support/support_format_address_family.c b/support/support_format_address_family.c deleted file mode 100644 index 5d42c42a45..0000000000 --- a/support/support_format_address_family.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Convert an address family to a string. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/format_nss.h> - -#include <support/support.h> - -char * -support_format_address_family (int family) -{ - switch (family) - { - case AF_INET: - return xstrdup ("INET"); - case AF_INET6: - return xstrdup ("INET6"); - default: - return xasprintf ("<unknown address family %d>", family); - } -} diff --git a/support/support_format_addrinfo.c b/support/support_format_addrinfo.c deleted file mode 100644 index eedb030591..0000000000 --- a/support/support_format_addrinfo.c +++ /dev/null @@ -1,239 +0,0 @@ -/* Convert struct addrinfo values to a string. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/format_nss.h> - -#include <arpa/inet.h> -#include <errno.h> -#include <stdio.h> -#include <support/support.h> -#include <support/xmemstream.h> - -static size_t -socket_address_length (int family) -{ - switch (family) - { - case AF_INET: - return sizeof (struct sockaddr_in); - case AF_INET6: - return sizeof (struct sockaddr_in6); - default: - return -1; - } -} - -static void -format_ai_flags_1 (FILE *out, struct addrinfo *ai, int flag, const char *name, - int * flags_printed) -{ - if ((ai->ai_flags & flag) != 0) - fprintf (out, " %s", name); - *flags_printed |= flag; -} - -static void -format_ai_flags (FILE *out, struct addrinfo *ai) -{ - if (ai == NULL) - return; - - if (ai->ai_flags != 0) - { - fprintf (out, "flags:"); - int flags_printed = 0; -#define FLAG(flag) format_ai_flags_1 (out, ai, flag, #flag, &flags_printed) - FLAG (AI_PASSIVE); - FLAG (AI_CANONNAME); - FLAG (AI_NUMERICHOST); - FLAG (AI_V4MAPPED); - FLAG (AI_ALL); - FLAG (AI_ADDRCONFIG); - FLAG (AI_IDN); - FLAG (AI_CANONIDN); - FLAG (AI_IDN_ALLOW_UNASSIGNED); - FLAG (AI_IDN_USE_STD3_ASCII_RULES); - FLAG (AI_NUMERICSERV); -#undef FLAG - int remaining = ai->ai_flags & ~flags_printed; - if (remaining != 0) - fprintf (out, " %08x", remaining); - fprintf (out, "\n"); - } - - /* Report flag mismatches within the list. */ - int flags = ai->ai_flags; - int index = 1; - ai = ai->ai_next; - while (ai != NULL) - { - if (ai->ai_flags != flags) - fprintf (out, "error: flags at %d: 0x%x expected, 0x%x actual\n", - index, flags, ai->ai_flags); - ai = ai->ai_next; - ++index; - } -} - -static void -format_ai_canonname (FILE *out, struct addrinfo *ai) -{ - if (ai == NULL) - return; - if (ai->ai_canonname != NULL) - fprintf (out, "canonname: %s\n", ai->ai_canonname); - - /* Report incorrectly set ai_canonname fields on subsequent list - entries. */ - int index = 1; - ai = ai->ai_next; - while (ai != NULL) - { - if (ai->ai_canonname != NULL) - fprintf (out, "error: canonname set at %d: %s\n", - index, ai->ai_canonname); - ai = ai->ai_next; - ++index; - } -} - -static void -format_ai_one (FILE *out, struct addrinfo *ai) -{ - { - char type_buf[32]; - const char *type_str; - char proto_buf[32]; - const char *proto_str; - - /* ai_socktype */ - switch (ai->ai_socktype) - { - case SOCK_RAW: - type_str = "RAW"; - break; - case SOCK_DGRAM: - type_str = "DGRAM"; - break; - case SOCK_STREAM: - type_str = "STREAM"; - break; - default: - snprintf (type_buf, sizeof (type_buf), "%d", ai->ai_socktype); - type_str = type_buf; - } - - /* ai_protocol */ - switch (ai->ai_protocol) - { - case IPPROTO_IP: - proto_str = "IP"; - break; - case IPPROTO_UDP: - proto_str = "UDP"; - break; - case IPPROTO_TCP: - proto_str = "TCP"; - break; - default: - snprintf (proto_buf, sizeof (proto_buf), "%d", ai->ai_protocol); - proto_str = proto_buf; - } - fprintf (out, "address: %s/%s", type_str, proto_str); - } - - /* ai_addrlen */ - if (ai->ai_addrlen != socket_address_length (ai->ai_family)) - { - char *family = support_format_address_family (ai->ai_family); - fprintf (out, "error: invalid address length %d for %s\n", - ai->ai_addrlen, family); - free (family); - } - - /* ai_addr */ - { - char buf[128]; - uint16_t port; - const char *ret; - switch (ai->ai_family) - { - case AF_INET: - { - struct sockaddr_in *sin = (struct sockaddr_in *) ai->ai_addr; - ret = inet_ntop (AF_INET, &sin->sin_addr, buf, sizeof (buf)); - port = sin->sin_port; - } - break; - case AF_INET6: - { - struct sockaddr_in6 *sin = (struct sockaddr_in6 *) ai->ai_addr; - ret = inet_ntop (AF_INET6, &sin->sin6_addr, buf, sizeof (buf)); - port = sin->sin6_port; - } - break; - default: - errno = EAFNOSUPPORT; - ret = NULL; - } - if (ret == NULL) - fprintf (out, "error: inet_top failed: %m\n"); - else - fprintf (out, " %s %u\n", buf, ntohs (port)); - } -} - -/* Format all the addresses in one address family. */ -static void -format_ai_family (FILE *out, struct addrinfo *ai, int family) -{ - while (ai) - { - if (ai->ai_family == family) - format_ai_one (out, ai); - ai = ai->ai_next; - } -} - -char * -support_format_addrinfo (struct addrinfo *ai, int ret) -{ - int errno_copy = errno; - - struct xmemstream mem; - xopen_memstream (&mem); - if (ret != 0) - { - fprintf (mem.out, "error: %s\n", gai_strerror (ret)); - if (ret == EAI_SYSTEM) - { - errno = errno_copy; - fprintf (mem.out, "error: %m\n"); - } - } - else - { - format_ai_flags (mem.out, ai); - format_ai_canonname (mem.out, ai); - format_ai_family (mem.out, ai, AF_INET); - format_ai_family (mem.out, ai, AF_INET6); - } - - xfclose_memstream (&mem); - return mem.buffer; -} diff --git a/support/support_format_dns_packet.c b/support/support_format_dns_packet.c deleted file mode 100644 index 2992c57971..0000000000 --- a/support/support_format_dns_packet.c +++ /dev/null @@ -1,222 +0,0 @@ -/* Convert a DNS packet to a human-readable representation. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/format_nss.h> - -#include <arpa/inet.h> -#include <resolv.h> -#include <support/check.h> -#include <support/support.h> -#include <support/xmemstream.h> - -struct in_buffer -{ - const unsigned char *data; - size_t size; -}; - -static inline bool -extract_8 (struct in_buffer *in, unsigned char *value) -{ - if (in->size == 0) - return false; - *value = in->data[0]; - ++in->data; - --in->size; - return true; -} - -static inline bool -extract_16 (struct in_buffer *in, unsigned short *value) -{ - if (in->size < 2) - return false; - *value = (in->data[0] << 8) | in->data[1]; - in->data += 2; - in->size -= 2; - return true; -} - -static inline bool -extract_32 (struct in_buffer *in, unsigned *value) -{ - if (in->size < 4) - return false; - unsigned a = in->data[0]; - unsigned b = in->data[1]; - unsigned c = in->data[2]; - unsigned d = in->data[3]; - *value = (a << 24) | (b << 16) | (c << 8) | d; - in->data += 4; - in->size -= 4; - return true; -} - -static inline bool -extract_bytes (struct in_buffer *in, size_t length, struct in_buffer *value) -{ - if (in->size < length) - return false; - *value = (struct in_buffer) {in->data, length}; - in->data += length; - in->size -= length; - return true; -} - -struct dname -{ - char name[MAXDNAME + 1]; -}; - -static bool -extract_name (struct in_buffer full, struct in_buffer *in, struct dname *value) -{ - const unsigned char *full_end = full.data + full.size; - /* Sanity checks; these indicate buffer misuse. */ - TEST_VERIFY_EXIT - (!(in->data < full.data || in->data > full_end - || in->size > (size_t) (full_end - in->data))); - int ret = dn_expand (full.data, full_end, in->data, - value->name, sizeof (value->name)); - if (ret < 0) - return false; - in->data += ret; - in->size -= ret; - return true; -} - -char * -support_format_dns_packet (const unsigned char *buffer, size_t length) -{ - struct in_buffer full = { buffer, length }; - struct in_buffer in = full; - struct xmemstream mem; - xopen_memstream (&mem); - - unsigned short txnid; - unsigned short flags; - unsigned short qdcount; - unsigned short ancount; - unsigned short nscount; - unsigned short adcount; - if (!(extract_16 (&in, &txnid) - && extract_16 (&in, &flags) - && extract_16 (&in, &qdcount) - && extract_16 (&in, &ancount) - && extract_16 (&in, &nscount) - && extract_16 (&in, &adcount))) - { - fprintf (mem.out, "error: could not parse DNS header\n"); - goto out; - } - if (qdcount != 1) - { - fprintf (mem.out, "error: question count is %d, not 1\n", qdcount); - goto out; - } - struct dname qname; - if (!extract_name (full, &in, &qname)) - { - fprintf (mem.out, "error: malformed QNAME\n"); - goto out; - } - unsigned short qtype; - unsigned short qclass; - if (!(extract_16 (&in, &qtype) - && extract_16 (&in, &qclass))) - { - fprintf (mem.out, "error: malformed question\n"); - goto out; - } - if (qtype != T_A && qtype != T_AAAA && qtype != T_PTR) - { - fprintf (mem.out, "error: unsupported QTYPE %d\n", qtype); - goto out; - } - - fprintf (mem.out, "name: %s\n", qname.name); - - for (int i = 0; i < ancount; ++i) - { - struct dname rname; - if (!extract_name (full, &in, &rname)) - { - fprintf (mem.out, "error: malformed record name\n"); - goto out; - } - unsigned short rtype; - unsigned short rclass; - unsigned ttl; - unsigned short rdlen; - struct in_buffer rdata; - if (!(extract_16 (&in, &rtype) - && extract_16 (&in, &rclass) - && extract_32 (&in, &ttl) - && extract_16 (&in, &rdlen) - && extract_bytes (&in, rdlen, &rdata))) - { - fprintf (mem.out, "error: malformed record header\n"); - goto out; - } - /* Skip non-matching record types. */ - if ((rtype != qtype && rtype != T_CNAME) || rclass != qclass) - continue; - switch (rtype) - { - case T_A: - if (rdlen == 4) - fprintf (mem.out, "address: %d.%d.%d.%d\n", - rdata.data[0], - rdata.data[1], - rdata.data[2], - rdata.data[3]); - else - fprintf (mem.out, "error: A record of size %d: %s\n", - rdlen, rname.name); - break; - case T_AAAA: - { - if (rdlen == 16) - { - char buf[100]; - if (inet_ntop (AF_INET6, rdata.data, buf, sizeof (buf)) == NULL) - fprintf (mem.out, "error: AAAA record decoding failed: %m\n"); - else - fprintf (mem.out, "address: %s\n", buf); - } - else - fprintf (mem.out, "error: AAAA record of size %d: %s\n", - rdlen, rname.name); - } - break; - case T_CNAME: - case T_PTR: - { - struct dname name; - if (extract_name (full, &rdata, &name)) - fprintf (mem.out, "name: %s\n", name.name); - else - fprintf (mem.out, "error: malformed CNAME/PTR record\n"); - } - } - } - - out: - xfclose_memstream (&mem); - return mem.buffer; -} diff --git a/support/support_format_herrno.c b/support/support_format_herrno.c deleted file mode 100644 index 493d6ae962..0000000000 --- a/support/support_format_herrno.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Convert a h_errno error code to a string. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/format_nss.h> - -#include <support/support.h> - -char * -support_format_herrno (int code) -{ - const char *errstr; - switch (code) - { - case HOST_NOT_FOUND: - errstr = "HOST_NOT_FOUND"; - break; - case NO_ADDRESS: - errstr = "NO_ADDRESS"; - break; - case NO_RECOVERY: - errstr = "NO_RECOVERY"; - break; - case TRY_AGAIN: - errstr = "TRY_AGAIN"; - break; - default: - return xasprintf ("<invalid h_errno value %d>\n", code); - } - return xstrdup (errstr); -} diff --git a/support/support_format_hostent.c b/support/support_format_hostent.c deleted file mode 100644 index 5b5f26082e..0000000000 --- a/support/support_format_hostent.c +++ /dev/null @@ -1,75 +0,0 @@ -/* Convert a struct hostent object to a string. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/format_nss.h> - -#include <arpa/inet.h> -#include <stdio.h> -#include <support/support.h> -#include <support/xmemstream.h> - -static int -address_length (int family) -{ - switch (family) - { - case AF_INET: - return 4; - case AF_INET6: - return 16; - } - return -1; -} - -char * -support_format_hostent (struct hostent *h) -{ - if (h == NULL) - { - char *value = support_format_herrno (h_errno); - char *result = xasprintf ("error: %s\n", value); - free (value); - return result; - } - - struct xmemstream mem; - xopen_memstream (&mem); - - fprintf (mem.out, "name: %s\n", h->h_name); - for (char **alias = h->h_aliases; *alias != NULL; ++alias) - fprintf (mem.out, "alias: %s\n", *alias); - for (unsigned i = 0; h->h_addr_list[i] != NULL; ++i) - { - char buf[128]; - if (inet_ntop (h->h_addrtype, h->h_addr_list[i], - buf, sizeof (buf)) == NULL) - fprintf (mem.out, "error: inet_ntop failed: %m\n"); - else - fprintf (mem.out, "address: %s\n", buf); - } - if (h->h_length != address_length (h->h_addrtype)) - { - char *family = support_format_address_family (h->h_addrtype); - fprintf (mem.out, "error: invalid address length %d for %s\n", - h->h_length, family); - free (family); - } - - xfclose_memstream (&mem); - return mem.buffer; -} diff --git a/support/support_format_netent.c b/support/support_format_netent.c deleted file mode 100644 index 020f5720d9..0000000000 --- a/support/support_format_netent.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Convert a struct netent object to a string. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/format_nss.h> - -#include <arpa/inet.h> -#include <stdio.h> -#include <support/support.h> -#include <support/xmemstream.h> - -char * -support_format_netent (struct netent *e) -{ - if (e == NULL) - { - char *value = support_format_herrno (h_errno); - char *result = xasprintf ("error: %s\n", value); - free (value); - return result; - } - - struct xmemstream mem; - xopen_memstream (&mem); - - if (e->n_name != NULL) - fprintf (mem.out, "name: %s\n", e->n_name); - for (char **ap = e->n_aliases; *ap != NULL; ++ap) - fprintf (mem.out, "alias: %s\n", *ap); - if (e->n_addrtype != AF_INET) - fprintf (mem.out, "addrtype: %d\n", e->n_addrtype); - /* On alpha, e->n_net is an unsigned long. */ - unsigned int n_net = e->n_net; - fprintf (mem.out, "net: 0x%08x\n", n_net); - - xfclose_memstream (&mem); - return mem.buffer; -} diff --git a/support/support_isolate_in_subprocess.c b/support/support_isolate_in_subprocess.c deleted file mode 100644 index cf48614383..0000000000 --- a/support/support_isolate_in_subprocess.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Run a function in a subprocess. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check.h> -#include <support/xunistd.h> - -void -support_isolate_in_subprocess (void (*callback) (void *), void *closure) -{ - pid_t pid = xfork (); - if (pid == 0) - { - /* Child process. */ - callback (closure); - _exit (0); - } - - /* Parent process. */ - int status; - xwaitpid (pid, &status, 0); - if (status != 0) - FAIL_EXIT1 ("child process exited with status %d", status); -} diff --git a/support/support_record_failure.c b/support/support_record_failure.c deleted file mode 100644 index 684055c746..0000000000 --- a/support/support_record_failure.c +++ /dev/null @@ -1,106 +0,0 @@ -/* Global test failure counter. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check.h> -#include <support/support.h> -#include <support/test-driver.h> - -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/mman.h> -#include <unistd.h> - -/* This structure keeps track of test failures. The counter is - incremented on each failure. The failed member is set to true if a - failure is detected, so that even if the counter wraps around to - zero, the failure of a test can be detected. - - The init constructor function below puts *state on a shared - annonymous mapping, so that failure reports from subprocesses - propagate to the parent process. */ -struct test_failures -{ - unsigned int counter; - unsigned int failed; -}; -static struct test_failures *state; - -static __attribute__ ((constructor)) void -init (void) -{ - void *ptr = mmap (NULL, sizeof (*state), PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_SHARED, -1, 0); - if (ptr == MAP_FAILED) - { - printf ("error: could not map %zu bytes: %m\n", sizeof (*state)); - exit (1); - } - /* Zero-initialization of the struct is sufficient. */ - state = ptr; -} - -void -support_record_failure (void) -{ - if (state == NULL) - { - write_message - ("error: support_record_failure called without initialization\n"); - _exit (1); - } - /* Relaxed MO is sufficient because we are only interested in the - values themselves, in isolation. */ - __atomic_store_n (&state->failed, 1, __ATOMIC_RELEASE); - __atomic_add_fetch (&state->counter, 1, __ATOMIC_RELEASE); -} - -int -support_report_failure (int status) -{ - if (state == NULL) - { - write_message - ("error: support_report_failure called without initialization\n"); - return 1; - } - - /* Relaxed MO is sufficient because acquire test result reporting - assumes that exiting from the main thread happens before the - error reporting via support_record_failure, which requires some - form of external synchronization. */ - bool failed = __atomic_load_n (&state->failed, __ATOMIC_RELAXED); - if (failed) - printf ("error: %u test failures\n", - __atomic_load_n (&state->counter, __ATOMIC_RELAXED)); - - if ((status == 0 || status == EXIT_UNSUPPORTED) && failed) - /* If we have a recorded failure, it overrides a non-failure - report from the test function. */ - status = 1; - return status; -} - -void -support_record_failure_reset (void) -{ - /* Only used for testing the test framework, with external - synchronization, but use release MO for consistency. */ - __atomic_store_n (&state->failed, 0, __ATOMIC_RELAXED); - __atomic_add_fetch (&state->counter, 0, __ATOMIC_RELAXED); -} diff --git a/support/support_run_diff.c b/support/support_run_diff.c deleted file mode 100644 index f5155de727..0000000000 --- a/support/support_run_diff.c +++ /dev/null @@ -1,76 +0,0 @@ -/* Invoke the system diff tool to compare two strings. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/run_diff.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <support/check.h> -#include <support/support.h> -#include <support/temp_file.h> -#include <support/xunistd.h> -#include <sys/wait.h> - -static char * -write_to_temp_file (const char *prefix, const char *str) -{ - char *template = xasprintf ("run_diff-%s", prefix); - char *name = NULL; - int fd = create_temp_file (template, &name); - TEST_VERIFY_EXIT (fd >= 0); - free (template); - xwrite (fd, str, strlen (str)); - xclose (fd); - return name; -} - -void -support_run_diff (const char *left_label, const char *left, - const char *right_label, const char *right) -{ - /* Ensure that the diff command output is ordered properly with - standard output. */ - TEST_VERIFY_EXIT (fflush (stdout) == 0); - - char *left_path = write_to_temp_file ("left-diff", left); - char *right_path = write_to_temp_file ("right-diff", right); - - pid_t pid = xfork (); - if (pid == 0) - { - execlp ("diff", "diff", "-u", - "--label", left_label, "--label", right_label, - "--", left_path, right_path, - NULL); - _exit (17); - } - else - { - int status; - xwaitpid (pid, &status, 0); - if (!WIFEXITED (status) || WEXITSTATUS (status) != 1) - printf ("warning: could not run diff, exit status: %d\n" - "*** %s ***\n%s\n" - "*** %s ***\n%s\n", - status, left_label, left, right_label, right); - } - - free (right_path); - free (left_path); -} diff --git a/support/support_shared_allocate.c b/support/support_shared_allocate.c deleted file mode 100644 index 61d088e8cf..0000000000 --- a/support/support_shared_allocate.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Allocate a memory region shared across processes. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <errno.h> -#include <stddef.h> -#include <support/support.h> -#include <support/xunistd.h> -#include <sys/mman.h> - -/* Header for the allocation. It contains the size of the allocation - for subsequent unmapping. */ -struct header -{ - size_t total_size; - char data[] __attribute__ ((aligned (__alignof__ (max_align_t)))); -}; - -void * -support_shared_allocate (size_t size) -{ - size_t total_size = size + offsetof (struct header, data); - if (total_size < size) - { - errno = ENOMEM; - oom_error (__func__, size); - return NULL; - } - else - { - struct header *result = xmmap (NULL, total_size, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_SHARED, -1); - result->total_size = total_size; - return &result->data; - } -} - -void -support_shared_free (void *data) -{ - struct header *header = data - offsetof (struct header, data); - xmunmap (header, header->total_size); -} diff --git a/support/support_test_main.c b/support/support_test_main.c deleted file mode 100644 index 914d64f603..0000000000 --- a/support/support_test_main.c +++ /dev/null @@ -1,423 +0,0 @@ -/* Main worker function for the test driver. - Copyright (C) 1998-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/test-driver.h> -#include <support/check.h> -#include <support/temp_file-internal.h> - -#include <assert.h> -#include <errno.h> -#include <getopt.h> -#include <malloc.h> -#include <signal.h> -#include <stdbool.h> -#include <stdlib.h> -#include <string.h> -#include <sys/param.h> -#include <sys/resource.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <time.h> -#include <unistd.h> - -static const struct option default_options[] = -{ - TEST_DEFAULT_OPTIONS - { NULL, 0, NULL, 0 } -}; - -/* Show people how to run the program. */ -static void -usage (const struct option *options) -{ - size_t i; - - printf ("Usage: %s [options]\n" - "\n" - "Environment Variables:\n" - " TIMEOUTFACTOR An integer used to scale the timeout\n" - " TMPDIR Where to place temporary files\n" - " TEST_COREDUMPS Do not disable coredumps if set\n" - "\n", - program_invocation_short_name); - printf ("Options:\n"); - for (i = 0; options[i].name; ++i) - { - int indent; - - indent = printf (" --%s", options[i].name); - if (options[i].has_arg == required_argument) - indent += printf (" <arg>"); - printf ("%*s", 25 - indent, ""); - switch (options[i].val) - { - case 'v': - printf ("Increase the output verbosity"); - break; - case OPT_DIRECT: - printf ("Run the test directly (instead of forking & monitoring)"); - break; - case OPT_TESTDIR: - printf ("Override the TMPDIR env var"); - break; - } - printf ("\n"); - } -} - -/* The PID of the test process. */ -static pid_t test_pid; - -/* The cleanup handler passed to test_main. */ -static void (*cleanup_function) (void); - -/* Timeout handler. We kill the child and exit with an error. */ -static void -__attribute__ ((noreturn)) -signal_handler (int sig) -{ - int killed; - int status; - - assert (test_pid > 1); - /* Kill the whole process group. */ - kill (-test_pid, SIGKILL); - /* In case setpgid failed in the child, kill it individually too. */ - kill (test_pid, SIGKILL); - - /* Wait for it to terminate. */ - int i; - for (i = 0; i < 5; ++i) - { - killed = waitpid (test_pid, &status, WNOHANG|WUNTRACED); - if (killed != 0) - break; - - /* Delay, give the system time to process the kill. If the - nanosleep() call return prematurely, all the better. We - won't restart it since this probably means the child process - finally died. */ - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = 100000000; - nanosleep (&ts, NULL); - } - if (killed != 0 && killed != test_pid) - { - printf ("Failed to kill test process: %m\n"); - exit (1); - } - - if (cleanup_function != NULL) - cleanup_function (); - - if (sig == SIGINT) - { - signal (sig, SIG_DFL); - raise (sig); - } - - if (killed == 0 || (WIFSIGNALED (status) && WTERMSIG (status) == SIGKILL)) - puts ("Timed out: killed the child process"); - else if (WIFSTOPPED (status)) - printf ("Timed out: the child process was %s\n", - strsignal (WSTOPSIG (status))); - else if (WIFSIGNALED (status)) - printf ("Timed out: the child process got signal %s\n", - strsignal (WTERMSIG (status))); - else - printf ("Timed out: killed the child process but it exited %d\n", - WEXITSTATUS (status)); - - /* Exit with an error. */ - exit (1); -} - -/* Run test_function or test_function_argv. */ -static int -run_test_function (int argc, char **argv, const struct test_config *config) -{ - if (config->test_function != NULL) - return config->test_function (); - else if (config->test_function_argv != NULL) - return config->test_function_argv (argc, argv); - else - { - printf ("error: no test function defined\n"); - exit (1); - } -} - -static bool test_main_called; - -const char *test_dir = NULL; -unsigned int test_verbose = 0; - -/* If test failure reporting has been linked in, it may contribute - additional test failures. */ -static int -adjust_exit_status (int status) -{ - if (support_report_failure != NULL) - return support_report_failure (status); - return status; -} - -int -support_test_main (int argc, char **argv, const struct test_config *config) -{ - if (test_main_called) - { - printf ("error: test_main called for a second time\n"); - exit (1); - } - test_main_called = true; - const struct option *options; - if (config->options != NULL) - options = config->options; - else - options = default_options; - - cleanup_function = config->cleanup_function; - - int direct = 0; /* Directly call the test function? */ - int status; - int opt; - unsigned int timeoutfactor = 1; - pid_t termpid; - - if (!config->no_mallopt) - { - /* Make uses of freed and uninitialized memory known. Do not - pull in a definition for mallopt if it has not been defined - already. */ - extern __typeof__ (mallopt) mallopt __attribute__ ((weak)); - if (mallopt != NULL) - mallopt (M_PERTURB, 42); - } - - while ((opt = getopt_long (argc, argv, "+", options, NULL)) != -1) - switch (opt) - { - case '?': - usage (options); - exit (1); - case 'v': - ++test_verbose; - break; - case OPT_DIRECT: - direct = 1; - break; - case OPT_TESTDIR: - test_dir = optarg; - break; - default: - if (config->cmdline_function != NULL) - config->cmdline_function (opt); - } - - /* If set, read the test TIMEOUTFACTOR value from the environment. - This value is used to scale the default test timeout values. */ - char *envstr_timeoutfactor = getenv ("TIMEOUTFACTOR"); - if (envstr_timeoutfactor != NULL) - { - char *envstr_conv = envstr_timeoutfactor; - unsigned long int env_fact; - - env_fact = strtoul (envstr_timeoutfactor, &envstr_conv, 0); - if (*envstr_conv == '\0' && envstr_conv != envstr_timeoutfactor) - timeoutfactor = MAX (env_fact, 1); - } - - /* Set TMPDIR to specified test directory. */ - if (test_dir != NULL) - { - setenv ("TMPDIR", test_dir, 1); - - if (chdir (test_dir) < 0) - { - printf ("chdir: %m\n"); - exit (1); - } - } - else - { - test_dir = getenv ("TMPDIR"); - if (test_dir == NULL || test_dir[0] == '\0') - test_dir = "/tmp"; - } - if (support_set_test_dir != NULL) - support_set_test_dir (test_dir); - - int timeout = config->timeout; - if (timeout == 0) - timeout = DEFAULT_TIMEOUT; - - /* Make sure we see all message, even those on stdout. */ - setvbuf (stdout, NULL, _IONBF, 0); - - /* Make sure temporary files are deleted. */ - if (support_delete_temp_files != NULL) - atexit (support_delete_temp_files); - - /* Correct for the possible parameters. */ - argv[optind - 1] = argv[0]; - argv += optind - 1; - argc -= optind - 1; - - /* Call the initializing function, if one is available. */ - if (config->prepare_function != NULL) - config->prepare_function (argc, argv); - - const char *envstr_direct = getenv ("TEST_DIRECT"); - if (envstr_direct != NULL) - { - FILE *f = fopen (envstr_direct, "w"); - if (f == NULL) - { - printf ("cannot open TEST_DIRECT output file '%s': %m\n", - envstr_direct); - exit (1); - } - - fprintf (f, "timeout=%u\ntimeoutfactor=%u\n", - config->timeout, timeoutfactor); - if (config->expected_status != 0) - fprintf (f, "exit=%u\n", config->expected_status); - if (config->expected_signal != 0) - fprintf (f, "signal=%s\n", strsignal (config->expected_signal)); - - if (support_print_temp_files != NULL) - support_print_temp_files (f); - - fclose (f); - direct = 1; - } - - bool disable_coredumps; - { - const char *coredumps = getenv ("TEST_COREDUMPS"); - disable_coredumps = coredumps == NULL || coredumps[0] == '\0'; - } - - /* If we are not expected to fork run the function immediately. */ - if (direct) - return adjust_exit_status (run_test_function (argc, argv, config)); - - /* Set up the test environment: - - prevent core dumps - - set up the timer - - fork and execute the function. */ - - test_pid = fork (); - if (test_pid == 0) - { - /* This is the child. */ - if (disable_coredumps) - { - /* Try to avoid dumping core. This is necessary because we - run the test from the source tree, and the coredumps - would end up there (and not in the build tree). */ - struct rlimit core_limit; - core_limit.rlim_cur = 0; - core_limit.rlim_max = 0; - setrlimit (RLIMIT_CORE, &core_limit); - } - - /* We put the test process in its own pgrp so that if it bogusly - generates any job control signals, they won't hit the whole build. */ - if (setpgid (0, 0) != 0) - printf ("Failed to set the process group ID: %m\n"); - - /* Execute the test function and exit with the return value. */ - exit (run_test_function (argc, argv, config)); - } - else if (test_pid < 0) - { - printf ("Cannot fork test program: %m\n"); - exit (1); - } - - /* Set timeout. */ - signal (SIGALRM, signal_handler); - alarm (timeout * timeoutfactor); - - /* Make sure we clean up if the wrapper gets interrupted. */ - signal (SIGINT, signal_handler); - - /* Wait for the regular termination. */ - termpid = TEMP_FAILURE_RETRY (waitpid (test_pid, &status, 0)); - if (termpid == -1) - { - printf ("Waiting for test program failed: %m\n"); - exit (1); - } - if (termpid != test_pid) - { - printf ("Oops, wrong test program terminated: expected %ld, got %ld\n", - (long int) test_pid, (long int) termpid); - exit (1); - } - - /* Process terminated normaly without timeout etc. */ - if (WIFEXITED (status)) - { - if (config->expected_status == 0) - { - if (config->expected_signal == 0) - /* Exit with the return value of the test. */ - return adjust_exit_status (WEXITSTATUS (status)); - else - { - printf ("Expected signal '%s' from child, got none\n", - strsignal (config->expected_signal)); - exit (1); - } - } - else - { - /* Non-zero exit status is expected */ - if (WEXITSTATUS (status) != config->expected_status) - { - printf ("Expected status %d, got %d\n", - config->expected_status, WEXITSTATUS (status)); - exit (1); - } - } - return adjust_exit_status (0); - } - /* Process was killed by timer or other signal. */ - else - { - if (config->expected_signal == 0) - { - printf ("Didn't expect signal from child: got `%s'\n", - strsignal (WTERMSIG (status))); - exit (1); - } - else if (WTERMSIG (status) != config->expected_signal) - { - printf ("Incorrect signal from child: got `%s', need `%s'\n", - strsignal (WTERMSIG (status)), - strsignal (config->expected_signal)); - exit (1); - } - - return adjust_exit_status (0); - } -} diff --git a/support/support_test_verify_impl.c b/support/support_test_verify_impl.c deleted file mode 100644 index 5bae38f8b1..0000000000 --- a/support/support_test_verify_impl.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Implementation of the TEST_VERIFY and TEST_VERIFY_EXIT macros. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check.h> - -#include <stdio.h> -#include <stdlib.h> - -void -support_test_verify_impl (int status, const char *file, int line, - const char *expr) -{ - support_record_failure (); - printf ("error: %s:%d: not true: %s\n", file, line, expr); - if (status >= 0) - exit (status); - -} diff --git a/support/support_write_file_string.c b/support/support_write_file_string.c deleted file mode 100644 index 48e89597f3..0000000000 --- a/support/support_write_file_string.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Write a string to a file. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <fcntl.h> -#include <string.h> -#include <support/check.h> -#include <xunistd.h> - -void -support_write_file_string (const char *path, const char *contents) -{ - int fd = xopen (path, O_CREAT | O_TRUNC | O_WRONLY, 0666); - const char *end = contents + strlen (contents); - for (const char *p = contents; p < end; ) - { - ssize_t ret = write (fd, p, end - p); - if (ret < 0) - FAIL_EXIT1 ("cannot write to \"%s\": %m", path); - if (ret == 0) - FAIL_EXIT1 ("zero-length write to \"%s\"", path); - p += ret; - } - xclose (fd); -} diff --git a/support/temp_file-internal.h b/support/temp_file-internal.h deleted file mode 100644 index fb6cceb065..0000000000 --- a/support/temp_file-internal.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Internal weak declarations for temporary file handling. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_TEMP_FILE_INTERNAL_H -#define SUPPORT_TEMP_FILE_INTERNAL_H - -/* These functions are called by the test driver if they are - defined. Tests should not call them directly. */ - -#include <stdio.h> - -void support_set_test_dir (const char *name) __attribute__ ((weak)); -void support_delete_temp_files (void) __attribute__ ((weak)); -void support_print_temp_files (FILE *) __attribute__ ((weak)); - -#endif /* SUPPORT_TEMP_FILE_INTERNAL_H */ diff --git a/support/temp_file.c b/support/temp_file.c deleted file mode 100644 index fdb2477ab9..0000000000 --- a/support/temp_file.c +++ /dev/null @@ -1,132 +0,0 @@ -/* Temporary file handling for tests. - Copyright (C) 1998-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -/* This is required to get an mkstemp which can create large files on - some 32-bit platforms. */ -#define _FILE_OFFSET_BITS 64 - -#include <support/temp_file.h> -#include <support/temp_file-internal.h> -#include <support/support.h> - -#include <paths.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -/* List of temporary files. */ -static struct temp_name_list -{ - struct temp_name_list *next; - char *name; - pid_t owner; -} *temp_name_list; - -/* Location of the temporary files. Set by the test skeleton via - support_set_test_dir. The string is not be freed. */ -static const char *test_dir = _PATH_TMP; - -void -add_temp_file (const char *name) -{ - struct temp_name_list *newp - = (struct temp_name_list *) xcalloc (sizeof (*newp), 1); - char *newname = strdup (name); - if (newname != NULL) - { - newp->name = newname; - newp->next = temp_name_list; - newp->owner = getpid (); - temp_name_list = newp; - } - else - free (newp); -} - -int -create_temp_file (const char *base, char **filename) -{ - char *fname; - int fd; - - fname = (char *) xmalloc (strlen (test_dir) + 1 + strlen (base) - + sizeof ("XXXXXX")); - strcpy (stpcpy (stpcpy (stpcpy (fname, test_dir), "/"), base), "XXXXXX"); - - fd = mkstemp (fname); - if (fd == -1) - { - printf ("cannot open temporary file '%s': %m\n", fname); - free (fname); - return -1; - } - - add_temp_file (fname); - if (filename != NULL) - *filename = fname; - else - free (fname); - - return fd; -} - -/* Helper functions called by the test skeleton follow. */ - -void -support_set_test_dir (const char *path) -{ - test_dir = path; -} - -void -support_delete_temp_files (void) -{ - pid_t pid = getpid (); - while (temp_name_list != NULL) - { - /* Only perform the removal if the path was registed in the same - process, as identified by the PID. (This assumes that the - parent process which registered the temporary file sticks - around, to prevent PID reuse.) */ - if (temp_name_list->owner == pid) - { - if (remove (temp_name_list->name) != 0) - printf ("warning: could not remove temporary file: %s: %m\n", - temp_name_list->name); - } - free (temp_name_list->name); - - struct temp_name_list *next = temp_name_list->next; - free (temp_name_list); - temp_name_list = next; - } -} - -void -support_print_temp_files (FILE *f) -{ - if (temp_name_list != NULL) - { - struct temp_name_list *n; - fprintf (f, "temp_files=(\n"); - for (n = temp_name_list; n != NULL; n = n->next) - fprintf (f, " '%s'\n", n->name); - fprintf (f, ")\n"); - } -} diff --git a/support/temp_file.h b/support/temp_file.h deleted file mode 100644 index 6fed8df1ea..0000000000 --- a/support/temp_file.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Declarations for temporary file handling. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_TEMP_FILE_H -#define SUPPORT_TEMP_FILE_H - -#include <sys/cdefs.h> - -__BEGIN_DECLS - -/* Schedule a temporary file for deletion on exit. */ -void add_temp_file (const char *name); - -/* Create a temporary file. Return the opened file descriptor on - success, or -1 on failure. Write the file name to *FILENAME if - FILENAME is not NULL. In this case, the caller is expected to free - *FILENAME. */ -int create_temp_file (const char *base, char **filename); - -__END_DECLS - -#endif /* SUPPORT_TEMP_FILE_H */ diff --git a/support/test-driver.c b/support/test-driver.c deleted file mode 100644 index 482066dbeb..0000000000 --- a/support/test-driver.c +++ /dev/null @@ -1,156 +0,0 @@ -/* Main function for test programs. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -/* This file should be included from test cases. It will define a - main function which provides the test wrapper. - - It assumes that the test case defines a function - - int do_test (void); - - and arranges for that function being called under the test wrapper. - The do_test function should return 0 to indicate a passing test, 1 - to indicate a failing test, or 77 to indicate an unsupported test. - Other result values could be used to indicate a failing test, but - the result of the expression is passed to exit and exit only - returns the lower 8 bits of its input. A non-zero return with some - values could cause a test to incorrectly be considered passing when - it really failed. For this reason, the function should always - return 0 (EXIT_SUCCESS), 1 (EXIT_FAILURE), or 77 - (EXIT_UNSUPPORTED). - - The test function may print out diagnostic or warning messages as well - as messages about failures. These messages should be printed to stdout - and not stderr so that the output is properly ordered with respect to - the rest of the glibc testsuite run output. - - Several preprocessors macros can be defined before including this - file. - - The name of the do_test function can be changed with the - TEST_FUNCTION macro. It must expand to the desired function name. - - If the test case needs access to command line parameters, it must - define the TEST_FUNCTION_ARGV macro with the name of the test - function. It must have the following type: - - int TEST_FUNCTION_ARGV (int argc, char **argv); - - This overrides the do_test default function and is incompatible - with the TEST_FUNCTION macro. - - If PREPARE is defined, it must expand to the name of a function of - the type - - void PREPARE (int argc, char **); - - This function will be called early, after parsing the command line, - but before running the test, in the parent process which acts as - the test supervisor. - - If CLEANUP_HANDLER is defined, it must expand to the name of a - function of the type - - void CLEANUP_HANDLER (void); - - This function will be called from the timeout (SIGALRM) signal - handler. - - If EXPECTED_SIGNAL is defined, it must expanded to a constant which - denotes the expected signal number. - - If EXPECTED_STATUS is defined, it must expand to the expected exit - status. - - If TIMEOUT is defined, it must be positive constant. It overrides - the default test timeout and is measured in seconds. - - If TEST_NO_MALLOPT is defined, the test wrapper will not call - mallopt. - - Custom command line handling can be implemented by defining the - CMDLINE_OPTION macro (after including the <getopt.h> header; this - requires _GNU_SOURCE to be defined). This macro must expand to a - to a comma-separated list of braced initializers for struct option - from <getopt.h>, with a trailing comma. CMDLINE_PROCESS can be - defined as the name of a function which is called to process these - options. The function is passed the option character/number and - has this type: - - void CMDLINE_PROCESS (int); -*/ - -#include <support/test-driver.h> - -#include <string.h> - -int -main (int argc, char **argv) -{ - struct test_config test_config; - memset (&test_config, 0, sizeof (test_config)); - -#ifdef PREPARE - test_config.prepare_function = (PREPARE); -#endif - -#if defined (TEST_FUNCTION) && defined (TEST_FUNCTON_ARGV) -# error TEST_FUNCTION and TEST_FUNCTION_ARGV cannot be defined at the same time -#endif -#if defined (TEST_FUNCTION) - test_config.test_function = TEST_FUNCTION; -#elif defined (TEST_FUNCTION_ARGV) - test_config.test_function_argv = TEST_FUNCTION_ARGV; -#else - test_config.test_function = do_test; -#endif - -#ifdef CLEANUP_HANDLER - test_config.cleanup_function = CLEANUP_HANDLER; -#endif - -#ifdef EXPECTED_SIGNAL - test_config.expected_signal = (EXPECTED_SIGNAL); -#endif - -#ifdef EXPECTED_STATUS - test_config.expected_status = (EXPECTED_STATUS); -#endif - -#ifdef TEST_NO_MALLOPT - test_config.no_mallopt = 1; -#endif - -#ifdef TIMEOUT - test_config.timeout = TIMEOUT; -#endif - -#ifdef CMDLINE_OPTIONS - struct option options[] = - { - CMDLINE_OPTIONS - TEST_DEFAULT_OPTIONS - }; - test_config.options = &options; -#endif -#ifdef CMDLINE_PROCESS - test_config.cmdline_function = CMDLINE_PROCESS; -#endif - - return support_test_main (argc, argv, &test_config); -} diff --git a/support/test-driver.h b/support/test-driver.h deleted file mode 100644 index af1971a9ca..0000000000 --- a/support/test-driver.h +++ /dev/null @@ -1,74 +0,0 @@ -/* Interfaces for the test driver. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_TEST_DRIVER_H -#define SUPPORT_TEST_DRIVER_H - -#include <sys/cdefs.h> - -__BEGIN_DECLS - -struct test_config -{ - void (*prepare_function) (int argc, char **argv); - int (*test_function) (void); - int (*test_function_argv) (int argc, char **argv); - void (*cleanup_function) (void); - void (*cmdline_function) (int); - const void *options; /* Custom options if not NULL. */ - int timeout; /* Test timeout in seconds. */ - int expected_status; /* Expected exit status. */ - int expected_signal; /* If non-zero, expect termination by signal. */ - char no_mallopt; /* Boolean flag to disable mallopt. */ -}; - -enum - { - /* Test exit status which indicates that the feature is - unsupported. */ - EXIT_UNSUPPORTED = 77, - - /* Default timeout is twenty seconds. Tests should normally - complete faster than this, but if they don't, that's abnormal - (a bug) anyways. */ - DEFAULT_TIMEOUT = 20, - - /* Used for command line argument parsing. */ - OPT_DIRECT = 1000, - OPT_TESTDIR, - }; - -/* Options provided by the test driver. */ -#define TEST_DEFAULT_OPTIONS \ - { "verbose", no_argument, NULL, 'v' }, \ - { "direct", no_argument, NULL, OPT_DIRECT }, \ - { "test-dir", required_argument, NULL, OPT_TESTDIR }, \ - -/* The directory the test should use for temporary files. */ -extern const char *test_dir; - -/* The number of --verbose arguments specified during program - invocation. This variable can be used to control the verbosity of - tests. */ -extern unsigned int test_verbose; - -int support_test_main (int argc, char **argv, const struct test_config *); - -__END_DECLS - -#endif /* SUPPORT_TEST_DRIVER_H */ diff --git a/support/tst-support-namespace.c b/support/tst-support-namespace.c deleted file mode 100644 index a50b074f5e..0000000000 --- a/support/tst-support-namespace.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Test entering namespaces. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <stdio.h> -#include <support/namespace.h> - -static int -do_test (void) -{ - if (support_become_root ()) - printf ("info: acquired root-like privileges\n"); - if (support_enter_network_namespace ()) - printf ("info: entered network namespace\n"); - if (support_in_uts_namespace ()) - printf ("info: also entered UTS namespace\n"); - return 0; -} - -#include <support/test-driver.c> diff --git a/support/tst-support_capture_subprocess.c b/support/tst-support_capture_subprocess.c deleted file mode 100644 index 5672fba0f7..0000000000 --- a/support/tst-support_capture_subprocess.c +++ /dev/null @@ -1,188 +0,0 @@ -/* Test capturing output from a subprocess. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <support/capture_subprocess.h> -#include <support/check.h> -#include <support/support.h> -#include <sys/wait.h> -#include <unistd.h> - -/* Write one byte at *P to FD and advance *P. Do nothing if *P is - '\0'. */ -static void -transfer (const unsigned char **p, int fd) -{ - if (**p != '\0') - { - TEST_VERIFY (write (fd, *p, 1) == 1); - ++*p; - } -} - -/* Determine the order in which stdout and stderr are written. */ -enum write_mode { out_first, err_first, interleave, - write_mode_last = interleave }; - -/* Describe what to write in the subprocess. */ -struct test -{ - char *out; - char *err; - enum write_mode write_mode; - int signal; - int status; -}; - -/* For use with support_capture_subprocess. */ -static void -callback (void *closure) -{ - const struct test *test = closure; - bool mode_ok = false; - switch (test->write_mode) - { - case out_first: - TEST_VERIFY (fputs (test->out, stdout) >= 0); - TEST_VERIFY (fflush (stdout) == 0); - TEST_VERIFY (fputs (test->err, stderr) >= 0); - TEST_VERIFY (fflush (stderr) == 0); - mode_ok = true; - break; - case err_first: - TEST_VERIFY (fputs (test->err, stderr) >= 0); - TEST_VERIFY (fflush (stderr) == 0); - TEST_VERIFY (fputs (test->out, stdout) >= 0); - TEST_VERIFY (fflush (stdout) == 0); - mode_ok = true; - break; - case interleave: - { - const unsigned char *pout = (const unsigned char *) test->out; - const unsigned char *perr = (const unsigned char *) test->err; - do - { - transfer (&pout, STDOUT_FILENO); - transfer (&perr, STDERR_FILENO); - } - while (*pout != '\0' || *perr != '\0'); - } - mode_ok = true; - break; - } - TEST_VERIFY (mode_ok); - - if (test->signal != 0) - raise (test->signal); - exit (test->status); -} - -/* Create a heap-allocated random string of letters. */ -static char * -random_string (size_t length) -{ - char *result = xmalloc (length + 1); - for (size_t i = 0; i < length; ++i) - result[i] = 'a' + (rand () % 26); - result[length] = '\0'; - return result; -} - -/* Check that the specific stream from the captured subprocess matches - expectations. */ -static void -check_stream (const char *what, const struct xmemstream *stream, - const char *expected) -{ - if (strcmp (stream->buffer, expected) != 0) - { - support_record_failure (); - printf ("error: captured %s data incorrect\n" - " expected: %s\n" - " actual: %s\n", - what, expected, stream->buffer); - } - if (stream->length != strlen (expected)) - { - support_record_failure (); - printf ("error: captured %s data length incorrect\n" - " expected: %zu\n" - " actual: %zu\n", - what, strlen (expected), stream->length); - } -} - -static int -do_test (void) -{ - const int lengths[] = {0, 1, 17, 512, 20000, -1}; - - /* Test multiple combinations of support_capture_subprocess. - - length_idx_stdout: Index into the lengths array above, - controls how many bytes are written by the subprocess to - standard output. - length_idx_stderr: Same for standard error. - write_mode: How standard output and standard error writes are - ordered. - signal: Exit with no signal if zero, with SIGTERM if one. - status: Process exit status: 0 if zero, 3 if one. */ - for (int length_idx_stdout = 0; lengths[length_idx_stdout] >= 0; - ++length_idx_stdout) - for (int length_idx_stderr = 0; lengths[length_idx_stderr] >= 0; - ++length_idx_stderr) - for (int write_mode = 0; write_mode < write_mode_last; ++write_mode) - for (int signal = 0; signal < 2; ++signal) - for (int status = 0; status < 2; ++status) - { - struct test test = - { - .out = random_string (lengths[length_idx_stdout]), - .err = random_string (lengths[length_idx_stderr]), - .write_mode = write_mode, - .signal = signal * SIGTERM, /* 0 or SIGTERM. */ - .status = status * 3, /* 0 or 3. */ - }; - TEST_VERIFY (strlen (test.out) == lengths[length_idx_stdout]); - TEST_VERIFY (strlen (test.err) == lengths[length_idx_stderr]); - - struct support_capture_subprocess result - = support_capture_subprocess (callback, &test); - check_stream ("stdout", &result.out, test.out); - check_stream ("stderr", &result.err, test.err); - if (test.signal != 0) - { - TEST_VERIFY (WIFSIGNALED (result.status)); - TEST_VERIFY (WTERMSIG (result.status) == test.signal); - } - else - { - TEST_VERIFY (WIFEXITED (result.status)); - TEST_VERIFY (WEXITSTATUS (result.status) == test.status); - } - support_capture_subprocess_free (&result); - free (test.out); - free (test.err); - } - return 0; -} - -#include <support/test-driver.c> diff --git a/support/tst-support_format_dns_packet.c b/support/tst-support_format_dns_packet.c deleted file mode 100644 index 9c8589c09c..0000000000 --- a/support/tst-support_format_dns_packet.c +++ /dev/null @@ -1,101 +0,0 @@ -/* Tests for the support_format_dns_packet function. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check.h> -#include <support/format_nss.h> -#include <support/run_diff.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -static void -check_packet (const void *buffer, size_t length, - const char *name, const char *expected) -{ - char *actual = support_format_dns_packet (buffer, length); - if (strcmp (actual, expected) != 0) - { - support_record_failure (); - printf ("error: formatted packet does not match: %s\n", name); - support_run_diff ("expected", expected, - "actual", actual); - } - free (actual); -} - -static void -test_aaaa_length (void) -{ - static const char packet[] = - /* Header: Response with two records. */ - "\x12\x34\x80\x00\x00\x01\x00\x02\x00\x00\x00\x00" - /* Question section. www.example/IN/AAAA. */ - "\x03www\x07""example\x00\x00\x1c\x00\x01" - /* Answer section. www.example AAAA [corrupted]. */ - "\xc0\x0c" - "\x00\x1c\x00\x01\x00\x00\x00\x00\x00\x10" - "\x20\x01\x0d\xb8\x05\x06\x07\x08" - "\x11\x12\x13\x14\x15\x16\x17\x18" - /* www.example AAAA [corrupted]. */ - "\xc0\x0c" - "\x00\x1c\x00\x01\x00\x00\x00\x00\x00\x11" - "\x01\x02\x03\x04\x05\x06\x07\x08" - "\x11\x12\x13\x14\x15\x16\x17\x18" "\xff"; - check_packet (packet, sizeof (packet) - 1, __func__, - "name: www.example\n" - "address: 2001:db8:506:708:1112:1314:1516:1718\n" - "error: AAAA record of size 17: www.example\n"); -} - -static void -test_multiple_cnames (void) -{ - static const char packet[] = - /* Header: Response with three records. */ - "\x12\x34\x80\x00\x00\x01\x00\x03\x00\x00\x00\x00" - /* Question section. www.example/IN/A. */ - "\x03www\x07""example\x00\x00\x01\x00\x01" - /* Answer section. www.example CNAME www1.example. */ - "\xc0\x0c" - "\x00\x05\x00\x01\x00\x00\x00\x00\x00\x07" - "\x04www1\xc0\x10" - /* www1 CNAME www2. */ - "\x04www1\xc0\x10" - "\x00\x05\x00\x01\x00\x00\x00\x00\x00\x07" - "\x04www2\xc0\x10" - /* www2 A 192.0.2.1. */ - "\x04www2\xc0\x10" - "\x00\x01\x00\x01\x00\x00\x00\x00\x00\x04" - "\xc0\x00\x02\x01"; - check_packet (packet, sizeof (packet) - 1, __func__, - "name: www.example\n" - "name: www1.example\n" - "name: www2.example\n" - "address: 192.0.2.1\n"); -} - -static int -do_test (void) -{ - test_aaaa_length (); - test_multiple_cnames (); - return 0; -} - -#include <support/test-driver.c> diff --git a/support/tst-support_record_failure-2.sh b/support/tst-support_record_failure-2.sh deleted file mode 100644 index 2c9372cc29..0000000000 --- a/support/tst-support_record_failure-2.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/sh -# Test failure recording (with and without --direct). -# Copyright (C) 2016-2017 Free Software Foundation, Inc. -# 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 -# <http://www.gnu.org/licenses/>. */ - -set -e - -common_objpfx=$1; shift -test_program_prefix_before_env=$1; shift -run_program_env=$1; shift -test_program_prefix_after_env=$1; shift - -run_test () { - expected_status="$1" - expected_output="$2" - shift 2 - args="${common_objpfx}support/tst-support_record_failure $*" - echo "running: $args" - set +e - output="$(${test_program_prefix_before_env} \ - ${run_program} ${test_program_prefix_after_env} $args)" - status=$? - set -e - echo " exit status: $status" - if test "$output" != "$expected_output" ; then - echo "error: unexpected output: $output" - exit 1 - fi - if test "$status" -ne "$expected_status" ; then - echo "error: exit status $expected_status expected" - exit 1 - fi -} - -different_status () { - direct="$1" - run_test 1 "error: 1 test failures" $direct --status=0 - run_test 1 "error: 1 test failures" $direct --status=1 - run_test 2 "error: 1 test failures" $direct --status=2 - run_test 1 "error: 1 test failures" $direct --status=77 - run_test 2 "error: tst-support_record_failure.c:109: not true: false -error: 1 test failures" $direct --test-verify - run_test 2 "error: tst-support_record_failure.c:109: not true: false -info: execution passed failed TEST_VERIFY -error: 1 test failures" $direct --test-verify --verbose -} - -different_status -different_status --direct - -run_test 1 "error: tst-support_record_failure.c:116: not true: false -error: 1 test failures" --test-verify-exit -# --direct does not print the summary error message if exit is called. -run_test 1 "error: tst-support_record_failure.c:116: not true: false" \ - --direct --test-verify-exit diff --git a/support/tst-support_record_failure.c b/support/tst-support_record_failure.c deleted file mode 100644 index e739e739c3..0000000000 --- a/support/tst-support_record_failure.c +++ /dev/null @@ -1,153 +0,0 @@ -/* Test support_record_failure state sharing. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check.h> -#include <support/support.h> -#include <support/test-driver.h> -#include <support/xunistd.h> - -#include <getopt.h> -#include <stdbool.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -static int exit_status_with_failure = -1; -static bool test_verify; -static bool test_verify_exit; -enum - { - OPT_STATUS = 10001, - OPT_TEST_VERIFY, - OPT_TEST_VERIFY_EXIT, - }; -#define CMDLINE_OPTIONS \ - { "status", required_argument, NULL, OPT_STATUS }, \ - { "test-verify", no_argument, NULL, OPT_TEST_VERIFY }, \ - { "test-verify-exit", no_argument, NULL, OPT_TEST_VERIFY_EXIT }, -static void -cmdline_process (int c) -{ - switch (c) - { - case OPT_STATUS: - exit_status_with_failure = atoi (optarg); - break; - case OPT_TEST_VERIFY: - test_verify = true; - break; - case OPT_TEST_VERIFY_EXIT: - test_verify_exit = true; - break; - } -} -#define CMDLINE_PROCESS cmdline_process - -static void -check_failure_reporting (int phase, int zero, int unsupported) -{ - int status = support_report_failure (0); - if (status != zero) - { - printf ("real-error (phase %d): support_report_failure (0) == %d\n", - phase, status); - exit (1); - } - status = support_report_failure (1); - if (status != 1) - { - printf ("real-error (phase %d): support_report_failure (1) == %d\n", - phase, status); - exit (1); - } - status = support_report_failure (2); - if (status != 2) - { - printf ("real-error (phase %d): support_report_failure (2) == %d\n", - phase, status); - exit (1); - } - status = support_report_failure (EXIT_UNSUPPORTED); - if (status != unsupported) - { - printf ("real-error (phase %d): " - "support_report_failure (EXIT_UNSUPPORTED) == %d\n", - phase, status); - exit (1); - } -} - -static int -do_test (void) -{ - if (exit_status_with_failure >= 0) - { - /* External invocation with requested error status. Used by - tst-support_report_failure-2.sh. */ - support_record_failure (); - return exit_status_with_failure; - } - TEST_VERIFY (true); - TEST_VERIFY_EXIT (true); - if (test_verify) - { - TEST_VERIFY (false); - if (test_verbose) - printf ("info: execution passed failed TEST_VERIFY\n"); - return 2; /* Expected exit status. */ - } - if (test_verify_exit) - { - TEST_VERIFY_EXIT (false); - return 3; /* Not reached. Expected exit status is 1. */ - } - - printf ("info: This test tests the test framework.\n" - "info: It reports some expected errors on stdout.\n"); - - /* Check that the status is passed through unchanged. */ - check_failure_reporting (1, 0, EXIT_UNSUPPORTED); - - /* Check state propagation from a subprocess. */ - pid_t pid = xfork (); - if (pid == 0) - { - support_record_failure (); - _exit (0); - } - int status; - xwaitpid (pid, &status, 0); - if (status != 0) - { - printf ("real-error: incorrect status from subprocess: %d\n", status); - return 1; - } - check_failure_reporting (2, 1, 1); - - /* Also test directly in the parent process. */ - support_record_failure_reset (); - check_failure_reporting (3, 0, EXIT_UNSUPPORTED); - support_record_failure (); - check_failure_reporting (4, 1, 1); - - /* We need to mask the failure above. */ - support_record_failure_reset (); - return 0; -} - -#include <support/test-driver.c> diff --git a/support/write_message.c b/support/write_message.c deleted file mode 100644 index f03ed931d6..0000000000 --- a/support/write_message.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Write a message to standard output. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/support.h> - -#include <string.h> -#include <unistd.h> - -void -write_message (const char *message) -{ - ssize_t unused __attribute__ ((unused)); - unused = write (STDOUT_FILENO, message, strlen (message)); -} diff --git a/support/xaccept.c b/support/xaccept.c deleted file mode 100644 index 7b25af3b05..0000000000 --- a/support/xaccept.c +++ /dev/null @@ -1,32 +0,0 @@ -/* accept with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xsocket.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -int -xaccept (int fd, struct sockaddr *sa, socklen_t *salen) -{ - int clientfd = accept (fd, sa, salen); - if (clientfd < 0) - FAIL_EXIT1 ("accept (%d): %m", fd); - return clientfd; -} diff --git a/support/xaccept4.c b/support/xaccept4.c deleted file mode 100644 index 67dd95e9fb..0000000000 --- a/support/xaccept4.c +++ /dev/null @@ -1,32 +0,0 @@ -/* accept4 with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xsocket.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -int -xaccept4 (int fd, struct sockaddr *sa, socklen_t *salen, int flags) -{ - int clientfd = accept4 (fd, sa, salen, flags); - if (clientfd < 0) - FAIL_EXIT1 ("accept4 (%d, 0x%x): %m", fd, flags); - return clientfd; -} diff --git a/support/xasprintf.c b/support/xasprintf.c deleted file mode 100644 index 5157680fa2..0000000000 --- a/support/xasprintf.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Error-checking wrapper for asprintf. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/support.h> - -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -char * -xasprintf (const char *format, ...) -{ - va_list ap; - va_start (ap, format); - char *result; - if (vasprintf (&result, format, ap) < 0) - FAIL_EXIT1 ("asprintf: %m"); - va_end (ap); - return result; -} diff --git a/support/xbind.c b/support/xbind.c deleted file mode 100644 index cfc6dd8fa8..0000000000 --- a/support/xbind.c +++ /dev/null @@ -1,30 +0,0 @@ -/* bind with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xsocket.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -void -xbind (int fd, const struct sockaddr *sa, socklen_t sa_len) -{ - if (bind (fd, sa, sa_len) != 0) - FAIL_EXIT1 ("bind (%d), family %d: %m", fd, sa->sa_family); -} diff --git a/support/xcalloc.c b/support/xcalloc.c deleted file mode 100644 index 135f42dab2..0000000000 --- a/support/xcalloc.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Error-checking wrapper for calloc. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/support.h> - -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> - -void * -xcalloc (size_t n, size_t s) -{ - void *p; - - p = calloc (n, s); - if (p == NULL) - oom_error ("calloc", n * s); - return p; -} diff --git a/support/xchroot.c b/support/xchroot.c deleted file mode 100644 index abcc299e00..0000000000 --- a/support/xchroot.c +++ /dev/null @@ -1,28 +0,0 @@ -/* chroot with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check.h> -#include <support/xunistd.h> -#include <sys/stat.h> - -void -xchroot (const char *path) -{ - if (chroot (path) != 0) - FAIL_EXIT1 ("chroot (\"%s\"): %m", path); -} diff --git a/support/xclose.c b/support/xclose.c deleted file mode 100644 index c931e08421..0000000000 --- a/support/xclose.c +++ /dev/null @@ -1,28 +0,0 @@ -/* close with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xunistd.h> -#include <support/check.h> -#include <errno.h> - -void -xclose (int fd) -{ - if (close (fd) < 0 && errno != EINTR) - FAIL_EXIT1 ("close of descriptor %d failed: %m", fd); -} diff --git a/support/xconnect.c b/support/xconnect.c deleted file mode 100644 index 0266dbc643..0000000000 --- a/support/xconnect.c +++ /dev/null @@ -1,30 +0,0 @@ -/* connect with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xsocket.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -void -xconnect (int fd, const struct sockaddr *sa, socklen_t sa_len) -{ - if (connect (fd, sa, sa_len) != 0) - FAIL_EXIT1 ("connect (%d), family %d: %m", fd, sa->sa_family); -} diff --git a/support/xdup2.c b/support/xdup2.c deleted file mode 100644 index dc08c94518..0000000000 --- a/support/xdup2.c +++ /dev/null @@ -1,28 +0,0 @@ -/* dup2 with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xunistd.h> - -#include <support/check.h> - -void -xdup2 (int from, int to) -{ - if (dup2 (from, to) < 0) - FAIL_EXIT1 ("dup2 (%d, %d): %m", from, to); -} diff --git a/support/xfclose.c b/support/xfclose.c deleted file mode 100644 index 2737f05044..0000000000 --- a/support/xfclose.c +++ /dev/null @@ -1,33 +0,0 @@ -/* fclose with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xstdio.h> - -#include <support/check.h> -#include <stdlib.h> - -void -xfclose (FILE *fp) -{ - if (ferror (fp)) - FAIL_EXIT1 ("stdio stream closed with pending errors"); - if (fflush (fp) != 0) - FAIL_EXIT1 ("fflush: %m"); - if (fclose (fp) != 0) - FAIL_EXIT1 ("fclose: %m"); -} diff --git a/support/xfopen.c b/support/xfopen.c deleted file mode 100644 index 14532a09f3..0000000000 --- a/support/xfopen.c +++ /dev/null @@ -1,31 +0,0 @@ -/* fopen with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xstdio.h> - -#include <support/check.h> -#include <stdlib.h> - -FILE * -xfopen (const char *path, const char *mode) -{ - FILE *fp = fopen (path, mode); - if (fp == NULL) - FAIL_EXIT1 ("could not open %s (mode \"%s\"): %m", path, mode); - return fp; -} diff --git a/support/xfork.c b/support/xfork.c deleted file mode 100644 index aa52ba62c5..0000000000 --- a/support/xfork.c +++ /dev/null @@ -1,32 +0,0 @@ -/* fork with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xunistd.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -pid_t -xfork (void) -{ - pid_t result = fork (); - if (result < 0) - FAIL_EXIT1 ("fork: %m"); - return result; -} diff --git a/support/xgetsockname.c b/support/xgetsockname.c deleted file mode 100644 index c3bd884f8d..0000000000 --- a/support/xgetsockname.c +++ /dev/null @@ -1,30 +0,0 @@ -/* getsockname with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xsocket.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -void -xgetsockname (int fd, struct sockaddr *sa, socklen_t *plen) -{ - if (getsockname (fd, sa, plen) != 0) - FAIL_EXIT1 ("setsockopt (%d): %m", fd); -} diff --git a/support/xlisten.c b/support/xlisten.c deleted file mode 100644 index 1953e5900a..0000000000 --- a/support/xlisten.c +++ /dev/null @@ -1,30 +0,0 @@ -/* listen with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xsocket.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -void -xlisten (int fd, int backlog) -{ - if (listen (fd, backlog) != 0) - FAIL_EXIT1 ("listen (%d, %d): %m", fd, backlog); -} diff --git a/support/xmalloc.c b/support/xmalloc.c deleted file mode 100644 index 450f699789..0000000000 --- a/support/xmalloc.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Error-checking wrapper for malloc. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/support.h> - -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> - -void * -xmalloc (size_t n) -{ - void *p; - - p = malloc (n); - if (p == NULL) - oom_error ("malloc", n); - return p; -} diff --git a/support/xmemstream.c b/support/xmemstream.c deleted file mode 100644 index bce6dc9170..0000000000 --- a/support/xmemstream.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Error-checking wrappers for memstream functions. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xmemstream.h> - -#include <errno.h> -#include <stdlib.h> -#include <support/check.h> -#include <support/xstdio.h> - -void -xopen_memstream (struct xmemstream *stream) -{ - int old_errno = errno; - *stream = (struct xmemstream) {}; - stream->out = open_memstream (&stream->buffer, &stream->length); - if (stream->out == NULL) - FAIL_EXIT1 ("open_memstream: %m"); - errno = old_errno; -} - -void -xfclose_memstream (struct xmemstream *stream) -{ - xfclose (stream->out); - stream->out = NULL; -} diff --git a/support/xmemstream.h b/support/xmemstream.h deleted file mode 100644 index e5ba231e4d..0000000000 --- a/support/xmemstream.h +++ /dev/null @@ -1,49 +0,0 @@ -/* Error-checking wrappers for memstream functions. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_XMEMSTREAM_H -#define SUPPORT_XMEMSTREAM_H - -#include <stdio.h> -#include <sys/cdefs.h> - -__BEGIN_DECLS - -/* Wrappers for other libc functions. */ -struct xmemstream -{ - FILE *out; - char *buffer; - size_t length; -}; - -/* Create a new in-memory stream. Initializes *STREAM. After this - function returns, STREAM->out is a file descriptor open for - writing. errno is preserved, so that the %m format specifier can - be used for writing to STREAM->out. */ -void xopen_memstream (struct xmemstream *stream); - -/* Closes STREAM->OUT. After this function returns, STREAM->buffer - and STREAM->length denote a memory range which contains the bytes - written to the output stream. The caller should free - STREAM->buffer. */ -void xfclose_memstream (struct xmemstream *stream); - -__END_DECLS - -#endif /* SUPPORT_XMEMSTREAM_H */ diff --git a/support/xmkdir.c b/support/xmkdir.c deleted file mode 100644 index ea17d49391..0000000000 --- a/support/xmkdir.c +++ /dev/null @@ -1,28 +0,0 @@ -/* mkdir with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check.h> -#include <support/xunistd.h> -#include <sys/stat.h> - -void -xmkdir (const char *path, mode_t mode) -{ - if (mkdir (path, mode) != 0) - FAIL_EXIT1 ("mkdir (\"%s\", 0%o): %m", path, mode); -} diff --git a/support/xmmap.c b/support/xmmap.c deleted file mode 100644 index 435b1eb733..0000000000 --- a/support/xmmap.c +++ /dev/null @@ -1,31 +0,0 @@ -/* mmap with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check.h> -#include <support/xunistd.h> -#include <sys/mman.h> - -void * -xmmap (void *addr, size_t length, int prot, int flags, int fd) -{ - void *result = mmap (addr, length, prot, flags, fd, 0); - if (result == MAP_FAILED) - FAIL_EXIT1 ("mmap of %zu bytes, prot=0x%x, flags=0x%x: %m", - length, prot, flags); - return result; -} diff --git a/support/xmunmap.c b/support/xmunmap.c deleted file mode 100644 index 6ef5a4a468..0000000000 --- a/support/xmunmap.c +++ /dev/null @@ -1,28 +0,0 @@ -/* munmap with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check.h> -#include <support/xunistd.h> -#include <sys/mman.h> - -void -xmunmap (void *addr, size_t length) -{ - if (munmap (addr, length) != 0) - FAIL_EXIT1 ("munmap of %zu bytes: %m", length); -} diff --git a/support/xopen.c b/support/xopen.c deleted file mode 100644 index 7f033a03a7..0000000000 --- a/support/xopen.c +++ /dev/null @@ -1,30 +0,0 @@ -/* open64 with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/check.h> -#include <support/xunistd.h> -#include <fcntl.h> - -int -xopen (const char *path, int flags, mode_t mode) -{ - int ret = open64 (path, flags, mode); - if (ret < 0) - FAIL_EXIT1 ("open64 (\"%s\", 0x%x, 0%o): %m", path, flags, mode); - return ret; -} diff --git a/support/xpipe.c b/support/xpipe.c deleted file mode 100644 index 89a64a55c1..0000000000 --- a/support/xpipe.c +++ /dev/null @@ -1,28 +0,0 @@ -/* pipe with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xunistd.h> - -#include <support/check.h> - -void -xpipe (int fds[2]) -{ - if (pipe (fds) < 0) - FAIL_EXIT1 ("pipe: %m"); -} diff --git a/support/xpoll.c b/support/xpoll.c deleted file mode 100644 index bec2521ffc..0000000000 --- a/support/xpoll.c +++ /dev/null @@ -1,32 +0,0 @@ -/* poll with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xsocket.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -int -xpoll (struct pollfd *fds, nfds_t nfds, int timeout) -{ - int ret = poll (fds, nfds, timeout); - if (ret < 0) - FAIL_EXIT1 ("poll: %m"); - return ret; -} diff --git a/support/xpthread_attr_destroy.c b/support/xpthread_attr_destroy.c deleted file mode 100644 index 664c809e9f..0000000000 --- a/support/xpthread_attr_destroy.c +++ /dev/null @@ -1,26 +0,0 @@ -/* pthread_attr_destroy with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_attr_destroy (pthread_attr_t *attr) -{ - xpthread_check_return ("pthread_attr_destroy", - pthread_attr_destroy (attr)); -} diff --git a/support/xpthread_attr_init.c b/support/xpthread_attr_init.c deleted file mode 100644 index 2e30ade9ab..0000000000 --- a/support/xpthread_attr_init.c +++ /dev/null @@ -1,25 +0,0 @@ -/* pthread_attr_init with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_attr_init (pthread_attr_t *attr) -{ - xpthread_check_return ("pthread_attr_init", pthread_attr_init (attr)); -} diff --git a/support/xpthread_attr_setdetachstate.c b/support/xpthread_attr_setdetachstate.c deleted file mode 100644 index b544dbaa42..0000000000 --- a/support/xpthread_attr_setdetachstate.c +++ /dev/null @@ -1,27 +0,0 @@ -/* pthread_attr_setdetachstate with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_attr_setdetachstate (pthread_attr_t *attr, int detachstate) -{ - xpthread_check_return ("pthread_attr_setdetachstate", - pthread_attr_setdetachstate (attr, - detachstate)); -} diff --git a/support/xpthread_attr_setstacksize.c b/support/xpthread_attr_setstacksize.c deleted file mode 100644 index 02d06310a9..0000000000 --- a/support/xpthread_attr_setstacksize.c +++ /dev/null @@ -1,26 +0,0 @@ -/* pthread_attr_setstacksize with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize) -{ - xpthread_check_return ("pthread_attr_setstacksize", - pthread_attr_setstacksize (attr, stacksize)); -} diff --git a/support/xpthread_barrier_destroy.c b/support/xpthread_barrier_destroy.c deleted file mode 100644 index efc0719a63..0000000000 --- a/support/xpthread_barrier_destroy.c +++ /dev/null @@ -1,26 +0,0 @@ -/* pthread_barrier_destroy with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_barrier_destroy (pthread_barrier_t *barrier) -{ - xpthread_check_return ("pthread_barrier_destroy", - pthread_barrier_destroy (barrier)); -} diff --git a/support/xpthread_barrier_init.c b/support/xpthread_barrier_init.c deleted file mode 100644 index b32dad1315..0000000000 --- a/support/xpthread_barrier_init.c +++ /dev/null @@ -1,27 +0,0 @@ -/* pthread_barrier_init with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_barrier_init (pthread_barrier_t *barrier, - pthread_barrierattr_t *attr, unsigned int count) -{ - xpthread_check_return ("pthread_barrier_init", - pthread_barrier_init (barrier, attr, count)); -} diff --git a/support/xpthread_barrier_wait.c b/support/xpthread_barrier_wait.c deleted file mode 100644 index 7cee44d0a3..0000000000 --- a/support/xpthread_barrier_wait.c +++ /dev/null @@ -1,28 +0,0 @@ -/* pthread_barrier_wait with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -int -xpthread_barrier_wait (pthread_barrier_t *barrier) -{ - int ret = pthread_barrier_wait (barrier); - if (ret != 0 && ret != PTHREAD_BARRIER_SERIAL_THREAD) - xpthread_check_return ("pthread_barrier_wait", ret); - return ret == PTHREAD_BARRIER_SERIAL_THREAD; -} diff --git a/support/xpthread_cancel.c b/support/xpthread_cancel.c deleted file mode 100644 index 3af16f9b54..0000000000 --- a/support/xpthread_cancel.c +++ /dev/null @@ -1,25 +0,0 @@ -/* pthread_cancel with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_cancel (pthread_t thr) -{ - xpthread_check_return ("pthread_cancel", pthread_cancel (thr)); -} diff --git a/support/xpthread_check_return.c b/support/xpthread_check_return.c deleted file mode 100644 index 3094d82e9c..0000000000 --- a/support/xpthread_check_return.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Return value checking for pthread functions, exit variant. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -void -xpthread_check_return (const char *function, int value) -{ - if (value != 0) - { - errno = value; - FAIL_EXIT1 ("%s: %m", function); - } -} diff --git a/support/xpthread_cond_wait.c b/support/xpthread_cond_wait.c deleted file mode 100644 index b0e9b2a232..0000000000 --- a/support/xpthread_cond_wait.c +++ /dev/null @@ -1,26 +0,0 @@ -/* pthread_cond_wait with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex) -{ - xpthread_check_return - ("pthread_cond_wait", pthread_cond_wait (cond, mutex)); -} diff --git a/support/xpthread_create.c b/support/xpthread_create.c deleted file mode 100644 index 98c63e54c3..0000000000 --- a/support/xpthread_create.c +++ /dev/null @@ -1,29 +0,0 @@ -/* pthread_create with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -pthread_t -xpthread_create (pthread_attr_t *attr, - void *(*thread_func) (void *), void *closure) -{ - pthread_t thr; - xpthread_check_return - ("pthread_create", pthread_create (&thr, attr, thread_func, closure)); - return thr; -} diff --git a/support/xpthread_detach.c b/support/xpthread_detach.c deleted file mode 100644 index 2088af2f57..0000000000 --- a/support/xpthread_detach.c +++ /dev/null @@ -1,25 +0,0 @@ -/* pthread_detach with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_detach (pthread_t thr) -{ - xpthread_check_return ("pthread_detach", pthread_detach (thr)); -} diff --git a/support/xpthread_join.c b/support/xpthread_join.c deleted file mode 100644 index f23bb9a5ae..0000000000 --- a/support/xpthread_join.c +++ /dev/null @@ -1,27 +0,0 @@ -/* pthread_join with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void * -xpthread_join (pthread_t thr) -{ - void *result; - xpthread_check_return ("pthread_join", pthread_join (thr, &result)); - return result; -} diff --git a/support/xpthread_mutex_consistent.c b/support/xpthread_mutex_consistent.c deleted file mode 100644 index 52364be365..0000000000 --- a/support/xpthread_mutex_consistent.c +++ /dev/null @@ -1,26 +0,0 @@ -/* pthread_mutex_consistent with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_mutex_consistent (pthread_mutex_t *mutex) -{ - xpthread_check_return ("pthread_mutex_consistent", - pthread_mutex_consistent (mutex)); -} diff --git a/support/xpthread_mutex_destroy.c b/support/xpthread_mutex_destroy.c deleted file mode 100644 index f11f8f0acd..0000000000 --- a/support/xpthread_mutex_destroy.c +++ /dev/null @@ -1,26 +0,0 @@ -/* pthread_mutex_destroy with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_mutex_destroy (pthread_mutex_t *mutex) -{ - xpthread_check_return ("pthread_mutex_destroy", - pthread_mutex_destroy (mutex)); -} diff --git a/support/xpthread_mutex_init.c b/support/xpthread_mutex_init.c deleted file mode 100644 index 2d16d1b9d9..0000000000 --- a/support/xpthread_mutex_init.c +++ /dev/null @@ -1,26 +0,0 @@ -/* pthread_mutex_init with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr) -{ - xpthread_check_return ("pthread_mutex_init", - pthread_mutex_init (mutex, attr)); -} diff --git a/support/xpthread_mutex_lock.c b/support/xpthread_mutex_lock.c deleted file mode 100644 index af727b45f3..0000000000 --- a/support/xpthread_mutex_lock.c +++ /dev/null @@ -1,25 +0,0 @@ -/* pthread_mutex_lock with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_mutex_lock (pthread_mutex_t *mutex) -{ - xpthread_check_return ("pthread_mutex_lock", pthread_mutex_lock (mutex)); -} diff --git a/support/xpthread_mutex_unlock.c b/support/xpthread_mutex_unlock.c deleted file mode 100644 index 161b41edf6..0000000000 --- a/support/xpthread_mutex_unlock.c +++ /dev/null @@ -1,25 +0,0 @@ -/* pthread_mutex_unlock with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_mutex_unlock (pthread_mutex_t *mutex) -{ - xpthread_check_return ("pthread_mutex_unlock", pthread_mutex_unlock (mutex)); -} diff --git a/support/xpthread_mutexattr_destroy.c b/support/xpthread_mutexattr_destroy.c deleted file mode 100644 index c699e32b41..0000000000 --- a/support/xpthread_mutexattr_destroy.c +++ /dev/null @@ -1,26 +0,0 @@ -/* pthread_mutexattr_destroy with error checking. - Copyright (C) 2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_mutexattr_destroy (pthread_mutexattr_t *attr) -{ - xpthread_check_return ("pthread_mutexattr_destroy", - pthread_mutexattr_destroy (attr)); -} diff --git a/support/xpthread_mutexattr_init.c b/support/xpthread_mutexattr_init.c deleted file mode 100644 index fa93fab178..0000000000 --- a/support/xpthread_mutexattr_init.c +++ /dev/null @@ -1,25 +0,0 @@ -/* pthread_mutexattr_init with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_mutexattr_init (pthread_mutexattr_t *attr) -{ - xpthread_check_return ("pthread_mutexattr_init", pthread_mutexattr_init (attr)); -} diff --git a/support/xpthread_mutexattr_setprotocol.c b/support/xpthread_mutexattr_setprotocol.c deleted file mode 100644 index 353f75e3d7..0000000000 --- a/support/xpthread_mutexattr_setprotocol.c +++ /dev/null @@ -1,26 +0,0 @@ -/* pthread_mutexattr_setprotocol with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_mutexattr_setprotocol (pthread_mutexattr_t *attr, int flag) -{ - xpthread_check_return ("pthread_mutexattr_setprotocol", - pthread_mutexattr_setprotocol (attr, flag)); -} diff --git a/support/xpthread_mutexattr_setpshared.c b/support/xpthread_mutexattr_setpshared.c deleted file mode 100644 index 242da1aeca..0000000000 --- a/support/xpthread_mutexattr_setpshared.c +++ /dev/null @@ -1,26 +0,0 @@ -/* pthread_mutexattr_setpshared with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_mutexattr_setpshared (pthread_mutexattr_t *attr, int flag) -{ - xpthread_check_return ("pthread_mutexattr_setpshared", - pthread_mutexattr_setpshared (attr, flag)); -} diff --git a/support/xpthread_mutexattr_setrobust.c b/support/xpthread_mutexattr_setrobust.c deleted file mode 100644 index d7d6fa8630..0000000000 --- a/support/xpthread_mutexattr_setrobust.c +++ /dev/null @@ -1,26 +0,0 @@ -/* pthread_mutexattr_setrobust with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_mutexattr_setrobust (pthread_mutexattr_t *attr, int flag) -{ - xpthread_check_return ("pthread_mutexattr_setrobust", - pthread_mutexattr_setrobust (attr, flag)); -} diff --git a/support/xpthread_mutexattr_settype.c b/support/xpthread_mutexattr_settype.c deleted file mode 100644 index cf22170b56..0000000000 --- a/support/xpthread_mutexattr_settype.c +++ /dev/null @@ -1,26 +0,0 @@ -/* pthread_mutexattr_settype with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_mutexattr_settype (pthread_mutexattr_t *attr, int flag) -{ - xpthread_check_return ("pthread_mutexattr_settype", - pthread_mutexattr_settype (attr, flag)); -} diff --git a/support/xpthread_once.c b/support/xpthread_once.c deleted file mode 100644 index 70d58dbab2..0000000000 --- a/support/xpthread_once.c +++ /dev/null @@ -1,25 +0,0 @@ -/* pthread_once with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_once (pthread_once_t *guard, void (*func) (void)) -{ - xpthread_check_return ("pthread_once", pthread_once (guard, func)); -} diff --git a/support/xpthread_sigmask.c b/support/xpthread_sigmask.c deleted file mode 100644 index 0ba9ca02dc..0000000000 --- a/support/xpthread_sigmask.c +++ /dev/null @@ -1,34 +0,0 @@ -/* pthread_sigmask with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xsignal.h> -#include <support/support.h> - -#include <unistd.h> - -void -xpthread_sigmask (int how, const sigset_t *set, sigset_t *oldset) -{ - if (pthread_sigmask (how, set, oldset) != 0) - { - write_message ("error: pthread_setmask failed\n"); - /* Do not use exit because pthread_sigmask can be called from a - signal handler. */ - _exit (1); - } -} diff --git a/support/xpthread_spin_lock.c b/support/xpthread_spin_lock.c deleted file mode 100644 index 6975215b17..0000000000 --- a/support/xpthread_spin_lock.c +++ /dev/null @@ -1,25 +0,0 @@ -/* pthread_spin_lock with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_spin_lock (pthread_spinlock_t *lock) -{ - xpthread_check_return ("pthread_spin_lock", pthread_spin_lock (lock)); -} diff --git a/support/xpthread_spin_unlock.c b/support/xpthread_spin_unlock.c deleted file mode 100644 index 4f19a44c48..0000000000 --- a/support/xpthread_spin_unlock.c +++ /dev/null @@ -1,25 +0,0 @@ -/* pthread_spin_unlock with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xthread.h> - -void -xpthread_spin_unlock (pthread_spinlock_t *lock) -{ - xpthread_check_return ("pthread_spin_unlock", pthread_spin_unlock (lock)); -} diff --git a/support/xrealloc.c b/support/xrealloc.c deleted file mode 100644 index 00c313880c..0000000000 --- a/support/xrealloc.c +++ /dev/null @@ -1,32 +0,0 @@ -/* Error-checking wrapper for realloc. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/support.h> - -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> - -void * -xrealloc (void *p, size_t n) -{ - void *result = realloc (p, n); - if (result == NULL && (n > 0 || p == NULL)) - oom_error ("realloc", n); - return result; -} diff --git a/support/xrecvfrom.c b/support/xrecvfrom.c deleted file mode 100644 index 17809c4dd2..0000000000 --- a/support/xrecvfrom.c +++ /dev/null @@ -1,33 +0,0 @@ -/* recvfrom with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xsocket.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -size_t -xrecvfrom (int fd, void *buf, size_t buflen, int flags, - struct sockaddr *sa, socklen_t *salen) -{ - ssize_t ret = recvfrom (fd, buf, buflen, flags, sa, salen); - if (ret < 0) - FAIL_EXIT1 ("error: recvfrom (%d), %zu bytes buffer: %m", fd, buflen); - return ret; -} diff --git a/support/xsendto.c b/support/xsendto.c deleted file mode 100644 index 20bddf6965..0000000000 --- a/support/xsendto.c +++ /dev/null @@ -1,35 +0,0 @@ -/* sendto with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xsocket.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -void -xsendto (int fd, const void *buf, size_t buflen, int flags, - const struct sockaddr *sa, socklen_t salen) -{ - ssize_t ret = sendto (fd, buf, buflen, flags, sa, salen); - if (ret < 0) - FAIL_EXIT1 ("sendto (%d), %zu bytes, family %d: %m", - fd, buflen, sa->sa_family); - if (ret != buflen) - FAIL_EXIT1 ("sendto (%d) sent %zd bytes instead of %zu", fd, ret, buflen); -} diff --git a/support/xsetsockopt.c b/support/xsetsockopt.c deleted file mode 100644 index 9931882e75..0000000000 --- a/support/xsetsockopt.c +++ /dev/null @@ -1,31 +0,0 @@ -/* setsockopt with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xsocket.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -void -xsetsockopt (int fd, int level, int name, const void *val, socklen_t vallen) -{ - if (setsockopt (fd, level, name, val, vallen) != 0) - FAIL_EXIT1 ("setsockopt (%d, %d, %d), %zu bytes: %m", - fd, level, name, (size_t) vallen); -} diff --git a/support/xsignal.h b/support/xsignal.h deleted file mode 100644 index 3dc0d9d5ce..0000000000 --- a/support/xsignal.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Support functionality for using signals. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_SIGNAL_H -#define SUPPORT_SIGNAL_H - -#include <signal.h> -#include <sys/cdefs.h> - -__BEGIN_DECLS - -/* The following functions call the corresponding libpthread functions - and terminate the process on error. */ - -void xpthread_sigmask (int how, const sigset_t *set, sigset_t *oldset); - -__END_DECLS - -#endif /* SUPPORT_SIGNAL_H */ diff --git a/support/xsocket.c b/support/xsocket.c deleted file mode 100644 index c1deaee924..0000000000 --- a/support/xsocket.c +++ /dev/null @@ -1,32 +0,0 @@ -/* socket with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xsocket.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> - -int -xsocket (int domain, int type, int protocol) -{ - int fd = socket (domain, type, protocol); - if (fd < 0) - FAIL_EXIT1 ("socket (%d, %d, %d): %m\n", domain, type, protocol); - return fd; -} diff --git a/support/xsocket.h b/support/xsocket.h deleted file mode 100644 index d6724948d8..0000000000 --- a/support/xsocket.h +++ /dev/null @@ -1,39 +0,0 @@ -/* Error-checking wrappers for socket functions. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_XSOCKET_H -#define SUPPORT_XSOCKET_H - -#include <poll.h> -#include <sys/socket.h> -#include <sys/types.h> - -int xsocket (int, int, int); -void xsetsockopt (int, int, int, const void *, socklen_t); -void xgetsockname (int, struct sockaddr *, socklen_t *); -void xconnect (int, const struct sockaddr *, socklen_t); -void xbind (int, const struct sockaddr *, socklen_t); -void xlisten (int, int); -int xaccept (int, struct sockaddr *, socklen_t *); -int xaccept4 (int, struct sockaddr *, socklen_t *, int); -void xsendto (int, const void *, size_t, int, - const struct sockaddr *, socklen_t); -size_t xrecvfrom (int, void *, size_t, int, struct sockaddr *, socklen_t *); -int xpoll (struct pollfd *, nfds_t, int); - -#endif /* SUPPORT_XSOCKET_H */ diff --git a/support/xstdio.h b/support/xstdio.h deleted file mode 100644 index bcc2e863bf..0000000000 --- a/support/xstdio.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Error-checking wrappers for stdio functions. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_XSTDIO_H -#define SUPPORT_XSTDIO_H - -#include <stdio.h> -#include <sys/cdefs.h> - -__BEGIN_DECLS - -FILE *xfopen (const char *path, const char *mode); -void xfclose (FILE *); - -__END_DECLS - -#endif /* SUPPORT_XSTDIO_H */ diff --git a/support/xstrdup.c b/support/xstrdup.c deleted file mode 100644 index d6a8c04baf..0000000000 --- a/support/xstrdup.c +++ /dev/null @@ -1,30 +0,0 @@ -/* strdup with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/support.h> - -#include <string.h> - -char * -xstrdup (const char *s) -{ - char *p = strdup (s); - if (p == NULL) - oom_error ("strdup", strlen (s)); - return p; -} diff --git a/support/xthread.h b/support/xthread.h deleted file mode 100644 index 6dd7e709be..0000000000 --- a/support/xthread.h +++ /dev/null @@ -1,77 +0,0 @@ -/* Support functionality for using threads. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#ifndef SUPPORT_THREAD_H -#define SUPPORT_THREAD_H - -#include <pthread.h> -#include <sys/cdefs.h> - -__BEGIN_DECLS - -/* Terminate the process (with exit status 0) after SECONDS have - elapsed, from a helper thread. The process is terminated with the - exit function, so atexit handlers are executed. */ -void delayed_exit (int seconds); - -/* Terminate the process (with exit status 1) if VALUE is not zero. - In that case, print a failure message to standard output mentioning - FUNCTION. The process is terminated with the exit function, so - atexit handlers are executed. */ -void xpthread_check_return (const char *function, int value); - -/* The following functions call the corresponding libpthread functions - and terminate the process on error. */ - -void xpthread_barrier_init (pthread_barrier_t *barrier, - pthread_barrierattr_t *attr, unsigned int count); -void xpthread_barrier_destroy (pthread_barrier_t *barrier); -void xpthread_mutexattr_destroy (pthread_mutexattr_t *); -void xpthread_mutexattr_init (pthread_mutexattr_t *); -void xpthread_mutexattr_setprotocol (pthread_mutexattr_t *, int); -void xpthread_mutexattr_setpshared (pthread_mutexattr_t *, int); -void xpthread_mutexattr_setrobust (pthread_mutexattr_t *, int); -void xpthread_mutexattr_settype (pthread_mutexattr_t *, int); -void xpthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *); -void xpthread_mutex_destroy (pthread_mutex_t *); -void xpthread_mutex_lock (pthread_mutex_t *mutex); -void xpthread_mutex_unlock (pthread_mutex_t *mutex); -void xpthread_mutex_consistent (pthread_mutex_t *); -void xpthread_spin_lock (pthread_spinlock_t *lock); -void xpthread_spin_unlock (pthread_spinlock_t *lock); -void xpthread_cond_wait (pthread_cond_t * cond, pthread_mutex_t * mutex); -pthread_t xpthread_create (pthread_attr_t *attr, - void *(*thread_func) (void *), void *closure); -void xpthread_detach (pthread_t thr); -void xpthread_cancel (pthread_t thr); -void *xpthread_join (pthread_t thr); -void xpthread_once (pthread_once_t *guard, void (*func) (void)); -void xpthread_attr_destroy (pthread_attr_t *attr); -void xpthread_attr_init (pthread_attr_t *attr); -void xpthread_attr_setdetachstate (pthread_attr_t *attr, - int detachstate); -void xpthread_attr_setstacksize (pthread_attr_t *attr, - size_t stacksize); - -/* This function returns non-zero if pthread_barrier_wait returned - PTHREAD_BARRIER_SERIAL_THREAD. */ -int xpthread_barrier_wait (pthread_barrier_t *barrier); - -__END_DECLS - -#endif /* SUPPORT_THREAD_H */ diff --git a/support/xunistd.h b/support/xunistd.h deleted file mode 100644 index 151d743e1f..0000000000 --- a/support/xunistd.h +++ /dev/null @@ -1,56 +0,0 @@ -/* POSIX-specific extra functions. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -/* These wrapper functions use POSIX types and therefore cannot be - declared in <support/support.h>. */ - -#ifndef SUPPORT_XUNISTD_H -#define SUPPORT_XUNISTD_H - -#include <sys/cdefs.h> -#include <sys/types.h> -#include <unistd.h> - -__BEGIN_DECLS - -struct stat64; - -pid_t xfork (void); -pid_t xwaitpid (pid_t, int *status, int flags); -void xpipe (int[2]); -void xdup2 (int, int); -int xopen (const char *path, int flags, mode_t); -void xstat (const char *path, struct stat64 *); -void xmkdir (const char *path, mode_t); -void xchroot (const char *path); - -/* Close the file descriptor. Ignore EINTR errors, but terminate the - process on other errors. */ -void xclose (int); - -/* Write the buffer. Retry on short writes. */ -void xwrite (int, const void *, size_t); - -/* Invoke mmap with a zero file offset. */ -void *xmmap (void *addr, size_t length, int prot, int flags, int fd); - -void xmunmap (void *addr, size_t length); - -__END_DECLS - -#endif /* SUPPORT_XUNISTD_H */ diff --git a/support/xwaitpid.c b/support/xwaitpid.c deleted file mode 100644 index 204795e4c0..0000000000 --- a/support/xwaitpid.c +++ /dev/null @@ -1,33 +0,0 @@ -/* waitpid with error checking. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xunistd.h> - -#include <stdio.h> -#include <stdlib.h> -#include <support/check.h> -#include <sys/wait.h> - -int -xwaitpid (int pid, int *status, int flags) -{ - pid_t result = waitpid (pid, status, flags); - if (result < 0) - FAIL_EXIT1 ("waitpid: %m\n"); - return result; -} diff --git a/support/xwrite.c b/support/xwrite.c deleted file mode 100644 index 134e8ee4c1..0000000000 --- a/support/xwrite.c +++ /dev/null @@ -1,39 +0,0 @@ -/* write with error checking and retries. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - 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 - <http://www.gnu.org/licenses/>. */ - -#include <support/xunistd.h> - -#include <support/check.h> - -void -xwrite (int fd, const void *buffer, size_t length) -{ - const char *p = buffer; - const char *end = p + length; - while (p < end) - { - ssize_t ret = write (fd, p, end - p); - if (ret < 0) - FAIL_EXIT1 ("write of %zu bytes failed after %td: %m", - length, p - (const char *) buffer); - if (ret == 0) - FAIL_EXIT1 ("write return 0 after writing %td bytes of %zu", - p - (const char *) buffer, length); - p += ret; - } -} |