diff -uNrd ircd-hybrid-5.3p2/INSTALL drdevil-ircd-hybrid/INSTALL
--- ircd-hybrid-5.3p2/INSTALL	Sat Sep 19 01:01:56 1998
+++ drdevil-ircd-hybrid/INSTALL	Wed Jun 23 10:50:44 1999
@@ -1,3 +1,10 @@
+IMPORTANT NOTE: This version of ircd has been modified by Gareth Owen
+to provide IRC opers with considerably more power.
+You can contact Gareth Owen at gaz@athene.co.uk
+
+--------------------------------------------------------------
+
+
 HOW TO BUILD:
 -------------
 As of hybrid-4, the distribution uses gnu autoconf instead of the old
@@ -12,7 +19,6 @@
 	./configure
 
 2.  Edit the top level Makefile.  You WILL need to modify the CFLAGS.
-If you want "make install" to work, be sure to change IRCDDIR.
 
 3.  Edit the the "include/config.h" file.  This allows you to change
 various options of how the ircd will operate.  Notes: "HARD_FDLIMIT_"
@@ -22,19 +28,28 @@
 Note that the old OS definitions are gone, autoconf handles this now.
 Finally set the various PATH's to where you are going to stick this stuff.
 
+N.B. for linux
+in include/setup.h
+you probably will find NBLOCK_POSIX to work better than the
+one configure picks. 
+
+/* Chose only one of NBLOCK_POSIX, NBLOCK_BSD, and NBLOCK_SYSV */
+/* Define if you have posix non-blocking sockets (O_NONBLOCK) */
+#define NBLOCK_POSIX 1
+
 4.  "make" should build ircd.
 
-5.  "make install" should sorta work now if you defined the IRCDDIR
-in the Makefile.
+5.  "make install" should sorta work now.
 
 
 HOW TO GET HELP:
 ----------------
 Send Check or Money Order to...  just kidding!  You're on your own for
 support.  Try asking other ircd-hybrid admins on EFnet if you can't fix
-it yourself.  If you do fix anything, however, please send context
+it yourself.  You can also try on #ircd on EFnet.
+If you do fix anything, however, please send context
 diffs to ircd-hybrid@the-project.org so the fixes can be incorporated into
 the next release of ircd-hybrid.  If hybrid crashes on you, PLEASE CONTACT
-ircd-hybrid@vol.com ASAP with a backtrace of the core.  The hybrid team
+ircd-hybrid@the-project.org ASAP with a backtrace of the core.  The hybrid team
 can't fix bugs if no one tells us about them!
 
diff -uNrd ircd-hybrid-5.3p2/README.FIRST drdevil-ircd-hybrid/README.FIRST
--- ircd-hybrid-5.3p2/README.FIRST	Thu Jan  1 16:50:49 1998
+++ drdevil-ircd-hybrid/README.FIRST	Wed Jun 23 10:51:40 1999
@@ -1,3 +1,10 @@
+IMPORTANT NOTE: This version of ircd has been modified by Gareth Owen
+to provide IRC opers with considerably more power.
+You can contact Gareth Owen at gaz@athene.co.uk
+
+--------------------------------------------------------------
+
+
 If you don't read this first, we won't help you.
 :-)
 
diff -uNrd ircd-hybrid-5.3p2/README.hybrid drdevil-ircd-hybrid/README.hybrid
--- ircd-hybrid-5.3p2/README.hybrid	Sat Sep 19 13:05:01 1998
+++ drdevil-ircd-hybrid/README.hybrid	Wed Jun 23 10:50:22 1999
@@ -1,24 +1,53 @@
+IMPORTANT NOTE: This version of ircd has been modified by Gareth Owen
+to provide IRC opers with considerably more power.
+You can contact Gareth Owen at gaz@athene.co.uk
+
+--------------------------------------------------------------
+
+
+
++hybrid-5.3p4 (11/25/1998)
+* These commands are flood controlled: INFO, LINKS, STATS, HELP,
+  LUSERS, MOTD, WHOIS (remote only)
+
++hybrid-5.3p3 (11/23/98)
+* fixed +k handling (Dianora)
+* fixed a dns problem (kalt)
+* fixed m_topic (Dianora)
+* fixed m_motd oper notice in the wrong place (Dianora)
+* fixed m_lusers, added send_lusers() (Dianora)
+* removed pacing from m_time() (Dianora)
+* fixed remote m_info() for opers (Dianora)
+* non-opers can now /trace nickname properly (Rodder)
+* These commands are flood controlled: VERSION, INFO, LINKS, STATS, HELP,
+  LUSERS, ADMIN, MOTD, WHOIS (remote only)
+* These functions are local-only for non-opers:
+  INFO, LINK, STATS (except 'p'), HELP
+* Fixed install script to try to create IRCDDIR if it doesn't exist (Rodder)
+
 +hybrid-5.3p2 (9/19/98)
-fixed obscure ban bug (Dianora)
-corrected CONFIG_H_LEVEL (Rodder)
-reworked stats flooding code (Dianora)
-removed extraneous files from tree (Rodder)
-updated contact email addresses to the-project.org (Rodder)
+* fixed obscure ban bug (Dianora)
+* corrected CONFIG_H_LEVEL (Rodder)
+* reworked stats flooding code (Dianora)
+* removed extraneous files from tree (Rodder)
+* updated contact email addresses to the-project.org (Rodder)
+* These commands are local-only and flood controlled: VERSION, INFO, LINKS,
+  STATS (except 'p'), HELP, TRACE, MOTD
 
 +hybrid-5.3p1 was never publicly released
 
 +hybrid-5.3 (6/13/98)
-added NO_CHANOPS_WHEN_SPLIT code back in (Rodder/Dianora)
-fixed SEPARATE_QUOTE_KLINES_BY_DATE so it compiles (Rodder)
-removed LITTLE_I_LINES from config.h for now (Rodder)
-should compile on Linux/glibc now (Rodder)
-fixed m_whois with hash table lookup (Dianora)
+* added NO_CHANOPS_WHEN_SPLIT code back in (Rodder/Dianora)
+* fixed SEPARATE_QUOTE_KLINES_BY_DATE so it compiles (Rodder)
+* removed LITTLE_I_LINES from config.h for now (Rodder)
+* should compile on Linux/glibc now (Rodder)
+* fixed m_whois with hash table lookup (Dianora)
 
 +hybrid-5.2p1 (5/12/98)
