#include #include #include #include #include #include #include #define ERRFILE "error.log" #define OUTFILE "output.log" int main (int argc, char ** argv) { int i, fd; pid_t pid; unlink (ERRFILE); unlink (OUTFILE); for (i = 1; i 0) { /* Parent */ int status; while (pid != wait (&status)); if (!WIFEXITED (status) || WEXITSTATUS (status)) { fprintf (stderr, "Error at file %s\n", argv[i]); } continue; } /* Child */ fd = open (ERRFILE, O_CREAT | O_WRONLY | O_APPEND, 0666); if (fd < 0) exit (1); if (dup2 (fd, 2) < 0) exit (1); if (fd != 2) close (fd); fd = open (OUTFILE, O_WRONLY | O_APPEND | O_CREAT, 0666); if (fd < 0) exit (1); if (dup2 (fd, 1) < 0) exit (1); if (fd != 1) close (fd); if (strncmp (argv[i], "patch.", 6) == 0) { fd = open (argv[i], O_RDONLY); if (fd < 0) exit (1); if (dup2 (fd, 0) < 0) exit (1); if (fd != 0) close (fd); execlp ("patch", "patch", NULL); } else { execlp ("gcc", "gcc", "-o", "output", argv[i], NULL); } /* exec failed */ exit (1); } return 0; }