Blame sysdeps/posix/shm-directory.h

Packit Service 82fcde
/* Header for directory for shm/sem files.
Packit Service 82fcde
   Copyright (C) 2014-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#ifndef _SHM_DIRECTORY_H
Packit Service 82fcde
Packit Service 82fcde
#include <errno.h>
Packit Service 82fcde
#include <limits.h>
Packit Service 82fcde
#include <stdbool.h>
Packit Service 82fcde
#include <stdlib.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
Packit Service 82fcde
extern const char *__shm_directory (size_t *len);
Packit Service 82fcde
Packit Service 82fcde
/* This defines local variables SHM_DIR and SHM_DIRLEN, giving the
Packit Service 82fcde
   directory prefix (with trailing slash) and length (not including '\0'
Packit Service 82fcde
   terminator) of the directory used for shm files.  If that cannot be
Packit Service 82fcde
   determined, it sets errno to ENOSYS and returns RETVAL_FOR_INVALID.
Packit Service 82fcde
Packit Service 82fcde
   This uses the local variable NAME as an lvalue, and increments it past
Packit Service 82fcde
   any leading slashes.  It then defines the local variable NAMELEN, giving
Packit Service 82fcde
   strlen (NAME) + 1.  If NAME is invalid, it sets errno to
Packit Service 82fcde
   ERRNO_FOR_INVALID and returns RETVAL_FOR_INVALID.  Finally, it defines
Packit Service 82fcde
   the local variable SHM_NAME, giving the absolute file name of the shm
Packit Service 82fcde
   file corresponding to NAME.  PREFIX is a string constant used as a
Packit Service 82fcde
   prefix on NAME.  */
Packit Service 82fcde
Packit Service 82fcde
#define SHM_GET_NAME(errno_for_invalid, retval_for_invalid, prefix)           \
Packit Service 82fcde
  size_t shm_dirlen;							      \
Packit Service 82fcde
  const char *shm_dir = __shm_directory (&shm_dirlen);			      \
Packit Service 82fcde
  /* If we don't know what directory to use, there is nothing we can do.  */  \
Packit Service 82fcde
  if (__glibc_unlikely (shm_dir == NULL))				      \
Packit Service 82fcde
    {									      \
Packit Service 82fcde
      __set_errno (ENOSYS);						      \
Packit Service 82fcde
      return retval_for_invalid;					      \
Packit Service 82fcde
    }									      \
Packit Service 82fcde
  /* Construct the filename.  */					      \
Packit Service 82fcde
  while (name[0] == '/')						      \
Packit Service 82fcde
    ++name;								      \
Packit Service 82fcde
  size_t namelen = strlen (name) + 1;					      \
Packit Service 82fcde
  /* Validate the filename.  */						      \
Packit Service 82fcde
  if (namelen == 1 || namelen >= NAME_MAX || strchr (name, '/') != NULL)      \
Packit Service 82fcde
    {									      \
Packit Service 82fcde
      __set_errno (errno_for_invalid);					      \
Packit Service 82fcde
      return retval_for_invalid;					      \
Packit Service 82fcde
    }									      \
Packit Service 82fcde
  char *shm_name = __alloca (shm_dirlen + sizeof prefix - 1 + namelen);	      \
Packit Service 82fcde
  __mempcpy (__mempcpy (__mempcpy (shm_name, shm_dir, shm_dirlen),	      \
Packit Service 82fcde
                        prefix, sizeof prefix - 1),			      \
Packit Service 82fcde
             name, namelen)
Packit Service 82fcde
Packit Service 82fcde
#endif	/* shm-directory.h */