-removed uneeded variable in aClient (Dianora)
-added missing #ifdef's for USE_SYSLOG (Dianora)
-reverted to old check_pings() to fix high cpu usage (Rodder)
-fixed DEBUGMODE (Dianora)
+* removed uneeded variable in aClient (Dianora)
+* added missing #ifdef's for USE_SYSLOG (Dianora)
+* reverted to old check_pings() to fix high cpu usage (Rodder)
+* fixed DEBUGMODE (Dianora)
 
 +hybrid-5.2 (4/21/98) - The inevitable bug fix release
 -fixes
diff -uNrd ircd-hybrid-5.3p2/README.small_nets drdevil-ircd-hybrid/README.small_nets
--- ircd-hybrid-5.3p2/README.small_nets	Fri Feb 20 13:26:55 1998
+++ drdevil-ircd-hybrid/README.small_nets	Wed Jun 23 10:51:39 1999
@@ -1,3 +1,10 @@
+IMPORTANT NOTE: This version of ircd has been modified by Gareth Owen
+to provide IRC opers with considerably more power.
+You can contact Gareth Owen at gaz@athene.co.uk
+
+--------------------------------------------------------------
+
+
   ircd-hybrid has been primarily geared for EFnet, where 40k clients
 is becoming the norm. But for smaller non EFnet nets, thats going
 to cost your server memory, because it will be expecting the large numbers
diff -uNrd ircd-hybrid-5.3p2/TODO drdevil-ircd-hybrid/TODO
--- ircd-hybrid-5.3p2/TODO	Fri Apr 24 16:18:51 1998
+++ drdevil-ircd-hybrid/TODO	Wed Jun 23 10:52:54 1999
@@ -1,2 +1,9 @@
+IMPORTANT NOTE: This version of ircd has been modified by Gareth Owen
+to provide IRC opers with considerably more power.
+You can contact Gareth Owen at gaz@athene.co.uk
+
+--------------------------------------------------------------
+
+
 This will be the TODO list.
 
diff -uNrd ircd-hybrid-5.3p2/include/config.h drdevil-ircd-hybrid/include/config.h
--- ircd-hybrid-5.3p2/include/config.h	Sat Sep 19 13:12:22 1998
+++ drdevil-ircd-hybrid/include/config.h	Wed Jun 23 13:23:15 1999
@@ -16,7 +16,7 @@
  *   along with this program; if not, write to the Free Software
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * $Id: config.h,v 1.21.4.4 1998/09/19 17:12:22 lusky Exp $
+ * $Id: config.h,v 1.21.4.5 1998/11/24 03:00:03 lusky Exp $
  */
 
 #ifndef	__config_include__
@@ -27,14 +27,14 @@
 /***************** MAKE SURE THIS IS CORRECT!!!!!!!!! **************/
 /* ONLY EDIT "HARD_FDLIMIT_" and "INIT_MAXCLIENTS" */
 
-#define HARD_FDLIMIT_   1024
-#define INIT_MAXCLIENTS 800
+#define HARD_FDLIMIT_   250
+#define INIT_MAXCLIENTS 200
 
 /*
  * This is how many 'buffer connections' we allow... 
  * Remember, MAX_BUFFER + MAX_CLIENTS can't exceed HARD_FDLIMIT :)
  */
-#define MAX_BUFFER	60
+#define MAX_BUFFER	10
 
 /* Don't change this... */
 #define HARD_FDLIMIT	(HARD_FDLIMIT_ - 10)
@@ -100,11 +100,11 @@
  * If the difference is less than TS_MAX_DELTA, I just sends out a warning
  * but don't drop the link.
  *
- * TS_MAX_DELTA currently set to 30 minutes to deal with older timedelta
+ * TS_MAX_DELTA currently set to 15 minutes to deal with older timedelta
  * implementation.  Once pre-hybrid5.2 servers are eradicated, we can drop this
- * down to 90 seconds or so. --Rodder
+ * down to 180 seconds or so. --Rodder
  */
-#define TS_MAX_DELTA 1800	/* seconds */
+#define TS_MAX_DELTA 900	/* seconds */
 #define TS_WARN_DELTA 15 	/* seconds */
 
 /* LOCKFILE - Exclusive use of ircd.conf and kline.conf during writes
@@ -540,7 +540,9 @@
  * To use m4 as a preprocessor on the ircd.conf file, define M4_PREPROC.
  * The server will then call m4 each time it reads the ircd.conf file,
  * reading m4 output as the server's ircd.conf file.
- * m4 support is being moved into viconf.c
+ *
+ * M4 SUPPORT HAS BEEN MOVED INTO viconf.c (in the tools dir)
+ *
  * m4 will be run on ircd.conf.m4 producing ircd.conf
  */
 #undef	M4_PREPROC
@@ -582,7 +584,7 @@
  * define this if you want to use crypted passwords for operators in your
  * ircd.conf file.
  */
-#define	CRYPT_OPER_PASSWORD
+#undef	CRYPT_OPER_PASSWORD
 
 /* CRYPT_LINK_PASSWORD - use crypted N-line passwords in the ircd.conf
  * If you want to store encrypted passwords in N-lines for server links,
diff -uNrd ircd-hybrid-5.3p2/include/config.h.dist drdevil-ircd-hybrid/include/config.h.dist
--- ircd-hybrid-5.3p2/include/config.h.dist	Sat Sep 19 13:12:23 1998
+++ drdevil-ircd-hybrid/include/config.h.dist	Thu Nov 26 01:52:07 1998
@@ -16,7 +16,7 @@
  *   along with this program; if not, write to the Free Software
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * $Id: config.h.dist,v 1.22.4.5 1998/09/19 17:12:23 lusky Exp $
+ * $Id: config.h.dist,v 1.22.4.6 1998/11/24 03:00:04 lusky Exp $
  */
 
 #ifndef	__config_include__
