summaryrefslogtreecommitdiff
path: root/src/login/login.cpp
diff options
context:
space:
mode:
authorBen Longbons <b.r.longbons@gmail.com>2014-04-18 22:09:42 -0700
committerBen Longbons <b.r.longbons@gmail.com>2014-04-18 22:23:16 -0700
commit7f16d356995d4e9c29105f98d502a7e51a4c775d (patch)
tree3fc9f782d67f68d44c36d0dff2c197fc33dac206 /src/login/login.cpp
parent56e149a51562b9d2620bc9037a81735c29ea95af (diff)
parent6d631217271fcdc57143a7f8e03a2595a93ab50f (diff)
downloadtmwa-7f16d356995d4e9c29105f98d502a7e51a4c775d.tar.gz
tmwa-7f16d356995d4e9c29105f98d502a7e51a4c775d.tar.bz2
tmwa-7f16d356995d4e9c29105f98d502a7e51a4c775d.tar.xz
tmwa-7f16d356995d4e9c29105f98d502a7e51a4c775d.zip
Merge tag 'v14.4.18' into master
Conflicts: src/admin/ladmin.cpp src/char/char.cpp src/login/login.cpp src/map/chrif.cpp src/map/clif.cpp src/mmo/socket.cpp
Diffstat (limited to 'src/login/login.cpp')
-rw-r--r--src/login/login.cpp73
1 files changed, 39 insertions, 34 deletions
diff --git a/src/login/login.cpp b/src/login/login.cpp
index e061e63..f8be4ce 100644
--- a/src/login/login.cpp
+++ b/src/login/login.cpp
@@ -256,6 +256,34 @@ void login_log(XString line)
log_with_timestamp(logfp, line);
}
+static
+void delete_login(Session *sess)
+{
+ (void)sess;
+}
+
+static
+void delete_fromchar(Session *sess)
+{
+ auto it = std::find(server_session.begin(), server_session.end(), sess);
+ assert (it != server_session.end());
+ int id = it - server_session.begin();
+ IP4Address ip = sess->client_ip;
+ PRINTF("Char-server '%s' has disconnected.\n"_fmt, server[id].name);
+ LOGIN_LOG("Char-server '%s' has disconnected (ip: %s).\n"_fmt,
+ server[id].name, ip);
+ server_session[id] = nullptr;
+ server[id] = mmo_char_server{};
+}
+
+static
+void delete_admin(Session *s)
+{
+ PRINTF("Remote administration has disconnected (session #%d).\n"_fmt,
+ s);
+}
+
+
//----------------------------------------------------------------------
// Determine if an account (id) is a GM account
// and returns its level (or 0 if it isn't a GM account or if not found)
@@ -945,7 +973,7 @@ void char_anti_freeze_system(TimerData *, tick_t)
i, server[i].name);
LOGIN_LOG("Char-server anti-freeze system: char-server #%d '%s' is freezed -> disconnection.\n"_fmt,
i, server[i].name);
- server_session[i]->eof = 1;
+ server_session[i]->set_eof();
}
}
}
@@ -963,17 +991,9 @@ void parse_fromchar(Session *s)
for (id = 0; id < MAX_SERVERS; id++)
if (server_session[id] == s)
break;
- if (id == MAX_SERVERS || s->eof)
+ if (id == MAX_SERVERS)
{
- if (id < MAX_SERVERS)
- {
- PRINTF("Char-server '%s' has disconnected.\n"_fmt, server[id].name);
- LOGIN_LOG("Char-server '%s' has disconnected (ip: %s).\n"_fmt,
- server[id].name, ip);
- server_session[id] = nullptr;
- server[id] = mmo_char_server{};
- }
- delete_session(s);
+ s->set_eof();
return;
}
@@ -1585,7 +1605,7 @@ void parse_fromchar(Session *s)
}
PRINTF("parse_fromchar: Unknown packet 0x%x (from a char-server)! -> disconnection.\n"_fmt,
RFIFOW(s, 0));
- s->eof = 1;
+ s->set_eof();
PRINTF("Char-server has been disconnected (unknown packet).\n"_fmt);
return;
}
@@ -1601,14 +1621,6 @@ void parse_admin(Session *s)
{
IP4Address ip = s->client_ip;
- if (s->eof)
- {
- delete_session(s);
- PRINTF("Remote administration has disconnected (session #%d).\n"_fmt,
- s);
- return;
- }
-
while (RFIFOREST(s) >= 2)
{
if (display_parse_admin == 1)
@@ -1630,7 +1642,7 @@ void parse_admin(Session *s)
LOGIN_LOG("'ladmin': End of connection (ip: %s)\n"_fmt,
ip);
RFIFOSKIP(s, 2);
- s->eof = 1;
+ s->set_eof();
break;
case 0x7920: // Request of an accounts list
@@ -2700,7 +2712,7 @@ void parse_admin(Session *s)
}
LOGIN_LOG("'ladmin': End of connection, unknown packet (ip: %s)\n"_fmt,
ip);
- s->eof = 1;
+ s->set_eof();
PRINTF("Remote administration has been disconnected (unknown packet).\n"_fmt);
return;
}
@@ -2734,12 +2746,6 @@ void parse_login(Session *s)
IP4Address ip = s->client_ip;
- if (s->eof)
- {
- delete_session(s);
- return;
- }
-
while (RFIFOREST(s) >= 2)
{
if (display_parse_login == 1)
@@ -3000,7 +3006,7 @@ void parse_login(Session *s)
WFIFOW(s, 0) = 0x2711;
WFIFOB(s, 2) = 0;
WFIFOSET(s, 3);
- s->func_parse = parse_fromchar;
+ s->set_parsers(SessionParsers{func_parse: parse_fromchar, func_delete: delete_fromchar});
realloc_fifo(s, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
// send GM account to char-server
len = 4;
@@ -3046,7 +3052,7 @@ void parse_login(Session *s)
case 0x7532: // Request to end connection
LOGIN_LOG("End of connection (ip: %s)\n"_fmt, ip);
- s->eof = 1;
+ s->set_eof();
return;
case 0x7918: // Request for administation login
@@ -3074,7 +3080,7 @@ void parse_login(Session *s)
password, ip);
PRINTF("Connection of a remote administration accepted (non encrypted password).\n"_fmt);
WFIFOB(s, 2) = 0;
- s->func_parse = parse_admin;
+ s->set_parsers(SessionParsers{func_parse: parse_admin, func_delete: delete_admin});
}
else if (admin_state != 1)
LOGIN_LOG("'ladmin'-login: Connection in administration mode REFUSED - remote administration is disabled (non encrypted password: %s, ip: %s)\n"_fmt,
@@ -3149,7 +3155,7 @@ void parse_login(Session *s)
}
}
LOGIN_LOG("End of connection, unknown packet (ip: %s)\n"_fmt, ip);
- s->eof = 1;
+ s->set_eof();
return;
}
}
@@ -3896,8 +3902,7 @@ int do_init(Slice<ZString> argv)
read_gm_account();
mmo_auth_init();
// set_termfunc (mmo_auth_sync);
- set_defaultparse(parse_login);
- login_session = make_listen_port(login_port);
+ login_session = make_listen_port(login_port, SessionParsers{func_parse: parse_login, func_delete: delete_login});
Timer(gettick() + std::chrono::minutes(5),