/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2010 Alexander Barton <alex@barton.de>
*
* 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
- *
- * IRC info commands
*/
-
#include "portab.h"
+/**
+ * @file
+ * IRC info commands
+ */
+
#include "imp.h"
#include <assert.h>
#include <errno.h>
#include "ngircd.h"
#include "conn-func.h"
#include "conn-zip.h"
-#include "client.h"
#include "channel.h"
-#include "resolve.h"
#include "conf.h"
#include "defines.h"
#include "log.h"
assert( Client != NULL );
assert( Req != NULL );
- /* Falsche Anzahl Parameter? */
if(( Req->argc > 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
- /* Ziel suchen */
+ /* find target ... */
if( Req->argc == 1 ) target = Client_Search( Req->argv[0] );
else target = Client_ThisServer( );
- /* Prefix ermitteln */
+ /* find Prefix */
if( Client_Type( Client ) == CLIENT_SERVER ) prefix = Client_Search( Req->prefix );
else prefix = Client;
if( ! prefix ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
- /* An anderen Server weiterleiten? */
+ /* forwad message to another server? */
if( target != Client_ThisServer( ))
{
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( prefix, ERR_NOSUCHSERVER_MSG, Client_ID( prefix ), Req->argv[0] );
- /* forwarden */
+ /* forward */
IRC_WriteStrClientPrefix( target, prefix, "ADMIN %s", Req->argv[0] );
return CONNECTED;
}
assert( Client != NULL );
assert( Req != NULL );
- /* Falsche Anzahl Parameter? */
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Server-Mask ermitteln */
assert( Client != NULL );
assert( Req != NULL );
- /* Falsche Anzahl Parameter? */
if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Absender ermitteln */
assert( Client != NULL );
assert( Req != NULL );
- /* Falsche Anzahl Parameter? */
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* From aus Prefix ermitteln */
if( Req->argc == 1 )
{
- /* an anderen Server forwarden */
+ /* forward? */
target = Client_Search( Req->argv[0] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[0] );
assert( Client != NULL );
assert( Req != NULL );
- /* Falsche Anzahl Parameter? */
if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
- /* From aus Prefix ermitteln */
+ /* use prefix to determine "From" */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
if( Req->argc == 2 )
{
- /* an anderen Server forwarden */
+ /* forward to another server? */
target = Client_Search( Req->argv[1] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] );
- if( target != Client_ThisServer( ))
- {
- /* Ok, anderer Server ist das Ziel: forwarden */
+ if( target != Client_ThisServer( )) {
+ /* target is another server, forward */
return IRC_WriteStrClientPrefix( target, from, "NAMES %s :%s", Req->argv[0], Req->argv[1] );
}
}
chan = Channel_Search( ptr );
if( chan )
{
- /* Namen ausgeben */
+ /* print name */
if( ! IRC_Send_NAMES( from, chan )) return DISCONNECTED;
}
if( ! IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), ptr )) return DISCONNECTED;
- /* naechsten Namen ermitteln */
+ /* get next channel name */
ptr = strtok( NULL, "," );
}
return CONNECTED;
}
- /* alle Channels durchgehen */
chan = Channel_First( );
while( chan )
{
- /* Namen ausgeben */
if( ! IRC_Send_NAMES( from, chan )) return DISCONNECTED;
- /* naechster Channel */
chan = Channel_Next( chan );
}
- /* Nun noch alle Clients ausgeben, die in keinem Channel sind */
+ /* Now print all clients which are not in any channel */
c = Client_First( );
snprintf( rpl, sizeof( rpl ), RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" );
while( c )
{
if(( Client_Type( c ) == CLIENT_USER ) && ( Channel_FirstChannelOf( c ) == NULL ) && ( ! strchr( Client_Modes( c ), 'i' )))
{
- /* Okay, das ist ein User: anhaengen */
+ /* its a user, concatenate ... */
if( rpl[strlen( rpl ) - 1] != ':' ) strlcat( rpl, " ", sizeof( rpl ));
strlcat( rpl, Client_ID( c ), sizeof( rpl ));
if( strlen( rpl ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
{
- /* Zeile wird zu lang: senden! */
+ /* Line is gwoing too long, send now */
if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED;
snprintf( rpl, sizeof( rpl ), RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" );
}
}
- /* naechster Client */
c = Client_Next( c );
}
if( rpl[strlen( rpl ) - 1] != ':')
{
- /* es wurden User gefunden */
if( ! IRC_WriteStrClient( from, "%s", rpl )) return DISCONNECTED;
}
remain = diff * d;
*t -= remain;
- return diff;
+ return (unsigned int)diff;
}
}
+/**
+ * Handler for the IRC command "STATS".
+ * See RFC 2812 section 3.4.4.
+ */
GLOBAL bool
IRC_STATS( CLIENT *Client, REQUEST *Req )
{
time_t time_now;
unsigned int days, hrs, mins;
- assert( Client != NULL );
- assert( Req != NULL );
+ assert(Client != NULL);
+ assert(Req != NULL);
- /* Falsche Anzahl Parameter? */
if (Req->argc > 2)
- return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
+ return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
+ Client_ID(Client), Req->command);
- /* From aus Prefix ermitteln */
+ /* use prefix to determine "From" */
if (Client_Type(Client) == CLIENT_SERVER)
from = Client_Search(Req->prefix);
else
from = Client;
- if (! from)
- return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix);
+ if (!from)
+ return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
+ Client_ID(Client), Req->prefix);
if (Req->argc == 2) {
- /* an anderen Server forwarden */
- target = Client_Search( Req->argv[1] );
- if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
- return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] );
-
- if( target != Client_ThisServer()) {
- /* Ok, anderer Server ist das Ziel: forwarden */
- return IRC_WriteStrClientPrefix( target, from, "STATS %s %s", Req->argv[0], Req->argv[1] );
+ /* forward to another server? */
+ target = Client_Search(Req->argv[1]);
+ if ((!target) || (Client_Type(target) != CLIENT_SERVER))
+ return IRC_WriteStrClient(from, ERR_NOSUCHSERVER_MSG,
+ Client_ID(from), Req->argv[1]);
+
+ if (target != Client_ThisServer()) {
+ /* forward to another server */
+ return IRC_WriteStrClientPrefix(target, from,
+ "STATS %s %s", Req->argv[0], Req->argv[1]);
}
}
query = '*';
switch (query) {
- case 'l': /* Links */
- case 'L':
- time_now = time(NULL);
- for (con = Conn_First(); con != NONE ;con = Conn_Next(con)) {
- cl = Conn_GetClient(con);
- if (!cl)
- continue;
- if ((Client_Type(cl) == CLIENT_SERVER) || (cl == Client)) {
- /* Server link or our own connection */
+ case 'l': /* Link status (servers and own link) */
+ case 'L':
+ time_now = time(NULL);
+ for (con = Conn_First(); con != NONE; con = Conn_Next(con)) {
+ cl = Conn_GetClient(con);
+ if (!cl)
+ continue;
+ if ((Client_Type(cl) == CLIENT_SERVER)
+ || (cl == Client)) {
+ /* Server link or our own connection */
#ifdef ZLIB
- if (Conn_Options(con) & CONN_ZIP) {
- if (!IRC_WriteStrClient(from, RPL_STATSLINKINFOZIP_MSG,
- Client_ID(from), Client_Mask(cl), Conn_SendQ(con),
- Conn_SendMsg(con), Zip_SendBytes(con), Conn_SendBytes(con),
- Conn_RecvMsg(con), Zip_RecvBytes(con), Conn_RecvBytes(con), (long)(time_now - Conn_StartTime(con))))
- return DISCONNECTED;
- continue;
- }
-#endif
- if (!IRC_WriteStrClient(from, RPL_STATSLINKINFO_MSG, Client_ID(from),
- Client_Mask(cl), Conn_SendQ(con), Conn_SendMsg(con), Conn_SendBytes(con),
- Conn_RecvMsg(con), Conn_RecvBytes(con), (long)(time_now - Conn_StartTime(con))))
- return DISCONNECTED;
- }
- }
- break;
- case 'm': /* IRC-Commands */
- case 'M':
- cmd = Parse_GetCommandStruct( );
- for (; cmd->name ; cmd++) {
- if (cmd->lcount == 0 && cmd->rcount == 0)
+ if (Conn_Options(con) & CONN_ZIP) {
+ if (!IRC_WriteStrClient
+ (from, RPL_STATSLINKINFOZIP_MSG,
+ Client_ID(from), Client_Mask(cl),
+ Conn_SendQ(con), Conn_SendMsg(con),
+ Zip_SendBytes(con),
+ Conn_SendBytes(con),
+ Conn_RecvMsg(con),
+ Zip_RecvBytes(con),
+ Conn_RecvBytes(con),
+ (long)(time_now - Conn_StartTime(con))))
+ return DISCONNECTED;
continue;
- if (!IRC_WriteStrClient(from, RPL_STATSCOMMANDS_MSG, Client_ID(from),
- cmd->name, cmd->lcount, cmd->bytes, cmd->rcount))
- return DISCONNECTED;
+ }
+#endif
+ if (!IRC_WriteStrClient
+ (from, RPL_STATSLINKINFO_MSG,
+ Client_ID(from), Client_Mask(cl),
+ Conn_SendQ(con), Conn_SendMsg(con),
+ Conn_SendBytes(con), Conn_RecvMsg(con),
+ Conn_RecvBytes(con),
+ (long)(time_now - Conn_StartTime(con))))
+ return DISCONNECTED;
}
- break;
- case 'u': /* server uptime */
- case 'U':
- time_now = time(NULL) - NGIRCd_Start;
- days = uptime_days(&time_now);
- hrs = uptime_hrs(&time_now);
- mins = uptime_mins(&time_now);
- if (!IRC_WriteStrClient(from, RPL_STATSUPTIME, Client_ID(from),
- days, hrs, mins, (unsigned int) time_now))
- return DISCONNECTED;
- break;
+ }
+ break;
+ case 'm': /* IRC command status (usage count) */
+ case 'M':
+ cmd = Parse_GetCommandStruct();
+ for (; cmd->name; cmd++) {
+ if (cmd->lcount == 0 && cmd->rcount == 0)
+ continue;
+ if (!IRC_WriteStrClient
+ (from, RPL_STATSCOMMANDS_MSG, Client_ID(from),
+ cmd->name, cmd->lcount, cmd->bytes, cmd->rcount))
+ return DISCONNECTED;
+ }
+ break;
+ case 'u': /* Server uptime */
+ case 'U':
+ time_now = time(NULL) - NGIRCd_Start;
+ days = uptime_days(&time_now);
+ hrs = uptime_hrs(&time_now);
+ mins = uptime_mins(&time_now);
+ if (!IRC_WriteStrClient(from, RPL_STATSUPTIME, Client_ID(from),
+ days, hrs, mins, (unsigned int)time_now))
+ return DISCONNECTED;
+ break;
}
IRC_SetPenalty(from, 2);
- return IRC_WriteStrClient(from, RPL_ENDOFSTATS_MSG, Client_ID(from), query);
+ return IRC_WriteStrClient(from, RPL_ENDOFSTATS_MSG,
+ Client_ID(from), query);
} /* IRC_STATS */
assert( Client != NULL );
assert( Req != NULL );
- /* Falsche Anzahl Parameter? */
if( Req->argc > 1 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
- /* From aus Prefix ermitteln */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
if( Req->argc == 1 )
{
- /* an anderen Server forwarden */
target = Client_Search( Req->argv[0] );
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
if( target != Client_ThisServer( ))
{
- /* Ok, anderer Server ist das Ziel: forwarden */
return IRC_WriteStrClientPrefix( target, from, "TIME %s", Req->argv[0] );
}
}
} /* IRC_TIME */
+/**
+ * Handler for the IRC command "USERHOST".
+ * See RFC 2812 section 4.8.
+ */
GLOBAL bool
-IRC_USERHOST( CLIENT *Client, REQUEST *Req )
+IRC_USERHOST(CLIENT *Client, REQUEST *Req)
{
char rpl[COMMAND_LEN];
CLIENT *c;
int max, i;
- assert( Client != NULL );
- assert( Req != NULL );
-
- /* Falsche Anzahl Parameter? */
- if(( Req->argc < 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
+ assert(Client != NULL);
+ assert(Req != NULL);
- if( Req->argc > 5 ) max = 5;
- else max = Req->argc;
+ if ((Req->argc < 1))
+ return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
+ Client_ID(Client), Req->command);
- strlcpy( rpl, RPL_USERHOST_MSG, sizeof rpl );
- for( i = 0; i < max; i++ )
- {
- c = Client_Search( Req->argv[i] );
- if( c && ( Client_Type( c ) == CLIENT_USER ))
- {
- /* Dieser Nick ist "online" */
- strlcat( rpl, Client_ID( c ), sizeof( rpl ));
- if( Client_HasMode( c, 'o' )) strlcat( rpl, "*", sizeof( rpl ));
- strlcat( rpl, "=", sizeof( rpl ));
- if( Client_HasMode( c, 'a' )) strlcat( rpl, "-", sizeof( rpl ));
- else strlcat( rpl, "+", sizeof( rpl ));
- strlcat( rpl, Client_User( c ), sizeof( rpl ));
- strlcat( rpl, "@", sizeof( rpl ));
- strlcat( rpl, Client_Hostname( c ), sizeof( rpl ));
- strlcat( rpl, " ", sizeof( rpl ));
+ if (Req->argc > 5)
+ max = 5;
+ else
+ max = Req->argc;
+
+ strlcpy(rpl, RPL_USERHOST_MSG, sizeof rpl);
+ for (i = 0; i < max; i++) {
+ c = Client_Search(Req->argv[i]);
+ if (c && (Client_Type(c) == CLIENT_USER)) {
+ /* This Nick is "online" */
+ strlcat(rpl, Client_ID(c), sizeof(rpl));
+ if (Client_HasMode(c, 'o'))
+ strlcat(rpl, "*", sizeof(rpl));
+ strlcat(rpl, "=", sizeof(rpl));
+ if (Client_HasMode(c, 'a'))
+ strlcat(rpl, "-", sizeof(rpl));
+ else
+ strlcat(rpl, "+", sizeof(rpl));
+ strlcat(rpl, Client_User(c), sizeof(rpl));
+ strlcat(rpl, "@", sizeof(rpl));
+ strlcat(rpl, Client_HostnameCloaked(c), sizeof(rpl));
+ strlcat(rpl, " ", sizeof(rpl));
}
}
- ngt_TrimLastChr( rpl, ' ');
+ ngt_TrimLastChr(rpl, ' ');
- return IRC_WriteStrClient( Client, rpl, Client_ID( Client ) );
+ return IRC_WriteStrClient(Client, rpl, Client_ID(Client));
} /* IRC_USERHOST */
assert( Client != NULL );
assert( Req != NULL );
- /* Falsche Anzahl Parameter? */
if(( Req->argc > 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Ziel suchen */
static bool
write_whoreply(CLIENT *Client, CLIENT *c, const char *channelname, const char *flags)
{
- return IRC_WriteStrClient(Client, RPL_WHOREPLY_MSG, Client_ID(Client), channelname,
- Client_User(c), Client_Hostname(c), Client_ID(Client_Introducer(c)), Client_ID(c),
- flags, Client_Hops(c), Client_Info(c));
+ return IRC_WriteStrClient(Client, RPL_WHOREPLY_MSG, Client_ID(Client),
+ channelname, Client_User(c),
+ Client_HostnameCloaked(c),
+ Client_ID(Client_Introducer(c)), Client_ID(c),
+ flags, Client_Hops(c), Client_Info(c));
}
} /* IRC_WHO */
+/**
+ * Handler for the IRC "WHOIS" command.
+ *
+ * See RFC 2812, 3.6.2 "Whois query".
+ *
+ * @param Client The client from which this command has been received.
+ * @param Req Request structure with prefix and all parameters.
+ * @return CONNECTED or DISCONNECTED.
+ */
GLOBAL bool
IRC_WHOIS( CLIENT *Client, REQUEST *Req )
{
assert( Req != NULL );
/* Bad number of parameters? */
- if(( Req->argc < 1 ) || ( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
+ if (Req->argc < 1 || Req->argc > 2)
+ return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
+ Client_ID(Client), Req->command);
/* Search client */
- c = Client_Search( Req->argv[Req->argc - 1] );
- if(( ! c ) || ( Client_Type( c ) != CLIENT_USER )) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[Req->argc - 1] );
+ c = Client_Search(Req->argv[Req->argc - 1]);
+ if (!c || (Client_Type(c) != CLIENT_USER
+ && Client_Type(c) != CLIENT_SERVICE))
+ return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
+ Client_ID(Client),
+ Req->argv[Req->argc - 1]);
/* Search sender of the WHOIS */
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
if(( Client_NextHop( target ) != Client_ThisServer( )) && ( Client_Type( Client_NextHop( target )) == CLIENT_SERVER )) return IRC_WriteStrClientPrefix( target, from, "WHOIS %s :%s", Req->argv[0], Req->argv[1] );
- /* Nick, user and name */
- if( ! IRC_WriteStrClient( from, RPL_WHOISUSER_MSG, Client_ID( from ), Client_ID( c ), Client_User( c ), Client_Hostname( c ), Client_Info( c ))) return DISCONNECTED;
+ /* Nick, user, hostname and client info */
+ if (!IRC_WriteStrClient(from, RPL_WHOISUSER_MSG, Client_ID(from),
+ Client_ID(c), Client_User(c),
+ Client_HostnameCloaked(c), Client_Info(c)))
+ return DISCONNECTED;
/* Server */
if( ! IRC_WriteStrClient( from, RPL_WHOISSERVER_MSG, Client_ID( from ), Client_ID( c ), Client_ID( Client_Introducer( c )), Client_Info( Client_Introducer( c )))) return DISCONNECTED;
if( ! IRC_WriteStrClient( from, RPL_WHOISOPERATOR_MSG, Client_ID( from ), Client_ID( c ))) return DISCONNECTED;
}
+ /* Connected using SSL? */
+ if (Conn_UsesSSL(Client_Conn(c))) {
+ if (!IRC_WriteStrClient
+ (from, RPL_WHOISSSL_MSG, Client_ID(from), Client_ID(c)))
+ return DISCONNECTED;
+ }
+
/* Idle and signon time (local clients only!) */
if (Client_Conn(c) > NONE ) {
if (! IRC_WriteStrClient(from, RPL_WHOISIDLE_MSG,
if(! IRC_WriteStrClient(Client, RPL_NETUSERS_MSG, Client_ID(Client),
cnt, max, cnt, max))
return DISCONNECTED;
+ /* Connection counters */
+ if (! IRC_WriteStrClient(Client, RPL_STATSCONN_MSG, Client_ID(Client),
+ Conn_CountMax(), Conn_CountAccepted()))
+ return DISCONNECTED;
#endif
return CONNECTED;
return ret;
}
#else
-static inline bool Show_MOTD_SSLInfo(UNUSED CLIENT *c) { return true; }
+static inline bool
+Show_MOTD_SSLInfo(UNUSED CLIENT *c)
+{ return true; }
#endif
GLOBAL bool
IRC_Show_MOTD( CLIENT *Client )
{
- char line[127];
- FILE *fd;
+ const char *line;
+ size_t len_tot, len_str;
assert( Client != NULL );
- if (Conf_MotdPhrase[0]) {
- if (!Show_MOTD_Start(Client))
- return DISCONNECTED;
- if (!Show_MOTD_Sendline(Client, Conf_MotdPhrase))
- return DISCONNECTED;
- goto out;
- }
+ len_tot = array_bytes(&Conf_Motd);
+ if (len_tot == 0 && !Conn_UsesSSL(Client_Conn(Client)))
+ return IRC_WriteStrClient(Client, ERR_NOMOTD_MSG, Client_ID(Client));
- fd = fopen( Conf_MotdFile, "r" );
- if( ! fd ) {
- Log( LOG_WARNING, "Can't read MOTD file \"%s\": %s", Conf_MotdFile, strerror( errno ));
- if (Conn_UsesSSL(Client_Conn(Client))) {
- if (!Show_MOTD_Start(Client))
- return DISCONNECTED;
- goto out;
- }
- return IRC_WriteStrClient( Client, ERR_NOMOTD_MSG, Client_ID( Client ) );
- }
+ if (!Show_MOTD_Start(Client))
+ return DISCONNECTED;
- if (!Show_MOTD_Start( Client )) {
- fclose(fd);
- return false;
- }
+ line = array_start(&Conf_Motd);
+ while (len_tot > 0) {
+ len_str = strlen(line) + 1;
- while (fgets( line, (int)sizeof line, fd )) {
- ngt_TrimLastChr( line, '\n');
+ assert(len_tot >= len_str);
+ len_tot -= len_str;
- if( ! Show_MOTD_Sendline( Client, line)) {
- fclose( fd );
- return false;
- }
+ if (!Show_MOTD_Sendline(Client, line))
+ return DISCONNECTED;
+ line += len_str;
}
- fclose(fd);
-out:
+
if (!Show_MOTD_SSLInfo(Client))
return DISCONNECTED;
return Show_MOTD_End(Client);
} /* IRC_Send_NAMES */
-
/**
* Send the ISUPPORT numeric (005).
* This numeric indicates the features that are supported by this server.
* See <http://www.irc.org/tech_docs/005.html> for details.
*/
GLOBAL bool
-IRC_Send_ISUPPORT PARAMS((CLIENT * Client))
+IRC_Send_ISUPPORT(CLIENT * Client)
{
if (!IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client),
Conf_MaxJoins))