changed from fgets to readline do to file completion.
This commit is contained in:
@@ -3,6 +3,8 @@
|
|||||||
#include<sys/wait.h>
|
#include<sys/wait.h>
|
||||||
#include<unistd.h>
|
#include<unistd.h>
|
||||||
#include<string.h>
|
#include<string.h>
|
||||||
|
#include<readline/readline.h>
|
||||||
|
#include<readline/history.h>
|
||||||
int handleBuiltins(char **args) {
|
int handleBuiltins(char **args) {
|
||||||
if(strcmp(args[0], "cd") == 0) {
|
if(strcmp(args[0], "cd") == 0) {
|
||||||
chdir(args[1] == NULL ? getenv("HOME") : args[1]);
|
chdir(args[1] == NULL ? getenv("HOME") : args[1]);
|
||||||
@@ -25,20 +27,20 @@ char **parse(char *line) {
|
|||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
int main() {
|
int main() {
|
||||||
char line[1024];
|
|
||||||
while(1) {
|
while(1) {
|
||||||
char *user = getenv("USER");
|
char *user = getenv("USER");
|
||||||
char dir[1024];
|
char dir[1024];
|
||||||
getcwd(dir, sizeof(dir));
|
getcwd(dir, sizeof(dir));
|
||||||
char host[1024];
|
char host[1024];
|
||||||
gethostname(host, sizeof(host));
|
gethostname(host, sizeof(host));
|
||||||
printf("%s@%s %s$", user, host, dir);
|
char prompt[2048];
|
||||||
fflush(stdout);
|
snprintf(prompt, sizeof(prompt), "%s@%s %s$ ", user, host, dir);
|
||||||
char *result = fgets(line, sizeof(line), stdin);
|
char *line = readline(prompt);
|
||||||
if(result == NULL) return 0;
|
if(line == NULL) return 0;
|
||||||
|
if(line && *line) add_history(line);
|
||||||
char **parsed = parse(line);
|
char **parsed = parse(line);
|
||||||
if(parsed[0] == NULL) { free(parsed); continue; }
|
if(parsed[0] == NULL) { free(parsed); free(line); continue; }
|
||||||
if(handleBuiltins(parsed)) { free(parsed); continue; }
|
if(handleBuiltins(parsed)) { free(line); free(parsed); continue; }
|
||||||
pid_t pid = fork();
|
pid_t pid = fork();
|
||||||
if(pid == 0) {
|
if(pid == 0) {
|
||||||
if(execvp(parsed[0], parsed) == -1 ) {
|
if(execvp(parsed[0], parsed) == -1 ) {
|
||||||
@@ -49,6 +51,7 @@ int main() {
|
|||||||
wait(NULL);
|
wait(NULL);
|
||||||
}
|
}
|
||||||
free(parsed);
|
free(parsed);
|
||||||
|
free(line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user