#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>
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);
"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],
} /* 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- */