X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Firc-login.c;h=fb2219226d8c3654c3ebdb8029e96dd2a3ab1160;hp=35026e5587300d08ebb61f9bf9af3a9f99824475;hb=HEAD;hpb=599626d570f5bd5284a7a30fb8c3ca8dc3636371 diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index 35026e55..fb221922 100644 --- a/src/ngircd/irc-login.c +++ b/src/ngircd/irc-login.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors. + * Copyright (c)2001-2018 Alexander Barton (alex@barton.de) and Contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -89,7 +89,7 @@ IRC_PASS( CLIENT *Client, REQUEST *Req ) /* Protocol version */ if (Req->argc >= 2 && strlen(Req->argv[1]) >= 4) { - int c2, c4; + char c2, c4; c2 = Req->argv[1][2]; c4 = Req->argv[1][4]; @@ -196,6 +196,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) /* Search "target" client */ if (Client_Type(Client) == CLIENT_SERVER) { + _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) target = Client_Search(Req->prefix); if (!target) return IRC_WriteErrClient(Client, @@ -266,8 +267,8 @@ IRC_NICK( CLIENT *Client, REQUEST *Req ) !Client_HasMode(Client, 'o')) { chan = Channel_First(); while (chan) { - if(Channel_IsMemberOf(chan, Client) && - Channel_HasMode(chan, 'N')) + if(Channel_HasMode(chan, 'N') && + Channel_IsMemberOf(chan, Client)) return IRC_WriteErrClient(Client, ERR_NONICKCHANGE_MSG, Client_ID(Client), @@ -379,6 +380,8 @@ IRC_SVSNICK(CLIENT *Client, REQUEST *Req) assert(Client != NULL); assert(Req != NULL); + _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) + /* Search the originator */ from = Client_Search(Req->prefix); if (!from) @@ -481,6 +484,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req) Client_Type(Client) == CLIENT_SERVICE) { /* Server/service updating an user */ _IRC_ARGC_EQ_OR_RETURN_(Client, Req, 4) + _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) c = Client_Search(Req->prefix); if (!c) @@ -653,6 +657,8 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req ) if (Client_Type(Client) == CLIENT_SERVER) { /* Server */ + _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) + target = Client_Search(Req->prefix); if (!target) { Log(LOG_WARNING, @@ -741,9 +747,10 @@ IRC_PING(CLIENT *Client, REQUEST *Req) if (target != Client_ThisServer()) { /* Ok, we have to forward the PING */ - if (Client_Type(Client) == CLIENT_SERVER) + if (Client_Type(Client) == CLIENT_SERVER) { + _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) from = Client_Search(Req->prefix); - else + } else from = Client; if (!from) return IRC_WriteErrClient(Client, @@ -767,7 +774,7 @@ IRC_PING(CLIENT *Client, REQUEST *Req) return IRC_WriteErrClient(Client, ERR_NOSUCHSERVER_MSG, Client_ID(Client), Req->prefix); - Log(LOG_DEBUG, "Connection %d: got PING, sending PONG ...", + LogDebug("Connection %d: got PING, sending PONG ...", Client_Conn(Client)); #ifdef STRICT_RFC @@ -815,6 +822,8 @@ IRC_PONG(CLIENT *Client, REQUEST *Req) /* Forward? */ if (Req->argc == 2 && Client_Type(Client) == CLIENT_SERVER) { + _IRC_REQUIRE_PREFIX_OR_RETURN_(Client, Req) + target = Client_Search(Req->argv[0]); if (!target) return IRC_WriteErrClient(Client, ERR_NOSUCHSERVER_MSG, @@ -864,14 +873,21 @@ IRC_PONG(CLIENT *Client, REQUEST *Req) if (Client_Type(Client) == CLIENT_SERVER && Conn_LastPing(conn) == 0) { Log(LOG_INFO, "Synchronization with \"%s\" done (connection %d): %ld second%s [%ld users, %ld channels].", - Client_ID(Client), conn, time(NULL) - Conn_GetSignon(conn), + Client_ID(Client), conn, + (long)(time(NULL) - Conn_GetSignon(conn)), time(NULL) - Conn_GetSignon(conn) == 1 ? "" : "s", Client_UserCount(), Channel_CountVisible(NULL)); - Conn_UpdatePing(conn); - } else - LogDebug("Connection %d: received PONG. Lag: %ld seconds.", - conn, time(NULL) - Conn_LastPing(conn)); + } else { + if (Conn_LastPing(conn) > 1) + LogDebug("Connection %d: received PONG. Lag: %ld seconds.", + conn, (long)(time(NULL) - Conn_LastPing(conn))); + else + LogDebug("Got unexpected PONG on connection %d. Ignored.", + conn); + } + /* We got a PONG, so signal that none is pending on this connection. */ + Conn_UpdatePing(conn, 1); return CONNECTED; } /* IRC_PONG */