浏览代码

Ajout setenv

Loquicom 6 年之前
父节点
当前提交
c7d49cebe8
共有 5 个文件被更改,包括 98 次插入4 次删除
  1. 55 0
      command.c
  2. 19 0
      command.h
  3. 16 1
      ipc.c
  4. 5 0
      ipc.h
  5. 3 3
      parser.c

+ 55 - 0
command.c

@@ -4,6 +4,7 @@
  *
  * Created on 9 novembre 2018
  */
+#define _POSIX_C_SOURCE 200112L
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -14,6 +15,7 @@
 #include "mysh.h"
 #include "execute.h"
 #include "command.h"
+#include "ipc.h"
 
 /* --- Extern --- */
 extern Error error;
@@ -24,6 +26,8 @@ char* cmdlist[] = {
     "cd",
     "exit",
     "status",
+    "setenv",
+    "unsetenv",
     NULL
 };
 boolean exitsh = false;
@@ -125,6 +129,11 @@ int launch_internal_command(Command* cmd) {
         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;
+    }
     //Aucune commande
     else {
         return SHELL_FAIL;
@@ -174,4 +183,50 @@ int status(int argc, char** argv){
         printf("%d terminé avec comme code de retour %d\n", last, status_cmd);
     }
     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;
 }

+ 19 - 0
command.h

@@ -43,10 +43,29 @@ int launch_internal_command(Command*);
  * Change le dossier de travail actuel
  * @param int argc
  * @param char** argv
+ * @return Statut
  */
 int cd(int, char**);
+
+/**
+ * Quitte le shell
+ * @param int argc
+ * @param char** argv
+ * @return Statut
+ */
 int exit_sh(int, char**);
+
+/**
+ * Statut de la dernière éxecution
+ * @param int argc
+ * @param char** argv
+ * @return Statut
+ */
 int status(int, char**);
 
+int set_env(int, char**);
+
+int unset_env(int, char**);
+
 #endif /* COMMAND_H */
 

+ 16 - 1
ipc.c

@@ -95,7 +95,9 @@ char* parse_shm_var(char* str){
         P(&ipc.sem, SEMWAIT);
     }
     V(&ipc.sem, SEMMUTEX);
+    //Lecture
     res = parse_var(str, sd, mem);
+    //Modification variable globale
     P(&ipc.sem, SEMMUTEX);
     nb--;
     if(nb == 0){
@@ -106,5 +108,18 @@ char* parse_shm_var(char* str){
 }
 
 boolean add_shm_data(char* data){
-    return true;
+    //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 = add_fdata_subdiv(sd, mem, data);
+    //Libere les semaphores
+    V(&ipc.sem, SEMWAIT);
+    V(&ipc.sem, SEMECRIRE);
+    return res;
 }

+ 5 - 0
ipc.h

@@ -42,6 +42,11 @@ boolean end_ipc();
  */
 char* parse_shm_var(char*);
 
+/**
+ * Ajoute une données dans le segment de mémoire
+ * @param char* Les données à ajouter
+ * @return Reussite
+ */
 boolean add_shm_data(char*);
 
 #endif /* IPC_H */

+ 3 - 3
parser.c

@@ -567,14 +567,14 @@ int parse_command(Command* c){
     //Split la commande
     split_command(c, cmd);
     //Remplace variables
+    /*for(int i = 0; i < c->argc; i++){
+        
+    }*/
     for(int i = 0; i < c->argc; i++){
         str = parse_shm_var(c->argv[i]);
         free(c->argv[i]);
         c->argv[i] = str;
     }
-    /*for(int i = 0; i < c->argc; i++){
-        
-    }*/
     //Analyse wildcard
     for(int i = 0; i < c->argc; i++){
         //Regarde si il faut remplacer l'argument par une suite de fichier