Sfoglia il codice sorgente

Ajout cmd unsetenv

Loquicom 6 anni fa
parent
commit
257b030b07
5 ha cambiato i file con 107 aggiunte e 58 eliminazioni
  1. 2 1
      .gitignore
  2. 85 56
      command.c
  3. 17 0
      ipc.c
  4. 2 0
      ipc.h
  5. 1 1
      subdiv.c

+ 2 - 1
.gitignore

@@ -54,4 +54,5 @@ dkms.conf
 /nbproject
 /mysh
 /mysh.log
-*.log
+*.log
+/bug.txt

+ 85 - 56
command.c

@@ -71,17 +71,17 @@ void remove_pid(pid_list* pl, pid_node* pn) {
     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;
@@ -118,22 +118,27 @@ int launch_internal_command(Command* cmd) {
     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;
-    }
+    }        
     //status
     else if (strncmp(cmd->name, cmdlist[2], length) == 0) {
         result = status(cmd->argc, cmd->argv);
         return result;
-    }
+    }        
     //setenv
     else if (strncmp(cmd->name, cmdlist[3], length) == 0) {
         result = set_env(cmd->argc, cmd->argv);
         return result;
-    }
+    }        
+    //unsetenv
+    else if (strncmp(cmd->name, cmdlist[4], length) == 0) {
+        result = unset_env(cmd->argc, cmd->argv);
+        return result;
+    }        
     //Aucune commande
     else {
         return SHELL_FAIL;
@@ -153,7 +158,7 @@ int cd(int argc, char** argv) {
                 addperror("Erreur chdir()");
                 return EXIT_FAILURE;
             }
-        }
+        }            
         //Sinon on va dans le dossier indiqué par l'utilisateur
         else {
             if (chdir(argv[1]) == ERR) {
@@ -166,18 +171,18 @@ int cd(int argc, char** argv) {
     //show_current_dir("current working directory is: ", "\n");
 }
 
-int exit_sh(int argc, char** argv){
+int exit_sh(int argc, char** argv) {
     exitsh = true;
     return EXIT_SUCCESS;
 }
 
-int status(int argc, char** argv){
-    if(!(last != -1 && status_cmd != -1)){
+int status(int argc, char** argv) {
+    if (!(last != -1 && status_cmd != -1)) {
         error.print("Aucune commande executée\n");
         return EXIT_FAILURE;
     }
     //En fonction du status
-    if(result_cmd == SHELL_FAIL){
+    if (result_cmd == SHELL_FAIL) {
         printf("%d terminé anormalement\n", last);
     } else {
         printf("%d terminé avec comme code de retour %d\n", last, status_cmd);
@@ -185,48 +190,72 @@ int status(int argc, char** argv){
     return EXIT_SUCCESS;
 }
 
-int set_env(int argc, char** argv){
-   char* str, * key, * val;
-   int length, pos = 0;
-   //Verif les arguments
-   if(argc < 2){
-       error.print("too few arguments : 1 required, 0 given\n");
-       return EXIT_FAILURE;
-   }
-   if(argc > 2){
-       error.print("too many arguments : 1 required, %d given\n", argc - 1);
-       return EXIT_FAILURE;
-   }
-   str = argv[1];
-   length = strlen(str);
-   //Verif que chaine est correcte
-   for(int i = 0; i < length; i++){
-       if(str[i] == '='){
-           break;
-       }
-       pos++;
-   }
-   if(pos >= length - 1){
-       error.print("Argument invalide : clef=valeur attendu, %s donnée\n", str);
-       return EXIT_FAILURE;
-   }
-   //Decoupe la chaine
-   key = malloc(sizeof(char) * (pos + 1));
-   memset(key, 0, pos + 1);
-   strncpy(key, str, pos);
-   val = str + pos + 1;
-   //Ajoute la chaine en shm
-   if(!add_shm_data(str)){
-       error.print("Erreur interne impossible d'ajouter la variables\n");
-       free(key);
-       return EXIT_FAILURE;
-   }
-   //Ajoute sur le système
-   if(setenv(key, val, true) == ERR){
-       addperror("Impossible d'ajouter la variable d'environnement");
-       error.print("Erreur interne impossible d'ajouter la variables\n");
-       free(key);
-       return EXIT_FAILURE;
-   }
-   return EXIT_SUCCESS;
+int set_env(int argc, char** argv) {
+    char* str, * key, * val;
+    int length, pos = 0;
+    //Verif les arguments
+    if (argc < 2) {
+        error.print("too few arguments : 1 required, 0 given\n");
+        return EXIT_FAILURE;
+    }
+    if (argc > 2) {
+        error.print("too many arguments : 1 required, %d given\n", argc - 1);
+        return EXIT_FAILURE;
+    }
+    str = argv[1];
+    length = strlen(str);
+    //Verif que chaine est correcte
+    for (int i = 0; i < length; i++) {
+        if (str[i] == '=') {
+            break;
+        }
+        pos++;
+    }
+    if (pos >= length - 1) {
+        error.print("Argument invalide : clef=valeur attendu, %s donnée\n", str);
+        return EXIT_FAILURE;
+    }
+    //Decoupe la chaine
+    key = malloc(sizeof (char) * (pos + 1));
+    memset(key, 0, pos + 1);
+    strncpy(key, str, pos);
+    val = str + pos + 1;
+    //Ajoute la chaine en shm
+    if (!add_shm_data(str)) {
+        error.print("Erreur interne impossible d'ajouter la variable\n");
+        free(key);
+        return EXIT_FAILURE;
+    }
+    //Ajoute sur le système
+    if (setenv(key, val, true) == ERR) {
+        addperror("Impossible d'ajouter la variable d'environnement");
+        error.print("Erreur interne impossible d'ajouter la variable\n");
+        free(key);
+        return EXIT_FAILURE;
+    }
+    return EXIT_SUCCESS;
+}
+
+int unset_env(int argc, char** argv) {
+    //Verif les arguments
+    if (argc < 2) {
+        error.print("too few arguments : 1 required, 0 given\n");
+        return EXIT_FAILURE;
+    }
+    if (argc > 2) {
+        error.print("too many arguments : 1 required, %d given\n", argc - 1);
+        return EXIT_FAILURE;
+    }
+    //Supprime de la shm
+    if (!remove_shm_data(argv[1])) {
+        error.print("Erreur interne impossible de supprimer la variable\n");
+        return EXIT_FAILURE;
+    }
+    //Supprime du systeme
+    if (unsetenv(argv[1]) == ERR) {
+        addperror("Impossible de supprimer la variable d'environnement");
+        error.print("Erreur interne impossible de supprimer la variable\n");
+        return EXIT_FAILURE;
+    }
+    return EXIT_SUCCESS;
 }

+ 17 - 0
ipc.c

@@ -122,4 +122,21 @@ boolean add_shm_data(char* data){
     V(&ipc.sem, SEMWAIT);
     V(&ipc.sem, SEMECRIRE);
     return res;
+}
+
+boolean remove_shm_data(char* key){
+    //Recup variable globale
+    subdiv* sd = (subdiv*) ipc.gestionnaire.adr;
+    char* mem = (char*) ipc.memoire.adr;
+    boolean res;
+    //Indique que l'on veut ecrire
+    P(&ipc.sem, SEMECRIRE);
+    //Attend que les lecteurs finissent
+    P(&ipc.sem, SEMWAIT);
+    //Ecriture
+    res = remove_data_subdiv(sd, mem, key);
+    //Libere les semaphores
+    V(&ipc.sem, SEMWAIT);
+    V(&ipc.sem, SEMECRIRE);
+    return res;
 }

+ 2 - 0
ipc.h

@@ -49,5 +49,7 @@ char* parse_shm_var(char*);
  */
 boolean add_shm_data(char*);
 
+boolean remove_shm_data(char*);
+
 #endif /* IPC_H */
 

+ 1 - 1
subdiv.c

@@ -238,7 +238,7 @@ boolean remove_data_subdiv(subdiv* sd, char* mem, char* key) {
     n = &sd->mem[0];
     while (n != NULL) {
         //On fusionne avec celui d'après si celui d'avant à une taille différente
-        if (n->prev == NULL) {
+        if (n == &sd->mem[0]) {
             if (fusion_node(sd, n)) {
                 n = &sd->mem[0];
             } else {