return strcpy(str, str + l);
}
-void
-parse_cmdline(char* line, char** cmd, char** arg_part)
+int
+parse_cmdline(char* line, char** args)
{
strrtrim(line);
line = strltrim_safe(line);
}
l++;
}
- *cmd = line;
- if (c) {
- *arg_part = strltrim_safe(line + l);
+
+ args[0] = line;
+ if (c && l) {
+ args[1] = strltrim_safe(line + l);
} else {
- *arg_part = NULL;
+ args[1] = NULL;
}
+
+ return !!l;
}
void
}
void
-sh_exec(const char* name, const char** argv)
+sh_exec(const char** argv)
{
+ const char* envp[] = { 0 };
+ char* name = argv[0];
if (!strcmp(name, "cd")) {
- chdir(argv[0]);
+ chdir(argv[1] ? argv[1] : ".");
sh_printerr();
return;
}
pid_t p;
if (!(p = fork())) {
- if (execve(name, argv, NULL)) {
+ if (execve(name, argv, envp)) {
sh_printerr();
}
_exit(1);
// stdout (by default, unless user did smth) is the tty we are currently at
ioctl(stdout, TIOCSPGRP, getpgid());
- char* argv[] = { 0, 0 };
+ char* argv[] = {0, 0, 0};
while (1) {
getcwd(pwd, 512);
- printf("[\033[2m%s\033[39;49m]$ ", pwd);
+ printf("[%s]$ ", pwd);
int sz = read(stdin, buf, 511);
if (sz < 0) {
buf[sz] = '\0';
// currently, this shell only support single argument
- parse_cmdline(buf, &cmd, &argv[0]);
-
- if (cmd[0] == 0) {
+ if (!parse_cmdline(buf, argv)) {
printf("\n");
goto cont;
}
// cmd=="exit"
- if (*(unsigned int*)cmd == 0x74697865U) {
+ if (*(unsigned int*)argv[0] == 0x74697865U) {
break;
}
- sh_exec(cmd, (const char**)&argv);
+ sh_exec((const char**)argv);
cont:
printf("\n");
}
void
main()
{
- printf("\n Simple shell. Use <PG_UP> or <PG_DOWN> to scroll.\n\n");
sh_loop();
_exit(0);
}
\ No newline at end of file