X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc.c;h=716d52c0ee2259fdf94e2bba134f61e3a00c8f2b;hb=773d886df66e11359e840f42899aee21d03b34e5;hp=8a177c82db28ce7ceba9af5c136b03a8de7db601;hpb=7de46835068159cfc9447221e5100102ace4c5a8;p=ngircd-alex.git diff --git a/src/ngircd/irc.c b/src/ngircd/irc.c index 8a177c82..716d52c0 100644 --- a/src/ngircd/irc.c +++ b/src/ngircd/irc.c @@ -9,67 +9,15 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: irc.c,v 1.85 2002/03/03 19:44:30 alex Exp $ + * $Id: irc.c,v 1.89 2002/03/25 17:04:02 alex Exp $ * * irc.c: IRC-Befehle - * - * $Log: irc.c,v $ - * Revision 1.85 2002/03/03 19:44:30 alex - * - WHO implementiert (bisher ohne Unterstuetzung von Masks) - * - * Revision 1.84 2002/03/03 17:15:11 alex - * - Source in weitere Module fuer IRC-Befehle aufgesplitted. - * - * Revision 1.83 2002/02/28 00:48:26 alex - * - Forwarding von TOPIC an andere Server gefixed. Hoffentlich ;-) - * - * Revision 1.82 2002/02/27 23:26:36 alex - * - einige Funktionen in irc-xxx-Module ausgegliedert. - * - * Revision 1.81 2002/02/27 20:55:44 alex - * - Channel-Topics werden nun auch korrekt von anderen Server angenommen. - * - * Revision 1.80 2002/02/27 20:33:13 alex - * - Channel-Topics implementiert. - * - * Revision 1.79 2002/02/27 18:57:21 alex - * - PRIVMSG zeugt nun bei Texten an User an, wenn diese "away" sind. - * - * Revision 1.78 2002/02/27 18:23:45 alex - * - IRC-Befehl "AWAY" implementert. - * - * Revision 1.77 2002/02/27 17:05:41 alex - * - PRIVMSG beachtet nun die Channel-Modes "n" und "m". - * - * Revision 1.76 2002/02/27 16:04:14 alex - * - Bug bei belegtem Nickname bei User-Registrierung (NICK-Befehl) behoben. - * - * Revision 1.75 2002/02/27 15:23:27 alex - * - NAMES beachtet nun das "invisible" Flag ("i") von Usern. - * - * Revision 1.74 2002/02/27 03:44:53 alex - * - gerade eben in SQUIT eingefuehrten Bug behoben: entfernte Server werden nun - * nur noch geloescht, die Verbindung, von der SQUIT kam, bleibt wieder offen. - * - * Revision 1.73 2002/02/27 03:08:05 alex - * - Log-Meldungen bei SQUIT erneut ueberarbeitet ... - * - * Revision 1.72 2002/02/27 02:26:58 alex - * - SQUIT wird auf jeden Fall geforwarded, zudem besseres Logging. - * - * Revision 1.71 2002/02/27 00:50:05 alex - * - einige unnoetige Client_NextHop()-Aufrufe entfernt. - * - NAMES korrigiert und komplett implementiert. - * - * Revision 1.70 2002/02/26 22:06:40 alex - * - Nick-Aenderungen werden nun wieder korrekt ins Logfile geschrieben. */ -#include -#include "global.h" +#include "portab.h" -#include +#include "imp.h" #include #include #include @@ -86,7 +34,7 @@ #include "messages.h" #include "tool.h" -#include +#include "exp.h" #include "irc.h" @@ -106,7 +54,6 @@ GLOBAL BOOLEAN IRC_MOTD( CLIENT *Client, REQUEST *Req ) GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req ) { - BOOLEAN is_member, has_voice, is_op, ok; CLIENT *cl, *from; CHANNEL *chan; @@ -120,7 +67,7 @@ GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req ) if( Req->argc == 1 ) return IRC_WriteStrClient( Client, ERR_NOTEXTTOSEND_MSG, Client_ID( Client )); if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); - if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix ); + 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 ); @@ -140,28 +87,7 @@ GLOBAL BOOLEAN IRC_PRIVMSG( CLIENT *Client, REQUEST *Req ) } chan = Channel_Search( Req->argv[0] ); - if( chan ) - { - /* Okay, Ziel ist ein Channel */ - is_member = has_voice = is_op = FALSE; - if( Channel_IsMemberOf( chan, from )) - { - is_member = TRUE; - if( strchr( Channel_UserModes( chan, from ), 'v' )) has_voice = TRUE; - if( strchr( Channel_UserModes( chan, from ), 'o' )) is_op = TRUE; - } - - /* pruefen, ob Client in Channel schreiben darf */ - ok = TRUE; - if( strchr( Channel_Modes( chan ), 'n' ) && ( ! is_member )) ok = FALSE; - if( strchr( Channel_Modes( chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = FALSE; - - if( ! ok ) return IRC_WriteStrClient( from, ERR_CANNOTSENDTOCHAN_MSG, Client_ID( from ), Req->argv[0] ); - - /* Text senden */ - if( Client_Conn( from ) > NONE ) Conn_UpdateIdle( Client_Conn( from )); - return IRC_WriteStrChannelPrefix( Client, chan, from, TRUE, "PRIVMSG %s :%s", Req->argv[0], Req->argv[1] ); - } + if( chan ) return Channel_Write( chan, from, Client, Req->argv[1] ); return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( from ), Req->argv[0] ); } /* IRC_PRIVMSG */ @@ -179,7 +105,7 @@ GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req ) /* Falsche Anzahl Parameter? */ if( Req->argc != 2 ) return CONNECTED; - if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix ); + 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 ); @@ -208,14 +134,14 @@ GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req ) if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); /* From aus Prefix ermitteln */ - if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix ); + if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix ); else from = Client; if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); if( Req->argc == 2 ) { /* an anderen Server forwarden */ - target = Client_GetFromID( Req->argv[1] ); + target = Client_Search( Req->argv[1] ); if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] ); if( target != Client_ThisServer( )) @@ -310,7 +236,7 @@ GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req ) while( ptr ) { ngt_TrimStr( ptr ); - c = Client_GetFromID( ptr ); + c = Client_Search( ptr ); if( c && ( Client_Type( c ) == CLIENT_USER )) { /* Dieser Nick ist "online" */ @@ -342,11 +268,11 @@ GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req ) if(( Req->argc < 1 ) || ( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); /* Client suchen */ - c = Client_GetFromID( Req->argv[Req->argc - 1] ); + 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] ); /* Empfaenger des WHOIS suchen */ - if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix ); + 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 ); @@ -354,7 +280,7 @@ GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req ) if( Req->argc > 1 ) { /* angegebenen Ziel-Server suchen */ - target = Client_GetFromID( Req->argv[1] ); + target = Client_Search( Req->argv[1] ); if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG, Client_ID( from ), Req->argv[1] ); ptr = Req->argv[1]; } @@ -380,8 +306,8 @@ GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req ) /* Channel-Name anhaengen */ if( str[strlen( str ) - 1] != ':' ) strcat( str, " " ); - if( strchr( Channel_UserModes( chan, c ), 'v' )) strcat( str, "+" ); if( strchr( Channel_UserModes( chan, c ), 'o' )) strcat( str, "@" ); + else if( strchr( Channel_UserModes( chan, c ), 'v' )) strcat( str, "+" ); strcat( str, Channel_Name( chan )); if( strlen( str ) > ( LINE_LEN - CHANNEL_NAME_LEN - 4 )) @@ -426,9 +352,9 @@ GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req ) GLOBAL BOOLEAN IRC_WHO( CLIENT *Client, REQUEST *Req ) { BOOLEAN ok, only_ops; + CHAR flags[8], *ptr; CL2CHAN *cl2chan; CHANNEL *chan; - CHAR flags[8]; CLIENT *c; assert( Client != NULL ); @@ -484,7 +410,9 @@ GLOBAL BOOLEAN IRC_WHO( CLIENT *Client, REQUEST *Req ) /* ausgeben */ cl2chan = Channel_FirstChannelOf( c ); - if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), chan ? Channel_Name( Channel_GetChannel( cl2chan )) : "*", Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED; + if( cl2chan ) ptr = Channel_Name( Channel_GetChannel( cl2chan )); + else ptr = "*"; + if( ! IRC_WriteStrClient( Client, RPL_WHOREPLY_MSG, Client_ID( Client ), ptr, Client_User( c ), Client_Hostname( c ), Client_ID( Client_Introducer( c )), Client_ID( c ), flags, Client_Hops( c ), Client_Info( c ))) return DISCONNECTED; } } @@ -518,7 +446,7 @@ GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req ) strcpy( rpl, RPL_USERHOST_MSG ); for( i = 0; i < max; i++ ) { - c = Client_GetFromID( Req->argv[i] ); + c = Client_Search( Req->argv[i] ); if( c && ( Client_Type( c ) == CLIENT_USER )) { /* Dieser Nick ist "online" */ @@ -564,20 +492,20 @@ GLOBAL BOOLEAN IRC_LUSERS( CLIENT *Client, REQUEST *Req ) if(( Req->argc > 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); /* Absender ermitteln */ - if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix ); + 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 ); /* An anderen Server forwarden? */ if( Req->argc == 2 ) { - target = Client_GetFromID( Req->argv[1] ); + target = Client_Search( Req->argv[1] ); if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] ); else if( target != Client_ThisServer( )) return IRC_WriteStrClientPrefix( target, from, "LUSERS %s %s", Req->argv[0], Req->argv[1] ); } /* Wer ist der Absender? */ - if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_GetFromID( Req->prefix ); + if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix ); else target = Client; if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); @@ -605,20 +533,20 @@ GLOBAL BOOLEAN IRC_LINKS( CLIENT *Client, REQUEST *Req ) else mask = "*"; /* Absender ermitteln */ - if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix ); + 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 ); /* An anderen Server forwarden? */ if( Req->argc == 2 ) { - target = Client_GetFromID( Req->argv[0] ); + target = Client_Search( Req->argv[0] ); if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] ); else if( target != Client_ThisServer( )) return IRC_WriteStrClientPrefix( target, from, "LINKS %s %s", Req->argv[0], Req->argv[1] ); } /* Wer ist der Absender? */ - if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_GetFromID( Req->prefix ); + if( Client_Type( Client ) == CLIENT_SERVER ) target = Client_Search( Req->prefix ); else target = Client; if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix ); @@ -647,11 +575,11 @@ GLOBAL BOOLEAN IRC_VERSION( CLIENT *Client, REQUEST *Req ) if(( Req->argc > 1 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); /* Ziel suchen */ - if( Req->argc == 1 ) target = Client_GetFromID( Req->argv[0] ); + if( Req->argc == 1 ) target = Client_Search( Req->argv[0] ); else target = Client_ThisServer( ); /* Prefix ermitteln */ - if( Client_Type( Client ) == CLIENT_SERVER ) prefix = Client_GetFromID( Req->prefix ); + if( Client_Type( Client ) == CLIENT_SERVER ) prefix = Client_Search( Req->prefix ); else prefix = Client; if( ! prefix ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix ); @@ -682,7 +610,7 @@ GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req ) /* Falsche Anzahl Parameter? */ if(( Req->argc != 2 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command ); - prefix = Client_GetFromID( Req->prefix ); + prefix = Client_Search( Req->prefix ); if( ! prefix ) { Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!", Req->prefix ); @@ -695,7 +623,7 @@ GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req ) IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s", Req->argv[0], Req->argv[1] ); /* haben wir selber einen solchen Client? */ - c = Client_GetFromID( Req->argv[0] ); + c = Client_Search( Req->argv[0] ); if( c && ( Client_Conn( c ) != NONE )) Conn_Close( Client_Conn( c ), NULL, Req->argv[1], TRUE ); return CONNECTED; @@ -763,8 +691,8 @@ GLOBAL BOOLEAN IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan ) { /* Nick anhaengen */ if( str[strlen( str ) - 1] != ':' ) strcat( str, " " ); - if( strchr( Channel_UserModes( Chan, cl ), 'v' )) strcat( str, "+" ); if( strchr( Channel_UserModes( Chan, cl ), 'o' )) strcat( str, "@" ); + else if( strchr( Channel_UserModes( Chan, cl ), 'v' )) strcat( str, "+" ); strcat( str, Client_ID( cl )); if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 )) @@ -815,8 +743,8 @@ GLOBAL BOOLEAN IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ) /* Flags zusammenbasteln */ strcpy( flags, "H" ); if( strchr( Client_Modes( c ), 'o' )) strcat( flags, "*" ); - if( strchr( Channel_UserModes( Chan, c ), 'v' )) strcat( flags, "+" ); if( strchr( Channel_UserModes( Chan, c ), 'o' )) strcat( flags, "@" ); + else if( strchr( Channel_UserModes( Chan, c ), 'v' )) strcat( flags, "+" ); /* ausgeben */ if(( ! OnlyOps ) || ( strchr( Client_Modes( c ), 'o' )))