diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-06-07 00:06:49 +0200 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-06-07 00:06:49 +0200 |
commit | 85f37eb9f6fd8b633d312dbd5471d06a75762956 (patch) | |
tree | 4d5748ee166ef19773a007befecf0c220d51bb82 | |
parent | cdf2238a33d63947ad70b0c26a3b4f4fe1f18454 (diff) |
Add cloexec
-rw-r--r-- | c/cloexec/.gitignore | 1 | ||||
-rw-r--r-- | c/cloexec/Makefile | 8 | ||||
-rw-r--r-- | c/cloexec/cloexec.c | 26 |
3 files changed, 35 insertions, 0 deletions
diff --git a/c/cloexec/.gitignore b/c/cloexec/.gitignore new file mode 100644 index 0000000..089a255 --- /dev/null +++ b/c/cloexec/.gitignore @@ -0,0 +1 @@ +cloexec diff --git a/c/cloexec/Makefile b/c/cloexec/Makefile new file mode 100644 index 0000000..1c57a62 --- /dev/null +++ b/c/cloexec/Makefile @@ -0,0 +1,8 @@ +include ../base.mk + +all: cloexec +cloexec: cloexec.c + $(CC) $(CFLAGS) -o $@ $< + +clean: + rm -f cloexec diff --git a/c/cloexec/cloexec.c b/c/cloexec/cloexec.c new file mode 100644 index 0000000..ba899ee --- /dev/null +++ b/c/cloexec/cloexec.c @@ -0,0 +1,26 @@ +#define _GNU_SOURCE +#include <assert.h> +#include <err.h> +#include <paths.h> +#include <fcntl.h> +#include <unistd.h> + +int +main(void) +{ + int fd, nfd; + + if ((fd = open(_PATH_DEVNULL, O_RDONLY | O_CLOEXEC)) == -1) + err(1, "open: %s", _PATH_DEVNULL); + + if ((nfd = dup(fd)) == -1) + err(1, "dup"); + assert((fcntl(nfd, F_GETFD) & FD_CLOEXEC) == 0); + close(nfd); + if (dup3(fd, nfd, O_CLOEXEC) == -1) + err(1, "dup"); + assert((fcntl(nfd, F_GETFD) & FD_CLOEXEC) != 0); + + close(nfd); + close(fd); +} |