/** * Handle enter key being pressed in the servers list. * @param list * The servers list. */ static void list_handle_enter(list_struct *list, SDL_Event *event) { /* Servers list? */ if (list == list_servers) { char number[16]; uint32_t version, i; size_t pos; /* Get selected server. */ selected_server = server_get_id(list->row_selected - 1); if (selected_server == NULL) { return; } for (pos = 0, i = 0, version = 0; string_get_word(selected_server->version, &pos, '.', number, sizeof(number), 0); i++) { version += atoi(number) << (i * CHAR_BIT); } if (version != 0 && version < SERVER_VERSION) { draw_info(COLOR_RED, "The server is outdated; " "choose a different one."); return; } login_start(); } else if (list == list_news) { if (list->text && list->text[list->row_selected - 1]) { game_news_open(list->text[list->row_selected - 1][0]); } } }
static void cmnd_exec_login(struct connection *conn) { struct iscsi_login_req_hdr *req = (struct iscsi_login_req_hdr *)&conn->req.bhs; struct iscsi_login_rsp_hdr *rsp = (struct iscsi_login_rsp_hdr *)&conn->rsp.bhs; int stay = 0, nsg_disagree = 0; memset(rsp, 0, BHS_SIZE); if ((req->opcode & ISCSI_OPCODE_MASK) != ISCSI_OP_LOGIN_CMD || !(req->opcode & ISCSI_OP_IMMEDIATE)) { //reject } rsp->opcode = ISCSI_OP_LOGIN_RSP; rsp->max_version = ISCSI_VERSION; rsp->active_version = ISCSI_VERSION; rsp->itt = req->itt; if (/*req->max_version < ISCSI_VERSION ||*/ req->min_version > ISCSI_VERSION) { rsp->status_class = ISCSI_STATUS_INITIATOR_ERR; rsp->status_detail = ISCSI_STATUS_NO_VERSION; conn->state = STATE_EXIT; return; } switch (req->flags & ISCSI_FLG_CSG_MASK) { case ISCSI_FLG_CSG_SECURITY: log_debug(1, "Login request (security negotiation): %d", conn->state); rsp->flags = ISCSI_FLG_CSG_SECURITY; switch (conn->state) { case STATE_FREE: conn->state = STATE_SECURITY; login_start(conn); if (rsp->status_class) return; //else fall through case STATE_SECURITY: text_scan_security(conn); if (rsp->status_class) return; if (conn->auth_method != AUTH_NONE) { conn->state = STATE_SECURITY_AUTH; conn->auth_state = AUTH_STATE_START; } break; case STATE_SECURITY_AUTH: switch (cmnd_exec_auth(conn)) { case 0: break; default: case -1: goto init_err; case -2: goto auth_err; } break; default: goto init_err; } break; case ISCSI_FLG_CSG_LOGIN: log_debug(1, "Login request (operational negotiation): %d", conn->state); rsp->flags = ISCSI_FLG_CSG_LOGIN; switch (conn->state) { case STATE_FREE: conn->state = STATE_LOGIN; login_start(conn); if (!account_empty(conn->tid, AUTH_DIR_INCOMING)) goto auth_err; if (rsp->status_class) return; text_scan_login(conn); if (rsp->status_class) return; stay = text_check_param(conn); break; case STATE_LOGIN: text_scan_login(conn); if (rsp->status_class) return; stay = text_check_param(conn); break; default: goto init_err; } break; default: goto init_err; } if (rsp->status_class) return; if (conn->state != STATE_SECURITY_AUTH && req->flags & ISCSI_FLG_TRANSIT) { int nsg = req->flags & ISCSI_FLG_NSG_MASK; switch (nsg) { case ISCSI_FLG_NSG_LOGIN: switch (conn->state) { case STATE_SECURITY: case STATE_SECURITY_DONE: conn->state = STATE_SECURITY_LOGIN; login_security_done(conn); break; default: goto init_err; } break; case ISCSI_FLG_NSG_FULL_FEATURE: switch (conn->state) { case STATE_SECURITY: case STATE_SECURITY_DONE: if ((nsg_disagree = text_check_param(conn))) { conn->state = STATE_LOGIN; nsg = ISCSI_FLG_NSG_LOGIN; break; } conn->state = STATE_SECURITY_FULL; login_security_done(conn); break; case STATE_LOGIN: if (stay) nsg = ISCSI_FLG_NSG_LOGIN; else conn->state = STATE_LOGIN_FULL; break; default: goto init_err; } if (!stay && !nsg_disagree) { text_check_param(conn); login_finish(conn); } break; default: goto init_err; } rsp->flags |= nsg | (stay ? 0 : ISCSI_FLG_TRANSIT); } rsp->sid = conn->sid; rsp->stat_sn = cpu_to_be32(conn->stat_sn++); rsp->exp_cmd_sn = cpu_to_be32(conn->exp_cmd_sn); conn->max_cmd_sn = conn->exp_cmd_sn + 1; rsp->max_cmd_sn = cpu_to_be32(conn->max_cmd_sn); return; init_err: rsp->flags = 0; rsp->status_class = ISCSI_STATUS_INITIATOR_ERR; rsp->status_detail = ISCSI_STATUS_INIT_ERR; conn->state = STATE_EXIT; return; auth_err: rsp->flags = 0; rsp->status_class = ISCSI_STATUS_INITIATOR_ERR; rsp->status_detail = ISCSI_STATUS_AUTH_FAILED; conn->state = STATE_EXIT; return; }