blob: e2350dbdb7501e48a55a72bc12accac08e8fb203 [file] [log] [blame]
Denys Vlasenko8ed57272009-02-25 14:24:02 +00001#include <stdlib.h>
Denys Vlasenko26de70e2009-02-13 10:26:31 +00002#include <stddef.h>
3#include <unistd.h>
4#include <signal.h>
Denys Vlasenko26de70e2009-02-13 10:26:31 +00005#include <sys/types.h>
6#include <sys/socket.h>
Denys Vlasenko8158e772011-06-08 14:08:59 +02007#include <stdio.h>
Denys Vlasenko8ed57272009-02-25 14:24:02 +00008
Denys Vlasenko26de70e2009-02-13 10:26:31 +00009static const struct sockaddr sa;
10
Denys Vlasenko8ed57272009-02-25 14:24:02 +000011int main(int argc, char *argv[])
Denys Vlasenko26de70e2009-02-13 10:26:31 +000012{
13 int loops;
14 int pid;
15 sigset_t set;
16
Denys Vlasenko8158e772011-06-08 14:08:59 +020017 printf(
18"Please run me under 'strace -f -oLOG', and examine LOG file for incorrect\n"
19"decoding of interrupted syscalls: grep for 'sendto', '??" /* anti-trigraph gap */ "?', 'unavailable'.\n"
20"Pass number of iterations in argv[1] (default: 999).\n"
21 );
Denys Vlasenko7c57be82011-06-08 16:07:03 +020022 fflush(NULL);
Denys Vlasenko8158e772011-06-08 14:08:59 +020023
Denys Vlasenko26de70e2009-02-13 10:26:31 +000024 sigemptyset(&set);
25 sigaddset(&set, SIGCHLD);
26 sigprocmask(SIG_BLOCK, &set, NULL);
27
28 loops = 999;
29 if (argv[1])
30 loops = atoi(argv[1]);
31
32 while (--loops >= 0) {
33 pid = fork();
Denys Vlasenko8ed57272009-02-25 14:24:02 +000034
35 if (pid < 0)
36 exit(1);
37
Denys Vlasenko26de70e2009-02-13 10:26:31 +000038 if (!pid) {
39 /* child */
40 int child = getpid();
41
42 loops = 99;
43 while (--loops) {
44 pid = fork();
Denys Vlasenko8ed57272009-02-25 14:24:02 +000045
46 if (pid < 0)
47 exit(1);
48
Denys Vlasenko26de70e2009-02-13 10:26:31 +000049 if (!pid) {
50 /* grandchild: kill child */
51 kill(child, SIGKILL);
Denys Vlasenko8ed57272009-02-25 14:24:02 +000052 exit(0);
Denys Vlasenko26de70e2009-02-13 10:26:31 +000053 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000054
Denys Vlasenko26de70e2009-02-13 10:26:31 +000055 /* Add various syscalls you want to test here.
56 * strace will decode them and suddenly find
57 * process disappearing.
58 * But leave at least one case "empty", so that
59 * "kill grandchild" happens quicker.
60 * This produces cases when strace can't even
61 * decode syscall number before process dies.
62 */
63 switch (loops & 1) {
Denys Vlasenko8ed57272009-02-25 14:24:02 +000064 case 0:
Denys Vlasenko8158e772011-06-08 14:08:59 +020065 break; /* intentionally empty */
Denys Vlasenko8ed57272009-02-25 14:24:02 +000066 case 1:
67 sendto(-1, "Hello cruel world", 17, 0, &sa, sizeof(sa));
68 break;
Denys Vlasenko26de70e2009-02-13 10:26:31 +000069 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000070
Denys Vlasenko26de70e2009-02-13 10:26:31 +000071 /* kill grandchild */
72 kill(pid, SIGKILL);
73 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000074
75 exit(0);
Denys Vlasenko26de70e2009-02-13 10:26:31 +000076 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000077
Denys Vlasenko26de70e2009-02-13 10:26:31 +000078 /* parent */
79 wait(NULL);
80 }
Denys Vlasenko8ed57272009-02-25 14:24:02 +000081
Denys Vlasenko26de70e2009-02-13 10:26:31 +000082 return 0;
83}