From 78a4c93224d05b082b0b90a71d7175c364be0a20 Mon Sep 17 00:00:00 2001 From: klmp200 Date: Sun, 11 Jun 2017 18:43:05 +0200 Subject: [PATCH] =?UTF-8?q?Toutes=20les=20redirections=20d'entr=C3=A9e=20s?= =?UTF-8?q?ortie=20comme=20un=20beau=20gosse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fish_shell/fish_core.c | 50 ++++++++++++++++++++++++++++++++++++++--- fish_shell/fish_types.h | 7 +++++- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/fish_shell/fish_core.c b/fish_shell/fish_core.c index 647b31e..d7523a9 100644 --- a/fish_shell/fish_core.c +++ b/fish_shell/fish_core.c @@ -13,6 +13,23 @@ #include "fish_globbing.h" #include "fish_types.h" +#define REDIRECT_EXIT_FREE() signal = EXIT_FAILURE; \ + freeWordList(list);\ + freeWordList(splited); + +#define REDIRECT_STD(std, open_mode) if (splited->size == 0) {REDIRECT_EXIT_FREE()\ + } else {\ + redirect_file = fopen(splited->first->word, open_mode);\ + if (redirect_file == NULL) { REDIRECT_EXIT_FREE() } else {\ + saved_std = dup(std);\ + dup2(fileno(redirect_file), std);\ + signal = fishExecute(list);\ + dup2(saved_std, std);\ + fclose(redirect_file);\ + freeWordList(splited);\ + }\ + } + pipe_redirection * getRedirection(){ static pipe_redirection * redirection = NULL; @@ -59,7 +76,7 @@ void fishLoop(Settings * settings){ line = fishReadLine(); r->to_use = 0; - r->nb = countSeparators(line, "\\|[^\\|]"); + r->nb = countSeparators(line, (char*) "\\|[^\\|]"); r->nb_max = r->nb; splited = split(line, (char*) FISH_TOKENS); splited = fishExpand(splited); @@ -194,6 +211,8 @@ int fishExecute(WordList *list) { shell_operator op = NONE; WordArray *array = NULL; pipe_redirection *redirection = NULL; + FILE *redirect_file = NULL; + int saved_std; int pid; int signal = 1; @@ -269,6 +288,21 @@ int fishExecute(WordList *list) { signal = EXIT_SUCCESS; } break; + case REDIRECT_STDOUT_ERASE: + REDIRECT_STD(STDOUT_FILENO, "w"); + break; + case REDIRECT_STDOUT_APPEND: + REDIRECT_STD(STDOUT_FILENO, "a"); + break; + case REDIRECT_STDERR_ERASE: + REDIRECT_STD(STDERR_FILENO, "w"); + break; + case REDIRECT_STDERR_APPEND: + REDIRECT_STD(STDERR_FILENO, "a"); + break; + case REDIRECT_STDIN: + REDIRECT_STD(STDIN_FILENO, "r"); + break; default: array = wordListToWordArray(list); signal = loadRightCommand(array); @@ -308,14 +342,24 @@ WordList * parseWordList(WordList *list, shell_operator *an_operator) { (char*) "\\|\\|", (char*) "&&", (char*) "\\|", - (char*) "&" + (char*) "&", + (char*) "2>>", + (char*) ">>", + (char*) "2>", + (char*) ">", + (char*) "<[^<]" }; shell_operator op[] = { OR, REVERSE_AND, AND, PIPE, - BACKGROUND_PROCESS + BACKGROUND_PROCESS, + REDIRECT_STDERR_APPEND, + REDIRECT_STDOUT_APPEND, + REDIRECT_STDERR_ERASE, + REDIRECT_STDOUT_ERASE, + REDIRECT_STDIN }; WordList *newList = NULL; int max = sizeof(op_str) / sizeof(char*); diff --git a/fish_shell/fish_types.h b/fish_shell/fish_types.h index 51f9e24..d16b95d 100644 --- a/fish_shell/fish_types.h +++ b/fish_shell/fish_types.h @@ -20,7 +20,12 @@ typedef enum { BACKGROUND_PROCESS, AND, OR, - REVERSE_AND + REVERSE_AND, + REDIRECT_STDOUT_ERASE, + REDIRECT_STDOUT_APPEND, + REDIRECT_STDERR_ERASE, + REDIRECT_STDERR_APPEND, + REDIRECT_STDIN } shell_operator ; typedef enum {