/*****************************/
/*  sem_server.c by IoDream  */
/* sem_server main function  */
/*   Not released yet        */
/*      PUBLIC DOMAIN        */
/*****************************/

/* IoDream (IoDream@ifrance.com) */

/* C++ compilers friendly */
#ifdef __cplusplus
extern "C" {
#endif /*__cplusplus*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include "sem_server.h"

/* Function prototypes */
void server_init(void);
void server_done(void);

/* Global vars */
int pipePS2GE[2], pipeGE2PS[2], mutex[2];

/* Main sem_server function */
int main(int argc, char *argv[])
{
	printf("   ___---===''' Semaphore server by Joel THIEFFRY (minfg120) '''===---___\n");

	DEBUG_(printf("sem_server-:  Booting\n");)

	signal(SIGUSR1, SIG_IGN);
	signal(SIGUSR2, SIG_IGN);
	signal(SIGHUP, SIG_IGN);
	server_init();
	switch(fork())
	{
		case -1:
			perror("sem_server-:  fork()");
			exit(1);
		case 0:
			close(pipePS2GE[0]);
			close(pipeGE2PS[1]);
			DEBUG_(printf("sem_server-:  spawning sem_sock_server\n");)
			sem_sock_server();
			close(pipePS2GE[1]);
			close(pipeGE2PS[0]);
			DEBUG_(printf("sem_server-:  returned from sem_sock_server\n");)
			server_done();
			return(0);
		default:
			close(pipePS2GE[1]);
			close(pipeGE2PS[0]);
			DEBUG_(printf("sem_server-:  going to sem_gest\n");)
			sem_gest();
			close(pipePS2GE[0]);
			close(pipeGE2PS[1]);
			DEBUG_(printf("sem_server-:  returned from sem_sock_server\n");)
			server_done();
			DEBUG_(printf("sem_server-:  Exiting with no error\n");)
			break;
	}

	return(0);
}

/* Global initialisation of the server. */
void server_init(void)
{
	if ((pipe(pipePS2GE) < 0) || (pipe(pipeGE2PS) < 0) || (pipe(mutex) < 0))
	{
		perror("sem_server-:  pipe()");
		exit(1);
	}
	unlock_mutex(mutex);
	DEBUG_(printf("sem_server-:  Pipe system creation OK\n");)

	return;
}

/* Global deinitialisation of the server. */
void server_done(void)
{
	close(mutex[0]);
	close(mutex[1]);
	return;
}

/* C++ compilers friendly */
#ifdef __cplusplus
}
#endif /*__cplusplus*/
