chat : server : connect.c - Owanesh/unifi-eos GitHub Wiki

void acceptConnection(Client **head, char* cmd) {
	pid_t pid;
	getPidFromCmd(cmd, &pid);
	if (!isAlreadyConnected(head, pid)) {
		if (verboseMode == 1) {
			printf("\n[LOG] Request from %d accepted", pid);
			fflush(stdout);
		}
		char path[50];
		getClientPipePath(pid, path);
		createPipe(path);
		addClientInList(head, pid, path);
	} else if (verboseMode == 1) {
		printf("\n[WARNING] %d is already connected ", pid);
		fflush(stdout);
	}
}

Si verifica inizialmente che il client non risulti già connesso, in caso affermativo si annulla l’operazione. La connessione prevede la creazione della client_pipe e la successiva apertura in scrittura da parte del server (contemporaneamente il client la starà aprendo in lettura). Infine si aggiunge il client alla lista.

/* Determina se un client e' gia' connesso.
 * Restituisce
 * 1: Pid gia' presente nella lista
 * 0: Pid non presente nella lista
 */
int isAlreadyConnected(Client **head, pid_t pid) {
	if ((*head) == NULL) {
		return 0;
	} else {
		Client *chead = (*head);
		do {
			if (chead->pid == pid) {
				return 1;
			}
			chead = chead->next;
		} while (chead != NULL);
	}
	return 0;
}
/*
 *  Crea una pipe individuata dal percorso "pipePath" e ne acquisisce i permessi "0660"
 */
void createPipe(char* pipePath) {
	//rimuovo la vecchia sessione del server
	if (unlink(pipePath) == -1) {
		printf(
"\n[ERROR] (%s) Errore durante la rimozione della vecchia sessione",pipePath);
	} else if (verboseMode == 1) {
		printf("\n[LOG] (%s) Rimossa sessione precedente", pipePath);
		fflush(stdout);
	}
	//creo la nuova pipe
	if (mknod(pipePath, S_IFIFO, 0) < 0) {
printf("\n[ERROR] (%s) Errore durante la generazione del pipe",pipePath);
	} else if (verboseMode == 1) {
		printf("\n[LOG] (%s) Generata nuova sessione", pipePath);
		fflush(stdout);

	}
	//acquisisco i permessi sulla pipe
	if (chmod(pipePath, 0660) < 0) {
		printf(
"\n[ERROR] (%s) Errore durante l'acquisizione dei permessi sul pipe",pipePath);
	} else if (verboseMode == 1) {
		printf(
"\n[LOG] (%s) Acquisiti permessi per la sessione corrente (0660)",pipePath);
		fflush(stdout);
	}
}
/* Aggiunge un client nella lista */
void addClientInList(Client **head, pid_t pid, char* path) {
	if ((*head) == NULL) {
		(*head) = malloc(sizeof(Client));
		(*head)->next = NULL;
		(*head)->pid = pid;
// apertura in scrittura, bloccante perche' il client dovrebbe già essere in attesa lato lettura
		(*head)->pipe = open(path, O_WRONLY);
	} else {
		Client *last = getLastClient((*head));
		last->next = malloc(sizeof(Client));
		last->next->next = NULL;
		last->next->pid = pid;
// apertura in scrittura, bloccante perche' il client dovrebbe già essere in attesa lato lettura
		last->next->pipe = open(path, O_WRONLY);
	}
}

Nell’aggiungere il client alla lista si distinguono i 2 casi di inserimento in testa (primo nodo quindi inizializzazione della lista) oppure normale inserimento in coda.