#include <unistd.h>
#if ! _POSIX_MAPPED_FILES
#include <rt/shm_open.c>
#else
#include <errno.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <paths.h>
#define SHMDIR (_PATH_DEV "shm/")
/* Open shared memory object. */
int
shm_open (const char *name, int oflag, mode_t mode)
{
size_t namelen;
char *fname;
int fd;
/* Construct the filename. */
while (name[0] == '/')
++name;
if (name[0] == '/0')
{
/* The name "/" is not supported. */
__set_errno (EINVAL);
return -1;
}
namelen = strlen (name);
fname = (char *) __alloca (sizeof SHMDIR - 1 + namelen + 1);
__mempcpy (__mempcpy (fname, SHMDIR, sizeof SHMDIR - 1),
name, namelen + 1);
fd = open (name, oflag, mode);
if (fd != -1)
{
/* We got a descriptor. Now set the FD_CLOEXEC bit. */
int flags = fcntl (fd, F_GETFD, 0);
if (__builtin_expect (flags, 0) != -1)
{
flags |= FD_CLOEXEC;
flags = fcntl (fd, F_SETFD, flags);
}
if (flags == -1)
{
/* Something went wrong. We cannot return the descriptor. */
int save_errno = errno;
close (fd);
fd = -1;
__set_errno (save_errno);
}
}
return fd;
}
#endif
#include <unistd.h>
#if ! _POSIX_MAPPED_FILES
#include <rt/shm_unlink.c>
#else
#include <errno.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
#include <paths.h>
#define SHMDIR (_PATH_DEV "shm/")
/* Remove shared memory object. */
int
shm_unlink (const char *name)
{
size_t namelen;
char *fname;
/* Construct the filename. */
while (name[0] == '/')
++name;
if (name[0] == '/0')
{
/* The name "/" is not supported. */
__set_errno (EINVAL);
return -1;
}
namelen = strlen (name);
fname = (char *) __alloca (sizeof SHMDIR - 1 + namelen + 1);
__mempcpy (__mempcpy (fname, SHMDIR, sizeof SHMDIR - 1),
name, namelen + 1);
return unlink (name);
}
#endif