59 lines
1.2 KiB
C
59 lines
1.2 KiB
C
#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);
|
|
} |