MbClientHandle mb_client_register_source(int id, int pages) { mbclient* client = get_client_by_id(id); if (client == NULL) { client = malloc(sizeof(mbclient)); if (client == NULL) { return NULL; } memset(&(client->sock), 0, sizeof(struct sockaddr_un)); client->id = id; client->pages = pages; client->source_pages = pages < 0 ? 0 : pages; client->fd = 0; client->is_bidi = 1; if (client_register(client) < 0) { free(client); return NULL; } else { client->next = mb_default_client.next; mb_default_client.next = client; } } else { if (!(client->is_bidi != 1) || client->source_pages != (unsigned int)pages) client = NULL; } return client; }
MbClientHandle mb_client_register(int id, int is_bidi) { mbclient* client = get_client_by_id(id); if (client == NULL) { client = malloc(sizeof(mbclient)); if (client == NULL) { return NULL; } memset(&(client->sock), 0, sizeof(struct sockaddr_un)); client->id = id; client->pages = 0; client->source_pages = 0; client->fd = 0; client->is_bidi = is_bidi ? 1 : 0; if (client_register(client) < 0) { free (client); return NULL; } else { client->next = mb_default_client.next; mb_default_client.next = client; } } else { if (client->is_bidi != is_bidi) client = NULL; } return client; }
int server_process_packet(struct sockaddr_in *from) { unsigned int from_address = ntohl(from->sin_addr.s_addr); unsigned short from_port = ntohs(from->sin_port); char *inet_addr = inet_ntoa(from->sin_addr); if (packet_data[0] == C_HANDSHAKE) { std::cerr << "client @ " << inet_addr << ":" << from_port << " :handshake request\n"; int newclient_id = server_add_client(from); if (newclient_id < 0) { std::cerr << "server_add_client: error.\n"; return -1; } interm_buf[0] = S_HANDSHAKE_OK; interm_buf[1] = newclient_id; interm_buf[2] = 0; struct client *newclient = get_client_by_id(newclient_id); server_send_packet(interm_buf, 2, newclient); server_post_peer_list(); } else if (packet_data[0] == C_QUIT) { unsigned short id = packet_data[1]; struct client *quitting_client = get_client_by_id(id); if (quitting_client) { std::cerr << "Client " << quitting_client->name << " with id " << quitting_client->id << " quitting.\n"; server_remove_client(id); } else { std::cerr << "client with id " << id << "not found.\n"; } } else if (packet_data[0] == C_KEYSTATE) { unsigned short id = packet_data[1]; client *c = get_client_by_id(id); if (c) { c->keystate = packet_data[2]; server_update_client_status(c); server_post_position_update(c); } } else { return 0; } }