Jelajahi Sumber

:bug: Debug si commande vide + :sparkles: Execution de fichier

Loquicom 6 tahun lalu
induk
melakukan
23284d9a9b
3 mengubah file dengan 48 tambahan dan 4 penghapusan
  1. 29 1
      execute.c
  2. 11 2
      mysh.c
  3. 8 1
      parser.c

+ 29 - 1
execute.c

@@ -59,5 +59,33 @@ int exec_shell(char* name, char** argv){
 }
 
 int exec_file(char* name, char** argv){
-    return 1;
+    pid_t pid;  
+    int result;
+    //Fork pour l'exec
+    pid = fork();
+    if(pid == ERR){
+        addperror("Erreur lors du fork pour la commande execvp");
+        return EXIT_FAILURE;
+    }
+    //Fils
+    else if(pid == 0){
+        //Reset sortie erreur
+        result = redirect_fd(STDERR, error.errfd);
+        if(result == ERR){
+            adderror("Impossible de redefinir la sortie d'erreur standard");
+            exit(EXIT_FAILURE);
+        }
+        //Execute commande
+        execv(name, argv);
+        //Si on arrive ici alors erreur
+        addperror("Impossible d'executer la commande");
+        exit(EXIT_FAILURE);
+    }
+    //Pere
+    wait(&result);
+    //Retourne retour fils
+    if(WIFEXITED(result)){
+        return WEXITSTATUS(result);
+    }
+    return EXIT_FAILURE;
 }

+ 11 - 2
mysh.c

@@ -160,6 +160,12 @@ int main(int argc, char* argv[]) {
             addserror("Erreur lors du parse de la ligne");
             continue;
         }
+        //Si aucune commande on passe
+        printf("%d\n", ct.length);
+        if(ct.length == 0){
+            clean_command(&ct);
+            continue;
+        }
         //Parse les commandes
         result = parse_all_command(&ct);
         if(result == SHELL_FAIL){
@@ -181,7 +187,7 @@ int main(int argc, char* argv[]) {
 
 int run(CommandTab ct){
     pid_t pid;
-    int result;
+    int result = 0;
     //Si en fond creation d'un fork pour executer les commandes
     printf("bck : %d\n", ct.bck);
     if(ct.bck && false/*ToDo - Test plus tard*/){
@@ -225,7 +231,7 @@ int run(CommandTab ct){
         if(is_internal_cmd(c->name)){
             result = launch_internal_command(c);
         } else if(is_executable_file(c->name)){
-            
+            result = exec_file(c->name, c->argv);
         } else {
             result = exec_shell(c->name, c->argv);
         }
@@ -235,5 +241,8 @@ int run(CommandTab ct){
         //Agit en fonction de la jointure avec la prochaine commande
         /*ToDo*/
     }
+    if(result != EXIT_SUCCESS){
+        return SHELL_FAIL;
+    }
     return SHELL_OK;
 }

+ 8 - 1
parser.c

@@ -29,8 +29,13 @@ extern int serrno;
 int nb_commands(char* line){
     //Initialisation variable
     int compteur = 0;
+    boolean vide = true;
     //Parcours chaine pour chercher séparateur et compter le nombre de commande
     while(*line){
+        //Si on croise un caractère
+        if(vide && *line != ' ' && *line != '\0'){
+            vide = false;
+        }
         //Si un ;
         if(*line == ';'){
             compteur++;
@@ -69,7 +74,9 @@ int nb_commands(char* line){
         line++;
     }
     //Ajoute la dernière commande
-    compteur++;
+    if(!vide){
+        compteur++;
+    }
     return compteur;
 }