Contents

##############################################################################
Programma della conferenza distribuita

Copyright (C) 19aa  
Autori: Andrea Lanzi, Giampaolo Fresi Roglia

Questo programma e' software  libero; e' lecito ridistribuirlo e/o
modificarlo secondo i  termini della Licenza Pubblica Generica GNU
come pubblicata  dalla Free Software Foundation;   o la versione 2
della licenza o (a scelta) una versione successiva.

Questo programma e' distribuito  nella speranza che sia utile,  ma
SENZA  ALCUNA GARANZIA;  senza  neppure la  garanzia  implicita di
COMMERCIABILITA' o di APPLICABILITA' PER UN PARTICOLARE SCOPO.  Si
veda la Licenza Pubblica Generica GNU per avere maggiori dettagli.
Ognuno dovrebbe avere  ricevuto una copia  della Licenza Pubblica
Generica GNU insieme a questo programma; in  caso contrario, la si
puo' ottenere dalla Free Software  Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, Stati Uniti.
Gli autori possono essere contattati ai seguenti indirizzi:

Andrea Lanzi           : shadow.net@tiscalinet.it
Giampaolo Fresi Roglia : gian_fresi@iol.it

##############################################################################


#include "server_subs.h"
            
void ignora()
{
   signal(SIGPIPE, ignora);
}

int main(int argc, char **argv)
{  	
        // STRUTTURE DI MEMORIA PER LA GESTIONE DELLE VARIE CONNESSIONI.
        
	struct element vector[FOPEN_MAX]; 
	struct guest *joiners;
	struct fifo FIFO_list;
        
        int logfd;            //DESCRITTORE DEL FILE DI LOG
        
        // DESCRITTORI DI SOCKET
        int fd, sockfd, newsockfd=0, or_fd=0, numcli=0, clilen ;
        
        // STRUTTURA PER INDIRIZZI INTERNET
        struct sockaddr_in  cli_addr ; 		
        
        // STRUTTURA PER INDIRIZZI INTERNET
        fd_set rfds ; 
        fd_set afds ;
        
        int nfds; 		
        int port ;	// NUMERO DI PORTA DEI SERVIZI
        
        char *logfile = "server.log";
                
        // APERTURA DEL FILE DI LOG
        logfd = open( logfile, O_CREAT | O_WRONLY | O_TRUNC, 00600);
        
        FIFO_list.first=NULL;   //INIZIALIZZAZIONE DEI PUNTATORI ALLE LISTE
        FIFO_list.last=NULL;
	joiners = NULL;
        signal( SIGPIPE, ignora ); //GESTIONE DEL SEGNALE SIGPIPE
        if(argc != 2)
        {
           printf("Lanciare il coordinatore con il numero di porta\n");
           exit(0);
        }
        port=atoi( argv[1] );	// ASSEGNAZIONE DELLA PORTA DEL SERVER.
        
        init( vector ) ;  	// INIZIALIZZA LA STRUTTURA DEL VETTORE 
        
        // APERTURA DELLA SOCKET PASSIVA.
        if((sockfd = passive_socket( port, BACKLOG ))<0) 
           exit(0) ;
                
        nfds = FOPEN_MAX ;//NUMERO MASSIMO DI DESCRITTORI CONSENTITI
        // INIZIALIZZA LA MSCHERA DEI DESCRITTORI PER LA SELECT
        FD_ZERO( &afds ) ;
        
        //SETTA NELLA MASCHERA IL DESCRITTORE DELLA SOCKET PASSIVA
        FD_SET( sockfd, &afds) ;
         
        
        // CICLO PER LA GESTIONI DELLE CONNESSIONI
        while( 1 ){
        
           	// COPIA DELLA STRUTTURA DALLA SORGENTE ALLA DESTINAZIONE
                bcopy( (char*) &afds, (char*) &rfds, sizeof(rfds) ) ;
                
                if(select( nfds, &rfds, (fd_set *) 0, (fd_set *) 0, 
                   (struct timeval*) 0) < 0)
                {
                   perror("select") ;
                   exit( 0 );
                }//fine if
                   
                // CONTROLLO DI NUOVE CONNESSIONI
                
                //GESTIONE DELL'INPUT SULLA SOCKET PASSIVA    
                if(FD_ISSET(sockfd, &rfds)){
                          
                          clilen = sizeof( cli_addr ) ;
                          newsockfd = accept(sockfd, 
                             	(struct sockaddr *) &cli_addr, &clilen ) ;
                          
                          printf("Accetto partecipante\n");
                          
                	if (newsockfd < 0 )
                        {
                        	perror( "accept") ;
                        }
                        else                        
                           FD_SET( newsockfd, &afds ) ;
                }//fine if

                
                // GESTIONE DEI CLIENTI CONNESSI

                for (fd=0;fd<FOPEN_MAX;fd++)
                {
                   if(fd != sockfd && FD_ISSET(fd, &rfds))
                      if(check(logfd, fd, &or_fd, &numcli, vector, 
                         &joiners, &FIFO_list)<0)
                      {
                         FD_CLR(fd, &afds) ;
                         close(fd);
                         printf("Chiusa connessione con partecipante\n");
                      }
                }//fine for
        }//fine while
        
        
}//fine main