void
sh_exec(const char** argv)
{
+ static int prev_exit;
const char* envp[] = { 0 };
char* name = argv[0];
if (!strcmp(name, "cd")) {
return;
}
+ if (!strcmp(name, "?")) {
+ printf("%d\n", prev_exit);
+ return;
+ }
+
+ char buffer[1024];
+ strcpy(buffer, "/bin/");
+ strcpy(&buffer[5], name);
+
pid_t p;
+ int res;
if (!(p = fork())) {
- if (execve(name, argv, envp)) {
+ if (execve(buffer, argv, envp)) {
sh_printerr();
}
_exit(1);
}
setpgid(p, getpgid());
- waitpid(p, NULL, 0);
+ waitpid(p, &res, 0);
+
+ prev_exit = WEXITSTATUS(res);
}
static char*
while (1) {
getcwd(pwd, 512);
- printf("[%s]$ ", pwd);
+ printf("%s # ", pwd);
int sz = read(stdin, buf, 511);
if (sz < 0) {
// currently, this shell only support single argument
if (!parse_cmdline(buf, argv)) {
- printf("\n");
- goto cont;
+ continue;
}
// cmd=="exit"
break;
}
- sh_exec((const char**)argv);
- cont:
- printf("\n");
+ sh_exec((const char**)argv);
}
}