(root)/
glibc-2.38/
posix/
shm-directory.c
       1  /* Determine directory for shm/sem files.  Generic POSIX version.
       2     Copyright (C) 2014-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       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     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <unistd.h>
      20  
      21  #if _POSIX_MAPPED_FILES
      22  
      23  #include <alloc_buffer.h>
      24  #include <shm-directory.h>
      25  #include <string.h>
      26  #include <sys/mman.h>
      27  #include <fcntl.h>
      28  #include <errno.h>
      29  
      30  int
      31  __shm_get_name (struct shmdir_name *result, const char *name, bool sem_prefix)
      32  {
      33    struct alloc_buffer buffer;
      34    size_t namelen;
      35  
      36    buffer = alloc_buffer_create (result->name, sizeof (result->name));
      37    alloc_buffer_copy_bytes (&buffer, SHMDIR, strlen (SHMDIR));
      38  
      39  #if defined (SHM_ANON) && defined (O_TMPFILE)
      40    if (name == SHM_ANON)
      41      {
      42        /* For SHM_ANON, we want shm_open () to pass O_TMPFILE to open (),
      43           with SHMDIR itself as the path.  So, leave it at that.  */
      44        alloc_buffer_add_byte (&buffer, 0);
      45        if (alloc_buffer_has_failed (&buffer))
      46          return -1;
      47        return 0;
      48      }
      49  #endif
      50  
      51    while (name[0] == '/')
      52      ++name;
      53    namelen = strlen (name);
      54  
      55    if (sem_prefix)
      56      alloc_buffer_copy_bytes (&buffer, "sem.", strlen ("sem."));
      57    alloc_buffer_copy_bytes (&buffer, name, namelen + 1);
      58    if (namelen == 0 || memchr (name, '/', namelen) != NULL)
      59      return EINVAL;
      60    if (alloc_buffer_has_failed (&buffer))
      61      {
      62        if (namelen > NAME_MAX)
      63          return ENAMETOOLONG;
      64        return EINVAL;
      65      }
      66    return 0;
      67  }
      68  libc_hidden_def (__shm_get_name)
      69  
      70  #endif