//  CUSTOMER
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include "glob.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <limits.h>
#include <unistd.h>
pid_t qpid;
int spid;
int wtime;
char s[50];
FILE* f;

volatile int dinnerready=0;
volatile int dinnertime=0;

void sig5h(int s)
{
	dinnerready=1;
}
	
void sigah(int s)
{
	dinnertime=1;
}

int main(int argc, char** argv) // path, qpid, wtime
{
	spid=getpid();
	int i;
	
	// params
	sscanf(argv[1],"%d",&i);
	qpid=i;
	sscanf(argv[2],"%d",&wtime);
	
	// signals
	sigset_t ss;
	sigemptyset(&ss);
	sigaddset(&ss, SIG5);
	sigaddset(&ss, SIGALRM);
	sigprocmask(SIG_BLOCK, &ss, 0);
	sigset_t sig5s=ss, sigas=ss;
	sigdelset(&sig5s, SIG5);
	sigdelset(&sigas, SIGALRM);
	
	// Set Handlers
	signal(SIG5, sig5h);
	signal(SIGALRM, sigah);
	
	// Cycle 
	printf("C Customer %d Ready: qpid=%d wtime=%d.\n",(int)getpid(),(int)qpid,(int)wtime);fflush(stdin);
	while(1)
	{
		dinnertime=0;
		struct itimerval tt;
		tt.it_value.tv_usec=wtime*TIMER;
		tt.it_value.tv_sec=0;
		tt.it_interval.tv_usec=0;
		tt.it_interval.tv_sec=0;
		setitimer(ITIMER_REAL, &tt, 0);
		while(!dinnertime)
			sigsuspend(&sigas);

		//printf("C Time to Eat!\n");
		dinnerready=0;
		sprintf(s,"./tmp/h%d",spid);
		f=fopen(s, "w");
		fclose(f);
		kill(qpid, SIG6);
		while(!dinnerready)
			sigsuspend(&sig5s);
		
		sprintf(s, "./tmp/x%d", spid);
		rename("./out/1",s);
		kill(qpid, SIG7);
		f=fopen(s, "r");
		int bn,bid;
		fscanf(f, "%d%d", &bid, &bn);
		fclose(f);
		unlink(s);
		printf("C Customer%d ate Baker%d's loaf #%d\n", spid, bid, bn);
		kill(qpid, SIG7);
	}
	return 0;
}


