iconv: Suppress array out of bounds warning.
[platform/upstream/glibc.git] / nptl / tst-getpid3.c
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 *
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
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"