// ctrl.c - control panel
// bully election algorithm

#include "process.h"


bool Send(int p, int sig)
{
  int orig_sock, len;
  struct sockaddr_in serv_adr;
  struct hostent *host;

  printf("attempting to send signal[%d] to processor[%d]\n",sig,p);

  host=gethostbyname (PID[p].address);
  if (host== (struct hostent *) NULL) {
    perror ("error: getting host");
    return false;
  }
 
  memset (&serv_adr, 0, sizeof (serv_adr));
  serv_adr.sin_family = AF_INET;
  memcpy (&serv_adr.sin_addr, host->h_addr, host->h_length);
  serv_adr.sin_port = htons (ctrl_PORT);

  if ((orig_sock = socket (AF_INET, SOCK_STREAM,0)) < 0) { //cant opensocket
    perror("error: no open socket");
    return false;
  }
      
  if (connect (orig_sock, (struct sockaddr * ) &serv_adr, sizeof (serv_adr)) <0) {
    perror ("connection refused");
    return false;
  } 

  switch (sig) {
  case 0:  
    write(orig_sock,SIG_START,1);
    break;
  case 1:
    write(orig_sock,SIG_SOFTKILL,1);                // send soft-kill signal
    break;
  case 2:
    write(orig_sock,SIG_REVIVE,1);
    break;
  case 3:
    write(orig_sock,SIG_HARDKILL,1);
    break;
  default:
    break;
  }
  close(orig_sock);
  return true;
}

int main(void)
{
  char sig[1];
  char p_str[4];
  int p;

  // init_PIDS();
  sig[0]='-';
  
  printf("-- control-panel --\n\n");
  while(sig[0]!='q') {
    printf("\nprocessor [0..%d]>", PS - 1);
    fgets(p_str,2,stdin);
    getchar();
    printf("signal [0=start 1=softkill 2=revive 3=hardkill]>");
    fgets(sig,2,stdin);
    if (atoi (p_str) >= 0 && 
	atoi (p_str) <= PS - 1  && 
	atoi (sig) >= 0  && 
	atoi (sig) <= 3) {
      if (Send (atoi (p_str), atoi (sig)))
	printf ("signal sent\n");
      else
	printf ("failed to send signal\n");
      getchar();
    }
    else
      printf ("illegal option\n");
  }
  printf ("bye\n");
}

