/*
 * mEtMme-serv.c
 * - ecoute sur un tube nommé passé
 *   en arg
 * - attend une nouvelle connexion
 * - decode le message contenant
 *   les noms des tubes de services
 * - se duplique :
 * - le pere retourne en attente
 *   d'une nouvelle connexion
 * - le fils reçoit les noms de
 *   famille par un tube de service
 *   effectue une recherche parmi
 *   les noms (non géré ici)
 *   renvoi le prénom correspondant
 *   dans l'autre tube de service
 **********************************
 * Davy Dequidt
 * L3 Info Luminy
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <string.h>


#define BUFFMAX 1000

int main(int argc, char **argv){
  int count= 0;
  int k;
  int proc;
  char buf[BUFFMAX];
  char* tubec_nom;
  char tube_client_serveur_nom[100];
  char tube_serveur_client_nom[100];

  int tubec; /*tube d ecoute*/
  int tube_client_serveur; /*tube de service 1 */
  int tube_serveur_client; /*tube de service 2 */

  if(argc != 2){
    fprintf(stderr,"Utilisation : %s <tube_ecoute> \n", argv[0]);
    exit(1);
  }

  tubec_nom = argv[1];
  k = mkfifo(tubec_nom,0600);
  if( k < 0 ){perror("mkfifo");exit(1);}

  while(1){
   tubec= open(tubec_nom,O_RDONLY); /* open bloquant */
   if(tubec < 0){perror("open() tubec");exit(1);}

   printf("serveur : connexion d'un client\n");

   k = read(tubec,buf,sizeof(buf)-1);  
   if( k < 0 ){perror("read() ecoute");exit(1);}
   printf("serveur : a lu : %s\n", buf);
   sscanf(buf, "%s %s", tube_client_serveur_nom, tube_serveur_client_nom);
   printf("serveur : tube serveur->client : %s\n", tube_serveur_client_nom);
   printf("serveur : tube client->serveur : %s\n", tube_client_serveur_nom);

   close(tubec);

   /*se duplique et continue a ecoute*/
   proc=fork();
   if(proc < 0 ){perror("fork");exit(1);}

   else if(proc == 0){/*code du fils*/
     /*on ouvre les tubes de services crees par le client */
     printf("serveur : ouverture tube_client_serveur\n");
     tube_client_serveur= open(tube_client_serveur_nom,O_RDONLY);
     if(tube_client_serveur < 0){perror("open cs");exit(1);}

     printf("serveur : ouverture tube_serveur_client\n");
     tube_serveur_client= open(tube_serveur_client_nom,O_WRONLY);
     if(tube_serveur_client < 0){perror("open sc");exit(1);}

     while(1){
       k= read(tube_client_serveur,buf,sizeof(buf)-1); 
       if( k < 0 ){perror("read cs"); exit(1); } 
       if( k == 0 ){
         printf("serveur : fin client detecte \n");
         exit(1);
       }
       buf[k]=0;
       printf("serveur : requete recu : %s\n",buf);

       /* lire le nom de famille ds tube_client_serveur
	* le cherche dans le fichier de correspondance nom<->prenom
        * renvoyer ce dernier si il existe
        */

       k= write(tube_serveur_client,buf,strlen(buf)+1);   
       if( k < 0 ){perror("write cs"); exit(1);}
     }
     exit(0);

   }else if(proc > 0 ){/*code du pere*/
     printf("serveur : nb de connexions etablie: %d\n",++count);
   }
  }/*fin while*/
  printf("arret du serveur");
  exit(0);
}
