8 #include <linux/memfd.h>
9 #include <linux/unistd.h>
12 #include <sys/types.h>
25 #undef IMPL_SHM_MKSTEMP
26 #undef IMPL_UNLINK_OR_CLOSE
29 #ifdef __NR_memfd_create
65 #define IMPL_SHM_MKSTEMP
73 #define IMPL_UNLINK_OR_CLOSE
76 #ifdef IMPL_SHM_MKSTEMP
77 #define IMPL_UNLINK_OR_CLOSE
80 #ifdef IMPL_UNLINK_OR_CLOSE
82 shm_unlink_or_close(
const char *name,
int fd)
86 if (shm_unlink(name) == -1) {
100 char name[16] =
"/shm-";
103 char *
const limit = name +
sizeof(name) - 1;
109 start = name + strlen(name);
110 for (tries = 0; tries < 4; tries++) {
111 clock_gettime(CLOCK_REALTIME, &tv);
112 r = (
unsigned long)tv.tv_sec + (
unsigned long)tv.tv_nsec;
113 for (fill = start; fill < limit; r /= 8)
114 *fill++ =
'0' + (r % 8);
116 name, O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600);
118 return shm_unlink_or_close(name,
fd);
126 #ifdef IMPL_SHM_MKSTEMP
130 char name[16] =
"/shm-XXXXXXXXXX";
133 if ((
fd = shm_mkstemp(name)) == -1)
135 return shm_unlink_or_close(name,
fd);
143 return shm_open(SHM_ANON, O_RDWR, 0);
152 __NR_memfd_create,
"shm_anon", (
unsigned int)(MFD_CLOEXEC));