about summary refs log tree commit diff
path: root/posix
diff options
context:
space:
mode:
authorSergey Bugaev <bugaevc@gmail.com>2023-01-30 15:52:16 +0300
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-02-01 23:36:11 +0100
commita979b72747e34add3433a23c0966490cd809120f (patch)
tree45d4888dc9ee62a8d851dc27b435516f827718b5 /posix
parent65392c84782a53b0d7705ca0207c95c3da41c7dc (diff)
downloadglibc-a979b72747e34add3433a23c0966490cd809120f.tar.gz
glibc-a979b72747e34add3433a23c0966490cd809120f.tar.xz
glibc-a979b72747e34add3433a23c0966490cd809120f.zip
hurd: Implement SHM_ANON
This adds a special SHM_ANON value that can be passed into shm_open ()
in place of a name. When called in this way, shm_open () will create a
new anonymous shared memory file. The file will be created in the same
way that other shared memory files are created (i.e., under /dev/shm/),
except that it is not given a name and therefore cannot be reached from
the file system, nor by other calls to shm_open (). This is accomplished
by utilizing O_TMPFILE.

This is intended to be compatible with FreeBSD's API of the same name.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
Message-Id: <20230130125216.6254-4-bugaevc@gmail.com>
Diffstat (limited to 'posix')
-rw-r--r--posix/shm-directory.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/posix/shm-directory.c b/posix/shm-directory.c
index 47e2355d0d..86d9fd8e4f 100644
--- a/posix/shm-directory.c
+++ b/posix/shm-directory.c
@@ -23,17 +23,34 @@
 #include <alloc_buffer.h>
 #include <shm-directory.h>
 #include <string.h>
+#include <sys/mman.h>
+#include <fcntl.h>
 
 int
 __shm_get_name (struct shmdir_name *result, const char *name, bool sem_prefix)
 {
+  struct alloc_buffer buffer;
+  size_t namelen;
+
+  buffer = alloc_buffer_create (result->name, sizeof (result->name));
+  alloc_buffer_copy_bytes (&buffer, SHMDIR, strlen (SHMDIR));
+
+#if defined (SHM_ANON) && defined (O_TMPFILE)
+  if (name == SHM_ANON)
+    {
+      /* For SHM_ANON, we want shm_open () to pass O_TMPFILE to open (),
+         with SHMDIR itself as the path.  So, leave it at that.  */
+      alloc_buffer_add_byte (&buffer, 0);
+      if (alloc_buffer_has_failed (&buffer))
+        return -1;
+      return 0;
+    }
+#endif
+
   while (name[0] == '/')
     ++name;
-  size_t namelen = strlen (name);
+  namelen = strlen (name);
 
-  struct alloc_buffer buffer
-    = alloc_buffer_create (result->name, sizeof (result->name));
-  alloc_buffer_copy_bytes (&buffer, SHMDIR, strlen (SHMDIR));
   if (sem_prefix)
     alloc_buffer_copy_bytes (&buffer, "sem.", strlen ("sem."));
   alloc_buffer_copy_bytes (&buffer, name, namelen + 1);