diff options
author | Roland McGrath <roland@hack.frob.com> | 2014-12-11 14:15:51 -0800 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2014-12-11 16:19:11 -0800 |
commit | 78e21c5df674e037d06e86c5d4cb95818c8f6b8c (patch) | |
tree | 41b2d0b9e5fcb5cb2709a24a93364e172306740a /sysdeps/posix/shm_open.c | |
parent | f82c43af8aebc5a270c8be06055ee5a38063bac3 (diff) | |
download | glibc-78e21c5df674e037d06e86c5d4cb95818c8f6b8c.tar.gz |
Refactor shm_{open,unlink} code to separate Linux-specific directory choice from POSIX-generic code.
Diffstat (limited to 'sysdeps/posix/shm_open.c')
-rw-r--r-- | sysdeps/posix/shm_open.c | 54 |
1 files changed, 23 insertions, 31 deletions
diff --git a/sysdeps/posix/shm_open.c b/sysdeps/posix/shm_open.c index 456b3d8b8f..064fecf3f2 100644 --- a/sysdeps/posix/shm_open.c +++ b/sysdeps/posix/shm_open.c @@ -19,50 +19,41 @@ #include <unistd.h> #if ! _POSIX_MAPPED_FILES -#include <rt/shm_open.c> + +# 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> +# include <fcntl.h> +# include <shm-directory.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); + SHM_GET_NAME (EINVAL, -1); + +# ifdef O_NOFOLLOW + oflag |= O_NOFOLLOW; +# endif +# ifdef O_CLOEXEC + oflag |= O_CLOEXEC; +# endif + int fd = open (shm_name, oflag, mode); + if (fd == -1 && __glibc_unlikely (errno == EISDIR)) + /* It might be better to fold this error with EINVAL since + directory names are just another example for unsuitable shared + object names and the standard does not mention EISDIR. */ + __set_errno (EINVAL); + +# ifndef O_CLOEXEC 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) + if (__glibc_likely (flags != -1)) { flags |= FD_CLOEXEC; flags = fcntl (fd, F_SETFD, flags); @@ -77,8 +68,9 @@ shm_open (const char *name, int oflag, mode_t mode) __set_errno (save_errno); } } +# endif return fd; } -#endif +#endif /* _POSIX_MAPPED_FILES */ |