diff --git a/src/boitoutil/essential_shell.c b/src/boitoutil/essential_shell.c index 45bee3b..bacba60 100644 --- a/src/boitoutil/essential_shell.c +++ b/src/boitoutil/essential_shell.c @@ -17,7 +17,8 @@ #include pid_t pid; -int exit_code; +int exit_code = 0; +int need_exit = 0; /** * native_command(): vérifie si la commande entrée par l’utilisateur @@ -34,9 +35,12 @@ int exit_code; int native_command(char *command[]) { int ret = 1; /* 0 si commande non native */ + if (!strcmp(command[0], "cd")) change_dir(command); - if (!strcmp(command[0], "ouï-dire") || !strcmp(command[0], "oui-dire") + else if (!strcmp(command[0], "exit")) + thus_exit(command); + else if (!strcmp(command[0], "ouï-dire") || !strcmp(command[0], "oui-dire") || !strcmp(command[0], "echo")) { char *tmp = calloc(MAX_LENGTH, sizeof(char)); @@ -58,7 +62,9 @@ int native_command(char *command[]) /** * change_dir(): fonction pour implémenter la commande cd - * @dir: le répertoire à ouvrir + * @command: la commande passée avec ses arguments + * + * Structure de la commande cd : cd dossier */ void change_dir(char *command[]) { @@ -75,10 +81,21 @@ void change_dir(char *command[]) } } -//void thus_exit(char *command[]) -//{ -// exit_code = 0; -//} +/** + * thus_exit(): fonction pour implémenter la commande exit + * @command: la commande passée avec ses arguments + * + * Si l’utilisateur ne met pas d’arguments, + * la valeur 0 sera utilisé par défaut. + * Cette valeur sera utilisée pour exit_code et + * need_exit sera mit à 1. + */ +void thus_exit(char *command[]) +{ + if (command[1] != NULL) + exit_code = atoi(command[1]); + need_exit = 1; +} void ctrl_c_handler() { @@ -94,6 +111,9 @@ void ctrl_c_handler() * @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 + * + * En cas d’erreur fatale, le code d’erreur sera mit dans exit_code + * et need_exit sera mit à 1. */ void error(int code, int type, char *message) { @@ -133,5 +153,8 @@ void error(int code, int type, char *message) } if (type == FATAL_ERROR) - exit(code); + { + need_exit = 1; + exit_code = code; + } } diff --git a/src/boitoutil/essential_shell.h b/src/boitoutil/essential_shell.h index 82ce8e4..21004a3 100644 --- a/src/boitoutil/essential_shell.h +++ b/src/boitoutil/essential_shell.h @@ -21,10 +21,11 @@ extern pid_t pid; extern int exit_code; +extern int need_exit; /* 0 = pas besoin de sortir, 1 = commande exit appelée */ int native_command(char *command[]); void change_dir(char *command[]); -//void thus_exit(char *command[]) +void thus_exit(char *command[]); void ctrl_c_handler(); void error(int code, int type, char *message); diff --git a/src/boitoutil/parser.c b/src/boitoutil/parser.c index c5ff3ac..60022c9 100644 --- a/src/boitoutil/parser.c +++ b/src/boitoutil/parser.c @@ -113,34 +113,3 @@ void parse_string(char *orig, char *dest[], char find) free(token); } - -/** - * detect_exit(): vérifie si la commande entrée est exit - * @command: la première commande entrée par l’utilisateur - * - * Return: 0 si ce n’est pas exit, 1 sinon - */ -int detect_exit(char *command) -{ - /* - * TODO c’est dégueulasse, à changer pour un truc plus propre - */ - char *str = malloc(MAX_LENGTH * sizeof(char)); - strcpy(str, command); - char find = ' '; - char *token = strtok(str, &find); - char *args[MAX_LENGTH]; - int ret = 0, i = 0; - while (token != NULL) - { - args[i] = token; - token = strtok(NULL, &find); - i++; - } - - if (i == 1 && !strcmp(args[0], "exit")) - ret++; - - free(token); - return ret; -} diff --git a/src/boitoutil/parser.h b/src/boitoutil/parser.h index c4e3d93..b733459 100644 --- a/src/boitoutil/parser.h +++ b/src/boitoutil/parser.h @@ -13,6 +13,5 @@ char* get_input(); int get_command(char *args[], char find); void parse_string(char *args,char *commands[], char find); -int detect_exit(char *command); #endif diff --git a/src/shellOpt.c b/src/shellOpt.c index 7b1e692..5770fd3 100644 --- a/src/shellOpt.c +++ b/src/shellOpt.c @@ -28,7 +28,7 @@ int main() char *commands[MAX_LENGTH]; char *args[MAX_LENGTH]; - int result, index = 0, end = 0; /* end permet de savoir quand s’arreter */ + int result, index = 0; int my_pipe[2]; /* init pour la gestion du ctrl c */ @@ -50,7 +50,7 @@ int main() commands[i] = (char *) calloc(MAX_LENGTH, sizeof(char)); } - while (!get_command(commands, '|') && !detect_exit(commands[0])) + while (!need_exit && !get_command(commands, '|')) { while (commands[index] != NULL) { @@ -122,5 +122,5 @@ int main() free(commands[i]); free(args[i]); } - return 0; + return exit_code; }