Exemple #1
0
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);

}
Exemple #2
0
void			ft_del_bad_path(t_hall **hall)
{
    t_hall		*tmp;

    tmp = *hall;
    while (tmp->stat != 1)
        tmp = tmp->next;
    change_room(&tmp);
}
Exemple #3
0
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();

}
Exemple #4
0
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);
}
Exemple #5
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);
}
Exemple #6
0
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);
}