From c51f739beaa0af1e5e8196d620eaef743f77d9a4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 25 Nov 2023 14:39:01 +0300 Subject: [PATCH] rc fix --- TODO | 5 ++++- coreutils/rm.c | 2 +- shell/rc.c | 56 ++++++++++++++++++++++++-------------------------- 3 files changed, 32 insertions(+), 31 deletions(-) diff --git a/TODO b/TODO index afbd7f0..19a180c 100644 --- a/TODO +++ b/TODO @@ -60,7 +60,10 @@ Findutils: xargs Shell: - rc - run command (1 2 3 ~ | <> <<>> & * " parsing) (alias) + rc - run command (1 2 3 ~ | <> <<>> & * " parsing) (sig handler) Init: sinit - Simple init + +BUGS: + ls (unicode strlen, -l flag col) diff --git a/coreutils/rm.c b/coreutils/rm.c index 91aac4a..8f47616 100644 --- a/coreutils/rm.c +++ b/coreutils/rm.c @@ -67,7 +67,7 @@ int main(int argc, char **argv) { break; } - if (mu_recurse((f_flag) ? NULL : "rm", 0, argv[i], NULL, rm, rmd)) + if (mu_recurse((f_flag) ? NULL : "rm", 1, argv[i], NULL, rm, rmd)) ret = 1; } diff --git a/shell/rc.c b/shell/rc.c index 26266b2..1055720 100644 --- a/shell/rc.c +++ b/shell/rc.c @@ -15,7 +15,7 @@ typedef struct { char *name; char *val; } ALIAS; -ALIAS **aliases; +ALIAS *aliases; size_t aliases_size; unsigned int exit_flag; @@ -29,11 +29,10 @@ char *cmd[] = {"cd", "exit", "alias"}; int (*func[])(char **args) = {rc_cd, rc_exit, rc_alias}; int rc_alias(char **args) { - /* Bug */ /* Print all aliases */ if (args[0] == NULL) { for (size_t i = 0; i < aliases_size; i++) - printf("alias %s=\"%s\"\n", aliases[i]->name, aliases[i]->val); + printf("alias %s=\"%s\"\n", aliases[i].name, aliases[i].val); return 0; } @@ -48,26 +47,28 @@ int rc_alias(char **args) { /* Check is exist */ for (size_t i = 0; i < aliases_size; i++) - if (!strcmp(args[0], aliases[i]->name)) + if (!strcmp(args[0], aliases[i].name)) return 0; aliases_size++; - aliases = realloc(aliases, sizeof(ALIAS *) * (aliases_size + 1)); + aliases = realloc(aliases, sizeof(ALIAS) * aliases_size); if (aliases == NULL) { fprintf(stderr, "rc: realloc failed\n"); exit_flag = 1; return 1; } - aliases[aliases_size] = malloc(sizeof(ALIAS)); - if (aliases[aliases_size] == NULL) { + val++; + aliases[aliases_size - 1].name = malloc(strlen(args[0]) + 1); + aliases[aliases_size - 1].val = malloc(strlen(val) + 1); + if (aliases[aliases_size - 1].name == NULL || aliases[aliases_size - 1].val == NULL) { fprintf(stderr, "rc: malloc failed\n"); exit_flag = 1; return 1; } - aliases[aliases_size - 1]->name = args[0]; - aliases[aliases_size - 1]->val = val + 1; + sprintf(aliases[aliases_size - 1].name, "%s", args[0]); + sprintf(aliases[aliases_size - 1].val, "%s", val); return 0; } @@ -96,13 +97,6 @@ int rc_cd(char **args) { } /* Shell */ -void free_aliases(void) { - for (size_t i = 0; i < aliases_size; i++) - free(aliases[i]); - - free(aliases); -} - int execute(char **tok) { if (tok[0] == NULL) return 0; @@ -112,9 +106,8 @@ int execute(char **tok) { return func[i](tok + 1); for (size_t i = 0; i < aliases_size; i++) - if (aliases[i] != NULL) - if (!strcmp(tok[0], aliases[i]->name)) - tok[0] = aliases[i]->val; + if (!strcmp(tok[0], aliases[i].name)) + tok[0] = aliases[i].val; /* If its not builtin cmd */ pid_t pid; @@ -176,23 +169,23 @@ char *readline(FILE *fp, char *prompt) { return str; } +void catch_sig(int sig) { + UNUSED(sig); + + putchar('\n'); + return; +} + int main(void) { - signal(SIGINT, SIG_IGN); - signal(SIGTSTP, SIG_IGN); + signal(SIGINT, catch_sig); /* Alias */ - aliases = malloc(sizeof(ALIAS *)); + aliases = malloc(sizeof(ALIAS)); if (aliases == NULL) { fprintf(stderr, "rc: malloc failed\n"); return 1; } - aliases[0] = malloc(sizeof(ALIAS)); - if (aliases[0] == NULL) { - fprintf(stderr, "rc: malloc failed\n"); - return 1; - } - /* Prompt */ char *prompt = RC_PS; if (!isatty(STDIN_FILENO)) @@ -220,7 +213,12 @@ int main(void) { free(str); } - free_aliases(); + for (size_t i = 0; i < aliases_size; i++) { + free(aliases[i].name); + free(aliases[i].val); + } + + free(aliases); putchar('\n'); return 0; }