]> granicus.if.org Git - procps-ng/commitdiff
build-sys: Enable testing of sigqueue
authorCraig Small <csmall@dropbear.xyz>
Tue, 28 Apr 2020 09:40:07 +0000 (19:40 +1000)
committerCraig Small <csmall@dropbear.xyz>
Tue, 28 Apr 2020 09:47:39 +0000 (19:47 +1000)
The referenced commits enavled both pkill and kill to send an integer to
the killed or signalled process. The test_process now will report on the
integer if sent and the testsuite changes take advantage of this
new feature.

Another process make/destroy set had to be made as using spawn
instead of exec changes both the SID and TTY for the underlying
process, making other tests fail.

References:
 commit 7d55409b82602dac540c011000c9c5abedb5158a
 commit 2b804a532a90a98bccc5255a728da9076a5e4f4f

lib/test_process.c
testsuite/config/unix.exp
testsuite/kill.test/kill.exp
testsuite/pkill.test/pkill.exp

index 6a4776c570061d0594f34a3f632fc59ef7167d92..e20b270de2f645b99b16de3dec48b349024fdf57 100644 (file)
@@ -38,19 +38,37 @@ static void usage(void)
 
 
 void
-signal_handler(int signum)
+signal_handler(int signum, siginfo_t *siginfo, void *ucontext)
 {
+    char *signame = NULL;
+
     switch(signum) {
        case SIGUSR1:
-           printf("SIG SIGUSR1\n");
+           signame = strdup("SIGUSR1");
            break;
        case SIGUSR2:
-           printf("SIG SIGUSR2\n");
+           signame = strdup("SIGUSR2");
            break;
        default:
            printf("SIG unknown\n");
            exit(EXIT_FAILURE);
     }
+    if (signame == NULL) {
+       printf("SIG malloc error\n");
+       exit(EXIT_FAILURE);
+    }
+    switch (siginfo->si_code) {
+       case SI_USER:
+           printf("SIG %s\n", signame);
+           break;
+       case SI_QUEUE:
+           printf("SIG %s value=%d\n", signame, siginfo->si_int);
+           break;
+       default:
+           printf("Unknown si_code %d\n", siginfo->si_code);
+           exit(EXIT_FAILURE);
+    }
+
 }
 
 int main(int argc, char *argv[])
@@ -74,9 +92,9 @@ int main(int argc, char *argv[])
     }
 
     /* Setup signal handling */
-    signal_action.sa_handler = signal_handler;
+    signal_action.sa_sigaction = signal_handler;
     sigemptyset (&signal_action.sa_mask);
-    signal_action.sa_flags = 0;
+    signal_action.sa_flags = SA_SIGINFO;
     sigaction(SIGUSR1, &signal_action, NULL);
     sigaction(SIGUSR2, &signal_action, NULL);
 
index 61a329ed32e58492694082860f95f58231694d73..4156c3b903b28818240b624bda77e82aa301d4da 100644 (file)
@@ -52,6 +52,17 @@ proc expect_pass { testname reg } {
     }
 }
 
