diff -ur ngircd/src/ngircd/defines.h ngircd-fw/src/ngircd/defines.h --- ngircd/src/ngircd/defines.h 2004-05-07 13:19:21.000000000 +0200 +++ ngircd-fw/src/ngircd/defines.h 2005-01-16 01:23:27.920667128 +0100 @@ -49,7 +49,7 @@ #define CLIENT_FLAGS_LEN 100 /* max. Laenger der Client-Flags */ #define CHANNEL_NAME_LEN 51 /* max. Laenge eines Channel-Namens, vgl. RFC 2812, 1.3 */ -#define CHANNEL_MODE_LEN 8 /* max. Laenge der Channel-Modes */ +#define CHANNEL_MODE_LEN 9 /* max. Laenge der Channel-Modes */ #define CHANNEL_TOPIC_LEN 128 /* max. Laenge eines Channel-Topics */ #define COMMAND_LEN 513 /* max. Laenge eines Befehls, vgl. RFC 2812, 3.2 */ diff -ur ngircd/src/ngircd/irc-channel.c ngircd-fw/src/ngircd/irc-channel.c --- ngircd/src/ngircd/irc-channel.c 2004-04-09 22:46:48.000000000 +0200 +++ ngircd-fw/src/ngircd/irc-channel.c 2005-01-16 01:49:19.552783192 +0100 @@ -357,7 +357,12 @@ if( Match( pattern, Channel_Name( chan ))) { /* Treffer! */ - if( ! IRC_WriteStrClient( from, RPL_LIST_MSG, from, Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED; + if ( (! strchr( Channel_Modes( Chan ), 's' ) ) || + ( Channel_IsMemberOf( Chan, from )) ) + { + + if ( ! IRC_WriteStrClient( from, RPL_LIST_MSG, from, Channel_Name( chan ), Channel_MemberCount( chan ), Channel_Topic( chan ))) return DISCONNECTED; + } } chan = Channel_Next( chan ); } diff -ur ngircd/src/ngircd/irc-mode.c ngircd-fw/src/ngircd/irc-mode.c --- ngircd/src/ngircd/irc-mode.c 2004-04-25 17:42:05.000000000 +0200 +++ ngircd-fw/src/ngircd/irc-mode.c 2005-01-16 01:24:42.986255424 +0100 @@ -395,6 +395,11 @@ else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); break; + case 's': + /* secret, doesnt show up in /LIST if user is not on channel */ + if( modeok ) x[0] = 's'; + else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel )); + break; /* Channel user modes */ case 'o': /* Channel operator */