/* * File: command.c * Author: Arthur Brandao * * Created on 9 novembre 2018 */ #include #include #include #include "error.h" #include "str.h" #include "parser.h" #include "command.h" /* --- Extern --- */ extern Error error; char* cmdlist[3] = { "cd", "exit", NULL }; boolean exitsh = false; /* --- Fonctions publiques --- */ void ini_pid_list(pid_list* pl) { pl->first = NULL; pl->last = NULL; } pid_node* add_pid(pid_list* pl, pid_t pid) { pid_node* pn = malloc(sizeof (pid_node)); pn->pid = pid; pn->next = NULL; if (pl->first == NULL) { pn->prev = NULL; pl->first = pn; pl->last = pn; } else { pn->prev = pl->last; pl->last->next = pn; pl->last = pn; } return pn; } pid_node* search_pid(pid_list* pl, pid_t pid) { pid_node* pn = pl->first; while (pn != NULL) { if (pn->pid == pid) { return pn; } pn = pn->next; } return NULL; } void remove_pid(pid_list* pl, pid_node* pn) { //Si 1er et seul if (pn->prev == NULL && pn->next == NULL) { pl->first = NULL; pl->last = NULL; } //Si 1er et non seul else if (pn->prev == NULL && pn->next != NULL) { pn->next->prev = NULL; pl->first = pn->next; } //Si dernier else if (pn->next == NULL) { pn->prev->next = NULL; pl->last = pn->prev; } //Sinon si il est au milieu else { pn->prev->next = pn->next; pn->next->prev = pn->prev; } //Free free(pn); } void clean_pid(pid_list* pl) { pid_node* tmp, * pn = pl->first; while (pn != NULL) { tmp = pn->next; free(pn); pn = tmp; } pl->first = NULL; pl->last = NULL; } boolean is_internal_cmd(const char* cmd) { //Parcours tableau pour trouver correspondance for (int i = 0; cmdlist[i] != NULL; i++) { printf("%s - %s | %ld\n", cmd, cmdlist[i], strlen(cmd)); if (strncmp(cmd, cmdlist[i], strlen(cmd)) == 0) { return true; } } return false; } int launch_internal_command(Command* cmd) { int result, length = strlen(cmd->name) + 1; //cd if (strncmp(cmd->name, cmdlist[0], length) == 0) { result = cd(cmd->argc, cmd->argv); return result; } //exit else if (strncmp(cmd->name, cmdlist[1], length) == 0) { result = exit_sh(cmd->argc, cmd->argv); return result; } //Aucune commande else { return SHELL_FAIL; } } /* --- Commandes --- */ int cd(int argc, char** argv) { //Si trop d'arguments if (argc > 2) { error.print("too many arguments : 1 required, %d given\n", argc - 1); return EXIT_FAILURE; } else { //Si aucun argument on va à la racine if (argc == 1) { if (chdir("/") == ERR) { addperror("Erreur chdir()"); return EXIT_FAILURE; } } //Sinon on va dans le dossier indiqué par l'utilisateur else { if (chdir(argv[1]) == ERR) { error.print("path does not exist\n"); return EXIT_FAILURE; } } } return EXIT_SUCCESS; //show_current_dir("current working directory is: ", "\n"); } int exit_sh(int argc, char** argv){ exitsh = true; return EXIT_SUCCESS; }