2 This file is part of systemd.
4 Copyright 2013 Lennart Poettering
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
24 #ifdef HAVE_LINUX_MEMFD_H
25 #include <linux/memfd.h>
29 #include <sys/prctl.h>
31 #include "alloc-util.h"
34 #include "memfd-util.h"
36 #include "string-util.h"
39 int memfd_new(const char *name) {
40 _cleanup_free_ char *g = NULL;
46 /* If no name is specified we generate one. We include
47 * a hint indicating our library implementation, and
48 * add the thread name to it */
50 assert_se(prctl(PR_GET_NAME, (unsigned long) pr) >= 0);
55 _cleanup_free_ char *e = NULL;
57 e = utf8_escape_invalid(pr);
61 g = strappend("sd-", e);
69 fd = memfd_create(name, MFD_ALLOW_SEALING | MFD_CLOEXEC);
76 #if 0 /// UNNEEDED by elogind
77 int memfd_map(int fd, uint64_t offset, size_t size, void **p) {
85 sealed = memfd_get_sealed(fd);
90 q = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, offset);
92 q = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
102 int memfd_set_sealed(int fd) {
107 r = fcntl(fd, F_ADD_SEALS, F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE | F_SEAL_SEAL);
114 #if 0 /// UNNEEDED by elogind
115 int memfd_get_sealed(int fd) {
120 r = fcntl(fd, F_GET_SEALS);
124 return r == (F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_WRITE | F_SEAL_SEAL);
127 int memfd_get_size(int fd, uint64_t *sz) {
134 r = fstat(fd, &stat);
143 int memfd_set_size(int fd, uint64_t sz) {
148 r = ftruncate(fd, sz);
155 #if 0 /// UNNEEDED by elogind
156 int memfd_new_and_map(const char *name, size_t sz, void **p) {
157 _cleanup_close_ int fd = -1;
163 fd = memfd_new(name);
167 r = memfd_set_size(fd, sz);
171 r = memfd_map(fd, 0, sz, p);