[LTP] [PATCH v2 2/3] syscalls/pause02: Refactor into new API
Ricardo B. Marlière
ricardo@marliere.net
Tue Feb 18 19:07:18 CET 2025
From: Ricardo B. Marlière <rbm@suse.com>
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
testcases/kernel/syscalls/pause/pause02.c | 150 ++++++------------------------
1 file changed, 27 insertions(+), 123 deletions(-)
diff --git a/testcases/kernel/syscalls/pause/pause02.c b/testcases/kernel/syscalls/pause/pause02.c
index 0853232fd07b2c6278049dd4472a1ee8e7ab7646..749757d90b471ae65e2880519a396d4fae6ae8f6 100644
--- a/testcases/kernel/syscalls/pause/pause02.c
+++ b/testcases/kernel/syscalls/pause/pause02.c
@@ -1,147 +1,51 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) International Business Machines Corp., 2001
* Copyright (c) 2012 Cyril Hrubis <chrubis@suse.cz>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Copyright (c) 2025 Ricardo B. Marlière <rbm@suse.com>
*/
-/*
+/*\
* Verify that, pause() returns -1 and sets errno to EINTR after receipt of a
* signal which is caught by the calling process. Also, verify that the calling
* process will resume execution from the point of suspension.
*/
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/wait.h>
-
-#include "test.h"
-
-char *TCID = "pause02";
-int TST_TOTAL = 1;
-static pid_t cpid;
+#include "tst_test.h"
-static void do_child(void);
-static void setup(void);
-static void cleanup(void);
-
-int main(int ac, char **av)
-{
- int lc;
- int status;
-
- tst_parse_opts(ac, av, NULL, NULL);
-
- setup();
-
- for (lc = 0; TEST_LOOPING(lc); lc++) {
- tst_count = 0;
-
- cpid = tst_fork();
- switch (cpid) {
- case -1:
- tst_brkm(TBROK, cleanup, "fork() failed");
- break;
- case 0:
- do_child();
- break;
- default:
- break;
- }
-
- /*
- * Wait for child to enter pause().
- */
- TST_PROCESS_STATE_WAIT(cleanup, cpid, 'S');
-
- /*
- * Send the SIGINT signal now, so that child
- * returns from pause and resumes execution.
- */
- kill(cpid, SIGINT);
-
- wait(&status);
-
- if (WIFEXITED(status)) {
- if (WEXITSTATUS(status) == 0)
- tst_resm(TPASS, "pause was interrupted correctly");
- else
- tst_resm(TFAIL, "pause was interrupted but the "
- "retval and/or errno was wrong");
- continue;
- }
-
- if (WIFSIGNALED(status)) {
- switch (WTERMSIG(status)) {
- case SIGALRM:
- tst_resm(TFAIL, "Timeout: SIGINT wasn't received by child");
- break;
- default:
- tst_resm(TFAIL, "Child killed by signal");
- }
-
- continue;
- }
-
- tst_resm(TFAIL, "Pause was not interrupted");
- }
-
- cleanup();
- tst_exit();
-}
-
-static void sig_handle(int sig)
+static void sig_handler(int sig LTP_ATTRIBUTE_UNUSED)
{
}
static void do_child(void)
{
- /* avoid LTP framework to do whatever it likes */
- signal(SIGALRM, SIG_DFL);
-
- if (signal(SIGINT, sig_handle) == SIG_ERR) {
- fprintf(stderr, "Child: Failed to setup signal handler\n");
- exit(1);
- }
-
- /* Commit suicide after 10 seconds */
+ SAFE_SIGNAL(SIGALRM, SIG_DFL);
+ SAFE_SIGNAL(SIGINT, sig_handler);
alarm(10);
+ TST_EXP_FAIL(pause(), EINTR);
+}
- TEST(pause());
-
- if (TEST_RETURN == -1) {
- if (TEST_ERRNO == EINTR)
- exit(0);
+void run(void)
+{
+ int status;
+ pid_t pid;
- fprintf(stderr, "Child: Pause returned -1 but errno is %d (%s)\n",
- TEST_ERRNO, strerror(TEST_ERRNO));
- exit(1);
+ pid = SAFE_FORK();
+ if (!pid) {
+ do_child();
+ exit(0);
}
- fprintf(stderr, "Child: Pause returned %ld\n", TEST_RETURN);
- exit(1);
-}
-
-static void setup(void)
-{
- tst_sig(FORK, DEF_HANDLER, cleanup);
+ TST_PROCESS_STATE_WAIT(pid, 'S', 10000);
+ SAFE_KILL(pid, SIGINT);
+ SAFE_WAITPID(pid, &status, 0);
- TEST_PAUSE;
+ TST_EXP_EXPR(WIFEXITED(status) && !WEXITSTATUS(status),
+ "pause() was interrupted correctly");
+ tst_res(TFAIL, "pause() was not interrupted");
}
-static void cleanup(void)
-{
-}
+static struct tst_test test = {
+ .test_all = run,
+ .forks_child = 1,
+};
--
2.48.1
More information about the ltp
mailing list