/*========================================== * timerFunction * Chk the connection to char server, (if it down) *------------------------------------------*/ static int check_connect_char_server(int tid, unsigned int tick, int id, intptr_t data) { static int displayed = 0; if ( char_fd <= 0 || session[char_fd] == NULL ) { if ( !displayed ) { ShowStatus("Attempting to connect to Char Server. Please wait.\n"); displayed = 1; } chrif_state = 0; char_fd = make_connection(char_ip, char_port,false); if (char_fd == -1)//Attempt to connect later. [Skotlex] return 0; session[char_fd]->func_parse = chrif_parse; session[char_fd]->flag.server = 1; realloc_fifo(char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); chrif_connect(char_fd); chrif_connected = (chrif_state == 2); srvinfo = 0; } else { if (srvinfo == 0) { chrif_ragsrvinfo(battle_config.base_exp_rate, battle_config.job_exp_rate, battle_config.item_rate_common); srvinfo = 1; } } if ( chrif_isconnected() ) displayed = 0; return 0; }
int chlogif_check_connect_logserver(int tid, unsigned int tick, int id, intptr_t data) { if (login_fd > 0 && session[login_fd] != NULL) return 0; ShowInfo("Attempt to connect to login-server...\n"); login_fd = make_connection(charserv_config.login_ip, charserv_config.login_port, false,10); if (login_fd == -1) { //Try again later. [Skotlex] login_fd = 0; return 0; } session[login_fd]->func_parse = chlogif_parse; session[login_fd]->flag.server = 1; realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); WFIFOHEAD(login_fd,86); WFIFOW(login_fd,0) = 0x2710; memcpy(WFIFOP(login_fd,2), charserv_config.userid, 24); memcpy(WFIFOP(login_fd,26), charserv_config.passwd, 24); WFIFOL(login_fd,50) = 0; WFIFOL(login_fd,54) = htonl(charserv_config.char_ip); WFIFOW(login_fd,58) = htons(charserv_config.char_port); memcpy(WFIFOP(login_fd,60), charserv_config.server_name, 20); WFIFOW(login_fd,80) = 0; WFIFOW(login_fd,82) = charserv_config.char_maintenance; WFIFOW(login_fd,84) = charserv_config.char_new_display; //only display (New) if they want to [Kevin] WFIFOSET(login_fd,86); return 1; }
void WFIFOSET(int fd, size_t len) { std::unique_ptr<socket_data>& s = session[fd]; if (s->wdata_size + len + 16384 > s->max_wdata) { realloc_fifo(fd, s->max_rdata, s->max_wdata << 1); PRINTF("socket: %d wdata expanded to %zu bytes.\n", fd, s->max_wdata); } if (s->wdata_size + len + 2048 < s->max_wdata) s->wdata_size += len; else FPRINTF(stderr, "socket: %d wdata lost !!\n", fd), abort(); }
/*========================================== * timer�� * char�I�Ƃ̐ڑ����m�F���A������Ă�����ēx�ڑ����� *------------------------------------------*/ static int check_connect_char_server(int tid, unsigned int tick, int id, intptr_t data) { static int displayed = 0; if (char_fd <= 0 || session[char_fd] == NULL) { if (!displayed) { ShowStatus("Estabelecendo conexao com o servidor de personagens. Por favor aguarde.\n"); displayed = 1; } chrif_state = 0; char_fd = make_connection(char_ip, char_port); if (char_fd == -1) { //Attempt to connect later. [Skotlex] return 0; } session[char_fd]->func_parse = chrif_parse; session[char_fd]->flag.server = 1; realloc_fifo(char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); chrif_connect(char_fd); chrif_connected = (chrif_state == 2); #ifndef TXT_ONLY srvinfo = 0; #endif /* not TXT_ONLY */ } else { #ifndef TXT_ONLY if (srvinfo == 0) { chrif_ragsrvinfo(battle_config.base_exp_rate, battle_config.job_exp_rate, battle_config.item_rate_common); srvinfo = 1; } #endif /* not TXT_ONLY */ } if (chrif_isconnected()) displayed = 0; return 0; }
/** * Char-server request to connect to the login-server. * This is needed to exchange packets. * @param fd: file descriptor to parse from (client) * @param sd: client session * @param ip: ipv4 address (client) * @return 0 packet received too shirt, 1 success */ static int logclif_parse_reqcharconnec(int fd, struct login_session_data *sd, char* ip){ if (RFIFOREST(fd) < 86) return 0; else { int result; char server_name[20]; char message[256]; uint32 server_ip; uint16 server_port; uint16 type; uint16 new_; safestrncpy(sd->userid, RFIFOCP(fd,2), NAME_LENGTH); safestrncpy(sd->passwd, RFIFOCP(fd,26), NAME_LENGTH); if( login_config.use_md5_passwds ) MD5_String(sd->passwd, sd->passwd); sd->passwdenc = 0; server_ip = ntohl(RFIFOL(fd,54)); server_port = ntohs(RFIFOW(fd,58)); safestrncpy(server_name, RFIFOCP(fd,60), 20); type = RFIFOW(fd,82); new_ = RFIFOW(fd,84); RFIFOSKIP(fd,86); ShowInfo("Connection request of the char-server '%s' @ %u.%u.%u.%u:%u (account: '%s', ip: '%s')\n", server_name, CONVIP(server_ip), server_port, sd->userid, ip); sprintf(message, "charserver - %s@%u.%u.%u.%u:%u", server_name, CONVIP(server_ip), server_port); login_log(session[fd]->client_addr, sd->userid, 100, message); result = login_mmo_auth(sd, true); if( runflag == LOGINSERVER_ST_RUNNING && result == -1 && sd->sex == 'S' && sd->account_id < ARRAYLENGTH(ch_server) && !session_isValid(ch_server[sd->account_id].fd) ) { ShowStatus("Connection of the char-server '%s' accepted.\n", server_name); safestrncpy(ch_server[sd->account_id].name, server_name, sizeof(ch_server[sd->account_id].name)); ch_server[sd->account_id].fd = fd; ch_server[sd->account_id].ip = server_ip; ch_server[sd->account_id].port = server_port; ch_server[sd->account_id].users = 0; ch_server[sd->account_id].type = type; ch_server[sd->account_id].new_ = new_; session[fd]->func_parse = logchrif_parse; session[fd]->flag.server = 1; realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); // send connection success WFIFOHEAD(fd,3); WFIFOW(fd,0) = 0x2711; WFIFOB(fd,2) = 0; WFIFOSET(fd,3); } else { ShowNotice("Connection of the char-server '%s' REFUSED.\n", server_name); WFIFOHEAD(fd,3); WFIFOW(fd,0) = 0x2711; WFIFOB(fd,2) = 3; WFIFOSET(fd,3); } } return 1; }