]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-info.c
Introduce option to configure the maximum nick name lenth in ngircd.conf
[ngircd-alex.git] / src / ngircd / irc-info.c
index 37afbd3c8da11e9fbf7fdc5e146dfe1a12d49abe..683f7d1b04b8a79f0f3ff04f2d94771c14270ee4 100644 (file)
@@ -14,7 +14,7 @@
 
 #include "portab.h"
 
-static char UNUSED id[] = "$Id: irc-info.c,v 1.33 2006/05/10 21:24:01 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>
@@ -542,7 +542,8 @@ GLOBAL bool
 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;
@@ -706,10 +707,13 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
                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? */
@@ -832,7 +836,10 @@ IRC_WHOWAS( CLIENT *Client, REQUEST *Req )
 GLOBAL bool
 IRC_Send_LUSERS( CLIENT *Client )
 {
-       long cnt;
+       unsigned long cnt;
+#ifndef STRICT_RFC
+       unsigned long max;
+#endif
 
        assert( Client != NULL );
 
@@ -861,27 +868,38 @@ IRC_Send_LUSERS( CLIENT *Client )
 
 #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)
+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)
+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)
+static bool
+Show_MOTD_End(CLIENT *Client)
 {
        return IRC_WriteStrClient( Client, RPL_ENDOFMOTD_MSG, Client_ID( Client ));
 }
@@ -910,8 +928,10 @@ IRC_Show_MOTD( CLIENT *Client )
                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;
+       }
 
        while (fgets( line, (int)sizeof line, fd )) {
                ngt_TrimLastChr( line, '\n');
@@ -1030,4 +1050,22 @@ IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, bool OnlyOps )
 } /* 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- */