+proc expect_pipeproc_pass { testname reg } {
+    global pipeproc_spawnid
+
+    expect {
+       -i $pipeproc_spawnid
+        -re "$reg" { pass "$testname" }
+        default { fail "$testname" }
+               timeout { fail "$testname (timeout)" }
+    }
+}
+
 proc expect_blank { testname } {
     expect {
         -re "\\w" { fail "$testname" }
@@ -60,6 +71,14 @@ proc expect_blank { testname } {
     }
 }
 
+proc expect_blank_continue { testname } {
+    expect {
+        -re "\\w" { fail "$testname" }
+        eof { }
+        timeout { pass "$testname (timeout)" }
+    }
+}
+
 proc expect_table { test match_header match_items match_footer } {
     expect {
         -re "$match_header" {
@@ -117,6 +136,15 @@ proc expect_table_dsc { test match_header match_item } {
     #}
 }
 
+proc make_pipeproc { } {
+    global pipeproc_pid pipeproc_spawnid topdir
+
+    set testproc_realpath "${topdir}/lib/test_process"
+
+    set pipeproc_pid [ spawn $testproc_realpath ]
+    set pipeproc_spawnid $spawn_id
+
+}
 proc make_testproc { } {
     global testproc_path testproc_comm testproc_arg_str testproc1_pid testproc2_pid topdir
 
@@ -157,6 +185,11 @@ proc kill_testproc { } {
     file delete $testproc_path
 }
 
+proc kill_pipeproc { } {
+    global pipeproc_pid
+    kill_process $pipeproc_pid
+}
+
 proc get_tty {} {
     if { [catch { set raw_tty [ exec tty ] } msg]} {
         warning "No TTY found"
index fb5fda73aeff9d82d1cd67ea6ac4ae39f986ace4..5aa7b2c98609f448875866e5bccd359d7773eaa6 100644 (file)
@@ -45,26 +45,21 @@ set test "kill convert signal number to name with space"
 spawn  $kill -l 1
 expect_pass "$test" "^HUP\\s*"
 
-#set test "kill numbered process"
-#make_testproc
-#if { [ file isdirectory "/proc/$testproc1_pid" ] && [ file isdirectory "/proc/$testproc2_pid" ] } {
-#} else {
-#    perror "Could not start test processes"
-#}
-#exec $kill -KILL $testproc1_pid
-#wait
-#if { [ file exists "/proc/$testproc1_pid" ] } {
-#    exec kill $testproc2_pid
-#    fail "$test (proc 1 exists)"
-#} else {
-#    exec $kill -KILL $testproc2_pid
-#    wait
-#    if { [ file exists "/proc/$testproc2_pid" ] } {
-#        exec kill $testproc2_pid
-#        fail "$test (proc 2 exists)"
-#    } else {
-#        pass "$test"
-#    }
-#}
-## Cleanup
-#exec rm $testproc_path
+make_pipeproc
+
+set test "kill with SIGUSR1"
+spawn $kill -USR1 $pipeproc_pid
+expect_blank_continue "$test"
+expect_pipeproc_pass "$test" "SIG SIGUSR1"
+
+set test "kill with long SIGUSR2"
+spawn $kill -s SIGUSR2 $pipeproc_pid
+expect_blank_continue "$test"
+expect_pipeproc_pass "$test" "SIG SIGUSR2"
+
+set test "kill with queued int"
+spawn $kill -USR1 -q 42 $pipeproc_pid
+expect_blank_continue "$test"
+expect_pipeproc_pass "$test" "SIG SIGUSR1 value=42"
+
+kill_pipeproc
index 85ea15aec4ca87f1398d923ecbf0de761e2e6a54..f9b00fa658eacc3e993813fb4653f959d5db25e2 100644 (file)
@@ -18,7 +18,6 @@ expect_pass "$test" "^\(lt-\)\?pkill: no matching criteria specified\\s*"
 make_testproc
 set testproc_len [ string length $testproc_comm ]
 set testproc_trim [ string range $testproc_comm 0 [ expr { $testproc_len - 2 } ] ]
-set testproc1_sid [ exec $ps --no-headers -o sid $testproc1_pid ]
 
 set test "pkill find both test pids"
 spawn $pkill -0 -e $testproc_comm
@@ -30,3 +29,19 @@ expect_pass "$test" "^$testproc_comm killed \\(pid $testproc1_pid\\)\\s+$testpro
 
 # Cleanup
 kill_testproc
+
+make_pipeproc
+
+set test "pkill with SIGUSR1"
+spawn $pkill -USR1 -e $testproc_comm
+expect_pipeproc_pass "$test" "SIG SIGUSR1"
+
+set test "pkill with SIGUSR2"
+spawn $pkill -USR2 -e $testproc_comm
+expect_pipeproc_pass "$test" "SIG SIGUSR2"
+
+set test "pkill with queued int"
+spawn $pkill -USR1 -e -q 42 $testproc_comm
+expect_pipeproc_pass "$test" "SIG SIGUSR1 value=42"
+
+kill_pipeproc