From: Masatake YAMATO Date: Wed, 12 Apr 2023 00:14:49 +0000 (+0900) Subject: tests: (mkfds) add a factory to make SysV shmem X-Git-Tag: v2.40-rc1~432^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c3f8cba1d4bc9970b8768e38520487bbef6a0a8f;p=thirdparty%2Futil-linux.git tests: (mkfds) add a factory to make SysV shmem Signed-off-by: Masatake YAMATO --- diff --git a/tests/helpers/test_mkfds.c b/tests/helpers/test_mkfds.c index 85e739219c..9377d28a9e 100644 --- a/tests/helpers/test_mkfds.c +++ b/tests/helpers/test_mkfds.c @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -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)