#include "mail.h"


void * mail(void * args) {

  struct info * mail_info = (struct info *)args; /* Casteo del argumento hacia struct info* */
  
  pid_t pid;
  int pfdToChild[2];
  int pfdFromChild[2];
  int i, status;

  FILE * toChild, *fromChild;
  char line[LINE_SIZE];
  


  // Creacion de pipas
  if (pipe(pfdToChild) < 0) {
    perror("pipe");
    exit(1);
  }
  if (pipe(pfdFromChild) < 0) {
    perror("pipe");
    exit(1);
  }

  // Creacion de un proceso hijo 
  if ((pid = fork()) < 0) {
    perror("fork");
    exit(1);
  }

  // Proceso hijo encargado de ejecutar openssl
  if (pid == 0) {
    dup2(pfdToChild[0], 0);  /* seteo de la pipa como entrada estandar */
    close(pfdToChild[1]); /* Se cierra el otro extremo */
    
    dup2(pfdFromChild[1],1);  /* Salida estandar del hijo redigida al padre  */
    dup2(pfdFromChild[1],2);  /* Salida de errores tambien se redirige */
    close(pfdFromChild[0]); /* Cierre del otro extremo */

   execl("/usr/bin/openssl", "openssl", "s_client",
          "-starttls","smtp", "-crlf", "-connect", mail_info->server, NULL); /* Ejecucion de openssl */
    perror("exec"); /* Si hay error en el execl */
    _exit(127);
  }

  //Padre

  //Cierra los extemos de la pipa usados por el hijo
  close(pfdToChild[0]);
  close(pfdFromChild[1]);
  
  //Abre las pipas como descriptores de archivo para su lectura/escritura 
  toChild = fdopen(pfdToChild[1], "w");
  fromChild = fdopen(pfdFromChild[0], "r");
    
  //Espera hasta que se reciba una linea de ok, o termina el programa si hay un error en la conexion
  do
       if(fgets(line, sizeof(line), fromChild) == NULL){
               printf("Can't establish a connection to the server\n");
               exit(1);
        }
	
  while (strncmp(line,"250 ",4)!=0);

  //Secuencia de comandos enviados a openssl para el envio del mail desde y hacia la casilla dados
  fprintf(toChild,"AUTH PLAIN %s\n", mail_info->auth); 
  fflush(toChild);
  fgets(line, sizeof(line), fromChild);
  if( strncmp(line,"235 ",4)!=0) {
        printf("Incorrect authentication data\n");
        fprintf(toChild,"quit\n");
        fflush(toChild);
        exit(1);
  }
  fprintf(toChild,"mail from: <%s>\n", mail_info->email);
  fflush(toChild);
  fgets(line, sizeof(line), fromChild);
  fprintf(toChild,"rcpt to: <%s>\n", mail_info->email);  /*it must be recpt to with lowercase! */
  fflush(toChild);
  fgets(line, sizeof(line), fromChild);
  fprintf(toChild,"data\n");
  fflush(toChild);
  fgets(line, sizeof(line), fromChild);
  
  //Cuerpo del correo electronico a enviar
  fprintf(toChild, "From:\" Monitor\" <%s>\n\
To: \" \" <%s>\nSubject: Monitor detectó %d conexiones establecidas\n\n\
El umbral configurado es de %d conexiones establecidas.\n\nLo saluda cordialmente,\nEl Monitor\n.\n",mail_info->email,mail_info->email,mail_info->ncon,mail_info->umbral);
  fflush(toChild);
  fgets(line, sizeof(line), fromChild);
  fprintf(toChild,"quit\n");
  fflush(toChild);
  fgets(line, sizeof(line), fromChild);

  //Se cierran las pipas y se espera el termino del proceso hijo (openssl)
  fclose(toChild);
  fclose(fromChild);
  waitpid(pid, &status, 0);

  //libera el espacio utilizado en el almacenaje de las variables
  free(mail_info);

  //Termina la hebra al realizar todo bien
}

