[LTP] [PATCH] syscalls/kill12: Convert to new API
Ricardo B. Marlière
rbm@suse.com
Tue Jun 17 17:56:02 CEST 2025
From: Ricardo B. Marlière <rbm@suse.com>
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
testcases/kernel/syscalls/kill/kill12.c | 277 +++++++++-----------------------
1 file changed, 72 insertions(+), 205 deletions(-)
diff --git a/testcases/kernel/syscalls/kill/kill12.c b/testcases/kernel/syscalls/kill/kill12.c
index f864bdcb654c563cd4808bec7a4979fb160825c4..d843fe5fba62f63dc903759192fbfb7cd02bc7b6 100644
--- a/testcases/kernel/syscalls/kill/kill12.c
+++ b/testcases/kernel/syscalls/kill/kill12.c
@@ -1,236 +1,103 @@
-/* IBM Corporation */
-/* 01/02/2003 Port to LTP avenkat@us.ibm.com */
-/* 06/30/2001 Port to Linux nsharoff@us.ibm.com */
-
+// SPDX-License-Identifier: GPL-2.0-or-later
/*
- *
- * Copyright (c) International Business Machines Corp., 2002
- *
- * 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) International Business Machines Corp., 2002
+ * 01/02/2003 Port to LTP avenkat@us.ibm.com
+ * 06/30/2001 Port to Linux nsharoff@us.ibm.com
+ * Copyright (c) 2025 SUSE LLC Ricardo B. Marlière <rbm@suse.com>
*/
- /*kill2.c */
-/*======================================================================
->KEYS: < kill(), wait(), signal()
->WHAT: < Check that when a child is killed by its parent, it returns the
- < correct values to the waiting parent--the child sets signal to
- < ignore the kill
->HOW: < For each signal: Send that signal to a child that has elected
- < to catch the signal, check that the correct status was returned
- < to the waiting parent.
- < NOTE: Signal 9 (kill) is not catchable, and must be dealt with
- < separately.
->BUGS: < None known
-======================================================================*/
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE 1
-#endif
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/wait.h>
-#include <errno.h>
+/*\
+ * Check that when a child is killed by its parent, it returns the
+ * correct values to the waiting parent - the child sets signal to
+ * ignore the kill
+ */
-#include "test.h"
-#define ITER 3
-#define FAILED 0
-#define PASSED 1
+#define _GNU_SOURCE
+#include <sys/wait.h>
-char *TCID = "kill12";
+#include "tst_test.h"
-int local_flag = PASSED;
-int block_number;
-FILE *temp;
-int TST_TOTAL = 1;
static int sig;
+static int chflag;
-int anyfail();
-int blenter();
-int instress();
-void setup();
-void terror();
-void fail_exit();
-void ok_exit();
-int forkfail();
-void do_child();
+static void do_child(void);
-int chflag;
-
-int main(int argc, char **argv)
+static void run(void)
{
- int pid, npid;
- int nsig, exno, nexno, status;
- int ret_val = 0;
- int core;
- void chsig();
-
- tst_parse_opts(argc, argv, NULL, NULL);
-
- setup();
- blenter();
-
- exno = 1;
-
- if (sigset(SIGCHLD, chsig) == SIG_ERR) {
- fprintf(temp, "\tsigset failed, errno = %d\n", errno);
- fail_exit();
- }
+ int pid;
+ int nsig, nexno, status;
for (sig = 1; sig < 14; sig++) {
- fflush(temp);
- chflag = 0;
+ /* SIGKILL and SIGSTOP can't be catched */
+ if (sig == SIGKILL || sig == SIGSTOP)
+ continue;
- pid = tst_fork();
- if (pid < 0) {
- forkfail();
- }
+ chflag = 0;
- if (pid == 0) {
+ pid = SAFE_FORK();
+ if (!pid)
do_child();
- } else {
- //fprintf(temp, "Testing signal %d\n", sig);
-
- while (!chflag) /* wait for child */
- sleep(1);
-
- kill(pid, sig); /* child should ignroe this sig */
- kill(pid, SIGCHLD); /* child should exit */
-
-#ifdef BCS
- while ((npid = wait(&status)) != pid
- || (npid == -1 && errno == EINTR)) ;
- if (npid != pid) {
- fprintf(temp,
- "wait error: wait returned wrong pid\n");
- ret_val = 1;
- }
-#else
- while ((npid = waitpid(pid, &status, 0)) != -1
- || errno == EINTR) ;
-#endif
-
- /*
- nsig = status & 0177;
- core = status & 0200;
- nexno = (status & 0xff00) >> 8;
- */
- /***** LTP Port *****/
- nsig = WTERMSIG(status);
-#ifdef WCOREDUMP
- core = WCOREDUMP(status);
-#endif
- nexno = WIFEXITED(status);
- /***** ** ** *****/
-
- /* nsig is the signal number returned by wait
- it should be 0, except when sig = 9 */
-
- if ((sig == 9) && (nsig != sig)) {
- fprintf(temp, "wait error: unexpected signal"
- " returned when the signal sent was 9"
- " The status of the process is %d \n",
- status);
- ret_val = 1;
- }
- if ((sig != 9) && (nsig != 0)) {
- fprintf(temp, "wait error: unexpected signal "
- "returned, the status of the process is "
- "%d \n", status);
- ret_val = 1;
- }
-
- /* nexno is the exit number returned by wait
- it should be 1, except when sig = 9 */
-
- if (sig == 9)
- if (nexno != 0) {
- fprintf(temp, "signal error: unexpected"
- " exit number returned when"
- " signal sent was 9, the status"
- " of the process is %d \n",
- status);
- ret_val = 1;
- } else;
- else if (nexno != 1) {
- fprintf(temp, "signal error: unexpected exit "
- "number returned,the status of the"
- " process is %d\n", status);
- ret_val = 1;
- }
- }
+
+ while (!chflag) /* wait for child */
+ sleep(1);
+
+ SAFE_KILL(pid, sig); /* child should ignore this sig */
+ SAFE_KILL(pid, SIGCHLD); /* child should exit */
+ SAFE_WAITPID(pid, &status, 0);
+ nsig = WTERMSIG(status);
+ nexno = WIFEXITED(status);
+
+ /* nsig is the signal number returned by wait, it should be 0 */
+ if (nsig != 0)
+ tst_res(TFAIL,
+ "wait error: unexpected signal "
+ "returned, the status of the process is %d",
+ status);
+
+ /* nexno is the exit number returned by wait, it should be 1 */
+ if (nexno != 1)
+ tst_res(TFAIL,
+ "signal error: unexpected exit "
+ "number returned,the status of the"
+ " process is %d\n",
+ status);
}
- if (ret_val)
- local_flag = FAILED;
- anyfail();
- tst_exit();
+ tst_res(TPASS, "Test passed");
}
-void chsig(void)
+static void chsig(LTP_ATTRIBUTE_UNUSED int signum,
+ LTP_ATTRIBUTE_UNUSED siginfo_t *si,
+ LTP_ATTRIBUTE_UNUSED void *uc)
{
chflag++;
}
-int anyfail(void)
+static void do_child(void)
{
- (local_flag == FAILED) ? tst_resm(TFAIL,
- "Test failed") : tst_resm(TPASS,
- "Test passed");
- tst_exit();
-}
+ struct sigaction sa = {
+ .sa_handler = SIG_IGN,
+ .sa_flags = 0,
+ };
-void do_child(void)
-{
- int exno = 1;
-
- sigset(sig, SIG_IGN); /* set to ignore signal */
- kill(getppid(), SIGCHLD); /* tell parent we are ready */
+ SAFE_SIGACTION(sig, &sa, NULL);
+ SAFE_KILL(getppid(), SIGCHLD); /* tell parent we are ready */
while (!chflag)
- sleep(1); /* wait for parent */
-
- exit(exno);
-}
-
-void setup(void)
-{
- temp = stderr;
-}
-
-int blenter(void)
-{
- //tst_resm(TINFO, "Enter block %d", block_number);
- local_flag = PASSED;
- return 0;
+ sleep(1); /* wait for parent */
+ exit(1);
}
-void terror(char *message)
+static void setup(void)
{
- tst_resm(TBROK, "Reason: %s:%s", message, strerror(errno));
+ struct sigaction sa = {
+ .sa_sigaction = chsig,
+ .sa_flags = 0,
+ };
+ SAFE_SIGACTION(SIGCHLD, &sa, NULL);
}
-void fail_exit(void)
-{
- local_flag = FAILED;
- anyfail();
-
-}
-
-int forkfail(void)
-{
- tst_brkm(TBROK, NULL, "FORK FAILED - terminating test.");
-}
+static struct tst_test test = {
+ .test_all = run,
+ .setup = setup,
+ .forks_child = 1,
+};
---
base-commit: df591113afeb31107bc45bd5ba28a99b556d1028
change-id: 20250617-conversions-kill-d79ed23a8c6b
Best regards,
--
Ricardo B. Marlière <rbm@suse.com>
More information about the ltp
mailing list