Anonymous avatar Anonymous committed d3a5d93

Add OPERHOST option to /set, which allows you to change the host operators get on oper up (provided they don't have a specific one already defined in their operator block.)

Comments (0)

Files changed (5)

 Todo list for ShadowIRCd 6.1
 -----------------------------
 * notice/message !#channel and %#channel
-* Add default_operhost to /set
 
 Todo list for ShadowIRCd 6.2
 ----------------------------
 	int spam_num;
 	int spam_time;
 
+	char operhost[REALLEN];
 	char operstring[REALLEN];
 	char adminstring[REALLEN];
 };
 #include "common.h"
 #include "channel.h"
 #include "s_conf.h"
+#include "s_user.h"
 #include "s_newconf.h"
 #include "msg.h"
 #include "parse.h"
 static void quote_identtimeout(struct Client *, const char *, int);
 static void quote_max(struct Client *, const char *, int);
 static void quote_operstring(struct Client *, const char *, int);
+static void quote_operhost(struct Client *, const char *, int);
 static void quote_spamnum(struct Client *, const char *, int);
 static void quote_spamtime(struct Client *, const char *, int);
 static void quote_splitmode(struct Client *, const char *, int);
 	{"IDENTTIMEOUT", quote_identtimeout,	0,	1	},
 	{"MAX", 	quote_max, 		0,	1	},
 	{"MAXCLIENTS",	quote_max,		0,	1	},
+	{"OPERHOST",	quote_operhost,		1,	0	},
 	{"OPERSTRING",	quote_operstring,	1,	0	},
 	{"SPAMNUM", 	quote_spamnum, 		0,	1	},
 	{"SPAMTIME", 	quote_spamtime, 	0,	1	},
 	}
 }
 
+/* SET OPERHOST */
+static void
+quote_operhost(struct Client *source_p, const char *arg, int newval)
+{
+	if(EmptyString(arg))
+	{
+		sendto_one_notice(source_p, ":OPERHOST is currently '%s'", GlobalSetOptions.operhost);
+	}
+	else if(!valid_hostname(arg))
+	{
+		sendto_one_notice(source_p, "Invalid hostmask.");
+	}
+	else
+	{
+		rb_strlcpy(GlobalSetOptions.operhost, arg,
+			sizeof(GlobalSetOptions.operhost));
+		
+		sendto_realops_snomask(SNO_GENERAL, L_ALL,
+				     "%s has changed OPERHOST to '%s'",
+				     get_oper_name(source_p), arg);
+	}
+}
+
 /* SET OPERSTRING */
 static void
 quote_operstring(struct Client *source_p, const char *arg, int newval)
 	else
 		GlobalSetOptions.ident_timeout = IDENT_TIMEOUT;
 
+	if(ConfigFileEntry.default_operhost)
+		rb_strlcpy(GlobalSetOptions.operhost,
+			ConfigFileEntry.default_operhost,
+			sizeof(GlobalSetOptions.operhost));
+	else
+		rb_strlcpy(GlobalSetOptions.operhost, "", sizeof(GlobalSetOptions.operhost));
+
 	rb_strlcpy(GlobalSetOptions.operstring,
 		ConfigFileEntry.default_operstring,
 		sizeof(GlobalSetOptions.operstring));
 	if(oper_p->operstring)
 		user_metadata_add(source_p, "OPERSTRING", oper_p->operstring, 1);
 
-	if(oper_p->vhost || !EmptyString(ConfigFileEntry.default_operhost))
+	if(oper_p->vhost || !EmptyString(GlobalSetOptions.operhost))
 	{
 		if(oper_p->vhost)
 			change_nick_user_host(source_p, source_p->name, source_p->username, oper_p->vhost, 0, "Changing host");
 		else
-			change_nick_user_host(source_p, source_p->name, source_p->username, ConfigFileEntry.default_operhost, 0, "Changing host");
+			change_nick_user_host(source_p, source_p->name, source_p->username, GlobalSetOptions.operhost, 0, "Changing host");
 		
 		sendto_one_numeric(source_p, RPL_HOSTHIDDEN, "%s :is now your hidden host (set by %s)", source_p->host, source_p->servptr->name);
 
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.