From dca237d41e42bf82ca9871ca87666bcf73bce6cf Mon Sep 17 00:00:00 2001 From: Marius Halden Date: Fri, 4 Nov 2016 14:30:03 +0100 Subject: Allow setting fd through argv[1] and set O_CLOEXEC if file does not start with #! --- runfd.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/runfd.c b/runfd.c index 4e986fe..3a3260e 100644 --- a/runfd.c +++ b/runfd.c @@ -1,7 +1,10 @@ #include +#include #include #include #include +#include +#include /** * NOTE: requires fdescfs to be mounted to run interpreted files (starting with #!) @@ -10,10 +13,33 @@ char *args[] = { "batchrun", NULL }; int -main() +main(int argc, char **argv) { - //fcntl(3, F_SETFD, FD_CLOEXEC); + char buf[2]; + ssize_t ret; + int tries = 0; + int fd = 3; - fexecve(3, args, NULL); + if (argc > 1) { + fd = atoi(argv[1]); + } + +retry: + if (tries++ >= 3) + errx(1, "Failed to read file header"); + + ret = pread(fd, buf, sizeof(buf), 0); + if (ret == 2) { + if (strncmp(buf, "#!", 2) != 0) { + fcntl(3, F_SETFD, FD_CLOEXEC); + } + } else if (ret == -1) { + if (errno == EINTR) + goto retry; + } else if (ret != 0) { + goto retry; + } + + fexecve(fd, args, NULL); err(1, "fexecve()"); } -- cgit v1.2.3