1 #include <errno.h>
2 #include <pthread.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <unistd.h>
7 #include <sys/wait.h>
8 
9 
10 static pid_t pid;
11 
12 static void *
pid_thread(void * arg)13 pid_thread (void *arg)
14 {
15   if (pid != getpid ())
16     {
17       printf ("pid wrong in thread: should be %d, is %d\n",
18 	      (int) pid, (int) getpid ());
19       return (void *) 1L;
20     }
21 
22   return NULL;
23 }
24 
25 static int
do_test(void)26 do_test (void)
27 {
28   pid = getpid ();
29 
30   pthread_t thr;
31   int ret = pthread_create (&thr, NULL, pid_thread, NULL);
32   if (ret)
33     {
34       printf ("pthread_create failed: %d\n", ret);
35       return 1;
36     }
37 
38   void *thr_ret;
39   ret = pthread_join (thr, &thr_ret);
40   if (ret)
41     {
42       printf ("pthread_create failed: %d\n", ret);
43       return 1;
44     }
45   else if (thr_ret)
46     {
47       printf ("thread getpid failed\n");
48       return 1;
49     }
50 
51   pid_t child = fork ();
52   if (child == -1)
53     {
54       printf ("fork failed: %m\n");
55       return 1;
56     }
57   else if (child == 0)
58     {
59       if (pid == getpid ())
60 	{
61 	  puts ("pid did not change after fork");
62 	  exit (1);
63 	}
64 
65       pid = getpid ();
66       ret = pthread_create (&thr, NULL, pid_thread, NULL);
67       if (ret)
68 	{
69 	  printf ("pthread_create failed: %d\n", ret);
70 	  return 1;
71 	}
72 
73       ret = pthread_join (thr, &thr_ret);
74       if (ret)
75 	{
76 	  printf ("pthread_create failed: %d\n", ret);
77 	  return 1;
78 	}
79       else if (thr_ret)
80 	{
81 	  printf ("thread getpid failed\n");
82 	  return 1;
83 	}
84 
85       return 0;
86     }
87 
88   int status;
89   if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child)
90     {
91       puts ("waitpid failed");
92       kill (child, SIGKILL);
93       return 1;
94     }
95 
96   if (!WIFEXITED (status))
97     {
98       if (WIFSIGNALED (status))
99 	printf ("died from signal %s\n", strsignal (WTERMSIG (status)));
100       else
101 	puts ("did not terminate correctly");
102       return 1;
103     }
104   if (WEXITSTATUS (status) != 0)
105     {
106       printf ("exit code %d\n", WEXITSTATUS (status));
107       return 1;
108     }
109 
110   return 0;
111 }
112 
113 #define TEST_FUNCTION do_test ()
114 #include "../test-skeleton.c"
115