#include #include #include #include #include #include #include /** * NOTE: requires fdescfs to be mounted to run interpreted files (starting with #!) */ char *args[] = { "batchrun", NULL }; int main(int argc, char **argv) { char buf[2]; ssize_t ret; int tries = 0; int fd = 3; 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()"); }