diff -cNr ../ircd-hybrid-5.3p7/README.jcs ./README.jcs
*** ../ircd-hybrid-5.3p7/README.jcs	Wed Dec 31 18:00:00 1969
--- ./README.jcs	Sat Jul 17 20:49:07 1999
***************
*** 0 ****
--- 1,39 ----
+ This version of the Hybrid IRC daemon has been modified to give opers (global
+ and local) the ability to do the following:
+ 
+ 	o Join a channel that is invite-only (+i) or has a key (+k) without
+ 	  being granted an invite or knowing the key.
+ 
+ 	o Join a channel that the operator is banned from.
+ 
+ 	o Give channel operator status to themselves or another person on
+ 	  the channel.
+ 
+ There is another version of Hybrid out there called DrDevil which also allows
+ opers to join +i'd or +k'd channels, as well as do anything a channel op can
+ do without explicitly being given channel operator status (set the topic,
+ change channel modes, etc.).  DrDevil also denies users to kick an oper off a
+ channel, as well as deop them.  This works good in theory, but after using this
+ on a network, all hell breaks loose.  For one thing, all other servers on the
+ network must use DrDevil for these modifications to work (I'm not sure if it
+ would even work then), because other servers will allow users to kick opers, as
+ well as report to opers that they aren't channel operators when they try to do
+ things without being opped.  So, my solution to this is, simply allow opers to
+ op themselves on a given channel.  This way, the channel MODE change will
+ correctly propogate to all the linked servers and the oper will be able to do
+ the normal channel operator functions without errors.  However, as luck would
+ have it, a user cannot op themselves on a channel (even if they are already
+ opped) according to the RFC (1459).  When Hybrid receives a channel MODE change
+ to op an already-opped user, it just drops the request.
+ 
+ With that, Hybrid+jcs was born.  I started from scratch with Hybrid 5.3p7 and
+ modified the code to allow the aforementioned privelages to opers.  Technically
+ this breaks RFC because it allows a user to op themselves on a channel even if
+ they are already opped, but it doesn't affect anything (to my knowledge).
+ Rather than pick a clever title and rename Hybrid, I'm just going to stick with
+ Hybrid+jcs and release my modifications as .diff-style patches to the official
+ Hybrid releases.
+ 
+ 
+ Contact:    Joshua Stein <jcs at rt.fm>
+ Homepage:   http://jcs.org/ircd/
diff -cNr ../ircd-hybrid-5.3p7/diff ./diff
*** ../ircd-hybrid-5.3p7/diff	Wed Dec 31 18:00:00 1969
--- ./diff	Sat Jul 17 22:08:40 1999
***************
*** 0 ****
--- 1,45 ----
+ diff -cNr ../ircd-hybrid-5.3p7/README.jcs ./README.jcs
+ *** ../ircd-hybrid-5.3p7/README.jcs	Wed Dec 31 18:00:00 1969
+ --- ./README.jcs	Sat Jul 17 20:49:07 1999
+ ***************
+ *** 0 ****
+ --- 1,39 ----
+ + This version of the Hybrid IRC daemon has been modified to give opers (global
+ + and local) the ability to do the following:
+ + 
+ + 	o Join a channel that is invite-only (+i) or has a key (+k) without
+ + 	  being granted an invite or knowing the key.
+ + 
+ + 	o Join a channel that the operator is banned from.
+ + 
+ + 	o Give channel operator status to themselves or another person on
+ + 	  the channel.
+ + 
+ + There is another version of Hybrid out there called DrDevil which also allows
+ + opers to join +i'd or +k'd channels, as well as do anything a channel op can
+ + do without explicitly being given channel operator status (set the topic,
+ + change channel modes, etc.).  DrDevil also denies users to kick an oper off a
+ + channel, as well as deop them.  This works good in theory, but after using this
+ + on a network, all hell breaks loose.  For one thing, all other servers on the
+ + network must use DrDevil for these modifications to work (I'm not sure if it
+ + would even work then), because other servers will allow users to kick opers, as
+ + well as report to opers that they aren't channel operators when they try to do
+ + things without being opped.  So, my solution to this is, simply allow opers to
+ + op themselves on a given channel.  This way, the channel MODE change will
+ + correctly propogate to all the linked servers and the oper will be able to do
+ + the normal channel operator functions without errors.  However, as luck would
+ + have it, a user cannot op themselves on a channel (even if they are already
+ + opped) according to the RFC (1459).  When Hybrid receives a channel MODE change
+ + to op an already-opped user, it just drops the request.
+ + 
+ + With that, Hybrid+jcs was born.  I started from scratch with Hybrid 5.3p7 and
+ + modified the code to allow the aforementioned privelages to opers.  Technically
+ + this breaks RFC because it allows a user to op themselves on a channel even if
+ + they are already opped, but it doesn't affect anything (to my knowledge).
+ + Rather than pick a clever title and rename Hybrid, I'm just going to stick with
+ + Hybrid+jcs and release my modifications as .diff-style patches to the official
+ + Hybrid releases.
+ + 
+ + 
+ + Contact:    Joshua C. Stein <jcs at superblock.net>
+ + Homepage:   http://jcs.superblock.net/ircd/
diff -cNr ../ircd-hybrid-5.3p7/include/patchlevel.h ./include/patchlevel.h
*** ../ircd-hybrid-5.3p7/include/patchlevel.h	Sat Jun 12 20:24:02 1999
--- ./include/patchlevel.h	Sat Jul 17 21:14:26 1999
***************
*** 17,21 ****
   */
  
  #ifndef	PATCHLEVEL
