/*
 * mEtMme-cli.c
 * crée 2 tubes nommés
 * envoi les noms de ces
 * tubes ds le tube d'ecoute
 * ferme le tube d'ecoute
 * Envoi les noms de famille
 * lu dans l'entree standard
 * dans un tube de service
 * et affiche le prenom reçu
 * par l'autre tube
 ***************************
 * 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 k;
  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 */

  printf("client : bienvenue\n");
  if(argc != 2){
    fprintf(stderr,"Utilisation : %s <tube_ecoute>\n",argv[0]);
    exit(1);
  }
  tubec_nom = argv[1];

  printf("client : tube d'ecoute : %s\n",tubec_nom);

  printf("client : creation des tubes de service\n");
  sprintf(tube_client_serveur_nom,"tube_cli_serv_%d.tmp",getpid());
  k= mkfifo(tube_client_serveur_nom,0600);
  if( k < 0 ){ perror("mkfifo"); exit(1); }
  sprintf(tube_serveur_client_nom,"tube_serv_cli_%d.tmp", getpid());
  k = mkfifo(tube_serveur_client_nom,0600);
  if( k < 0 ){ perror("mkfifo"); exit(1); }

  printf("client : ouverture tube d'ecoute \n");
  tubec = open(tubec_nom,O_WRONLY);
  if( tubec < 0 ){ perror("open() ecoute"); exit(1); }

  printf("client : envoi des nom des tubes\n");
  sprintf(buf,"%s %s",tube_client_serveur_nom,tube_serveur_client_nom);
  k=write(tubec,buf,strlen(buf)+1);
  if( k < 0 ){perror("write() cc");exit(1);}
  close(tubec);

  printf("client : ouverture tube_client_serveur\n");
  tube_client_serveur= open(tube_client_serveur_nom,O_WRONLY);
  if(tube_client_serveur < 0){perror("open() cs");exit(1);}
  
  printf("client : ouverture tube_serveur_client\n");
  tube_serveur_client= open(tube_serveur_client_nom,O_RDONLY );
  if(tube_serveur_client < 0){perror("open() sc");exit(1);}

  while(1){
    printf("Entrez un nom de famille \n");
    fgets(buf,sizeof(buf),stdin);
    k = write(tube_client_serveur,buf,strlen(buf)+1);    
    if( k < 0 ){perror("write client_serveur"); exit(1); }

    printf("client : en attente reponse serveur \n");
    k = read(tube_serveur_client,buf,sizeof(buf)-1);
    if( k < 0 ){perror("read sc");exit(1);}
      
    if( k == 0 ){
      printf("client : serveur : fin detecte \n");
      break;
    }
    buf[k]= 0;
    printf("client : reponse =  %s \n",buf);      
  }

  printf("client : suppression des tubes de services \n");
  close(tube_client_serveur);
  close(tube_serveur_client);
  unlink(tube_client_serveur_nom);
  unlink(tube_serveur_client_nom);
  exit(0);
}
