diff options
-rw-r--r-- | Makefile | 32 | ||||
-rw-r--r-- | main.c | 35 |
2 files changed, 67 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..373aef4 --- /dev/null +++ b/Makefile @@ -0,0 +1,32 @@ +CC=cc +CFLAGS=-Wall -Wno-missing-braces -Wno-parentheses -Wno-switch -Wno-pointer-to-int-cast -fno-diagnostics-color -ggdb -c -O2 +LDFLAGS=-static +O=o +BIN=$(HOME)/bin + +TARG=paramedic +OFILES=\ + main.$O\ + +.PHONY: all clean +all: $(TARG) + +%.$O: %.c + $(CC) $(CFLAGS) $< + +$(OFILES): $(HFILES) + +$(TARG): $(OFILES) + $(CC) -o $@ $(OFILES) $(LIBS) $(LDFLAGS) + +install: $(TARG) + cp $(TARG) $(BIN)/ + +uninstall: + rm -f $(BIN)/$(TARG) + +man: + groff -man $(TARG).8.man | ps2pdf - >$(TARG).8.pdf + +clean: + rm $(TARG) *.o *.pdf @@ -0,0 +1,35 @@ +#define _GNU_SOURCE +#include <sys/mman.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> + +int +main(int argc, char *argv[]) +{ + char buf[1024]; + int mfd, n, cs; + + mfd = memfd_create("", MFD_CLOEXEC); + if(mfd < 0) + exit(1); + + while((n = read(0, buf, sizeof buf)) > 0) + if(write(mfd, buf, n) != n) + exit(2); + + switch(fork()){ + case -1: + exit(3); + case 0: + snprintf(buf, sizeof buf, "/proc/self/fd/%d", mfd); + execl(buf, "", NULL); + exit(66); + default: + wait(&cs); + } + exit(cs); +} |