#include "portab.h"
-static char UNUSED id[] = "$Id: irc-info.c,v 1.29 2005/05/16 12:25:15 alex Exp $";
+static char UNUSED id[] = "$Id: irc-info.c,v 1.40 2007/11/21 12:16:36 alex Exp $";
#include "imp.h"
#include <assert.h>
/* Falsche Anzahl Parameter? */
if(( Req->argc < 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
- strcpy( rpl, RPL_ISON_MSG );
+ strlcpy( rpl, RPL_ISON_MSG, sizeof rpl );
for( i = 0; i < Req->argc; i++ )
{
ptr = strtok( Req->argv[i], " " );
con = Conn_First( );
while( con != NONE )
{
- cl = Client_GetFromConn( con );
+ cl = Conn_GetClient( con );
if( cl && (( Client_Type( cl ) == CLIENT_SERVER ) || ( cl == Client )))
{
/* Server link or our own connection */
if( Req->argc > 5 ) max = 5;
else max = Req->argc;
- strcpy( rpl, RPL_USERHOST_MSG );
+ strlcpy( rpl, RPL_USERHOST_MSG, sizeof rpl );
for( i = 0; i < max; i++ )
{
c = Client_Search( Req->argv[i] );
IRC_WHO( CLIENT *Client, REQUEST *Req )
{
bool ok, only_ops;
- char flags[8], *ptr;
+ char flags[8];
+ const char *ptr;
CL2CHAN *cl2chan;
CHANNEL *chan, *cn;
CLIENT *c;
if( ! IRC_WriteStrClient( from, RPL_WHOISOPERATOR_MSG, Client_ID( from ), Client_ID( c ))) return DISCONNECTED;
}
- /* Idle (only local clients) */
- if( Client_Conn( c ) > NONE )
- {
- if( ! IRC_WriteStrClient( from, RPL_WHOISIDLE_MSG, Client_ID( from ), Client_ID( c ), Conn_GetIdle( Client_Conn ( c )))) return DISCONNECTED;
+ /* Idle and signon time (local clients only!) */
+ if (Client_Conn(c) > NONE ) {
+ if (! IRC_WriteStrClient(from, RPL_WHOISIDLE_MSG,
+ Client_ID(from), Client_ID(c),
+ (unsigned long)Conn_GetIdle(Client_Conn(c)),
+ (unsigned long)Conn_GetSignon(Client_Conn(c))))
+ return DISCONNECTED;
}
/* Away? */
GLOBAL bool
IRC_Send_LUSERS( CLIENT *Client )
{
- long cnt;
+ unsigned long cnt;
+#ifndef STRICT_RFC
+ unsigned long max;
+#endif
assert( Client != NULL );
#ifndef STRICT_RFC
/* Maximum number of local users */
- if( ! IRC_WriteStrClient( Client, RPL_LOCALUSERS_MSG, Client_ID( Client ), Client_MyUserCount( ), Client_MyMaxUserCount( ))) return DISCONNECTED;
+ cnt = Client_MyUserCount();
+ max = Client_MyMaxUserCount();
+ if (! IRC_WriteStrClient(Client, RPL_LOCALUSERS_MSG, Client_ID(Client),
+ cnt, max, cnt, max))
+ return DISCONNECTED;
/* Maximum number of users in the network */
- if( ! IRC_WriteStrClient( Client, RPL_NETUSERS_MSG, Client_ID( Client ), Client_UserCount( ), Client_MaxUserCount( ))) return DISCONNECTED;
+ cnt = Client_UserCount();
+ max = Client_MaxUserCount();
+ if(! IRC_WriteStrClient(Client, RPL_NETUSERS_MSG, Client_ID(Client),
+ cnt, max, cnt, max))
+ return DISCONNECTED;
#endif
return CONNECTED;
} /* IRC_Send_LUSERS */
+static bool
+Show_MOTD_Start(CLIENT *Client)
+{
+ return IRC_WriteStrClient(Client, RPL_MOTDSTART_MSG,
+ Client_ID( Client ), Client_ID( Client_ThisServer( )));
+}
+
+static bool
+Show_MOTD_Sendline(CLIENT *Client, const char *msg)
+{
+ return IRC_WriteStrClient(Client, RPL_MOTD_MSG, Client_ID( Client ), msg);
+}
+
+static bool
+Show_MOTD_End(CLIENT *Client)
+{
+ return IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ));
+}
+
+
GLOBAL bool
IRC_Show_MOTD( CLIENT *Client )
{
- bool ok;
char line[127];
FILE *fd;
assert( Client != NULL );
- if( Conf_MotdPhrase[0] )
- {
- if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED;
- if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), Conf_MotdPhrase )) return DISCONNECTED;
- return IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ));
+ if (Conf_MotdPhrase[0]) {
+ if (!Show_MOTD_Start(Client))
+ return DISCONNECTED;
+ if (!Show_MOTD_Sendline(Client, Conf_MotdPhrase))
+ return DISCONNECTED;
+
+ return Show_MOTD_End(Client);
}
fd = fopen( Conf_MotdFile, "r" );
- if( ! fd )
- {
+ if( ! fd ) {
Log( LOG_WARNING, "Can't read MOTD file \"%s\": %s", Conf_MotdFile, strerror( errno ));
return IRC_WriteStrClient( Client, ERR_NOMOTD_MSG, Client_ID( Client ) );
}
- if( ! IRC_WriteStrClient( Client, RPL_MOTDSTART_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return DISCONNECTED;
- while( true )
- {
- if( ! fgets( line, sizeof( line ), fd )) break;
+ if (!Show_MOTD_Start( Client )) {
+ fclose(fd);
+ return false;
+ }
+ while (fgets( line, (int)sizeof line, fd )) {
ngt_TrimLastChr( line, '\n');
- if( ! IRC_WriteStrClient( Client, RPL_MOTD_MSG, Client_ID( Client ), line ))
- {
+ if( ! Show_MOTD_Sendline( Client, line)) {
fclose( fd );
return false;
}
}
- ok = IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ) );
-
- fclose( fd );
-
- return ok;
+ fclose(fd);
+ return Show_MOTD_End(Client);
} /* IRC_Show_MOTD */
} /* IRC_Send_WHO */
+/**
+ * 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))
+{
+ if (!IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client),
+ Conf_MaxJoins))
+ return DISCONNECTED;
+ return IRC_WriteStrClient(Client, RPL_ISUPPORT2_MSG, Client_ID(Client),
+ CHANNEL_NAME_LEN - 1, Conf_MaxNickLength - 1,
+ COMMAND_LEN - 23, CLIENT_AWAY_LEN - 1,
+ COMMAND_LEN - 113);
+} /* IRC_Send_ISUPPORT */
+
+
/* -eof- */