]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-oper.c
bind ListenAddress for outgoing connections
[ngircd-alex.git] / src / ngircd / irc-oper.c
index 1b3011761ceab4e4d0b646057144d75d10b2c9ce..c9286d7015e4598d1d0c09ef7694160cb39bc22d 100644 (file)
@@ -14,7 +14,7 @@
 
 #include "portab.h"
 
-static char UNUSED id[] = "$Id: irc-oper.c,v 1.27 2006/07/23 15:43:18 alex Exp $";
+static char UNUSED id[] = "$Id: irc-oper.c,v 1.29 2007/08/02 10:14:26 fw Exp $";
 
 #include "imp.h"
 #include <assert.h>
@@ -191,12 +191,12 @@ IRC_CONNECT(CLIENT * Client, REQUEST * Req)
                                          Client_ID(Client));
 
        /* Bad number of parameters? */
-       if ((Req->argc != 2) && (Req->argc != 5))
+       if ((Req->argc != 1) && (Req->argc != 2) && (Req->argc != 5))
                return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
                                          Client_ID(Client), Req->command);
 
        /* Invalid port number? */
-       if (atoi(Req->argv[1]) < 1)
+       if ((Req->argc > 1) && atoi(Req->argv[1]) < 1)
                return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
                                          Client_ID(Client), Req->command);
 
@@ -204,14 +204,22 @@ IRC_CONNECT(CLIENT * Client, REQUEST * Req)
            "Got CONNECT command from \"%s\" for \"%s\".", Client_Mask(Client),
            Req->argv[0]);
 
-       if (Req->argc == 2) {
+       switch (Req->argc) {
+       case 1:
+               if (!Conf_EnablePassiveServer(Req->argv[0]))
+                       return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
+                                                 Client_ID(Client),
+                                                 Req->argv[0]);
+       break;
+       case 2:
                /* Connect configured server */
                if (!Conf_EnableServer
                    (Req->argv[0], (UINT16) atoi(Req->argv[1])))
                        return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
                                                  Client_ID(Client),
                                                  Req->argv[0]);
-       } else {
+       break;
+       default:
                /* Add server */
                if (!Conf_AddServer
                    (Req->argv[0], (UINT16) atoi(Req->argv[1]), Req->argv[2],
@@ -255,4 +263,54 @@ IRC_DISCONNECT(CLIENT *Client, REQUEST *Req )
 } /* IRC_CONNECT */
 
 
+GLOBAL bool
+IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
+{
+       CLIENT *to, *from;
+       int client_type;
+
+       assert( Client != NULL );
+       assert( Req != NULL );
+
+       if (Req->argc != 1)
+               return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
+
+       client_type = Client_Type(Client);
+       switch (client_type) {
+       case CLIENT_USER:
+               if (!Client_OperByMe(Client))
+                       return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG, Client_ID(Client));
+               from = Client;
+               break;
+       case CLIENT_SERVER:
+               from = Client_Search(Req->prefix);
+               break;
+       default:
+               return CONNECTED;
+       }
+
+       if (!from)
+               return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->prefix);
+
+       for (to=Client_First(); to != NULL; to=Client_Next(to)) {
+               if (Client_Conn(to) < 0) /* no local connection or WALLOPS origin */
+                       continue;
+
+               client_type = Client_Type(to);
+               switch (client_type) {
+               case CLIENT_USER:
+                       if (Client_HasMode(to, 'w'))
+                               IRC_WriteStrClientPrefix(to, from, "WALLOPS :%s", Req->argv[0]);
+                       break;
+               case CLIENT_SERVER:
+                       if (to != Client)
+                               IRC_WriteStrClientPrefix(to, from, "WALLOPS :%s", Req->argv[0]);
+                       break;
+               }
+       }
+       return CONNECTED;
+}
+
+
+
 /* -eof- */