From b7a0bfbd2f3eca602584f51f935599a776784a93 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Mon, 21 Jun 2021 08:25:15 +0200 Subject: 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 --- rt/shm_open.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) (limited to 'rt') 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 @@ . */ #include -#include +#include +#include +#include +#include /* 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) -- cgit 1.4.1