52 lines
1.5 KiB
C
52 lines
1.5 KiB
C
#include "headers/nstdo.h"
|
|
extern long sys_read(int fd, void *buf, size_t cnt);
|
|
extern long sys_write(int fd, const void *buf, size_t cnt);
|
|
extern long sys_fork(void);
|
|
extern long sys_execve(const char *filename, char *const argv[], char *const envp[]);
|
|
extern long sys_wait4(int pid, int *wstatus, int options, void *rusage);
|
|
extern void sys_exit(int status);
|
|
|
|
static int streq(const char *a, const char *b) {
|
|
while (*a && *b) {
|
|
if (*a != *b) return 0;
|
|
a++; b++;
|
|
}
|
|
return *a == *b;
|
|
}
|
|
|
|
static long str_len(const char *s) {
|
|
long len = 0;
|
|
while (s[len]) len++;
|
|
return len;
|
|
}
|
|
|
|
int main(int argc, char *argv[], char *envp[]) {
|
|
(void)argc; (void)argv;
|
|
const char prompt[] = "$ ";
|
|
char buf[512];
|
|
while (1) {
|
|
sys_write(1, prompt, sizeof(prompt)-1);
|
|
long n = sys_read(0, buf, sizeof(buf)-1);
|
|
if (n <= 0) break;
|
|
buf[n-1] = '\0';
|
|
if (streq(buf, "help")) {
|
|
const char *h1 = " help - display this help message\n";
|
|
const char *h2 = " exit - exit the shell\n";
|
|
sys_write(1, h1, str_len(h1));
|
|
sys_write(1, h2, str_len(h2));
|
|
continue;
|
|
}
|
|
if (streq(buf, "exit")) {
|
|
break;
|
|
}
|
|
char *args[] = { buf, NULL };
|
|
long pid = sys_fork();
|
|
if (pid == 0) {
|
|
sys_execve(buf, args, envp);
|
|
sys_exit(1);
|
|
} else {
|
|
sys_wait4(pid, 0, 0, 0);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|