diff options
Diffstat (limited to 'sysdeps/posix')
-rw-r--r-- | sysdeps/posix/Makefile | 4 | ||||
-rw-r--r-- | sysdeps/posix/shm-directory.c | 3 | ||||
-rw-r--r-- | sysdeps/posix/shm-directory.h | 11 | ||||
-rw-r--r-- | sysdeps/posix/shm_open.c | 2 | ||||
-rw-r--r-- | sysdeps/posix/shm_unlink.c | 2 |
5 files changed, 15 insertions, 7 deletions
diff --git a/sysdeps/posix/Makefile b/sysdeps/posix/Makefile index 8e5f7c3bba..52f20f5d97 100644 --- a/sysdeps/posix/Makefile +++ b/sysdeps/posix/Makefile @@ -4,6 +4,8 @@ TMP_MAX = 238328 L_ctermid = 9 L_cuserid = 9 -ifeq ($(subdir),rt) +ifeq ($(subdir)|$(have-thread-library),rt|no) +# With NPTL, this lives in libpthread so it can be used for sem_open too. +# Without NPTL, it's just private in librt. librt-routines += shm-directory endif diff --git a/sysdeps/posix/shm-directory.c b/sysdeps/posix/shm-directory.c index aea5f963b0..5623d32c1d 100644 --- a/sysdeps/posix/shm-directory.c +++ b/sysdeps/posix/shm-directory.c @@ -31,5 +31,8 @@ __shm_directory (size_t *len) *len = sizeof SHMDIR - 1; return SHMDIR; } +# if IS_IN (libpthread) +hidden_def (__shm_directory) +# endif #endif diff --git a/sysdeps/posix/shm-directory.h b/sysdeps/posix/shm-directory.h index 1c4d965b28..84f1f94c80 100644 --- a/sysdeps/posix/shm-directory.h +++ b/sysdeps/posix/shm-directory.h @@ -36,9 +36,10 @@ extern const char *__shm_directory (size_t *len); strlen (NAME) + 1. If NAME is invalid, it sets errno to ERRNO_FOR_INVALID and returns RETVAL_FOR_INVALID. Finally, it defines the local variable SHM_NAME, giving the absolute file name of the shm - file corresponding to NAME. */ + file corresponding to NAME. PREFIX is a string constant used as a + prefix on NAME. */ -#define SHM_GET_NAME(errno_for_invalid, retval_for_invalid) \ +#define SHM_GET_NAME(errno_for_invalid, retval_for_invalid, prefix) \ size_t shm_dirlen; \ const char *shm_dir = __shm_directory (&shm_dirlen); \ /* If we don't know what directory to use, there is nothing we can do. */ \ @@ -57,7 +58,9 @@ extern const char *__shm_directory (size_t *len); __set_errno (errno_for_invalid); \ return retval_for_invalid; \ } \ - char *shm_name = __alloca (shm_dirlen + namelen); \ - __mempcpy (__mempcpy (shm_name, shm_dir, shm_dirlen), name, namelen) + char *shm_name = __alloca (shm_dirlen + sizeof prefix - 1 + namelen); \ + __mempcpy (__mempcpy (__mempcpy (shm_name, shm_dir, shm_dirlen), \ + prefix, sizeof prefix - 1), \ + name, namelen) #endif /* shm-directory.h */ diff --git a/sysdeps/posix/shm_open.c b/sysdeps/posix/shm_open.c index 064fecf3f2..1f017c55c6 100644 --- a/sysdeps/posix/shm_open.c +++ b/sysdeps/posix/shm_open.c @@ -32,7 +32,7 @@ int shm_open (const char *name, int oflag, mode_t mode) { - SHM_GET_NAME (EINVAL, -1); + SHM_GET_NAME (EINVAL, -1, ""); # ifdef O_NOFOLLOW oflag |= O_NOFOLLOW; diff --git a/sysdeps/posix/shm_unlink.c b/sysdeps/posix/shm_unlink.c index 81c3a02642..7d69c63258 100644 --- a/sysdeps/posix/shm_unlink.c +++ b/sysdeps/posix/shm_unlink.c @@ -32,7 +32,7 @@ int shm_unlink (const char *name) { - SHM_GET_NAME (ENOENT, -1); + SHM_GET_NAME (ENOENT, -1, ""); int result = unlink (shm_name); if (result < 0 && errno == EPERM) |