#include "kernel/param.h" #include "kernel/stat.h" #include "kernel/types.h" #include "user/user.h" int main(int argc, char *argv[]) { if (argc < 2) { fprintf(2, "Usage: xargs command\n"); exit(1); } char *cmd[argc + 1]; int index = 0, data = 0; for (int i = 1; i < argc; ++i) { cmd[index++] = argv[i]; } char buffer[MAXARG]; char line[MAXARG] = {0}; int line_pos = 0; while ((data = read(0, buffer, MAXARG)) > 0) { for (int i = 0; i < data; ++i) { if (buffer[i] == '\n' || buffer[i] == ' ') { line[line_pos] = 0; if (line_pos > 0) { char *arg = malloc(line_pos + 1); strcpy(arg, line); cmd[index++] = arg; } line_pos = 0; if (buffer[i] == '\n') { cmd[index] = 0; if (fork() == 0) { exec(cmd[0], cmd); exit(1); } wait(0); index = argc - 1; } } else { line[line_pos++] = buffer[i]; } } } // bug fixed if (line_pos > 0) { line[line_pos] = 0; cmd[index++] = line; cmd[index] = 0; if (fork() == 0) { exec(cmd[0], cmd); } wait(0); } exit(0); }