]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/memfd-util.c
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 int memfd_map(int fd
, uint64_t offset
, size_t size
, void **p
) {
84 sealed
= memfd_get_sealed(fd
);
89 q
= mmap(NULL
, size
, PROT_READ
, MAP_PRIVATE
, fd
, offset
);
91 q
= mmap(NULL
, size
, PROT_READ
| PROT_WRITE
, MAP_SHARED
, fd
, offset
);
100 int memfd_set_sealed(int fd
) {
105 r
= fcntl(fd
, F_ADD_SEALS
, F_SEAL_SHRINK
| F_SEAL_GROW
| F_SEAL_WRITE
| F_SEAL_SEAL
);
112 int memfd_get_sealed(int fd
) {
117 r
= fcntl(fd
, F_GET_SEALS
);
121 return r
== (F_SEAL_SHRINK
| F_SEAL_GROW
| F_SEAL_WRITE
| F_SEAL_SEAL
);
124 int memfd_get_size(int fd
, uint64_t *sz
) {
131 r
= fstat(fd
, &stat
);
139 int memfd_set_size(int fd
, uint64_t sz
) {
144 r
= ftruncate(fd
, sz
);
151 int memfd_new_and_map(const char *name
, size_t sz
, void **p
) {
152 _cleanup_close_
int fd
= -1;
158 fd
= memfd_new(name
);
162 r
= memfd_set_size(fd
, sz
);
166 r
= memfd_map(fd
, 0, sz
, p
);