void serverDestroy( Server **_self ) { Server *self = *_self; if (self) { serverFree (self); free(self); } *_self = NULL; }
void acceptClients(serv *server){ int socket = server->socket; struct sockaddr_in clientAddr; int clientSocket; pthread_attr_t worker_attr; pthread_attr_init(&worker_attr); pthread_attr_setdetachstate(&worker_attr, PTHREAD_CREATE_DETACHED); pthread_t worker_thread; socklen_t sinSizeClient = sizeof(struct sockaddr_in); /*the accept loop*/ while(1){ if((clientSocket = accept(socket, (struct sockaddr *) &clientAddr, &sinSizeClient)) < 0){ perror("ERROR: Could not accept client"); continue; } /*resolve the clients host name*/ bstring clientHostName = safe_BfromCstr(""); int rc = getnameinfo((struct sockaddr *) &clientAddr, sinSizeClient, charBuffromBstr(clientHostName), IRC_MAX_LEN+1, NULL, 0, 0); clientHostName->slen = strlen(charBuffromBstr(clientHostName)); if (rc != 0 || !clientHostName->slen){ bdestroy(clientHostName); clientHostName = safe_BfromCstr("unresolved"); } /*init the client*/ cli *newClient = initClient(clientSocket, clientHostName, server); /*create thread to wait for the client to register and then handle client request*/ if (pthread_create(&worker_thread, &worker_attr, &enterRegister, newClient) != 0){ clientFree(newClient); close(socket); errnoExit("ERROR: Could not create thread"); } } /*free server*/ serverFree(server); }