git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Architectural Support: x86_64 (#37)
[lunaix-os.git]
/
lunaix-os
/
usr
/
sh
/
sh.c
diff --git
a/lunaix-os/usr/sh/sh.c
b/lunaix-os/usr/sh/sh.c
index 2c9bb8d1ec7fa2f5bb93198ab37e4280ff98ba35..2ac473a5a6b45839e596e0928a3970cf30eb0d6e 100644
(file)
--- a/
lunaix-os/usr/sh/sh.c
+++ b/
lunaix-os/usr/sh/sh.c
@@
-46,8
+46,8
@@
strltrim_safe(char* str)
return strcpy(str, str + l);
}
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);
{
strrtrim(line);
line = strltrim_safe(line);
@@
-60,12
+60,15
@@
parse_cmdline(char* line, char** cmd, char** arg_part)
}
l++;
}
}
l++;
}
- *cmd = line;
- if (c) {
- *arg_part = strltrim_safe(line + l);
+
+ args[0] = line;
+ if (c && l) {
+ args[1] = strltrim_safe(line + l);
} else {
} else {
-
*arg_part
= NULL;
+
args[1]
= NULL;
}
}
+
+ return !!l;
}
void
}
void
@@
-108,17
+111,19
@@
sigint_handle(int signum)
}
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")) {
if (!strcmp(name, "cd")) {
- chdir(argv[
0] ? argv[0
] : ".");
+ chdir(argv[
1] ? argv[1
] : ".");
sh_printerr();
return;
}
pid_t p;
if (!(p = fork())) {
sh_printerr();
return;
}
pid_t p;
if (!(p = fork())) {
- if (execve(name, argv,
NULL
)) {
+ if (execve(name, argv,
envp
)) {
sh_printerr();
}
_exit(1);
sh_printerr();
}
_exit(1);
@@
-139,7
+144,7
@@
sh_loop()
// stdout (by default, unless user did smth) is the tty we are currently at
ioctl(stdout, TIOCSPGRP, getpgid());
// 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);
while (1) {
getcwd(pwd, 512);
@@
-154,19
+159,17
@@
sh_loop()
buf[sz] = '\0';
// currently, this shell only support single argument
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"
printf("\n");
goto cont;
}
// cmd=="exit"
- if (*(unsigned int*)
cmd
== 0x74697865U) {
+ if (*(unsigned int*)
argv[0]
== 0x74697865U) {
break;
}
break;
}
- sh_exec(
cmd, (const char**)&
argv);
+ sh_exec(
(const char**)
argv);
cont:
printf("\n");
}
cont:
printf("\n");
}