diff options
author | ultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2007-05-21 18:40:29 +0000 |
---|---|---|
committer | ultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2007-05-21 18:40:29 +0000 |
commit | 6f3bd3a74c8a9e983f3a5748ecaaa729ebeb1c3e (patch) | |
tree | a19adfa1a31ad5a5b6777cfcff2d12b7f9990723 /src/login_sql/login.c | |
parent | da8099a53f9edd008d3b9b9a206367728b6a94b4 (diff) | |
download | hercules-6f3bd3a74c8a9e983f3a5748ecaaa729ebeb1c3e.tar.gz hercules-6f3bd3a74c8a9e983f3a5748ecaaa729ebeb1c3e.tar.bz2 hercules-6f3bd3a74c8a9e983f3a5748ecaaa729ebeb1c3e.tar.xz hercules-6f3bd3a74c8a9e983f3a5748ecaaa729ebeb1c3e.zip |
- Removed the TURBO socket mechanism - it was in fact just using a variable to cache a few arithmetic operations (premature optimization)
- Since the fifohead mess is gone, fixed leftover bad code structuring
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@10599 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/login_sql/login.c')
-rw-r--r-- | src/login_sql/login.c | 330 |
1 files changed, 171 insertions, 159 deletions
diff --git a/src/login_sql/login.c b/src/login_sql/login.c index bad4c8731..a24a9ed80 100644 --- a/src/login_sql/login.c +++ b/src/login_sql/login.c @@ -225,13 +225,13 @@ void read_gm_account(void) } //----------------------------------------------------- -// Send GM accounts to all char-server +// Send GM accounts to one or all char-servers //----------------------------------------------------- void send_GM_accounts(int fd) { unsigned int i; - unsigned char buf[32767]; - int len; + uint8 buf[32767]; + uint16 len; if(!login_config.login_gm_read) return; @@ -242,7 +242,7 @@ void send_GM_accounts(int fd) // send only existing accounts. We can not create a GM account when server is online. if (gm_account_db[i].level > 0) { WBUFL(buf,len) = gm_account_db[i].account_id; - WBUFB(buf,len+4) = (unsigned char)gm_account_db[i].level; + WBUFB(buf,len+4) = (uint8)gm_account_db[i].level; len += 5; if (len >= 32000) { ShowWarning("send_GM_accounts: Too many accounts! Only %d out of %d were sent.\n", i, GM_num); @@ -251,14 +251,14 @@ void send_GM_accounts(int fd) } WBUFW(buf,2) = len; - if (fd == -1) + if (fd == -1) // send to all charservers charif_sendallwos(-1, buf, len); - else - { + else { // send only to target WFIFOHEAD(fd,len); memcpy(WFIFOP(fd,0), buf, len); WFIFOSET(fd,len); } + return; } @@ -455,6 +455,7 @@ int mmo_auth_new(struct mmo_account* account, char sex) return 0; } + //-------------------------------------------------------------------- // Packet send to all char-servers, except one (wos: without our self) //-------------------------------------------------------------------- @@ -465,8 +466,6 @@ int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len) for(i = 0, c = 0; i < MAX_SERVERS; i++) { if ((fd = server_fd[i]) > 0 && fd != sfd) { WFIFOHEAD(fd,len); - if (WFIFOSPACE(fd) < len) //Increase buffer size. - realloc_writefifo(fd, len); memcpy(WFIFOP(fd,0), buf, len); WFIFOSET(fd,len); c++; @@ -727,9 +726,6 @@ int parse_fromchar(int fd) uint32 ipl = session[fd]->client_addr; char ip[16]; - RFIFOHEAD(fd); - - ip2str(ipl, ip); for(id = 0; id < MAX_SERVERS; id++) if (server_fd[id] == fd) @@ -740,6 +736,8 @@ int parse_fromchar(int fd) return 0; } + ip2str(ipl, ip); + if(session[fd]->eof) { ShowStatus("Char-server '%s' has disconnected.\n", server[id].name); server_fd[id] = -1; @@ -774,14 +772,13 @@ int parse_fromchar(int fd) // send GM accounts to all char-servers send_GM_accounts(-1); RFIFOSKIP(fd,2); - break; + break; case 0x2712: // request from char-server to authenticate an account if (RFIFOREST(fd) < 19) return 0; { int account_id; - WFIFOHEAD(fd,51); account_id = RFIFOL(fd,2); // speed up for(i = 0; i < AUTH_FIFO_SIZE; i++) { if( auth_fifo[i].account_id == account_id && @@ -812,6 +809,7 @@ int parse_fromchar(int fd) strncpy(email, sql_row[0], 40); email[39] = 0; mysql_free_result(sql_res); } + WFIFOHEAD(fd,51); WFIFOW(fd,0) = 0x2713; WFIFOL(fd,2) = account_id; WFIFOB(fd,6) = 0; @@ -819,19 +817,21 @@ int parse_fromchar(int fd) WFIFOL(fd,47) = (unsigned long) connect_until_time; WFIFOSET(fd,51); } else { + WFIFOHEAD(fd,51); WFIFOW(fd,0) = 0x2713; WFIFOL(fd,2) = account_id; WFIFOB(fd,6) = 1; WFIFOSET(fd,51); } - } + RFIFOSKIP(fd,19); - break; - + } + break; case 0x2714: if (RFIFOREST(fd) < 6) return 0; + // how many users on world? (update) if (server[id].users != RFIFOL(fd,2)) { @@ -845,13 +845,13 @@ int parse_fromchar(int fd) ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); } } - { // send some answer + // send some answer WFIFOHEAD(fd,6); WFIFOW(fd,0) = 0x2718; WFIFOSET(fd,2); - } + RFIFOSKIP(fd,6); - break; + break; case 0x2716: // received an e-mail/limited time request, because a player comes back from a map-server to the char-server if (RFIFOREST(fd) < 6) @@ -860,8 +860,7 @@ int parse_fromchar(int fd) int account_id; time_t connect_until_time = 0; char email[40] = ""; - WFIFOHEAD(fd,50); - account_id=RFIFOL(fd,2); + account_id = RFIFOL(fd,2); sprintf(tmpsql,"SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'",login_db, login_db_account_id, account_id); if(mysql_query(&mysql_handle, tmpsql)) { ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); @@ -875,14 +874,16 @@ int parse_fromchar(int fd) } mysql_free_result(sql_res); //printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2)); + WFIFOHEAD(fd,50); WFIFOW(fd,0) = 0x2717; WFIFOL(fd,2) = RFIFOL(fd,2); memcpy(WFIFOP(fd, 6), email, 40); WFIFOL(fd,46) = (unsigned long) connect_until_time; WFIFOSET(fd,50); - } + RFIFOSKIP(fd,6); - break; + } + break; case 0x2720: // Request to become a GM (TXT only!) if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) @@ -891,14 +892,13 @@ int parse_fromchar(int fd) ShowWarning("change GM isn't supported in this login server version.\n"); ShowError("change GM error 0 %s\n", RFIFOP(fd, 8)); - RFIFOSKIP(fd, RFIFOW(fd, 2)); - { WFIFOHEAD(fd,10); WFIFOW(fd,0) = 0x2721; WFIFOL(fd,2) = RFIFOL(fd,4); // oldacc; WFIFOL(fd,6) = 0; // newacc; WFIFOSET(fd,10); - } + + RFIFOSKIP(fd, RFIFOW(fd, 2)); return 0; // Map server send information to change an email of an account via char-server @@ -944,9 +944,10 @@ int parse_fromchar(int fd) } } + RFIFOSKIP(fd, 86); - break; } + break; case 0x2724: // Receiving of map-server via char-server a status change resquest if (RFIFOREST(fd) < 10) @@ -978,9 +979,10 @@ int parse_fromchar(int fd) ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); } + RFIFOSKIP(fd,10); - break; } + break; case 0x2725: // Receiving of map-server via char-server a ban resquest if (RFIFOREST(fd) < 18) @@ -1033,9 +1035,10 @@ int parse_fromchar(int fd) } } } + RFIFOSKIP(fd,18); - break; } + break; case 0x2727: // Change of sex (sex is reversed) if (RFIFOREST(fd) < 6) @@ -1043,7 +1046,7 @@ int parse_fromchar(int fd) { int acc,sex; unsigned char buf[16]; - acc=RFIFOL(fd,2); + acc = RFIFOL(fd,2); sprintf(tmpsql,"SELECT `sex` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc); if(mysql_query(&mysql_handle, tmpsql)) { @@ -1076,9 +1079,10 @@ int parse_fromchar(int fd) WBUFL(buf,2) = acc; WBUFB(buf,6) = sex; charif_sendallwos(-1, buf, 7); + RFIFOSKIP(fd,6); - break; } + break; case 0x2728: // save account_reg2 if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) @@ -1090,7 +1094,7 @@ int parse_fromchar(int fd) char temp_str2[512]; char value[256]; unsigned char *buf; - acc=RFIFOL(fd,4); + acc = RFIFOL(fd,4); buf = (unsigned char*)aCalloc(RFIFOW(fd,2)+1, sizeof(unsigned char)); //Delete all global account variables.... sprintf(tmpsql,"DELETE FROM `%s` WHERE `type`='1' AND `account_id`='%d';",reg_db,acc); @@ -1121,46 +1125,47 @@ int parse_fromchar(int fd) if (buf) aFree(buf); } RFIFOSKIP(fd,RFIFOW(fd,2)); - break; + break; case 0x272a: // Receiving of map-server via char-server a unban resquest if (RFIFOREST(fd) < 6) return 0; - { - int acc; - acc = RFIFOL(fd,2); - sprintf(tmpsql,"SELECT `ban_until` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc); + { + int acc; + acc = RFIFOL(fd,2); + sprintf(tmpsql,"SELECT `ban_until` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc); + if(mysql_query(&mysql_handle, tmpsql)) { + ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); + ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); + } + sql_res = mysql_store_result(&mysql_handle) ; + if (sql_res && mysql_num_rows(sql_res) > 0) { //Found a match + sprintf(tmpsql,"UPDATE `%s` SET `ban_until` = '0' WHERE `%s` = '%d'", login_db,login_db_account_id,acc); + //query if(mysql_query(&mysql_handle, tmpsql)) { ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res && mysql_num_rows(sql_res) > 0) { //Found a match - sprintf(tmpsql,"UPDATE `%s` SET `ban_until` = '0' WHERE `%s` = '%d'", login_db,login_db_account_id,acc); - //query - if(mysql_query(&mysql_handle, tmpsql)) { - ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); - } - } - if (sql_res) mysql_free_result(sql_res); - RFIFOSKIP(fd,6); } + if (sql_res) mysql_free_result(sql_res); + + RFIFOSKIP(fd,6); return 0; + } case 0x272b: // Set account_id to online [Wizputer] if (RFIFOREST(fd) < 6) return 0; add_online_user(id, RFIFOL(fd,2)); RFIFOSKIP(fd,6); - break; + break; case 0x272c: // Set account_id to offline [Wizputer] if (RFIFOREST(fd) < 6) return 0; remove_online_user(RFIFOL(fd,2)); RFIFOSKIP(fd,6); - break; + break; case 0x272d: // Receive list of all online accounts. [Skotlex] if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) @@ -1182,43 +1187,46 @@ int parse_fromchar(int fd) } } RFIFOSKIP(fd,RFIFOW(fd,2)); - break; + + break; case 0x272e: //Request account_reg2 for a character. if (RFIFOREST(fd) < 10) return 0; - { - int account_id = RFIFOL(fd, 2); - int char_id = RFIFOL(fd, 6); - int p; - WFIFOHEAD(fd,10000); - RFIFOSKIP(fd,10); - sprintf(tmpsql, "SELECT `str`,`value` FROM `%s` WHERE `type`='1' AND `account_id`='%d'",reg_db, account_id); - if (mysql_query(&mysql_handle, tmpsql)) { - ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); - break; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (!sql_res) { - break; - } - WFIFOW(fd,0) = 0x2729; - WFIFOL(fd,4) = account_id; - WFIFOL(fd,8) = char_id; - WFIFOB(fd,12) = 1; //Type 1 for Account2 registry - for(p = 13; (sql_row = mysql_fetch_row(sql_res)) && p < 9000;){ - if (sql_row[0][0]) { - p+= sprintf(WFIFOP(fd,p), "%s", sql_row[0])+1; //We add 1 to consider the '\0' in place. - p+= sprintf(WFIFOP(fd,p), "%s", sql_row[1])+1; - } + { + int account_id = RFIFOL(fd, 2); + int char_id = RFIFOL(fd, 6); + int p; + sprintf(tmpsql, "SELECT `str`,`value` FROM `%s` WHERE `type`='1' AND `account_id`='%d'",reg_db, account_id); + if (mysql_query(&mysql_handle, tmpsql)) { + ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); + ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); + break; + } + sql_res = mysql_store_result(&mysql_handle) ; + if (!sql_res) { + break; + } + WFIFOHEAD(fd,10000); + WFIFOW(fd,0) = 0x2729; + WFIFOL(fd,4) = account_id; + WFIFOL(fd,8) = char_id; + WFIFOB(fd,12) = 1; //Type 1 for Account2 registry + p = 13; + while ((sql_row = mysql_fetch_row(sql_res)) && p < 9000) { + if (sql_row[0][0]) { + p+= sprintf(WFIFOP(fd,p), "%s", sql_row[0])+1; //We add 1 to consider the '\0' in place. + p+= sprintf(WFIFOP(fd,p), "%s", sql_row[1])+1; } - if (p >= 9000) - ShowWarning("Too many account2 registries for AID %d. Some registries were not sent.\n", account_id); - WFIFOW(fd,2) = p; - WFIFOSET(fd,WFIFOW(fd,2)); - mysql_free_result(sql_res); } - break; + mysql_free_result(sql_res); + if (p >= 9000) + ShowWarning("Too many account2 registries for AID %d. Some registries were not sent.\n", account_id); + WFIFOW(fd,2) = p; + WFIFOSET(fd,WFIFOW(fd,2)); + + RFIFOSKIP(fd,10); + } + break; case 0x2736: // WAN IP update from char-server if (RFIFOREST(fd) < 6) @@ -1226,20 +1234,20 @@ int parse_fromchar(int fd) server[id].ip = ntohl(RFIFOL(fd,2)); ShowInfo("Updated IP of Server #%d to %d.%d.%d.%d.\n",id, CONVIP(server[id].ip)); RFIFOSKIP(fd,6); - break; + break; case 0x2737: //Request to set all offline. ShowInfo("Setting accounts from char-server %d offline.\n", id); online_db->foreach(online_db,online_db_setoffline,id); RFIFOSKIP(fd,2); - break; + break; default: ShowError("parse_fromchar: Unknown packet 0x%x from a char-server! Disconnecting!\n", RFIFOW(fd,0)); set_eof(fd); return 0; - } - } + } // switch + } // while RFIFOSKIP(fd,RFIFOREST(fd)); return 0; @@ -1311,12 +1319,9 @@ int parse_login(int fd) int result, i; uint32 ipl = session[fd]->client_addr; char ip[16]; - RFIFOHEAD(fd); ip2str(ipl, ip); - memset(&account, 0, sizeof(account)); - if (session[fd]->eof) { do_close(fd); return 0; @@ -1332,13 +1337,13 @@ int parse_login(int fd) if (RFIFOREST(fd) < 26) return 0; RFIFOSKIP(fd,26); - break; + break; case 0x0204: // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004) if (RFIFOREST(fd) < 18) return 0; RFIFOSKIP(fd,18); - break; + break; case 0x0064: // request client login case 0x0277: // New login packet (layout is same as 0x64 but different length) @@ -1367,6 +1372,7 @@ int parse_login(int fd) // S 0277 ?? // S 01dd <version>.l <account name>.24B <md5 binary>.16B <version2>.B + memset(&account, 0, sizeof(account)); account.version = RFIFOL(fd,2); if (!account.version) account.version = 1; //Force some version... memcpy(account.userid,RFIFOP(fd,6),NAME_LENGTH); account.userid[23] = '\0'; @@ -1382,7 +1388,6 @@ int parse_login(int fd) WFIFOB(fd,2) = 1; // 01 = Server closed WFIFOSET(fd,3); } else { - WFIFOHEAD(fd,47+32*MAX_SERVERS); if (login_config.log_login) { sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%u', '%s','100', 'login ok')", loginlog_db, ipl, t_uid); //query @@ -1397,6 +1402,7 @@ int parse_login(int fd) ShowStatus("Connection of the account '%s' accepted.\n", account.userid); server_num = 0; + WFIFOHEAD(fd,47+32*MAX_SERVERS); for(i = 0; i < MAX_SERVERS; i++) { if (server_fd[i] >= 0) { // Advanced subnet check [LuzZza] @@ -1436,7 +1442,6 @@ int parse_login(int fd) } } } else { // auth failed - WFIFOHEAD(fd,23); if (login_config.log_login) { const char* error; @@ -1519,6 +1524,7 @@ int parse_login(int fd) sql_row = sql_res?mysql_fetch_row(sql_res):NULL; //cannot connect login failed + WFIFOHEAD(fd,23); memset(WFIFOP(fd,0), '\0', 23); WFIFOW(fd,0) = 0x6a; WFIFOB(fd,2) = (uint8)result; @@ -1532,9 +1538,10 @@ int parse_login(int fd) if (sql_res) mysql_free_result(sql_res); } + RFIFOSKIP(fd,packet_len); - break; } + break; case 0x01db: // Sending request of the coding key { @@ -1554,87 +1561,91 @@ int parse_login(int fd) for(i = 0; i < ld->md5keylen; i++) ld->md5key[i] = (char)(1 + rand() % 255); - RFIFOSKIP(fd,2); WFIFOHEAD(fd,4 + ld->md5keylen); WFIFOW(fd,0) = 0x01dc; WFIFOW(fd,2) = 4 + ld->md5keylen; memcpy(WFIFOP(fd,4), ld->md5key, ld->md5keylen); WFIFOSET(fd,WFIFOW(fd,2)); + + RFIFOSKIP(fd,2); } break; case 0x2710: // Connection request of a char-server if (RFIFOREST(fd) < 86) return 0; + { + char* server_name; + uint32 server_ip; + uint16 server_port; + + memset(&account, 0, sizeof(account)); + memcpy(account.userid,RFIFOP(fd,2),NAME_LENGTH); account.userid[23] = '\0'; + memcpy(account.passwd,RFIFOP(fd,26),NAME_LENGTH); account.passwd[23] = '\0'; + account.passwdenc = 0; + server_name = (char*)RFIFOP(fd,60); server_name[20] = '\0'; + server_ip = ntohl(RFIFOL(fd,54)); + server_port = ntohs(RFIFOW(fd,58)); + ShowInfo("Connection request of the char-server '%s' @ %d.%d.%d.%d:%d (ip: %s)\n", + server_name, CONVIP(server_ip), server_port, ip); + jstrescapecpy(t_uid, server_name); + if (login_config.log_login) { - char* server_name; - uint32 server_ip; - uint16 server_port; - - WFIFOHEAD(fd,3); - memcpy(account.userid,RFIFOP(fd,2),NAME_LENGTH); account.userid[23] = '\0'; - memcpy(account.passwd,RFIFOP(fd,26),NAME_LENGTH); account.passwd[23] = '\0'; - account.passwdenc = 0; - server_name = (char*)RFIFOP(fd,60); server_name[20] = '\0'; - server_ip = ntohl(RFIFOL(fd,54)); - server_port = ntohs(RFIFOW(fd,58)); - ShowInfo("Connection request of the char-server '%s' @ %d.%d.%d.%d:%d (ip: %s)\n", - server_name, CONVIP(server_ip), server_port, ip); - jstrescapecpy(t_uid, server_name); - if (login_config.log_login) - { - char t_login[50]; - jstrescapecpy(t_login,account.userid); - sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%u', '%s@%s','100', 'charserver - %s@%u.%u.%u.%u:%d')", - loginlog_db, ipl, t_login, t_uid, t_uid, CONVIP(server_ip), server_port); + char t_login[50]; + jstrescapecpy(t_login,account.userid); + sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%u', '%s@%s','100', 'charserver - %s@%u.%u.%u.%u:%d')", + loginlog_db, ipl, t_login, t_uid, t_uid, CONVIP(server_ip), server_port); - //query - if(mysql_query(&mysql_handle, tmpsql)) { - ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); - } + //query + if(mysql_query(&mysql_handle, tmpsql)) { + ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); + ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); } + } - result = mmo_auth(&account, fd); - if (result == -1 && account.sex == 2 && account.account_id < MAX_SERVERS && server_fd[account.account_id] == -1) { - ShowStatus("Connection of the char-server '%s' accepted.\n", server_name); - memset(&server[account.account_id], 0, sizeof(struct mmo_char_server)); - server[account.account_id].ip = ntohl(RFIFOL(fd,54)); - server[account.account_id].port = ntohs(RFIFOW(fd,58)); - memcpy(server[account.account_id].name, server_name, 20); - server[account.account_id].users = 0; - server[account.account_id].maintenance = RFIFOW(fd,82); - server[account.account_id].new_ = RFIFOW(fd,84); - server_fd[account.account_id] = fd; - sprintf(tmpsql,"DELETE FROM `sstatus` WHERE `index`='%d'", account.account_id); - //query - if(mysql_query(&mysql_handle, tmpsql)) { - ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); - } - - sprintf(tmpsql,"INSERT INTO `sstatus`(`index`,`name`,`user`) VALUES ( '%d', '%s', '%d')", - account.account_id, t_uid,0); - //query - if(mysql_query(&mysql_handle, tmpsql)) { - ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); - ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); - } - WFIFOW(fd,0) = 0x2711; - WFIFOB(fd,2) = 0; - WFIFOSET(fd,3); - session[fd]->func_parse = parse_fromchar; - realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); - // send GM account to char-server - send_GM_accounts(fd); - } else { - WFIFOW(fd,0) = 0x2711; - WFIFOB(fd,2) = 3; - WFIFOSET(fd,3); + result = mmo_auth(&account, fd); + if (result == -1 && account.sex == 2 && account.account_id < MAX_SERVERS && server_fd[account.account_id] == -1) { + ShowStatus("Connection of the char-server '%s' accepted.\n", server_name); + memset(&server[account.account_id], 0, sizeof(struct mmo_char_server)); + server[account.account_id].ip = ntohl(RFIFOL(fd,54)); + server[account.account_id].port = ntohs(RFIFOW(fd,58)); + memcpy(server[account.account_id].name, server_name, 20); + server[account.account_id].users = 0; + server[account.account_id].maintenance = RFIFOW(fd,82); + server[account.account_id].new_ = RFIFOW(fd,84); + server_fd[account.account_id] = fd; + sprintf(tmpsql,"DELETE FROM `sstatus` WHERE `index`='%d'", account.account_id); + //query + if(mysql_query(&mysql_handle, tmpsql)) { + ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); + ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); + } + + sprintf(tmpsql,"INSERT INTO `sstatus`(`index`,`name`,`user`) VALUES ( '%d', '%s', '%d')", + account.account_id, t_uid,0); + //query + if(mysql_query(&mysql_handle, tmpsql)) { + ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); + ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmpsql); } + WFIFOHEAD(fd,3); + WFIFOW(fd,0) = 0x2711; + WFIFOB(fd,2) = 0; + WFIFOSET(fd,3); + session[fd]->func_parse = parse_fromchar; + realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); + + send_GM_accounts(fd); // send GM account to char-server + } else { + WFIFOHEAD(fd,3); + WFIFOW(fd,0) = 0x2711; + WFIFOB(fd,2) = 3; + WFIFOSET(fd,3); } + RFIFOSKIP(fd,86); return 0; + } case 0x7530: // Server version information request { @@ -1649,14 +1660,15 @@ int parse_login(int fd) WFIFOB(fd,7) = ATHENA_SERVER_LOGIN; WFIFOW(fd,8) = ATHENA_MOD_VERSION; WFIFOSET(fd,10); + RFIFOSKIP(fd,2); - break; } + break; case 0x7532: // Request to end connection ShowStatus ("End of connection (ip: %s)" RETCODE, ip); set_eof(fd); - break; + break; default: ShowStatus ("Abnormal end of connection (ip: %s): Unknown packet 0x%x " RETCODE, ip, RFIFOW(fd,0)); |