chat : server : writeClientList.c - owanesh/unifi-eos GitHub Wiki

/* Scorre la lista dei client individuando tutti i pid dei client connessi.
 * Ottiene la stringa rappresentante la lista e la scrive sulla pipe corretta.*/
void writeClientList(Client *head, char* cmd) {
	if (head == NULL) {
		printf("\n *** NESSUN UTENTE CONNESSO ***");
	} else {
		pid_t pid;
		getPidFromCmd(cmd, &pid); // acquisisco il pid del richiedente
		char* list = buildMessage(head, pid);
		int fd;
		fd = getPipeByPid(pid, head); // trovo il riferimento alla pipe
		if (fd != 0)
			write(fd, list, strlen(list) + 1);
		free(list);
	}
}

Dopo aver acquisito il pid del richiedente, si costruisce la lista dei clients connessi e la si scrive sulla pipe del client corretto

char* buildMessage(Client* head, pid_t pid) {
	int count = countClients(head);
	/* alloco 20 caratteri per ogni pid (dovrebbero sempre bastare)
	 + 50 caratteri per il messaggio iniziale*/
	char* str = malloc(sizeof(char) * ((count * 20) + 50));
	if (str == NULL)
		exit(EXIT_FAILURE);
	if (count == 1) {
		sprintf(str, "Sei l'unico utente connesso:\nil tuo id e' %d.", pid);
	} else {
		sprintf(str, "Sono presenti %d clients:\n", count);
		printf("\n*** LISTA UTENTI CONNESSI ***");
		do {
			printf("\n %d", head->pid);
			char temp[40];
			if (head->pid == pid)
				sprintf(temp, "%d (il tuo id)\n", head->pid); 
			// il tuo pid
			else
				sprintf(temp, "%d\n", head->pid); 
			// converto il pid in stringa
			strcat(str, temp);
			head = head->next;
		} while (head != NULL);
	}
	return str;
}

La funzione buildMessage() crea un messaggio già opportunamente formattato per essere visualizzato da parte del client: viene stampato il numero dei client connessi e scorrendo la lista si acquisiscono i pid di tutti i presenti separati riga per riga (il pid del mittente viene contato e viene opportunamente marcato).

/*
 * Conta il numero di clients connessi (escluso il pid mittente)
 */
int countClients(Client* head) {
	int count = 0;
	do {
		count++;
		head = head->next;
	} while (head != NULL);
	return count;
}