/* * File: mysh.c * Author: Arthur Brandao * * Created on 31 octobre 2018, 12:43 */ #include #include #include #include #include #include #include "error.h" #include "str.h" #include "parser.h" #include "command.h" #include "execute.h" #include "mysh.h" /* --- Extern --- */ extern Error error; /* --- Global --- */ pid_list pidlist; pid_node* active = NULL; /* --- Fonctions privées --- */ void test_write() { char* a = "azerty\n"; int tmp = write(1, a, strlen(a)); printf("%d\n", tmp); } /* --- Fonctions utilitaires --- */ void show_current_dir(const char* before, const char* after) { char buffer[BUFFER_SIZE]; if (getcwd(buffer, sizeof (buffer)) == NULL) { addperror("Erreur getcwd()"); } else { if(before == NULL && after == NULL){ printf("%s", buffer); } else if(before == NULL){ printf("%s%s", buffer, after); } else if(after == NULL){ printf("%s%s", before, buffer); } else { printf("%s%s%s", before, buffer, after); } } } /* --- Main --- */ int main(int argc, char* argv[]) { CommandTab ct; char str[BUFFER_SIZE]; int a; //Initialisation structures error_finit("mysh.log"); ini_pid_list(&pidlist); //Recup ligne //printf("%s\n", fgets(str, 500, stdin));& memset(str, 0, 500); a = read(STDIN, str, 500); printf("%s\n", str); //Separe les commandes a = parse_line(&ct, str); if(a == SHELL_ERR){ addserror("Erreur lors du parse de la ligne"); error.exit_err(); } //Parse les commandes a = parse_all_command(&ct); if(a == SHELL_FAIL){ addserror("Erreur lors du parse des commandes"); error.exit_err(); } //Affiche resultat for (int i = 0; i < ct.length; i++) { Command* c = ct.cmd[i]; printf("Commande %d (%s) : \n", i, c->name); for (int j = 0; j < c->argc; j++) { printf(" Argument %d : %s\n", j, c->argv[j]); } printf("Commande en fond : %d\n\n", ct.bck); //Si c'est une commande interne on l'execute if(is_internal_cmd(ct.cmd[i]->name)){ show_current_dir(NULL, "\n"); printf("Result : %d\n", launch_internal_command(ct.cmd[i])); show_current_dir(NULL, "\n"); } } //Nettoyage structures clean_command(&ct); clean_pid(&pidlist); error.exit(); } int run(CommandTab ct){ pid_t pid; int result; pid_node* pnode; //Fork pour executer la commande pid = fork(); if(pid == ERR){ addperror("Erreur lors du fork pour l'execution des commandes"); error.print("Erreur systeme, impossible de continuer\n"); return SHELL_ERR; } //Pere else if(pid != 0){ //Ajoute du pid dans la liste des pid actifs pnode = add_pid(&pidlist, pid); //Si on attend le retour de la commande if(!ct.bck){ //Ajout du pid comme étant le pid actif et attente active = pnode; wait(&result); //Le processus n'est plus actif et analyse retour active = NULL; remove_pid(&pidlist, pnode); if(WIFEXITED(result)){ return WEXITSTATUS(result); } else { return SHELL_FAIL; } } //Sinon ok return SHELL_OK; } //Fils return SHELL_OK; }