/* By David Mazieres */ #include #include #include #include #include #include #include char **av; int avsize; void avreserve (int n) { int oldavsize = avsize; if (avsize > n + 1) return; avsize = 2 * (oldavsize + 1); av = realloc (av, avsize * sizeof (*av)); while (oldavsize < avsize) av[oldavsize++] = NULL; } void parseline (char *line) { char *a; int n; for (n = 0; n < avsize; n++) av[n] = NULL; a = strtok (line, " \t\r\n"); for (n = 0; a; n++) { avreserve (n); av[n] = a; a = strtok (NULL, " \t\r\n"); } } void doexec (void) { execvp (av[0], av); perror (av[0]); exit (1); } int main (void) { char buf[512]; char *line; int pid; avreserve (10); for (;;) { write (2, "$ ", 2); if (!(line = fgets (buf, sizeof (buf), stdin))) { write (2, "EOF\n", 4); exit (0); } parseline (line); if (!av[0]) continue; switch (pid = fork ()) { case -1: perror ("fork"); break; case 0: doexec (); break; default: waitpid (pid, NULL, 0); break; } } }