summaryrefslogtreecommitdiff
path: root/src/login_sql/login.c
diff options
context:
space:
mode:
authorultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-12-02 09:39:35 +0000
committerultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-12-02 09:39:35 +0000
commit357627760a5810bf33e162431fd98c3f6ee84cfc (patch)
treec8ed4859fe4869caba2790734960e6e99611ea99 /src/login_sql/login.c
parent8624af1916d4926e421ba4a5a9b261420fcaf189 (diff)
downloadhercules-357627760a5810bf33e162431fd98c3f6ee84cfc.tar.gz
hercules-357627760a5810bf33e162431fd98c3f6ee84cfc.tar.bz2
hercules-357627760a5810bf33e162431fd98c3f6ee84cfc.tar.xz
hercules-357627760a5810bf33e162431fd98c3f6ee84cfc.zip
Fixed charserver unable to reestablish link to login server after a disconnect (yet another problem caused by r11826).
Copied code from TXT to SQL to perform a graceful shutdown of all login server sockets while exiting. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@11848 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/login_sql/login.c')
-rw-r--r--src/login_sql/login.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/login_sql/login.c b/src/login_sql/login.c
index f63961f82..20be31a7b 100644
--- a/src/login_sql/login.c
+++ b/src/login_sql/login.c
@@ -621,11 +621,11 @@ int parse_fromchar(int fd)
if( session[fd]->eof )
{
ShowStatus("Char-server '%s' has disconnected.\n", server[id].name);
- server[id].fd = -1;
- memset(&server[id], 0, sizeof(struct mmo_char_server));
online_db->foreach(online_db, online_db_setoffline, id); //Set all chars from this char server to offline.
if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `sstatus` WHERE `index`='%d'", id) )
Sql_ShowDebug(sql_handle);
+ memset(&server[id], 0, sizeof(struct mmo_char_server));
+ server[id].fd = -1;
do_close(fd);
return 0;
}
@@ -1863,13 +1863,24 @@ void login_set_defaults()
//--------------------------------------
void do_final(void)
{
- //sync account when terminating.
- //but no need when you using DBMS (mysql)
+ int i, fd;
ShowStatus("Terminating...\n");
+
mmo_db_close();
online_db->destroy(online_db, NULL);
- if (gm_account_db)
- aFree(gm_account_db);
+
+ if(gm_account_db) aFree(gm_account_db);
+
+ for (i = 0; i < MAX_SERVERS; i++) {
+ if ((fd = server[i].fd) >= 0) {
+ memset(&server[i], 0, sizeof(struct mmo_char_server));
+ server[i].fd = -1;
+ do_close(fd);
+ }
+ }
+ do_close(login_fd);
+
+ ShowStatus("Finished.\n");
}
//------------------------------