/* funzioniServer.c */
#include "macro.h"
#include "funzioniServer.h"
int aggiungiRecord(Record record){
/* Apertura dell'archivio "ElencoTelefonico.txt" */
if(( ElencoTelefonico = fopen("ElencoTelefonico.txt", "a")) == NULL){
printf("Non è possibile aprire l'elenco telefonico, verificare la consistenza dell'archivio");fflush
(stdout
);
chiusuraServer();
}
else{
/* Stampa su file del record */
fprintf( ElencoTelefonico, "%s %s %s\n", record.nome, record.cognome, record.numeroTelefono);
while(fclose(ElencoTelefonico) != 0){
if(errno != EINTR){
chiusuraServer();
}
}
/* Verifica presenza del record appena inserito */
Record recordTemp = cercaRecord(record);
if((strcmp(record.nome, recordTemp.nome) == 0) && (strcmp(record.cognome, recordTemp.cognome) == 0) && (strcmp(record.numeroTelefono, recordTemp.numeroTelefono) == 0)){
return 1;
}
else return -1;
}
}
int cancellaRecord(Record record){
Record recordTemp;
/* Resetto i valori della struct recordTemp */
memset(recordTemp.nome, 0, sizeof(recordTemp.nome));
memset(recordTemp.cognome, 0, sizeof(recordTemp.cognome));
memset(recordTemp.numeroTelefono, 0, sizeof(recordTemp.numeroTelefono));
FILE *temp;
/* Apertura dell'archivio "ElencoTelefonico.txt" */
if(( ElencoTelefonico = fopen("ElencoTelefonico.txt", "r")) == NULL){
printf("\nNon è possibile aprire l'elenco telefonico, verificare la consistenza dell'archivio\n");fflush
(stdout
);
chiusuraServer();
}
else{
/* Apertura di un file temporaneo nel quale copiare l'archivio */
if(( temp = fopen("temp.txt", "w")) == NULL){
printf("\nImpossibile creare file temporaneo...\n\n");fflush
(stdout
);
chiusuraServer();
}
else{
/* Copio tutti i record dell'archivio escludendone quello da eliminare */
while(fscanf(ElencoTelefonico, "%s %s %s", recordTemp.nome, recordTemp.cognome, recordTemp.numeroTelefono) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
while(!feof(ElencoTelefonico)){
if((strcmp(record.nome, recordTemp.nome) == 0) && (strcmp(record.cognome, recordTemp.cognome) == 0)){
while(fscanf(ElencoTelefonico, "%s %s %s", recordTemp.nome, recordTemp.cognome, recordTemp.numeroTelefono) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
}
else{
fprintf( temp, "%s %s %s\n", recordTemp.nome, recordTemp.cognome, recordTemp.numeroTelefono);
while(fscanf(ElencoTelefonico, "%s %s %s", recordTemp.nome, recordTemp.cognome, recordTemp.numeroTelefono) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
}
}
/* Chiusura dei file */
while(fclose(ElencoTelefonico) != 0){
if(errno != EINTR){
chiusuraServer();
}
}
while(fclose(temp) != 0){
if(errno != EINTR){
chiusuraServer();
}
}
/* Eliminazione del file ElencoTelefonico.txt */
while(remove("ElencoTelefonico.txt") == -1){
if(errno != EINTR){
chiusuraServer();
}
}
/* Rinomino il file "temp.txt" */
while(rename("temp.txt", "ElencoTelefonico.txt") == -1){
if(errno != EINTR){
chiusuraServer();
}
}
}
}
}
Record cercaRecord(Record record){
Record recordTemp;
/* Resetto i valori della struct recordTemp */
memset(recordTemp.nome, 0, sizeof(recordTemp.nome));
memset(recordTemp.cognome, 0, sizeof(recordTemp.cognome));
memset(recordTemp.numeroTelefono, 0, sizeof(recordTemp.numeroTelefono));
int cont=0;
/* Apertura dell'archivio "ElencoTelefonico.txt" */
if(( ElencoTelefonico = fopen("ElencoTelefonico.txt", "r")) == NULL){
printf("Non è possibile aprire l'elenco telefonico, verificare la consistenza dell'archivio");fflush
(stdout
);
chiusuraServer();
}
else{
/* Lettura del file e conteggio del numero di record presenti */
while(fscanf(ElencoTelefonico, "%s %s %s", recordTemp.nome, recordTemp.cognome, recordTemp.numeroTelefono) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
while(!feof(ElencoTelefonico)){
while(fscanf(ElencoTelefonico, "%s %s %s", recordTemp.nome, recordTemp.cognome, recordTemp.numeroTelefono) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
++cont;
}
/* Riposizionamento dell'indice di lettura del file */
rewind(ElencoTelefonico);
/* Rilettura del file alla ricerca del record richiesto */
int i;
for(i=0; i<cont; ++i){
while(fscanf(ElencoTelefonico, "%s %s %s", recordTemp.nome, recordTemp.cognome, recordTemp.numeroTelefono) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
if((strcmp(record.nome, recordTemp.nome) == 0 && strcmp(record.cognome, recordTemp.cognome) == 0)){
while(fclose(ElencoTelefonico) != 0){
if(errno != EINTR){
chiusuraServer();
}
}
return recordTemp;
}
}
/* Chiusura del file */
while(fclose(ElencoTelefonico) != 0){
if(errno != EINTR){
chiusuraServer();
}
}
/* Valore ritornato in caso in cui il record richiesto non sia presente nell'archivio */
Record risultatoNullo = { "NULL", "NULL", "NULL" };
return risultatoNullo;
}
}
void stampaElencoTelefonico(){
Record record;
/* Resetto i valori della struct record */
memset(record.nome, 0, sizeof(record.nome));
memset(record.cognome, 0, sizeof(record.cognome));
memset(record.numeroTelefono, 0, sizeof(record.numeroTelefono));
/* Apertura dell'archivio ElencoTelefonico.txt" */
if(( ElencoTelefonico = fopen("ElencoTelefonico.txt", "r")) == NULL){
printf("Non è possibile aprire l'elenco telefonico, verificare la consistenza dell'archivio");fflush
(stdout
);
chiusuraServer();
}
/* Lettura del file e stampa dei record */
else{
printf("Stampa elenco telefonico in corso...\n\n");fflush
(stdout
);
printf("----------ELENCO TELEFONICO----------\n\n");fflush
(stdout
);
printf("%-13s %-13s %s\n\n", "NOME", "COGNOME", "N. TEL");fflush
(stdout
);
while(fscanf(ElencoTelefonico, "%s %s %s", record.nome, record.cognome, record.numeroTelefono) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
}
while(!feof(ElencoTelefonico)){
printf("%-13s %-13s %s\n", record.
nome, record.
cognome, record.
numeroTelefono);fflush
(stdout
);
while(fscanf(ElencoTelefonico, "%s %s %s", record.nome, record.cognome, record.numeroTelefono) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
}
printf("\n-------------------------------------\n\n");fflush
(stdout
);
/* Chiusura del file */
while(fclose(ElencoTelefonico) != 0){
if(errno != EINTR){
chiusuraServer();
}
}
/* "Premi INVIO per continuare" */
premiInvio();
}
int aggiungiUtente(Utente utente){
/* Apertura dell'archivio "Permessi.txt" */
if(( Permessi = fopen("Permessi.txt", "a")) == NULL){
printf("\nNon è possibile aprire l'elenco utenti, verificare la consistenza dell'archivio\n");fflush
(stdout
);
chiusuraServer();
}
else{
/* Scrittura su file del record */
while(fprintf( Permessi, "%s %s %d\n", utente.nickname, utente.password, utente.permessi) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
/* Chiusura del file */
while(fclose(Permessi) != 0){
if(errno != EINTR){
chiusuraServer();
}
}
/* Verifica della presenza del record appena inserito */
Utente utenteTemp = cercaUtente(utente);
if( (strcmp(utente.nickname, utenteTemp.nickname) == 0) && (strcmp(utente.password, utenteTemp.password) == 0) && (utente.permessi == utenteTemp.permessi) ){
return 1;
}
else return -1;
}
}
int cancellaUtente(Utente utente){
Utente utenteTemp;
/* Resetto i valori della struct utenteTemp */
memset(utenteTemp.nickname, 0, sizeof(utenteTemp.nickname));
memset(utenteTemp.password, 0, sizeof(utenteTemp.password));
FILE *temp;
/* Apertura dell'archivio "Permessi.txt" */
if(( Permessi = fopen("Permessi.txt", "r")) == NULL){
printf("Non è possibile aprire l'elenco utenti, verificare la consistenza dell'archivio");fflush
(stdout
);
chiusuraServer();
}
else{
/* Apertura del file temporaneo "temp.txt" */
if(( temp = fopen("temp.txt", "w")) == NULL){
printf("\nOperazione fallita. Chiusura programma...\n\n");fflush
(stdout
);
chiusuraServer();
}
else{
/* Copio i record di Permessi.txt in temp.txt ad eccezione del record da cancellare */
while(fscanf(Permessi, "%s %s %d", utenteTemp.nickname, utenteTemp.password, &utenteTemp.permessi) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
while(!feof(Permessi)){
if((strcmp(utente.nickname, utenteTemp.nickname) == 0)){
while(fscanf(Permessi, "%s %s %d", utenteTemp.nickname, utenteTemp.password, &utenteTemp.permessi) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
}
else{
while(fprintf( temp, "%s %s %d\n", utenteTemp.nickname, utenteTemp.password, utenteTemp.permessi) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
while(fscanf(Permessi, "%s %s %d", utenteTemp.nickname, utenteTemp.password, &utenteTemp.permessi) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
}
}
/* Chiusura dei file */
while(fclose(Permessi) != 0){
if(errno != EINTR){
chiusuraServer();
}
}
while(fclose(temp) != 0){
if(errno != EINTR){
chiusuraServer();
}
}
/* Cancellazione del file "Permessi.txt" */
while(remove("Permessi.txt") == -1){
if(errno != EINTR){
chiusuraServer();
}
}
/* Rinomino il file "temp.txt" */
while(rename("temp.txt", "Permessi.txt") == -1){
if(errno != EINTR){
chiusuraServer();
}
}
}
}
}
Utente cercaUtente(Utente utente){
Utente utenteTemp;
/* Resetto i valori della struct utenteTemp */
memset(utenteTemp.nickname, 0, sizeof(utenteTemp.nickname));
memset(utenteTemp.password, 0, sizeof(utenteTemp.password));
int cont=0;
/* Apertura dell'archivio "Permessi.txt" */
if(( Permessi = fopen("Permessi.txt", "r")) == NULL){
printf("\nNon è possibile aprire l'elenco utenti, verificare la consistenza dell'archivio\n");fflush
(stdout
);
chiusuraServer();
}
else{
/* Conteggio del numero di record presenti nel file */
while(fscanf(Permessi, "%s %s %d", utenteTemp.nickname, utenteTemp.password, &utenteTemp.permessi) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
while(!feof(Permessi)){
while(fscanf(Permessi, "%s %s %d", utenteTemp.nickname, utenteTemp.password, &utenteTemp.permessi) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
++cont;
}
/* Riposizionamento dell'indice di lettura del file */
rewind(Permessi);
/* Rilettura del file alla ricerca del record richiesto */
int i;
for(i=0; i<cont; ++i){
while(fscanf(Permessi, "%s %s %d", utenteTemp.nickname, utenteTemp.password, &utenteTemp.permessi) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
if(strcmp(utente.nickname, utenteTemp.nickname) == 0){
while(fclose(Permessi) != 0){
if(errno != EINTR){
chiusuraServer();
}
}
return utenteTemp;
}
}
/* Chiusura del file */
while(fclose(Permessi) != 0){
if(errno != EINTR){
chiusuraServer();
}
}
/* Risultato ritornato nel caso in cui il record richiesto non sia presente nel file */
Utente nullo = { "NULL", "NULL", 0 };
return nullo;
}
}
void stampaElencoUtenti(){
Utente utente;
/* Resetto i valori della struct utente */
memset(utente.nickname, 0, sizeof(utente.nickname));
memset(utente.password, 0, sizeof(utente.password));
/* Apertura dell'archivio "Permessi.txt" */
if(( Permessi = fopen("Permessi.txt", "r")) == NULL){
printf("Non è possibile aprire l'elenco utenti, verificare la consistenza dell'archivio");fflush
(stdout
);
chiusuraServer();
}
else{
/* Lettura e stampa di tutti i record del file */
printf("-------------ELENCO UTENTI-------------\n\n");fflush
(stdout
);
printf("%-13s %-13s %s\n\n", "NICKNAME", "PASSWORD", "TIPO PERMESSI");fflush
(stdout
);
while(fscanf(Permessi, "%s %s %d", utente.nickname, utente.password, &utente.permessi) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
}
while(!feof(Permessi)){
printf("%-13s %-13s %d\n", utente.
nickname, utente.
password, utente.
permessi);fflush
(stdout
);
while(fscanf(Permessi, "%s %s %d", utente.nickname, utente.password, &utente.permessi) == -1){
if(errno != EINTR){
chiusuraServer();
}
}
}
printf("\n---------------------------------------\n\n");fflush
(stdout
);
/* Chiusura del file */
while(fclose(Permessi) != 0){
if(errno != EINTR){
chiusuraServer();
}
}
/* "Premere INVIO per continuare" */
premiInvio();
}
int login(int newSock){
int tentativi = 3; // Variabile che tiene il conteggio del numero di tentativi di LOGIN disponibili
while(tentativi>0){
Utente utente;
/* Resetto i valori della struct utente */
memset(utente.nickname, 0, sizeof(utente.nickname));
memset(utente.password, 0, sizeof(utente.password));
/* Ricevo il nickname dal client*/
while(read(newSock, utente.nickname, NICKNAME) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return -1;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return -1;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
/* Ricevo la password dal client */
while(read(newSock, utente.password, PASSWORD) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return -1;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return -1;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
printf("\nHo passato le 2 read (nick e pass)\n");
/* Ricerca dell'utente appena connesso */
Utente utenteTemp = cercaUtente(utente);
if((strcmp(utente.nickname, utenteTemp.nickname) == 0) && (strcmp(utente.password, utenteTemp.password) == 0)){
/* L'utente connesso è presente nell'archivio */
while(write(newSock, "OK", RISPOSTA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return -1;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return -1;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
printf("\n%s ha appena effettuato il LOGIN\n", utenteTemp.
nickname);fflush
(stdout
);
/* Resetto i valori della struct utente */
memset(utente.nickname, 0, sizeof(utente.nickname));
memset(utente.password, 0, sizeof(utente.password));
return utenteTemp.permessi;
}
else {
/* L'utente connesso non è presente nell'archivio */
while(write(newSock, "NO", RISPOSTA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return -1;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return -1;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
printf("\n%s non presente nell'elenco utenti\n", utente.
nickname);fflush
(stdout
);
while(write(newSock, "NO", RISPOSTA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return -1;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return -1;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
--tentativi;
printf("%s ha ancora %d tentativi a disposizione\n", utente.
nickname, tentativi
);fflush
(stdout
);
/* Resetto i valori della struct utente */
memset(utente.nickname, 0, sizeof(utente.nickname));
memset(utente.password, 0, sizeof(utente.password));
}
}
printf("Tentativo di LOGIN fallito dopo 3 tentativi\n");fflush
(stdout
);
return -1;
}
void trova(int newSock){
printf("\nRicevuta richiesta ""Trova record""\n");fflush
(stdout
);
Record record, risultato;
/* Resetto i valori della struct record */
memset(record.nome, 0, sizeof(record.nome));
memset(record.cognome, 0, sizeof(record.cognome));
memset(record.numeroTelefono, 0, sizeof(record.numeroTelefono));
/* Resetto i valori della struct risultato */
memset(risultato.nome, 0, sizeof(risultato.nome));
memset(risultato.cognome, 0, sizeof(risultato.cognome));
memset(risultato.numeroTelefono, 0, sizeof(risultato.numeroTelefono));
/* Ricevo il nome dal client */
while(read(newSock, record.nome, NOME) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
printf("\nRicevuto il nome dal client\n");
/* Ricevo il cognome dal client */
while(read(newSock, record.cognome, COGNOME) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
printf("Ricevuta il cognome dal client\n");
/* Cerco il record nell'archivio */
risultato = cercaRecord(record);
/* Invio il nome al client */
while(write(newSock, risultato.nome, NOME) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
printf("Inviato il nome-risultato al client\n");
/* Invio il cognome al client */
while(write(newSock, risultato.cognome, COGNOME) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
printf("Inviato il cognome-risultato al client\n");
/* Invio il numero al client */
while(write(newSock, risultato.numeroTelefono, NUMERO) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
printf("Inviato il numero-risultato al client\n");
}
void aggiungi(int newSock){
printf("\nRicevuta richiesta ""Aggiungi record""\n");fflush
(stdout
);
Record record;
/* Resetto i valori della struct record */
memset(record.nome, 0, sizeof(record.nome));
memset(record.cognome, 0, sizeof(record.cognome));
memset(record.numeroTelefono, 0, sizeof(record.numeroTelefono));
/* Ricevo il nome dal client */
while(read(newSock, record.nome, NOME) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
printf("\nRicevuto il nome dal client\n");
/* Ricevo il cognome dal client */
while(read(newSock, record.cognome, COGNOME) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
printf("\nRicevuto il cognome dal client\n");
/* Ricevo il numero dal client */
while(read(newSock, record.numeroTelefono, NUMERO) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
printf("\nRicevuto il numero dal client\n");
/* Aggiungo il record all'archivio */
if(1 == aggiungiRecord(record)){
printf("\nAggiunto un nuovo record all'archivio!\n");fflush
(stdout
);
while(write(newSock, "OK", RISPOSTA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
}
else{
/* Tentativo fallito */
printf("\nTentativo di aggiungere un record all'archivio è fallito!\n");fflush
(stdout
);
while(write(newSock, "NO", RISPOSTA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
}
}
void premiInvio(){
printf("\nPremere INVIO per continuare...\n");fflush
(stdout
);
/* Svuoto l'input buffer */
while ( getchar() != '\n' );
/* Leggo dallo stdin SOLO \n */
while(scanf("%*[^\n]") == -1){
if(errno != EINTR){
chiusuraServer();
}
}
}
void chiusuraServer(){
printf("\033[00m\n\nCHIUSURA SERVER IN CORSO...");fflush
(stdout
);
printf("\nSERVER CHIUSO CORRETTAMENTE\n\n");fflush
(stdout
);
exit(0);
}
void servizio(int permessi, int newSock){
printf("\nSono entrato nella funzione servizio\n");
char opzione[RISPOSTA];
while(1){
/* Resetto la stringa opzione */
memset(opzione, 0, strlen(opzione));
/* Ricevo la richiesta dal client */
while(read(newSock, opzione, RISPOSTA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
/* Elaboro la richiesta del client invocando la funzione di gestione adatta */
if(strcmp("TROVA", opzione) == 0){
memset(opzione, 0, strlen(opzione));
trova(newSock);
}
/* Il client vuole aggiungere un record all'archivio ed ha i permessi sufficienti */
if((strcmp("AGGIUNGI", opzione) == 0) && permessi == 2){
while(write(newSock, "OK", RISPOSTA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
memset(opzione, 0, strlen(opzione));
aggiungi(newSock);
}
/* Il client vuole aggiungere un record all'archivio e non dispone dei permessi sufficienti */
if((strcmp("AGGIUNGI", opzione) == 0) && permessi == 1){
printf("\nRicevuta richiesta ""Aggiungi record""");fflush
(stdout
);
printf("\nL'utente non ha i permessi sufficienti per l'operazione\n");fflush
(stdout
);
while(write(newSock, "NO", RISPOSTA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
}
/* Il client ha comunicato che desidera interrompere la connessione */
if(strcmp("OFF", opzione) == 0){
printf("\nL'utente ha concluso correttamente le sue operazioni");fflush
(stdout
);
return;
}
char off[RISPOSTA];
while(read(newSock, off, RISPOSTA) <= 0){
if(errno != EINTR){
if(errno == ECONNRESET || errno == EPIPE){
printf("\n\nCONNESSIONE INTERROTTA, il server si è disconnesso in maniera scorretta!");fflush
(stdout
);
return;
}
else{
printf("La read è fallita\n");fflush
(stdout
);
perror("Errore tipo");fflush(stdout);
return;
}
}
printf("Errore durante la system call, ripeto\n");fflush
(stdout
);
}
if(strcmp("OFF", off) == 0){
printf("\nL'utente ha concluso correttamente le sue operazioni");fflush
(stdout
);
return;
}
}
}