###############################################################################
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);