Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fcntl.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <sys/wait.h>
- #include <limits.h>
- #include <stdlib.h>
- enum { NAME_SIZE = 23 };
- int
- main(int argc, char *argv[])
- {
- int fd_r = open("/dev/urandom", O_RDONLY);
- if (fd_r == -1) {
- return 1;
- }
- unsigned long long num_r;
- read(fd_r, &num_r, sizeof(num_r));
- char filename[NAME_SIZE];
- snprintf(filename, NAME_SIZE, "%llu%s", num_r, ".c");
- char fullpath[PATH_MAX];
- char *env = getenv("XDG_RUNTIME_DIR");
- if (env != NULL) {
- //
- } else if ((env = getenv("TMPDIR")) != NULL) {
- //
- } else {
- env = "/tmp";
- }
- snprintf(fullpath, PATH_MAX, "%s%s", env, filename);
- pid_t pid;
- int fd = open(fullpath , O_WRONLY | O_CREAT | O_CLOEXEC, 0600);
- FILE *f = fdopen(fd, "w");
- if (f == NULL) {
- return 1;
- }
- char *prog_beg =
- "#include <stdio.h>\n"
- "#include <stdlib.h>\n"
- "int\n"
- "main(int argc, char *argv[])\n"
- "{\n"
- "\tint x;\n"
- "\tchar *summon = \"summon\";\n"
- "\tchar *reject = \"reject\";\n"
- "\tchar *disqualify = \"disqualify\";\n"
- "\twhile (scanf(\"%d\", &x) == 1) {\n"
- "\t\tprintf(\"%s\\n\", ";
- char *prog_end =
- ");\n"
- "\t}\n"
- "\tremove(argv[0]);\n"
- "\tremove(argv[1]);\n"
- "\treturn 0;\n"
- "}";
- fprintf(f, "%s", prog_beg);
- fprintf(f, "%s", argv[1]);
- fprintf(f, "%s", prog_end);
- char fullpath_exec[PATH_MAX];
- read(fd_r, &num_r, sizeof(num_r));
- close(fd_r);
- snprintf(fullpath_exec, sizeof(fullpath_exec), ".%s%llu.o", env, num_r);
- fclose(f);
- pid = fork();
- if (pid == -1) {
- return 1;
- } else if (!pid) {
- execlp("gcc", "gcc", fullpath, "-o", fullpath_exec, NULL);
- _exit(1);
- }
- wait(NULL);
- pid = fork();
- if (pid == -1) {
- return 1;
- } else if (!pid) {
- execlp(fullpath_exec, fullpath_exec, fullpath, NULL);
- _exit(1);
- }
- wait(NULL);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement