1 /* Copyright (C) 2003-2022 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 #include <errno.h>
19 #include <fcntl.h>
20 #include <semaphore.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <unistd.h>
24 
25 
26 static void
remove_sem(int status,void * arg)27 remove_sem (int status, void *arg)
28 {
29   sem_unlink (arg);
30 }
31 
32 
33 static int
do_test(void)34 do_test (void)
35 {
36   sem_t *s;
37   sem_t *s2;
38   sem_t *s3;
39 
40   s = sem_open ("/glibc-tst-sem7", O_CREAT, 0600, 1);
41   if (s == SEM_FAILED)
42     {
43       if (errno == ENOSYS)
44 	{
45 	  puts ("sem_open not supported.  Oh well.");
46 	  return 0;
47 	}
48 
49       /* Maybe the shm filesystem has strict permissions.  */
50       if (errno == EACCES)
51 	{
52 	  puts ("sem_open not allowed.  Oh well.");
53 	  return 0;
54 	}
55 
56       printf ("sem_open: %m\n");
57       return 1;
58     }
59 
60   on_exit (remove_sem, (void *) "/glibc-tst-sem7");
61 
62   /* We have the semaphore object.  Now try again.  We should get the
63      same address.  */
64   s2 = sem_open ("/glibc-tst-sem7", O_CREAT, 0600, 1);
65   if (s2 == SEM_FAILED)
66     {
67       puts ("2nd sem_open failed");
68       return 1;
69     }
70   if (s != s2)
71     {
72       puts ("2nd sem_open didn't return the same address");
73       return 1;
74     }
75 
76   /* And again, this time without O_CREAT.  */
77   s3 = sem_open ("/glibc-tst-sem7", 0);
78   if (s3 == SEM_FAILED)
79     {
80       puts ("3rd sem_open failed");
81       return 1;
82     }
83   if (s != s3)
84     {
85       puts ("3rd sem_open didn't return the same address");
86       return 1;
87     }
88 
89   /* Now close the handle.  Three times.  */
90   if (sem_close (s2) != 0)
91     {
92       puts ("1st sem_close failed");
93       return 1;
94     }
95   if (sem_close (s) != 0)
96     {
97       puts ("2nd sem_close failed");
98       return 1;
99     }
100   if (sem_close (s3) != 0)
101     {
102       puts ("3rd sem_close failed");
103       return 1;
104     }
105 
106   return 0;
107 }
108 
109 #define TEST_FUNCTION do_test ()
110 #include "../test-skeleton.c"
111