X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc.c;h=4ec0427f2ff3cb197d3effffdf751d9aace0763f;hb=40ebd4704a04a01be9e36fdbbff5e0c93b2bc71d;hp=c22b867bd059410645ccd9f387f16073dc6b0926;hpb=ca33cbda05902b0009058d369f88c0a7a43b1bbe;p=ngircd-alex.git diff --git a/src/ngircd/irc.c b/src/ngircd/irc.c index c22b867b..4ec0427f 100644 --- a/src/ngircd/irc.c +++ b/src/ngircd/irc.c @@ -9,7 +9,7 @@ * 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.88 2002/03/12 14:37:52 alex Exp $ + * $Id: irc.c,v 1.94 2002/07/25 11:37:01 alex Exp $ * * irc.c: IRC-Befehle */ @@ -25,20 +25,24 @@ #include #include "ngircd.h" -#include "channel.h" +#include "conn.h" #include "client.h" +#include "channel.h" +#include "resolve.h" #include "conf.h" #include "conn.h" #include "irc-write.h" #include "log.h" #include "messages.h" +#include "parse.h" #include "tool.h" #include "exp.h" #include "irc.h" -GLOBAL BOOLEAN IRC_MOTD( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_MOTD( CLIENT *Client, REQUEST *Req ) { assert( Client != NULL ); assert( Req != NULL ); @@ -52,9 +56,9 @@ GLOBAL BOOLEAN IRC_MOTD( CLIENT *Client, REQUEST *Req ) } /* IRC_MOTD */ -GLOBAL BOOLEAN IRC_PRIVMSG( 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; @@ -68,13 +72,16 @@ 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 ); cl = Client_Search( Req->argv[0] ); if( cl ) { + /* Okay, Ziel ist ein Client. Aber ist es auch ein User? */ + if( Client_Type( cl ) != CLIENT_USER ) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( from ), Req->argv[0] ); + /* Okay, Ziel ist ein User */ if(( Client_Type( Client ) != CLIENT_SERVER ) && ( strchr( Client_Modes( cl ), 'a' ))) { @@ -88,34 +95,14 @@ 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 */ -GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_NOTICE( CLIENT *Client, REQUEST *Req ) { CLIENT *to, *from; @@ -127,12 +114,12 @@ 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 ); to = Client_Search( Req->argv[0] ); - if( to ) + if(( to ) && ( Client_Type( to ) == CLIENT_USER )) { /* Okay, Ziel ist ein User */ return IRC_WriteStrClientPrefix( to, from, "NOTICE %s :%s", Client_ID( to ), Req->argv[1] ); @@ -141,7 +128,8 @@ GLOBAL BOOLEAN IRC_NOTICE( CLIENT *Client, REQUEST *Req ) } /* IRC_NOTICE */ -GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_NAMES( CLIENT *Client, REQUEST *Req ) { CHAR rpl[COMMAND_LEN], *ptr; CLIENT *target, *from, *c; @@ -156,14 +144,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( )) @@ -236,7 +224,8 @@ GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req ) } /* IRC_NAMES */ -GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_ISON( CLIENT *Client, REQUEST *Req ) { CHAR rpl[COMMAND_LEN]; CLIENT *c; @@ -258,7 +247,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" */ @@ -274,7 +263,8 @@ GLOBAL BOOLEAN IRC_ISON( CLIENT *Client, REQUEST *Req ) } /* IRC_ISON */ -GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_WHOIS( CLIENT *Client, REQUEST *Req ) { CLIENT *from, *target, *c; CHAR str[LINE_LEN + 1], *ptr = NULL; @@ -290,11 +280,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 ); @@ -302,7 +292,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]; } @@ -371,7 +361,8 @@ GLOBAL BOOLEAN IRC_WHOIS( CLIENT *Client, REQUEST *Req ) } /* IRC_WHOIS */ -GLOBAL BOOLEAN IRC_WHO( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_WHO( CLIENT *Client, REQUEST *Req ) { BOOLEAN ok, only_ops; CHAR flags[8], *ptr; @@ -448,7 +439,8 @@ GLOBAL BOOLEAN IRC_WHO( CLIENT *Client, REQUEST *Req ) } /* IRC_WHO */ -GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_USERHOST( CLIENT *Client, REQUEST *Req ) { CHAR rpl[COMMAND_LEN]; CLIENT *c; @@ -468,7 +460,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" */ @@ -489,7 +481,8 @@ GLOBAL BOOLEAN IRC_USERHOST( CLIENT *Client, REQUEST *Req ) } /* IRC_USERHOST */ -GLOBAL BOOLEAN IRC_ERROR( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_ERROR( CLIENT *Client, REQUEST *Req ) { assert( Client != NULL ); assert( Req != NULL ); @@ -501,7 +494,8 @@ GLOBAL BOOLEAN IRC_ERROR( CLIENT *Client, REQUEST *Req ) } /* IRC_ERROR */ -GLOBAL BOOLEAN IRC_LUSERS( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_LUSERS( CLIENT *Client, REQUEST *Req ) { CLIENT *target, *from; @@ -514,20 +508,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 ); @@ -537,7 +531,8 @@ GLOBAL BOOLEAN IRC_LUSERS( CLIENT *Client, REQUEST *Req ) } /* IRC_LUSERS */ -GLOBAL BOOLEAN IRC_LINKS( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_LINKS( CLIENT *Client, REQUEST *Req ) { CLIENT *target, *from, *c; CHAR *mask; @@ -555,20 +550,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 ); @@ -586,7 +581,8 @@ GLOBAL BOOLEAN IRC_LINKS( CLIENT *Client, REQUEST *Req ) } /* IRC_LINKS */ -GLOBAL BOOLEAN IRC_VERSION( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_VERSION( CLIENT *Client, REQUEST *Req ) { CLIENT *target, *prefix; @@ -597,11 +593,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 ); @@ -616,11 +612,12 @@ GLOBAL BOOLEAN IRC_VERSION( CLIENT *Client, REQUEST *Req ) } /* mit Versionsinfo antworten */ - return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( )); + return IRC_WriteStrClient( Client, RPL_VERSION_MSG, Client_ID( prefix ), PACKAGE, VERSION, NGIRCd_DebugLevel, Conf_ServerName, NGIRCd_VersionAddition( )); } /* IRC_VERSION */ -GLOBAL BOOLEAN IRC_KILL( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_KILL( CLIENT *Client, REQUEST *Req ) { CLIENT *prefix, *c; @@ -632,7 +629,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 ); @@ -645,14 +642,21 @@ 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] ); - if( c && ( Client_Conn( c ) != NONE )) Conn_Close( Client_Conn( c ), NULL, Req->argv[1], TRUE ); - + c = Client_Search( Req->argv[0] ); + if( c ) + { + /* Ja, wir haben einen solchen Client */ + if( Client_Conn( c ) != NONE ) Conn_Close( Client_Conn( c ), NULL, Req->argv[1], TRUE ); + else Client_Destroy( c, NULL, Req->argv[1], TRUE ); + } + else Log( LOG_NOTICE, "Client with nick \"%s\" is unknown here.", Req->argv[0] ); + return CONNECTED; } /* IRC_KILL */ -GLOBAL BOOLEAN IRC_Show_MOTD( CLIENT *Client ) +GLOBAL BOOLEAN +IRC_Show_MOTD( CLIENT *Client ) { BOOLEAN ok; CHAR line[127]; @@ -686,7 +690,8 @@ GLOBAL BOOLEAN IRC_Show_MOTD( CLIENT *Client ) } /* IRC_Show_MOTD */ -GLOBAL BOOLEAN IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan ) +GLOBAL BOOLEAN +IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan ) { BOOLEAN is_visible, is_member; CHAR str[LINE_LEN + 1]; @@ -738,7 +743,8 @@ GLOBAL BOOLEAN IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan ) } /* IRC_Send_NAMES */ -GLOBAL BOOLEAN IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ) +GLOBAL BOOLEAN +IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ) { BOOLEAN is_visible, is_member; CL2CHAN *cl2chan; @@ -782,7 +788,8 @@ GLOBAL BOOLEAN IRC_Send_WHO( CLIENT *Client, CHANNEL *Chan, BOOLEAN OnlyOps ) } /* IRC_Send_WHO */ -GLOBAL BOOLEAN IRC_Send_LUSERS( CLIENT *Client ) +GLOBAL BOOLEAN +IRC_Send_LUSERS( CLIENT *Client ) { INT cnt;