#include #include #include char *makeline(void); #define NUMARGS 470 #define MAXSIZE 5000 void run(char **cmd); Biobuf stdin; int main(int argc, char **argv) { char **cmd; int i, n, m, size; if (argc < 2) { fprint(2, "Usage: xargs [cmd args...]\n"); exits("bad usage"); } if (Binit(&stdin, 0, OREAD) == -1) { fprint(2, "couldn't init stdin\n"); exits("error"); } cmd = malloc((argc - 1 + NUMARGS + 1) * sizeof(char *)); n = 0; for (i = 1; i < argc; i++) { cmd[n++] = argv[i]; } for (;;) { int eof = 0;; size = 0; for (m = 0; m < NUMARGS && size < MAXSIZE; m++) { if ((cmd[n + m] = makeline()) == 0) { eof = 1; break; } size += strlen(cmd[n + m]); } cmd[n + m] = 0; if (m > 0) run(cmd); for (i = 0; i < m; i++) { free(cmd[n+i]); } if (eof) break; } return 0; } int pwait(void) { Waitmsg msg; if (wait(&msg) == -1) return -1; return atoi(msg.pid); } void run(char **cmd) { char buf[256]; int npid, pid = fork(); if (pid == -1) { perror("couldn't fork"); exits("no forkage"); } if (pid == 0) { if (cmd[0][0] != '/' && strncmp(cmd[0], "./", 2)) { sprint(buf, "/bin/%s", cmd[0]); exec(buf, cmd); } else { exec(cmd[0], cmd); } perror(cmd[0]); exits("no exec"); } while ((npid = pwait()) != pid && npid != -1) ; } char *makeline(void) { char *ln, *ret; int len; if ((ln = Brdline(&stdin, '\n')) == 0) { return 0; } len = Blinelen(&stdin); ret = malloc(len + 1); memcpy(ret, ln, len); ret[len-1] = '\0'; return ret; }