Bladeren bron

:sparkles: Ajout commande interne exit

Loquicom 6 jaren geleden
bovenliggende
commit
18c58a69c2
5 gewijzigde bestanden met toevoegingen van 26 en 6 verwijderingen
  1. 17 3
      command.c
  2. 3 1
      command.h
  3. 4 1
      mysh.c
  4. 1 1
      parser.c
  5. 1 0
      str.c

+ 17 - 3
command.c

@@ -15,10 +15,12 @@
 
 /* --- Extern --- */
 extern Error error;
-char* cmdlist[2] = {
+char* cmdlist[3] = {
     "cd",
+    "exit",
     NULL
 };
+boolean exitsh = false;
 
 /* --- Fonctions publiques --- */
 void ini_pid_list(pid_list* pl) {
@@ -92,7 +94,8 @@ void clean_pid(pid_list* pl) {
 boolean is_internal_cmd(const char* cmd) {
     //Parcours tableau pour trouver correspondance
     for (int i = 0; cmdlist[i] != NULL; i++) {
-        if (strncmp(cmd, cmdlist[i], strlen(cmdlist[i]) + 1) == 0) {
+        printf("%s - %s | %ld\n", cmd, cmdlist[i], strlen(cmd));
+        if (strncmp(cmd, cmdlist[i], strlen(cmd)) == 0) {
             return true;
         }
     }
@@ -105,7 +108,13 @@ int launch_internal_command(Command* cmd) {
     if (strncmp(cmd->name, cmdlist[0], length) == 0) {
         result = cd(cmd->argc, cmd->argv);
         return result;
-    }        //Aucune commande
+    } 
+    //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;
     }
@@ -135,4 +144,9 @@ int cd(int argc, char** argv) {
     }
     return EXIT_SUCCESS;
     //show_current_dir("current working directory is: ", "\n");
+}
+
+int exit_sh(int argc, char** argv){
+    exitsh = true;
+    return EXIT_SUCCESS;
 }

+ 3 - 1
command.h

@@ -25,7 +25,8 @@ typedef struct{
 }pid_list;
 
 /* --- Extern --- */
-extern char* cmdlist[2];
+extern char* cmdlist[3];
+extern boolean exitsh;
 
 /* --- Fonctions --- */
 void ini_pid_list(pid_list*);
@@ -43,6 +44,7 @@ int launch_internal_command(Command*);
  * @param char** argv
  */
 int cd(int, char**);
+int exit_sh(int, char**);
 
 #endif /* COMMAND_H */
 

+ 4 - 1
mysh.c

@@ -21,6 +21,7 @@
 
 /* --- Extern --- */
 extern Error error;
+extern boolean exitsh;
 
 /* --- Global --- */
 pid_list pidlist;
@@ -141,7 +142,7 @@ int main(int argc, char* argv[]) {
     error_finit("mysh.log");
     ini_pid_list(&pidlist);
     //BOucle infini de lecture
-    while(1){
+    while(!exitsh){
         //Affichage repertoire
         show_current_dir(getlogin(), "> ");      
         //Lecture ligne
@@ -167,6 +168,8 @@ int main(int argc, char* argv[]) {
         //Execute
         result = run(ct);
         printf("Result : %d\n", result);
+        //Vide le resultat du parse de la ligne de commande
+        clean_command(&ct);
     }
     //Nettoyage
     clean_pid(&pidlist);

+ 1 - 1
parser.c

@@ -477,7 +477,7 @@ int split_command(Command* c, char* cmd){
     if(chercheFin){
         c->argv[i] = malloc(sizeof(char) * (length + 1));
         memset(c->argv[i], 0, length + 1);
-        strncpy(c->argv[i++], deb, length);  
+        strncpy(c->argv[i++], deb, length); 
     }
     //Set la dernière case du tableau à null
     c->argv[i] = NULL;

+ 1 - 0
str.c

@@ -50,6 +50,7 @@ char* rtrim(char* str, char mask){
     cmpt++;
     //Sinon creation nouvelle chaine
     res = malloc(sizeof(char) * (cmpt + 2));
+    memset(res, 0, cmpt + 2);
     for(int i = 0; i < cmpt; i++){
         res[i] = str[i];
     }