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 <stdio.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <arpa/inet.h>            

#define BACKLOG 5

// STRUTTURA PER MANTENERE LE INFORMAZIONI DEI PARTECIPANTI
struct guest { 

        int fd;
	int port;
	unsigned long address;
        struct guest *next;
        struct guest *prec;
  };
  
// STRUTTURA PER LA GESTIONE FIFO DEGLI ISCRITTI A PARLARE
struct speaker { 

        int sockfd ;
        struct speaker *next;
        struct speaker *prec;

  };
  
// VETTORE CHE CONTIENE I PUNTATORI ALLE DUE LISTE
struct element {
        struct guest *pos_guest;
	struct speaker *pos_speaker;
   };

// STRUTTURA CONTENENTE I DUE PUNTATORI PRINCIPALI ALLA LISTA 
// DELLE INFORMAZIONI E ALLA LISTA DEGLI ISCRITTI A PARLARE.  
struct fifo 
{
   struct speaker *first;
   struct speaker *last;
};

// DEFINIZIONE DEI PROTOTIPI DELLE FUNZIONI

int check( int logfd, int fd, int *or_fd, int *numcli, struct element vector[], struct guest **joiners, struct fifo *FIFO_list);

int passive_socket(int port, int backlog);

void init(struct element vector[]);

int add_guest(int *numcli, int fd, int port, struct element vector[], struct guest **joiners);

int rem_guest(int *numcli, int fd, struct element vector[], struct fifo *FIFO_list, struct guest **joiners);

int notify_add(struct guest *joiners,struct element vector[],int fd);

int notify_rem(struct guest *joiners,struct element vector[],int fd);

int add_fifo(int fd, struct fifo *FIFO_list, struct element vector[]);

int rem_fifo(int fd, struct element vector[], struct fifo *FIFO_list);