! #define PATCHLEVEL    "2.8/hybrid-5.3p7"
  #endif
--- 17,21 ----
   */
  
  #ifndef	PATCHLEVEL
! #define PATCHLEVEL    "2.8/hybrid-5.3p7+jcs"
  #endif
diff -cNr ../ircd-hybrid-5.3p7/src/channel.c ./src/channel.c
*** ../ircd-hybrid-5.3p7/src/channel.c	Sat Jun 12 20:24:03 1999
--- ./src/channel.c	Sat Jul 17 21:59:47 1999
***************
*** 400,408 ****
    Reg	Link	*lp;
  
    if (chptr)
      if ((lp = find_user_link(chptr->members, cptr)))
        return (lp->flags & CHFL_CHANOP);
!   
    return 0;
  }
  
--- 400,412 ----
    Reg	Link	*lp;
  
    if (chptr)
+ 		/* jcs - an oper is an op */
+ 	{
+ 		if(IsOper(cptr))
+ 	      return CHFL_CHANOP;
      if ((lp = find_user_link(chptr->members, cptr)))
        return (lp->flags & CHFL_CHANOP);
!   }
    return 0;
  }
  
***************
*** 411,419 ****
    Reg	Link	*lp;
  
    if (chptr)
      if ((lp = find_user_link(chptr->members, cptr)))
        return (lp->flags & CHFL_DEOPPED);
!   
    return 0;
  }
  
--- 415,426 ----
    Reg	Link	*lp;
  
    if (chptr)
+ 	{
+ 		if (IsOper(cptr))
+ 			return 0;
      if ((lp = find_user_link(chptr->members, cptr)))
        return (lp->flags & CHFL_DEOPPED);
! 	}
    return 0;
  }
  
***************
*** 803,810 ****
  	  ** be resetting the channel's TS -orabidoo
  	  */
  
! 	  if (who == cptr && whatt == MODE_ADD && *curr == 'o')
! 	    break;
  	  /*
  	   * to stop problems, don't allow +v and +o to mix
  	   * into the one message if from a client.
--- 810,818 ----
  	  ** be resetting the channel's TS -orabidoo
  	  */
  
! 	  /* if (who == cptr && whatt == MODE_ADD && *curr == 'o')
! 	    break; */  /* jcs - breaking rfc :-/ */
! 
  	  /*
  	   * to stop problems, don't allow +v and +o to mix
  	   * into the one message if from a client.
***************
*** 1248,1253 ****
--- 1256,1265 ----
  static	int	can_join(aClient *sptr, aChannel *chptr, char *key)
  {
    Reg	Link	*lp;
+ 
+ /* jcs */
+ if(IsOper(sptr))
+    return 0; /* jcs */
  
    if (is_banned(sptr, chptr))
      return (ERR_BANNEDFROMCHAN);
