summaryrefslogtreecommitdiff
path: root/test/signal
diff options
context:
space:
mode:
Diffstat (limited to 'test/signal')
-rw-r--r--test/signal/.indent.pro33
-rw-r--r--test/signal/Makefile8
-rw-r--r--test/signal/Makefile.in6
-rw-r--r--test/signal/sigchld.c68
-rw-r--r--test/signal/signal.c95
-rw-r--r--test/signal/tst-raise.c62
-rw-r--r--test/signal/tst-signal.c44
-rw-r--r--test/signal/tst-signalfd.c63
-rw-r--r--test/signal/tst-sigset.c45
-rw-r--r--test/signal/tst-sigsimple.c56
10 files changed, 480 insertions, 0 deletions
diff --git a/test/signal/.indent.pro b/test/signal/.indent.pro
new file mode 100644
index 0000000..492ecf1
--- /dev/null
+++ b/test/signal/.indent.pro
@@ -0,0 +1,33 @@
+--blank-lines-after-declarations
+--blank-lines-after-procedures
+--break-before-boolean-operator
+--no-blank-lines-after-commas
+--braces-on-if-line
+--braces-on-struct-decl-line
+--comment-indentation25
+--declaration-comment-column25
+--no-comment-delimiters-on-blank-lines
+--cuddle-else
+--continuation-indentation4
+--case-indentation0
+--else-endif-column33
+--space-after-cast
+--line-comments-indentation0
+--declaration-indentation1
+--dont-format-first-column-comments
+--dont-format-comments
+--honour-newlines
+--indent-level4
+/* changed from 0 to 4 */
+--parameter-indentation4
+--line-length78 /* changed from 75 */
+--continue-at-parentheses
+--no-space-after-function-call-names
+--dont-break-procedure-type
+--dont-star-comments
+--leave-optional-blank-lines
+--dont-space-special-semicolon
+--tab-size4
+/* additions by Mark */
+--case-brace-indentation0
+--leave-preprocessor-space
diff --git a/test/signal/Makefile b/test/signal/Makefile
new file mode 100644
index 0000000..c2afb5f
--- /dev/null
+++ b/test/signal/Makefile
@@ -0,0 +1,8 @@
+# uClibc signal tests
+# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+
+top_builddir=../../
+top_srcdir=../../
+include ../Rules.mak
+-include Makefile.in
+include ../Test.mak
diff --git a/test/signal/Makefile.in b/test/signal/Makefile.in
new file mode 100644
index 0000000..c8e2545
--- /dev/null
+++ b/test/signal/Makefile.in
@@ -0,0 +1,6 @@
+# uClibc signal tests
+# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+
+ifeq ($(UCLIBC_HAS_OBSOLETE_BSD_SIGNAL),)
+TESTS_DISABLED := tst-sigsimple
+endif
diff --git a/test/signal/sigchld.c b/test/signal/sigchld.c
new file mode 100644
index 0000000..22febac
--- /dev/null
+++ b/test/signal/sigchld.c
@@ -0,0 +1,68 @@
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <sys/signal.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+
+#ifdef __ARCH_USE_MMU__
+
+static void test_handler(int signo)
+{
+ write(1, "caught SIGCHLD\n", 15);
+ return;
+}
+
+int main(void)
+{
+ pid_t mypid;
+ struct sigaction siga;
+ static sigset_t set;
+
+ /* Set up sighandling */
+ sigfillset(&set);
+ siga.sa_handler = test_handler;
+ siga.sa_mask = set;
+ siga.sa_flags = 0;
+ if (sigaction(SIGCHLD, &siga, (struct sigaction *)NULL) != 0) {
+ fprintf(stderr, "sigaction choked: %s!", strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ /* Setup a child process to exercise the sig handling for us */
+ mypid = getpid();
+ if (fork() == 0) {
+ int i;
+
+ for (i=0; i < 3; i++) {
+ sleep(2);
+ kill(mypid, SIGCHLD);
+ }
+ _exit(EXIT_SUCCESS);
+ }
+
+
+ /* Wait for signals */
+ write(1, "waiting for a SIGCHLD\n",22);
+ for(;;) {
+ sleep(10);
+ if (waitpid(-1, NULL, WNOHANG | WUNTRACED) > 0)
+ break;
+ write(1, "after sleep\n", 12);
+ }
+
+ printf("Bye-bye! All done!\n");
+ return 0;
+}
+
+#else
+
+int main(void)
+{
+ printf("Skipping test on non-mmu host!\n");
+ return 0;
+}
+
+#endif
diff --git a/test/signal/signal.c b/test/signal/signal.c
new file mode 100644
index 0000000..01d1a78
--- /dev/null
+++ b/test/signal/signal.c
@@ -0,0 +1,95 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * signal testing function for uClibc
+ * Copyright (C) 2000-2006 by Erik Andersen <andersen@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+#endif
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <fcntl.h>
+#include <signal.h>
+
+
+/* -------------------------------------------------*/
+/* This stuff is common to all the testing routines */
+/* -------------------------------------------------*/
+const char *it = "<UNSET>"; /* Routine name for message routines. */
+size_t errors = 0;
+
+static void check(int thing, int number)
+{
+ if (!thing) {
+ printf("%s: flunked test %d\n", it, number);
+ ++errors;
+ }
+}
+
+#if 0
+static void equal(const char *a, const char *b, int number)
+{
+ check(a != NULL && b != NULL && (strcmp(a, b) == 0), number);
+}
+#endif
+
+
+/* -------------------------------------------------*/
+/* Let the tests begin.... */
+/* -------------------------------------------------*/
+
+int global_int = 0;
+
+static void set_global_int_to_one(int signum)
+{
+ printf ("Received signal %d (%s).\n", signum, strsignal(signum));
+ global_int = 1;
+ return;
+}
+
+static void signal_test_1(void)
+{
+ global_int = 0;
+
+ it = "global variable set from signal handler";
+ if (signal(SIGUSR1, set_global_int_to_one) == SIG_ERR) {
+ perror("signal(SIGUSR1) failed");
+ exit(-1);
+ }
+ raise(SIGUSR1);
+
+ /* This should already have jumped to the signal handler */
+ check((global_int == 1), 1);
+
+ global_int = 0;
+ if (signal(SIGUSR1, SIG_IGN) == SIG_ERR) {
+ perror("signal(SIGUSR1) failed");
+ exit(-1);
+ }
+ raise(SIGUSR1);
+ /* This should not go to the signal handler this time since we */
+ check((global_int == 0), 1);
+}
+
+
+int main(void)
+{
+ int status;
+
+ signal_test_1();
+
+ if (errors == 0) {
+ status = EXIT_SUCCESS;
+ printf("No errors.\n");
+ } else {
+ status = EXIT_FAILURE;
+ printf("%lu errors.\n", (unsigned long)errors);
+ }
+ exit(status);
+}
diff --git a/test/signal/tst-raise.c b/test/signal/tst-raise.c
new file mode 100644
index 0000000..534ae71
--- /dev/null
+++ b/test/signal/tst-raise.c
@@ -0,0 +1,62 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
+
+ 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 <string.h>
+#include <error.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+volatile int count;
+
+static void
+sh (int sig)
+{
+ ++count;
+}
+
+int
+main (void)
+{
+ struct sigaction sa;
+ sa.sa_handler = sh;
+ sigemptyset (&sa.sa_mask);
+ sa.sa_flags = 0;
+ if (sigaction (SIGUSR1, &sa, NULL) < 0)
+ {
+ printf ("sigaction failed: %s\n", strerror(errno));
+ exit (1);
+ }
+ if (raise (SIGUSR1) < 0)
+ {
+ printf ("first raise failed: %s\n", strerror(errno));
+ exit (1);
+ }
+ if (raise (SIGUSR1) < 0)
+ {
+ printf ("second raise failed: %s\n", strerror(errno));
+ exit (1);
+ }
+ if (count != 2)
+ {
+ printf ("signal handler not called 2 times\n");
+ exit (1);
+ }
+ exit (0);
+}
diff --git a/test/signal/tst-signal.c b/test/signal/tst-signal.c
new file mode 100644
index 0000000..6d31787
--- /dev/null
+++ b/test/signal/tst-signal.c
@@ -0,0 +1,44 @@
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int win = 0;
+
+static void
+handler (int sig)
+{
+ printf ("Received signal %d (%s).\n", sig, strsignal(sig));
+ win = 1;
+}
+
+int
+main (void)
+{
+ if (signal (SIGTERM, handler) == SIG_ERR)
+ {
+ perror ("signal: SIGTERM");
+ exit (EXIT_FAILURE);
+ }
+
+ puts ("Set handler.");
+
+ printf ("Sending myself signal %d.\n", SIGTERM);
+ fflush (stdout);
+
+ if (raise (SIGTERM) < 0)
+ {
+ perror ("raise: SIGTERM");
+ exit (EXIT_FAILURE);
+ }
+
+ if (!win)
+ {
+ puts ("Didn't get any signal. Test FAILED!");
+ exit (EXIT_FAILURE);
+ }
+
+ puts ("Got a signal. Test succeeded.");
+
+ return EXIT_SUCCESS;
+}
diff --git a/test/signal/tst-signalfd.c b/test/signal/tst-signalfd.c
new file mode 100644
index 0000000..1fbb748
--- /dev/null
+++ b/test/signal/tst-signalfd.c
@@ -0,0 +1,63 @@
+/* vi: set sw=4 ts=4 sts=4: */
+/*
+ * signalfd test for uClibc
+ * Copyright (C) 2012 by Kevin Cernekee <cernekee@gmail.com>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <error.h>
+#include <signal.h>
+#include <sys/signalfd.h>
+#include <sys/fcntl.h>
+
+static int
+do_test(void)
+{
+ int fd, ret, result = 0;
+ struct signalfd_siginfo ssi;
+ sigset_t mask;
+
+ sigemptyset(&mask);
+ sigaddset(&mask, SIGUSR1);
+ sigprocmask(SIG_BLOCK, &mask, NULL);
+
+ fd = signalfd(-1, &mask, SFD_NONBLOCK);
+ if (fd < 0) {
+ printf("signalfd() failed: %s\n", strerror(errno));
+ result = 1;
+ }
+
+ /* this should return immediately with EAGAIN due to SFD_NONBLOCK */
+ memset(&ssi, 0, sizeof(ssi));
+ ret = read(fd, &ssi, sizeof(ssi));
+ if (ret != -1 || errno != EAGAIN) {
+ error(0, 0, "first read() returned %d", ret);
+ result = 1;
+ }
+
+ kill(getpid(), SIGUSR1);
+
+ /* this should return a struct ssi indicating receipt of SIGUSR1 */
+ ret = read(fd, &ssi, sizeof(ssi));
+ if (ret != sizeof(ssi)) {
+ error(0, 0, "second read() returned %d", ret);
+ result = 1;
+ }
+
+ if (ssi.ssi_signo != SIGUSR1) {
+ error(0, 0, "ssi contains bogus signo");
+ result = 1;
+ }
+
+ return result;
+}
+
+#define TIMEOUT 5
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/test/signal/tst-sigset.c b/test/signal/tst-sigset.c
new file mode 100644
index 0000000..bc1b057
--- /dev/null
+++ b/test/signal/tst-sigset.c
@@ -0,0 +1,45 @@
+/* Test sig*set functions. */
+
+#include <signal.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+
+#define TEST_FUNCTION do_test ()
+static int
+do_test (void)
+{
+ int result = 0;
+ int sig = -1;
+
+#define TRY(call) \
+ if (call) \
+ { \
+ printf ("%s (sig = %d): %s\n", #call, sig, strerror(errno)); \
+ result = 1; \
+ } \
+ else
+
+
+ sigset_t set;
+ TRY (sigemptyset (&set) != 0);
+
+#ifdef SIGRTMAX
+ int max_sig = SIGRTMAX;
+#else
+ int max_sig = NSIG - 1;
+#endif
+
+ for (sig = 1; sig <= max_sig; ++sig)
+ {
+ TRY (sigismember (&set, sig) != 0);
+ TRY (sigaddset (&set, sig) != 0);
+ TRY (sigismember (&set, sig) == 0);
+ TRY (sigdelset (&set, sig) != 0);
+ TRY (sigismember (&set, sig) != 0);
+ }
+
+ return result;
+}
+
+#include "../test-skeleton.c"
diff --git a/test/signal/tst-sigsimple.c b/test/signal/tst-sigsimple.c
new file mode 100644
index 0000000..80220ee
--- /dev/null
+++ b/test/signal/tst-sigsimple.c
@@ -0,0 +1,56 @@
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
+
+ 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 <signal.h>
+#include <stdio.h>
+#include <string.h>
+
+
+static int
+do_test (void)
+{
+ int result = 0;
+ int e;
+
+#define RUN(test) \
+ errno = 0; \
+ e = test; \
+ if (e != -1) \
+ { \
+ printf ("%s returned %d\n", #test, e); \
+ result = 1; \
+ } \
+ else if (errno != EINVAL) \
+ { \
+ printf ("%s didn't set errno to EINVAL (%s instead)\n", \
+ #test, strerror (errno)); \
+ result = 1; \
+ }
+
+ RUN (sighold (-1));
+ RUN (sighold (_NSIG + 100));
+
+ RUN (sigrelse (-1));
+ RUN (sigrelse (_NSIG + 100));
+
+ return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"