[LTP] [PATCH 1/2] syscalls/pause02: Refactor into new API
Ricardo B. Marlière
ricardo@marliere.net
Mon Feb 17 23:01:15 CET 2025
Signed-off-by: Ricardo B. Marlière <ricardo@marliere.net>
---
testcases/kernel/syscalls/pause/pause02.c | 159 ++++++++----------------------
1 file changed, 41 insertions(+), 118 deletions(-)
diff --git a/testcases/kernel/syscalls/pause/pause02.c b/testcases/kernel/syscalls/pause/pause02.c
index 0853232fd07b2c6278049dd4472a1ee8e7ab7646..05706ab6ad07119763e29dd878f80a3de8f7bbb9 100644
--- a/testcases/kernel/syscalls/pause/pause02.c
+++ b/testcases/kernel/syscalls/pause/pause02.c
@@ -1,20 +1,8 @@
+// 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) Linux Test Project, 2025
*/
/*
@@ -23,125 +11,60 @@
* process will resume execution from the point of suspension.
*/
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/wait.h>
+#include "tst_test.h"
-#include "test.h"
-
-char *TCID = "pause02";
-int TST_TOTAL = 1;
-static pid_t cpid;
-
-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)
{
}
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);
- }
+ SAFE_SIGNAL(SIGALRM, SIG_DFL);
+ SAFE_SIGNAL(SIGINT, sig_handler);
/* Commit suicide after 10 seconds */
alarm(10);
TEST(pause());
+ if (TST_RET == -1 && TST_ERR == EINTR)
+ exit(0);
+ else
+ tst_res(TFAIL | TTERRNO, "pause() unexpected errno");
- if (TEST_RETURN == -1) {
- if (TEST_ERRNO == EINTR)
- exit(0);
-
- fprintf(stderr, "Child: Pause returned -1 but errno is %d (%s)\n",
- TEST_ERRNO, strerror(TEST_ERRNO));
- exit(1);
- }
-
- fprintf(stderr, "Child: Pause returned %ld\n", TEST_RETURN);
exit(1);
}
-static void setup(void)
+void run(void)
{
- tst_sig(FORK, DEF_HANDLER, cleanup);
-
- TEST_PAUSE;
+ int status;
+ pid_t pid;
+
+ pid = SAFE_FORK();
+ if (!pid)
+ do_child();
+
+ TST_PROCESS_STATE_WAIT(pid, 'S', 10000);
+ kill(pid, SIGINT);
+ SAFE_WAITPID(pid, &status, 0);
+
+ if (WIFEXITED(status)) {
+ if (WEXITSTATUS(status) == 0)
+ tst_res(TPASS, "pause() was interrupted correctly");
+ else
+ tst_res(TFAIL, "Child exited with %i",
+ WEXITSTATUS(status));
+ } else if (WIFSIGNALED(status)) {
+ if (WTERMSIG(status) == SIGALRM)
+ tst_res(TFAIL,
+ "Timeout: SIGINT wasn't received by child");
+ else
+ tst_res(TFAIL, "Child killed by signal");
+ } else {
+ 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