summaryrefslogtreecommitdiff
path: root/src/basic/memfd-util.c
diff options
context:
space:
mode:
authorDaan De Meyer <daan.j.demeyer@gmail.com>2023-03-08 14:42:24 +0100
committerDaan De Meyer <daan.j.demeyer@gmail.com>2023-03-09 13:46:55 +0100
commit44777d7ad6b22ab65a9361b2519bc4b516b02eab (patch)
tree2dd4c06a75098b5e071b65f8930de8882b805ed9 /src/basic/memfd-util.c
parent81707069fc0e6b5fc28752a625695e226e136e3b (diff)
downloadsystemd-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.c31
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);
+}