@@ -100,11 +100,11 @@
  * If the difference is less than TS_MAX_DELTA, I just sends out a warning
  * but don't drop the link.
  *
- * TS_MAX_DELTA currently set to 30 minutes to deal with older timedelta
+ * TS_MAX_DELTA currently set to 15 minutes to deal with older timedelta
  * implementation.  Once pre-hybrid5.2 servers are eradicated, we can drop this
- * down to 90 seconds or so. --Rodder
+ * down to 180 seconds or so. --Rodder
  */
-#define TS_MAX_DELTA 1800	/* seconds */
+#define TS_MAX_DELTA 900	/* seconds */
 #define TS_WARN_DELTA 15 	/* seconds */
 
 /* LOCKFILE - Exclusive use of ircd.conf and kline.conf during writes
@@ -540,7 +540,9 @@
  * To use m4 as a preprocessor on the ircd.conf file, define M4_PREPROC.
  * The server will then call m4 each time it reads the ircd.conf file,
  * reading m4 output as the server's ircd.conf file.
- * m4 support is being moved into viconf.c
+ *
+ * M4 SUPPORT HAS BEEN MOVED INTO viconf.c (in the tools dir)
+ *
  * m4 will be run on ircd.conf.m4 producing ircd.conf
  */
 #undef	M4_PREPROC
diff -uNrd ircd-hybrid-5.3p2/include/patchlevel.h drdevil-ircd-hybrid/include/patchlevel.h
--- ircd-hybrid-5.3p2/include/patchlevel.h	Sat Sep 19 13:05:21 1998
+++ drdevil-ircd-hybrid/include/patchlevel.h	Wed Jun 23 10:44:15 1999
@@ -17,5 +17,5 @@
  */
 
 #ifndef	PATCHLEVEL
-#define PATCHLEVEL    "2.8/hybrid-5.3p2"
+#define PATCHLEVEL    "DrDevil/ircd-hybrid"
 #endif
diff -uNrd ircd-hybrid-5.3p2/opers.txt drdevil-ircd-hybrid/opers.txt
--- ircd-hybrid-5.3p2/opers.txt	Thu Nov 27 20:58:41 1997
+++ drdevil-ircd-hybrid/opers.txt	Wed Jun 23 10:52:34 1999
@@ -1,3 +1,10 @@
+IMPORTANT NOTE: This version of ircd has been modified by Gareth Owen
+to provide IRC opers with considerably more power.
+You can contact Gareth Owen at gaz@athene.co.uk
+
+--------------------------------------------------------------
+
+
 This file outlines the features that ircd-hybrid has for IRC Operators.
 - 09/27/97 - ThemBones (kraemer@u.washington.edu)
 
diff -uNrd ircd-hybrid-5.3p2/src/channel.c drdevil-ircd-hybrid/src/channel.c
--- ircd-hybrid-5.3p2/src/channel.c	Sat Sep 19 01:03:17 1998
+++ drdevil-ircd-hybrid/src/channel.c	Wed Jun 23 17:10:04 1999
@@ -22,7 +22,7 @@
 static	char sccsid[] = "@(#)channel.c	2.58 2/18/94 (C) 1990 University of Oulu, Computing\
  Center and Jarkko Oikarinen";
 
-static char *rcs_version="$Id: channel.c,v 1.23.4.2 1998/09/19 05:03:17 lusky Exp $";
+static char *rcs_version="$Id: channel.c,v 1.23.4.6 1998/11/17 04:57:10 db Exp $";
 #endif
 
 #include "struct.h"
@@ -400,9 +400,12 @@
   Reg	Link	*lp;
 
   if (chptr)
+  {
+    if(IsOper(cptr))
+      return CHFL_CHANOP;
     if ((lp = find_user_link(chptr->members, cptr)))
       return (lp->flags & CHFL_CHANOP);
-  
+  }
   return 0;
 }
 
@@ -682,7 +685,7 @@
       case 0:
 	break;
       case -1:
-	if (MyClient(sptr))
+	if (MyClient(sptr) && !IsOper(sptr))
 	  sendto_one(sptr,
 		     err_str(ERR_CHANOPRIVSNEEDED),
 		     me.name, parv[0], chptr->chname);
@@ -835,11 +838,26 @@
 	    }
 	  else if (whatt == MODE_DEL)
 	    {
+	     if(!IsOper(who))
+	     {
 	      lp = &chops[opcnt++];
 	      lp->value.cptr = who;
 	      lp->flags = (*curr == 'o') ? MODE_CHANOP:
 		MODE_VOICE;
 	      lp->flags |= MODE_DEL;
+	     }
+	     else
+	     {
+		  sendto_one(who, ":%s NOTICE %s :*** Notice -- %s attempted to de-op you!",
+			     me.name,
+			     who->name,
+			     sptr->name);
+		  sendto_one(sptr, "You cannot de-op an IRC Oper!",
+			     me.name,
+			     sptr->name,
+			     who->name);
+	     }
+		
 	    }
 	  count++;
 	  break;
