diff options
author | Daan De Meyer <daan.j.demeyer@gmail.com> | 2023-03-08 14:42:24 +0100 |
---|---|---|
committer | Daan De Meyer <daan.j.demeyer@gmail.com> | 2023-03-09 13:46:55 +0100 |
commit | 44777d7ad6b22ab65a9361b2519bc4b516b02eab (patch) | |
tree | 2dd4c06a75098b5e071b65f8930de8882b805ed9 /src/basic/memfd-util.c | |
parent | 81707069fc0e6b5fc28752a625695e226e136e3b (diff) | |
download | systemd-44777d7ad6b22ab65a9361b2519bc4b516b02eab.tar.gz |
memfd-util: Add memfd_new_and_seal()
Diffstat (limited to 'src/basic/memfd-util.c')
-rw-r--r-- | src/basic/memfd-util.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/basic/memfd-util.c b/src/basic/memfd-util.c index fb86ac2b5b..96024bc485 100644 --- a/src/basic/memfd-util.c +++ b/src/basic/memfd-util.c @@ -133,3 +133,34 @@ int memfd_new_and_map(const char *name, size_t sz, void **p) { return TAKE_FD(fd); } + +int memfd_new_and_seal(const char *name, const void *data, size_t sz) { + _cleanup_close_ int fd = -EBADF; + ssize_t n; + off_t f; + int r; + + assert(data || sz == 0); + + fd = memfd_new(name); + if (fd < 0) + return fd; + + if (sz > 0) { + n = write(fd, data, sz); + if (n < 0) + return -errno; + if ((size_t) n != sz) + return -EIO; + + f = lseek(fd, 0, SEEK_SET); + if (f != 0) + return -errno; + } + + r = memfd_set_sealed(fd); + if (r < 0) + return r; + + return TAKE_FD(fd); +} |