static const pid_t _gen_child() { uint8_t buf[PAGE_SIZE]; mem_assign(buf, PAGE_SIZE, TRAP, TRAP_SZ); uint8_t *elf; const size_t elf_sz = gen_elf(&elf, options.start, (uint8_t *)buf, PAGE_SIZE); const int exe_fd = write_exe(elf, elf_sz, options.savefile); free(elf); const pid_t tracee = fork(); if (tracee < 0) { perror("fork"); exit(EXIT_FAILURE); } else if (tracee == 0) { ptrace_child(exe_fd); abort(); } // Parent close(exe_fd); return tracee; }
static int start_ptraced_child(void) { int pid, n, status; pid = fork(); if (pid == 0) ptrace_child(); else if (pid < 0) fatal_perror("start_ptraced_child : fork failed"); CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); if (n < 0) fatal_perror("check_ptrace : waitpid failed"); if (!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGSTOP)) fatal("check_ptrace : expected SIGSTOP, got status = %d", status); return pid; }