void logout_user(char * name) { char *lname = strdup(name); int i; repository_lock(); change_room(name, ""); GLOBAL_REPO->rooms[0].clients--; repository_client_remove(name); local_client_remove(name); for (i = 0; i < GLOBAL_REPO->active_servers; i++) { if (GLOBAL_REPO->servers[i].server_msgid == SERVER_DESC.server_msgid) { GLOBAL_REPO->servers[i].clients--; break; } } SERVER_DESC.clients--; repository_unlock(); log_write("LOGGED_OUT@%d: %s\n", SERVER_DESC.server_msgid, lname); }
void ft_del_bad_path(t_hall **hall) { t_hall *tmp; tmp = *hall; while (tmp->stat != 1) tmp = tmp->next; change_room(&tmp); }
void handle_change_room(const void * req) { CHANGE_ROOM_REQUEST* crr = (CHANGE_ROOM_REQUEST*) req; repository_lock(); change_room(crr->client_name, crr->room_name); response_status(crr->client_msgid, 202); repository_unlock(); }
void handle_room_action(void* received, int msg_type){ MSG_ROOM temp = *(MSG_ROOM*)(received); MSG_RESPONSE response; response.type = RESPONSE; int client_id = get_user_id(temp.user_name); switch (temp.operation_type) { case ENTER_ROOM: if ( change_room(temp, client_id) == FULL ) { response.response_type = ENTERED_ROOM_FAILED; strcpy(response.content, "No space for new channel\n"); } else { response.response_type = ENTERED_ROOM_SUCCESS; strcpy(response.content, "Channel successfuly entered!\n"); } break; case LEAVE_ROOM: strcpy(temp.room_name, ""); if ( change_room(temp, client_id) == FULL ) { response.response_type = LEAVE_ROOM_FAILED; strcpy(response.content, "No space for new channel\n"); } else { response.response_type = LEAVE_ROOM_SUCCESS; strcpy(response.content, "Channel successfuly left!\n"); } break; case CHANGE_ROOM: if ( change_room(temp, client_id) == FULL ) { response.response_type = CHANGE_ROOM_FAILED; strcpy(response.content, "No space for new channel\n"); } else { response.response_type = CHANGE_ROOM_SUCCESS; strcpy(response.content, "Channel successfuly changed!\n"); } break; } msgsnd(client_id, &response, _size(MSG_RESPONSE), 0); }
static void change_room(t_hall **link) { t_map *map2; t_map *map; map = (*link)->map; map2 = (*link)->map; while (map) { if (map->link->nbr_move < map2->link->nbr_move) map2 = map; map = map->next; } del_other_path(&((*link)->map), &map2); (*link)->map = map2; if ((*link)->map->link) *link = (*link)->map->link; if ((*link)->stat != 2) change_room(link); }
void handle_login(const void * req) { CLIENT_REQUEST * cr = (CLIENT_REQUEST*) req; int i; int ok = 1; repository_lock(); if (strlen(cr->client_name) >= MAX_NAME_SIZE) { response_status(cr->client_msgid, 400); ok = 0; } if (ok) for (i = 0; i < strlen(cr->client_name); i++) { if (!isprint(cr->client_name[i])) { response_status(cr->client_msgid, 400); ok = 0; break; } } if (ok && SERVER_DESC.clients >= SERVER_CAPACITY) { response_status(cr->client_msgid, 503); ok = 0; } if (ok) for (i = 0; i < GLOBAL_REPO->active_clients; i++) { if (strcmp(GLOBAL_REPO->clients[i].name, cr->client_name) == 0) { response_status(cr->client_msgid, 409); ok = 0; break; } } if (ok) { CLIENT desc; strcpy(desc.name, cr->client_name); desc.server_id = SERVER_DESC.server_msgid; repository_client_add(desc); local_client_add(desc, cr->client_msgid); SERVER_DESC.clients++; for (i = 0; i < GLOBAL_REPO->active_servers; i++) { if (GLOBAL_REPO->servers[i].server_msgid == SERVER_DESC.server_msgid) { GLOBAL_REPO->servers[i].clients++; break; } } change_room(desc.name, ""); response_status(cr->client_msgid, 201); } repository_unlock(); if (ok) log_write("LOGGED_IN@%d: %s\n", SERVER_DESC.server_msgid, cr->client_name); }