#include "lint.h"
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <limits.h>
#include <errno.h>
#include "pos4obj.h"
int
shm_open(const char *path, int oflag, mode_t mode)
{
int crflag;
int fd;
int flags;
if (__pos4obj_check(path) == -1)
return (-1);
if (__pos4obj_lock(path, SHM_LOCK_TYPE) < 0)
return (-1);
fd = __pos4obj_open(path, SHM_DATA_TYPE, oflag, mode, &crflag);
if (fd < 0) {
(void) __pos4obj_unlock(path, SHM_LOCK_TYPE);
return (-1);
}
if ((flags = fcntl(fd, F_GETFD)) < 0 ||
fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) {
(void) __pos4obj_unlock(path, SHM_LOCK_TYPE);
(void) __close_nc(fd);
return (-1);
}
if (__pos4obj_unlock(path, SHM_LOCK_TYPE) < 0) {
(void) __close_nc(fd);
return (-1);
}
return (fd);
}
int
shm_unlink(const char *path)
{
int oerrno;
int err;
if (__pos4obj_check(path) < 0)
return (-1);
if (__pos4obj_lock(path, SHM_LOCK_TYPE) < 0)
return (-1);
err = __pos4obj_unlink(path, SHM_DATA_TYPE);
oerrno = errno;
(void) __pos4obj_unlock(path, SHM_LOCK_TYPE);
errno = oerrno;
return (err);
}