From e1b008fce48e902b109845386616cd79306c8d6f Mon Sep 17 00:00:00 2001 From: rick Date: Sun, 21 Feb 2021 19:12:12 +0100 Subject: [PATCH] =?UTF-8?q?Nouvelle=20gestion=20des=20erreurs=20(ya=20moye?= =?UTF-8?q?n=20d=E2=80=99avoir=20tout=20casser)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/boitoutil/essential_shell.c | 66 ++++++++++++++++++++------------- src/boitoutil/essential_shell.h | 3 ++ src/shellOpt.c | 18 ++++++--- 3 files changed, 55 insertions(+), 32 deletions(-) diff --git a/src/boitoutil/essential_shell.c b/src/boitoutil/essential_shell.c index 173dd12..9623614 100644 --- a/src/boitoutil/essential_shell.c +++ b/src/boitoutil/essential_shell.c @@ -12,41 +12,52 @@ #include #include #include +#include /** * error(): gère les erreurs selon leur code et leur type - * @code: code de l’erreur, voir les différents codes plus bas + * @code: code de l’erreur, voir les différents codes dans le fichier .h * @type: NON_FATAL_ERROR pour continuer l’exécution * FATAL_ERROR pour stoper le programme * @message: message à afficher pour + d’infos ou erreur non implémentée - * - * 1 erreur lors de la création des pipes - * 2 chemin inexistant - * 3 erreur lors du fork */ void error(int code, int type, char *message) { - switch (code) - { - case 1: - printf("Erreur lors de la création des pipes.\n"); - break; - case 2: - printf("Chemin inexistant.\n"); - break; - case 3: - printf("Le fork a échoué, le processus enfant a été avorté.\n"); - break; + if (code == 0) + return; - default: - if (message == NULL) - printf("Erreur inconnue.\n"); - else - printf("%s\n", message); + const char *txt_error = strerror(code); + if (errno == EINVAL) + { + switch (code) + { + case ERR_PIPE_CREATION: + fprintf(stderr, "Erreur lors de la création des pipes.\n"); + break; + case ERR_FORK: + fprintf(stderr, "Le fork a échoué, le processus enfant a été avorté.\n"); + break; + + default: + if (message == NULL) + fprintf(stderr, "Erreur inconnue.\n"); + else + fprintf(stderr, "%s\n", message); + } + if (message != NULL) + fprintf(stderr, "Message complémentaire :\n%s\n", message); + } + else + { + if (message != NULL) + { + errno = code; + perror(message); + } + else + fprintf(stderr, "%s\n", txt_error); } - if (message != NULL) - printf("Message complémentaire :\n%s\n", message); if (type == FATAL_ERROR) exit(code); @@ -95,7 +106,10 @@ int native_command(char *command[]) */ void change_dir(char *dir) { - if (chdir(dir)) - error(2, NON_FATAL_ERROR, "Un nom de fichier au lieu d’un dossier \ - a pu etre passé en paramètres."); + if (chdir(dir) < 0) + { + char txt_error[MAX_LENGTH] = "cd: "; + strcat(txt_error, dir); + error(errno, NON_FATAL_ERROR, txt_error); + } } diff --git a/src/boitoutil/essential_shell.h b/src/boitoutil/essential_shell.h index 19e444d..a3b57d0 100644 --- a/src/boitoutil/essential_shell.h +++ b/src/boitoutil/essential_shell.h @@ -14,6 +14,9 @@ #define FATAL_ERROR 1 #define NON_FATAL_ERROR 0 +#define ERR_PIPE_CREATION 200 /* erreur lors de la création des pipes */ +#define ERR_FORK 201 /* erreur lors du fork */ + void error(int code, int type, char *message); int native_command(char *command[]); void change_dir(char *dir); diff --git a/src/shellOpt.c b/src/shellOpt.c index e169680..75458ad 100644 --- a/src/shellOpt.c +++ b/src/shellOpt.c @@ -12,6 +12,7 @@ #include #include #include +#include #include int main() @@ -26,12 +27,12 @@ int main() char *commands[MAX_LENGTH]; char *args[MAX_LENGTH]; - int pid, index = 0, end = 0; /* end permet de savoir quand s’arreter */ + int pid, result, index = 0, end = 0; /* end permet de savoir quand s’arreter */ int my_pipe[2]; setenv("HELLO", "test", 1); if (pipe(my_pipe) == -1) - error(1, FATAL_ERROR, NULL); + error(ERR_PIPE_CREATION, FATAL_ERROR, NULL); for (int i = 0; i < MAX_LENGTH; i++) { @@ -50,7 +51,7 @@ int main() { pid = fork(); if (pid < 0) - error(3, FATAL_ERROR, NULL); + error(ERR_FORK, FATAL_ERROR, NULL); if (!pid) /* le fils */ { @@ -70,7 +71,7 @@ int main() * de sortie */ execvp(args[0], args); - exit(0); + exit(errno); } /* lorsqu’on arrive à la dernière commande, on peut fermer le pipe et @@ -79,8 +80,13 @@ int main() { close(my_pipe[0]); close(my_pipe[1]); - waitpid(pid, NULL, 0); + waitpid(pid, &result, 0); } + else + wait(&result); + + if(WIFEXITED(result)) + error(WEXITSTATUS(result), NON_FATAL_ERROR, NULL); } for (int i = 0; i < MAX_LENGTH; i++) @@ -108,7 +114,7 @@ int main() free(args[i]); free(commands[i]); } - error(1, FATAL_ERROR, NULL); + error(ERR_PIPE_CREATION, FATAL_ERROR, NULL); } index = 0; }