summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavioJS <FlavioJS@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-05-09 03:18:16 +0000
committerFlavioJS <FlavioJS@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-05-09 03:18:16 +0000
commit290fb53feea76f9749e4630ec71552e41afa59de (patch)
tree9caf07f59c86716b5f4105d22b3cb65e89386cf2
parent89b8b179b6864e5ce5d8b22a52feac761f66e77c (diff)
downloadhercules-290fb53feea76f9749e4630ec71552e41afa59de.tar.gz
hercules-290fb53feea76f9749e4630ec71552e41afa59de.tar.bz2
hercules-290fb53feea76f9749e4630ec71552e41afa59de.tar.xz
hercules-290fb53feea76f9749e4630ec71552e41afa59de.zip
* Added Buuyo-Tama's shortlist for send/eof sockets (defined out for now).
* Replaced toupper/tolower in ladmin by TOUPPER/TOLOWER defines. Shortlist: It's a list of sockets that have data to send and/or are ready for eof processing. It aims to reduce the amount of time spent on do_sendrecv, where it was spending ~13.5% of execution time on a server with 1k users at WoE. thanks to Buuyo-tama for the profile info and code git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@10506 54d463be-8e91-2dee-dedb-b68131a5f0ec
-rw-r--r--Changelog-Trunk.txt3
-rw-r--r--src/char/char.c50
-rw-r--r--src/char_sql/char.c40
-rw-r--r--src/common/socket.c111
-rw-r--r--src/common/socket.h22
-rw-r--r--src/ladmin/ladmin.c44
-rw-r--r--src/login/login.c30
-rw-r--r--src/login_sql/login.c26
-rw-r--r--src/map/chrif.c18
-rw-r--r--src/map/clif.c22
-rw-r--r--src/map/irc.c12
11 files changed, 254 insertions, 124 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 15dfb9e0f..131426683 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -3,6 +3,9 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
+2007/05/10
+ * Added Buuyo-Tama's shortlist for send/eof sockets (defined out for now).
+ * Replaced toupper/tolower in ladmin by TOUPPER/TOLOWER defines. [FlavioJS]
2007/05/07
* Fixed warpwaitingpc not working (bug introduced in r10471). [FlavioJS]
* Added a check to login_sql against too long db-stored emails [ultramage]
diff --git a/src/char/char.c b/src/char/char.c
index c4fc8dfda..c5ef5ce36 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -1,24 +1,6 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
-#include <sys/types.h>
-
-#ifdef _WIN32
-#include <winsock2.h>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-
-#include <time.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-
#include "../common/cbasetypes.h"
#include "../common/strlib.h"
#include "../common/core.h"
@@ -31,7 +13,6 @@
#include "../common/showmsg.h"
#include "../common/malloc.h"
-#include "char.h"
#include "inter.h"
#include "int_pet.h"
#include "int_homun.h"
@@ -41,6 +22,25 @@
#ifdef ENABLE_SC_SAVING
#include "int_status.h"
#endif
+#include "char.h"
+
+#include <sys/types.h>
+
+#ifdef WIN32
+#include <winsock2.h>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+#include <time.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
#ifndef TXT_SQL_CONVERT
struct mmo_map_server{
@@ -1952,7 +1952,7 @@ int parse_tologin(int fd) {
// only login-server can have an access to here.
// so, if it isn't the login-server, we disconnect the session (fd != login_fd).
if (fd != login_fd)
- session[fd]->eof = 1;
+ set_eof(fd);
if(session[fd]->eof) {
if (fd == login_fd) {
ShowWarning("Connection to login-server lost (connection #%d).\n", fd);
@@ -2455,7 +2455,7 @@ int parse_tologin(int fd) {
}
default:
ShowWarning("Unknown packet 0x%04x received from login-server, disconnecting.\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
}
@@ -2664,7 +2664,7 @@ int parse_frommap(int fd)
if (server_fd[id] == fd)
break;
if(id==MAX_MAP_SERVERS)
- session[fd]->eof=1;
+ set_eof(fd);
if(session[fd]->eof){
if (id < MAX_MAP_SERVERS) {
unsigned char buf[16384];
@@ -3241,7 +3241,7 @@ int parse_frommap(int fd)
}
// inter server処理でもない場合は切断
ShowError("Unknown packet 0x%04x from map server, disconnecting.\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
}
@@ -3307,7 +3307,7 @@ int parse_char(int fd)
sd = (struct char_session_data*)session[fd]->session_data;
if(login_fd < 0)
- session[fd]->eof = 1;
+ set_eof(fd);
if(session[fd]->eof) { // disconnect any player (already connected to char-server or coming back from map-server) if login-server is diconnected.
if (fd == login_fd)
login_fd = -1;
@@ -3755,7 +3755,7 @@ int parse_char(int fd)
}
case 0x7532: // disconnect(default also disconnect)
default:
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
}
diff --git a/src/char_sql/char.c b/src/char_sql/char.c
index 6be0d3ece..ff6dcb293 100644
--- a/src/char_sql/char.c
+++ b/src/char_sql/char.c
@@ -1,9 +1,22 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
+#include "../common/cbasetypes.h"
+#include "../common/utils.h"
+#include "../common/strlib.h"
+#include "../common/showmsg.h"
+#include "../common/db.h"
+#include "../common/malloc.h"
+
+#include "itemdb.h"
+#include "inter.h"
+#include "int_guild.h"
+#include "int_homun.h"
+#include "char.h"
+
#include <sys/types.h>
-#ifdef _WIN32
+#ifdef WIN32
#include <winsock2.h>
#else
#include <sys/socket.h>
@@ -19,19 +32,6 @@
#include <stdio.h>
#include <stdlib.h>
-#include "../common/cbasetypes.h"
-#include "../common/utils.h"
-#include "../common/strlib.h"
-#include "../common/showmsg.h"
-#include "../common/db.h"
-#include "../common/malloc.h"
-
-#include "itemdb.h"
-#include "inter.h"
-#include "int_guild.h"
-#include "int_homun.h"
-#include "char.h"
-
#ifndef TXT_SQL_CONVERT
static struct dbt *char_db_;
#endif
@@ -1853,7 +1853,7 @@ int parse_tologin(int fd) {
// so, if it isn't the login-server, we disconnect the session.
//session eof check!
if(fd != login_fd)
- session[fd]->eof = 1;
+ set_eof(fd);
if(session[fd]->eof) {
if (fd == login_fd) {
ShowWarning("Connection to login-server lost (connection #%d).\n", fd);
@@ -2261,7 +2261,7 @@ int parse_tologin(int fd) {
}
default:
ShowError("Unknown packet 0x%04x from login server, disconnecting.\n", RFIFOW(fd, 0));
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
}
@@ -2453,7 +2453,7 @@ int parse_frommap(int fd)
if (server_fd[id] == fd)
break;
if(id == MAX_MAP_SERVERS)
- session[fd]->eof = 1;
+ set_eof(fd);
if(session[fd]->eof) {
if (id < MAX_MAP_SERVERS) {
unsigned char buf[16384];
@@ -3092,7 +3092,7 @@ int parse_frommap(int fd)
// no inter server packet. no char server packet -> disconnect
ShowError("Unknown packet 0x%04x from map server, disconnecting.\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
}
@@ -3157,7 +3157,7 @@ int parse_char(int fd)
sd = (struct char_session_data*)session[fd]->session_data;
if(login_fd < 0)
- session[fd]->eof = 1;
+ set_eof(fd);
if(session[fd]->eof) { // disconnect any player (already connected to char-server or coming back from map-server) if login-server is diconnected.
if (fd == login_fd)
login_fd = -1;
@@ -3582,7 +3582,7 @@ int parse_char(int fd)
}
case 0x7532: // disconnect(default also disconnect)
default:
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
}
diff --git a/src/common/socket.c b/src/common/socket.c
index efc51b99d..a538f3e31 100644
--- a/src/common/socket.c
+++ b/src/common/socket.c
@@ -78,6 +78,11 @@ size_t wfifo_size = (16*1024);
struct socket_data* session[FD_SETSIZE];
+#ifdef SEND_SHORTLIST
+struct send_shortlist_node *send_shortlist = NULL;
+fd_set send_shortlist_fd_set;
+#endif
+
int create_session(int fd, RecvFunc func_recv, SendFunc func_send, ParseFunc func_parse);
#ifndef MINICORE
@@ -148,6 +153,11 @@ void setsocketopts(int fd)
*--------------------------------------*/
void set_eof(int fd)
{
+#ifdef SEND_SHORTLIST
+ // Add this socket to the shortlist for eof handling.
+ send_shortlist_add_fd(fd);
+#endif
+
if (session_isActive(fd))
session[fd]->eof = 1;
}
@@ -495,6 +505,10 @@ int WFIFOSET(int fd, int len)
// Even the inter-server buffer may need reallocating! [Skotlex]
realloc_writefifo(fd, newreserve);
+#ifdef SEND_SHORTLIST
+ send_shortlist_add_fd(fd);
+#endif
+
return 0;
}
@@ -509,6 +523,9 @@ int do_sendrecv(int next)
//PRESEND Need to do this to ensure that the clients get something to do
//which hopefully will cause them to send packets. [Meruru]
+#ifdef SEND_SHORTLIST
+ send_shortlist_do_sends();
+#else
for (i = 1; i < fd_max; i++)
{
if(!session[i])
@@ -517,6 +534,7 @@ int do_sendrecv(int next)
if(session[i]->wdata_size)
session[i]->func_send(i);
}
+#endif
timeout.tv_sec = next/1000;
timeout.tv_usec = next%1000*1000;
@@ -549,7 +567,7 @@ int do_sendrecv(int next)
{
ShowError("Deleting invalid session %d\n", i);
//So the code can react accordingly
- session[i]->eof = 1;
+ set_eof(i);
session[i]->func_parse(i);
delete_session(i); //free the bad session
continue;
@@ -579,6 +597,9 @@ int do_sendrecv(int next)
}
#endif
+#ifdef SEND_SHORTLIST
+ send_shortlist_do_sends();
+#else
for (i = 1; i < fd_max; i++)
{
if(!session[i])
@@ -592,6 +613,7 @@ int do_sendrecv(int next)
session[i]->func_parse(i); //This should close the session inmediately.
}
}
+#endif
return 0;
}
@@ -606,7 +628,7 @@ int do_parsepacket(void)
if (session[i]->rdata_tick && DIFF_TICK(last_tick, session[i]->rdata_tick) > stall_time) {
ShowInfo ("Session #%d timed out\n", i);
- session[i]->eof = 1;
+ set_eof(i);
}
session[i]->func_parse(i);
@@ -616,7 +638,7 @@ int do_parsepacket(void)
/* after parse, check client's RFIFO size to know if there is an invalid packet (too big and not parsed) */
if (session[i]->rdata_size == rfifo_size && session[i]->max_rdata == rfifo_size) {
- session[i]->eof = 1;
+ set_eof(i);
continue;
}
RFIFOFLUSH(i);
@@ -1134,3 +1156,86 @@ uint16 ntows(uint16 neshort)
{
return ((neshort & 0xFF) << 8) | ((neshort & 0xFF00) >> 8);
}
+
+#ifdef SEND_SHORTLIST
+// Add a fd to the shortlist so that it'll be recognized as a fd that needs
+// sending (or eof handling) done on it.
+void send_shortlist_add_fd(int fd)
+{
+ struct send_shortlist_node* new_node;
+
+ if (FD_ISSET(fd, &send_shortlist_fd_set))
+ // Refuse to add duplicate FDs to the shortlist
+ return;
+
+ new_node = aMalloc(sizeof(*new_node));
+
+ FD_SET(fd, &send_shortlist_fd_set);
+
+ // Add the new node to the beginning of the shortlist linked list.
+ new_node->fd = fd;
+ new_node->prev = NULL;
+ new_node->next = send_shortlist;
+ if (new_node->next)
+ new_node->next->prev = new_node;
+
+ send_shortlist = new_node;
+}
+
+// Do pending network sends (and eof handling) from the shortlist.
+void send_shortlist_do_sends()
+{
+ struct send_shortlist_node
+ *current_node = send_shortlist,
+ *next_node;
+
+ while (current_node)
+ {
+ int delete_current_node = 1;
+
+ next_node = current_node->next;
+
+ // If this session still exists, perform send operations on it and
+ // check for the eof state.
+ if (session[ current_node->fd ])
+ {
+ if (session[ current_node->fd ]->wdata_size)
+ session[ current_node->fd ]->func_send( current_node->fd );
+
+ // If it's been marked as eof, call the parse func on it so that
+ // the socket will be immediately closed.
+ if (session[ current_node->fd ]->eof)
+ session[ current_node->fd ]->func_parse( current_node->fd );
+
+ // If the session still exists, is not eof and has things left to
+ // be sent from it we'll keep it in the send shortlist.
+ if (session[ current_node->fd ] &&
+ !session[ current_node->fd ]->eof &&
+ session[ current_node->fd ]->wdata_size)
+ delete_current_node = 0;
+ }
+
+ // If this session has been marked for removal from the short list,
+ // we'll proceed in doing this.
+ if (delete_current_node)
+ {
+ FD_CLR(current_node->fd, &send_shortlist_fd_set);
+
+ // Remove its link entry
+ if (!current_node->prev)
+ send_shortlist = next_node;
+ else
+ current_node->prev->next = next_node;
+
+ if (current_node->next)
+ current_node->next->prev = current_node->prev;
+
+ // and free its memory
+ aFree(current_node);
+ }
+
+ // Iterate to the next node (session) in the short list
+ current_node = next_node;
+ }
+}
+#endif
diff --git a/src/common/socket.h b/src/common/socket.h
index 3d860e166..a040772a9 100644
--- a/src/common/socket.h
+++ b/src/common/socket.h
@@ -140,4 +140,26 @@ int socket_getips(uint32* ips, int max);
extern uint32 addr_[16]; // ip addresses of local host (host byte order)
extern int naddr_; // # of ip addresses
+void set_eof(int fd);
+
+/// Use a shortlist of sockets instead of iterating all sessions for sockets
+/// that have data to send or need eof processing.
+///
+/// @author Buuyo-tama
+//#define SEND_SHORTLIST
+
+#ifdef SEND_SHORTLIST
+struct send_shortlist_node {
+ struct send_shortlist_node *next; // Next node in the linked list
+ struct send_shortlist_node *prev; // Previous node in the linked list
+ int fd; // FD that needs sending.
+};
+
+// Add a fd to the shortlist so that it'll be recognized as a fd that needs
+// sending done on it.
+void send_shortlist_add_fd(int fd);
+// Do pending network sends (and eof handling) from the shortlist.
+void send_shortlist_do_sends();
+#endif
+
#endif /* _SOCKET_H_ */
diff --git a/src/ladmin/ladmin.c b/src/ladmin/ladmin.c
index 75512ba24..8312c91a1 100644
--- a/src/ladmin/ladmin.c
+++ b/src/ladmin/ladmin.c
@@ -7,6 +7,17 @@
// if you modify this software, modify ladmin in tool too.
///////////////////////////////////////////////////////////////////////////
+#include "../common/cbasetypes.h"
+#include "../common/core.h"
+#include "../common/strlib.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/version.h"
+#include "../common/mmo.h"
+#include "../common/md5calc.h"
+#include "../common/showmsg.h"
+#include "ladmin.h"
+
#include <sys/types.h>
#include <time.h>
#ifdef WIN32
@@ -36,17 +47,6 @@ void Gettimeofday(struct timeval *timenow)
#include <fcntl.h>
#include <string.h> // str*
#include <stdarg.h> // valist
-#include <ctype.h> // tolower
-
-#include "../common/core.h"
-#include "../common/strlib.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/version.h"
-#include "../common/mmo.h"
-#include "../common/md5calc.h"
-#include "../common/showmsg.h"
-#include "ladmin.h"
//-------------------------------INSTRUCTIONS------------------------------
@@ -579,7 +579,7 @@ void display_help(char* param, int language) {
// lowercase for command
for (i = 0; command[i]; i++)
- command[i] = tolower(command[i]);
+ command[i] = TOLOWER(command[i]);
// Analyse of the command
check_command(command); // give complete name to the command
@@ -1146,7 +1146,7 @@ int addaccount(char* param, int emailflag) {
}
}*/
- sex[0] = toupper(sex[0]);
+ sex[0] = TOUPPER(sex[0]);
if (strchr("MF", sex[0]) == NULL) {
if (defaultlanguage == 'F') {
ShowMessage("Sexe incorrect [%s]. Entrez M ou F svp.\n", sex);
@@ -1251,7 +1251,7 @@ int banaddaccount(char* param) {
// lowercase for modif
for (i = 0; modif[i]; i++)
- modif[i] = tolower(modif[i]);
+ modif[i] = TOLOWER(modif[i]);
p_modif = modif;
while (strlen(p_modif) > 0) {
value = atoi(p_modif);
@@ -2074,7 +2074,7 @@ int changelanguage(char* language) {
return 136;
}
- language[0] = toupper(language[0]);
+ language[0] = TOUPPER(language[0]);
if (language[0] == 'F' || language[0] == 'E') {
defaultlanguage = language[0];
if (defaultlanguage == 'F') {
@@ -2115,7 +2115,7 @@ int listaccount(char* param, int type) {
// get all accounts = use default
} else if (list_type == 2) { // if search
for (i = 0; param[i]; i++)
- param[i] = tolower(param[i]);
+ param[i] = TOLOWER(param[i]);
// get all accounts = use default
} else if (list_type == 3) { // if listban
// get all accounts = use default
@@ -2355,7 +2355,7 @@ int changesex(char* param) {
return 102;
}
- sex[0] = toupper(sex[0]);
+ sex[0] = TOUPPER(sex[0]);
if (strchr("MF", sex[0]) == NULL) {
if (defaultlanguage == 'F') {
ShowMessage("Sexe incorrect [%s]. Entrez M ou F svp.\n", sex);
@@ -2607,7 +2607,7 @@ int timeaddaccount(char* param) {
// lowercase for modif
for (i = 0; modif[i]; i++)
- modif[i] = tolower(modif[i]);
+ modif[i] = TOLOWER(modif[i]);
p_modif = modif;
while (strlen(p_modif) > 0) {
value = atoi(p_modif);
@@ -3081,7 +3081,7 @@ int prompt(void) {
// lowercase for command line
for (i = 0; command[i]; i++)
- command[i] = tolower(command[i]);
+ command[i] = TOLOWER(command[i]);
if (command[0] == '?' || strlen(command) == 0) {
if (defaultlanguage == 'F') {
@@ -3250,7 +3250,7 @@ int parse_fromlogin(int fd)
ShowMessage(" - unauthorised IP.\n");
ladmin_log("Error at login: incorrect password, administration system not activated, or unauthorised IP." RETCODE);
}
- session[fd]->eof = 1;
+ set_eof(fd);
//bytes_to_read = 1; // not stop at prompt
return 0;
} else {
@@ -3361,7 +3361,7 @@ int parse_fromlogin(int fd)
userid[sizeof(userid)-1] = '\0';
memset(lower_userid, '\0', sizeof(lower_userid));
for (j = 0; userid[j]; j++)
- lower_userid[j] = tolower(userid[j]);
+ lower_userid[j] = TOLOWER(userid[j]);
list_first = RFIFOL(fd,i) + 1;
// here are checks...
if (list_type == 0 ||
@@ -4148,7 +4148,7 @@ int parse_fromlogin(int fd)
default:
ShowMessage("Remote administration has been disconnected (unknown packet).\n");
ladmin_log("'End of connection, unknown packet." RETCODE);
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
}
diff --git a/src/login/login.c b/src/login/login.c
index 802ab95fe..bc7fc226e 100644
--- a/src/login/login.c
+++ b/src/login/login.c
@@ -1,13 +1,6 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h> // for stat/lstat/fstat
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-
#include "../common/cbasetypes.h"
#include "../common/core.h"
#include "../common/socket.h"
@@ -22,6 +15,13 @@
#include "../common/md5calc.h"
#include "login.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h> // for stat/lstat/fstat
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+
uint32 account_id_count = START_ACCOUNT_NUM;
bool new_account_flag = true;
uint32 login_ip = INADDR_ANY;
@@ -1367,7 +1367,7 @@ int parse_fromchar(int fd)
if (server_fd[id] == fd)
break;
if (id == MAX_SERVERS) { // not a char server
- session[fd]->eof = 1;
+ set_eof(fd);
do_close(fd);
return 0;
}
@@ -1946,7 +1946,7 @@ int parse_fromchar(int fd)
}
}
ShowError("parse_fromchar: Unknown packet 0x%x from a char-server! Disconnecting!\n", command);
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
}
@@ -2001,7 +2001,7 @@ int parse_admin(int fd)
case 0x7532: // Request of end of connection
login_log("'ladmin': End of connection (ip: %s)" RETCODE, ip);
RFIFOSKIP(fd,2);
- session[fd]->eof = 1;
+ set_eof(fd);
break;
case 0x7920: // Request of an accounts list
@@ -2915,7 +2915,7 @@ int parse_admin(int fd)
}
}
login_log("'ladmin': End of connection, unknown packet (ip: %s)" RETCODE, ip);
- session[fd]->eof = 1;
+ set_eof(fd);
ShowWarning("Remote administration has been disconnected (unknown packet).\n");
return 0;
}
@@ -3012,7 +3012,7 @@ int parse_login(int fd)
WFIFOB(fd,2) = 3; // 3 = Rejected from Server
WFIFOSET(fd,23);
RFIFOSKIP(fd,packet_len);
- session[fd]->eof = 1;
+ set_eof(fd);
break;
}
@@ -3123,7 +3123,7 @@ int parse_login(int fd)
struct login_session_data* ld;
if (session[fd]->session_data) {
ShowWarning("login: abnormal request of MD5 key (already opened session).\n");
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
@@ -3243,7 +3243,7 @@ int parse_login(int fd)
case 0x7532: // Request to end connection
login_log("End of connection (ip: %s)" RETCODE, ip);
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
case 0x7918: // Request for administation login
@@ -3340,7 +3340,7 @@ int parse_login(int fd)
}
}
login_log("Abnormal end of connection (ip: %s): Unknown packet 0x%x " RETCODE, ip, command);
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
}
diff --git a/src/login_sql/login.c b/src/login_sql/login.c
index 5929e9748..bad4c8731 100644
--- a/src/login_sql/login.c
+++ b/src/login_sql/login.c
@@ -1,13 +1,6 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h> // for stat/lstat/fstat
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-
#include "../common/cbasetypes.h"
#include "../common/core.h"
#include "../common/socket.h"
@@ -21,6 +14,13 @@
#include "../common/md5calc.h"
#include "login.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h> // for stat/lstat/fstat
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+
//add include for DBMS(mysql)
#ifdef WIN32
#include <winsock2.h>
@@ -735,7 +735,7 @@ int parse_fromchar(int fd)
if (server_fd[id] == fd)
break;
if (id == MAX_SERVERS) { // not a char server
- session[fd]->eof = 1;
+ set_eof(fd);
do_close(fd);
return 0;
}
@@ -1236,7 +1236,7 @@ int parse_fromchar(int fd)
default:
ShowError("parse_fromchar: Unknown packet 0x%x from a char-server! Disconnecting!\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
}
@@ -1354,7 +1354,7 @@ int parse_login(int fd)
WFIFOB(fd,2) = 3; // 3 = Rejected from Server
WFIFOSET(fd,23);
RFIFOSKIP(fd,packet_len);
- session[fd]->eof = 1;
+ set_eof(fd);
break;
}
@@ -1541,7 +1541,7 @@ int parse_login(int fd)
struct login_session_data* ld;
if (session[fd]->session_data) {
ShowWarning("login: abnormal request of MD5 key (already opened session).\n");
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
@@ -1655,12 +1655,12 @@ int parse_login(int fd)
case 0x7532: // Request to end connection
ShowStatus ("End of connection (ip: %s)" RETCODE, ip);
- session[fd]->eof = 1;
+ set_eof(fd);
break;
default:
ShowStatus ("Abnormal end of connection (ip: %s): Unknown packet 0x%x " RETCODE, ip, RFIFOW(fd,0));
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
}
diff --git a/src/map/chrif.c b/src/map/chrif.c
index d163dab77..3928c0a7a 100644
--- a/src/map/chrif.c
+++ b/src/map/chrif.c
@@ -1,12 +1,6 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <time.h>
-
#include "../common/cbasetypes.h"
#include "../common/malloc.h"
#include "../common/socket.h"
@@ -16,13 +10,19 @@
#include "map.h"
#include "battle.h"
-#include "chrif.h"
#include "clif.h"
#include "intif.h"
#include "npc.h"
#include "pc.h"
#include "status.h"
#include "mercenary.h"
+#include "chrif.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <time.h>
struct dbt *auth_db;
@@ -1424,7 +1424,7 @@ int chrif_parse(int fd)
if (r == 1) continue; // intifで処理した
if (r == 2) return 0; // intifで処理したが、データが足りない
- session[fd]->eof = 1;
+ set_eof(fd);
ShowWarning("chrif_parse: session #%d, intif_parse failed -> disconnected.\n", fd);
return 0;
}
@@ -1465,7 +1465,7 @@ int chrif_parse(int fd)
default:
if (battle_config.error_log)
ShowError("chrif_parse : unknown packet (session #%d): 0x%x. Disconnecting.\n", fd, cmd);
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
if (fd == char_fd) //There's the slight chance we lost the connection during parse, in which case this would segfault if not checked [Skotlex]
diff --git a/src/map/clif.c b/src/map/clif.c
index 15642ee62..ce70feaf9 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -4,12 +4,6 @@
#define DUMP_UNKNOWN_PACKET 0
#define DUMP_ALL_PACKETS 0
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <time.h>
-
#include "../common/cbasetypes.h"
#include "../common/socket.h"
#include "../common/timer.h"
@@ -21,7 +15,6 @@
#include "map.h"
#include "chrif.h"
-#include "clif.h"
#include "pc.h"
#include "status.h"
#include "npc.h"
@@ -44,6 +37,13 @@
#include "mercenary.h" //[orn]
#include "log.h"
#include "irc.h"
+#include "clif.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <time.h>
struct Clif_Config {
int packet_db_ver; //Preferred packet version.
@@ -1622,7 +1622,7 @@ void clif_quitsave(int fd,struct map_session_data *sd)
*/
static int clif_waitclose(int tid, unsigned int tick, int id, int data) {
if (session[id] && session[id]->func_parse == clif_parse) //Avoid disconnecting non-players, as pointed out by End of Exam [Skotlex]
- session[id]->eof = 1;
+ set_eof(id);
return 0;
}
@@ -11873,7 +11873,7 @@ int clif_parse(int fd)
packet_ver = sd->packet_ver;
if (packet_ver < 0 || packet_ver > MAX_PACKET_VER) { // This should never happen unless we have some corrupted memory issues :X [Skotlex]
ShowWarning("clif_parse: Disconnecting session #%d (AID:%d/CID:%d) for having invalid packet_ver=%d.", fd, sd->status.account_id, sd->status.char_id, packet_ver);
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
} else {
@@ -11909,7 +11909,7 @@ int clif_parse(int fd)
// ゲーム用以外パケットか、認証を終える前に0072以外が来たら、切断する
if (cmd > MAX_PACKET_DB || packet_db[packet_ver][cmd].len == 0) { // if packet is not inside these values: session is incorrect?? or auth packet is unknown
ShowWarning("clif_parse: Received unsupported packet (packet 0x%04x, %d bytes received), disconnecting session #%d.\n", cmd, RFIFOREST(fd), fd);
- session[fd]->eof = 1;
+ set_eof(fd);
return 0;
}
@@ -11922,7 +11922,7 @@ int clif_parse(int fd)
packet_len = RFIFOW(fd,2);
if (packet_len < 4 || packet_len > 32768) {
ShowWarning("clif_parse: Packet 0x%04x specifies invalid packet_len (%d), disconnecting session #%d.\n", cmd, packet_len, fd);
- session[fd]->eof =1;
+ set_eof(fd);
return 0;
}
}
diff --git a/src/map/irc.c b/src/map/irc.c
index b024137e0..1dab39903 100644
--- a/src/map/irc.c
+++ b/src/map/irc.c
@@ -1,10 +1,6 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
#include "../common/core.h"
#include "../common/socket.h"
#include "../common/malloc.h"
@@ -18,8 +14,12 @@
#include "map.h"
#include "pc.h"
-#include "irc.h"
#include "intif.h" //For GM Broadcast [Zido]
+#include "irc.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
short use_irc=0;
@@ -252,7 +252,7 @@ void irc_parse_sub(int fd, char *incoming_string)
sprintf(send_string, "QUIT");
irc_send(send_string);
if(session[fd])
- session[fd]->eof=1;
+ set_eof(fd);
}
}
else if (irc_si->state == 2){