/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2012 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
#define SERVER_WAIT (NONE - 1)
#define MAX_COMMANDS 3
-#define MAX_COMMANDS_SERVER 10
-#define MAX_COMMANDS_SERVICE MAX_COMMANDS_SERVER
+#define MAX_COMMANDS_SERVER_MIN 10
+#define MAX_COMMANDS_SERVICE 10
static bool Handle_Write PARAMS(( CONN_ID Idx ));
return ok;
} /* Conn_WriteStr */
+GLOBAL const char*
+Conn_Password( CONN_ID Idx )
+{
+ assert( Idx > NONE );
+ return My_Connections[Idx].pwd;
+} /* Conn_Password */
+
+GLOBAL void
+Conn_SetPassword( CONN_ID Idx, const char *Pwd )
+{
+ assert( Idx > NONE );
+ strlcpy( My_Connections[Idx].pwd, Pwd,
+ sizeof(My_Connections[Idx].pwd) );
+} /* Conn_SetPassword */
/**
* Append Data to the outbound write buffer of a connection.
return -1;
}
- c = Client_NewLocal(new_sock, ip_str, CLIENT_UNKNOWN, false);
+ c = Client_NewLocal(new_sock, NULL, CLIENT_UNKNOWN, false);
if (!c) {
Log(LOG_ALERT,
"Can't accept connection: can't create client structure!");
if (!array_catb(&My_Connections[Idx].zip.rbuf, readbuf,
(size_t) len)) {
Log(LOG_ERR,
- "Could not append recieved data to zip input buffer (connection %d): %d bytes!",
+ "Could not append received data to zip input buffer (connection %d): %d bytes!",
Idx, len);
Conn_Close(Idx, "Receive buffer space exhausted", NULL,
false);
{
if (!array_catb( &My_Connections[Idx].rbuf, readbuf, len)) {
Log(LOG_ERR,
- "Could not append recieved data to input buffer (connection %d): %d bytes!",
+ "Could not append received data to input buffer (connection %d): %d bytes!",
Idx, len);
Conn_Close(Idx, "Receive buffer space exhausted", NULL, false );
}
assert(c != NULL);
- /* Servers do get special command limits, so they can process
- * all the messages that are required while peering. */
+ /* Servers get special command limits that depend on the user count */
switch (Client_Type(c)) {
case CLIENT_SERVER:
- /* Allow servers to send more commands in the first 10 secods
+ maxcmd = (int)(Client_UserCount() / 5)
+ + MAX_COMMANDS_SERVER_MIN;
+ /* Allow servers to handle even more commands while peering
* to speed up server login and network synchronisation. */
- if (starttime - Client_StartTime(c) < 10)
- maxcmd = MAX_COMMANDS_SERVER * 5;
- else
- maxcmd = MAX_COMMANDS_SERVER;
+ if (Conn_LastPing(Idx) == 0)
+ maxcmd *= 5;
break;
case CLIENT_SERVICE:
maxcmd = MAX_COMMANDS_SERVICE; break;
time(NULL) - Conf_PingTimeout) {
/* We need to send a PING ... */
LogDebug("Connection %d: sending PING ...", i);
- My_Connections[i].lastping = time(NULL);
+ Conn_UpdatePing(i);
Conn_WriteStr(i, "PING :%s",
Client_ID(Client_ThisServer()));
}
assert( Server > NONE );
+ /* Make sure that the remote server hasn't re-linked to this server
+ * asynchronously on its own */
+ if (Conf_Server[Server].conn_id > NONE) {
+ Log(LOG_INFO,
+ "Connection to \"%s\" meanwhile re-established, aborting preparation.");
+ return;
+ }
+
if (!ng_ipaddr_tostr_r(dest, ip_str)) {
Log(LOG_WARNING, "New_Server: Could not convert IP to string");
return;
Client_SetToken( c, TOKEN_OUTBOUND );
/* Register connection */
- Conf_Server[Server].conn_id = new_sock;
+ Conf_SetServer(Server, new_sock);
My_Connections[new_sock].sock = new_sock;
My_Connections[new_sock].addr = *dest;
My_Connections[new_sock].client = c;
char *identptr;
#ifdef IDENTAUTH
char readbuf[HOST_LEN + 2 + CLIENT_USER_LEN];
+ char *ptr;
#else
char readbuf[HOST_LEN + 1];
#endif
#ifdef IDENTAUTH
++identptr;
if (*identptr) {
- Log(LOG_INFO, "IDENT lookup for connection %d: \"%s\".", i, identptr);
- Client_SetUser(c, identptr, true);
- if (Conf_NoticeAuth)
+ ptr = identptr;
+ while (*ptr) {
+ if ((*ptr < '0' || *ptr > '9') &&
+ (*ptr < 'A' || *ptr > 'Z') &&
+ (*ptr < 'a' || *ptr > 'z'))
+ break;
+ ptr++;
+ }
+ if (*ptr) {
+ /* Erroneous IDENT reply */
+ Log(LOG_NOTICE,
+ "Got invalid IDENT reply for connection %d! Ignored.",
+ i);
+ } else {
+ Log(LOG_INFO,
+ "IDENT lookup for connection %d: \"%s\".",
+ i, identptr);
+ Client_SetUser(c, identptr, true);
+ }
+ if (Conf_NoticeAuth) {
(void)Conn_WriteStr(i,
- "NOTICE AUTH :*** Got ident response");
+ "NOTICE AUTH :*** Got %sident response",
+ *ptr ? "invalid " : "");
+ }
} else {
Log(LOG_INFO, "IDENT lookup for connection %d: no result.", i);
if (Conf_NoticeAuth && Conf_Ident)