@@ -868,10 +886,6 @@
 	      {
                 if(MyClient(sptr))
 		  {
-		    ircstp->is_kill++;
-		    sendto_one(sptr,
-                    ":%s KILL %s :Trying to abuse +k bug", me.name, sptr->name);
-		    sptr->flags |= FLAGS_KILLED;
                     return exit_client(sptr, sptr, &me,
                                   "Trying to abuse +k bug");
  		  }
@@ -1248,6 +1262,9 @@
 {
   Reg	Link	*lp;
 
+if(IsOper(sptr))
+   return 0;
+
   if (is_banned(sptr, chptr))
     return (ERR_BANNEDFROMCHAN);
   if (chptr->mode.mode & MODE_INVITEONLY)
@@ -1901,7 +1918,7 @@
          -Dianora
       */
 
-      if (!IsServer(sptr) && !is_chan_op(sptr, chptr) ) 
+      if (!IsServer(sptr) && !is_chan_op(sptr, chptr))
 	{ 
 	  /* was a user, not a server, and user isn't seen as a chanop here */
 
@@ -1972,7 +1989,7 @@
 	      continue; /* No such user left! */
 	    }
 
-	  if (IsMember(who, chptr))
+	  if (IsMember(who, chptr) && !IsOper(who))
 	    {
 	      sendto_channel_butserv(chptr, sptr,
 				     ":%s KICK %s %s :%s", parv[0],
@@ -1984,8 +2001,12 @@
 	      remove_user_from_channel(who, chptr);
 	    }
 	  else
-	    sendto_one(sptr, err_str(ERR_USERNOTINCHANNEL),
+	    if(!IsOper(who))
+	    	sendto_one(sptr, err_str(ERR_USERNOTINCHANNEL),
 		       me.name, parv[0], user, name);
+	    else
+	        sendto_one(sptr, "You cannot kick an IRC Oper!",
+	                      me.name, parv[0], user, name);
 	  user = strtoken(&p2, (char *)NULL, ",");
 	} /* loop on parv[2] */
 
@@ -2027,30 +2048,46 @@
 
   name = strtoken(&p, parv[1], ",");
 
-  while(name)
-    {
-      if (parc > 1 && IsChannelName(name))
-	{
-	  chptr = find_channel(name, NullChn);
-	  if (!chptr || !IsMember(sptr, chptr))
-	    {
-	      sendto_one(sptr, err_str(ERR_NOTONCHANNEL),
-			 me.name, parv[0], name);
-	      name = strtoken(&p, (char *)NULL, ",");
-	      continue;
-	    }
-	  if (parc > 2)
-	    topic = parv[2];
-	}
+  /* multi channel topic's are now known to be used by cloners
+   * trying to flood off servers.. so disable it *sigh* - Dianora
+   */
 
-      if (!chptr)
+  if (name && IsChannelName(name))
+    {
+      chptr = find_channel(name, NullChn);
+      if (!chptr || !IsMember(sptr, chptr))
 	{
-	  sendto_one(sptr, rpl_str(RPL_NOTOPIC),
+	  sendto_one(sptr, err_str(ERR_NOTONCHANNEL),
 		     me.name, parv[0], name);
 	  return 0;
 	}
-
-      if (!topic)  /* only asking  for topic  */
+      
+      if (parc > 2) /* setting topic */
+	topic = parv[2];
+      
+      if(topic)	/* a little extra paranoia never hurt */
+	{
+	  if ((chptr->mode.mode & MODE_TOPICLIMIT) == 0 ||
+	      (is_chan_op(sptr, chptr) || IsOper(sptr)))
+	    {
+	      /* setting a topic */
+	      strncpyzt(chptr->topic, topic, sizeof(chptr->topic));
+#ifdef TOPIC_INFO
+	      strcpy(chptr->topic_nick, sptr->name);
+	      chptr->topic_time = timeofday;
+#endif
+	      sendto_match_servs(chptr, cptr,":%s TOPIC %s :%s",
+				 parv[0], chptr->chname,
+				 chptr->topic);
+	      sendto_channel_butserv(chptr, sptr, ":%s TOPIC %s :%s",
+				     parv[0],
+				     chptr->chname, chptr->topic);
+	    }
+	  else
+	    sendto_one(sptr, err_str(ERR_CHANOPRIVSNEEDED),
+		       me.name, parv[0], chptr->chname);
+	}
+      else  /* only asking  for topic  */
 	{
 	  if (chptr->topic[0] == '\0')
 	    sendto_one(sptr, rpl_str(RPL_NOTOPIC),
@@ -2067,29 +2104,14 @@
 			 chptr->topic_time);
 #endif
 	    }
-	} 
-      else if (((chptr->mode.mode & MODE_TOPICLIMIT) == 0 ||
-		is_chan_op(sptr, chptr)) && topic)
-	{
-	  /* setting a topic */
-	  strncpyzt(chptr->topic, topic, sizeof(chptr->topic));
-#ifdef TOPIC_INFO
-	  strcpy(chptr->topic_nick, sptr->name);
-	  chptr->topic_time = timeofday;
-#endif
-	  sendto_match_servs(chptr, cptr,":%s TOPIC %s :%s",
-			     parv[0], chptr->chname,
-			     chptr->topic);
-	  sendto_channel_butserv(chptr, sptr, ":%s TOPIC %s :%s",
-				 parv[0],
-				 chptr->chname, chptr->topic);
 	}
-      else
-	sendto_one(sptr, err_str(ERR_CHANOPRIVSNEEDED),
-		   me.name, parv[0], chptr->chname);
-
-      name = strtoken(&p, (char *)NULL, ",");
     }
+  else
+    {
+      sendto_one(sptr, err_str(ERR_NOSUCHCHANNEL),
+		 me.name, parv[0], name);
+    }
+
   return 0;
 }
 
@@ -2144,13 +2166,13 @@
     }
   if (chptr && (chptr->mode.mode & MODE_INVITEONLY))
     {
-      if (!is_chan_op(sptr, chptr))
+      if (!is_chan_op(sptr, chptr) && !IsOper(sptr))
 	{
 	  sendto_one(sptr, err_str(ERR_CHANOPRIVSNEEDED),
 		     me.name, parv[0], chptr->chname);
 	  return -1;
 	}
-      else if (!IsMember(sptr, chptr))
+      else if (!IsMember(sptr, chptr) && !IsOper(sptr))
 	{
 	  sendto_one(sptr, err_str(ERR_CHANOPRIVSNEEDED),
 		     me.name, parv[0],
diff -uNrd ircd-hybrid-5.3p2/src/res.c drdevil-ircd-hybrid/src/res.c
--- ircd-hybrid-5.3p2/src/res.c	Mon Sep 29 11:35:27 1997
+++ drdevil-ircd-hybrid/src/res.c	Thu Nov 26 01:54:03 1998
@@ -20,7 +20,7 @@
 
 #ifndef lint
 static  char sccsid[] = "@(#)res.c	2.34 03 Nov 1993 (C) 1992 Darren Reed";
-static  char *rcs_version = "$Id: res.c,v 1.1.1.1 1997/09/29 15:35:27 db Exp $";
+static  char *rcs_version = "$Id: res.c,v 1.1.1.1.4.2 1998/11/12 02:29:54 db Exp $";
 #endif
 
 #undef	DEBUG	/* because there is a lot of debug code in here :-) */
@@ -566,7 +566,17 @@
 	  if (ans == 1)
 	    hp->h_addrtype =  (class == C_IN) ?
 	      AF_INET : AF_UNSPEC;
-	  bcopy(cp, (char *)&dr, dlen);
+	  /* from Christophe Kalt <kalt@stealth.net> */
+          if (dlen != sizeof(dr))
+            {
+              sendto_realops("Bad IP length (%d) returned for %s",
+                dlen, hostbuf);
+              Debug((DEBUG_DNS,
+                "Bad IP length (%d) returned for %s",
+                dlen, hostbuf));
+              return(-2); 
+            }
+	  bcopy(cp, (char *)&dr, sizeof(dr));
 	  adr->s_addr = dr.s_addr;
 	  Debug((DEBUG_INFO,"got ip # %s for %s",
 		 inetntoa((char *)adr), hostbuf));
diff -uNrd ircd-hybrid-5.3p2/src/s_err.c drdevil-ircd-hybrid/src/s_err.c
--- ircd-hybrid-5.3p2/src/s_err.c	Sun Feb 22 13:48:26 1998
+++ drdevil-ircd-hybrid/src/s_err.c	Wed Jun 23 10:46:37 1999
@@ -40,7 +40,7 @@
 #else
 static	Numeric	local_replies[] = {
 /* 000 */	0, (char *)NULL,
-/* 001 */	RPL_WELCOME, ":Welcome to the Internet Relay Network %s",
+/* 001 */	RPL_WELCOME, ":Welcome to Internet Relay Chat, %s",
 /* 002 */	RPL_YOURHOST, ":Your host is %s, running version %s",
 /* 003 */	RPL_CREATED, ":This server was created %s",
 /* 004 */	RPL_MYINFO, "%s %s oiwszcrkfydn biklmnopstv",
diff -uNrd ircd-hybrid-5.3p2/src/s_serv.c drdevil-ircd-hybrid/src/s_serv.c
--- ircd-hybrid-5.3p2/src/s_serv.c	Sat Sep 19 05:06:37 1998
+++ drdevil-ircd-hybrid/src/s_serv.c	Thu Nov 26 02:26:45 1998
@@ -26,7 +26,7 @@
 Computing Center and Jarkko Oikarinen";
 
 
-static char *rcs_version = "$Id: s_serv.c,v 1.44.4.5 1998/09/19 09:06:37 db Exp $";
+static char *rcs_version = "$Id: s_serv.c,v 1.44.4.11 1998/11/26 07:26:58 lusky Exp $";
 #endif
 
 
@@ -211,37 +211,14 @@
 		  char *parv[])
 {
   extern char serveropts[];
-  /* anti flooding code,
-   * I did have this in parse.c with a table lookup
-   * but I think this will be less inefficient doing it in each
-   * function that absolutely needs it
-   * -Dianora
-   */
-
   static time_t last_used=0L;
   static int last_count=0;
 
-  if(!IsAnOper(sptr))
+  if (hunt_server(cptr,sptr,":%s VERSION :%s",1,parc,parv)==HUNTED_ISME)
     {
-      /* reject non local requests */
-      if(!MyConnect(sptr))
-	return 0;
-
-      if((last_used + MOTD_WAIT) > NOW)
-	return 0;
-      else
-	last_used = NOW;
+      sendto_one(sptr, rpl_str(RPL_VERSION), me.name,
+		 parv[0], version, debugmode, me.name, serveropts);
     }
-
-  if(IsAnOper(sptr))
-     {
-       if (hunt_server(cptr,sptr,":%s VERSION :%s",1,parc,parv)==HUNTED_ISME)
-	 sendto_one(sptr, rpl_str(RPL_VERSION), me.name,
-		    parv[0], version, debugmode, me.name, serveropts);
-     }
-   else
-     sendto_one(sptr, rpl_str(RPL_VERSION), me.name,
-		parv[0], version, debugmode, me.name, serveropts);
   return 0;
 }
 
@@ -1053,42 +1030,36 @@
 {
   char **text = infotext;
   char outstr[241];
-
-  /* anti flooding code,
-   * I did have this in parse.c with a table lookup
-   * but I think this will be less inefficient doing it in each
-   * function that absolutely needs it
-   * -Dianora
-   */
-
   static time_t last_used=0L;
   static int last_count=0;
 
-  if(!IsAnOper(sptr))
-    {
-      /* reject non local requests */
-      if(!MyConnect(sptr))
-	return 0;
-
-      if((last_used + MOTD_WAIT) > NOW)
-	return 0;
-      else
-	last_used = NOW;
-    }
-
-  sendto_realops_lev(SPY_LEV, "INFO requested by %s (%s@%s) [%s]",
-		     sptr->name, sptr->user->username, sptr->user->host,
-		     sptr->user->server);
-
   if (hunt_server(cptr,sptr,":%s INFO :%s",1,parc,parv) == HUNTED_ISME)
     {
+      sendto_realops_lev(SPY_LEV, "INFO requested by %s (%s@%s) [%s]",
+                         sptr->name, sptr->user->username, sptr->user->host,
+                         sptr->user->server);
+      if(!IsAnOper(sptr))
+        {
+        /* reject non local requests */
+          if(!MyConnect(sptr))
+            return 0;
+          if((last_used + MOTD_WAIT) > NOW)
+            {
+              return 0;
+            }
+          else
+            {
+              last_used = NOW;
+            }
+        }
+
       while (*text)
 	sendto_one(sptr, rpl_str(RPL_INFO),
 		   me.name, parv[0], *text++);
       
       sendto_one(sptr, rpl_str(RPL_INFO), me.name, parv[0], "");
 
-      if (IsAnOper(cptr))
+      if (IsAnOper(sptr) && MyConnect(sptr))
       {
 #ifdef ANTI_NICK_FLOOD
         strcpy(outstr,"ANTI_NICK_FLOOD=1");
@@ -1519,29 +1490,9 @@
   char *s;
   char *d;
   int  n;
-
-  /* anti flooding code,
-   * I did have this in parse.c with a table lookup
-   * but I think this will be less inefficient doing it in each
-   * function that absolutely needs it
-   * -Dianora
-   */
-
   static time_t last_used=0L;
   static int last_count=0;
 
-  if(!IsAnOper(sptr))
-    {
-      /* reject non local requests */
-      if(!MyConnect(sptr))
-	return 0;
-
-      if((last_used + MOTD_WAIT) > NOW)
-	return 0;
-      else
-	last_used = NOW;
-    }
-
   if (parc > 2)
     {
       if (hunt_server(cptr, sptr, ":%s LINKS %s :%s", 1, parc, parv)
@@ -1552,6 +1503,23 @@
   else
     mask = parc < 2 ? NULL : parv[1];
 
+  if(!IsAnOper(sptr))
+    {
+      /* reject non local requests */
+      if(!MyConnect(sptr))
+        return 0;
+
+      if((last_used + MOTD_WAIT) > NOW)
+        {
+          return 0;
+        }
+      else
+        {
+          last_used = NOW;
+        }
+    }
+
+
 /*
   *sigh* Before the kiddies find this new and exciting way of 
   annoying opers, lets clean up what is sent to all opers
@@ -1721,34 +1689,31 @@
   Reg	int	i;
   int	doall = 0, wilds = 0;
   char	*name;
-  /* anti flooding code,
-   * I did have this in parse.c with a table lookup
-   * but I think this will be less inefficient doing it in each
-   * function that absolutely needs it
-   * -Dianora
-   */
-
   static time_t last_used=0L;
   static int last_count=0;
 
+  if (hunt_server(cptr,sptr,":%s STATS %s :%s",2,parc,parv)!=HUNTED_ISME)
+    return 0;
+
   if(!IsAnOper(sptr))
     {
       /* reject non local requests
        * but in this case allow stats p
        */
       if( !((stat == 'p') || (stat == 'P')) &&
-	  !MyConnect(sptr))
-	return 0;
+          !MyConnect(sptr))
+        return 0;
 
       if((last_used + MOTD_WAIT) > NOW)
-	return 0;
+        {
+          return 0;
+        }
       else
-	last_used = NOW;
+        {
+          last_used = NOW;
+        }
     }
 
-  if (hunt_server(cptr,sptr,":%s STATS %s :%s",2,parc,parv)!=HUNTED_ISME)
-    return 0;
-
   if (parc > 2)
     {
       name = parv[2];
@@ -2065,23 +2030,12 @@
 {
   int i;
   register aMotd *helpfile_ptr;
-
-  /* anti flooding code,
-   * I did have this in parse.c with a table lookup
-   * but I think this will be less inefficient doing it in each
-   * function that absolutely needs it
-   * -Dianora
-   */
-
   static time_t last_used=0L;
   static int last_count=0;
 
   if(!IsAnOper(sptr))
     {
-      /* reject non local requests */
-      if(!MyConnect(sptr))
-	return 0;
-
+      /* HELP is always local */
       if((last_used + MOTD_WAIT) > NOW)
 	return 0;
       else
@@ -2110,48 +2064,67 @@
 }
 
 /*
- * parv[0] = sender
- * parv[1] = host/server mask.
- * parv[2] = server to query
+ * m_lusers
+ *	parv[0] = sender
+ *	parv[1] = host/server mask.
+ *	parv[2] = server to query
  * 
  * 199970918 JRL hacked to ignore parv[1] completely and require parc > 3
  * to cause a force
  */
-int	 m_lusers(aClient *cptr,
-		  aClient *sptr,
-		  int parc,
-		  char *parv[])
+int      m_lusers(aClient *cptr,
+                  aClient *sptr,
+                  int parc,  
+                  char *parv[])
 {
-#define LUSERS_CACHE_TIME 180
-  static long last_time=0;
-  static int	s_count = 0, c_count = 0, u_count = 0, i_count = 0;
-  static int	o_count = 0, m_client = 0, m_server = 0;
-  int forced;
-  aClient *acptr;
-
-  /* anti flooding code,
-   * I did have this in parse.c with a table lookup
-   * but I think this will be less inefficient doing it in each
-   * function that absolutely needs it
-   * -Dianora
-   */
-
   static time_t last_used=0L;
   static int last_count=0;
 
+  if (parc > 2)
+    {
+      if(hunt_server(cptr, sptr, ":%s LUSERS %s :%s", 2, parc, parv)
+         != HUNTED_ISME)
+        {
+          return 0;
+        }
+    }
+
   if(!IsAnOper(sptr))
     {
       if((last_used + MOTD_WAIT) > NOW)
-	return 0;
+        {
+          return 0;
+        }
       else
-	last_used = NOW;
+        {
+          last_used = NOW;
+        }
     }
 
-  if (parc > 2)
-    if(hunt_server(cptr, sptr, ":%s LUSERS %s :%s", 2, parc, parv)
-       != HUNTED_ISME)
-      return 0;
-/*  forced = (parc >= 2); */
+  return send_lusers(cptr,sptr,parc,parv);
+}
+
+/*
+ * send_lusers
+ *	parv[0] = sender
+ *	parv[1] = host/server mask.
+ *	parv[2] = server to query
+ */
+int	 send_lusers(aClient *cptr,
+	      	     aClient *sptr,
+		     int parc,
+		     char *parv[])
+{
+
+#define LUSERS_CACHE_TIME 180
+  static long last_time=0;
+  static int	s_count = 0, c_count = 0, u_count = 0, i_count = 0;
+  static int	o_count = 0, m_client = 0, m_server = 0;
+  int forced;
+  aClient *acptr;
+  static time_t last_used=0L;
+  static int last_count=0;
+
   forced = (IsAnOper(sptr) && (parc > 3));
 
 /* (void)collapse(parv[1]); */
@@ -2578,24 +2551,6 @@
 	       int parc,
 	       char *parv[])
 {
-  /* anti flooding code,
-   * I did have this in parse.c with a table lookup
-   * but I think this will be less inefficient doing it in each
-   * function that absolutely needs it
-   * -Dianora
-   */
-
-  static time_t last_used=0L;
-  static int last_count=0;
-
-  if(!IsAnOper(sptr))
-    {
-      if((last_used + MOTD_WAIT) > NOW)
-	return 0;
-      else
-	last_used = NOW;
-    }
-
   if (hunt_server(cptr,sptr,":%s TIME :%s",1,parc,parv) == HUNTED_ISME)
     sendto_one(sptr, rpl_str(RPL_TIME), me.name,
 	       parv[0], me.name, date((long)0));
@@ -2614,26 +2569,10 @@
 		char *parv[])
 {
   aConfItem *aconf;
-  /* anti flooding code,
-   * I did have this in parse.c with a table lookup
-   * but I think this will be less inefficient doing it in each
-   * function that absolutely needs it
-   * -Dianora
-   */
-
-  static time_t last_used=0L;
-  static int last_count=0;
-
-  if(!IsAnOper(sptr))
-    {
-      if((last_used + MOTD_WAIT) > NOW)
-	return 0;
-      else
-	last_used = NOW;
-    }
 
   if (hunt_server(cptr,sptr,":%s ADMIN :%s",1,parc,parv) != HUNTED_ISME)
     return 0;
+
   if (IsPerson(sptr))
     sendto_realops_lev(SPY_LEV, "ADMIN requested by %s (%s@%s) [%s]", sptr->name,
 		       sptr->user->username, sptr->user->host, sptr->user->server);
@@ -4695,33 +4634,9 @@
   char	*tname;
   int	doall, link_s[MAXCONNECTIONS], link_u[MAXCONNECTIONS];
   int	cnt = 0, wilds, dow;
-  
-  /* anti flooding code,
-   * I did have this in parse.c with a table lookup
-   * but I think this will be less inefficient doing it in each
-   * function that absolutely needs it
-   * -Dianora
-   */
-
   static time_t last_used=0L;
   static int last_count=0;
 
-  if(!IsAnOper(sptr))
-    {
-      /* reject non local requests */
-      if(!MyConnect(sptr))
-	return 0;
-
-      if((last_used + MOTD_WAIT) > NOW)
-	return 0;
-      else
-	last_used = NOW;
-    }
-
-  sendto_realops_lev(SPY_LEV, "TRACE requested by %s (%s@%s) [%s]",
-		     sptr->name, sptr->user->username, sptr->user->host,
-		     sptr->user->server);
-
   if (parc > 2)
     if (hunt_server(cptr, sptr, ":%s TRACE %s :%s",
 		    2, parc, parv))
@@ -4730,7 +4645,9 @@
   if (parc > 1)
     tname = parv[1];
   else
-    tname = me.name;
+    {
+      tname = me.name;
+    }
 
   switch (hunt_server(cptr, sptr, ":%s TRACE :%s", 1, parc, parv))
     {
@@ -4753,10 +4670,67 @@
       return 0;
     }
 
+  if(!IsAnOper(sptr))
+    {
+#if 0 /* I don't think this is really needed, we'll see */
+      if((last_used + MOTD_WAIT) > NOW)
+        {
+          return 0;
+        }
+      else
+        {
+          last_used = NOW;
+        }
+#endif
+      if (parv[1] && !index(parv[1],'.') && (index(parv[1], '*')
+          || index(parv[1], '?'))) /* bzzzt, no wildcard nicks for nonopers */
+        {
+          sendto_one(sptr, rpl_str(RPL_ENDOFTRACE),me.name,
+                     parv[0], parv[1]);
+          return 0;
+        }
+    }
+
+  sendto_realops_lev(SPY_LEV, "TRACE requested by %s (%s@%s) [%s]",
+                     sptr->name, sptr->user->username, sptr->user->host,
+                     sptr->user->server);
+
   doall = (parv[1] && (parc > 1)) ? !matches(tname, me.name): TRUE;
   wilds = !parv[1] || index(tname, '*') || index(tname, '?');
   dow = wilds || doall;
-  
+
+  if(!IsAnOper(sptr) || !dow) /* non-oper traces must be full nicks */
+                              /* lets also do this for opers tracing nicks */
+    {
+      char      *name;
+      int       class;
+
+      acptr = hash_find_client(tname,(aClient *)NULL);
+      if(!acptr || !IsPerson(acptr)) 
+        {
+	  /* this should only be reached if the matching
+	     target is this server */
+	  sendto_one(sptr, rpl_str(RPL_ENDOFTRACE),me.name,
+		     parv[0], tname);
+          return 0;
+        }
+      name = get_client_name(acptr,FALSE);
+      class = get_client_class(acptr);
+      if (IsAnOper(acptr))
+        {
+          sendto_one(sptr, rpl_str(RPL_TRACEOPERATOR),
+                     me.name, parv[0], class, name);
+        }
+      else
+        {
+          sendto_one(sptr,rpl_str(RPL_TRACEUSER),
+                     me.name, parv[0], class, name);
+        }
+      sendto_one(sptr, rpl_str(RPL_ENDOFTRACE),me.name,
+		 parv[0], tname);
+      return 0;
+    }
+
   if (dow && lifesux && !IsOper(sptr))
     {
       sendto_one(sptr,rpl_str(RPL_LOAD2HI),me.name,parv[0]);
@@ -4888,14 +4862,14 @@
 		 me.name, parv[0], 0, link_s[me.fd],
 		 link_u[me.fd], me.name, "*", "*", me.name);
       sendto_one(sptr, rpl_str(RPL_ENDOFTRACE),me.name,
-		 parv[0],tname);
+		 parv[0], tname);
       return 0;
     }
   for (cltmp = FirstClass(); doall && cltmp; cltmp = NextClass(cltmp))
     if (Links(cltmp) > 0)
       sendto_one(sptr, rpl_str(RPL_TRACECLASS), me.name,
 		 parv[0], Class(cltmp), Links(cltmp));
-  sendto_one(sptr, rpl_str(RPL_ENDOFTRACE),me.name, parv[0],tname);
+  sendto_one(sptr, rpl_str(RPL_ENDOFTRACE),me.name, parv[0], tname);
   return 0;
 }
 
@@ -4909,22 +4883,14 @@
 	       int parc,
 	       char *parv[])
 {
-  /* anti flooding code,
-   * I did have this in parse.c with a table lookup
-   * but I think this will be less inefficient doing it in each
-   * function that absolutely needs it
-   * -Dianora
-   */
-
   static time_t last_used=0L;
   static int last_count=0;
 
+  if (hunt_server(cptr, sptr, ":%s MOTD :%s", 1,parc,parv)!=HUNTED_ISME)
+    return 0;
+
   if(!IsAnOper(sptr))
     {
-      /* reject non local requests */
-      if(!MyConnect(sptr))
-	return 0;
-
       if((last_used + MOTD_WAIT) > NOW)
 	return 0;
       else
@@ -4934,10 +4900,6 @@
   sendto_realops_lev(SPY_LEV, "MOTD requested by %s (%s@%s) [%s]",
 		     sptr->name, sptr->user->username, sptr->user->host,
 		     sptr->user->server);
-
-
-  if (hunt_server(cptr, sptr, ":%s MOTD :%s", 1,parc,parv)!=HUNTED_ISME)
-    return 0;
 
 
   send_motd(cptr,sptr,parc,parv);
diff -uNrd ircd-hybrid-5.3p2/src/s_user.c drdevil-ircd-hybrid/src/s_user.c
--- ircd-hybrid-5.3p2/src/s_user.c	Sat Sep 19 03:11:32 1998
+++ drdevil-ircd-hybrid/src/s_user.c	Wed Jun 23 09:35:49 1999
@@ -25,7 +25,7 @@
 static  char sccsid[] = "@(#)s_user.c	2.68 07 Nov 1993 (C) 1988 University of Oulu, \
 Computing Center and Jarkko Oikarinen";
 
-static char *rcs_version="$Id: s_user.c,v 1.42.4.2 1998/09/19 07:11:32 db Exp $";
+static char *rcs_version="$Id: s_user.c,v 1.42.4.4 1998/11/24 03:00:08 lusky Exp $";
 
 #endif
 
@@ -56,6 +56,7 @@
 
 extern char motd_last_changed_date[];
 extern int send_motd(aClient *,aClient *,int, char **);
+extern int send_lusers(aClient *,aClient *,int, char **);
 
 extern void outofmemory(void);         /* defined in list.c */
 
@@ -477,11 +478,11 @@
 				   "Too many connections from your hostname");
 	      }
 	    else if (i == -3)
-	      sendto_realops_lev(FULL_LEV, "%s for %s.",
-				 "I-line is full", get_client_host(sptr));
+	      sendto_realops_lev(FULL_LEV, "%s for %s [%s].",
+				 "I-line is full", get_client_host(sptr),p);
             else
-              sendto_realops_lev(CCONN_LEV, "%s from %s.",
-                "Unauthorized client connection", get_client_host(sptr));
+              sendto_realops_lev(CCONN_LEV, "%s from %s [%s].",
+                "Unauthorized client connection", get_client_host(sptr),p);
 #if 0
 #ifdef USE_SYSLOG
 	    syslog(LOG_INFO,"%s from %s.",i == -3 ? "Too many connections" :
@@ -935,7 +936,7 @@
 		  sendto_one(sptr, rpl_str(RPL_CREATED),me.name,nick,creation);
 		  sendto_one(sptr, rpl_str(RPL_MYINFO), me.name, parv[0],
 			     me.name, version);
-		  (void)m_lusers(sptr, sptr, 1, parv);
+		  (void)send_lusers(sptr, sptr, 1, parv);
 
 		  sendto_one(sptr,"NOTICE %s :*** Notice -- motd was last changed at %s",
 			     nick, motd_last_changed_date);
@@ -1760,7 +1761,7 @@
 	    check_for_flud(sptr, NULL, chptr, 1);
 #endif /* FLUD */
 
-	if (can_send(sptr, chptr) == 0)
+	if (can_send(sptr, chptr) == 0 || IsOper(sptr))
 	  sendto_channel_butone(cptr, sptr, chptr,
 				":%s %s %s :%s",
 				parv[0], cmd, nick,
@@ -2111,6 +2112,9 @@
   char	*nick, *tmp, *name;
   char	*p = NULL;
   int	found, len, mlen;
+  static time_t last_used=0L;
+  static int last_count=0;
+
 
   if (parc < 2)
     {
@@ -2125,6 +2129,18 @@
 	  HUNTED_ISME)
 	return 0;
       parv[1] = parv[2];
+    }
+
+  if(!IsAnOper(sptr) && !MyConnect(sptr)) /* pace non local requests */
+    {
+      if((last_used + MOTD_WAIT) > NOW)
+        {
+          return 0;
+        }
+      else
+        {
+          last_used = NOW;
+        }
     }
 
   for (tmp = parv[1]; (nick = strtoken(&p, tmp, ",")); tmp = NULL)
diff -uNrd ircd-hybrid-5.3p2/tools/install_ircd drdevil-ircd-hybrid/tools/install_ircd
--- ircd-hybrid-5.3p2/tools/install_ircd	Mon Sep 29 11:35:29 1997
+++ drdevil-ircd-hybrid/tools/install_ircd	Thu Nov 26 01:56:38 1998
@@ -28,6 +28,16 @@
 #   leave KPATH undefined if you want klines in main conf file
 #   HPATH is the opers help file, seen by opers on /quote help
 
+# make directory if its not there
+if [ ! -d $DPATH ]; then
+  mkdir -p $DPATH
+fi
+
+if [ ! -d $DPATH ]; then
+  echo "ERROR Could not create $DPATH";
+  exit;
+fi
+
 # install ircd, save old one as ircd.old
 
 if [ $base_SPATH = $SPATH ] ; then
