diff --git a/src/env.c b/src/env.c index b97b594..ddda81e 100644 --- a/src/env.c +++ b/src/env.c @@ -10,7 +10,7 @@ env *init_envs() { envs[0].value = "/"; envs[1].key = "USER"; - envs[1].value = "guams"; + envs[1].value = "iatic"; envs[2].key = "HOST"; envs[2].value = "tartempion"; diff --git a/src/exec.c b/src/exec.c index cec72da..a4efaec 100644 --- a/src/exec.c +++ b/src/exec.c @@ -31,15 +31,71 @@ int do_cd(disk *d, char *path) { return 1; } +#include "env.h" +#include +#include +#include +#include + +int do_echo(char **args) { + if (args[0] == NULL) { + printf("\n"); + return 1; + } + + char result[4096] = {0}; + int pos = 0; + + for (int i = 0; args[i] != NULL; i++) { + char *word = args[i]; + + for (int j = 0; word[j] != '\0'; j++) { + if (word[j] == '$' && word[j + 1] != '\0') { + j++; + int start = j; + + while (word[j] != '\0' && (isalnum(word[j]) || word[j] == '_')) { + j++; + } + + int len = j - start; + if (len > 0) { + char key[64]; + strncpy(key, &word[start], len); + key[len] = '\0'; + + char *val = get_env_value(key); + if (val != NULL) { + int val_len = strlen(val); + strcpy(&result[pos], val); + pos += val_len; + } + } + j--; + } else { + result[pos++] = word[j]; + } + } + + if (args[i + 1] != NULL) { + result[pos++] = ' '; + } + } + + result[pos] = '\0'; + printf("%s\n", result); + return 1; +} + int child_process_job(disk *d, char **args) { if (strcmp("ls", args[0]) == 0) { - do_ls(d, args[1]); + return do_ls(d, args[1]); } else if (strcmp("mkdir", args[0]) == 0) { - do_mkdir(d, args[1]); + return do_mkdir(d, args[1]); } else if (strcmp("touch", args[0]) == 0) { - do_touch(d, args[1]); + return do_touch(d, args[1]); } else if (strcmp("df", args[0]) == 0) { - do_df(d); + return do_df(d); } else { dprintf(STDERR_FILENO, "%s: no such command\n", args[0]); } @@ -49,6 +105,8 @@ int child_process_job(disk *d, char **args) { int execute_cmd(disk *d, char **args) { if (strcmp(args[0], "cd") == 0) { return do_cd(d, args[1]); + } else if (strcmp(args[0], "echo") == 0) { + return do_echo(&args[1]); } int pid = fork(); @@ -58,7 +116,7 @@ int execute_cmd(disk *d, char **args) { } if (pid == 0) { - child_process_job(d, args); + return child_process_job(d, args); } else { int status; waitpid(pid, &status, WUNTRACED); diff --git a/src/exec.h b/src/exec.h index 8bb3ed1..8427e8a 100644 --- a/src/exec.h +++ b/src/exec.h @@ -11,6 +11,7 @@ #include #include #include +#include int is_builtin_cmd(char *executable); int execute_cmd(disk *d, char **args); \ No newline at end of file