diff options
author | Florian Weimer <fweimer@redhat.com> | 2021-06-21 08:25:15 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2021-06-21 08:25:15 +0200 |
commit | b7a0bfbd2f3eca602584f51f935599a776784a93 (patch) | |
tree | c1d0bc83894fe14a7031aca4b4bcb817b657f151 /rt | |
parent | a2014d311b2b2a7d8fcf2f502493404d7ec2601c (diff) | |
download | glibc-b7a0bfbd2f3eca602584f51f935599a776784a93.tar.gz glibc-b7a0bfbd2f3eca602584f51f935599a776784a93.tar.xz glibc-b7a0bfbd2f3eca602584f51f935599a776784a93.zip |
rt: Replace generic stub of shm_open with the posix version
Result of: git mv -f sysdeps/posix/shm_open.c rt and manual removal of the _POSIX_MAPPED_FILES preprocessor condition. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'rt')
-rw-r--r-- | rt/shm_open.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/rt/shm_open.c b/rt/shm_open.c index e2bd25978a..a89aac4102 100644 --- a/rt/shm_open.c +++ b/rt/shm_open.c @@ -1,4 +1,5 @@ -/* Copyright (C) 2000-2021 Free Software Foundation, Inc. +/* shm_open -- open a POSIX shared memory object. Generic POSIX file version. + Copyright (C) 2001-2021 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,13 +17,36 @@ <https://www.gnu.org/licenses/>. */ #include <errno.h> -#include <sys/mman.h> +#include <fcntl.h> +#include <pthread.h> +#include <shm-directory.h> +#include <unistd.h> /* Open shared memory object. */ int shm_open (const char *name, int oflag, mode_t mode) { - __set_errno (ENOSYS); - return -1; + struct shmdir_name dirname; + if (__shm_get_name (&dirname, name, false) != 0) + { + __set_errno (EINVAL); + return -1; + } + + oflag |= O_NOFOLLOW | O_CLOEXEC; + + /* Disable asynchronous cancellation. */ + int state; + pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state); + + int fd = open (dirname.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); + + pthread_setcancelstate (state, NULL); + + return fd; } -stub_warning (shm_open) |