summaryrefslogtreecommitdiffstats
path: root/testsuites
diff options
context:
space:
mode:
authorJoel Sherrill <joel@rtems.org>2019-10-02 16:49:00 -0500
committerJoel Sherrill <joel@rtems.org>2019-10-08 14:25:41 -0500
commit667501a314ba75f80f1c13c6b43dd35d0a00efd1 (patch)
treeec786d34150d19f7aac04b2653fa356c6a696de2 /testsuites
parenttermios04/init.c: Remove dead copy of change_iflag() (diff)
downloadrtems-667501a314ba75f80f1c13c6b43dd35d0a00efd1.tar.bz2
termios: Add Capability to Generate SIGINTR and SIGQUIT
This patch adds the ability for termios to send SIGINTR on receipt of VINTR and SIGQUIT for VKILL and return -1/EINTR from read() on a termios channel. Importantly, this patch does not alter the default behavior or force POSIX signal code in just because termios is used. The application must explicitly enable the POSIX behavior of generating a signal upon receipt of these characters. This is discussed in the POSIX standard: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap11.html Closes #3800.
Diffstat (limited to 'testsuites')
-rw-r--r--testsuites/libtests/Makefile.am22
-rw-r--r--testsuites/libtests/configure.ac2
-rw-r--r--testsuites/libtests/termios10/init.c191
-rw-r--r--testsuites/libtests/termios10/termios10.doc23
-rw-r--r--testsuites/libtests/termios10/termios10.scn14
-rw-r--r--testsuites/libtests/termios11/termios11.doc23
-rw-r--r--testsuites/libtests/termios11/termios11.scn14
7 files changed, 288 insertions, 1 deletions
diff --git a/testsuites/libtests/Makefile.am b/testsuites/libtests/Makefile.am
index 1b80283123..20a5a6fc5e 100644
--- a/testsuites/libtests/Makefile.am
+++ b/testsuites/libtests/Makefile.am
@@ -1489,7 +1489,27 @@ lib_screens += termios09/termios09.scn
lib_docs += termios09/termios09.doc
termios09_SOURCES = termios09/init.c
termios09_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_termios09) \
- $(support_includes)
+ $(support_includes)
+endif
+
+if TEST_termios10
+lib_tests += termios10
+lib_screens += termios10/termios10.scn
+lib_docs += termios10/termios10.doc
+termios10_SOURCES = termios10/init.c
+termios10_SOURCES += termios03/termios_testdriver_polled.c
+termios10_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_termios10) \
+ $(support_includes) -I$(top_srcdir)/termios03
+endif
+
+if TEST_termios11
+lib_tests += termios11
+lib_screens += termios11/termios11.scn
+lib_docs += termios11/termios11.doc
+termios11_SOURCES = termios10/init.c
+termios11_SOURCES += termios04/termios_testdriver_intr.c
+termios11_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_termios11) \
+ $(support_includes) -I$(top_srcdir)/termios04 -DINTERRUPT_DRIVEN
endif
if TEST_top
diff --git a/testsuites/libtests/configure.ac b/testsuites/libtests/configure.ac
index c02b42a5f9..4d0707c219 100644
--- a/testsuites/libtests/configure.ac
+++ b/testsuites/libtests/configure.ac
@@ -225,6 +225,8 @@ RTEMS_TEST_CHECK([termios06])
RTEMS_TEST_CHECK([termios07])
RTEMS_TEST_CHECK([termios08])
RTEMS_TEST_CHECK([termios09])
+RTEMS_TEST_CHECK([termios10])
+RTEMS_TEST_CHECK([termios11])
RTEMS_TEST_CHECK([top])
RTEMS_TEST_CHECK([ttest01])
RTEMS_TEST_CHECK([tztest])
diff --git a/testsuites/libtests/termios10/init.c b/testsuites/libtests/termios10/init.c
new file mode 100644
index 0000000000..ca5de97f24
--- /dev/null
+++ b/testsuites/libtests/termios10/init.c
@@ -0,0 +1,191 @@
+/*
+ * COPYRIGHT (c) 1989-2012,2019.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tmacros.h>
+#include "test_support.h"
+
+#ifdef INTERRUPT_DRIVEN
+#include "termios_testdriver_intr.h"
+const char rtems_test_name[] = "TERMIOS 11 -- Interrupt driven";
+#else
+#include "termios_testdriver_polled.h"
+const char rtems_test_name[] = "TERMIOS 10 -- Polled";
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <signal.h>
+#include <termios.h>
+#include <rtems/dumpbuf.h>
+#include <rtems/libio.h>
+
+int Test_fd;
+
+static void open_it(void)
+{
+ Test_fd = open( TERMIOS_TEST_DRIVER_DEVICE_NAME, O_RDWR );
+ rtems_test_assert( Test_fd != -1 );
+}
+
+static void change_lflag( const char *desc, int mask, int new )
+{
+ int rc;
+ struct termios attr;
+
+ if (desc) {
+ printf( "Changing c_lflag to: %s\n", desc );
+ }
+
+ rc = tcgetattr( Test_fd, &attr );
+ rtems_test_assert( rc == 0 );
+
+ attr.c_lflag &= ~mask;
+ attr.c_lflag |= new;
+
+ rc = tcsetattr( Test_fd, TCSANOW, &attr );
+ rtems_test_assert( rc == 0 );
+}
+
+
+static void read_it(ssize_t expected, int expected_intr)
+{
+ ssize_t rc;
+ char buf[32];
+
+ rtems_test_assert( expected <= sizeof(buf) );
+
+ rc = read( Test_fd, buf, expected );
+ if (expected_intr) {
+ rtems_test_assert( rc == -1 );
+ rtems_test_assert( errno == EINTR );
+ } else {
+ if ( expected != rc )
+ printf( "ERROR - expected=%zd rc=%zd\n", expected, rc );
+ rtems_test_assert( expected == rc );
+ }
+}
+
+static void close_it(void)
+{
+ int rc;
+
+ rc = close( Test_fd );
+ rtems_test_assert( rc == 0 );
+}
+
+volatile int sigint_occurred = 0;
+volatile int sigquit_occurred = 0;
+
+static void sigint_handler(int signo)
+{
+ rtems_test_assert(signo == SIGINT);
+ sigint_occurred = 1;
+}
+
+static void sigquit_handler(int signo)
+{
+ rtems_test_assert(signo == SIGQUIT);
+ sigquit_occurred = 1;
+}
+
+static void test_read_for_signal(
+ const char *description,
+ int isig_value,
+ char c,
+ int sigint_expected,
+ int sigquit_expected
+)
+{
+ char expected[3];
+
+ printf("Test read for %s\n", description);
+
+ expected[0] = c;
+ expected[1] = '\n'; /* in canonical mode, so need \n for read to return */
+ expected[2] = '\0';
+
+ sigint_occurred = 0;
+ sigquit_occurred = 0;
+
+ open_it();
+
+ change_lflag(NULL, ISIG, isig_value);
+
+ termios_test_driver_set_rx( expected, 2 );
+
+ read_it(1, (sigint_expected || sigquit_expected));
+
+ rtems_test_assert(sigint_occurred == sigint_expected);
+ rtems_test_assert(sigquit_occurred == sigquit_expected);
+ close_it();
+}
+
+/*
+ * Use a POSIX init thread so signals are enabled.
+ */
+static void *POSIX_Init(void *argument)
+{
+ int rc;
+
+ TEST_BEGIN();
+
+ signal(SIGINT, sigint_handler);
+ signal(SIGQUIT, sigquit_handler);
+
+ puts( "Exercise default ISIG handler with ISIG enabled");
+ test_read_for_signal("VKILL - no signals", ISIG, '\003', 0, 0);
+ test_read_for_signal("VQUIT - no signals", ISIG, '\034', 0, 0);
+
+ puts( "Exercise POSIX ISIG handler with ISIG enabled");
+ rc = rtems_termios_register_isig_handler(rtems_termios_posix_isig_handler);
+ rtems_test_assert( rc == 0 );
+ test_read_for_signal("VKILL - signal caught", ISIG, '\003', 1, 0);
+ test_read_for_signal("VQUIT - signal caught", ISIG, '\034', 0, 1);
+
+ puts( "Exercise default ISIG handler with ISIG enabled");
+ rc = rtems_termios_register_isig_handler(rtems_termios_default_isig_handler);
+ rtems_test_assert( rc == 0 );
+ test_read_for_signal("VKILL - signal caught", ISIG, '\003', 0, 0);
+ test_read_for_signal("VQUIT - signal caught", ISIG, '\034', 0, 0);
+
+ puts( "Exercise POSIX ISIG handler with ISIG disabled");
+ rc = rtems_termios_register_isig_handler(rtems_termios_posix_isig_handler);
+ rtems_test_assert( rc == 0 );
+ test_read_for_signal("VKILL - signal caught", 0, '\003', 0, 0);
+ test_read_for_signal("VQUIT - signal caught", 0, '\034', 0, 0);
+
+ TEST_END();
+
+ rtems_test_exit(0);
+}
+
+/* configuration information */
+
+#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+#define CONFIGURE_APPLICATION_EXTRA_DRIVERS \
+ TERMIOS_TEST_DRIVER_TABLE_ENTRY
+
+/* we need to be able to open the test device */
+#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4
+#define CONFIGURE_MAXIMUM_POSIX_THREADS 1
+#define CONFIGURE_MAXIMUM_TIMERS 2
+#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_INIT
+
+#include <rtems/confdefs.h>
+/* end of file */
diff --git a/testsuites/libtests/termios10/termios10.doc b/testsuites/libtests/termios10/termios10.doc
new file mode 100644
index 0000000000..c98e5ca8b1
--- /dev/null
+++ b/testsuites/libtests/termios10/termios10.doc
@@ -0,0 +1,23 @@
+# COPYRIGHT (c) 2019.
+# On-Line Applications Research Corporation (OAR).
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+
+test name: termios10
+
+directives:
+ rtems_termios_register_isig_handler
+
+concepts:
+
++ Verifies signals are not delivered on QUIT and INTR characters
+ as default behavior.
+
++ Verified that signals are delivered when QUIT or INTR characters
+ are entered after rtems_termios_posix_isig_handler()
+ is registered using rtems_termios_register_isig_handler().
+
++ Verifies signals are not delivered on QUIT and INTR characters
+ after the default handler rtems_termios_default_isig_handler()
+ is registered using rtems_termios_register_isig_handler().
diff --git a/testsuites/libtests/termios10/termios10.scn b/testsuites/libtests/termios10/termios10.scn
new file mode 100644
index 0000000000..198752850e
--- /dev/null
+++ b/testsuites/libtests/termios10/termios10.scn
@@ -0,0 +1,14 @@
+*** BEGIN OF TEST TERMIOS 10 -- Polled ***
+Exercise default ISIG handler with ISIG enabled
+Test read for VKILL - no signals
+Test read for VQUIT - no signals
+Exercise POSIX ISIG handler with ISIG enabled
+Test read for VKILL - signal caught
+Test read for VQUIT - signal caught
+Exercise default ISIG handler with ISIG enabled
+Test read for VKILL - signal caught
+Test read for VQUIT - signal caught
+Exercise POSIX ISIG handler with ISIG disabled
+Test read for VKILL - signal caught
+Test read for VQUIT - signal caught
+*** END OF TEST TERMIOS 10 -- Polled ***
diff --git a/testsuites/libtests/termios11/termios11.doc b/testsuites/libtests/termios11/termios11.doc
new file mode 100644
index 0000000000..c98e5ca8b1
--- /dev/null
+++ b/testsuites/libtests/termios11/termios11.doc
@@ -0,0 +1,23 @@
+# COPYRIGHT (c) 2019.
+# On-Line Applications Research Corporation (OAR).
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+
+test name: termios10
+
+directives:
+ rtems_termios_register_isig_handler
+
+concepts:
+
++ Verifies signals are not delivered on QUIT and INTR characters
+ as default behavior.
+
++ Verified that signals are delivered when QUIT or INTR characters
+ are entered after rtems_termios_posix_isig_handler()
+ is registered using rtems_termios_register_isig_handler().
+
++ Verifies signals are not delivered on QUIT and INTR characters
+ after the default handler rtems_termios_default_isig_handler()
+ is registered using rtems_termios_register_isig_handler().
diff --git a/testsuites/libtests/termios11/termios11.scn b/testsuites/libtests/termios11/termios11.scn
new file mode 100644
index 0000000000..d4c379832b
--- /dev/null
+++ b/testsuites/libtests/termios11/termios11.scn
@@ -0,0 +1,14 @@
+*** BEGIN OF TEST TERMIOS 11 -- Interrupt driven ***
+Exercise default ISIG handler with ISIG enabled
+Test read for VKILL - no signals
+Test read for VQUIT - no signals
+Exercise POSIX ISIG handler with ISIG enabled
+Test read for VKILL - signal caught
+Test read for VQUIT - signal caught
+Exercise default ISIG handler with ISIG enabled
+Test read for VKILL - signal caught
+Test read for VQUIT - signal caught
+Exercise POSIX ISIG handler with ISIG disabled
+Test read for VKILL - signal caught
+Test read for VQUIT - signal caught
+*** END OF TEST TERMIOS 11 -- Interrupt driven ***