// Script de l'exécutable ouvrier
#include "fichier_entete.h"

void h(int signo){
  return;
}

int main(){
  //definition du mask qui bloquera le signal
  sigset_t oldmask,mask,newmask;
  sigemptyset(&newmask);
  sigaddset(&newmask,SIGUSR1);
  sigprocmask(SIG_BLOCK,&newmask,&oldmask);
  if(SIG_ERR == signal(SIGUSR1,h)){
    perror("Erreur handler");
    exit(1);
  }

  list<int> ListeNbPremiers;  //liste des nombres premiers
  list<int>::iterator iter = ListeNbPremiers.begin();
  int nombre;                 //le nombre à décomposer
  int fd;
  message_2 liste_nbPremier;  //pour la récéption de nombres premiers
  message_2 leNombre;         //pour la récéption du nombre à décomposer
  message_1 nombre_trouve;    //pour la transmission du facteur trouvé
  message_1 mess_pid; 
  nombre_trouve.pid=getpid();
  mess_pid.pid =getpid(); 
  liste_nbPremier.fin = false;

  // On lit la liste des nombres premiers jusqu'a l'arret de la transmission: liste_premier.fin = true
  
  while(!liste_nbPremier.fin) {
    if(read(STDIN_FILENO, &liste_nbPremier, sizeof(message_2))<0){
      perror("Erreur de récéption des nombres premiers");
      exit(2);
    }
    ListeNbPremiers.push_back(liste_nbPremier.nombre);
  }
  
  // Ouverture du tube nommé en écriture
  fd = open("tmp/canal",O_WRONLY);
  if (fd<0){
    perror("Erreur d'ouverture du tube canal en écriture");
    exit(3);
  }
  
  // Envoi du pid au processus maitre
  mess_pid.facteur=0;
  if (write(fd,&mess_pid,sizeof(message_1))<0){
    perror("Erreur d'écriture du message contenant le pid dans le tube");
    exit(4);
  }
  //boucle principale
  while(1){  
    // Lecture du nombre à décomposer
    if (read(STDIN_FILENO,&leNombre,sizeof(message_2))<0){
      perror("Erreur de lecture du nombre à décomposer");
      exit(5);
    }
    nombre=leNombre.nombre;
    // boucle de recherche des diviseurs 
    iter=ListeNbPremiers.begin(); 
    while(iter!=ListeNbPremiers.end()){ 
      if (nombre%(*iter)==0){
	nombre_trouve.facteur=(*iter);
	if (write(fd,&nombre_trouve,sizeof(message_1))<0){
	  perror("Erreur d'écriture du facteur trouvé");
	  exit(6);
	}
	nombre = nombre/ *iter;
      }
      else{
	iter++;
      }
    }
    // Indique au maître que l'ouvrier a fini
    nombre_trouve.facteur=0;
    if (write(fd,&nombre_trouve,sizeof(message_1))<0){
      perror("Erreur d'ecriture pour la signalisation de la fin d'un ouvrier");
      exit(7);
    }
    sigemptyset(&mask);
    sigsuspend(&mask);
    //cout<<"ouvrier "<<getpid()<<" bien reveille"<<endl;
  }
 }

