(root)/
glibc-2.38/
sysdeps/
pthread/
tst-sem7.c
       1  /* Copyright (C) 2003-2023 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
      27  remove_sem (int status, void *arg)
      28  {
      29    sem_unlink (arg);
      30  }
      31  
      32  
      33  static int
      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"