Quellcode durchsuchen

Ajout remplacement variable env par leurs valeurs

Loquicom vor 6 Jahren
Ursprung
Commit
77736c42e0
3 geänderte Dateien mit 61 neuen und 5 gelöschten Zeilen
  1. 36 4
      ipc.c
  2. 14 0
      ipc.h
  3. 11 1
      parser.c

+ 36 - 4
ipc.c

@@ -9,6 +9,7 @@
 #include <stdlib.h>
 #include <errno.h>
 #include "ipc.h"
+#include "variable.h"
 
 /* --- Extern --- */
 ipc_mysh ipc;
@@ -25,6 +26,10 @@ boolean setup_ipc(char** envp){
     if(!create_shm(&ipc.gestionnaire, SHMCODEGEST, sizeof(subdiv))){
         return false;
     }
+    //SHM pour variable globale
+    if(!create_shm(&ipc.global, SHMCODEGLOB, sizeof(int))){
+        return false;
+    }
     //Si creation alors on remplie les segments
     if(errno != EEXIST){
         subdiv* sd = (subdiv*) ipc.gestionnaire.adr;
@@ -38,10 +43,6 @@ boolean setup_ipc(char** envp){
 	}
         *nb = 0;
     }
-    //SHM pour variable globale
-    if(!create_shm(&ipc.global, SHMCODEGLOB, sizeof(int))){
-        return false;
-    }
     //Semaphore
     int ini[] = {1, 1, 1};
     if(!create_sem(&ipc.sem, SEMCODE, 3, ini)){
@@ -75,4 +76,35 @@ boolean end_ipc(){
         }
     }
     return true;
+}
+
+char* parse_shm_var(char* str){
+    //Recup variable globale
+    subdiv* sd = (subdiv*) ipc.gestionnaire.adr;
+    char* mem = (char*) ipc.memoire.adr;
+    int* buf = (int*) ipc.global.adr;
+    int nb = *buf;
+    char* res;
+    //Regarde si l'ecrivain veut ecrire
+    P(&ipc.sem, SEMECRIRE);
+    V(&ipc.sem, SEMECRIRE);
+    //Modification variable globale
+    P(&ipc.sem, SEMMUTEX);
+    nb++;
+    if(nb == 1){
+        P(&ipc.sem, SEMWAIT);
+    }
+    V(&ipc.sem, SEMMUTEX);
+    res = parse_var(str, sd, mem);
+    P(&ipc.sem, SEMMUTEX);
+    nb--;
+    if(nb == 0){
+        V(&ipc.sem, SEMWAIT);
+    }
+    V(&ipc.sem, SEMMUTEX);
+    return res;
+}
+
+boolean add_shm_data(char* data){
+    return true;
 }

+ 14 - 0
ipc.h

@@ -14,6 +14,11 @@
 #include "shm.h"
 #include "subdiv.h"
 
+/* --- Constantes --- */
+#define SEMMUTEX 0 //Mutex d'accès aux variables globales
+#define SEMECRIRE 1 //Sem pour indiquer qu'un processus veut ecrire
+#define SEMWAIT 2 //Sem pour faire attendre l'ecrivain
+
 /* --- Structure --- */
 typedef struct{
     shared_mem memoire;
@@ -30,5 +35,14 @@ boolean setup_ipc(char**);
 
 boolean end_ipc();
 
+/**
+ * Remplace les variables d'une chaine par leurs valeurs
+ * @param char* La chaine à analyser
+ * @return La chaine avec les variables remplacées par leur valeurs
+ */
+char* parse_shm_var(char*);
+
+boolean add_shm_data(char*);
+
 #endif /* IPC_H */
 

+ 11 - 1
parser.c

@@ -16,6 +16,7 @@
 #include "str.h"
 #include "wildcard.h"
 #include "parser.h"
+#include "ipc.h"
 
 /* --- Extern --- */
 extern int serrno;
@@ -553,7 +554,7 @@ int parse_line(CommandTab* ct, char* line){
 int parse_command(Command* c){
     //Declaration variable
     int length, nbWildcard = 0, res;
-    char* cmd, **wildcardTab;
+    char* cmd, * str, **wildcardTab;
     //Parse les redirections
     length = set_redirection(c);
     if(length == SHELL_ERR || length == 0){
@@ -565,6 +566,15 @@ int parse_command(Command* c){
     strncpy(cmd, c->cmd, length);
     //Split la commande
     split_command(c, cmd);
+    //Remplace variables
+    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