]> arthur.barton.de Git - ngircd-alex.git/commitdiff
Fixed abort() when inviting users to nonexistent channels.
authorAlexander Barton <alex@barton.de>
Fri, 5 Dec 2003 11:57:28 +0000 (11:57 +0000)
committerAlexander Barton <alex@barton.de>
Fri, 5 Dec 2003 11:57:28 +0000 (11:57 +0000)
src/ngircd/irc-op.c

index bdb6d83056039370ed8c82eb68bbeef95294e221..648da5c3c24d051961f3b39555f6bd18ff94a5af 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
+ * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de)
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
 
 #include "portab.h"
 
 
 #include "portab.h"
 
-static char UNUSED id[] = "$Id: irc-op.c,v 1.11 2002/12/12 12:24:18 alex Exp $";
+static char UNUSED id[] = "$Id: irc-op.c,v 1.12 2003/12/05 11:57:28 alex Exp $";
 
 #include "imp.h"
 #include <assert.h>
 
 #include "imp.h"
 #include <assert.h>
@@ -69,14 +69,14 @@ IRC_INVITE( CLIENT *Client, REQUEST *Req )
        assert( Client != NULL );
        assert( Req != NULL );
 
        assert( Client != NULL );
        assert( Req != NULL );
 
-       /* Falsche Anzahl Parameter? */
+       /* Wrong number of parameters? */
        if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 
        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 );
        
        if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
 
        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 );
        
-       /* User suchen */
+       /* Search user */
        target = Client_Search( Req->argv[0] );
        if(( ! target ) || ( Client_Type( target ) != CLIENT_USER )) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
 
        target = Client_Search( Req->argv[0] );
        if(( ! target ) || ( Client_Type( target ) != CLIENT_USER )) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
 
@@ -84,36 +84,38 @@ IRC_INVITE( CLIENT *Client, REQUEST *Req )
 
        if( chan )
        {
 
        if( chan )
        {
-               /* Der Channel existiert bereits; ist der User Mitglied? */
+               /* Channel exists. Is the user a valid member of the channel? */
                if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( Client ), Req->argv[1] );
 
                if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( Client ), Req->argv[1] );
 
-               /* Ist der Channel "invite-only"? */
+               /* Is the channel "invite-only"? */
                if( strchr( Channel_Modes( chan ), 'i' ))
                {
                if( strchr( Channel_Modes( chan ), 'i' ))
                {
-                       /* Ja. Der User muss Channel-Operator sein! */
+                       /* Yes. The user must be channel operator! */
                        if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
                        remember = TRUE;
                }
 
                        if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
                        remember = TRUE;
                }
 
-               /* Ist der Ziel-User bereits Mitglied? */
+               /* Is the target user already member of the channel? */
                if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
                if( Channel_IsMemberOf( chan, target )) return IRC_WriteStrClient( from, ERR_USERONCHANNEL_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] );
-       }
 
 
-       /* Wenn der User gebanned ist, so muss das Invite auch gespeichert werden */
-       if( Lists_CheckBanned( target, chan )) remember = TRUE;
+               /* If the target user is banned on that channel: remember invite */
+               if( Lists_CheckBanned( target, chan )) remember = TRUE;
 
 
-       Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
-       if( remember )
-       {
-               if( ! Lists_AddInvited( from, Client_Mask( target ), chan, TRUE )) return CONNECTED;
+               if( remember )
+               {
+                       /* We must memember this invite */
+                       if( ! Lists_AddInvited( from, Client_Mask( target ), chan, TRUE )) return CONNECTED;
+               }
        }
        }
+
+       Log( LOG_DEBUG, "User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask( from ), Req->argv[0], Req->argv[1] );
        
        
-       /* an Ziel-Client forwarden ... */
+       /* Inform target client */
        IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
 
        if( Client_Conn( target ) > NONE )
        {
        IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
 
        if( Client_Conn( target ) > NONE )
        {
-               /* lokaler Ziel-Client, Status-Code melden */
+               /* The target user is local, so we have to send the status code */
                if( ! IRC_WriteStrClientPrefix( from, target, RPL_INVITING_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] )) return DISCONNECTED;
        }
        
                if( ! IRC_WriteStrClientPrefix( from, target, RPL_INVITING_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] )) return DISCONNECTED;
        }