]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
tests: (mkfds) add a factory to make SysV shmem
authorMasatake YAMATO <yamato@redhat.com>
Wed, 12 Apr 2023 00:14:49 +0000 (09:14 +0900)
committerMasatake YAMATO <yamato@redhat.com>
Tue, 23 May 2023 16:41:47 +0000 (01:41 +0900)
Signed-off-by: Masatake YAMATO <yamato@redhat.com>
tests/helpers/test_mkfds.c

index 85e739219cf220d00d893cddf71d0a7c89e3b2af..9377d28a9e029dba210c5f0b15569c5ff360d629 100644 (file)
@@ -44,6 +44,7 @@
 #include <sys/prctl.h>
 #include <sys/select.h>
 #include <sys/socket.h>
+#include <sys/shm.h>
 #include <sys/syscall.h>
 #include <sys/types.h>
 #include <sys/un.h>
@@ -2185,6 +2186,44 @@ static void *make_mqueue(const struct factory *factory _U_, struct fdesc fdescs[
 
        return mqueue_data;
 }
+struct sysvshm_data {
+       void *addr;
+       int id;
+};
+
+static void *make_sysvshm(const struct factory *factory _U_, struct fdesc fdescs[] _U_,
+                         int argc _U_, char ** argv _U_)
+{
+       size_t pagesize = getpagesize();
+       struct sysvshm_data *sysvshm_data;
+       int id = shmget(IPC_PRIVATE, pagesize, IPC_CREAT | 0600);
+       void *start;
+
+       if (id == -1)
+               err(EXIT_FAILURE, "failed to do shmget(.., %zu, ...)",
+                   pagesize);
+
+       start = shmat(id, NULL, SHM_RDONLY);
+       if (start == (void *) -1) {
+               int e = errno;
+               shmctl(id, IPC_RMID, NULL);
+               errno = e;
+               err(EXIT_FAILURE, "failed to do shmat(%d,...)", id);
+       }
+
+       sysvshm_data = xmalloc(sizeof(*sysvshm_data));
+       sysvshm_data->addr = start;
+       sysvshm_data->id = id;
+       return sysvshm_data;
+}
+
+static void free_sysvshm(const struct factory *factory _U_, void *data)
+{
+       struct sysvshm_data *sysvshm_data = data;
+
+       shmdt(sysvshm_data->addr);
+       shmctl(sysvshm_data->id, IPC_RMID, NULL);
+}
 
 #define PARAM_END { .name = NULL, }
 static const struct factory factories[] = {
@@ -2783,6 +2822,18 @@ static const struct factory factories[] = {
                        PARAM_END
                }
        },
+       {
+               .name = "sysvshm",
+               .desc = "shared memory mapped with SYSVIPC shmem syscalls",
+               .priv = false,
+               .N = 0,
+               .EX_N = 0,
+               .make = make_sysvshm,
+               .free = free_sysvshm,
+               .params = (struct parameter []) {
+                       PARAM_END
+               },
+       },
 };
 
 static int count_parameters(const struct factory *factory)