iconv: Suppress array out of bounds warning.
[platform/upstream/glibc.git] / nptl / tst-sem4.c
1 /* Copyright (C) 2002-2015 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #include <errno.h>
20 #include <fcntl.h>
21 #include <semaphore.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <unistd.h>
25
26
27 static void
28 remove_sem (int status, void *arg)
29 {
30   sem_unlink (arg);
31 }
32
33
34 int
35 do_test (void)
36 {
37   sem_t *s;
38   sem_t *s2;
39   pid_t pid;
40   int val;
41
42   /* Start with a clean slate and register a clean-up action.  No need to
43      act if sem_unlink fails because we will catch the same problem during the
44      sem_open below.  */
45   sem_unlink ("/glibc-tst-sem4");
46   on_exit (remove_sem, (void *) "/glibc-tst-sem4");
47
48   s = sem_open ("/glibc-tst-sem4", O_CREAT, 0600, 1);
49   if (s == SEM_FAILED)
50     {
51       if (errno == ENOSYS)
52         {
53           puts ("sem_open not supported.  Oh well.");
54           return 0;
55         }
56
57       /* Maybe the shm filesystem has strict permissions.  */
58       if (errno == EACCES)
59         {
60           puts ("sem_open not allowed.  Oh well.");
61           return 0;
62         }
63
64       printf ("sem_open: %m\n");
65       return 1;
66     }
67
68   /* We have the semaphore object.  Now try again with O_EXCL, this
69      should fail.  */
70   s2 = sem_open ("/glibc-tst-sem4", O_CREAT | O_EXCL, 0600, 1);
71   if (s2 != SEM_FAILED)
72     {
73       puts ("2nd sem_open didn't fail");
74       return 1;
75     }
76   if (errno != EEXIST)
77     {
78       puts ("2nd sem_open returned wrong error");
79       return 1;
80     }
81
82   /* Check the value.  */
83   if (sem_getvalue (s, &val) == -1)
84     {
85       puts ("getvalue failed");
86       return 1;
87     }
88   if (val != 1)
89     {
90       printf ("initial value wrong: got %d, expected 1\n", val);
91       return 1;
92     }
93
94   if (TEMP_FAILURE_RETRY (sem_wait (s)) == -1)
95     {
96       puts ("1st sem_wait failed");
97       return 1;
98     }
99
100   pid = fork ();
101   if (pid == -1)
102     {
103       printf ("fork failed: %m\n");
104       return 1;
105     }
106
107   if (pid == 0)
108     {
109       /* Child.  */
110
111       /* Check the value.  */
112       if (sem_getvalue (s, &val) == -1)
113         {
114           puts ("child: getvalue failed");
115           return 1;
116         }
117       if (val != 0)
118         {
119           printf ("child: value wrong: got %d, expect 0\n", val);
120           return 1;
121         }
122
123       if (sem_post (s) == -1)
124         {
125           puts ("child: post failed");
126           return 1;
127         }
128     }
129   else
130     {
131       if (TEMP_FAILURE_RETRY (sem_wait (s)) == -1)
132         {
133           puts ("2nd sem_wait failed");
134           return 1;
135         }
136
137       if (sem_getvalue (s, &val) == -1)
138         {
139           puts ("parent: 2nd getvalue failed");
140           return 1;
141         }
142       if (val != 0)
143         {
144           printf ("parent: value wrong: got %d, expected 0\n", val);
145           return 1;
146         }
147     }
148
149   return 0;
150 }
151
152 #define TEST_FUNCTION do_test ()
153 #include "../test-skeleton.c"