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>
- 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));
- close(fd_r);
- char filename[NAME_SIZE];
- snprintf(filename, NAME_SIZE, "%llu%s", num_r, ".c");
- pid_t pid;
- char input[NAME_SIZE];
- int fd = open(filename, O_WRONLY | O_CREAT | O_CLOEXEC, 0600);
- if (fd == -1) {
- return 1;
- }
- char *prog_beg =
- "#include <stdio.h>\n"
- "#include <stdlib.h>\n"
- "int\n"
- "main(int argc, char *argv[])\n"
- "{\n"
- "\tint x = strtol(argv[1], NULL, 10);\n"
- "\tchar *summon = \"summon\";\n"
- "\tchar *reject = \"reject\";\n"
- "\tchar *disqualify = \"disqualify\";\n"
- "\tprintf(\"%s\\n\", ";
- char *prog_end =
- ");\n"
- "\treturn 0;\n"
- "}";
- dprintf(fd, "%s", prog_beg);
- dprintf(fd, "%s", argv[1]);
- dprintf(fd, "%s", prog_end);
- char filename_exec[NAME_SIZE+2];
- snprintf(filename_exec, sizeof(filename_exec), "%s.e", filename);
- pid = fork();
- if (pid < -1) {
- return 1;
- } else if (!pid) {
- execlp("gcc", "gcc", filename, "-o", filename_exec, NULL);
- _exit(1);
- }
- wait(NULL);
- while (scanf("%s", input) == 1) {
- pid = fork();
- if (pid == -1) {
- return 1;
- } else if (!pid) {
- execlp(filename_exec, filename_exec, input, NULL);
- _exit(1);
- }
- wait(NULL);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement