Author: Ghostwolf <foxxe@wtfs.net>
authorJoseph Bongaarts <foxxe@wtfs.net>
Thu, 14 Feb 2002 00:20:45 +0000 (00:20 +0000)
committerJoseph Bongaarts <foxxe@wtfs.net>
Thu, 14 Feb 2002 00:20:45 +0000 (00:20 +0000)
Log message:
Merged changes in 2.10.11 into .12

git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@634 c9e4aea6-c8fd-4c43-8297-357d70d61c8c

72 files changed:
ChangeLog
RELEASE.NOTES
configure
configure.in
doc/example.conf
doc/p10.html
doc/readme.features
include/channel.h
include/client.h
include/fda.h
include/handlers.h
include/ircd_alloc.h
include/ircd_defs.h
include/ircd_events.h
include/ircd_features.h
include/msg.h
include/numeric.h
include/s_user.h
include/send.h
include/struct.h
include/supported.h
include/whowas.h
ircd/IPcheck.c
ircd/Makefile.in
ircd/channel.c
ircd/client.c
ircd/engine_devpoll.c
ircd/engine_kqueue.c
ircd/engine_poll.c
ircd/engine_select.c
ircd/fda.c
ircd/gline.c
ircd/ircd.c
ircd/ircd_alloc.c
ircd/ircd_events.c
ircd/ircd_features.c
ircd/jupe.c
ircd/list.c
ircd/listener.c
ircd/m_account.c [new file with mode: 0644]
ircd/m_admin.c
ircd/m_away.c
ircd/m_burst.c
ircd/m_clearmode.c
ircd/m_kick.c
ircd/m_mode.c
ircd/m_quit.c
ircd/m_squit.c
ircd/m_stats.c
ircd/m_topic.c
ircd/m_userip.c
ircd/m_version.c
ircd/m_who.c
ircd/m_whois.c
ircd/m_whowas.c
ircd/motd.c
ircd/parse.c
ircd/res.c
ircd/s_auth.c
ircd/s_bsd.c
ircd/s_conf.c
ircd/s_debug.c
ircd/s_err.c
ircd/s_misc.c
ircd/s_serv.c
ircd/s_user.c
ircd/send.c
ircd/uping.c
ircd/whocmds.c
ircd/whowas.c
tools/ringlog.c [new file with mode: 0644]
tools/ringlog.pl [new file with mode: 0755]

index 98c8013db67178e442e87e68fa929772f65bc751..7f2ded27bb75756c89682d214f6043bc6f7fd60d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
+2002-02-08  Tim Vogelsang  <net@astrolink.org>
+
+       * ircd/m_quit.c: don't prefix user quits with "Quit:" unless a
+       reason is supplied.
+
+2002-02-06  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_auth.c (read_auth_reply): left out an = in an
+       assertion--shouldn't have had any impact, though
+
+       * ircd/Makefile.in: add a hook for using ringlog; run make depend
+
+       * tools/ringlog.c: for the heck of it, add a comment including
+       rules for /etc/magic
+
+2002-02-05  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * tools/ringlog.pl: perl script to take output from ringlog and
+       pass it to addr2line to get function, file, and line number
+       information
+
+       * tools/ringlog.c: program/object to help in building function
+       trace information
+
+2002-02-04  Alex Badea  <vampire@p16.pub.ro>
+
+       * include/ircd_features.h: added new feature MOTD_BANNER
+
+       * ircd/ircd_features.c: added new feature MOTD_BANNER
+
+       * ircd/motd.c (motd_signon): send a one-line banner from
+       FEAT_MOTD_BANNER if it's not NULL and FEAT_NODEFAULTMOTD
+       is set
+
+       * doc/example.conf: default value for MOTD_BANNER feature
+
+       * doc/readme.features: documented the MOTD_BANNER feature
+
+2002-02-04  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_debug.c (debug_serveropts): remove deprecated CHROOTDIR
+       check; added character 'A' to the server options string to
+       indicate when assertion checking is enabled
+
+2002-02-03  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * include/patchlevel.h (PATCHLEVEL): bump patchlevel
+
+       * ircd/engine_kqueue.c (set_or_clear): don't generate an ET_ERROR
+       event if the errno is EBADF, since the caller probably already
+       knows about it and just hasn't gotten around to processing it yet
+
+       * ircd/ircd_events.c: set the GEN_ERROR flag if an ET_ERROR event
+       is generated; don't process socket_events() or socket_state() if
+       an error occurred; add GEN_ERROR to list of flags in gen_flags()
+
+       * include/ircd_events.h: define new GEN_ERROR flag; add a macro to
+       clear it
+
+2002-02-01  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/channel.c: change make_nick_user_{ip,host} to not use a
+       static buffer--instead, a buffer of the right size (NUH_BUFSIZE or
+       NUI_BUFSIZE--I confess they're not well-named) is allocated by the
+       caller
+
+2002-02-02  Alex Badea  <vampire@p16.pub.ro>
+
+       * include/client.h: added user flag FLAGS_HIDDENHOST
+
+       * include/ircd_features.h: added FEAT_HOST_HIDING and
+       FEAT_HIDDEN_HOST
+
+       * include/numeric.h: defined numeric 338 (RPL_WHOISACTUALLY)
+       to report real hostnames and IPs to opers
+
+       * include/s_user.h: exported hide_hostmask()
+
+       * include/send.h: changed sendcmdto_channel_butserv to
+       sendcmdto_channel_butserv_butone; ditto for
+       sendcmdto_common_channels
+
+       * include/struct.h: added realhost to struct User
+
+       * include/whowas.h: added realhost to struct Whowas
+
+       * ircd/channel.c: match bans against both real and hidden
+       hostmasks; moved some calls to use sendcmdto_*_butone
+
+       * ircd/gline.c: match glines agains real host
+
+       * ircd/ircd_features.c: added FEAT_HOST_HIDING and
+       FEAT_HIDDEN_HOST
+
+       * ircd/m_account.c: call hide_hostmask() for possibly
+       hiding the user's host
+
+       * ircd/m_burst.c: moved some calls to use sendcmdto_*_butone
+
+       * ircd/m_topic.c: moved some calls to use sendcmdto_*_butone
+
+       * ircd/m_userip.c: report IP 127.0.0.1 if the user has a hidden
+       host
+
+       * ircd/m_who.c: match real hosts, if the query comes from an oper
+
+       * ircd/m_whois.c: report real hostname and IP to opers
+
+       * ircd/m_whowas.c: report real hostname to opers
+
+       * ircd/s_err.c: added user mode 'x' to the list of supported user
+       modes in RPL_MYINFO (004); added RPL_WHOISACTUALLY for reporting
+       real hostnames to opers
+
+       * ircd/s_misc.c: moved some calls to use sendcmdto_*_butone
+
+       * ircd/s_serv.c: send real hostname to servers
+
+       * ircd/s_user.c: send real hostname to servers; added processing
+       of usermode 'x'; added hide_hostmask() which actually does the work
+       of hiding a user's host; moved some calls to use sendcmdto_*_butone
+
+       * ircd/send.c: changed sendcmdto_channel_butserv to
+       sendcmdto_channel_butserv_butone; ditto for
+       sendcmdto_common_channels
+
+       * ircd/whocmds.c: extra letter 'x' in WHO reply if the user has
+       it's host hidden
+
+       * ircd/whowas.c: if needed, store a user's real host so we can
+       report it to opers later
+
+       * doc/readme.features: documented HOST_HIDING and HIDDEN_HOST
+       features
+
+       * doc/example.conf: default values for HOST_HIDING and
+       HIDDEN_HOST features
+
+2002-02-01  Tim Vogelsang  <net@astrolink.org>
+
+       * ircd/send.c (sendwallto_group_butone): don't sent wallops to
+       ordinary users
+
+2002-01-28  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/jupe.c (jupe_activate): remove a bogus assertion
+
+       * include/patchlevel.h (PATCHLEVEL): bump patchlevel
+
+       * ircd/s_err.c: added new channel mode 'r' to list of supported
+       channel modes in RPL_MYINFO (004); migrated RPL_USERIP to use
+       numeric 340 instead of 307; add ERR_NEEDREGGEDNICK (477) for
+       informing users why they can't join a +r channel
+
+       * ircd/m_clearmode.c (do_clearmode): add support for MODE_REGONLY
+       (+r) to do_clearmode(); note that it is *not* being added to the
+       default clearmode mask!
+
+       * ircd/channel.c: don't allow non-+r users to send messages to +r
+       channels from off the channel; add support for MODE_REGONLY (+r)
+       to channel_modes(); don't allow non-+r users to join +r channels
+       without an invite; add support for MODE_REGONLY to the modebuf_*()
+       family of functions (changes in modebuf_flush_int(),
+       modebuf_mode(), and modebuf_extract()); add support for
+       MODE_REGONLY to mode_parse()
+
+       * include/supported.h (FEATURESVALUES2): added the new channel
+       mode 'r' to the list of supported channel modes
+
+       * include/numeric.h: move RPL_USERIP to 340 to avoid the 307
+       conflict; add ERR_NEEDREGGEDNICK (477) for the new +r channels
+
+       * include/channel.h: remove unused MODE_SENDTS; add new
+       MODE_REGONLY
+
+       * ircd/s_bsd.c (read_packet): remove call to timer_verify()
+
+       * ircd/list.c: remove calls to timer_verify() from
+       alloc_connection() and dealloc_connection()
+
+       * ircd/ircd_events.c: turn off timer_verify(); remove calls to it
+       from timer_run()
+
+2002-01-27  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * include/patchlevel.h (PATCHLEVEL): bump patchlevel
+
+       * ircd/ircd_events.c (timer_run): why did I ever use a next
+       pointer when the algorithm guarantees that the head pointer will
+       always be the next pointer?
+
+2002-01-26  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * include/patchlevel.h (PATCHLEVEL): bump patchlevel
+
+       * ircd/s_bsd.c (read_packet): call timer_verify() after adding the
+       client process timer to catch any list corruption
+
+       * ircd/list.c: surround alloc_connection() and
+       dealloc_connection() with calls to timer_verify()
+
+       * ircd/ircd_events.c: add sledgehammer known as timer_verify() to
+       verify the timer list's structure; call it around timer_run()
+
+2002-01-22  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/send.c (sendcmdto_common_channels): don't send message to a
+       channel that the source is a zombie on
+
+2002-01-13  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_events.c (timer_enqueue): one more assertion--make
+       sure a timer has the ACTIVE flag set before enqueueing the timer
+
+       * include/patchlevel.h (PATCHLEVEL): bump patchlevel
+
+       * ircd/list.c (dealloc_connection): assert that the process timer
+       has been removed from the timer queue before dealloc_connection()
+       is called
+
+2002-01-12  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/res.c: don't accept T_A when we're looking for T_PTR
+
+       * ircd/channel.c (modebuf_flush_int): nuke the code that would
+       send a HACK DESYNCH notice on a HACK(2)--it would be far too
+       chatty
+
+       * ircd/m_away.c (user_set_away): use AWAYLEN instead of TOPICLEN
+
+       * include/supported.h: add AWAYLEN to the list of supported
+       features
+
+       * include/ircd_defs.h: add AWAYLEN to specify the maximum length
+       of an away message
+
+       * include/patchlevel.h (PATCHLEVEL): bump patchlevel
+
+       * ircd/m_mode.c (m_mode): pass extra parameter to channel_modes()
+
+       * ircd/channel.c: pass a buflen parameter to channel_modes() for
+       pbuf--we were using sizeof(pbuf), which would always be
+       sizeof(char*) before; change send_channel_modes() to pass extra
+       parameter to channel_modes()
+
+       * include/channel.h: pass a buflen parameter to channel_modes()
+       for pbuf
+
+       * include/patchlevel.h (PATCHLEVEL): bump patchlevel
+
+       * ircd/uping.c (uping_start): initialize some timers
+
+       * ircd/s_bsd.c (read_packet): use new t_onqueue() macro to figure
+       out when we need to re-add the process timer
+
+       * ircd/s_auth.c (make_auth_request): initialize a timer
+
+       * ircd/res.c (init_resolver): initialize some timers
+
+       * ircd/list.c (alloc_connection): initialize the client process
+       timer
+
+       * ircd/ircd_events.c: add a function, timer_init(), to initialize
+       a struct Timer; recast timer_add() to catch when adding a marked
+       timer and not re-enqueue it--but mark it for re-enqueuing; update
+       timer_del() to turn off the GEN_READD flag and to ignore reference
+       counts when destroying the timer--we're using GEN_MARKED as an
+       ersatz referance count; changed timer_run() to work with the new
+       way of doing things; add GEN_ACTIVE and GEN_READD to gen_flags()'s
+       map[]
+
+       * ircd/ircd.c: initialize some timers
+
+       * ircd/engine_select.c (engine_loop): initialize a timer
+
+       * ircd/engine_poll.c (engine_loop): initialize a timer
+
+       * ircd/engine_kqueue.c (engine_loop): initialize a timer
+
+       * ircd/engine_devpoll.c (engine_loop): initialize a timer
+
+       * ircd/IPcheck.c (IPcheck_init): initialize a timer
+
+       * include/ircd_events.h: add GEN_READD flag for timers to indicate
+       that a timer must be readded; add t_onqueue() macro to check to
+       see if a timer is on the queue (this is a hack, though); added
+       timer_init() to initialize a struct Timer--we're no longer doing
+       the initialization in timer_add()
+
+2002-01-11  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/engine_devpoll.c (engine_loop): relocate an assertion to
+       prevent a core bug *in* the assertion
+
+       * doc/readme.features: document new POLLS_PER_LOOP feature; change
+       documentation to reflect that OPER_SET now defaults to FALSE
+
+       * doc/p10.html: documented the new ACCOUNT stuff
+
+       * doc/example.conf: document new POLLS_PER_LOOP default; change
+       default for OPER_SET
+
+       * RELEASE.NOTES: changed documentation to reflect the fact that
+       assertions are now enabled by default and do not cause memory
+       leaks
+
+       * ircd/res.c (make_cache): removed a bogus assertion we probably
+       never caught because assertions haven't been enabled on production
+       servers for any length of time before
+
+       * ircd/engine_devpoll.c (engine_loop): ditto for POLLS_PER_DEVPOLL
+
+       * ircd/engine_kqueue.c (engine_loop): stupid me forgot one
+       instance of POLLS_PER_KQUEUE
+
+       * include/patchlevel.h (PATCHLEVEL): bump patchlevel
+
+       * ircd/s_bsd.c (client_timer_callback): only clear the
+       FREEFLAG_TIMER flag when the timer is being destroyed
+
+       * ircd/ircd_features.c: create a new feature, POLLS_PER_LOOP, and
+       default it to 200; turn OPER_SET off by default
+
+       * ircd/engine_kqueue.c: dynamically allocate and reallocate the
+       array of events to obtain from the kernel
+
+       * ircd/engine_devpoll.c: dynamically allocate and reallocate the
+       array of events to obtain from the kernel
+
+       * include/ircd_features.h: add a new feature for tuning how many
+       events to get from the kernel, for engines that support that
+
+       * ircd/Makefile.in: re-run make depend to correct dependancies
+
+       * ircd/m_who.c: remove unneeded inclusion of list.h
+
+       * ircd/ircd_events.c: remove unneeded inclusion of list.h
+
+       * ircd/whocmds.c (do_who): hide server name in /who unless
+       requester is an operator; simplify hop count insertion
+
+       * ircd/s_misc.c (exit_one_client): make sure client's snomask is
+       cleared
+
+       * ircd/parse.c: use mo_version and mo_admin when opers do /version
+       or /admin
+
+       * ircd/m_whowas.c (m_whowas): use HEAD_IN_SAND_SERVERNAME instead
+       of the static string "*.undernet.org"
+
+       * ircd/m_version.c: only let ordinary users get version
+       information for the server they are on
+
+       * ircd/m_admin.c: only let ordinary users get admin information
+       for the server they are on
+
+       * ircd/channel.c (client_can_send_to_channel): check is_banned()
+       before letting the client speak on a channel s/he is not on
+
+       * include/supported.h: add NETWORK to feature list
+
+       * include/handlers.h: declare mo_admin() and mo_version()
+
+2002-01-10  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * include/patchlevel.h (PATCHLEVEL): bump patchlevel
+
+       * ircd/s_debug.c (count_memory): conditionalize on MDEBUG instead
+       of !NDEBUG
+
+       * ircd/m_stats.c: conditionalize /stats M on MDEBUG instead of
+       !NDEBUG
+
+       * ircd/ircd_alloc.c: conditionalize on MDEBUG instead of on
+       !NDEBUG
+
+       * ircd/fda.c: conditionalize on MDEBUG instead of on !NDEBUG
+
+       * ircd/Makefile.in: run make depend on chkconf.c as well
+
+       * include/ircd_alloc.h: instead of conditionalizing on !NDEBUG,
+       conditionalize on MDEBUG
+
+       * include/fda.h: instead of conditionalizing on !NDEBUG,
+       conditionalize on MDEBUG
+
+       * configure: rebuild configure script
+
+       * configure.in: enable assertion checking by default, since we
+       have now decoupled memory debugging from the NDEBUG macro
+
+       * ircd/s_user.c (set_nick_name): remove calls to
+       verify_client_list()
+
+       * ircd/s_misc.c (exit_one_client): remove calls to
+       verify_client_list()
+
+       * ircd/s_conf.c (rehash): remove calls to verify_client_list()
+
+       * ircd/m_who.c (m_who): remove calls to verify_client_list()
+
+       * ircd/list.c: remove calls to verify_client_list(); keep
+       verify_client_list() around just in case we ever need it again,
+       but never compile it in
+
+       * ircd/ircd_events.c (event_execute): remove calls to
+       verify_client_list()
+
+       * ircd/client.c (client_get_ping): remove calls to
+       verify_client_list()
+
+       * include/list.h (send_listinfo): remove temporary debugging
+       function verify_client_list()
+
+       * ircd/uping.c: don't die if the event type is ET_ERROR in socket
+       callback functions
+
+       * ircd/res.c (res_callback): don't die if the event type is
+       ET_ERROR
+
+       * ircd/listener.c (accept_connection): don't die if the event type
+       is ET_ERROR
+
+2002-01-09  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_user.c (set_nick_name): bracket call to
+       add_client_to_list() with calls to verify_client_list()
+
+       * include/patchlevel.h (PATCHLEVEL): bump patchlevel (again)
+
+       * ircd/list.c (verify_client_list): add a probabilistic loop
+       detector: for every client added, there is a 2% probability that
+       it will be used to replace the value of sentinel; if at any time,
+       sentinel is found again, we know we're in a loop
+
+       * ircd/ircd_events.c (event_execute): add verify_client_list()
+       calls wrapping event_execute; at the very least, I'll figure out
+       what event the corruption occurred in
+
+       * ircd/list.c: moved verify_client_list() to try to keep it from
+       being inlined
+
+       * ircd/Makefile.in (version.c): version.c wasn't dependant on
+       version.h and patchlevel.h, like it was supposed to be
+
+       * include/patchlevel.h (PATCHLEVEL): bump patchlevel
+
+       * ircd/s_auth.c (destroy_auth_request): overload send_reports
+       argument to also indicate whether or not to call
+       release_auth_client() and thereby enter the client into the linked
+       list
+
+       * ircd/engine_devpoll.c (engine_loop): remove bogus assertion
+
+       * include/patchlevel.h (PATCHLEVEL): bump patchlevel
+
+       * ircd/list.c (free_client): verify that destroy_auth_request()
+       didn't automagically re-add us to the list; we might have to think
+       about this interaction more carefully, actually
+
+       * ircd/s_auth.c (auth_kill_client): zero the auth pointer before
+       calling free_client(); otherwise, free_client() will try to free
+       the auth by calling destroy_auth_request(), which will call
+       add_client_to_list()
+
+       * ircd/s_misc.c (exit_one_client): liberally sprinkle calls to
+       verify_client_list() around to catch any corruption that might
+       occur here
+
+       * ircd/s_conf.c (rehash): liberally sprinkle calls to
+       verify_client_list() here, since this is about the only routine I
+       can think of that could cause the "core on kill -HUP" bug
+
+       * ircd/m_who.c: sprinkle calls to verify_client_list() around
+       liberally, since we've seen crashes here; temporarily include the
+       otherwise unneeded list.h header
+
+       * ircd/list.c: sprinkle calls to verify_client_list() around quite
+       liberally; add debugging asserts to list manipulation functions to
+       catch strange settings for next and prev pointers; define
+       verify_client_list(), which walks the client list and verifies
+       that everything is as it's supposed to be
+
+       * ircd/client.c: wrap client_get_ping with calls to
+       verify_client_list() to see if that's where we're dying
+
+       * include/patchlevel.h (PATCHLEVEL): bump to 03
+
+       * include/list.h: declare verify_client_list() if DEBUGMODE
+       enabled; otherwise, define it to be empty
+
+2002-01-08  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_quit.c (m_quit): remove an unused variable
+
+       * include/patchlevel.h (PATCHLEVEL): bump PATCHLEVEL to 2
+
+       * ircd/s_user.c: when building the user mode to send to the user,
+       don't include +r; add an extra set of parens to squelch a warning
+
+       * ircd/m_quit.c (m_quit): use exit_client_msg()
+
+       * include/patchlevel.h (PATCHLEVEL): bump patch level, so we can
+       keep track of who's running what version
+
+       * ircd/m_squit.c (ms_squit): remove debugging calls to
+       protocol_violation()
+
+       * Makefile.in: change MAKEFILES to IRCD_MAKEFILES to work around a
+       new gmake "feature" (pull-up from trunk)
+
+       * ircd/m_quit.c (m_quit): prefix user quits with "Quit:" (pull-up
+       from trunk)
+
+2002-01-07  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_user.c: add FLAGS_ACCOUNT, represented as 'r', to the
+       list of user modes; process account name as part of user mode in
+       NICK decoding (set_nick_name()); add account name to usermode when
+       building the usermode to incorporate in outgoing NICK messages
+
+       * ircd/s_err.c: add RPL_WHOISACCOUNT for reporting what account a
+       user is logged in to
+
+       * ircd/parse.c: define the new ACCOUNT command, usable only by
+       servers and ignored by everything else
+
+       * ircd/m_whois.c: report what account name is associated with a
+       user, if any
+
+       * ircd/m_account.c: implement the ACCOUNT command
+
+       * ircd/Makefile.in: add m_account.c to the list of sources; ran
+       make depend
+
+       * include/struct.h: add an account field to struct User
+
+       * include/numeric.h: add a reply, RPL_WHOISACCOUNT, for reporting
+       what username a user is logged in under
+
+       * include/msg.h: add ACCOUNT command and token (AC)
+
+       * include/ircd_defs.h: define ACCOUNTLEN to be 12--this matches
+       the maximum length of a username for X
+
+       * include/handlers.h: add declaration for ms_account()
+
+       * include/client.h: add FLAGS_ACCOUNT to flag when a user account
+       name has been set; added FLAGS_ACCOUNT to SEND_UMODES; added
+       IsAccount() and SetAccount() to manipulate the flag
+
+       * ircd/m_squit.c (ms_squit): if we call FindNServer() on a server
+       name like "Amsterdam2.NL.EU.undernet.org", we get the struct
+       Client for the server with numeric "Am", which happens to be
+       stockholm!  To fix this, we look up the full name *first*; if that
+       doesn't get it, *then* we look up by numeric.
+
 2001-12-24  Perry Lorier <isomer@coders.net>
        * ircd/m_server.c: cleanups, maybe this will make the bug easier
        to find.
 
        * ircd/m_stats.c: display maximum number of connects in an I:
 
+2001-11-22  Perry Lorier  <isomer@coders.net>
+       * ircd/m_squit.c: Bug fix in squit
+
+2001-11-03  Greg Sikorski <gte@atomicrevs.demon.co.uk>
+       * ircd/parse.c, include/handlers.h: Give remote whois the correct
+       handler.
+       
 2001-11-01  Kevin L Mitchell  <klmitch@mit.edu>
 
        * ircd/send.c: some minor white-space fiddling; recast selector
        test in sendwallto_group_butone() to remove a warning regarding
-       putting & within parentheses [forward-port from u2.10.11]
+       putting & within parentheses
 
        * ircd/m_create.c (ms_create): use time_t instead of int as a
-       declaration for rate [forward-port from u2.10.11]
+       declaration for rate
 
        * ircd/ircd_reply.c (protocol_violation): it's supposed to be
        WALL_DESYNCH, not CMD_DESYNCH, if I understand things right--no
-       wonder we weren't seeing any protocol violations! [forward-port
-       from u2.10.11]
+       wonder we weren't seeing any protocol violations!
 
        * include/send.h: include time.h for time_t; move WALL_* closer to
        the function they're used in; some white-space fiddling; add
-       declaration of sendto_opmask_butone_ratelimited() [forward-port
-       from u2.10.11]
+       declaration of sendto_opmask_butone_ratelimited()
 
        * ircd/m_squit.c (ms_squit): add protocol_violation() calls in the
        cases where we ignore a squit, so we aren't taken by surprise, at
-       least... [forward-port from u2.10.11]
+       least...
 
        * ircd/m_create.c (ms_create): Display origin server, not origin
-       user [forward-port from u2.10.11]
+       user
 
-2001-11-02  Perry Lorier  <isomer@coders.net>
-       * fixed TS drift message to use sptr, not cptr
+       * ircd/m_create.c (ms_create): Fix "Timestamp drift" server notice
 
 2001-10-31  Perry Lorier  <isomer@coders.net>
-       * fixed ping *bug*
+       * include/m_ping.c: Forward port ping bug
 
 2001-10-31  Perry Lorier  <isomer@coders.net>
-       * fixed hunt_server
+       * include/patchlevel.h: We're beta now
+
+2001-10-31  Perry Lorier  <isomer@coders.net>
+       * ircd/s_user.c: fixed hunt_server
+
+2001-09-21  Perry Lorier  <isomer@coders.net>
+       * ircd/send.c and various: replace sendcmdto_flag_butone with
+       sendwallto_group_butone
+
+2001-09-21  Vampire-  <unknown>
+       * ircd/ircd_string.c: unique_name_vector round II.
+
+2001-09-21  mbuna  <mbuna@undernet.org>
+       * configure.in: Add support for darwin
+
+2001-09-21  Perry Lorier  <isomer@coders.net>
+       * ircd/s_user.c I'm stupid, s/acptr/from/, Hektik pointed it out
+
+2001-09-20  Perry Lorier  <isomer@coders.net>
+
+       * Pullups from 2.10.10.pl16
+       * Added some warnings, and the concept of rate limited snotices
+
+2001-08-31  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/channel.c: use "%u" to format limit arguments; use
+       strtoul() to process limit arguments in a /mode command--note:
+       most clients seem to truncate the integer, probably because
+       they're using atoi, and perhaps signed ints
+
+2001-08-17  Kevin L Mitchell  <klmitch@mit.edu>
+
+       * ircd/numnicks.c: include stdlib.h for exit()
+
+       * ircd/ircd_log.c: include stdlib.h for exit()
+
+       * ircd/ircd_events.c: include stdlib.h for exit()
+
+       * ircd/s_stats.c: remove description of /stats v, since it's gone
+
+       * ircd/m_wallops.c (mo_wallops): add "*" to the beginning of
+       /wallops to distinguish wallops from wallusers
+
+       * ircd/m_error.c (mr_error): ignore ERROR from clients that aren't
+       in the "handshake" or "connecting" states--I think the latter will
+       never happen, but...
+
+       * doc/Authors: apply delete's Authors patch
+
+       * RELEASE.NOTES: rewrite RELEASE.NOTES, basing it a little on
+       Braden's version
+
+       * README: rewrite README
+
+2001-07-31  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_serv.c (server_estab): remove unused variable split
+
+       * ircd/parse.c: add mr_error to the parse table
+
+       * ircd/m_error.c (mr_error): add mr_error() to handle ERRORs from
+       unregistered connections--if IsUserPort() is true, the ERROR is
+       ignored, otherwise, the message is saved
+
+2001-07-28  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_kill.c (ms_kill): another minor typo *sigh*
+
+       * ircd/s_user.c (send_supported): oops, minor typo...
+
+       * ircd/s_user.c: implement send_supported() to send two ISUPPORT
+       messages containing our feature buffers; make register_user() use
+       send_supported()
+
+       * ircd/s_misc.c (exit_client): make sure not to give away a remote
+       server in the ERROR message sent to the client; if the killer is a
+       server, we substitute our name in its place
+
+       * ircd/m_version.c (m_version): use send_supported() to send the
+       ISUPPORT values to the user
+
+       * ircd/m_nick.c: shave nick collision kills here a bit, too, for
+       the same reasons as for m_kill.c
+
+       * ircd/m_kill.c: shave kills a bit so that the results look
+       exactly the same no matter where you are; if we didn't do this, it
+       would be possible to map the network by looking at the differences
+       between kills originating under various circumstances
+
+       * include/supported.h: split the features into two, so as to not
+       bust the parameter count when sending the features list
+
+       * include/s_user.h: declare new send_supported() function to send
+       the ISUPPORT information
+
+2001-07-27  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_bsd.c: disable IP (*not* TCP) options to prevent
+       source-routed spoofing attacks; this is only available under
+       u2.10.11, so don't even bother, since no one but testers are using
+       the source base
+
+2001-07-25  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * include/ircd_policy.h: enable HEAD_IN_SAND_REMOTE by default
+
+       * ircd/s_err.c: put in a . for reporting link version on /trace,
+       to match what /version does
+
+2001-07-21  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_misc.c (exit_client): servers don't understand what the
+       numeric nick ERROR is supposed to mean, so they ignore error
+       messages, resulting in not knowing why we were rejected; use
+       sendcmdto_one for servers and sendrawto_one for clients
+
+2001-07-17  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_burst.c (ms_burst): in the case of a modeless channel and
+       a nick collide, a bare BURST may be propagated; adjust the
+       enforced parameter count to accept the bare BURST
+
+2001-07-12  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_bsd.c: mark a client as having been IP checked
+
+       * ircd/IPcheck.c (ip_registry_check_remote): remove unneeded
+       second call to SetIPChecked()
+
+2001-07-11  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/engine_poll.c: deal with POLLHUP properly (hopefully)
+
+       * ircd/engine_devpoll.c: deal with POLLHUP properly (hopefully)
+
+2001-07-09  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/os_bsd.c (os_get_rusage): move buf into the two ifdef'd
+       sections so that if neither is used, the declaration of buf will
+       not elicit an "unused variable" warning under NetBSD
+
+       * ircd/m_map.c: include string.h to declare strcpy (fix warnings
+       on alpha)
+
+       * ircd/m_away.c: include string.h to declare strcpy/strlen (fix
+       warnings on alpha)
+
+       * ircd/ircd_log.c: include string.h to declare strcpy/strlen (fix
+       warnings on alpha)
+
+       * ircd/client.c: include string.h to declare memset (fix warnings
+       on alpha)
+
+       * ircd/channel.c: remove unused functions next_overlapped_ban,
+       del_banid, and is_deopped (fix warnings under -O1)
+
+       * ircd/IPcheck.c: include string.h to declare memset/memcpy (fix
+       warnings on alpha)
+
+2001-06-29  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_user.c (set_user_mode): clear the snomask if the user
+       isn't supposed to receive server notices anymore
+
+       * ircd/ircd_features.c: change CONFIG_OPERCMDS to default to FALSE
+
+       * configure.in: use AC_MSG_CHECKING/AC_MSG_RESULT when checking
+       installation prefix; default devpoll and kqueue to on (they get
+       turned off if the required headers aren't present)
+
+       * ircd/whocmds.c (do_who): use ircd_snprintf() instead of
+       sprintf_irc(); it's a bit hackish, but it'll do for now
+
+       * ircd/support.c: remove unused #include
+
+       * ircd/send.c: remove unused #include
+
+       * ircd/s_user.c: use ircd_snprintf() instead of sprintf_irc()
+
+       * ircd/s_serv.c: remove unused #include
+
+       * ircd/s_misc.c: use ircd_snprintf() and friends instead of
+       sprintf_irc() and friends
+
+       * ircd/s_err.c: moved atoi_tab[] from ircd/sprintf_irc.c to
+       ircd/s_err.c, which is the only other file to refer to it
+
+       * ircd/s_conf.c (conf_add_deny): use ircd_snprintf() instead of
+       sprintf_irc()
+
+       * ircd/s_bsd.c (connect_server): use ircd_snprintf() instead of
+       sprintf_irc()
+
+       * ircd/s_auth.c: use ircd_snprintf() instead of sprintf_irc()
+
+       * ircd/res.c: use ircd_snprintf() instead of sprintf_irc()
+
+       * ircd/m_version.c: use ircd_snprintf() instead of sprintf_irc()
+
+       * ircd/m_kill.c: use ircd_snprintf() instead of sprintf_irc()
+
+       * ircd/listener.c: use ircd_snprintf() instead of sprintf_irc()
+
+       * ircd/gline.c: use ircd_snprintf() instead of sprintf_irc()
+
+       * ircd/channel.c: don't include sprintf_irc.h; use ircd_snprintf()
+       instead of sprintf_irc()
+
+       * ircd/Makefile.in: remove sprintf_irc.c from sources list; run
+       make depend
+
+       * include/ircd_string.h: remove declaration of sprintf_irc() (what
+       was it doing here anyway?)
+
+       * include/sprintf_irc.h: removed unneeded source file
+
+       * ircd/sprintf_irc.c: removed unneeded source file
+
+       * ircd/s_debug.c (count_memory): remove some dead code
+
+       * ircd/s_auth.c: remove some dead code
+
+       * ircd/res.c (update_list): remove some dead code
+
+       * ircd/m_whowas.c: remove some dead code
+
+       * ircd/m_whois.c: remove some dead code
+
+       * ircd/m_who.c: remove some dead code
+
+       * ircd/m_wallusers.c: remove some dead code
+
+       * ircd/m_wallops.c: remove some dead code
+
+       * ircd/m_wallchops.c: remove some dead code
+
+       * ircd/m_version.c: remove some dead code
+
+       * ircd/m_userip.c: remove some dead code
+
+       * ircd/m_userhost.c: remove some dead code
+
+       * ircd/m_uping.c: remove some dead code
+
+       * ircd/m_trace.c: remove some dead code
+
+       * ircd/m_topic.c: remove some dead code
+
+       * ircd/m_tmpl.c: remove some dead code
+
+       * ircd/m_time.c: remove some dead code
+
+       * ircd/m_squit.c: remove some dead code
+
+       * ircd/m_silence.c: remove some dead code
+
+       * ircd/m_settime.c: remove some dead code
+
+       * ircd/m_set.c: remove some dead code
+
+       * ircd/m_server.c: remove some dead code
+
+       * ircd/m_rpong.c: remove some dead code
+
+       * ircd/m_rping.c: remove some dead code
+
+       * ircd/m_restart.c: remove some dead code
+
+       * ircd/m_reset.c: remove some dead code
+
+       * ircd/m_rehash.c: remove some dead code
+
+       * ircd/m_quit.c: remove some dead code
+
+       * ircd/m_proto.c: remove some dead code
+
+       * ircd/m_privs.c: remove some dead code
+
+       * ircd/m_privmsg.c: remove some dead code
+
+       * ircd/m_pong.c: remove some dead code
+
+       * ircd/m_ping.c: remove some dead code
+
+       * ircd/m_pass.c: remove some dead code
+
+       * ircd/m_part.c: remove some dead code
+
+       * ircd/m_opmode.c: remove some dead code
+
+       * ircd/m_oper.c: remove some dead code
+
+       * ircd/m_notice.c: remove some dead code
+
+       * ircd/m_nick.c: remove some dead code
+
+       * ircd/m_map.c: remove some dead code
+
+       * ircd/m_lusers.c: remove some dead code
+
+       * ircd/m_list.c: remove some dead code
+
+       * ircd/m_links.c: remove some dead code
+
+       * ircd/m_kill.c: remove some dead code
+
+       * ircd/m_kick.c: remove some dead code
+
+       * ircd/m_jupe.c: remove some dead code
+
+       * ircd/m_join.c: remove some dead code
+
+       * ircd/m_ison.c: remove some dead code
+
+       * ircd/m_invite.c: remove some dead code
+
+       * ircd/m_info.c: remove some dead code
+
+       * ircd/m_help.c: remove some dead code
+
+       * ircd/m_gline.c: remove some dead code
+
+       * ircd/m_get.c: remove some dead code
+
+       * ircd/m_error.c: remove some dead code
+
+       * ircd/m_endburst.c: remove some dead code
+
+       * ircd/m_die.c: remove some dead code
+
+       * ircd/m_desynch.c: remove some dead code
+
+       * ircd/m_destruct.c: remove some dead code
+
+       * ircd/m_defaults.c: remove some dead code
+
+       * ircd/m_create.c: remove some dead code, along with an #if 1
+
+       * ircd/m_cprivmsg.c: remove some dead code
+
+       * ircd/m_connect.c: remove some dead code
+
+       * ircd/m_close.c: remove some dead code
+
+       * ircd/m_clearmode.c: remove some dead code
+
+       * ircd/m_burst.c: remove some dead code
+
+       * ircd/m_away.c: remove some dead code
+
+       * ircd/m_admin.c: remove some dead code
+
+       * ircd/listener.c (accept_connection): remove some dead code
+
+       * ircd/ircd_reply.c (need_more_params): remove some dead code
+
+       * ircd/channel.c (add_banid): remove some dead code
+
+       * include/support.h: remove some dead code
+
+       * include/querycmds.h: remove some dead code
+
+       * doc/readme.chroot: document how to do chroot operation
+
+2001-06-28  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/Makefile.in: tune for VPATH builds/installs; add a rule to
+       force bin directory to be created if necessary prior to
+       installation; run make depend
+
+       * doc/Makefile.in (install): tune for VPATH installs by cd'ing to
+       the ${srcdir}
+
+       * Makefile.in: tune to detect Makefile.in changes in
+       subdirectories and to create installation directory indicated by
+       ${prefix}
+
+       * ircd/whocmds.c (count_users): routine to count the number of
+       users matching a given user@host mask
+
+       * ircd/s_err.c: add error messages for ERR_LONGMASK,
+       ERR_TOOMANYUSERS, and ERR_MASKTOOWIDE
+
+       * ircd/m_gline.c: look for and advance past '!' flag on G-lines
+       from operators; only set GLINE_OPERFORCE flag if oper has the
+       PRIV_WIDE_GLINE privilege
+
+       * ircd/ircd_features.c: add GLINEMAXUSERCOUNT, which is the
+       maximum number of users a G-line can impact before it has to be
+       forced; OPER_WIDE_GLINE, to allow operators to use ! to force a
+       wide G-line to be set; and LOCOP_WIDE_GLINE, to allow local
+       operators to use ! to force a wide G-line to be set
+
+       * ircd/gline.c: make make_gline() be called with separate user and
+       host arguments, and not call canon_userhost() directly; implement
+       gline_checkmask() to verify that a host mask is acceptable; move
+       BADCHAN check up in gline_add(), and check passed-in mask under
+       certain circumstances for acceptability; fix call to
+       sendto_opmask_butone() to handle separation of userhost into user
+       and host in gline_add(); update call to make_gline()
+
+       * ircd/client.c: use FEAT_OPER_WIDE_GLINE and
+       FEAT_LOCOP_WIDE_GLINE to set PRIV_WIDE_GLINE for an operator; add
+       PRIV_WIDE_GLINE to privtab[] for client_report_privs()
+
+       * include/whocmds.h (count_users): declare routine to count users
+       matching a given user@host mask
+
+       * include/numeric.h: added three new error returns: ERR_LONGMASK
+       -- mask can't be formatted into a buffer; ERR_TOOMANYUSERS -- too
+       many users would be impacted by the mask; ERR_MASKTOOWIDE -- mask
+       contains wildcards in the wrong places
+
+       * include/ircd_features.h: add FEAT_GLINEMAXUSERCOUNT,
+       FEAT_OPER_WIDE_GLINE, and FEAT_LOCOP_WIDE_GLINE
+
+       * include/gline.h (GLINE_OPERFORCE): provides a way for m_gline()
+       to signal to gline_add() that the operator attempted to force the
+       G-line to be set
+
+       * include/client.h (PRIV_WIDE_GLINE): new privilege for operators
+
+       * doc/readme.gline: update to document new "!" prefix to a G-line
+       user@host mask
+
+       * doc/readme.features: document GLINEMAXUSERCOUNT,
+       OPER_WIDE_GLINE, and LOCOP_WIDE_GLINE
+
+       * doc/example.conf: update to mention new features along with
+       their defaults
+
+2001-06-27  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * doc/example.conf: updated example.conf from Braden
+       <dbtem@yahoo.com>
+
+       * include/supported.h: forward-port from pl15
+
+2001-06-25  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/whocmds.c: include ircd_policy.h and implement
+       HEAD_IN_SAND_WHO_OPCOUNT--forward-port from pl15
+
+       * ircd/m_whois.c: forward-port of the idle-time hiding code from
+       pl15; this also required passing parc into do_whois(), which also
+       meant passing parc into do_wilds()--*sigh*
+
+       * include/ircd_policy.h: add a couple more HEAD_IN_SAND
+       #define's--WHOIS_IDLETIME and WHO_HOPCOUNT
+
+2001-06-22  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * tools/wrapper.c: add a wrapper program that can be used to
+       adjust file descriptor limits and root directories; program must
+       be run as root--NOT SETUID!--and given appropriate -u arguments
+
+       * doc/readme.log: documentation of how to configure logging
+
+       * doc/readme.features: documentation of each feature (except for
+       logging)
+
+2001-06-21  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * Makefile.in (config): add a deprecation notice with a pointer to
+       tools/transition
+
+       * tools/transition: shell script to convert old compile-time
+       options into new compile-time options and appropriate F-lines
+
+       * tools/mkchroot: shell-script to prepare the chroot area by
+       copying over all the necessary libraries so they can be found
+
+2001-06-20  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * INSTALL: partial update of INSTALL for u2.10.11 release...
+
+2001-06-14  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/table_gen.c (makeTables): finally got tired of the
+       "overflow in implicit conversion" warning, so just got rid of it
+       by explicitly casting UCHAR_MAX to a (default) char; diffs show no
+       differences in the tables generated
+
+2001-06-11  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/send.c (sendcmdto_match_butone): don't let the server crash
+       if a client is in the STAT_CONNECTING status
+
+2001-06-10  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/send.c: remove unused vsendcmdto_one(), consolidating it
+       into sendcmdto_one(); define new sendcmdto_prio_one(), which
+       places the message into the priority queue
+
+       * ircd/s_user.c (hunt_server_prio_cmd): definition of
+       hunt_server_prio_cmd(), which simply calls sendcmdto_prio_one()
+       instead of sendcmdto_one()
+
+       * ircd/m_settime.c: use sendcmdto_prio_one() and
+       hunt_server_prio_cmd() to send SETTIME
+
+       * ircd/m_server.c: use sendcmdto_prio_one() to send SETTIME
+
+       * include/send.h: removed declaration for unused vsendcmdto_one();
+       added a declaration for sendcmdto_prio_one()
+
+       * include/s_user.h: declare hunt_server_prio_cmd(), which calls
+       sendcmdto_prio_one()
+
+       * ircd/send.c (sendcmdto_flag_butone): oops; /wallops should be
+       put in the server's priority queue, too...
+
+       * ircd/ircd.c: don't check LPATH for accessibility at all
+
+2001-06-08  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_serv.c (server_estab): send a +h flag in our SERVER
+       command if we're configured as a hub; send individual server flags
+       in SERVER commands
+
+       * ircd/s_bsd.c (completed_connection): send a +h flag in our
+       SERVER command if we're configured as a hub
+
+       * ircd/m_server.c: implement parv[7] as a mode-like string; +h
+       sets the FLAGS_HUB flag for a server; +s sets the FLAGS_SERVICE
+       flag for a server; +hs sets both flags; also modify CMD_SERVER
+       format string to send the flags
+
+       * include/client.h: define two new flags, FLAGS_HUB and
+       FLAGS_SERVICE to mark services and hubs as such; define testing
+       macros, setting macros
+
+       * ircd/s_user.c: remove deprecated struct Gline* argument to
+       register_user(); remove GLINE rebroadcast; do not send GLINE
+       acknowledgement parameter to NICK; do not look for GLINE
+       acknowledgement parameter to NICK while parsing
+
+       * ircd/s_serv.c (server_estab): remove deprecated struct Jupe*
+       argument to server_estab(); do not send JUPE/GLINE acknowledgement
+       parameters for SERVER or NICK
+
+       * ircd/m_user.c (m_user): remove deprecated argument to
+       register_user()
+
+       * ircd/m_server.c: remove deprecated argument to server_estab();
+       remove documentation comment regarding JUPE acknowledgement
+       parameter to SERVER; remove JUPE rebroadcast
+
+       * ircd/m_pong.c (mr_pong): remove deprecated argument to
+       register_user()
+
+       * ircd/m_nick.c: remove documentation comment regarding GLINE
+       acknowledgement parameter to NICK
+
+       * ircd/jupe.c: use user's real name in JUPE server notices if
+       HEAD_IN_SAND_SNOTICES is defined
+
+       * ircd/ircd.c: remove deprecated chroot() code; remove deprecated
+       setuid code; correct ancient DEBUG vs DEBUGMODE typo
+
+       * ircd/gline.c: use user's real name in GLINE server notices if
+       HEAD_IN_SAND_SNOTICES is defined
+
+       * ircd/channel.c (modebuf_flush_int): make apparent source be
+       local server, not oper's server; use user's real name in hack
+       notices and DESYNC notices if HEAD_IN_SAND_SNOTICES is defined
+
+       * include/s_user.h: remove struct Gline pre-declaration; remove
+       deprecated struct Gline argument from register_user()
+
+       * include/s_serv.h: remove struct Jupe pre-declaration; remove
+       deprecated struct Jupe argument from server_estab()
+
+2001-06-07  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_stats.c (hunt_stats): forward-port from pl15 of all the
+       changes required to control remote stats
+
+       * ircd/s_numeric.c (do_numeric): rewrite numeric origins if
+       recipient is not an operator and HEAD_IN_SAND_REWRITE is defined
+       [forward-port from pl15]
+
+       * ircd/m_whowas.c (m_whowas): report server name only if requester
+       is an operator [forward-port from pl15]
+
+       * ircd/m_whois.c (do_whois): /whois <mynick> now correctly reports
+       my server; if HEAD_IN_SAND_REMOTE is 1, ignore the middle argument
+       and obtain the report from the user's server [forward-port from
+       pl15]
+
+       * ircd/m_who.c: add missing include for ircd_policy.h
+       [forward-port from pl15]
+
+       * ircd/m_version.c (m_version): require oper access for remote
+       /version if HEAD_IN_SAND_REMOTE is 1 [forward-port from pl15]
+
+       * ircd/m_time.c (m_time): require oper access for remote /time if
+       HEAD_IN_SAND_REMOTE is 1 [forward-port from pl15]
+
+       * ircd/m_stats.c: pass extra argument to hunt_stats(); correct
+       missing semicolon [forward-port from pl15]
+
+       * ircd/m_nick.c (ms_nick): hide the origin of certain collision
+       kills [forward-port from pl15]
+
+       * ircd/m_motd.c (m_motd): require oper access for remote /motd if
+       HEAD_IN_SAND_REMOTE is 1 [forward-port from pl15]
+
+       * ircd/m_lusers.c (m_lusers): require oper access for remote
+       /lusers if HEAD_IN_SAND_REMOTE is 1 [forward-port from pl15]
+
+       * ircd/m_burst.c (ms_burst): server-added bans are stored using
+       local server name, to hide remote server names; modes also are to
+       originate from the local server [forward-port from pl15]
+
+       * ircd/m_admin.c (m_admin): require oper access for remote /admin
+       if HEAD_IN_SAND_REMOTE is 1 [forward-port from pl15]
+
+       * ircd/channel.c (add_banid): if a server is adding a ban, use my
+       server name to hide the remote server's name [forward-port from
+       pl15]
+
+       * ircd/Makefile.in: ran make depend
+
+       * include/s_stats.h: hunt_stats() has to have an extra argument to
+       support the forward-port from pl15
+
+       * include/ircd_policy.h: #define HEAD_IN_SAND_STATS_P; add
+       HEAD_IN_SAND_{BANWHO,REWRITE,REMOTE} [forward-port from pl15]
+
+       * ircd/engine_poll.c (engine_loop): remove bogus assert that I
+       forgot to check in the events branch
+
+2001-06-06  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/res.c (init_resolver): don't start DNS expires with a 0
+       relative timeout--if the server starts slow, timeouts could be
+       messy...there's probably a better solution, but this'll do for now
+
+       * ircd/os_solaris.c: _XOPEN_SOURCE doesn't get along with Solaris
+       headers very well; include stropts.h; define an os_set_tos()
+
+       * ircd/os_generic.c (os_set_tos): added an os_set_tos() for
+       os_generic.c
+
+       * ircd/ircd.c: if there are no C-lines, we don't want to have a
+       timer that expires at the absolute time of 0--it kinda blocks all
+       the other timers!
+
+       * ircd/engine_devpoll.c: some includes for open(); declare errcode
+       and codesize in engine_loop()
+
+       * ircd/list.c (free_client): remove bogus check on timer active
+       flag
+
+       * ircd/s_auth.c: pull out destruction code in
+       auth_timeout_request() into an externally-visible
+       destroy_auth_request(); manage cli_auth pointer in client
+       structure; use it for an extra assertion check
+
+       * ircd/list.c: include s_auth.h for destroy_auth_request(); add
+       debugging notices to show flow when deallocating
+       connections/clients; call destroy_auth_request() when free'ing a
+       client that has an auth outstanding; don't free the connection if
+       the process timer is unmarked but still active
+
+       * ircd/ircd_events.c: set GEN_ACTIVE when initializing a generator
+       and reset it before calling the event handler for an ET_DESTROY
+       event
+
+       * include/s_auth.h (destroy_auth_request): declare
+       destroy_auth_request(), which can be used to destroy an
+       outstanding auth request if a client socket goes away before the
+       auth exchange is completed
+
+       * include/ircd_events.h: add an active flag to keep track of
+       whether or not particular generators are active, for the
+       convenience of functions using the API
+
+       * include/client.h: add a pointer for auth requests to struct
+       Connection so we can kill outstanding auth requests if a client
+       socket closes unexpectedly
+
+       * ircd/s_bsd.c: cli_connect() could become 0 during the course of
+       the sock or timer callback; take that into account in the assert
+
+       * ircd/list.c: add magic number checking and setting--magic
+       numbers are zero'd on frees to detect double-frees; add back
+       setting of cli_from() to 0 to break the back-link from the struct
+       Connection (duh)
+
+       * ircd/ircd.c: set me's magic number correctly
+
+       * include/client.h: define magic numbers and accessor/verifier
+       macros
+
+       * ircd/list.c: assert that dealloc_client() is called with
+       cli_connect(cptr) == 0; set cli_connect(cptr) to 0 before calling
+       dealloc_client(); don't mess with cli_from(cptr)
+
+       * ircd/s_bsd.c: only attempt to dealloc a connection if the
+       associated client has already been destroyed, or at least delinked
+
+2001-06-05  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/list.c (free_client): only try to delete the socket when
+       the fd hasn't already been closed, avoiding a double-free
+
+       * ircd/list.c (free_connection): make sure the client is really
+       gone before doing away with the connection
+
+       * ircd/s_bsd.c: record that socket has been added in con_freeflag
+       field; queue a socket_del() as soon as the socket is close()'d;
+       use con_freeflag & FREEFLAG_TIMER instead of con_timer; clear
+       FREEFLAG_SOCKET on ET_DESTROY event in client_sock_callback(),
+       then dealloc the connection if safe; mark socket as dead when
+       there's a read error or EOF; clear FREEFLAG_TIMER flag upon entry
+       to client_timer_callback(); dealloc connection if safe upon
+       ET_DESTROY event in client_timer_callback()
+
+       * ircd/list.c: use con_freeflag instead of con_timer; only dealloc
+       the connection if both socket and timer have been destroyed;
+       destroy both socket and timer explicitly and carefully
+
+       * include/client.h: replace the con_timer field with a
+       con_freeflag field, to indicate what still needs freeing; define
+       the freeflags
+
+       * ircd/engine_select.c (engine_loop): duh...sockList[i] could
+       become 0
+
+       * ircd/engine_devpoll.c (engine_loop): duh...sockList[i] could
+       become 0
+
+       * ircd/s_bsd.c: add some extra assertions to try to track down a
+       corruption problem
+
+       * ircd/engine_select.c (engine_loop): add an extra assert to try
+       to track down a corruption problem
+
+       * ircd/engine_poll.c (engine_loop): add an extra assert to try to
+       track down a corruption problem
+
+       * ircd/engine_kqueue.c (engine_loop): add an extra assert to try
+       to track down a corruption problem
+
+       * ircd/engine_devpoll.c (engine_loop): skip slots that have become
+       empty during processing; add an extra assert to try to track down
+       a corruption problem
+
+       * ircd/engine_kqueue.c (engine_delete): make sure to zero deleted
+       entries
+
+2001-06-04  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_bsd.c (client_sock_callback): client is no longer
+       blocked, so we must mark it as unblocked
+
+       * ircd/engine_select.c: add Debug() calls galore; add handling for
+       SS_NOTSOCK; use a dummy sock variable to keep things from
+       disappearing on us; correct timeout calculation; update nfds for
+       efficiency
+
+       * ircd/engine_poll.c: use new debugging level (DEBUG_ENGINE);
+       remove a spurious "if (sock)" which will always be true; update
+       nfds for efficiency
+
+       * ircd/engine_kqueue.c: add Debug() calls galore; add handling for
+       SS_NOTSOCK (just in case); correct timeout calculation
+
+       * ircd/engine_devpoll.c: add Debug() calls galore; add handling
+       for SS_NOTSOCK; correct timeout calculation; add EAGAIN handling
+
+       * include/s_debug.h (DEBUG_ENGINE): add new debugging level;
+       pretty-indent numbers
+
+       * ircd/engine_poll.c (engine_loop): break out SS_NOTSOCK
+       case--it's not a socket; the check for writability is most likely
+       not needed, but present for completeness
+
+2001-05-24  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_bsd.c: add Debug messages; call read_packet() even if the
+       no newline flag is set; call read_packet() when the timer expires,
+       regardless of what's in the buffer--read_packet() should be able
+       to deal properly
+
+       * ircd/IPcheck.c (ip_registry_connect_succeeded): correct a NOTICE
+       sent to clients to include the client nickname (duh)
+
+       * ircd/ircd_events.c: don't destroy a timer if it's already marked
+       for destruction; replace a missing ! in socket_del()
+
+       * ircd/engine_poll.c (engine_loop): reference a temporary variable
+       so we don't have to worry about sockList[i] going away
+
+       * ircd/s_bsd.c (client_sock_callback): add Debug messages
+
+       * ircd/s_auth.c: add Debug messages all over the place
+
+       * ircd/ircd_events.c: add and edit some Debug messages; add a list
+       of routines to convert some of the enums and flags from numbers
+       into human-readable strings for the Debug messages
+
+       * ircd/engine_poll.c: hack some Debug messages to use the new name
+       conversion routines in ircd_events.c; add an extra assert for a
+       condition that shouldn't ever happen; apparently recv() can return
+       EAGAIN when poll() returns readable--I wonder why...
+
+       * include/ircd_events.h: declare some helper routines under
+       DEBUGMODE
+
+2001-05-23  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_bsd.c (client_sock_callback): add an extra assertion
+       check
+
+       * ircd/s_auth.c: add more Debug messages
+
+       * ircd/list.c (make_client): add an extra assertion check
+
+       * ircd/ircd_events.c (socket_events): don't call the engine events
+       changer if we haven't actually made any changes to the event mask
+
+       * ircd/uping.c: add some Debug messages
+
+       * ircd/s_stats.c: document new /STATS e
+
+       * ircd/s_err.c: add RPL_STATSENGINE to report the engine name
+
+       * ircd/s_bsd.c: remove static client_timer variable; in
+       read_packet(), if there's still data in the client's recvQ after
+       parsing, add a 2 second timer (con_proc); fix the ET_DESTROY case
+       of client_sock_callback to handle destroying the timer properly;
+       rewrote client_timer_callback from scratch to be called on an
+       individual client
+
+       * ircd/m_stats.c: add /STATS e to report the engine name
+
+       * ircd/list.c: deal with con_timer field in struct Connection
+       properly; correct a core-level bug in remove_client_from_list--if
+       the client is the only one in the list, we try to update
+       GlobalClientList's cli_prev pointer--not good
+
+       * ircd/ircd.c: remove call to init_client_timer()
+
+       * ircd/engine_poll.c: made Debug messages more uniform by
+       prepending "poll:" to them all; corrected an off-by-one error that
+       caused poll_count to be 1 less than the actual count and removed
+       my work-around; added Debug messages to indicate which socket is
+       being checked and what the results are
+
+       * ircd/Makefile.in: ran a make depend
+
+       * include/s_bsd.h: remove init_client_timer(), since we're doing
+       it differently now
+
+       * include/numeric.h (RPL_STATSENGINE): a stats reply to report the
+       engine name
+
+       * include/ircd_policy.h (HEAD_IN_SAND_STATS_E): turn off /stats e
+       reports for non-opers
+
+       * include/client.h: add con_timer and con_proc fields to struct
+       Connection and define accessor macros--con_timer marks that
+       con_proc contains a valid timer, and con_proc is used to pace user
+       data
+
+       * ircd/s_bsd.c (close_connection): let free_client() destroy the
+       socket
+
+       * ircd/s_auth.c (start_auth): add a Debug call to indicate when
+       auth has begun on a client
+
+       * ircd/ircd_events.c: ensure that event_execute() is called with a
+       non-NULL event; modify event_add() macro to properly zero list
+       bits; modify gen_dequeue() to not try to clip it out of a list
+       it's already been clipped out of; change signal socket
+       initialization to use state SS_NOTSOCK; permit timeout values of
+       0 in add_timer(); add many Debug calls; change socket_del() and
+       timer_del() to always set the GEN_DESTROY flag; use GEN_MARKED in
+       timer_run() instead of GEN_DESTROY so that event_generate() will
+       pass on the events; remove the switch and replace with a simpler
+       if-then-else tree in timer_run(); don't allow destroyed sockets to
+       be destroyed again, nor their states or event masks to be changed
+
+       * ircd/ircd.c: initialize "running" to 1
+
+       * ircd/engine_poll.c: deal with SS_NOTSOCK "sockets"; add Debug
+       messages all over the place; fix a counting problem in
+       engine_add(); turn wait into a signed integer and set it to -1
+       only if timer_next() returns 0; adjust wait time to be relative;
+       don't call gen_ref_dec() if socket disappeared while we were
+       processing it
+
+       * include/ircd_events.h: the pipe for signals is not a socket, so
+       we must mark it as such--added SS_NOTSOCK for that special socket;
+       events won't be generated if GEN_DESTROY is on, so add GEN_MARKED
+       for the benefit of timer_run()
+
+       * configure.in: add --enable-pedantic and --enable-warnings to
+       turn on (and off) -Wall -pedantic in CFLAGS
+
+2001-05-21  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_conf.c: change "s_addr" element accesses to "address"
+       element accesses
+
+       * include/s_conf.h: on some systems, "s_addr" is a macro; use
+       "address" instead
+
+2001-05-18  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/engine_kqueue.c: include ircd_alloc.h; set_or_clear returns
+       void in this file; add a missing semi-colon; declare errcode,
+       codesize
+
+       * ircd/uping.c (uping_sender_callback): it's pptr, not uping
+
+       * ircd/s_user.c (register_user): comment out spurious reference to
+       nextping
+
+       * ircd/s_serv.c (server_estab): comment out spurious reference to
+       nextping
+
+       * ircd/s_conf.c (read_configuration_file): comment out spurious
+       reference to nextping and nextconnect
+
+       * ircd/s_bsd.c: comment out some spurious references to formerly
+       global (now non-existant) variables; correct a couple of typos
+
+       * ircd/s_auth.c: pre-declare some functions referenced in the
+       callback; correct a typo
+
+       * ircd/res.c (start_resolver): pass errno value of ENFILE
+
+       * ircd/listener.c (accept_connection): you know your API is messed
+       up when...variables that shouldn't have been global crop up in
+       other files
+
+       * ircd/list.c (free_client): substitution of == for =
+
+       * ircd/ircd_signal.c: include assert.h for assertion checking;
+       check ev_data() to find out what signal generated event
+
+       * ircd/ircd_events.c: some references to the variable "timer"
+       should have been references to the variable "ptr"
+
+       * ircd/engine_select.c: it's struct fd_set, not struct fdset;
+       ev_timer(ev) is already a timer pointer; declare codesize as a
+       size_t to correct signedness issue; use timer_next(), not
+       time_next()
+
+       * ircd/engine_poll.c: ev_timer(ev) is already a timer pointer;
+       select fd out of struct pollfd in assertion checking; declare
+       errcode and codesize; use timer_next(), not time_next()
+
+       * ircd/engine_kqueue.c: ev_timer(ev) is already a timer pointer;
+       use function timer_next(), not time_next()
+
+       * ircd/engine_devpoll.c: ev_timer(ev) is already a timer pointer;
+       use function timer_next(), not time_next()
+
+       * ircd/Makefile.in (IRCD_SRC): add ircd_events.c to the list of
+       compiled sources; do make depend
+
+       * include/list.h: pre-declare struct Connection
+
+       * include/ircd_events.h (gen_ref_inc): cast to the right structure
+       name
+
+       * include/s_auth.h: duh; missing */
+
+2001-05-10  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/send.c: update write events status after sending data or
+       accumulating data to be sent
+
+       * ircd/m_list.c (m_list): update write events status after
+       canceling a running /list
+
+       * ircd/channel.c (list_next_channels): update write events status
+       after listing a few channels
+
+       * ircd/s_bsd.c: extensive changes to update to new events model;
+       remove on_write_unblocked() and the two implementations of
+       read_message(), which have been deprecated by this change
+
+       * ircd/s_auth.c: set the socket events we're interested in for
+       clients; simplify some logic that does the connect_nonb followed
+       by the socket_add
+
+       * ircd/list.c: define free_connection() to free a connection
+       that's become freeable once the struct Socket has been
+       deallocated; fix up free_client() to take this new behavior into
+       account
+
+       * ircd/ircd.c: call init_client_timer()
+
+       * include/s_bsd.h: declare new REGISTER_ERROR_MESSAGE when unable
+       to register connect-in-progress with events system; declare
+       init_client_timer() (HACK!) to preserve rate-limiting behavior
+
+       * include/list.h: declare new free_connection()
+
+       * include/client.h: add a struct Socket to struct Connection
+
+2001-05-09  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_signal.c: massage the handlers for SIGHUP, SIGINT, and
+       SIGTERM into event callbacks; perform the actions in the
+       callbacks, since they're not called in the context of the signal;
+       set up the signal callbacks in the event engine
+
+       * ircd/ircd_events.c (signal_callback): we're supposed to look for
+       a specific signal; don't generate an event if there is no signal
+       structure for it
+
+       * ircd/ircd.c: nuke nextconnect and nextping and replace them with
+       connect_timer and ping_timer; massage try_connections() and
+       check_pings() into timer callbacks that re-add themselves at the
+       right time; remove ircd.c's "event_loop()"; initialize the event
+       system and the connect_timer and ping_timer
+
+       * ircd/uping.c: correct a couple more typos
+
+       * ircd/s_auth.c: rework to use new events system
+
+       * ircd/os_solaris.c (os_connect_nonb): update to new interface
+
+       * ircd/os_openbsd.c (os_connect_nonb): update to new interface
+
+       * ircd/os_linux.c (os_connect_nonb): update to new interface
+
+       * ircd/os_generic.c (os_connect_nonb): update to new interface
+
+       * ircd/os_bsd.c (os_connect_nonb): update to new interface
+
+       * include/s_auth.h: remove deprecated members of struct
+       AuthRequest, replacing them with struct Socket and struct Timer
+       structures; add flags to indicate when these structures have been
+       released by the event system; remove the deprecated
+       timeout_auth_queries()
+
+       * include/ircd_osdep.h (os_connect_nonb): connect could complete
+       immediately, so change the interface to handle that possibility
+
+       * ircd/uping.c (uping_server): noticed and corrected a typo
+
+       * ircd/listener.c: set up to use ircd_event's struct Socket by
+       adding an socket_add() call to inetport(), replacing
+       free_listener() with socket_del() in close_listener(), and
+       reworking accept_connection to be called as the callback
+
+       * ircd/ircd.c: add a call to IPcheck_init()
+
+       * ircd/IPcheck.c: remove IPcheck_expire(); rework
+       ip_registry_expire() to be called from a timer; write
+       IPcheck_init() to set up the expiration timer (hard-coded for a
+       60-second expiration time)
+
+       * include/listener.h: add a struct Socket to the struct Listener;
+       remove accept_connection()
+
+       * include/IPcheck.h: add IPcheck_init(), remove IPcheck_expire()
+
+2001-05-08  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_events.c: include config.h; use USE_KQUEUE and
+       USE_DEVPOLL instead of HAVE_KQUEUE and HAVE_DEVPOLL_H
+
+       * ircd/engine_select.c: include config.h; set FD_SETSIZE to
+       MAXCONNECTIONS, not IRCD_FD_SETSIZE...
+
+       * ircd/engine_poll.c: include config.h
+
+       * ircd/engine_kqueue.c: include config.h
+
+       * ircd/engine_devpoll.c: include config.h
+
+       * ircd/Makefile.in: include engine sources in compilation and make
+       depend steps
+
+       * configure.in: add checks for enabling the /dev/poll- and
+       kqueue-based engines
+
+       * acconfig.h: add lines for USE_DEVPOLL and USE_KQUEUE
+
+       * ircd/Makefile.in: work in the engine sources
+
+2001-05-07  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_settime.c: include ircd_snprintf.h
+
+       * ircd/ircd_relay.c: stomp a couple of gcc warnings suggesting
+       parens around a construct that had both || and &&
+
+       * ircd/chkconf.c: #include "config.h" to get some important
+       definitions
+
+       * ircd/Makefile.in: revamp ircd makefile for new build system
+
+       * doc/Makefile.in: revamp doc makefile for new build system
+
+       * config/*: Removed old build system files
+
+       * stamp-h.in: a stamp file
+
+       * install-sh: install-sh for new build system
+
+       * configure.in: configure.in for new build system
+
+       * configure: configure script for new build system (built by
+       autoconf)
+
+       * config.sub: config.sub for new build system
+
+       * config.h.in: config.h.in for new build system (built by
+       autoheader)
+
+       * config.guess: config.guess for new build system
+
+       * aclocal.m4: aclocal.m4 for new build system (built by aclocal
+       1.4)
+
+       * acinclude.m4: aclocal.m4 macros for new build system
+
+       * acconfig.h: config.h skeleton for new build system
+
+       * Makefile.in: modify for new build system
+
+2001-05-01  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_err.c: get rid of the last vestiges of TIME_T_FMT
+
+       * ircd/m_settime.c: get rid of the last vestiges of TIME_T_FMT
+
+       * ircd/m_server.c: get rid of the last vestiges of TIME_T_FMT
+
+2001-05-01  Perry Lorier       <Isomer@coders.net>
+       * doc/iauth.doc: Protocol for iauth server. (from hybrid).
+       * doc/linux-poll.patch: Patch to make Linux under 2.2 not deadlock
+               when you have far far too many sockets in use.
+       * {include,ircd}/iauth.c: A start on iauth support.
+
+2001-05-01  Perry Lorier       <Isomer@coders.net>
+       * ircd/s_err.c: Suggested wording change.
+       * ircd/s_user.c: Users aren't target limited against +k users.
+       * ircd/chkconf.c: Made it compile again, who knows if it works, but
+               now I can at least make install
+        * various: Cleanups on m_*.c files.
+
+
+2001-04-23  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_misc.c (exit_client): make netsplit server notice say the
+       right thing
+
+       * ircd/m_links.c (m_links_redirect): forward-port RPL_ENDOFLINKS
+       change to make Khaled happy...
+
+       * ircd/m_whois.c (do_whois): pull-up of m_whois() fix
+       (do_whois): duh...
+
+2001-04-21  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/msgq.c: finally remove the msgq_integrity() hack, as it's
+       turned up no more bugs
+
+       * ircd/ircd.c: use /* */ comments instead of // comments--all the
+       world's not gcc :(
+
+       * ircd/s_conf.c (conf_add_server): use /* */ comments instead of
+       // comments--all the world's not gcc :(
+
+       * ircd/runmalloc.c: finally garbage-collect unused file
+
+       * include/runmalloc.h: finally garbage-collect unused file
+
+       * ircd/<multiple files>: addition of '#include "config.h"' before
+       all other includes in most .c files
+
+       * include/<multiple files>: remove includes of config.h, which are
+       now going into the raw .c files
+
+2001-04-20  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_whois.c (do_whois): display proper server name if the
+       user is looking up himself
+
+       * ircd/m_who.c (m_who): disable match by servername or display of
+       server names by non-opers
+
+       * include/ircd_policy.h: add define for
+       HEAD_IN_SAND_WHO_SERVERNAME to cover full intent of sub-motion 15
+       of CFV 165
+
+2001-04-18  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_conf.c: keep the $R in memory so we can see it clearly
+       when we do a /stats k
+
+       * ircd/s_user.c (set_user_mode): pull-up of changes to prevent
+       users from turning on +s and +g
+
+       * ircd/s_misc.c (exit_client): pull-up of changes to turn off
+       net.split notice
+
+       * ircd/parse.c: pull-up of changes to disable /trace, /links, and
+       /map for users
+
+       * ircd/m_whois.c (do_whois): pull-up of server name masking for
+       /whois
+
+       * ircd/m_user.c (m_user): removal of umode and snomask defaulting
+       functions, pull-up
+
+       * ircd/m_stats.c (m_stats): pull-up of stats-disabling stuff
+
+       * ircd/m_map.c (m_map_redirect): pull-up of m_map_redirect()
+
+       * ircd/m_links.c (m_links_redirect): pull-up of m_links_redirect()
+
+       * ircd/channel.c (channel_modes): pull-up of channel key display
+       as *
+
+       * include/ircd_policy.h: pull-up of ircd_policy.h
+
+       * include/client.h: pull-up of Set/ClearServNotice()
+
+       * ircd/gline.c (do_gline): report client name in G-line message
+       (pull-up)
+
+       * ircd/s_user.c (register_user): pull-up--show IP address in some
+       server notices dealing only with users; report which connection
+       class has filled up
+
+       * ircd/s_stats.c (report_deny_list): use conf->flags &
+       DENY_FLAGS_IP insteaf of conf->ip_kill
+
+       * ircd/m_stats.c (report_klines): use conf->flags & DENY_FLAGS_IP
+       insteaf of conf->ip_kill
+
+       * ircd/s_conf.c: use flags field in struct DenyConf; pull-up of
+       K-line by real name
+
+       * include/s_conf.h: use a flags field in struct DenyConf; define
+       DENY_FLAGS_FILE, DENY_FLAGS_IP, and DENY_FLAGS_REALNAME for
+       pull-up of K-line by real name
+
+       * ircd/m_trace.c: pull-up of IP show for user connections
+
+       * doc/example.conf: pull-up of the realname K-line documentation
+
+       * ircd/ircd.c: forward port of pid file advisory locking mechanism
+
+2001-04-16  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/send.c (sendcmdto_flag_butone): recast to just broadcast to
+       all servers, rather than to only servers that have +w/+g/whatever
+       users on them; among other things, this removes that atrocity
+       known as sentalong[] from this function
+
+       * ircd/m_admin.c: must include ircd.h to declare "me"; must
+       include hash.h to declare FindUser()
+
+       * ircd/m_wallusers.c: implementation of WALLUSERS
+
+       * ircd/m_desynch.c (ms_desynch): only send DESYNCHs to opers
+
+       * ircd/m_wallops.c: only send WALLOPS to opers
+
+       * ircd/parse.c: add WALLUSERS command to parser table
+
+       * include/handlers.h: declare wallusers handlers
+
+       * include/msg.h: add WALLUSERS command
+
+       * ircd/send.c (sendcmdto_flag_butone): if FLAGS_OPER is or'd with
+       flag, send only to appropriate opers
+
+2001-04-13  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/uping.c: refit to use the new events interface
+
+       * ircd/res.c: refit to use the new events interface
+
+       * ircd/ircd_events.c: create timer_chg(), which permits a
+       (non-periodic) timer's expire time to be modified; change the
+       logic in timer_run() so that timers that were re-added while the
+       event was being processed will not be destroyed prematurely
+
+       * include/uping.h: include the events header, declare some extra
+       fields in struct UPing, remove timeout value, and define some
+       flags for marking which cleanup items have yet to be done
+
+       * include/ircd_events.h: add a prototype for timer_chg() to change
+       the expire time of a running timer
+
+2001-03-13 Joseph Bongaarts <foxxe@wtfs.net>
+       * ircd/os_openbsd.c: Tweaked the openbsd hack a bit.
+       
+2001-03-07  Joseph Bongaarts  <foxxe@wtfs.net>
+
+       * config/configure.in: Add check for OpenBSD
+
+       * ircd/os_openbsd.c: Add seperate os dep file for openbsd which
+       differs from generic BSD, particularly in its handling of
+       _XOPEN_SOURCE.
+       
+2001-02-12  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_gline.c (ms_gline): propagate a G-line that happened to
+       have been added by a U-lined server, rather than going through the
+       activate/deactivate logic; propagate G-line removals by U-lined
+       servers as well
+
+       * ircd/gline.c: rename propagate_gline() to gline_propagate();
+       make gline_propagate() return an int 0 (convenience return); only
+       update lastmod in gline_activate() and gline_deactivate() if the
+       current lastmod is non-zero, since 0 lastmod is our flag of a
+       U-lined server having added a G-line
+
+       * include/gline.h (gline_propagate): exporting the G-line
+       propagation function
+
+       * ircd/m_list.c (m_list): duh; permit explicit channel name
+       specification only when /list gets two arguments ("Kev
+       #wasteland") rather than when /list gets more than two
+       arguments--nice braino
+
+2001-01-29  Thomas Helvey <twhelvey1@home.com>
+
+       * ircd/ircd_reply.c (need_more_params): fix bug that allowed
+       unregistered clients to spam opers with protocol violation
+       messages. Note: the bugfix may have eliminated some useful
+       protocol violation messages.
+       Please send protocol violation messages explicitly from the
+       functions they are discovered in, you have much better context
+       for the error there and it helps to document the behavior of the
+       server. This was also a design bug in that it violated the
+       "A function should do one thing" heuristic. Patching this one
+       would have resulted in a continuous spawning of other bugs over
+       the next 3 years, so I killed it. Check around for stuff this
+       broke and readd the calls to protocol_violation in the functions
+       that need to send the message.
+
+2001-01-29  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/channel.c (mode_parse_ban): stopper a tiny leak--if a ban
+       already existed, then the logic would (attempt to) skip it, but
+       would not free the ban string; now the ban string is free'd and
+       the ban count is decremented, releasing the ban for use
+
+       * ircd/s_user.c: make send_umode_out() take a prop argument
+       instead of testing for the PRIV_PROPAGATE privilege itself; fix
+       set_umode() to use this new argument, calculating it before
+       calculating the new privileges for a -o'd user
+
+       * ircd/m_oper.c (m_oper): pass the new prop argument to
+       send_umode_out()
+
+       * ircd/channel.c (mode_parse_ban): turn off MODE_ADD bit in bans
+       that we're not actually going to add because they already exist;
+       test that particular bit before adding to the linked list
+
+       * include/s_user.h: add a prop argument to send_umode_out() to
+       indicate whether or not to propagate the user mode
+
+2001-01-24  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/msgq.c: ircd_vsnprintf() returns the number of bytes that
+       it would have written; upper-bound the number to prevent overflows
+       by proxy; also, tune buffer size given to ircd_vsnprintf() to take
+       into account the fact that ircd_vsnprintf() already takes the
+       terminal \0 into account
+
+2001-01-22  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/msgq.c: add an incredibly ugly hack to attempt to track
+       down an apparent buffer overflow; remove msgq_map(), since it's no
+       longer used anywhere; slight tweaks to prevent off-by-one errors,
+       but these can't explain the problems we've seen
+
+       * include/msgq.h: remove msgq_map(), since it's no longer used
+       anywhere
+
+2001-01-18  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_user.c (set_nick_name): call client_set_privs() after
+       parsing user modes
+
+2001-01-17  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_bsd.c (read_message): fix a typo in the select version of
+       read_message()
+
+       * ircd/whowas.c (whowas_free): MyFree() is a macro that expects
+       its argument to be an lvalue, which means we can't use
+       whowas_clean()'s handy-dandy "return ww" feature
+
+       * ircd/ircd_features.c: default LOCOP_KILL to TRUE--oops...
+
+2001-01-16  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_events.c (timer_run): it's possible that the timer got
+       deleted during the callback processing, so don't go to the bother
+       of requeuing it if the destroy flag is set
+
+       * ircd/engine_select.c: define FD_SETSIZE to be IRCD_FD_SETSIZE
+       out of config.h if this is a *BSD; include errno.h (oops);
+       decrement error count after an hour using a timer; use FD_SETSIZE
+       constant instead of IRCD_FD_SETSIZE constant; fill in event
+       processing code
+
+       * ircd/engine_poll.c: include errno.h (oops); decrement error
+       count after an hour using a timer; fill in event processing code
+
+       * ircd/engine_kqueue.c: include errno.h (oops); decrement error
+       count after an hour using a timer; assert events filter is either
+       EVFILT_READ or EVFILT_WRITE; fill in event processing code
+
+       * ircd/engine_devpoll.c: include errno.h (oops); decrement error
+       count after an hour using a timer; fill in event processing code
+
+2001-01-15  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/client.c: fixed feattab; basically, when I changed features
+       to use small integers specifying bit positions, instead of the
+       bits themselves, I forgot to update feattab to not | these
+       privileges together; also fixed a bug in the antiprivs masking
+       loop in client_set_privs()--last index wouldn't get parsed
+
+2001-01-11  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_events.c: call event_generate() with new data
+       argument; make it set that field in struct Event; make
+       socket_add() return the value of the eng_add callback
+
+       * ircd/engine_select.c: make engine_add() return a
+       successful/unsuccessful status; add bounds-checking outside of an
+       assert; use accessor macros; use log_write(), not the deprecated
+       ircd_log(); add an assert to engine_loop() to double-check for
+       data structure corruption
+
+       * ircd/engine_poll.c: make engine_add() return a
+       successful/unsuccessful status; add bounds-checking outside of an
+       assert; use accessor macros; use log_write(), not the deprecated
+       ircd_log(); add an assert to engine_loop() to double-check for
+       data structure corruption
+
+       * ircd/engine_kqueue.c: implementation of an engine for kqueue()
+
+       * ircd/engine_devpoll.c: implementation of an engine for /dev/poll
+
+       * include/ircd_events.h: define some accessor macros; add ev_data
+       to struct Event for certain important data--errno values, for
+       instance; make EngineAdd callback tell us if it was successful or
+       not; add extra argument to event_generate(); make socket_add()
+       return the status from EngineAdd
+
+2001-01-10  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_events.c: pass initializer information about how many
+       total _filedescriptors_ may be opened at once
+
+       * ircd/ircd.c: use exported "running" instead of unexported
+       thisServer.running
+
+       * ircd/engine_select.c: implementation of an event engine based on
+       select()
+
+       * ircd/engine_poll.c: implementation of an event engine based on
+       poll()
+
+       * include/ircd_events.h: pass the engine initializer an integer
+       specifing how many _filedescriptors_ may be opened at once
+
+       * include/ircd.h: running has to be exported for the engine_*
+       event loops
+
+2001-01-09  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_events.c: include some needed headers; add some
+       comments; make evEngines[] const; bundle sig_sock and sig_fd into
+       a struct named sigInfo; rework struct evInfo to have a queue of
+       _generators_, and only when threaded; added a gen_init() function
+       to centralize generator initialization; fix various compile-time
+       errors; rework event_add() for new queueing scheme and checked for
+       compile-time errors; add casts where needed; spell evEngines[]
+       correctly; make engine_name() return const char*
+
+       * include/ircd_events.h: type EventCallBack depends on struct
+       Event, so pre-declare it; put _event_ queue into generators, and
+       only when threaded; give engine data a union to store both ints
+       and pointers; make engine name a const; fix gen_ref_dec() macro;
+       make engine_name() return a const char*
+
+       * ircd/ircd_events.c: gen_dequeue() is now exported, so move it
+       down with the non-static functions; modify event_execute() to use
+       the new gen_ref_dec() to simplify code; make sure event_generate()
+       does not generate new events for generators marked for destruction
+
+       * include/ircd_events.h: the engines, at least, may need to modify
+       reference counts to keep generators from going away while
+       something still points at them, so add reference counter
+       manipulators and export gen_dequeue() for them
+
+       * ircd/ircd_events.c: set up the list of engines to try; set up
+       the signal struct Socket; rename netInfo to evInfo; move static
+       functions near the beginning of the file; do away with
+       signal_signal() (since we no longer keep a signal count ourselves)
+       and call event_generate() directly from signal_callback--also
+       renamed some functions; allow signal_callback() to read up to
+       SIGS_PER_SOCK at once from the signal pipe; add event_init() to
+       initialize the entire event system; add event_loop() to call the
+       engine's event loop; initialize new struct GenHeader member,
+       gh_engdata; remove timer_next(); add socket_add() function to add
+       a socket; add socket_del() to mark a socket for deletion; add
+       socket_state() to transition a socket between states; add
+       socket_events() to set what events we're interested in on the
+       socket; add engine_name() to retrieve event engine's name
+
+       * include/ircd_events.h: add engine data field to struct
+       GenHeader; rename SOCK_ACTION_REMOVE to SOCK_ACTION_DEL; add a
+       note about states vs s_events; remove signal count; fold union
+       Generator back into struct Event; remove count members from struct
+       Generators; redefine engine callbacks to not take a struct
+       Engine*; add explanatory comments to callback definitions; add
+       some engine callbacks to handle operations; remove struct Engine
+       flag member--can detect single flag from eng_signal member; add
+       event_init(), event_loop(), engine_name(), and the socket_*()
+       functions; make timer_next() a macro to avoid a function call
+
+2001-01-08  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * include/ircd_events.h: rename to ircd_events.h, since it handles
+       events, not just networking stuff; add signal support; more
+       structural rearrangement
+
+       * ircd/ircd_events.c: rename to ircd_events.c, since it handles
+       events, not just networking stuff; add signal support; more
+       structural rearrangement
+
+2001-01-07  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_network.c: implement timer API; add reference counts
+       appropriately
+
+       * include/ircd_network.h: firm up some pieces of the interface;
+       split out members everything has into a separate structure; add
+       reference counts; add timer API
+
+2001-01-06  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_network.c: static data and event manipulation
+       functions for new event processing system
+
+       * include/ircd_network.h: data structures for new event processing
+       system
+
+2001-01-03  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/whowas.c: Completely re-did the old allocation scheme by
+       turning it into a linked list, permitting the
+       NICKNAMEHISTORYLENGTH feature to be changed on the fly
+
+       * ircd/s_debug.c (count_memory): use FEAT_NICKNAMEHISTORYLENGTH
+       feature instead of old #define
+
+       * ircd/ircd_features.c: add NICKNAMEHISTORYLENGTH feature as an
+       integer feature with a notify callback (whowas_realloc)
+
+       * ircd/client.c (client_set_privs): second memset was supposed to
+       be over antiprivs, not privs; thanks, Chris Behrens
+       <cbehrens@xo.com> for pointing that out...
+
+       * include/whowas.h: new elements for an extra linked list in
+       struct Whowas; a notify function for feature value changes
+
+       * include/ircd_features.h: new feature--FEAT_NICKNAMEHISTORYLENGTH
+
+       * config/config-sh.in: NICKNAMEHISTORYLENGTH is now a feature
+
+2001-01-02  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * config/config-sh.in: get rid of DEFAULT_LIST_PARAMETER
+       compile-time option--now in features subsystem
+
+       * ircd/motd.c (motd_init): rework motd_init() to be called as the
+       notify function for MPATH and RPATH features (should probably
+       split it up a bit, though...)
+
+       * ircd/m_privs.c (mo_privs): if called with no parameters, return
+       privs of the caller, rather than an error
+
+       * ircd/m_list.c: pull usage message into its own function; pull
+       list parameter processing into its own function that does not
+       modify the contents of the parameter; add list_set_default() to
+       set the default list parameter (uses the notify hook); rework
+       m_list() to make use of these functions; removed dead code
+
+       * ircd/ircd_log.c (log_feature_mark): make sure to return 0, since
+       we have no notify handler
+
+       * ircd/ircd_features.c: add notify callback for notification of
+       value changes; give mark callback an int return value to indicate
+       whether or not to call the notify callback; fix up feature macros
+       for new notify callback; add DEFAULT_LIST_PARAM feature; rewrite
+       string handling in feature_set() to deal with def_str being a null
+       pointer; wrote feature_init() to set up all defaults appropriately
+
+       * ircd/ircd.c (main): call feature_init() instead of
+       feature_mark(), to avoid calling notify functions while setting up
+       defaults
+
+       * ircd/client.c: updated to deal with new privileges structure
+
+       * ircd/class.c: updated so init_class() can be called should one
+       of PINGFREQUENCY, CONNECTFREQUENCY, MAXIMUM_LINKS, or
+       DEFAULTMAXSENDQLENGTH be changed
+
+       * include/ircd_log.h: log_feature_mark() updated to fit with new
+       API changes
+
+       * include/ircd_features.h: added DEFAULT_LIST_PARAM feature and
+       feature_init() function (found necessary since adding the notify
+       stuff and notifying motd.c during start-up...before we defined
+       RPATH!)
+
+       * include/client.h: move privs around to enable addition of more
+       bits if necessary; based on the FD_* macros
+
+       * include/channel.h: declare list_set_default (actually located in
+       m_list.c *blanche*)
+
+       * ircd/s_user.c: retrieve MAXSILES and MAXSILELENGTH (now
+       AVBANLEN*MAXSILES) from features subsystem
+
+       * ircd/s_debug.c (debug_serveropts): CMDLINE_CONFIG doesn't go to
+       anything anymore
+
+       * ircd/s_bsd.c: retrieve HANGONGOODLINK and HANGONRETRYDELAY from
+       the features subsystem
+
+       * ircd/s_auth.c (start_auth): NODNS migrated to the features
+       subsystem
+
+       * ircd/random.c: created random_seed_set() function to set seed
+       value, along with some stuff to make ircrandom() a little more
+       random--state preserving, xor of time instead of direct usage,
+       etc.; it's still a pseudo-random number generator, though, and
+       hopefully I haven't broken the randomness
+
+       * ircd/m_version.c: FEATUREVALUES makes use of feature_int() calls
+
+       * ircd/m_join.c: use features interface to retrieve
+       MAXCHANNELSPERUSER
+
+       * ircd/ircd_features.c: add NODISP flag for super-secret features;
+       add a whole bunch of new features migrated over from make config
+
+       * ircd/ircd.c: use features interface to retrieve PINGFREQUENCY,
+       CONNECTTIMEOUT, and TIMESEC
+
+       * ircd/client.c (client_get_ping): use features interface to
+       retrieve PINGFREQUENCY
+
+       * ircd/class.c: use features interface to retrieve PINGFREQUENCY,
+       CONNECTFREQUENCY, MAXIMUM_LINKS, and DEFAULTMAXSENDQLENGTH
+
+       * ircd/chkconf.c (DEFAULTMAXSENDQLENGTH): since it's now in the
+       features subsystem, we have to add something explicit
+
+       * ircd/channel.c: use features interface to retrieve
+       KILLCHASETIMELIMIT, MAXBANLENGTH, MAXBANS, and MAXCHANNELSPERUSER;
+       note that MAXBANLENGTH is now calculated dynamically from MAXBANS
+       and AVBANLEN
+
+       * ircd/Makefile.in: run make depend
+
+       * include/supported.h (FEATURESVALUES): update to reference
+       feature settings
+
+       * include/random.h: add prototype for random_seed_set
+
+       * include/ircd_features.h: add several more features
+
+       * include/channel.h: move MAXBANS and MAXBANLENGTH into feature
+       subsystem
+
+       * config/config-sh.in: feature-ized some more stuff
+
+       * include/motd.h: some new elements in motd.h for motd.c changes
+
+       * ircd/motd.c: motd_cache() now searches a list of already cached
+       MOTD files; saves us from having duplicate caches in memory if
+       there are two identical T-lines for two different sites...
+
+2001-01-02  Perry Lorier <isomer@coders.net>
+       * ircd/motd.c: don't core if the motd isn't found.  Bug found by
+       Amarande.
+
+2001-01-02  Perry Lorier <isomer@coders.net>
+       * ircd/s_err.c: Added third param to 004 - the channel modes that tage params.  Used by hybrid/epic.
+       * ircd/s_channels.c: Added fix for msg'ing a -n+m channel - thanks
+               to guppy for noticing, and hektik for providing the fix.
+       * misc others: Minor cleanups, added more protocol_violations, ripped
+               out more P09 stuffs, bit more protocol neg stuff.
+
+2000-12-19  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_ison.c (m_ison): Dianora says that ISON has to end with a
+       space (*sigh* stupid clients...)
+
+       * ircd/s_user.c: make WALLOPS_OPER_ONLY a feature managed through
+       ircd_features.[ch]
+
+       * ircd/s_err.c: get rid of GODMODE conditionals
+
+       * ircd/s_debug.c (debug_serveropts): switch to using appropriate
+       calls into the features subsystem for various serveropts
+       characters
+
+       * ircd/s_conf.c (find_conf_entry): get rid of USEONE conditional
+
+       * ircd/s_bsd.c: remove GODMODE conditional; use features subsystem
+       to get value of VIRTUAL_HOST and CLIENT_FLOOD; remove
+       NOFLOWCONTROL conditional
+
+       * ircd/s_auth.c: use features subsystem to determine value of
+       KILL_IPMISMATCH
+
+       * ircd/parse.c: get rid of NOOPER and GODMODE conditionals; use
+       features subsystem to determine the setting of IDLE_FROM_MSG
+
+       * ircd/numnicks.c: get rid of EXTENDED_NUMERICS conditionals
+
+       * ircd/motd.c: get value of NODEFAULTMOTD from features subsystem;
+       use features subsystem to get motd file names
+
+       * ircd/m_settime.c: get value of RELIABLE_CLOCK from features
+       subsystem
+
+       * ircd/m_server.c: get rid of CRYPT_LINK_PASSWORD, since it does
+       us no good; use features subsystem to figure out if we need to do
+       HUB-type stuff; make TESTNET debugging sendto_opmask_butone's use
+       the Debug(()) macro instead; get value of RELIABLE_CLOCK from
+       features subsystem
+
+       * ircd/m_privmsg.c: get IDLE_FROM_MSG from the features subsystem
+
+       * ircd/m_oper.c: get CRYPT_OPER_PASSWORD from the features
+       subsystem
+
+       * ircd/m_connect.c: get SERVER_PORT from the features subsystem
+
+       * ircd/ircd_log.c (log_set_file): fix a bug that kept log files
+       from getting marked if they were already set to something...
+
+       * ircd/ircd_features.c: add a flag to indicates read-only access;
+       add several new features that used to be compile-time selected
+
+       * ircd/ircd.c: grab pidfile out of feature subsystem; don't check
+       access to motd files (what the heck?); make sure to initialize the
+       feature subsystem before trying to write the config file
+
+       * ircd/dbuf.c: use feature_int() to retrieve BUFFERPOOL settings;
+       use feature_bool() to figure out if we're using the FERGUSON
+       flusher
+
+       * ircd/Makefile.in: MPATH and RPATH are now done differently, so
+       remove the clause that creates empty files of that name; also ran
+       make depend
+
+       * include/sys.h: CLIENT_FLOOD is now a feature; unfortunately,
+       there is no easy way to bounds-check it at present
+
+       * include/querycmds.h: make sure ircd_features.h is included; use
+       feature_str(FEAT_DOMAINNAME) in calls to match()
+
+       * include/ircd_features.h: many new features that used to be
+       compile-time selected
+
+       * config/config-sh.in: add * to DOMAINNAME; try also using first
+       argument to search in /etc/resolv.conf; removed many compile-time
+       options that now can be configured through the features system
+
+2000-12-18  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * doc/api/log.txt: how to use the logging API
+
+       * doc/api/features.txt: how to use the features API
+
+       * doc/api/api.txt: how to write API documentation
+
+       * include/ircd_features.h: rearranged a couple of features for
+       neatness purposes
+
+       * ircd/ircd_features.c: cleaned up the macros some; rearranged
+       some code to all go into the switch; rearranged a couple of
+       features for neatness purposes
+
+2000-12-16  Greg Sikorski <gte@atomicrevs.demon.co.uk>
+       * ircd/os_bsd.c: Added os_set_tos for BSD users.
+
+2000-12-16  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_features.c: Isomer almost got it right; you need to
+       use F_I(), since it's an integer value, not a boolean value.  The
+       asserts in feature_int would catch you out...  Also made the F_*
+       macros take flags
+
+       * ircd/s_err.c: define RPL_PRIVS reply
+
+       * ircd/parse.c: put new PRIVS command into command table
+
+       * ircd/m_privs.c (mo_privs): message handler to report operator
+       privileges
+
+       * ircd/ircd_features.c: declare new features OPER_SET and
+       LOCOP_SET; redo boolean testing routine to accept TRUE, YES, and
+       ON for boolean TRUE, and FALSE, NO, and OFF for boolean FALSE
+
+       * ircd/client.c: simplify client_set_privs() with a table that
+       defines what features to test for; add new client_report_privs()
+
+       * ircd/Makefile.in: compile new m_privs.c; run make depend
+
+       * include/numeric.h (RPL_PRIVS): new reply numeric for displaying
+       an operator's privileges
+
+       * include/msg.h: define new command: PRIVS
+
+       * include/ircd_features.h: create new features OPER_SET and
+       LOCOP_SET for controlling access to /set
+
+       * include/handlers.h (mo_privs): declare message handler for
+       reporting oper privileges
+
+       * include/client.h (client_report_privs): declare function to
+       report what privileges an oper has
+
+       * ircd/m_whois.c (do_whois): fix a bug that caused /whois to
+       report that a user is an oper if the oper doing the /whois had
+       PRIV_SEE_OPERS
+
+2000-12-17  Isomer <Isomer@coders.net>
+       * ircd/listener.c: added support for TOS twiddling as a 'feature'.
+
+2000-12-17  Isomer <Isomer@coders.net>
+       * ircd/os_linux.c: add TOS stuffs
+
+       * ircd/listener.c: add TOS stuffs
+
+2000-12-16  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/whocmds.c (do_who): use HasPriv to determine whether or not
+       to indicate a user is an oper
+
+       * ircd/s_user.c: clear privileges setting when deopping; don't
+       propagate +o unless user has PRIV_PROPAGATE privilege
+
+       * ircd/s_debug.c (debug_serveropts): created debug_serveropts()
+       function and replaced how the server option string is generated
+
+       * ircd/parse.c: remove conditional on CONFIG_OPERCMDS
+
+       * ircd/m_whois.c (do_whois): use HasPriv to determine whether or
+       not to indicate the user is an operator
+
+       * ircd/m_who.c: use HasPriv to determine whether or not a user
+       should be displayed in the list of opers
+
+       * ircd/m_version.c: call debug_serveropts() to get server option
+       string
+
+       * ircd/m_userip.c (userip_formatter): use HasPriv to determine
+       whether or not to show oper status
+
+       * ircd/m_userhost.c (userhost_formatter): use HasPriv to determine
+       whether or not to show oper status
+
+       * ircd/m_restart.c (mo_restart): replace ugly #ifdef conditional
+       checks with HasPriv check; remove dead code
+
+       * ircd/m_rehash.c (mo_rehash): replace ugly #ifdef conditional
+       checks with HasPriv check
+
+       * ircd/m_opmode.c (mo_opmode): use HasPriv to check permissions;
+       use feature_bool to check if disabled
+
+       * ircd/m_oper.c (m_oper): set oper priviliges
+
+       * ircd/m_mode.c (m_mode): replace #ifdef conditional with HasPriv
+       check
+
+       * ircd/m_kill.c (mo_kill): use HasPriv checks to determine if we
+       can kill
+
+       * ircd/m_kick.c (m_kick): replace #ifdef conditional with HasPriv
+       check
+
+       * ircd/m_jupe.c (mo_jupe): rework permissions checking structure;
+       use feature_bool to check if disabled
+
+       * ircd/m_join.c (m_join): remove BADCHAN conditional; replace
+       #ifdef conditional with a HasPriv check
+
+       * ircd/m_gline.c (mo_gline): rework permissions checking
+       structure; use feature_bool to check if any part is disabled
+
+       * ircd/m_die.c: replace ugly #ifdef conditionals with HasPriv
+       check; remove dead code
+
+       * ircd/m_clearmode.c: use feature_bool() to detect if we're
+       disabled; use HasPriv to figure out what we're permitted to do;
+       only allow clearmode on moded channels
+
+       * ircd/ircd_features.c: define various features; use HasPriv to
+       verify permissions to set/reset
+
+       * ircd/gline.c (gline_add): use HasPriv instead of #ifdef
+       conditionals
+
+       * ircd/client.c (client_set_privs): function to set an oper's
+       privileges
+
+       * ircd/channel.c: use HasPriv calls instead of #ifdef conditionals
+
+       * include/whocmds.h: deconditionalize several macros and
+       substitute appropriate calls to HasPriv()
+
+       * include/s_debug.h: get rid of global serveropts[]; define new
+       function debug_serveropts() to build that string on the fly
+
+       * include/ircd_features.h: define some features
+
+       * include/client.h: add privs member to struct Connection; define
+       various priviledges
+
+       * include/channel.h: no longer using IsOperOnLocalChannel; remove
+       conditional of MAGIC_OPER_OVERRIDE on OPER_WALK_THROUGH_LMODES
+
+       * doc/Configure.help: remove help information for deprecated
+       options
+
+       * config/config-sh.in: remove certain deprecated options having to
+       do with what opers can and cannot do--first stage in moving
+       compile-time constants into the .conf
+
+2000-12-16  Isomer <Isomer@coders.net>
+       * ircd/parse.c: detect if the prefix is missing and try and recover
+       instead of coring.
+
+2000-12-15  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_log.c: found and fixed some bugs in the debug logging
+       code that would sometimes result in the log file not being
+       reopened--which meant that a user could connect and get the
+       logging output--oops
+
+       * ircd/Makefile.in: run make depend...
+
+       * ircd/s_stats.c: get rid of report_feature_list()
+
+       * ircd/s_err.c: add the 'bad value' error message, shift error
+       messages over somewhat
+
+       * ircd/s_debug.c (debug_init): call log_debug_init with the
+       use_tty flag
+
+       * ircd/s_conf.c (read_configuration_file): unmark features before
+       reading the config file, then reset unmarked features after
+       reading the config file
+
+       * ircd/m_stats.c: use feature_report() instead of
+       report_feature_list()
+
+       * ircd/ircd_log.c: fix log_debug_file (bogus assertion); add
+       special 'mark' flags and use them; add the stuff needed by the
+       features API
+
+       * ircd/ircd_features.c: rework the features API and add gobs of
+       comments to try to explain what some of these complex functions
+       are actually doing
+
+       * include/s_stats.h: get rid of report_feature_list(); use
+       feature_report() instead
+
+       * include/numeric.h: added a new error message and shifted old
+       values over some--this is, after all, an alpha
+
+       * include/ircd_log.h: log_debug_init now takes an integer to tell
+       it if it should be using the tty; added a couple of functions
+       required by the features API
+
+       * include/ircd_features.h: add an enum and some more functions to
+       flesh out the feature API--it should now be possible to put all
+       those compile-time constants in the config file!
+
+       * ircd/send.c: got the direction of the assert incorrect...
+
+       * ircd/send.c: implement the efficiency of flush_connections by
+       creating a linked list of struct Connection's with queued data;
+       also get rid of flush_sendq_except and make sure to yank
+       connections out of the list when their sendQs become empty (notice
+       the assertion in flush_connections!)
+
+       * ircd/s_bsd.c (close_connection): must yank the Connection out of
+       the sendq list
+
+       * ircd/list.c (dealloc_connection): must yank the Connection out
+       of the sendq list
+
+       * ircd/dbuf.c (dbuf_put): call flush_connections instead of the
+       deprecated flush_sendq_except
+
+       * ircd/client.c: define a couple new helper functions for sendq
+       threading--this will make the flush_connections function in send.c
+       considerably more efficient by creating a linked list of
+       Connections that have queued data to send
+
+       * include/send.h: remove flush_sendq_except, as it's not used
+       anymore
+
+       * include/client.h: declare a couple new helper functions for the
+       sendq threading system
+
+2000-12-14  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_ison.c (m_ison): Apply Diane Bruce's patch to make ISON
+       parse all arguments
+
+       * ircd/s_debug.c (count_memory): modify to report for clients and
+       connections, not local clients and remote clients
+
+       * ircd/list.c: fiddle with the client-fiddling functions to take
+       into account the divorce of struct Connection from struct Client
+
+       * ircd/ircd.c: define a struct Connection for me, initialize it,
+       and link it into the right place (ewww, globals!)
+
+       * include/client.h: remove CLIENT_{LOCAL,REMOTE}_SIZE; split
+       struct Client into struct Client and struct Connection; redefine
+       local-portion accessor macros to go through struct Client to the
+       struct Connection; define struct Connection accessor macros
+
+2000-12-13  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/whowas.c: missed a couple of accesses to a struct Client
+
+       * ircd/uping.c: missed a couple of accesses to a struct Client
+
+       * ircd/send.c: missed a couple of accesses to a struct Client
+
+       * ircd/s_user.c: missed a couple of accesses to a struct Client
+
+       * ircd/s_misc.c: missed a couple of accesses to a struct Client
+
+       * ircd/s_conf.c: missed a couple of accesses to a struct Client
+
+       * ircd/s_bsd.c: missed a couple of accesses to a struct Client
+
+       * ircd/s_auth.c: missed a couple of accesses to a struct Client
+
+       * ircd/res.c: missed a couple of accesses to a struct Client
+
+       * ircd/parse.c: missed a couple of accesses to a struct Client
+
+       * ircd/m_whois.c: use new accessor macros for struct Client
+
+       * ircd/m_who.c: use new accessor macros for struct Client
+
+       * ircd/m_wallchops.c: use new accessor macros for struct Client
+
+       * ircd/m_version.c: use new accessor macros for struct Client
+
+       * ircd/m_userip.c: use new accessor macros for struct Client
+
+       * ircd/m_userhost.c: use new accessor macros for struct Client
+
+       * ircd/m_user.c: use new accessor macros for struct Client
+
+       * ircd/m_uping.c: use new accessor macros for struct Client
+
+       * ircd/m_trace.c: use new accessor macros for struct Client
+
+       * ircd/m_topic.c: use new accessor macros for struct Client
+
+       * ircd/m_time.c: use new accessor macros for struct Client
+
+       * ircd/m_stats.c: use new accessor macros for struct Client
+
+       * ircd/m_squit.c: use new accessor macros for struct Client
+
+       * ircd/m_silence.c: use new accessor macros for struct Client
+
+       * ircd/m_server.c: use new accessor macros for struct Client;
+       remove dead code
+
+       * ircd/m_rpong.c: use new accessor macros for struct Client
+
+       * ircd/m_rping.c: use new accessor macros for struct Client
+
+       * ircd/m_quit.c: use new accessor macros for struct Client
+
+       * ircd/m_privmsg.c: use new accessor macros for struct Client
+
+       * ircd/m_pong.c: use new accessor macros for struct Client; remove
+       dead code
+
+       * ircd/m_ping.c: use new accessor macros for struct Client
+
+       * ircd/m_pass.c: use new accessor macros for struct Client
+
+       * ircd/m_part.c: use new accessor macros for struct Client
+
+       * ircd/m_oper.c: use new accessor macros for struct Client
+
+       * ircd/m_notice.c: use new accessor macros for struct Client
+
+       * ircd/m_nick.c: use new accessor macros for struct Client
+
+       * ircd/m_names.c: use new accessor macros for struct Client
+
+       * ircd/m_mode.c: use new accessor macros for struct Client
+
+       * ircd/m_map.c: use new accessor macros for struct Client
+
+       * ircd/m_list.c: use new accessor macros for struct Client
+
+       * ircd/m_links.c: use new accessor macros for struct Client;
+       remove some dead code
+
+       * ircd/m_kill.c: use new accessor macros for struct Client; remove
+       some dead code
+
+       * ircd/m_kick.c: use new accessor macros for struct Client
+
+       * ircd/m_join.c: use new accessor macros for struct Client; remove
+       some dead code
+
+       * ircd/m_ison.c: use new accessor macros for struct Client
+
+       * ircd/m_invite.c: use new accessor macros for struct Client
+
+       * ircd/m_info.c: use new accessor macros for struct Client
+
+       * ircd/m_gline.c: use new accessor macros for struct Client
+
+       * ircd/m_error.c: use new accessor macros for struct Client
+
+       * ircd/m_create.c: use new accessor macros for struct Client
+
+       * ircd/m_connect.c: use new accessor macros for struct Client;
+       removed some dead code
+
+       * ircd/m_burst.c: use new accessor macros for struct Client
+
+       * ircd/m_away.c: use new accessor macros for struct Client
+
+       * ircd/m_admin.c: use new accessor macros for struct Client
+
+       * ircd/hash.c: missed a couple of accesses to a struct Client
+
+       * ircd/gline.c: missed a couple of accesses to a struct Client
+
+       * ircd/crule.c: missed a couple of accesses to a struct Client
+
+       * ircd/class.c: missed an access to a struct Client
+
+       * ircd/channel.c: missed a couple of accesses to a struct Client
+
+       * ircd/IPcheck.c: missed an access to a struct Client
+
+       * include/querycmds.h: fix a couple of stats macros to use
+       structure accessor macros
+
+       * include/client.h: change structure member names to highlight any
+       places in the code I've missed
+
+2000-12-12  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/whowas.c: use new struct Client accessor macros
+
+       * ircd/whocmds.c: use new struct Client accessor macros
+
+       * ircd/send.c: use new struct Client accessor macros
+
+       * ircd/s_user.c: use new struct Client accessor macros; removed
+       some dead code
+
+       * ircd/s_serv.c: use new struct Client accessor macros; removed
+       some dead code
+
+       * ircd/s_numeric.c: use new struct Client accessor macros
+
+       * ircd/s_misc.c: use new struct Client accessor macros
+
+       * ircd/s_debug.c: use new struct Client accessor macros
+
+       * ircd/s_conf.c: use new struct Client accessor macros
+
+       * ircd/s_bsd.c: use new struct Client accessor macros
+
+       * ircd/s_auth.c: use new struct Client accessor macros
+
+       * ircd/parse.c: use new struct Client accessor macros
+
+       * ircd/packet.c: use new struct Client accessor macros
+
+       * ircd/numnicks.c: use new struct Client accessor macros
+
+       * ircd/motd.c: use new struct Client accessor macros
+
+       * ircd/listener.c: use new struct Client accessor macros
+
+       * ircd/list.c: use new struct Client accessor macros
+
+       * ircd/jupe.c: use new struct Client accessor macros
+
+       * ircd/ircd_snprintf.c: use new struct Client accessor macros
+
+       * ircd/ircd_reply.c: use new struct Client accessor macros
+
+       * ircd/ircd_relay.c: use new struct Client accessor macros
+
+       * ircd/ircd.c: use new struct Client accessor macros
+
+       * ircd/gline.c: catch some instances of me.<stuff> I missed
+       previously
+
+       * ircd/client.c: use cli_ instead of con_
+
+       * ircd/class.c: use cli_ instead of con_
+
+       * ircd/channel.c: use cli_ instead of con_
+
+       * ircd/IPcheck.c: use cli_ instead of con_; catch some instances
+       of me.<stuff> I missed previously
+
+       * include/client.h: use cli_ instead of con_...seemed like a good
+       idea at the time *shrug*
+
+2000-12-11  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/hash.c: use struct Client accessor macros
+
+       * ircd/gline.c: use struct Client accessor macros
+
+       * ircd/crule.c: use struct Client accessor macros
+
+       * ircd/client.c: use struct Client accessor macros; remove some
+       dead code
+
+       * ircd/class.c: use struct Client accessor macros
+
+       * ircd/channel.c: use struct Client accessor macros; remove some
+       dead code
+
+       * ircd/IPcheck.c: use struct Client accessor macros
+
+       * include/numnicks.h: use struct Client accessor macros
+
+       * include/client.h: first step to divorcing struct Client and
+       struct Connection--define accessor macros and use them
+
+       * ircd/gline.c: When Uworld removed Uworld-set G-lines, only the
+       uplink would remove them.  This is because the removal protocol
+       message wasn't being sent to the uplinks.  This is fixed by fixing
+       propagate_gline() to send the proper number of arguments depending
+       on whether or not we're adding or deleting the Uworld gline, and
+       by having gline_deactivate() make sure to turn off the active bit
+       and call propagate_gline() if it's a Uworld gline
+
+2000-12-10  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/os_generic.c: make sure IOV_MAX gets defined, just in case
+
+       * ircd/os_bsd.c: apparently BSD doesn't have IOV_MAX defined
+       anywhere intelligent...
+
+2000-12-09  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/send.c (send_queued): call deliver_it with appropriate
+       arguments
+
+       * ircd/s_serv.c: reorder a couple of headers--cosmetic
+
+       * ircd/s_bsd.c (deliver_it): make deliver_it work with a struct
+       MsgQ
+
+       * ircd/os_solaris.c (os_sendv_nonb): function for calling writev
+       with appropriate iovec
+
+       * ircd/os_linux.c (os_sendv_nonb): function for calling writev
+       with appropriate iovec
+
+       * ircd/os_generic.c (os_sendv_nonb): function for calling writev
+       with appropriate iovec
+
+       * ircd/os_bsd.c (os_sendv_nonb): function for calling writev with
+       appropriate iovec
+
+       * ircd/msgq.c (msgq_mapiov): add a len_p argument for totalling up
+       exactly how much we're trying to write out to the fd
+
+       * include/s_bsd.h: make deliver_it take a struct MsgQ
+
+       * include/msgq.h: add a len_p argument to msgq_mapiov to help
+       detect short writes that indicate possible socket blocking
+
+       * include/ircd_osdep.h: declare os_sendv_nonb()
+
+       * ircd/channel.c (modebuf_mode): don't add empty modes...
+
+2000-12-08  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * include/send.h: add prio argument to send_buffer to select
+       between normal and priority queues
+
+       * ircd/s_user.c (send_user_info): add prio argument to send_buffer
+       call
+
+       * ircd/m_ison.c (m_ison): add prio argument to send_buffer call
+
+       * ircd/ircd_reply.c (send_reply): add prio argument to send_buffer
+       call
+
+       * ircd/channel.c (send_channel_modes): add prio argument to
+       send_buffer call
+
+       * ircd/send.c (send_buffer): add a prio argument to select the
+       priority queue; update send.c functions to use it
+
+       * ircd/msgq.c (msgq_add): remove msgq_prio; fold msgq_link and
+       msgq_add; add a prio argument to msgq_add to select the priority
+       queue
+
+       * include/msgq.h: remove msgq_prio; add a prio argument to
+       msgq_add
+
+       * ircd/send.c: remove sendbuf; remove GODMODE code; switch to
+       using msgq functions instead of dbuf functions; remove old, dead
+       sendto_* functions; redo send_buffer to take a struct MsgBuf;
+       rework sendcmdto_* functions to make use of the new struct MsgBuf
+
+       * ircd/s_user.c: remove hunt_server; restructure send_user_info to
+       make appropriate use of struct MsgBuf
+
+       * ircd/s_debug.c (count_memory): count memory used by the MsgQ
+       system and report it
+
+       * ircd/s_conf.c (read_configuration_file): use
+       sendto_opmask_butone instead of the now dead sendto_op_mask
+
+       * ircd/s_bsd.c: switch to using appropriate MsgQLength and other
+       calls on sendQ
+
+       * ircd/parse.c (parse_server): get rid of a piece of GODMODE code
+
+       * ircd/msgq.c: add msgq_append and msgq_bufleft; fix a bug in
+       msgq_clean
+
+       * ircd/m_version.c: fix spelling in comments marking dead code
+
+       * ircd/m_userip.c (userip_formatter): restructure to make use of
+       struct MsgBuf
+
+       * ircd/m_userhost.c (userhost_formatter): restructure to make use
+       of struct MsgBuf
+
+       * ircd/m_stats.c: use MsgQLength on a sendQ
+
+       * ircd/m_settime.c: use MsgQLength instead of DBufLength on a
+       sendQ; mark a piece of dead code
+
+       * ircd/m_names.c: use send_reply instead of sendto_one
+
+       * ircd/m_mode.c: use new mode; remove old dead code
+
+       * ircd/m_ison.c (m_ison): restructure to make use of struct MsgBuf
+
+       * ircd/m_burst.c: use BUFSIZE instead of IRC_BUFSIZE; remove old
+       dead code
+
+       * ircd/listener.c (accept_connection): use sendto_opmask_butone
+       instead of sendto_op_mask
+
+       * ircd/list.c (free_client): use MsgQClear to clear sendQ
+
+       * ircd/ircd_reply.c: remove send_error_to_client; restructure
+       send_reply to make use of struct MsgBuf
+
+       * ircd/dbuf.c (dbuf_put): remove argument to flush_sendq_except,
+       since its no longer used (at least currently)
+
+       * ircd/channel.c: restructure send_channel_modes to make use of
+       struct MsgBuf; remove set_mode, add_token_to_sendbuf, cancel_mode,
+       and send_hack_notice; use BUFSIZE instead of IRC_BUFSIZE
+
+       * ircd/Makefile.in: add msgq.c to list of sources; run make depend
+
+       * ircd/IPcheck.c: use sendcmdto_one instead of sendto_one
+
+       * include/send.h: send_buffer now takes a struct MsgBuf * instead
+       of a char *; flush_sendq_except now takes no arguments, as sendq
+       flushing currently only happens in dbuf.h and sendQ is a struct
+       MsgQ; remove prototypes for a lot of old sendto_* functions that
+       aren't used anymore; remove sendbuf and IRC_BUFSIZE--the former is
+       no longer needed, and the latter is identical to BUFSIZE in
+       ircd_defs.h
+
+       * include/s_user.h: make InfoFormatter take a struct MsgBuf*
+       instead of a char *; also make it return void, instead of char *
+
+       * include/msgq.h: add msgq_append and msgq_bufleft functions
+
+       * include/client.h: use a struct MsgQ instead of a struct DBuf for
+       sendq
+
+       * doc/Configure.help: Remove help for compile-time options that
+       have gone away
+
+       * config/config-sh.in: remove CONFIG_NEWMODE
+
+       * ircd/m_server.c (mr_server): don't send server IPs in any server
+       notices
+
+       * ircd/msgq.c (msgq_vmake): add \r\n to messages
+
+2000-12-07  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * include/msgq.h: declare the MsgQ API
+
+       * ircd/msgq.c: implementation of new MsgQ system
+
+2000-12-06  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_features.c: #include was supposed to be for
+         ircd_features.h, not features.h--missed when I had to do a
+         rename because of namespace collision
+
+2000-12-05  Greg Sikorski <gte@atomicrevs.demon.co.uk>
+       * ircd/m_topic.c: Added missing braces that caused all remote
+         topics to be ignored.
+
+2000-12-04  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_create.c: I'm tired of the exit_client warning :)
+       (ms_create): discovered that exit_client() was being called with
+       too few arguments
+
+       * ircd/s_misc.c (exit_client): remove all dependance on
+       FNAME_USERLOG, since that's now gone; log only to LS_USER
+
+       * ircd/s_debug.c: USE_SYSLOG no longer means anything
+
+       * ircd/m_oper.c (m_oper): no longer log to LS_OPERLOG--we already
+       log to LS_OPER
+
+       * ircd/m_kill.c: no longer conditionalize on SYSLOG_KILL
+
+       * ircd/ircd_log.c: remove LS_OPERLOG, LS_USERLOG
+
+       * include/ircd_log.h: remove LS_OPERLOG, LS_USERLOG--they serve
+       the same purpose as LS_USER and LS_OPER
+
+       * config/config-sh.in: remove no longer relevant log config
+       variables
+
+       * ircd/uping.c (uping_init): use log_write instead of ircd_log
+
+       * ircd/s_misc.c (exit_client): use log_write instead of ircd_log
+
+       * ircd/s_conf.c: use log_write instead of ircd_log
+
+       * ircd/s_bsd.c (report_error): use log_write instead of ircd_log
+
+       * ircd/s_auth.c (timeout_auth_queries): use log_write instead of
+       ircd_log
+
+       * ircd/res.c (send_res_msg): use log_write instead of ircd_log
+
+       * ircd/m_who.c: use log_write instead of write_log; no longer
+       conditionalize on WPATH; mark dead ircd_log calls
+
+       * ircd/m_uping.c: mark dead ircd_log call
+
+       * ircd/m_server.c (mr_server): use log_write instead of ircd_log
+
+       * ircd/m_restart.c: use log_write instead of ircd_log; mark dead
+       ircd_log calls
+
+       * ircd/m_rehash.c (mo_rehash): use log_write instead of ircd_log
+
+       * ircd/m_oper.c: use log_write instead of ircd_log; no longer
+       conditionalize on FNAME_OPERLOG; mark dead ircd_log calls
+
+       * ircd/m_kill.c: mark dead ircd_log calls
+
+       * ircd/m_connect.c: use log_write instead of ircd_log; mark dead
+       ircd_log
+
+       * ircd/m_clearmode.c: use log_write instead of write_log; no
+       longer conditionalize on OPATH
+
+       * ircd/jupe.c: use log_write instead of write_log; no longer
+       conditionalize on JPATH
+
+       * ircd/ircd_log.c: add USER subsystem; remove ircd_log() compat
+       function; fix a couple of bugs
+
+       * ircd/ircd_alloc.c: fixed a comment
+
+       * ircd/ircd.c: use log_write instead of ircd_log; fold server
+       notice generation in a couple of cases
+
+       * ircd/gline.c: use log_write instead of write_log; no longer
+       conditionalize on GPATH
+
+       * ircd/channel.c (modebuf_flush_int): use log_write instead of
+       write_log; no longer conditionalize on OPATH
+
+       * ircd/Makefile.in: run make depend, since dependencies have
+       changed
+
+       * doc/example.conf: add system USER to documentation
+
+       * include/ircd_log.h: add system USER; remove old ircd_log()
+       declarations
+
+2000-12-04  Isomer <isomer@coders.net>
+       * ircd/m_names.c: Add NAMES_EON to do_names to say add a
+       'end_of_names' reply when done.
+       * ircd/m_join.c: use NAMES_EON as mentioned above
+
+2000-12-01  net  <simms@LUCIDA.QC.CA>
+
+       * ircd/motd.c: add a freelist for struct Motds
+
+2000-11-30  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_stats.c (report_feature_list): report features--only
+       local opers can see logging configuration, since it doesn't really
+       mean anything to users
+
+       * ircd/s_err.c: add reply messages for new feature subsystem
+
+       * ircd/s_conf.c: add F lines to .conf
+
+       * ircd/parse.c: add the message descriptions for /set, /reset, and
+       /get
+
+       * ircd/m_stats.c: add /stats f
+
+       * ircd/m_set.c (mo_set): implement /set
+
+       * ircd/m_reset.c (mo_reset): implement /reset
+
+       * ircd/m_rehash.c: /rehash m now flushes MOTD cache, and /rehash l
+       reopens log files (for log file rotation)
+
+       * ircd/m_get.c (mo_get): implement /get
+
+       * ircd/ircd_log.c: use int instead of void return value; add
+       log_report_features() and log_canon(); fix a function that
+       disappears if DEBUGMODE not #define'd
+
+       * ircd/ircd_features.c: functions to manipulate feature settings
+       either from the config file or with the new /set, /reset, and /get
+       commands
+
+       * ircd/Makefile.in: add new .c files, run make depend
+
+       * include/s_stats.h: declare report_feature_list() (/stats f
+       handler)
+
+       * include/numeric.h: add RPL_STATSFLINE, RPL_FEATURE,
+       ERR_NOFEATURE, ERR_BADLOGTYPE, ERR_BADLOGSYS, and ERR_BADLOGVALUE
+       reply numerics
+
+       * include/msg.h: add defines for SET, RESET, and GET
+
+       * include/ircd_log.h: add a function to canonicalize subsystem
+       names; change some void return values to int
+
+       * include/ircd_features.h: new features subsystem handles all the
+       manipulation of special features, like log files
+
+       * include/handlers.h: declare new mo_{s,res,g}et message handlers
+       for fiddling with features run-time
+
+       * include/client.h (SNO_DEFAULT): don't set SNO_DEBUG by default;
+       seemed like a good idea at the time...
+
+       * doc/example.conf: document new F lines
+
+2000-11-29  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_debug.c: rewrite debug_init() and vdebug() in terms of
+       new logging functions, which have special support for the debug
+       log; added loop detection to vdebug(), so that I can
+       sendto_opmask_butone() from log_vwrite() without incurring another
+       call to vdebug()
+
+       * ircd/s_conf.c (rehash): call log_reopen() from rehash routine;
+       this allows log file rotations
+
+       * ircd/m_kill.c: call log_write_kill() instead of ircd_log_kill()
+
+       * ircd/ircd_log.c: much more work fleshing out the interface;
+       removed old interface; included backwards-compat ircd_log()
+       function that logs to subsystem LS_OLDLOG
+
+       * ircd/ircd.c: switch to new log_init()/log_close()/log_reopen()
+       functions
+
+       * include/ircd_log.h: include stdarg.h for va_list; move ordering
+       warning to top of file; fill out LogSys enum; declare new
+       log_debug_init(), log_vwrite(), log_write_kill(), and
+       log_[sg]et_*() functions; add flags argument to log_write();
+       defined flags to inhibit various logging actions
+
+       * include/client.h: added support for new SNO_DEBUG, enabled only
+       if DEBUGMODE is defined
+
+2000-11-28  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_log.c: make sure the various LOG_* constants are
+       defined (probably not needed, since #include <syslog.h> isn't
+       conditional); various static data needed for the new logging
+       functions; definitions of new logging functions
+
+       * include/ircd_log.h: new LogSys enum, declarations for part of
+       new logging API
+
+       * ircd/motd.c: we were setting type to MOTD_CLASS unconditionally,
+       which was of course stupid; switched to using switch/case in
+       initialization in motd_create(); zero the MotdList.other pointer
+       from motd_clear()
+
+       * ircd/ircd.c (main): motd_init() has to come before init_conf(),
+       or we overwrite init_conf()'s hard work with respect to T-lines
+
+2000-11-27  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_stats.c: comment out report_motd_list and include a
+       reference to motd_report()
+
+       * ircd/s_conf.c: rip out the old MOTD manipulation functions; call
+       motd_add() from the conf parser; call motd_clear() from the rehash
+       routine; remove the no longer needed memory clearing and reloading
+       stuff from the rehash service routine
+
+       * ircd/motd.c: loads new API, including static internal functions
+       to do allocation/deallocation, etc.
+
+       * ircd/m_stats.c: use new motd_report() instead of
+       report_motd_list()
+
+       * ircd/m_motd.c: use new syntax for motd_send()
+
+       * ircd/ircd.c: use new motd_init() function
+
+       * ircd/Makefile.in (SRC): forgot to add motd.c to SRC in
+       Makefile.(in); also ran make depend
+
+       * include/motd.h: don't need config.h, but now do need time.h;
+       define new structures and constants; redefine old API and define
+       new functions
+
+2000-11-22  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_user.c (register_user): use motd_signon() instead of
+       calling m_motd; much cleaner this way
+
+       * ircd/motd.c: write the new motd_* stuff to make MOTD handling
+       less of a crock
+
+       * ircd/m_motd.c: rewrite m{,s}_motd to call out to new motd_*
+       functions
+
+       * include/motd.h: define new MOTD API stuff
+
+2000-11-20  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_reply.c (protocol_violation): rewrite
+       protocol_violation so it'll actually work
+
+       oh, yeah, use %s -> cptr->name, instead of %c -> cptr, so we get
+       the client's real name in there.
+
+       * ircd/m_motd.c (m_motd): Iso's addition of get_client_class(sptr)
+       resulted in core dumps if NODEFAULTMOTD is defined, because m_motd
+       gets called from register_user with a NULL sptr.  This is probably
+       a design problem, but this bandaid will do for now...
+
+2000-11-19  Isomer <isomer@coders.net>
+       * ircd/ircd_reply.c: added 'protocol_violation', thus alerting us
+       to problems in the server<->server protocol.
+
+       * ircd/m_connect.c: allow remote connects with a port of '0'
+       meaning to use the port in the config file.
+
+       * ircd/m_create.c: Enable hacking protection, lets see how far we
+       get.
+
+       * ircd/m_error.c: The RFC says never accept ERROR from unreg'd
+       clients, so we don't any more.
+
+       * ircd/m_kill.c: The kill path is now made up of numnicks of servers,
+       and the user@host is displayed of the victim.
+
+       * ircd/m_map.c: reloaded 'dump_map'.
+
+       * ircd/m_trace.c: allow per class T:
+
+       * ircd/m_stats.c: allow local opers /remote stats anywhere on the 'net.
+
+2000-11-17  Isomer <isomer@coders.net>
+
+       * ircd/m_topic.c: Fixed bug where we'd only send to clients topics
+       that were the *same* instead of different.  Oh the embarrasment!
+
+       * ircd/IPcheck.c: Merged net's fix.
+
+2000-11-02  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_whois.c: remove compiler warning by adding a newline to
+       end of file
+
+       * ircd/m_names.c: moved the flags up to s_user.h
+
+       * ircd/m_join.c: call do_names instead of m_names; restructure
+       ms_join to never transmute a JOIN into a CREATE, but use the TS in
+       the JOIN (if present) to timestamp the channel
+
+       * ircd/channel.c: send JOINs individually, instead of grouping
+       them, so that we can send the channel's creation time
+
+       * include/s_user.h: declare do_names()
+
+2000-10-30  Isomer <isomer@coders.net>
+       * ircd/m_oper.c: Fixed warning
+
+2000-10-30  Isomer <isomer@coders.net>
+       * ircd/m_oper.c: Fixed over agressive cut and no paste
+
+2000-10-30  Isomer <isomer@coders.net>
+
+       * ircd/m_topic.c: Restructured, fixed bug where topics on local
+       channels are propergated (I forget who pointed this out to me, but
+       thanks anyway).  Also to save bandwidth don't send the topic to
+       users if the topic is already the same on the server (but still
+       propergate to other servers).  X/W's "autotopic" feature must
+       chew a lot of bandwidth, hopefully this will help reduce this.
+
+       * doc/rfc1459.rfc: Updated documentation on /topic.
+
+       * ircd/listener.c: snotice warnings about failed accept()'s
+       potentially warning admins that they're running out of fd's.
+
+       * ircd/stats.c, ircd/class.c: Removed /stats v, added number of
+       people in a class in /stats y
+
+       * ircd/m_create.c: Checks for timewarp hacking and squit's
+       evil servers. (currently disabled)
+       
+
+2000-10-30  net <simms@lucida.qc.ca>
+       
+       * ircd/gline.c: Fixed various bugs Isomer left behind.
+
+2000-10-26  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_join.c (m_join): reply on attempt to join a BADCHANed
+       channel is now ERR_BANNEDFROMCHAN instead of ERR_BADCHANNAME
+
+2000-10-24  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/channel.c: ok, now last mode rules; mode +ps will always
+       result in +s (and won't send a mode if the channel is already +s);
+       mode +sp will always result in +p; -n+n on a +n channel results in
+       no mode change; -n+n on a -n channel results in a +n mode change;
+       etc.
+
+2000-10-23  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/channel.c: add "add" and "del" elements to ParseState to
+       avoid not-too-pretty -p+s when +s is sufficient; fix a bug in
+       mode_parse_limit that caused it to clear all channel modes
+       prematurely; restructure mode_parse_mode to avoid calling
+       modebuf_mode too early (ties in with first mentioned change);
+       better logic for +p/+s mutual exclusivity; initialize "add" and
+       "del" elements in mode_parse; send simple modes down to
+       modebuf_mode after the loop in mode_parse
+
+2000-09-28  Greg Sikorski <gte@atomicrevs.demon.co.uk>
+       * ircd/m_names.c: Fixed a non-lethal logic error that 
+       triggers an assert() in find_member_link while debugging.
+       (Spotted by Maniac-).
+2000-09-19  Thomas Helvey <helveytw@home.com>
+       * ircd/s_conf.c: move K:lines to their own list and data
+       structures, add supporting code.
+       * ircd/m_stats.c: cleanup stats processing a bit move
+       kline listing code to a new function, haven't figured
+       out where it goes yet tho'
+       * ircd/s_stats.c: added K:line bulk lister
+       * include/s_conf.h: added new DenyConf struct
+       * *[ch]: fixeup code that depended on changes
+
+2000-09-17  Thomas Helvey <helveytw@home.com>
+       * ircd/class.c: encapsulate class list
+       * include/class.h: clean up classes
+       * * fixup code that depended on changes
+
+2000-09-17  Thomas Helvey <helveytw@home.com>
+       * ircd/s_conf.c: add me to local conf
+       * include/s_conf.h: move CONF_ME macro to chkconf.c
+       * ircd/s_bsd.c: cleanup initialization, allow virtual host
+       to be changed by rehash
+
+2000-09-17  Thomas Helvey <helveytw@home.com>
+       * include/class.h: add missing prototype
+       * ircd/class.c: make argument to get_conf_class const
+
+2000-09-17  Thomas Helvey <helveytw@home.com>
+       * ircd/*.c: merged in changes from 2.10.10.pl12, cleanup
+       merge conflicts.
+       * ircd/*.h: merged in changes from 2.10.10.pl12, cleanup
+       merge conflicts
+
+2000-09-16  Thomas Helvey <helveytw@home.com>
+       * ircd/s_conf.c: add code for server struct
+       * ircd/client.c: copy of class.c sort of, new file for client
+       specific operations, will move things here as appropriate,
+       currently only one function is exported from here.
+       * ircd/*.c: general logic cleanups, convert negatives to
+       positives in places.
+
+2000-09-16  Thomas Helvey <helveytw@home.com>
+       * ircd/s_conf.c: add code for new crule data structs, strip quotes
+       * ircd/crule.c: clean up scary casting a bit, type safety stuff
+       * include/s_conf.h: add CRuleConf struct and support, remove
+       unused constants
+       * include/crule.h: type safety cleanups
+       * ircd/*.c: fixup code that depended on stuff I changed
+
+2000-09-15  Thomas Helvey <helveytw@home.com>
+       * ircd/s_conf.c: start adding code for new conf data structs, changed
+       listeners, admin line, motd lines, class lines. Move validate_hostent
+       to resolver. General mayhem.
+       * include/s_conf.h: new data structs and accessors
+       * ircd/res.c: move validate_hostent here, rewrite, use regular
+       expression for validation.
+       * doc/example.conf: update docs for port
+
+2000-09-14  Thomas Helvey <helveytw@home.com>
+       * ircd/s_conf.c (conf_init): rewrite conf file parser, start to break
+       up conf_init into managable chunks.
+       * ircd/listener.c (set_listener_mask): fix logic bug core dump.
+       * include/s_conf.h: add new data struct for local info (unwinding the mess).
+
+2000-09-13  Thomas Helvey <helveytw@home.com>
+       * ircd/list.c: put Clients in free lists, pre-allocate MAXCONNECTIONS
+       local clients.
+       * ircd/list.c: put SLinks in free lists
+       * ircd/channel.c: put Memberships in free lists
+       * ircd/ircd.c: rearrange initializations a bit in main
+       Note: With these changes, ircd NEVER frees Clients, SLinks or
+       Memberships. It will also rarely need to allocate new
+       ones during net bursts and other disruptions. This should
+       cut down on memory fragmentation a bit as well.
+
+2000-08-30  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_names.c (do_names): pull-up from do_names fix in
+       u2.10.10.pl11
+
+2000-07-15  Perry Lorier       <Isomer@coders.net>
+       * various: IP only k:'s and G:'s now do bit tests instead of two(!) 
+                 match()'s.  Major Major cpu savings.  Also speed up the
+                 other case slightly.  As a side effect you can now
+                k/Gline *@10.0.0.0/8.  I'll do bans tomorrow, it's nearing
+                3am.
+
+2000-07-15  Perry Lorier       <Isomer@coders.net>
+       * various: Fixed warnings after compiling on an alpha.
+2000-07-09  Perry Lorier       <Isomer@coders.net>
+       * doc/ircd.8: Applied grammitical changes by Liandrin, applied
+                     changes suggested by various other people.
+       * ircd/IPcheck.c: More bug fixes.  Current problem appears to be
+                       that it gets a corrupt entry somehow.
+2000-07-09  Greg Sikorski <gte@atomicrevs.demon.co.uk>
+       * ircd/m_oper.c: Clean up compiler warning.
+
+2000-07-08  Perry Lorier       <Isomer@coders.net>
+       * doc/ircd.8: Updated the documentation, it was slightly out of date
+                     being updated around 1989.
+       * ircd/m_whois.c: Rewrote for clarity, and probably a bit more speed.
+                         fixed a few minor glitches.
+       * doc/rfc1459.unet: Updated.
+       * ircd/IPcheck.c: Fixed more bugs.
+       * ircd/s_bsd.c: We now keep track of servers we've conected.
+
+2000-07-02  Perry Lorier       <Isomer@coders.net>
+       * ircd/s_misc.c: Fixed remote IPcheck bug.  Ok, I'm a moron, so sue
+                       me.  Thanks to Hektik, thanks thanks thanks thanks
+                       thanks thanks thanks thanks thank thanks thank thanks
+
+2000-07-01  Perry Lorier       <Isomer@coders.net>
+       * ircd/s_conf.c: "Fixed" the "bug" where people would "evade" K:'s.
+       * ircd/s_conf.c, include/IPcheck.h: Fixed compile warnings.
+
+2000-06-22  Perry Lorier       <Isomer@coders.net>
+       * ircd/IPcheck.c: Large chunks redone.
+       * ircd/s_conf.c: Changes due to IPcheck - ONE nolonger supported,
+                       single AND double digit limits are allowed now.
+       * misc other: Changes to IPcheck.
+
+2000-06-30  Perry Lorier       <Isomer@coders.net>
+       * ircd/ircd.c: Fix command line parameter bugs.
+
+2000-06-30  Perry Lorier       <Isomer@coders.net>
+       * ircd/m_kill.c: Fixed bug with LOCAL_KILL_ONLY
+       * ircd/m_nick.c: Tidied things up.
+
+2000-06-12 Joseph Bongaarts <foxxe@trms.com>
+       * ircd/m_stats.c: Iso forgot mo_stats when he added /stats v
+       
+2000-05-29  Perry Lorier       <Isomer@coders.net>
+       * ircd/m_stats.c: add /stats v to do only the last part of the /trace
+       * ircd/IPcheck.c: Cosmetic change, if we meddle with it enough do
+                       you think it'll get bored and fix itself?
+
+2000-06-09  Greg Sikorski <gte@atomicrevs.demon.co.uk>
+
+       * ircd/m_names.c: Clean up compiler warnings.
+
+2000-06-09  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/channel.c (mode_parse_client): don't send warning if
+       there's not enough arguments for a +/-o/v; means the habit of
+       doing "/mode #channel +oooooo bob" doesn't result in a bunch of
+       error messages
+
+2000-06-04  Greg Sikorski <gte@atomicrevs.demon.co.uk>
+
+       * ircd/m_names.c: Re-factor code to remove unneccessary
+       GlobalChannelList iteration every time someone joins a channel.
+
+2000-06-02  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_user.c: add struct Gline * argument to register_user;
+       look up global glines and repropagate them if necessary; send
+       acknowledgement of gline to remote servers when registering users
+
+       * ircd/s_serv.c (server_estab): don't send acknowledgement of
+       local glines to remote servers; do send gline acknowledgement of
+       bursted users
+
+       * ircd/m_user.c (m_user): pass new struct Gline * argument to
+       register_user
+
+       * ircd/m_pong.c: pass new struct Gline * argument to register_user
+
+       * ircd/m_nick.c (ms_nick): document protocol change
+
+       * ircd/gline.c: support GLINE_LASTMOD
+
+       * include/s_user.h: add struct Gline * argument to register_user
+
+       * include/gline.h: add GLINE_LASTMOD to look up non-zero lastmods
+
+       * ircd/s_conf.c (find_kill): add unsigned int argument to
+       gline_lookup()
+
+       * ircd/gline.c: add GLINE_GLOBAL to lookup or find only global
+       glines; add unsigned int argument to gline_lookup()
+
+       * include/gline.h: add GLINE_GLOBAL flag; add unsigned int
+       argument to gline_lookup()
+
+       * ircd/m_server.c: Resend jupe only when there is no %<lastmod>
+       parameter, or when it falls out of bounds: see comments prior to
+       call to jupe_resend(); call server_estab with struct Jupe
+       parameter, so that we place the appropriate %<lastmod> in the
+       appropriate place.
+
+       * ircd/s_serv.c (server_estab): send %<lastmod> for introduced
+       server, as well as for servers when we're sending the BURST
+
+       * include/s_serv.h: add a struct Jupe * to the arguments for
+       server_estab() so that we can send the appropriate lastmod
+       parameter
+
+       * ircd/m_gline.c (ms_gline): actually, this should be the
+       slightest bit more efficient...
+
+       * ircd/m_jupe.c (ms_jupe): actually, this should be the slightest
+       bit more efficient...
+
+       * ircd/m_gline.c (ms_gline): inhibit GLINE processing resends
+       during netburst
+
+       * ircd/m_jupe.c (ms_jupe): inhibit JUPE processing resends during
+       netburst
+
+       * ircd/channel.c (joinbuf_join): really remove user from local
+       channels
+
+2000-05-29  Perry Lorier       <Isomer@coders.net>
+       * ircd/m_names.c: Removed redundant space. 
+       * ircd/s_bsd.c: Fixed incorrect syntax on ERROR line.
+
+2000-05-18  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_burst.c (ms_burst): er...that should have been a ",", not
+       a " "
+
+2000-05-04  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/channel.c: replace bogus assertions with returns, which is
+       logically correct; only wipe out limit/key if they were originally
+       set in the first place; remove user from channel when doing a
+       PARTALL; only send MODE +o for user CREATEing channel if user is
+       not MyUser--CREATE will only be used if the channel did not
+       originally exist, therefore we can assume no one local is on the
+       channel anyway, and we don't exactly need for the user to see an
+       explicit +o for themselves
+
+       * doc/readme.gline: describe the syntax of the GLINE command
+
+       * doc/readme.jupe: update to reflect a couple of changes to JUPE
+
+       * ircd/gline.c: don't propagate local changes
+
+       * ircd/jupe.c: don't propagate local changes
+
+       * ircd/m_gline.c (mo_gline): force local flag when deactivating
+       glines with 0 lastmod
+
+       * ircd/gline.c (gline_deactivate): G-lines with zero lastmod time
+       are now removed instead of being deactivated
+
+       * ircd/m_gline.c (ms_gline): make G-lines of the form "GLINE *
+       -<mask>" be accepted
+
+       * ircd/channel.c (send_channel_modes): deal with one of the last
+       vestiges of sendbuf
+
+       * ircd/m_burst.c (ms_burst): debugged ban processing; removed
+       debugging hooks
+
+       * ircd/channel.c (modebuf_extract): remove debugging
+       sendto_opmask_butone calls
+
+2000-05-03  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/channel.c: support a couple of new flags to support using
+       mode_parse; fix some bugs with 0 struct ModeBuf *; implementation
+       of modebuf_extract to extract added flags for use by ms_burst
+
+       * include/channel.h: a couple of new flags to support using
+       mode_parse inside ms_burst
+
+       * ircd/m_burst.c (ms_burst): brand new implementation of BURST
+
+       * ircd/m_endburst.c: add loop to processing of end_of_burst to
+       free empty channels after the BURST is over.
+
+       * ircd/m_server.c: convert to use new send.c functions--I wanted
+       to rewrite it from scratch, but the logic's pretty complex; I may
+       still rewrite it, though...
+
+2000-05-02  Thomas Helvey <tomh@inxpress.net>
+
+       * ircd/ircd.c: fix broken header include ordering
+
+2000-05-02  Thomas Helvey <tomh@inxpress.net>
+       
+       * ircd/IPcheck.c: cleanups for ZenShadow's cleanups
+        review emailed privately
+
+       * include/IPcheck.h: removed unneeded include
+
+2000-05-02  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_user.c (hunt_server): throw in a comment so I know what
+       the sendto_one is for
+
+       * include/querycmds.h (Count_unknownbecomesclient): convert to
+       sendto_opmask_butone
+
+       * ircd/send.c: start removing dead code
+
+       * include/send.h: start removing dead code
+
+       * ircd/m_rping.c: convert to sendcmdto_one / send_reply /
+       hunt_server_cmd
+
+       * ircd/m_rpong.c: convert to sendcmdto_one / send_reply
+
+2000-05-01  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_stats.c: convert to sendcmdto_one / send_reply
+
+       * ircd/m_kick.c: Completely reimplement m_kick
+
+       * ircd/channel.c: send_user_joins removed; it was dead code,
+       anyway...
+
+2000-05-01  Perry Lorier <isomer@coders.net>
+       * ircd/m_invite.c: Fix for the rest of m_invite.c, and again.
+       * ircd/channels.c: My fix for the part problem.  Untested, probably
+               won't work.  Can't be much worse than the current problem.
+               it'll either work or core, take your pick.
+
+
+2000-04-30  Perry Lorier <isomer@coders.net>
+       * config/config-sh.in: Fix for CONNEXIT
+       * ircd/s_{user,misc}.c: Fix for CONNEXIT
+       * ircd/m_invite.c: Fix for incorrectly numnickified invite.
+                       (Kev: Want to come talk to me about this?)
+
+2000-04-30  Steven M. Doyle <steven@doyle.net>
+       * ircd/ircd.c
+         - general cleanups and readability enhancements
+         - rewrite of setuid/chroot code.
+         - server will no longer run as root
+         - -DPROFIL compile option removed
+         - Fixed IPcheck API calls
+       * config/config-sh.in
+         - Fixed up chroot compile options
+         - Added options for debug and profile compiles
+       * config/gen.ircd.Makefile
+         - Support for new debug/profile options
+       * ircd/Makefile.in
+         - Support for new debug/profile options
+       * ircd/ircd_signal.c
+         - Removed -DPROFIL
+
+       * include/IPcheck.h
+         - Removed old API prototypes, added new ones
+       
+       * ircd/IPcheck.c
+         - Readability cleanups (well, I -think-...)
+         - Changed IPRegistryEntry.last_connect to a time_t.  The previously
+           used unsigned short was probably causing interesting things after
+           a client had been connected longer than about 65,535 seconds...
+         - Removed old API functions.
+
+       * ircd/whocmds.c
+         - Removed IPcheck.h include
+       
+       * Additionally modified IPcheck API calls in:
+         - ircd/m_nick.c
+         - ircd/m_auth.c
+         - ircd/s_bsd.c
+         - ircd/s_conf.c
+         - ircd/s_misc.c
+         - ircd/s_serv.c
+         - ircd/s_user.c
+       
+       
+2000-04-30  Perry Lorier <isomer@coders.net>
+       * ircd/s_bsd.c: Sigh. :)
+        * ircd/m_mode.c: fix for modeless channels by poptix.
+
+2000-04-29  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_join.c: reimplement JOIN in terms of struct JoinBuf
+
+       * ircd/channel.c (clean_channelname): make clean_channelname also
+       truncate long channel names
+
+2000-04-28  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_create.c: reimplement CREATE in terms of struct JoinBuf
+
+       * ircd/channel.c: implemented joinbuf_init, joinbuf_join,
+       joinbuf_flush
+
+       * include/channel.h: definitions and declarations for the struct
+       JoinBuf abstraction
+
+2000-04-29  Perry Lorier <isomer@coders.net>
+       * ircd/s_bsd.c: Ok, so I thought I compiled and tested this...
+
+2000-04-29  Perry Lorier <isomer@coders.net>
+       * ircd/s_bsd.c: Add debugging code to IPcheck
+
+2000-04-28  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * include/ircd_reply.h (SND_EXPLICIT): use instead of RPL_EXPLICIT
+
+       * ircd/ircd_reply.c (send_reply): use SND_EXPLICIT instead of
+       RPL_EXPLICIT
+
+       * ircd/m_userhost.c (m_userhost): add a dead code comment
+
+       * ircd/m_desynch.c: forgot one...
+
+       * ircd/m_rehash.c (mo_rehash): er, duplicates :)
+
+       * ircd/m_proto.c (proto_send_supported): just change a comment so
+       it doesn't show up in my scans
+
+       * ircd/ircd_reply.c (send_reply): fix a slight bug...
+
+       * ircd/s_numeric.c (do_numeric): use new sendcmdto_* functions,
+       kinda hackish...
+
+       * ircd/parse.c (parse_server): argument wrangling to make
+       processing in do_numeric a little easier to deal with
+
+       * ircd/s_serv.c (server_estab): SERVER should come from
+       acptr->serv->up, not &me
+
+       * ircd/m_lusers.c: accidentally left out sptr for a %C
+
+       * ircd/send.c: hack to support doing wallchops...
+
+       * ircd/m_whowas.c: convert to new send functions
+
+       * ircd/m_whois.c: convert to new send functions
+
+       * ircd/m_who.c: convert to new send functions
+
+       * ircd/m_wallops.c: convert to new send functions
+
+       * ircd/m_wallchops.c: convert to new send functions
+
+       * ircd/m_version.c: convert to new send functions
+
+       * ircd/m_userip.c: convert to new send functions
+
+       * ircd/m_userhost.c: convert to new send functions
+
+       * ircd/m_uping.c: convert to new send functions
+
+       * ircd/m_trace.c: convert to new send functions
+
+       * ircd/m_topic.c: convert to new send functions
+
+       * ircd/m_time.c: convert to new send functions
+
+       * ircd/m_squit.c: convert to new send functions
+
+       * ircd/m_silence.c: convert to new send functions
+
+       * ircd/m_settime.c: convert to new send functions
+
+       * ircd/m_restart.c: convert to new send functions
+
+       * ircd/m_rehash.c: convert to new send functions
+
+       * ircd/m_privmsg.c: convert to new send functions
+
+       * ircd/m_pong.c: convert to new send functions
+
+       * ircd/m_ping.c: convert to new send functions
+
+       * ircd/m_pass.c: convert to new send functions
+
+       * ircd/m_opmode.c: convert to new send functions
+
+       * ircd/m_oper.c: convert to new send functions
+
+       * ircd/m_notice.c: convert to new send functions
+
+       * ircd/m_nick.c: convert to new send functions
+
+       * ircd/m_names.c: convert to new send functions
+
+       * ircd/m_motd.c: convert to new send functions
+
+       * ircd/m_mode.c: convert to new send functions
+
+       * ircd/m_map.c: convert to new send functions
+
+       * ircd/m_lusers.c: convert to new send functions
+
+       * ircd/m_list.c: convert to new send functions
+
+       * ircd/m_links.c: convert to new send functions
+
+       * ircd/m_kill.c: convert to new send functions
+
+       * ircd/m_jupe.c: convert to new send functions
+
+       * ircd/m_invite.c: convert to new send functions
+
+       * ircd/m_info.c: convert to new send functions
+
+       * ircd/m_help.c: convert to new send functions
+
+       * ircd/m_gline.c: convert to new send functions
+
+       * ircd/m_error.c: convert to new send functions
+
+       * ircd/m_endburst.c: convert to new send functions
+
+       * ircd/m_die.c: convert to new send functions
+
+       * ircd/m_destruct.c: convert to new send functions
+
+       * ircd/m_defaults.c: convert to new send functions
+
+       * ircd/m_connect.c: convert to new send functions
+
+2000-04-28  Perry Lorier <isomer@coders.net>
+       * RELEASE.NOTES: Describe a few more undocumented features.
+       * config/config-sh.in: change the default paths for logging
+       and the recommended number of channels.
+       * include/supported.h: Rearrange slightly, added CHANTYPE's
+
+2000-04-27  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_close.c: convert to send_reply
+
+       * ircd/m_clearmode.c: convert to send_reply, sendcmdto_serv_butone
+
+       * ircd/m_away.c: convert to send_reply and sendcmdto_serv_butone
+
+       * ircd/m_admin.c: convert to send_reply and hunt_server_cmd
+
+       * ircd/s_user.c (hunt_server_cmd): new hunt_server replacement
+       that takes cmd and tok arguments, etc.  NOTE: THIS IMPLEMENTATION
+       HAS A MAJOR HACK!!!  The whole hunt_server architecture should be
+       carefully rethought...
+
+       * ircd/s_stats.c (hunt_stats): use new hunt_server_cmd
+
+       * include/s_user.h: hunt_server_cmd -- replacement for hunt_server
+
+       * ircd/s_misc.c: *sigh* 2.10.10 doesn't support squitting by
+       numeric nick; therefore, we have to use the server name
+
+       * ircd/m_squit.c (ms_squit): allow to squit by server numeric nick
+
+       * ircd/send.c: fix minor bugs
+
+       * ircd/s_user.c (check_target_limit): mark dead code so I filter
+       it when I grep
+
+       * ircd/s_serv.c (exit_new_server): mark dead code so I filter it
+       when I grep
+
+       * ircd/parse.c: mark dead code so I filter it when I grep
+
+       * ircd/map.c: mark dead code so I filter it when I grep
+
+       * ircd/ircd.c: mark dead code so I filter it when I grep
+
+       * ircd/ircd_relay.c: convert over to new sendcmdto_*, send_reply
+       functions
+
+       * ircd/channel.c: mark dead code so I filter it when I grep
+
+       * ircd/s_stats.c: use send_reply instead of sendto_one w/rpl_str;
+       hope I'm not stepping on toes...
+
+       * ircd/s_conf.c: more sendto_opmask_butone / send_reply
+       conversions; use ircd_snprintf in a couple of cases to negate the
+       possibility of buffer overflow
+
+2000-04-26  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/channel.c: convert as much as possible to new send
+       semantics
+
+       * ircd/send.c (sendcmdto_common_channels): fix a subtle bug --
+       test member->user->from->fd, not from->fd
+
+       * ircd/gline.c (gline_add): go ahead and add badchans; we just
+       won't look for them in m_gline; this way, they always work...
+
+       * ircd/jupe.c: use ircd_vsnprintf conversion specifiers
+
+       * ircd/gline.c: since write_log now uses ircd_vsnprintf, use
+       ircd_vsnprintf conversion specifiers
+
+       * ircd/support.c (write_log): use ircd_vsnprintf for write_log, so
+       I have my conversion specifiers
+
+       * ircd/gline.c (do_gline): use send_reply for ERR_YOUREBANNEDCREEP
+
+       * ircd/send.c (sendcmdto_flag_butone): explicitly send WALLOPS to
+       local users
+
+       * ircd/s_serv.c (exit_new_server): rewrite exit_new_server to be a
+       little less brain-dead
+
+       * ircd/s_misc.c: use sendcmdto_one, sendrawto_one, and send_reply
+
+       * ircd/s_debug.c: use send_reply with RPL_EXPLICIT for
+       RPL_STATSDEBUG
+
+       * ircd/res.c (cres_mem): use send_reply with RPL_EXPLICIT for
+       RPL_STATSDEBUG
+
+       * ircd/list.c (send_listinfo): use send_reply with RPL_EXPLICIT
+       for RPL_STATSDEBUG
+
+       * ircd/m_pong.c: use RPL_EXPLICIT for ERR_BADPING
+
+       * ircd/ircd.c: use RPL_EXPLICIT for ERR_BADPING
+
+       * ircd/s_user.c (register_user): use RPL_EXPLICIT for
+       ERR_INVALIDUSERNAME
+
+       * ircd/ircd_reply.c (send_reply): support RPL_EXPLICIT
+
+       * include/ircd_reply.h (RPL_EXPLICIT): somewhat of a hack to mark
+       a numeric as needing to use an explicit pattern, which will be the
+       first argument in the variable argument list
+
+       * ircd/s_user.c: use sendrawto_one instead of sendto_one to send
+       non-prefixed nospoof PING
+
+       * ircd/s_bsd.c: use sendrawto_one instead of sendto_one to send
+       non-prefixed SERVER login
+
+       * ircd/ircd.c (check_pings): fix last sendto_one calls (except for
+       a numeric usage further up)
+
+       * include/send.h: declare sendrawto_one
+
+       * ircd/send.c (sendrawto_one): new function to use ONLY for
+       non-prefixed commands, like PING to client, or PASS/SERVER on
+       server registration
+
+2000-04-25  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/ircd_snprintf.c (doprintf): implement %H for possible
+       future expansion (channel numerics?)
+
+       * include/ircd_snprintf.h: added documentation to # to explain use
+       with %C; added documentation for : to explain use with %C; added
+       documentation for %H for channels
+
+       * ircd/whocmds.c: use send_reply
+
+       * ircd/userload.c: use sendcmdto_one
+
+       * ircd/uping.c: use sendcmdto_one
+
+       * ircd/send.c: use new flags to %C format string; ':' prefixes
+       client name with a colon for local connects, '#' uses
+       nick!user@host form for local connects
+
+       * ircd/s_user.c: use send_reply, sendto_opmask_butone,
+       sendcmdto_one, sendcmdto_serv_butone, sendcmdto_flag_butone
+
+       * ircd/s_serv.c: use sendcmdto_one, sendto_opmask_butone
+
+       * ircd/s_bsd.c: use sendto_opmask_butone, send_reply,
+       sendcmdto_one
+
+       * ircd/s_auth.c: use sendto_opmask_butone
+
+       * ircd/res.c: use sendcmdto_one
+
+       * ircd/ircd_snprintf.c (doprintf): minor bug fixes and some
+       debugging assertions
+
+2000-04-24  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/support.c: dumpcore is no longer used, so get rid of it
+
+       * ircd/parse.c: use send_reply, sendcmdto_one
+
+       * ircd/map.c: use send_reply
+
+       * ircd/listener.c: use send_reply
+
+       * ircd/jupe.c: use sendto_opmask_butone, send_reply
+
+       * ircd/ircd_reply.c: use send_reply
+
+       * ircd/ircd.c: use sendto_opmask_butone
+
+       * ircd/gline.c: use sendto_opmask_butone, send_reply
+
+       * ircd/ircd_snprintf.c (doprintf): make it deal with incompletely
+       registered clients; make FLAG_ALT print nick!user@host; make
+       FLAG_COLON print :blah
+
+       * ircd/class.c (report_classes): use send_reply instead of
+       sendto_one
+
+       * ircd/hash.c (m_hash): replace sendto_one with sendcmdto_one
+
+       * ircd/IPcheck.c (ip_registry_connect_succeeded): replace
+       sendto_one with sendcmdto_one
+
+2000-04-21  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/send.c: clean up logic in sendcmdto_channel_butone; use
+       MyConnect() instead of IsServer() in sendcmdto_flag_butone; define
+       sendcmdto_match_butone
+
+       * include/send.h: declare sendcmdto_match_butone
+
+2000-04-20  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/jupe.c: update to use send_reply()
+
+       * ircd/gline.c: update to use send_reply()
+
+       * include/ircd_reply.h: declare send_reply
+
+       * ircd/ircd_reply.c (send_reply): send_error_to_client, but for
+       replies; uses ircd_snprintf
+
+       * ircd/send.c: added comments to redirect searchers to appropriate
+       sendcmdto_* function; moved new functions to end of file; added
+       explanatory comments; reordered arguments; defined new functions
+       mentioned below
+
+       * ircd/m_jupe.c: reorder arguments to sendcmdto_* functions
+
+       * ircd/m_gline.c: reorder arguments to sendcmdto_* functions
+
+       * ircd/jupe.c: reorder arguments to sendcmdto_* functions
+
+       * ircd/gline.c: reorder arguments to sendcmdto_* functions
+
+       * include/send.h: reorder arguments, add explanatory comments,
+       declare new functions sendcmdto_flag_butone, sendto_opmask_butone,
+       and vsendto_opmask_butone
+
+2000-04-19  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/send.c: define sendcmdto_channel_butone, wrote a simplified
+       vsendto_op_mask that uses '*' instead of the receiving client
+       nickname
+
+       * include/send.h: declare sendcmdto_channel_butone; takes a skip
+       argument that allows you to skip (or not to skip) deaf users,
+       users behind bursting servers, and non channel operators
+
+2000-04-17  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/send.c: new sendcmdto_channel_butserv -- note that old
+       sendto_channel_butserv has a subtle bug; also wrote
+       sendcmdto_common_channels.
+
+       * include/send.h: declare new sendcmdto_* functions
+
+       * ircd/jupe.c: support local deactivations of jupes
+
+       * ircd/gline.c: support local deactivations of glines
+
+       * include/jupe.h: JUPE_LDEACT allows jupes to be locally
+       deactivated; if they aren't locally deactivated, then it slaves to
+       the net-wide activation status; JupeIsRemActive() tests only
+       whether the jupe is active everywhere else
+
+       * include/gline.h: GLINE_LDEACT allows glines to be locally
+       deactivated; if they aren't locally deactivated, then it slaves to
+       the net-wide activation status; GlineIsRemActive() tests only
+       whether the gline is active everywhere else
+
+       * ircd/gline.c: detect overlapping G-lines; if an existing, wider
+       gline expires after the new one will, we drop the new one,
+       otherwise we add the G-line after that one (so the wide one will
+       apply first); if the new one contains an existing G-line and if it
+       will expire after the existing one, we drop the existing one to
+       save memory
+
+       * ircd/m_gline.c (mo_gline): opers could issue remote local
+       glines when CONFIG_OPERCMDS was off; fixed
+
+2000-04-16  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_jupe.c (mo_jupe): allow target argument to be dropped if
+       this is a local JUPE
+
+       * ircd/gline.c: add flags argument to gline_activate and
+       gline_deactivate for future expansion
+
+       * ircd/m_gline.c: pass flags to gline_activate and
+       gline_deactivate
+
+       * include/gline.h: add flags argument to gline_activate and
+       gline_deactivate
+
+       * ircd/jupe.c: add flags argument to jupe_activate and
+       jupe_deactivate for future expansion
+
+       * include/jupe.h: add flags argument to jupe_activate and
+       jupe_deactivate
+
+       * ircd/m_jupe.c: pass a flags argument to jupe_add instead of
+       local, active; pass flags to jupe_activate and jupe_deactivate
+
+       * include/gline.h: remove dead code
+
+       * ircd/gline.c: make gline expire times relative to CurrentTime,
+       since that should be monotonically increasing, instead of
+       TStime(), which can be set backwards, and which can therefore
+       cause an expire time to increase; make local glines be removed
+       instead of just deactivated; don't let gline_find() look for
+       user@host glines if the mask being looked up is a channel mask
+
+       * ircd/send.c (vsendcmdto_one): forgot to account for the case
+       where origin is a server and destination is a user
+
+       * ircd/jupe.c: make jupe expire times relative to CurrentTime,
+       since that should be monotonically increasing, instead of
+       TStime(), which can be set backwards, and which can therefore
+       cause an expire time to increase; make local jupes be removed
+       instead of just deactivated
+
+       * ircd/ircd_snprintf.c: d'oh, thanks for catching that; short for
+       limit is fine.  any other warnings I should know about?
+
+2000-04-15  Thomas Helvey <tomh@inxpress.net>
+
+       * ircd/*.c: const correctness and type safety cleanups to
+       get code to compile with C++ compiler. Still has
+       signed/unsigned comparison warnings.
+
+2000-04-15  Greg Sikorski <gte@atomicrevs.demon.co.uk>
+
+       * ircd/userload.c: change <sys/time.h> include to <time.h> for
+         portability.
+
+2000-04-14  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_gline.c (mo_gline): d'oh, target isn't a numeric; use %C
+       and convert acptr...
+
+       * ircd/s_user.c: move gline_lookup function call into
+       register_user, where it'll have a username to lookup!
+
+       * ircd/m_gline.c: modify to utilize new sendcmdto_* series of
+       functions; also stuff send_error_to_client into return clauses
+
+       * ircd/m_jupe.c: modify to utilize new sendcmdto_* series of
+       functions; also use send_error_to_client where that makes sense
+
+       * ircd/jupe.c: modify to utilize new sendcmdto_* series of
+       functions; also use send_error_to_client where that makes sense
+
+       * ircd/gline.c: modify to utilize new sendcmdto_* series of
+       functions; also fix gline_lookup() to deal properly with remote
+       clients--boy, do struct Client and struct User need to be cleaned
+       up!
+
+       * ircd/ircd_snprintf.c (doprintf): a dest of &me is a server,
+       too...
+
+       * ircd/send.c: wrote sendcmdto_one(), vsendcmdto_one(), and
+       sendcmdto_serv_butone(), all utilizing the %v conversion of
+       ircd_snprintf()
+
+       * include/send.h: define IRC_BUFSIZE, max size of a message;
+       declare sendcmdto_one(), vsendcmdto_one(), and
+       sendcmdto_serv_butone()
+
+       * include/msg.h: define all the CMD_* constants needed to utilize
+       the new sendcmdto_* series of functions
+
+       * ircd/Makefile.in (SRC): list ircd_snprintf.c; run make depend
+
+       * ircd/gline.c: remove old, dead code.
+
+       * ircd/m_gline.c (mo_gline): disallow setting of global G-lines
+       unless CONFIG_OPERCMDS is enabled; disallow listing of all G-lines
+       (don't advertise proxies); remove dead code
+
+       * ircd/parse.c: oper handler for JUPE only lists jupes unless
+       CONFIG_OPERCMDS is enabled
+
+       * ircd/m_jupe.c (mo_jupe): don't compile mo_jupe() if
+       CONFIG_OPERCMDS is not enabled; we'll disable it in parse.c
+
+       * ircd/m_opmode.c (mo_opmode): if CONFIG_OPERCMDS is not enabled,
+       always return ERR_DISABLED
+
+       * ircd/m_clearmode.c (mo_clearmode): if CONFIG_OPERCMDS is not
+       enabled, always return ERR_DISABLED
+
+       * ircd/s_err.c: add error message to indicate disabled commands
+
+       * include/numeric.h (ERR_DISABLED): to indicate disabled commands
+
+       * doc/Configure.help: add documentation for CONFIG_OPERCMDS
+
+       * config/config-sh.in: add CONFIG_OPERCMDS, default both it and
+       CONFIG_NEW_MODE to 'y' for now
+
+       * ircd/gline.c (gline_list): fix a minor formatting bogon
+
+       * BUGS: since I fixed that bug, might as well mark it fixed.
+
+       * ircd/m_join.c: look up badchans with GLINE_EXACT
+
+       * ircd/m_gline.c: fix parc count problems; look up existing
+       G-lines with GLINE_EXACT; only set new lastmod when
+       activating/deactivating existing glines if old lastmod was not 0
+
+       * ircd/gline.c: forgot to copy the gline reason over; don't
+       propagate a gline with 0 lastmod if origin is user; add
+       GLINE_EXACT to force exact matching of gline mask
+
+       * ircd/ircd_snprintf.c (doprintf): forgot to deal with the zero
+       flag properly
+
+       * ircd/s_conf.c (find_kill): gline_find() takes a char *userhost,
+       but gline_lookup() actually takes a client--d'oh.
+
+2000-04-13  Thomas Helvey <tomh@inxpress.net>
+       * ircd/IPcheck.c: Back port BLMet's bugfix from 2.10.10
+
+2000-04-13  Greg Sikorski <gte@atomicrevs.demon.co.uk>
+
+       * ircd/whocmds.c: Don't make idle flag default in /who, to prevent:
+         "/who * x"
+         "Gte3 H*iwg Gte@212.49.240.217 :1 :0 I am the one that was."
+         (Found by Plexus).
+
+       * ircd/whocmds.c: Change idle time calc from socket idle to user
+         idle.
+
+2000-04-13  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * config/aclocal.m4 (unet_CHECK_TYPE_SIZES): check size of void *,
+       too, for ircd_snprintf.c
+
+       * include/ircd_snprintf.h: documentation for ircd_(v)snprintf, in
+       comments; mostly descended from the Linux manpage for printf, but
+       also documenting the extensions.
+
+       * ircd/ircd_snprintf.c: NULL dest is equivalent to going to a
+       client; make 'q' be the same as 'L'; remove __inline__; only
+       define EXTENSION if HAVE_LONG_LONG is defined
+
+       * include/handlers.h: declare m_gline()
+
+       * ircd/parse.c: gline can be called by users, but it only lists
+       the glines.
+
+       * ircd/s_user.c (set_nick_name): resend gline if a remote server
+       introduces a glined client
+
+       * ircd/s_serv.c (server_estab): burst glines, too
+
+       * ircd/gline.c: fix up all the expire times to be offsets;
+       simplify gline_resend()
+
+       * ircd/m_gline.c: begin coding replacements for ms_gline(),
+       mo_gline(), and m_gline()
+
+       * ircd/gline.c (gline_add): allow *@#channel to work correctly;
+       also, prohibit local BADCHANs if LOCAL_BADCHAN not defined
+
+2000-04-13  Greg Sikorski <gte@atomicrevs.demon.co.uk>
+
+       * tools/Bouncer/*: Add comments/documentation/tags.
+       * tools/Bouncer/*: Add debug defines, make task fork().
+
+2000-04-12  Thomas Helvey <tomh@inxpress.net>
+       * ircd/s_err.c: Cleanup s_err.c make one table so we
+       don't have to do anything tricky to get an error string.
+
+2000-04-12  Greg Sikorski <gte@atomicrevs.demon.co.uk>
+       * Add port bouncer for http (x/w)
+
+2000-04-12  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/s_conf.c (find_kill): replaced call to find_gline() with a
+       call to gline_find(); also used GlineReason() instead of direct
+       reference to structure member
+
+       * ircd/m_join.c (m_join): replace bad_channel() calls with calls
+       to gline_find(name, GLINE_BADCHAN), and also check to see if gline
+       is active
+
+       * ircd/channel.c: nothing seems to be called anywhere...
+
+       * ircd/s_err.c: update a couple of replies to dovetail with new
+       semantics
+
+       * ircd/gline.c: begin complete re-implementation of gline.c along
+       the lines of the final design of jupe.c
+
+       * include/gline.h: begin complete re-implementation of gline.c
+       along the lines of the final design of jupe.c
+
+       * ircd/channel.c (mode_process_clients): fix "Deop of +k user on
+       %s by %s" message...
+
+       * ircd/ircd_snprintf.c: my new snprintf()-like functions
+
+       * include/ircd_snprintf.h: my new snprintf()-like functions
+
+2000-04-11  Thomas Helvey <tomh@inxpress.net>
+       * ircd/IPcheck.c: removed old dead code
+       * ircd/s_user.c (send_user_info): removed non-standard
+          user not found message for userhost/userip
+
+2000-04-11  Greg Sikorski <gte@atomicrevs.demon.co.uk>
+
+       * ircd/s_err.c: Added missing quotes to ERR_DONTCHEAT numeric.
+       * doc/p10.html: Work on chapter 4.
+
+2000-04-10  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/channel.c (mode_parse_client): fix coredump on /mode
+       #foobar +o nosuchnick
+
+2000-04-10  Perry Lorier  <Isomer@coders.net>
+       * BUGS: Added bug.
+
+2000-04-09  Thomas Helvey <tomh@inxpress.net>
+       * include/IPcheck.h: fix prototype
+       * ircd/s_user.c: fix usage of IPcheck_remote_connect
+       * ircd/IPcheck.c: removed unused args
+
+2000-04-09  Thomas Helvey <tomh@inxpress.net>
+       * include/IPcheck.h: add proto for IPcheck_expire
+
+       * ircd/IPcheck.c: Rewrote
+
+       * ircd/ircd.c: Add IPcheck_expire to main message loop
+
+       * ircd/s_user.c: Redo target hashing, refactor target code
+
+       * include/numeric.h: Cleaned up numerics, added which ones are
+       in use by other networks and what they are in use for.
+
+       * ircd/channel.c: cleaned can_join(), allow anyone through anything
+       if /invited, simplified the function.  Opers overusing OPEROVERRIDE
+       will get a message explaining to them not to cheat.
+
+       * ircd/m_join.c: cleaned up the various join functions, should be
+       a lot more efficient.  Still needs work.  Now assumes that s<->s
+       won't send it a JOIN 0.  Service coders - note this and tread with
+       care.
+
+       * ircd/m_stats.c: added Gte-'s stats doc patch.
+
+       * ircd/m_version.c: /version now returns the 005 numeric as well.
+       as requested by Liandrin.
+
+
+2000-04-07  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_clearmode.c: add include for support.h for write_log()
+
+       * configure: move ircd/crypt/* to tools/*
+
+2000-04-06  Thomas Helvey <tomh@inxpress.net>
+       * ircd/s_auth.c: Shorten auth connect timeout to 60 seconds
+          set client host to server alias if connection from localhost
+
+2000-04-06  Perry Lorier <isomer@coders.net>
+       * ircd/ircd.c: Fix core during pinging (oops)
+       
+2000-04-06  Perry Lorier <isomer@coders.net>
+       * ircd/send.c: fixed wrong ident being sent to channels bug.
+       * include/numerics.h: Updated some of the numerics from other
+       networks.  Flagged some as 'unused' by undernet.
+
+2000-03-30  Perry Lorier <isomer@coders.net>
+       * ircd/ircd.c: Lets see if this helps the ping problem at all.
+       * ircd/whocmds.c, /doc/readme.who: Added %l specifier to get idle
+       time for local clients. (as requested), extended who now returns all
+       the flags (@+!) so you can tell the complete state of a client.
+
+2000-03-30  Thomas Helvey <tomh@inxpress.net>
+       * m_rping.c m_rpong.c: add Gte's rping/rpong fixes
+
+2000-03-30  Perry Lorier <isomer@coders.net>
+       * ircd/parse.c: oops, missed opers.
+
+2000-03-30  Perry Lorier <isomer@coders.net>
+       * ircd/parse.c: fixed mystifying ping bug thats been plaguing us
+       for so long.  Remember: m_ping MUST be in the parse array. :)
+
+2000-03-30  Perry Lorier <isomer@coders.net>
+       * ircd/ircd.c: test in check_pings was wrong.  I move that we
+       disallow cvs commit after 10pm localtime....
+
+2000-03-30  Perry Lorier <isomer@coders.net>
+       * ircd/m_pong.c: Fix it for servers too.
+
+2000-03-30  Perry Lorier <isomer@coders.net>
+       * ircd/m_pong.c: Fix ping timeout bugs
+
+2000-03-30  Perry Lorier <isomer@coders.net>
+       * ircd/channel.c: Bans had CurrentTime in their when field instead
+       of TStime()
+
+2000-03-31  Thomas Helvey <tomh@ixpress.net>
+       * ircd/numnicks.c (SetXYYCapacity): fix for extended
+       numerics.
+
+2000-03-30  Perry Lorier <isomer@coders.net>
+       * ircd/m_nick.c: send kills both ways so when we add nick change
+       on collision we don't desync the network.
+
+       * ircd/map.c: Fixup the map a bit more.
+
+2000-03-31  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_clearmode.c (do_clearmode): Log the CLEARMODE to OPATH
+
+       * ircd/m_opmode.c: Log the mode changes to OPATH
+
+       * ircd/channel.c (modebuf_flush_int): Log the mode changes to
+       OPATH
+
+       * include/channel.h (MODEBUF_DEST_LOG): Log the mode changes to
+       OPATH
+
+       * doc/Configure.help: help text for CONFIG_LOG_OPMODE / OPATH
+
+       * config/config-sh.in: added OPATH for opmode log file
+
+       * ircd/m_clearmode.c (do_clearmode): updated uses of
+       modebuf_mode_string() for the new usage
+
+       * ircd/channel.c: added flag MODE_FREE and an int argument to
+       modebuf_mode_string() to indicate that the string must be free'd;
+       updated calls to modebuf_mode_string() for the new usage; called
+       collapse(pretty_mask()) on the ban string and use allocated memory
+       for it; added ban list length accounting; fixed a number of small
+       bugs in ban processing
+
+       * include/channel.h: added flag MODE_FREE and an int argument to
+       modebuf_mode_string() to indicate that the string must be free'd
+
+       * ircd/m_clearmode.c (do_clearmode): made sure clearmode removed
+       keys and limits that are set
+
+2000-03-30  Perry Lorier <isomer@coders.net>
+       * ircd/ircd.c: rewrote check_pings() for maintainability
+       and speed.  Also changed quit msg's so they don't have
+       redundant nick[host] info in them.
+
+       * ircd/send.c: Changed write errors to report what error
+       occured (if possible).
+
+       * ircd/gline.c: added gline comment to the quit.
+
+       * ircd/m_server.c: Added suggestions to server quits mentioning
+       what went wrong so the admin can fix it earlier instead of asking
+       questions...
+
+       * ircd/map.c: Changed m_map() to hide numerics, show a * beside
+       servers that aren't fully burst yet.  And show '(--s)' for servers
+       where its not sure.
+
+       * doc/example.conf: Fixed wrapped U:
+
+2000-03-30  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/m_mode.c (ms_mode): implemented a new m_mode in terms of
+       mode_parse() (version selectable at compile time)
+
+       * ircd/m_clearmode.c (mo_clearmode): clean_channelname(parv[1])
+
+       * ircd/m_opmode.c (mo_opmode): clean_channelname(parv[1])
+
+       * config/config-sh.in: add new config option to enable new m_mode
+       implementation
+
+       * doc/Configure.help: add documentation for new config option
+       CONFIG_NEW_MODE
+
+       * ircd/channel.c (mode_parse_client): /opmode #foobar -o -- 461
+       MODE -v : Not enough parameters
+
+       * ircd/m_clearmode.c (do_clearmode): do_clearmode() would remove
+       +k and +l even if they weren't set...
+
+       * ircd/m_opmode.c: implement the OPMODE command using mode_parse()
+
+       * ircd/channel.c: make mode_process_clients() clear the DEOPPED
+       flag; fix +s+p exclusivity; add MODE_ADD/MODE_DEL to flag list
+       for; test the 0-th member, not the i-th member, of the client
+       change state stuff
+
+       * ircd/m_clearmode.c (do_clearmode): use the new
+       mode_invite_clear() function
+
+       * ircd/channel.c: cleared up all the compile-time warnings and
+       errors
+
+       * include/channel.h: added declarations for mode_ban_invalidate()
+       and mode_invite_clear()
+
+       * ircd/channel.c: finished mode_parse(), then broke it up into a
+       dozen or so helper functions to make the code easier to read
+
+2000-03-29  Thomas Helvey <tomh@inxpress.net>
+       * ircd/ircd.c: refactor server initialization a bit, use
+       getopt for parsing command line, refactor init_sys, main,
+       and other bits.
+
+       * ircd/s_bsd.c: add functions for initialization to clean
+       up logic a bit and remove duplicated code.
+
+       * include/ircd.h: add struct for server process related
+       variables.
+
+2000-03-29  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/channel.c: initial definition of mode_parse(); flags to
+       prevent doing the same thing multiple times; helper method
+       send_notoper() to send a "Not oper"/"Not on channel" notice
+
+       * include/channel.h: declare mode_parse() and helper flags
+
+       * ircd/channel.c (modebuf_flush_int): fiddled with timestamp
+       sending to match the current action of set_mode() closely enough
+       that hopefully there won't be major conflicts
+
+       * ircd/channel.c (modebuf_flush_int): consolidated the mode string
+       building logic, reversed the order of the arguments to mode
+       commands to have '-' preceed '+'
+
+2000-03-29  Thomas Helvey <tomh@inxpress.net>
+       * ircd/s_bsd.c (add_connection): don't disable socket options
+       let OS tune itself and allow important performance tweaks to 
+       work.
+
+2000-03-28  Kevin L. Mitchell  <klmitch@mit.edu>
+
+       * ircd/channel.c (modebuf_flush_int): use %d, not %-15d; I got
+       confused by set_mode, which is doing some really weird logic;
+       guess what I'm going to rewrite next?  ;)
+
+2000-03-28  Kevin L. Mitchell  <klmitch@emc.com>
+
+       * include/channel.h: added MODE_SAVE for the bounds checking stuff
+       in modebuf_flush
+
+       * ircd/channel.c: make modebuf_flush into modebuf_flush_int and
+       make it do bounds checking on the buffer; all modes are sent only
+       if the all parameter is 1; modebuf_flush is the exported wrapper
+
+       * include/channel.h: add BOUNCE, renumber flags to get a little
+       more space
+
+       * ircd/channel.c (modebuf_flush): don't overload HACK2, add
+       BOUNCE; send DESYNCH message
+
+2000-03-27  Kevin L. Mitchell  <klmitch@emc.com>
+
+       * ircd/m_clearmode.c (do_clearmode): only mark the modes the
+       channel actually has in effect for deletion
+
+       * ircd/channel.c: added explanatory comments to all added
+       functions; made flushing take place at the correct place even if
+       the MODEBUF_DEST_DEOP flag is set; rewrote build_string() helper
+       to bash some stupid bugs; made modebuf_flush() return if ModeBuf
+       is empty, fixed the apparent source, removed some bogus string
+       termination code, properly terminate the mode strings, add support
+       for HACK2 and HACK3, made limit strings not be sent if the limit
+       is being removed, changed where '+' and '-' come from in sent
+       strings, added support for DEOP flag, set up bouncing code for
+       HACK2
+
+       * ircd/Makefile.in: ran make depend
+
+       * include/channel.h: added new defines for future functionality,
+       made modebuf_flush() return int so I can use tail recursion
+
+       * ircd/m_clearmode.c: add msg.h to includes; other misc cleanups
+       to make it all compile
+
+       * ircd/m_opmode.c: add msg.h to includes...
+
+       * ircd/m_clearmode.c: implemented mo_clearchan()/ms_clearchan()
+
+       * ircd/channel.c (modebuf_flush): realized I forgot to
+       nul-terminate addbuf/rembuf properly...
+
+       * ircd/m_clearmode.c (do_clearmode): wrote do_clearmode()...
+
+       * ircd/channel.c (modebuf_flush): correct sendto_server_butone to
+       sendto_serv_butone--blah^2
+
+       * ircd/send.c (sendto_serv_butone): stupid comments confused me
+
+       * ircd/channel.c (modebuf_flush): if there are no mode changes to
+       propagate, we're done...
+
+       * ircd/channel.c (modebuf_flush): duh; it's sendto_server_butone,
+       not sendto_all_butone
+
+       * ircd/m_clearmode.c: define skeleton for m{o,s}_clearmode
+
+       * ircd/m_opmode.c: define skeleton for m{o,s}_opmode
+
+       * ircd/Makefile.in (SRC): added m_opmode() and m_clearmode() to
+       the list
+
+       * ircd/parse.c: added messages for opmode and clearmode
+
+       * include/handlers.h: added declarations for mo_opmode(),
+       ms_opmode(), mo_clearmode(), and ms_clearmode()
+
+       * include/msg.h: define MSG_OPMODE, TOK_OPMODE, MSG_CLEARMODE, and
+       TOK_CLEARMODE
+
+       * include/channel.h (MODEBUF_DEST_OPMODE): Define the
+       MODEBUF_DEST_OPMODE flag
+
+       * ircd/channel.c (modebuf_flush): added new flag,
+       MODEBUF_DEST_OPMODE; causes channel MODE/HACK(4) notice to appear
+       to originate from source's server (or source itself, if
+       IsServer(source)); also causes a server-level MODE to be sent as
+       OPMODE instead
+
+       * include/channel.h: defined MODEBUF_DEST_SERVER,
+       MODEBUF_DEST_HACK4
+
+       * ircd/channel.c: Add another argument to build_string() to handle
+       numeric nicks; implemented MODEBUF_DEST_SERVER to send MODEs to
+       servers; implemented MODEBUF_DEST_HACK4 to cause HACK(4) notices
+       to be sent out
+
+2000-03-27  Perry Lorier <isomer@coders.net>
+
+       * ircd/s_bsd.c: fixed missing 'u' typo.
+
+2000-03-26  Kevin L. Mitchell  <klmitch@emc.com>
+
+       * ircd/channel.c: implement modebuf_init(), _mode(), _mode_uint(),
+       _mode_string(), _mode_client(), _flush(); also implemented a
+       simple build_string()
+
+       * include/channel.h: added definition of ModeBuf, modebuf_*
+       manipulation functions, and a couple of helper macros
+>>>>>>> 1.290.2.46
 
index 77911a9cca01f153f316b584710bc945ce97f89b..2b6dfc854b7d378922ba4f67bf091da221eeb716 100644 (file)
@@ -99,12 +99,9 @@ systems where ./configure does not detect that it is a system call.
 debugging the server.  THIS FEATURE SHOULD NOT BE USED ON A PRODUCTION
 NETWORK; it represents a severe privacy risk.
 
---enable-asserts
+--disable-asserts
   Assertions are a means of checking that certain underlying
-assumptions are met.  This option enables those assertions.  Note:
-This option should not be activated on production servers due to
-debugging code in the server's MyMalloc() implementation which will
-cause the server to leak memory.
+assumptions are met.  This option disables those assertions.
 
 --disable-symbols
   By default, the -g compiler option is used to enable symbols on the
index 462c1c36df86df8cdf77809308269cbd869ff0a5..b9a7725bb2c37a262b4e2d9cfbe8b154a005e7af 100755 (executable)
--- a/configure
+++ b/configure
@@ -18,7 +18,7 @@ ac_help="$ac_help
 ac_help="$ac_help
   --enable-debug          Turn on debugging mode"
 ac_help="$ac_help
-  --enable-asserts        Enable asserts"
+  --disable-asserts       Disable assertion checking"
 ac_help="$ac_help
   --disable-symbols       Disable debugging symbols (remove -g from CFLAGS)"
 ac_help="$ac_help
@@ -1942,7 +1942,6 @@ else
 #line 1943 "configure"
 #include "confdefs.h"
 #include <stdio.h>
-#include <sys/types.h>
 main()
 {
   FILE *f=fopen("conftestval", "w");
@@ -1951,7 +1950,7 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:1955: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1954: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_short=`cat conftestval`
 else
@@ -1971,7 +1970,7 @@ EOF
 
 
 echo $ac_n "checking size of int""... $ac_c" 1>&6
-echo "configure:1975: checking size of int" >&5
+echo "configure:1974: checking size of int" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1979,10 +1978,9 @@ else
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 1983 "configure"
+#line 1982 "configure"
 #include "confdefs.h"
 #include <stdio.h>
-#include <sys/types.h>
 main()
 {
   FILE *f=fopen("conftestval", "w");
@@ -1991,7 +1989,7 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:1995: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1993: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_int=`cat conftestval`
 else
@@ -2011,7 +2009,7 @@ EOF
 
 
 echo $ac_n "checking size of long""... $ac_c" 1>&6
-echo "configure:2015: checking size of long" >&5
+echo "configure:2013: checking size of long" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2019,10 +2017,9 @@ else
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 2023 "configure"
+#line 2021 "configure"
 #include "confdefs.h"
 #include <stdio.h>
-#include <sys/types.h>
 main()
 {
   FILE *f=fopen("conftestval", "w");
@@ -2031,7 +2028,7 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:2035: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2032: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_long=`cat conftestval`
 else
@@ -2051,7 +2048,7 @@ EOF
 
 
 echo $ac_n "checking size of void *""... $ac_c" 1>&6
-echo "configure:2055: checking size of void *" >&5
+echo "configure:2052: checking size of void *" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2059,10 +2056,9 @@ else
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 2063 "configure"
+#line 2060 "configure"
 #include "confdefs.h"
 #include <stdio.h>
-#include <sys/types.h>
 main()
 {
   FILE *f=fopen("conftestval", "w");
@@ -2071,7 +2067,7 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:2075: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2071: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_void_p=`cat conftestval`
 else
@@ -2092,12 +2088,12 @@ EOF
 
 if test "$ac_cv_sizeof_int" = 2 ; then
   echo $ac_n "checking for int16_t""... $ac_c" 1>&6
-echo "configure:2096: checking for int16_t" >&5
+echo "configure:2092: checking for int16_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_int16_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2101 "configure"
+#line 2097 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2125,12 +2121,12 @@ EOF
 fi
 
   echo $ac_n "checking for u_int16_t""... $ac_c" 1>&6
-echo "configure:2129: checking for u_int16_t" >&5
+echo "configure:2125: checking for u_int16_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_u_int16_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2134 "configure"
+#line 2130 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2159,12 +2155,12 @@ fi
 
 elif test "$ac_cv_sizeof_short" = 2 ; then
   echo $ac_n "checking for int16_t""... $ac_c" 1>&6
-echo "configure:2163: checking for int16_t" >&5
+echo "configure:2159: checking for int16_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_int16_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2168 "configure"
+#line 2164 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2192,12 +2188,12 @@ EOF
 fi
 
   echo $ac_n "checking for u_int16_t""... $ac_c" 1>&6
-echo "configure:2196: checking for u_int16_t" >&5
+echo "configure:2192: checking for u_int16_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_u_int16_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2201 "configure"
+#line 2197 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2229,12 +2225,12 @@ else
 fi
 if test "$ac_cv_sizeof_int" = 4 ; then
   echo $ac_n "checking for int32_t""... $ac_c" 1>&6
-echo "configure:2233: checking for int32_t" >&5
+echo "configure:2229: checking for int32_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_int32_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2238 "configure"
+#line 2234 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2262,12 +2258,12 @@ EOF
 fi
 
   echo $ac_n "checking for u_int32_t""... $ac_c" 1>&6
-echo "configure:2266: checking for u_int32_t" >&5
+echo "configure:2262: checking for u_int32_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_u_int32_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2271 "configure"
+#line 2267 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2296,12 +2292,12 @@ fi
 
 elif test "$ac_cv_sizeof_short" = 4 ; then
   echo $ac_n "checking for int32_t""... $ac_c" 1>&6
-echo "configure:2300: checking for int32_t" >&5
+echo "configure:2296: checking for int32_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_int32_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2305 "configure"
+#line 2301 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2329,12 +2325,12 @@ EOF
 fi
 
   echo $ac_n "checking for u_int32_t""... $ac_c" 1>&6
-echo "configure:2333: checking for u_int32_t" >&5
+echo "configure:2329: checking for u_int32_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_u_int32_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2338 "configure"
+#line 2334 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2363,12 +2359,12 @@ fi
 
 elif test "$ac_cv_sizeof_long" = 4 ; then
   echo $ac_n "checking for int32_t""... $ac_c" 1>&6
-echo "configure:2367: checking for int32_t" >&5
+echo "configure:2363: checking for int32_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_int32_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2372 "configure"
+#line 2368 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2396,12 +2392,12 @@ EOF
 fi
 
   echo $ac_n "checking for u_int32_t""... $ac_c" 1>&6
-echo "configure:2400: checking for u_int32_t" >&5
+echo "configure:2396: checking for u_int32_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_u_int32_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2405 "configure"
+#line 2401 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2433,12 +2429,12 @@ else
 fi
 
 echo $ac_n "checking for kqueue""... $ac_c" 1>&6
-echo "configure:2437: checking for kqueue" >&5
+echo "configure:2433: checking for kqueue" >&5
 if eval "test \"`echo '$''{'ac_cv_func_kqueue'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2442 "configure"
+#line 2438 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char kqueue(); below.  */
@@ -2461,7 +2457,7 @@ kqueue();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2465: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2461: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_kqueue=yes"
 else
@@ -2482,7 +2478,7 @@ fi
 
 
 echo $ac_n "checking for restartable system calls""... $ac_c" 1>&6
-echo "configure:2486: checking for restartable system calls" >&5
+echo "configure:2482: checking for restartable system calls" >&5
 if eval "test \"`echo '$''{'ac_cv_sys_restartable_syscalls'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2490,7 +2486,7 @@ else
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 2494 "configure"
+#line 2490 "configure"
 #include "confdefs.h"
 /* Exit 0 (true) if wait returns something other than -1,
    i.e. the pid of the child, which means that wait was restarted
@@ -2508,7 +2504,7 @@ main () {
 }
 
 EOF
-if { (eval echo configure:2512: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2508: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sys_restartable_syscalls=yes
 else
@@ -2532,15 +2528,15 @@ fi
 
 
 echo $ac_n "checking for donuts""... $ac_c" 1>&6
-echo "configure:2536: checking for donuts" >&5
+echo "configure:2532: checking for donuts" >&5
 echo "$ac_t""yes" 1>&6
 
-for ac_prog in mawk gawk nawk awk
+for ac_prog in gawk mawk nawk awk
 do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2544: checking for $ac_word" >&5
+echo "configure:2540: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2570,7 +2566,7 @@ test -n "$AWK" && break
 done
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:2574: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:2570: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2608,7 +2604,7 @@ fi
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:2612: checking for a BSD compatible install" >&5
+echo "configure:2608: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2661,7 +2657,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:2665: checking whether ln -s works" >&5
+echo "configure:2661: checking whether ln -s works" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2686,7 +2682,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2690: checking for $ac_word" >&5
+echo "configure:2686: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_RMPROG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2727,7 +2723,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2731: checking for $ac_word" >&5
+echo "configure:2727: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_SHPROG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2765,7 +2761,7 @@ test -n "$SHPROG" || SHPROG="/bin/sh"
 
 
 echo $ac_n "checking for posix non-blocking""... $ac_c" 1>&6
-echo "configure:2769: checking for posix non-blocking" >&5
+echo "configure:2765: checking for posix non-blocking" >&5
 if eval "test \"`echo '$''{'unet_cv_sys_nonblocking_posix'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2773,7 +2769,7 @@ else
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 2777 "configure"
+#line 2773 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -2799,7 +2795,7 @@ int main(void)
   exit(1);
 }
 EOF
-if { (eval echo configure:2803: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2799: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   unet_cv_sys_nonblocking_posix=yes
 else
@@ -2821,7 +2817,7 @@ EOF
 
 else
 echo $ac_n "checking for bsd non-blocking""... $ac_c" 1>&6
-echo "configure:2825: checking for bsd non-blocking" >&5
+echo "configure:2821: checking for bsd non-blocking" >&5
 if eval "test \"`echo '$''{'unet_cv_sys_nonblocking_bsd'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2829,7 +2825,7 @@ else
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 2833 "configure"
+#line 2829 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -2855,7 +2851,7 @@ int main(void)
   exit(1);
 }
 EOF
-if { (eval echo configure:2859: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2855: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   unet_cv_sys_nonblocking_bsd=yes
 else
@@ -2883,19 +2879,19 @@ EOF
 fi
 fi
 echo $ac_n "checking for posix signals""... $ac_c" 1>&6
-echo "configure:2887: checking for posix signals" >&5
+echo "configure:2883: checking for posix signals" >&5
 if eval "test \"`echo '$''{'unet_cv_sys_signal_posix'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2892 "configure"
+#line 2888 "configure"
 #include "confdefs.h"
 #include <signal.h>
 int main() {
 sigaction(SIGTERM, (struct sigaction *)0L, (struct sigaction *)0L)
 ; return 0; }
 EOF
-if { (eval echo configure:2899: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2895: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   unet_cv_sys_signal_posix=yes
 else
@@ -2915,7 +2911,7 @@ EOF
 
 else
 echo $ac_n "checking for bsd reliable signals""... $ac_c" 1>&6
-echo "configure:2919: checking for bsd reliable signals" >&5
+echo "configure:2915: checking for bsd reliable signals" >&5
 if eval "test \"`echo '$''{'unet_cv_sys_signal_bsd'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2923,7 +2919,7 @@ else
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 2927 "configure"
+#line 2923 "configure"
 #include "confdefs.h"
 #include <signal.h>
 int calls = 0;
@@ -2941,7 +2937,7 @@ int main(void)
   exit (0);
 }
 EOF
-if { (eval echo configure:2945: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2941: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   unet_cv_sys_signal_bsd=yes
 else
@@ -2970,20 +2966,20 @@ fi
 fi
 
 echo $ac_n "checking if the compiler understands -pipe""... $ac_c" 1>&6
-echo "configure:2974: checking if the compiler understands -pipe" >&5
+echo "configure:2970: checking if the compiler understands -pipe" >&5
 unet_cv_pipe_flags="$ac_cv_prog_gcc"
 if test "$ac_cv_prog_gcc" = no; then
   OLDCFLAGS="$CFLAGS"
   CFLAGS="$CFLAGS -pipe"
   cat > conftest.$ac_ext <<EOF
-#line 2980 "configure"
+#line 2976 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2987: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2983: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   unet_cv_pipe_flags=yes
 else
@@ -3003,7 +2999,7 @@ fi
 
 
 echo $ac_n "checking for OS-dependent information""... $ac_c" 1>&6
-echo "configure:3007: checking for OS-dependent information" >&5
+echo "configure:3003: checking for OS-dependent information" >&5
 case "$host" in
     *-linux*)
        echo "$ac_t""Linux ($host) found." 1>&6
@@ -3063,7 +3059,7 @@ esac
 
 
 echo $ac_n "checking whether to enable use of poll()""... $ac_c" 1>&6
-echo "configure:3067: checking whether to enable use of poll()" >&5
+echo "configure:3063: checking whether to enable use of poll()" >&5
 # Check whether --enable-poll or --disable-poll was given.
 if test "${enable_poll+set}" = set; then
   enableval="$enable_poll"
@@ -3097,7 +3093,7 @@ fi
 
 
 echo $ac_n "checking whether to enable debug mode""... $ac_c" 1>&6
-echo "configure:3101: checking whether to enable debug mode" >&5
+echo "configure:3097: checking whether to enable debug mode" >&5
 # Check whether --enable-debug or --disable-debug was given.
 if test "${enable_debug+set}" = set; then
   enableval="$enable_debug"
@@ -3121,7 +3117,7 @@ EOF
 fi
 
 echo $ac_n "checking whether to enable asserts""... $ac_c" 1>&6
-echo "configure:3125: checking whether to enable asserts" >&5
+echo "configure:3121: checking whether to enable asserts" >&5
 # Check whether --enable-asserts or --disable-asserts was given.
 if test "${enable_asserts+set}" = set; then
   enableval="$enable_asserts"
@@ -3130,7 +3126,7 @@ else
   if eval "test \"`echo '$''{'unet_cv_enable_asserts'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  unet_cv_enable_asserts=no
+  unet_cv_enable_asserts=yes
 fi
 
 fi
@@ -3145,7 +3141,7 @@ EOF
 fi
 
 echo $ac_n "checking whether to enable debugging symbols""... $ac_c" 1>&6
-echo "configure:3149: checking whether to enable debugging symbols" >&5
+echo "configure:3145: checking whether to enable debugging symbols" >&5
 # Check whether --enable-symbols or --disable-symbols was given.
 if test "${enable_symbols+set}" = set; then
   enableval="$enable_symbols"
@@ -3166,7 +3162,7 @@ if test x"$unet_cv_enable_symbols" = xyes; then
 fi
 
 echo $ac_n "checking whether to enable profiling support (gprof)""... $ac_c" 1>&6
-echo "configure:3170: checking whether to enable profiling support (gprof)" >&5
+echo "configure:3166: checking whether to enable profiling support (gprof)" >&5
 # Check whether --enable-profile or --disable-profile was given.
 if test "${enable_profile+set}" = set; then
   enableval="$enable_profile"
@@ -3187,7 +3183,7 @@ if test x"$unet_cv_enable_profile" = xyes; then
 fi
 
 echo $ac_n "checking whether to enable pedantic compiler warnings""... $ac_c" 1>&6
-echo "configure:3191: checking whether to enable pedantic compiler warnings" >&5
+echo "configure:3187: checking whether to enable pedantic compiler warnings" >&5
 # Check whether --enable-pedantic or --disable-pedantic was given.
 if test "${enable_pedantic+set}" = set; then
   enableval="$enable_pedantic"
@@ -3208,7 +3204,7 @@ if test x"$unet_cv_enable_pedantic" = xyes; then
 fi
 
 echo $ac_n "checking whether to enable compiler warnings""... $ac_c" 1>&6
-echo "configure:3212: checking whether to enable compiler warnings" >&5
+echo "configure:3208: checking whether to enable compiler warnings" >&5
 # Check whether --enable-warnings or --disable-warnings was given.
 if test "${enable_warnings+set}" = set; then
   enableval="$enable_warnings"
@@ -3229,7 +3225,7 @@ if test x"$unet_cv_enable_warnings" = xyes; then
 fi
 
 echo $ac_n "checking whether to enable inlining for a few critical functions""... $ac_c" 1>&6
-echo "configure:3233: checking whether to enable inlining for a few critical functions" >&5
+echo "configure:3229: checking whether to enable inlining for a few critical functions" >&5
 # Check whether --enable-inlines or --disable-inlines was given.
 if test "${enable_inlines+set}" = set; then
   enableval="$enable_inlines"
@@ -3253,7 +3249,7 @@ EOF
 fi
 
 echo $ac_n "checking whether to enable the /dev/poll event engine""... $ac_c" 1>&6
-echo "configure:3257: checking whether to enable the /dev/poll event engine" >&5
+echo "configure:3253: checking whether to enable the /dev/poll event engine" >&5
 # Check whether --enable-devpoll or --disable-devpoll was given.
 if test "${enable_devpoll+set}" = set; then
   enableval="$enable_devpoll"
@@ -3283,7 +3279,7 @@ EOF
 fi
 
 echo $ac_n "checking whether to enable the kqueue event engine""... $ac_c" 1>&6
-echo "configure:3287: checking whether to enable the kqueue event engine" >&5
+echo "configure:3283: checking whether to enable the kqueue event engine" >&5
 # Check whether --enable-kqueue or --disable-kqueue was given.
 if test "${enable_kqueue+set}" = set; then
   enableval="$enable_kqueue"
@@ -3313,7 +3309,7 @@ EOF
 fi
 
 echo $ac_n "checking what name to give the symlink""... $ac_c" 1>&6
-echo "configure:3317: checking what name to give the symlink" >&5
+echo "configure:3313: checking what name to give the symlink" >&5
 # Check whether --with-symlink or --without-symlink was given.
 if test "${with_symlink+set}" = set; then
   withval="$with_symlink"
@@ -3345,7 +3341,7 @@ fi
 
 
 echo $ac_n "checking what permissions to set on the installed binary""... $ac_c" 1>&6
-echo "configure:3349: checking what permissions to set on the installed binary" >&5
+echo "configure:3345: checking what permissions to set on the installed binary" >&5
 # Check whether --with-mode or --without-mode was given.
 if test "${with_mode+set}" = set; then
   withval="$with_mode"
@@ -3371,7 +3367,7 @@ IRCDMODE=$unet_cv_with_mode
 
 unet_uid=`id | sed -e 's/.*uid=[0-9]*(//' -e 's/).*//' 2> /dev/null`
 echo $ac_n "checking which user should own the installed binary""... $ac_c" 1>&6
-echo "configure:3375: checking which user should own the installed binary" >&5
+echo "configure:3371: checking which user should own the installed binary" >&5
 # Check whether --with-owner or --without-owner was given.
 if test "${with_owner+set}" = set; then
   withval="$with_owner"
@@ -3397,7 +3393,7 @@ IRCDOWN=$unet_cv_with_owner
 
 unet_gid=`id | sed -e 's/.*gid=[0-9]*(//' -e 's/).*//' 2> /dev/null`
 echo $ac_n "checking which group should own the installed binary""... $ac_c" 1>&6
-echo "configure:3401: checking which group should own the installed binary" >&5
+echo "configure:3397: checking which group should own the installed binary" >&5
 # Check whether --with-group or --without-group was given.
 if test "${with_group+set}" = set; then
   withval="$with_group"
@@ -3429,7 +3425,7 @@ if test -f /etc/resolv.conf; then
     fi
 fi
 echo $ac_n "checking for site domain name""... $ac_c" 1>&6
-echo "configure:3433: checking for site domain name" >&5
+echo "configure:3429: checking for site domain name" >&5
 # Check whether --with-domain or --without-domain was given.
 if test "${with_domain+set}" = set; then
   withval="$with_domain"
@@ -3459,7 +3455,7 @@ EOF
 
 
 echo $ac_n "checking if chroot operation is desired""... $ac_c" 1>&6
-echo "configure:3463: checking if chroot operation is desired" >&5
+echo "configure:3459: checking if chroot operation is desired" >&5
 # Check whether --with-chroot or --without-chroot was given.
 if test "${with_chroot+set}" = set; then
   withval="$with_chroot"
@@ -3507,7 +3503,7 @@ prefix=$unet_save_prefix
 exec_prefix=$unet_save_exec_prefix
 
 echo $ac_n "checking where the binary will be for /restart""... $ac_c" 1>&6
-echo "configure:3511: checking where the binary will be for /restart" >&5
+echo "configure:3507: checking where the binary will be for /restart" >&5
 if test x"$unet_cv_with_symlink" = xno; then
     unet_spath="$unet_bindir/ircd"
 else
@@ -3529,7 +3525,7 @@ EOF
 
 
 echo $ac_n "checking what the data directory should be""... $ac_c" 1>&6
-echo "configure:3533: checking what the data directory should be" >&5
+echo "configure:3529: checking what the data directory should be" >&5
 # Check whether --with-dpath or --without-dpath was given.
 if test "${with_dpath+set}" = set; then
   withval="$with_dpath"
@@ -3572,7 +3568,7 @@ DPATH=$unet_cv_with_dpath
 
 
 echo $ac_n "checking where the default configuration file resides""... $ac_c" 1>&6
-echo "configure:3576: checking where the default configuration file resides" >&5
+echo "configure:3572: checking where the default configuration file resides" >&5
 # Check whether --with-cpath or --without-cpath was given.
 if test "${with_cpath+set}" = set; then
   withval="$with_cpath"
@@ -3614,7 +3610,7 @@ EOF
 
 
 echo $ac_n "checking where to put the debugging log if debugging enabled""... $ac_c" 1>&6
-echo "configure:3618: checking where to put the debugging log if debugging enabled" >&5
+echo "configure:3614: checking where to put the debugging log if debugging enabled" >&5
 # Check whether --with-lpath or --without-lpath was given.
 if test "${with_lpath+set}" = set; then
   withval="$with_lpath"
@@ -3660,7 +3656,7 @@ EOF
 unet_maxcon=`ulimit -Hn`
 unet_maxcon=`expr $unet_maxcon - 4`
 echo $ac_n "checking max connections""... $ac_c" 1>&6
-echo "configure:3664: checking max connections" >&5
+echo "configure:3660: checking max connections" >&5
 # Check whether --with-maxcon or --without-maxcon was given.
 if test "${with_maxcon+set}" = set; then
   withval="$with_maxcon"
index c466691e97c966886f4dbb120f97c9a3115c59c0..4a6f25717a57f7d291d7b2ab13e725a23422760a 100644 (file)
@@ -246,13 +246,13 @@ if test x"$unet_cv_enable_debug" = xyes; then
     AC_DEFINE([DEBUGMODE], , [Enable debugging code])
 fi
 
-dnl And now for --enable-asserts
+dnl And now for --disable-asserts
 AC_MSG_CHECKING([whether to enable asserts])
 AC_ARG_ENABLE([asserts],
-[  --enable-asserts        Enable asserts],
+[  --disable-asserts       Disable assertion checking],
 [unet_cv_enable_asserts=$enable_asserts],
 [AC_CACHE_VAL(unet_cv_enable_asserts,
-[unet_cv_enable_asserts=no])])
+[unet_cv_enable_asserts=yes])])
 AC_MSG_RESULT([$unet_cv_enable_asserts])
 
 if test x"$unet_cv_enable_asserts" = xno; then
index e83adc4671cd7c4363206f5e78e749dd1c7b0add..3d42f5f6920bf409c753c82919e6bdfc7c0b73ef 100644 (file)
@@ -444,6 +444,7 @@ P:192.168.*:::6666
 # F:CLIENT_FLOOD:1024
 # F:SERVER_PORT:4400
 # F:NODEFAULTMOTD:TRUE
+# F:MOTD_BANNER
 # F:KILL_IPMISMATCH:FALSE
 # F:IDLE_FROM_MSG:TRUE
 # F:HUB:FALSE
@@ -452,6 +453,8 @@ P:192.168.*:::6666
 # F:RANDOM_SEED:<you should set one explicitly>
 # F:DEFAULT_LIST_PARAM
 # F:NICKNAMEHISTORYLENGTH:800
+# F:HOST_HIDING:FALSE
+# F:HIDDEN_HOST:users.undernet.org
 # F:KILLCHASETIMELIMIT:30
 # F:MAXCHANNELSPERUSER:10
 # F:AVBANLEN:40
@@ -472,6 +475,7 @@ P:192.168.*:::6666
 # F:VIRTUAL_HOST:FALSE
 # F:TOS_SERVER:0x08
 # F:TOS_CLIENT:0x08
+# F:POLLS_PER_LOOP:200
 # F:CRYPT_OPER_PASSWORD:TRUE
 # F:OPER_NO_CHAN_LIMIT:TRUE
 # F:OPER_MODE_LCHAN:TRUE
@@ -494,7 +498,7 @@ P:192.168.*:::6666
 # F:OPER_LOPMODE:TRUE
 # F:OPER_BADCHAN:FALSE
 # F:OPER_LBADCHAN:FALSE
-# F:OPER_SET:TRUE
+# F:OPER_SET:FALSE
 # F:OPERS_SEE_IN_SECRET_CHANNELS:TRUE
 # F:OPER_WIDE_GLINE:TRUE
 # F:LOCOP_KILL:TRUE
index c90071510e6619cb838eb51b3724917dd69ab27a..fbbc4fe82fd1070295130e093343f2f76d847204 100644 (file)
@@ -12,7 +12,7 @@
 <I>(As of ircu 2.10.11)</I>
 <H2>
 Undernet Coder-com, <TT>coder-com@undernet.org</TT></H2>
-$Id: p10.html,v 1.5 2000-07-09 04:52:58 isomer Exp $
+$Id: p10.html,v 1.6 2002-02-14 00:20:40 ghostwolf Exp $
 <P>
 <HR ALIGN=CENTER WIDTH=100% SIZE=2><I>This document aims to be a practical
 guide for implementing and maintaining the protocol, not just a reference
@@ -552,6 +552,12 @@ by reducing the length of common message identifiers.
 
 <TD><FONT SIZE=-1>CM</FONT></TD>
 </TR>
+
+<TR>
+<TD><FONT SIZE=-1>ACCOUNT</FONT></TD>
+
+<TD><FONT SIZE=-1>AC</FONT></TD>
+</TR>
 </TABLE></CENTER>
 <FONT FACE="Arial,Helvetica"><FONT SIZE=-1><B>[</B><A HREF="#top">Back</A><B>]</B></FONT></FONT>
 <BR>
@@ -703,7 +709,8 @@ the "Host" part of the user@host mask.</LI>
 
 <LI>
 [<B>Optional</B>]: User modes. If present, this is always +&lt;user modes
-for this client>.</LI>
+for this client>.  Note that the special +r usermode is followed by the
+client's account name; see the documentation for ACCOUNT.</LI>
 
 <LI>
 The real IP address of this client, a Base64 encoded 32bit int.</LI>
@@ -1094,7 +1101,7 @@ succeed never the less.
 <P><B>4.1.4 - PART</B>
 <P><B>4.1.5 - KICK</B>
 <P><B>4.1.6 - TOPIC</B>
-<P><B>4.1.4 - CLEARMODE</B>
+<P><B>4.1.7 - CLEARMODE</B>
 <BR>&nbsp;
 <OL><TT>AZAAA CM #coder-com ovpsmikbl</TT></OL>
 </OL>
@@ -1103,6 +1110,12 @@ succeed never the less.
 <BLOCKQUOTE><TT>AZAAA N Nick2 955423230</TT></BLOCKQUOTE>
 <B>4.2.2 - MODE</B>
 <BLOCKQUOTE><TT>AZAAA M Nick2 :+odi</TT></BLOCKQUOTE>
+<B>4.2.3 - ACCOUNT</B>
+<BLOCKQUOTE><TT>AX AC AZAAA oper</TT></BLOCKQUOTE>
+<P>The ACCOUNT message provides a way for servers, such as the channel service
+server, to set the account name information that is associated with a client.
+Once set, it cannot be unset or changed, and will be propagated in NICK during
+net bursts using the special user mode +r followed by the account name.
 </BLOCKQUOTE>
 <A NAME="chap4.3"></A><B><FONT SIZE=+1>4.3 Channel/Client Messaging.</FONT></B>
 <BLOCKQUOTE><B>4.3.1 - PRIVMSG</B>
@@ -1146,6 +1159,8 @@ from msg.h. -Gte.
 -Kev
 <BR>[2000-04-11]: Started work on chapter 4. -Gte
 <BR>[2000-06-01]: Changed some info about the max number of clients -Isomer
+<BR>[2002-01-11]: Wrote a specification for ACCOUNT and noted that a usermode
+in a NICK message may have an argument. -Kev
 <P><A NAME="chap8.1"></A><B><FONT SIZE=+1>8.1 TODO</FONT></B>
 <UL>
 <LI>
index 74520d867683f0d7cb0b2d0029bccf107975c74e..116e4465576f8dd4e7d188f68703eb26ae11d16e 100644 (file)
@@ -119,6 +119,13 @@ MOTD to the client by default; instead, it will only tell the client
 when the MOTD was last changed, and give instructions on how to obtain
 it by typing /MOTD.
 
+MOTD_BANNER
+ * Type: string
+ * Default: NULL
+
+If you enable NODEFAULTMOTD, this specifies a one-line banner to be sent
+to the client in addition to the instructions mentioned above.
+
 KILL_IPMISMATCH
  * Type: boolean
  * Default: FALSE
@@ -214,6 +221,20 @@ many client disappear that the whole "whowas" list is refreshed a few
 times (unless you make it rather large).  A reasonable value is "total
 number of clients" / 25.
 
+HOST_HIDING
+ * Type: boolean
+ * Default: FALSE
+
+This selects whether local users can set umode +x, thus allowing them
+to hide their hostname if they have also registered with a channel
+service (i.e. they have the ACCOUNT flag set).
+
+HIDDEN_HOST
+ * Type: string
+ * Default: users.undernet.org
+
+This selects the suffix for the hidden hostmask (see HOST_HIDING).
+
 KILLCHASETIMELIMIT
  * Type: integer
  * Default: 30
@@ -402,6 +423,15 @@ This option is used to specify the type of service that will be
 requested for connections to users.  The value may be given as a
 hexadecimal integer.
 
+POLLS_PER_LOOP
+ * Type: integer
+ * Default: 200
+
+Some of the engines used by the event interface get a number of events
+from the kernel at once.  Since the number retrieved can impact
+performance, it can be tuned by modifying this value.  The engines
+enforce a lower limit of 20.
+
 CRYPT_OPER_PASSWORD
  * Type: boolean
  * Default: TRUE
@@ -587,7 +617,7 @@ REGULATED BY THE UNDERNET ADMINISTRATION.
 
 OPER_SET
  * Type: boolean
- * Default: TRUE
+ * Default: FALSE
 
 This selects whether global IRC operators on this server are permitted
 to use the /SET command to set various feature values.
index 75037c57790f5e7dcb00159332eec955c1f79066..66ba3d5412c0f249edb518953da41974acaad350 100644 (file)
@@ -84,8 +84,7 @@ struct Client;
 #define MODE_KEY        0x0100
 #define MODE_BAN        0x0200
 #define MODE_LIMIT      0x0400
-#define MODE_SENDTS     0x0800  /* TS was 0 during a local user /join; send
-                                 * temporary TS; can be removed when all 2.10 */
+#define MODE_REGONLY    0x0800  /* Only +r users may join */
 #define MODE_LISTED     0x10000
 #define MODE_SAVE      0x20000 /* save this mode-with-arg 'til later */
 #define MODE_FREE      0x40000 /* string needs to be passed to MyFree() */
@@ -286,7 +285,7 @@ extern int             LocalChanOperMode;
  */
 extern void clean_channelname(char* name);
 extern void channel_modes(struct Client *cptr, char *mbuf, char *pbuf,
-                          struct Channel *chptr);
+                          int buflen, struct Channel *chptr);
 extern int set_mode(struct Client* cptr, struct Client* sptr,
                     struct Channel* chptr, int parc, char* parv[],
                     char* mbuf, char* pbuf, char* npbuf, int* badop);
index 91ceba1cfbb1a48512e41fd5a8327f001df9db57..2e563456ff78727e269802120d5933a9a52c5e0e 100644 (file)
@@ -355,11 +355,13 @@ struct Client {
 #define FLAGS_WALLOP     0x0040 /* send wallops to them */
 #define FLAGS_SERVNOTICE 0x0080 /* server notices such as kill */
 #define FLAGS_BLOCKED    0x0100 /* socket is in a blocked condition */
+#define FLAGS_ACCOUNT    0x0200 /* account name has been set */
 #define FLAGS_CLOSING    0x0400 /* set when closing to suppress errors */
 #define FLAGS_UPING      0x0800 /* has active UDP ping request */
 #define FLAGS_CHKACCESS  0x1000 /* ok to check clients access if set */
 #define FLAGS_HUB        0x2000 /* server is a hub */
 #define FLAGS_SERVICE    0x4000 /* server is a service */
+#define FLAGS_HIDDENHOST 0x8000 /* user's host is hidden */
 #define FLAGS_LOCAL     0x00010000      /* set for local clients */
 #define FLAGS_GOTID     0x00020000      /* successful ident lookup achieved */
 #define FLAGS_DOID      0x00040000      /* I-lines say must use ident return */
@@ -376,7 +378,7 @@ struct Client {
 #define FLAGS_IPCHECK   0x40000000      /* Added or updated IPregistry data */
 
 #define SEND_UMODES \
-    (FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_DEAF|FLAGS_CHSERV|FLAGS_DEBUG)
+    (FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_DEAF|FLAGS_CHSERV|FLAGS_DEBUG|FLAGS_ACCOUNT|FLAGS_HIDDENHOST)
 #define ALL_UMODES (SEND_UMODES|FLAGS_SERVNOTICE|FLAGS_LOCOP)
 #define FLAGS_ID (FLAGS_DOID|FLAGS_GOTID)
 
@@ -406,6 +408,9 @@ struct Client {
 #define SendWallops(x)          (cli_flags(x) & FLAGS_WALLOP)
 #define IsHub(x)                (cli_flags(x) & FLAGS_HUB)
 #define IsService(x)            (cli_flags(x) & FLAGS_SERVICE)
+#define IsAccount(x)            (cli_flags(x) & FLAGS_ACCOUNT)
+#define IsHiddenHost(x)                (cli_flags(x) & FLAGS_HIDDENHOST)
+#define HasHiddenHost(x)       (IsAccount(x) && IsHiddenHost(x))
 
 #define IsPrivileged(x)         (IsAnOper(x) || IsServer(x))
 
@@ -426,6 +431,8 @@ struct Client {
 #define SetServNotice(x)        (cli_flags(x) |= FLAGS_SERVNOTICE)
 #define SetHub(x)               (cli_flags(x) |= FLAGS_HUB)
 #define SetService(x)           (cli_flags(x) |= FLAGS_SERVICE)
+#define SetAccount(x)           (cli_flags(x) |= FLAGS_ACCOUNT)
+#define SetHiddenHost(x)       (cli_flags(x) |= FLAGS_HIDDENHOST)
 
 #define ClearAccess(x)          (cli_flags(x) &= ~FLAGS_CHKACCESS)
 #define ClearBurst(x)           (cli_flags(x) &= ~FLAGS_BURST)
@@ -440,6 +447,7 @@ struct Client {
 #define ClearUPing(x)           (cli_flags(x) &= ~FLAGS_UPING)
 #define ClearWallops(x)         (cli_flags(x) &= ~FLAGS_WALLOP)
 #define ClearServNotice(x)      (cli_flags(x) &= ~FLAGS_SERVNOTICE)
+#define ClearHiddenHost(x)     (cli_flags(x) &= ~FLAGS_HIDDENHOST)
 
 /* free flags */
 #define FREEFLAG_SOCKET        0x0001  /* socket needs to be freed */
index a8f465c5e31b85b495953dba279c0c17b8866593..63a5eddebb0ab2197d902f244f906b0a56c1533e 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef INCLUDED_fda_h
 #define INCLUDED_fda_h
 
-#if !defined(NDEBUG)
+#if defined(MDEBUG)
 #ifndef INCLUDED_sys_types_h
 #include <sys/types.h>      /* size_t */
 #define INCLUDED_sys_types_h
@@ -58,5 +58,5 @@ extern void fda_set_lowmem_handler(void (*fn)(void));
 extern void fda_set_nomem_handler(void (*fn)(void));
 
 
-#endif /* !defined(NDEBUG) */
+#endif /* defined(MDEBUG) */
 #endif /* INCLUDED_fda_h */
index 20a87516043b8d4aac7cb2e3ae0532e3f207c9c9..9b2f566d5c330b58b77cacb385e8a2c39aee5f54 100644 (file)
@@ -135,6 +135,7 @@ extern int m_wallchops(struct Client*, struct Client*, int, char*[]);
 extern int m_who(struct Client*, struct Client*, int, char*[]);
 extern int m_whois(struct Client*, struct Client*, int, char*[]);
 extern int m_whowas(struct Client*, struct Client*, int, char*[]);
+extern int mo_admin(struct Client*, struct Client*, int, char*[]);
 extern int mo_clearmode(struct Client*, struct Client*, int, char*[]);
 extern int mo_close(struct Client*, struct Client*, int, char*[]);
 extern int mo_connect(struct Client*, struct Client*, int, char*[]);
@@ -160,12 +161,14 @@ extern int mo_squit(struct Client*, struct Client*, int, char*[]);
 extern int mo_stats(struct Client*, struct Client*, int, char*[]);
 extern int mo_trace(struct Client*, struct Client*, int, char*[]);
 extern int mo_uping(struct Client*, struct Client*, int, char*[]);
+extern int mo_version(struct Client*, struct Client*, int, char*[]);
 extern int mo_wallops(struct Client*, struct Client*, int, char*[]);
 extern int mo_wallusers(struct Client*, struct Client*, int, char*[]);
 extern int mr_error(struct Client*, struct Client*, int, char*[]);
 extern int mr_error(struct Client*, struct Client*, int, char*[]);
 extern int mr_pong(struct Client*, struct Client*, int, char*[]);
 extern int mr_server(struct Client*, struct Client*, int, char*[]);
+extern int ms_account(struct Client*, struct Client*, int, char*[]);
 extern int ms_admin(struct Client*, struct Client*, int, char*[]);
 extern int ms_away(struct Client*, struct Client*, int, char*[]);
 extern int ms_burst(struct Client*, struct Client*, int, char*[]);
@@ -212,7 +215,7 @@ extern int ms_version(struct Client*, struct Client*, int, char*[]);
 extern int ms_wallchops(struct Client*, struct Client*, int, char*[]);
 extern int ms_wallops(struct Client*, struct Client*, int, char*[]);
 extern int ms_wallusers(struct Client*, struct Client*, int, char*[]);
-
+extern int ms_whois(struct Client*, struct Client*, int, char*[]);
 
 #endif /* INCLUDED_handlers_h */
 
index 99602930a650109db88a42d060b92ef07bfb58b7..63d916fcb770d5c60dbd855ee6e4a3f0a8542ee4 100644 (file)
@@ -30,7 +30,7 @@
 typedef void (*OutOfMemoryHandler)(void);
 extern void set_nomem_handler(OutOfMemoryHandler handler);
 
-#if defined(NDEBUG)
+#if !defined(MDEBUG)
 /* 
  * RELEASE: allocation functions
  */
@@ -45,7 +45,7 @@ extern void* MyMalloc(size_t size);
 extern void* MyCalloc(size_t nelem, size_t size);
 extern void* MyRealloc(void* p, size_t size);
 
-#else /* !defined(NDEBUG) */
+#else /* defined(MDEBUG) */
 /*
  * DEBUG: allocation functions
  */
@@ -58,7 +58,7 @@ extern void* MyRealloc(void* p, size_t size);
 #define MyFree(p)       fda_free((p))
 #define MyRealloc(p, s) fda_realloc((p), (s), __FILE__, __LINE__)
 
-#endif /* !defined(NDEBUG) */
+#endif /* defined(MDEBUG) */
 
 #endif /* INCLUDED_ircd_alloc_h */
 
index e6ad7202dca607336230964b1b39df79989f1451..492c49e009fee31dd75a26b11b82b5f0421ad460 100644 (file)
  * are shorter. It is possible to have a valid FQDN longer than 63 characters.
  */
 #define HOSTLEN         63
+/*
+ * ACCOUNTLEN is the maximum length for the account name, which can be set
+ * with the ACCOUNT (AC) command.  This is used for keeping track of who's
+ * logged into which account, for the benefit of irc services.
+ */
+#define ACCOUNTLEN      12
 /*
  * REALLEN is the maximum length for user supplied information about a client
  * connection (gcos). This information is set at client/server registration
  */
 #define SOCKIPLEN 15
 /*
- * TOPICLEN is the maximum length for channel topics, kill comments,
- * and quit comments
+ * TOPICLEN is the maximum length for channel topics and kill comments
  */
 #define TOPICLEN        160
+/*
+ * AWAYLEN is the maximum length for away messages
+ */
+#define AWAYLEN                160
 /*
  * BUFSIZE is exactly long enough to hold one protocol message (RFC 1459)
  * including the line termination (\r\n).
index 54d034f32c43dd21564f6f8449fdba82d6c21703..2dfe9241213b5fcd3f7000364dd2c112df065125 100644 (file)
@@ -82,6 +82,8 @@ struct GenHeader {
 #define GEN_DESTROY    0x0001  /* generator is to be destroyed */
 #define GEN_MARKED     0x0002  /* generator is marked for destruction */
 #define GEN_ACTIVE     0x0004  /* generator is active */
+#define GEN_READD      0x0008  /* generator (timer) must be re-added */
+#define GEN_ERROR      0x0010  /* an error occurred on the generator */
 
 struct Socket {
   struct GenHeader s_header;   /* generator information */
@@ -141,6 +143,7 @@ struct Timer {
 #define t_ed_int(tim)  ((tim)->t_header.gh_engdata.ed_int)
 #define t_ed_ptr(tim)  ((tim)->t_header.gh_engdata.ed_ptr)
 #define t_active(tim)  ((tim)->t_header.gh_flags & GEN_ACTIVE)
+#define t_onqueue(tim) ((tim)->t_header.gh_prev_p)
 
 struct Event {
   struct Event*         ev_next;       /* linked list of events on queue */
@@ -208,6 +211,8 @@ do {                                                                              \
     event_generate(ET_DESTROY, _gen, 0);                                     \
   }                                                                          \
 } while (0)
+#define gen_clear_error(gen)                                                 \
+       (((struct GenHeader*) (gen))->gh_flags &= ~GEN_ERROR)
 
 void gen_dequeue(void* arg);
 
@@ -215,6 +220,7 @@ void event_init(int max_sockets);
 void event_loop(void);
 void event_generate(enum EventType type, void* arg, int data);
 
+struct Timer* timer_init(struct Timer* timer);
 void timer_add(struct Timer* timer, EventCallBack call, void* data,
               enum TimerType type, time_t value);
 void timer_del(struct Timer* timer);
index 6d4dea3d2c1e47f6ae03952faa987ddd51f5517c..ddb31db985c900d2998feeb1e41c0ff13c0e520a 100644 (file)
@@ -33,6 +33,7 @@ enum Feature {
   FEAT_CLIENT_FLOOD,
   FEAT_SERVER_PORT,
   FEAT_NODEFAULTMOTD,
+  FEAT_MOTD_BANNER,
   FEAT_KILL_IPMISMATCH,
   FEAT_IDLE_FROM_MSG,
   FEAT_HUB,
@@ -41,6 +42,8 @@ enum Feature {
   FEAT_RANDOM_SEED,
   FEAT_DEFAULT_LIST_PARAM,
   FEAT_NICKNAMEHISTORYLENGTH,
+  FEAT_HOST_HIDING,
+  FEAT_HIDDEN_HOST,
 
   /* features that probably should not be touched */
   FEAT_KILLCHASETIMELIMIT,
@@ -67,6 +70,7 @@ enum Feature {
   FEAT_VIRTUAL_HOST,
   FEAT_TOS_SERVER,
   FEAT_TOS_CLIENT,
+  FEAT_POLLS_PER_LOOP,
 
   /* features that affect all operators */
   FEAT_CRYPT_OPER_PASSWORD,
index a41acc13ab90bdb75c6965372aad53f4e2beda23..878ebb9831d367735e96e5ca020151de2a9975ec 100644 (file)
@@ -326,6 +326,10 @@ struct Client;
 #define TOK_CLEARMODE           "CM"
 #define CMD_CLEARMODE          MSG_CLEARMODE, TOK_CLEARMODE
 
+#define MSG_ACCOUNT            "ACCOUNT"       /* ACCO */
+#define TOK_ACCOUNT            "AC"
+#define CMD_ACCOUNT            MSG_ACCOUNT, TOK_ACCOUNT
+
 #define MSG_POST                "POST"          /* POST */
 #define TOK_POST                "POST"
 
index 28ce4d06396bc8c061aa0cad5a9fb3673ce26311..b16d2849d9822c9a92089423eacf8e04418af2d5 100644 (file)
@@ -203,7 +203,6 @@ extern const struct Numeric* get_error_numeric(int err);
 #define RPL_TEXT             304       /* unused */
 #define RPL_UNAWAY           305
 #define RPL_NOWAWAY          306
-#define RPL_USERIP           307        /* Undernet extension */
                                         /* NotAway, aircd */
 /*     RPL_WHOISREGNICK     307        Numeric List: Dalnet */
 /*     RPL_SUSERHOST        307        austnet */
@@ -240,6 +239,7 @@ extern const struct Numeric* get_error_numeric(int err);
 /*      RPL_CHANNEL_URL      328           dalnet, anothernet */
 #define RPL_CREATIONTIME     329
 /*      RPL_WHOWAS_TIME      330               ? */
+#define RPL_WHOISACCOUNT     330
 #define RPL_NOTOPIC          331
 #define RPL_TOPIC            332
 #define RPL_TOPICWHOTIME     333        /* Undernet extension */
@@ -247,11 +247,9 @@ extern const struct Numeric* get_error_numeric(int err);
 /*     RPL_COMMANDSYNTAX    334           Dalnet */
 /*     RPL_LISTSYNTAX       334           unreal */
 /*      RPL_CHANPASSOK       338           IRCnet extension (?)*/
-/*     RPL_WHOISACTUALLY    338           dalnet */
-/*      RPL_BADCHANPASS      339           IRCnet extension (?)*/
-/*                          339           mIRC/DALnet extension */
-/*                          440           mIRC/DALnet extension */
-
+#define        RPL_WHOISACTUALLY    338        /* Undernet extension, dalnet */
+/*     RPL_BADCHANPASS      339           mIRC/DALnet extension */
+#define RPL_USERIP           340        /* Undernet extension */
 #define RPL_INVITING         341
 /*      RPL_SUMMONING        342           removed from RFC1459 */
 
@@ -385,7 +383,7 @@ extern const struct Numeric* get_error_numeric(int err);
 #define ERR_BANNEDFROMCHAN   474
 #define ERR_BADCHANNELKEY    475
 #define ERR_BADCHANMASK      476        /* Undernet extension */
-/*      ERR_NEEDREGGEDNICK   477           DalNet Extention */
+#define ERR_NEEDREGGEDNICK   477        /* DalNet&Undernet Extention */
 #define ERR_BANLISTFULL      478        /* Undernet extension */
 /*     ERR_LINKFAIL         479        unreal */
 
index 542cc55d314f831aec34975f6397a1322ceed22e..f9d9e4cb3ce18ec796da964a63c5ed94553e7f0c 100644 (file)
@@ -72,6 +72,7 @@ extern void send_user_info(struct Client* to, char* names, int rpl,
                            InfoFormatter fmt);
 extern int add_silence(struct Client* sptr, const char* mask);
 
+extern int hide_hostmask(struct Client *cptr, unsigned int flags);
 extern int set_user_mode(struct Client *cptr, struct Client *sptr,
                          int parc, char *parv[]);
 extern int is_silenced(struct Client *sptr, struct Client *acptr);
index 1fd642136d40220aada363669b7034d88c931aae..5554050fa3bc3dbc3612ff456287cd99cfe8de81 100644 (file)
@@ -48,15 +48,19 @@ extern void sendcmdto_serv_butone(struct Client *from, const char *cmd,
                                  const char *pattern, ...);
 
 /* Send command to all channels user is on */
-extern void sendcmdto_common_channels(struct Client *from, const char *cmd,
-                                     const char *tok, const char *pattern,
-                                     ...);
-
+extern void sendcmdto_common_channels_butone(struct Client *from,
+                                            const char *cmd,
+                                            const char *tok,
+                                            struct Client *one,
+                                            const char *pattern, ...);
 
 /* Send command to all channel users on this server */
-extern void sendcmdto_channel_butserv(struct Client *from, const char *cmd,
-                                     const char *tok, struct Channel *to,
-                                     const char *pattern, ...);
+extern void sendcmdto_channel_butserv_butone(struct Client *from,
+                                            const char *cmd,
+                                            const char *tok,
+                                            struct Channel *to,
+                                            struct Client *one,
+                                            const char *pattern, ...);
 
 /* Send command to all interested channel users */
 extern void sendcmdto_channel_butone(struct Client *from, const char *cmd,
index 34fbe40e9c2f4d7b7bcd4e9d39e633add333d20f..2975fecbc19b2109c608f5255526518c98e3ca2a 100644 (file)
@@ -70,6 +70,8 @@ struct User {
   unsigned int       invites;         /* Number of channels we've been invited to */
   char               username[USERLEN + 1];
   char               host[HOSTLEN + 1];
+  char               realhost[HOSTLEN + 1];
+  char               account[ACCOUNTLEN + 1];
 };
 
 #endif /* INCLUDED_struct_h */
index 72f760259c4797d1d7848d5bd5e0d07d55131acf..677c091aa9c2574f79d7c5e03564ee1fe01e778f 100644 (file)
                 " MAXBANS=%i" \
                 " NICKLEN=%i" \
                 " TOPICLEN=%i" \
-                " KICKLEN=%i" \
-                " CHANTYPES=%s"
+                " AWAYLEN=%i" \
+                " KICKLEN=%i"
 
-#define FEATURES2 "PREFIX=%s" \
+#define FEATURES2 "CHANTYPES=%s" \
+                " PREFIX=%s" \
                 " CHANMODES=%s" \
-                " CHARSET=%s"
+                " CHARSET=%s" \
+                " NETWORK=%s"
 
 #define FEATURESVALUES1 feature_int(FEAT_MAXSILES), MAXMODEPARAMS, \
                        feature_int(FEAT_MAXCHANNELSPERUSER), \
                        feature_int(FEAT_MAXBANS), NICKLEN, TOPICLEN, \
-                       TOPICLEN, "+#&"
+                       AWAYLEN, TOPICLEN
 
-#define FEATURESVALUES2 "(ov)@+", "b,k,l,imnpst", "rfc1459"
+#define FEATURESVALUES2 "+#&", "(ov)@+", "b,k,l,imnpstr", "rfc1459", NETWORK
 
 #endif /* INCLUDED_supported_h */
 
index 6c1254bfee4c1559ff4a6bb963b5a641c411cc39..5da1e256f244256b28c7e963c33799bd2c171cee 100644 (file)
@@ -48,6 +48,7 @@ struct Whowas {
   char *name;
   char *username;
   char *hostname;
+  char *realhost;
   char *servername;
   char *realname;
   char *away;
index 050ea0dfa0c530ff07ac9e460bb0584368bfb00d..47c102f9eeb74faa7edaaf8079f436c1a66155cd 100644 (file)
@@ -197,7 +197,7 @@ static void ip_registry_expire(struct Event* ev)
  */
 void IPcheck_init(void)
 {
-  timer_add(&expireTimer, ip_registry_expire, 0, TT_PERIODIC, 60);
+  timer_add(timer_init(&expireTimer), ip_registry_expire, 0, TT_PERIODIC, 60);
 }
 
 /*
index 0375b8c1c3bde2af5769783af002c78278967283..482de12e5350ec14f241f37ed0541213f6988818 100644 (file)
@@ -61,6 +61,7 @@ LIBS = @LIBS@
 
 #### End of system configuration section. ####
 PURIFY =
+RINGLOG_O =
 
 OSDEP_SRC = \
        os_bsd.c \
@@ -100,6 +101,7 @@ IRCD_SRC = \
        jupe.c \
        list.c \
        listener.c \
+       m_account.c \
        m_admin.c \
        m_away.c \
        m_burst.c \
@@ -195,11 +197,13 @@ IRCD_SRC = \
        whocmds.c \
        whowas.c
 
+CHKCONF_SRC = chkconf.c
+
 SRC = ${IRCD_SRC} ${OSDEP_C} ${ENGINE_C}
 
 OBJS = ${SRC:%.c=%.o}
 
-DEP_SRC = ${IRCD_SRC} ${OSDEP_SRC} ${ENGINE_SRC}
+DEP_SRC = ${IRCD_SRC} ${OSDEP_SRC} ${ENGINE_SRC} ${CHKCONF_SRC}
 
 all:
        ( cd ..; make -f Makefile )
@@ -212,7 +216,8 @@ all:
 build: ircd chkconf
 
 ircd: ${OBJS} ../include/patchlevel.h version.o
-       ${PURIFY} ${CC} ${OBJS} version.o ${LDFLAGS} ${LIBS} -o ircd
+       ${PURIFY} ${CC} ${OBJS} version.o ${RINGLOG_O} ${LDFLAGS} ${LIBS} \
+               -o ircd
        ${CHMOD} ${IRCDMODE} ircd
 
 #
@@ -225,7 +230,8 @@ ircd: ${OBJS} ../include/patchlevel.h version.o
 # must be a better solution...perhaps sum all of the .c files and include
 # only that one sum?
 #
-version.c: version.c.SH s_serv.c s_user.c channel.c s_bsd.c s_misc.c ircd.c
+version.c: version.c.SH s_serv.c s_user.c channel.c s_bsd.c s_misc.c ircd.c \
+          ../include/version.h ../include/patchlevel.h
        ${SHELL} ${srcdir}/version.c.SH
 
 ircd_string.o: ircd_string.c chattr.tab.c
@@ -337,45 +343,897 @@ depend:
 
 # DO NOT DELETE THIS LINE -- make depend depends on it.
 
-IPcheck.o: IPcheck.c ../config.h ../include/IPcheck.h \
../include/client.h ../include/ircd_defs.h ../include/dbuf.h \
../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
../include/ircd.h ../include/struct.h ../include/msg.h \
../include/numnicks.h ../include/ircd_alloc.h ../include/s_debug.h \
../include/s_user.h ../include/send.h
+IPcheck.o: IPcheck.c ../config.h ../include/IPcheck.h ../include/client.h \
 ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
 ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
 ../include/struct.h ../include/msg.h ../include/numnicks.h \
 ../include/ircd_alloc.h ../include/s_debug.h ../include/s_user.h \
+  ../include/send.h
 channel.o: channel.c ../config.h ../include/channel.h \
- ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
- ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
- ../include/hash.h ../include/ircd.h ../include/struct.h \
- ../include/ircd_alloc.h ../include/ircd_chattr.h \
- ../include/ircd_features.h ../include/ircd_log.h \
- ../include/ircd_policy.h ../include/ircd_reply.h \
- ../include/ircd_snprintf.h ../include/ircd_string.h ../include/list.h \
- ../include/match.h ../include/msg.h ../include/numeric.h \
- ../include/numnicks.h ../include/querycmds.h ../include/s_bsd.h \
- ../include/s_conf.h ../include/s_debug.h ../include/s_misc.h \
- ../include/s_user.h ../include/send.h ../include/support.h \
- ../include/sys.h ../include/whowas.h
 ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
 ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
 ../include/hash.h ../include/ircd.h ../include/struct.h \
 ../include/ircd_alloc.h ../include/ircd_chattr.h \
 ../include/ircd_features.h ../include/ircd_log.h \
 ../include/ircd_policy.h ../include/ircd_reply.h \
 ../include/ircd_snprintf.h ../include/ircd_string.h ../include/list.h \
 ../include/match.h ../include/msg.h ../include/numeric.h \
 ../include/numnicks.h ../include/querycmds.h ../include/s_bsd.h \
 ../include/s_conf.h ../include/s_debug.h ../include/s_misc.h \
 ../include/s_user.h ../include/send.h ../include/support.h \
 ../include/sys.h ../include/whowas.h
 class.o: class.c ../config.h ../include/class.h ../include/client.h \
- ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
- ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
- ../include/struct.h ../include/ircd_alloc.h \
- ../include/ircd_features.h ../include/ircd_reply.h ../include/list.h \
- ../include/numeric.h ../include/s_conf.h ../include/s_debug.h \
- ../include/send.h
-client.o: client.c ../config.h ../include/client.h \
- ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
- ../include/ircd_events.h ../include/ircd_handler.h ../include/class.h \
- ../include/ircd.h ../include/struct.h ../include/ircd_features.h \
- ../include/ircd_reply.h ../include/list.h ../include/numeric.h \
- ../include/s_conf.h ../include/s_debug.h ../include/send.h
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_alloc.h ../include/ircd_features.h \
+  ../include/ircd_reply.h ../include/list.h ../include/numeric.h \
+  ../include/s_conf.h ../include/s_debug.h ../include/send.h
+client.o: client.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/class.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_features.h ../include/ircd_reply.h \
+  ../include/list.h ../include/numeric.h ../include/s_conf.h \
+  ../include/s_debug.h ../include/send.h
 crule.o: crule.c ../config.h ../include/crule.h ../include/client.h \
- ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
- ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
- ../include/struct.h ../include/ircd_alloc.h ../include/ircd_chattr.h \
- ../include/ircd_string.h ../include/match.h ../include/s_bsd.h \
- ../include/s_debug.h
 ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
 ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
 ../include/struct.h ../include/ircd_alloc.h ../include/ircd_chattr.h \
 ../include/ircd_string.h ../include/match.h ../include/s_bsd.h \
 ../include/s_debug.h
 dbuf.o: dbuf.c ../config.h ../include/dbuf.h ../include/ircd_alloc.h \
- ../include/ircd_chattr.h ../include/ircd_features.h ../include/send.h \
- ../include/sys.h
 ../include/ircd_chattr.h ../include/ircd_features.h ../include/send.h \
 ../include/sys.h
 fda.o: fda.c ../config.h
+fileio.o: fileio.c ../config.h ../include/fileio.h \
+  ../include/ircd_alloc.h
+gline.o: gline.c ../config.h ../include/gline.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_alloc.h ../include/ircd_features.h \
+  ../include/ircd_log.h ../include/ircd_policy.h ../include/ircd_reply.h \
+  ../include/ircd_snprintf.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/match.h ../include/numeric.h \
+  ../include/s_bsd.h ../include/s_debug.h ../include/s_misc.h \
+  ../include/send.h ../include/support.h ../include/msg.h \
+  ../include/numnicks.h ../include/sys.h ../include/whocmds.h
+hash.o: hash.c ../config.h ../include/hash.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/channel.h \
+  ../include/ircd_chattr.h ../include/ircd_string.h ../include/ircd.h \
+  ../include/struct.h ../include/msg.h ../include/send.h \
+  ../include/support.h ../include/sys.h
+ircd.o: ircd.c ../config.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_defs.h ../include/IPcheck.h ../include/class.h \
+  ../include/client.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/crule.h \
+  ../include/hash.h ../include/ircd_alloc.h ../include/ircd_features.h \
+  ../include/ircd_log.h ../include/ircd_reply.h ../include/ircd_signal.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/jupe.h \
+  ../include/list.h ../include/match.h ../include/motd.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/parse.h \
+  ../include/res.h ../include/s_auth.h ../include/s_bsd.h \
+  ../include/s_conf.h ../include/s_debug.h ../include/s_misc.h \
+  ../include/send.h ../include/sys.h ../include/uping.h \
+  ../include/userload.h ../include/version.h ../include/whowas.h
+ircd_alloc.o: ircd_alloc.c ../config.h ../include/ircd_alloc.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/s_debug.h \
+  ../include/ircd_defs.h
+ircd_events.o: ircd_events.c ../config.h ../include/ircd_events.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_defs.h \
+  ../include/ircd_alloc.h ../include/ircd_log.h \
+  ../include/ircd_snprintf.h ../include/s_debug.h
+ircd_features.o: ircd_features.c ../config.h ../include/ircd_features.h \
+  ../include/channel.h ../include/ircd_defs.h ../include/class.h \
+  ../include/client.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_alloc.h \
+  ../include/ircd_log.h ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/match.h ../include/motd.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/random.h ../include/s_bsd.h ../include/s_debug.h \
+  ../include/s_misc.h ../include/send.h ../include/support.h \
+  ../include/sys.h ../include/whowas.h
+ircd_log.o: ircd_log.c ../config.h ../include/ircd_log.h \
+  ../include/client.h ../include/ircd_defs.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd_alloc.h ../include/ircd_reply.h \
+  ../include/ircd_snprintf.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/ircd.h ../include/struct.h \
+  ../include/numeric.h ../include/s_debug.h ../include/send.h
+ircd_relay.o: ircd_relay.c ../config.h ../include/ircd_relay.h \
+  ../include/channel.h ../include/ircd_defs.h ../include/client.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_chattr.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/match.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_debug.h \
+  ../include/s_misc.h ../include/s_user.h ../include/send.h
+ircd_reply.o: ircd_reply.c ../config.h ../include/ircd_reply.h \
+  ../include/client.h ../include/ircd_defs.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_snprintf.h \
+  ../include/msg.h ../include/numeric.h ../include/s_conf.h \
+  ../include/s_debug.h ../include/send.h
+ircd_signal.o: ircd_signal.c ../config.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_defs.h ../include/ircd_events.h \
+  ../include/ircd_signal.h ../include/s_conf.h
+ircd_snprintf.o: ircd_snprintf.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/channel.h \
+  ../include/ircd_snprintf.h ../include/struct.h
+ircd_string.o: ircd_string.c ../config.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/ircd_defs.h ../include/ircd_log.h \
+  chattr.tab.c
+ircd_xopen.o: ircd_xopen.c ../config.h ../include/ircd_xopen.h
+jupe.o: jupe.c ../config.h ../include/jupe.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_alloc.h \
+  ../include/ircd_log.h ../include/ircd_policy.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/match.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/s_bsd.h ../include/s_misc.h ../include/send.h \
+  ../include/support.h ../include/sys.h
+list.o: list.c ../config.h ../include/list.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_alloc.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/listener.h \
+  ../include/match.h ../include/numeric.h ../include/res.h \
+  ../include/s_auth.h ../include/s_bsd.h ../include/s_conf.h \
+  ../include/s_debug.h ../include/s_misc.h ../include/s_user.h \
+  ../include/send.h ../include/support.h ../include/whowas.h
+listener.o: listener.c ../config.h ../include/listener.h \
+  ../include/ircd_defs.h ../include/ircd_events.h ../include/client.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_handler.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_alloc.h \
+  ../include/ircd_features.h ../include/ircd_osdep.h \
+  ../include/ircd_reply.h ../include/ircd_snprintf.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/numeric.h \
+  ../include/s_bsd.h ../include/s_conf.h ../include/s_misc.h \
+  ../include/send.h ../include/sys.h
+m_account.o: m_account.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numnicks.h \
+  ../include/s_user.h ../include/send.h
+m_admin.o: m_admin.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_policy.h \
+  ../include/ircd_reply.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_conf.h ../include/s_user.h
+m_away.o: m_away.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_alloc.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_user.h \
+  ../include/send.h
+m_burst.o: m_burst.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_alloc.h ../include/ircd_policy.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/list.h ../include/match.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/s_conf.h ../include/s_misc.h ../include/send.h \
+  ../include/support.h
+m_clearmode.o: m_clearmode.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/channel.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_alloc.h ../include/ircd_features.h \
+  ../include/ircd_log.h ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/list.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/send.h \
+  ../include/support.h
+m_close.o: m_close.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_reply.h ../include/numeric.h \
+  ../include/s_bsd.h ../include/send.h
+m_connect.o: m_connect.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/crule.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_features.h ../include/ircd_log.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/jupe.h ../include/match.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/s_bsd.h ../include/s_conf.h ../include/s_user.h \
+  ../include/send.h
+m_cprivmsg.o: m_cprivmsg.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/s_user.h
+m_create.o: m_create.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_debug.h ../include/s_misc.h \
+  ../include/s_user.h ../include/send.h
+m_defaults.o: m_defaults.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_reply.h ../include/numeric.h \
+  ../include/numnicks.h ../include/send.h ../include/supported.h \
+  ../include/channel.h ../include/version.h
+m_destruct.o: m_destruct.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/send.h
+m_desynch.o: m_desynch.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_bsd.h \
+  ../include/send.h
+m_die.o: m_die.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_bsd.h ../include/send.h
+m_endburst.o: m_endburst.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/send.h
+m_error.o: m_error.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_alloc.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/numeric.h ../include/numnicks.h \
+  ../include/s_debug.h ../include/s_misc.h ../include/send.h
+m_get.o: m_get.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_features.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/numeric.h \
+  ../include/numnicks.h ../include/send.h
+m_gline.o: m_gline.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/gline.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_features.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/match.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/s_conf.h ../include/s_misc.h ../include/send.h \
+  ../include/support.h
+m_help.o: m_help.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/send.h
+m_info.o: m_info.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_misc.h ../include/s_user.h \
+  ../include/s_conf.h ../include/send.h ../include/version.h
+m_invite.o: m_invite.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/list.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_user.h \
+  ../include/send.h
+m_ison.o: m_ison.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/numeric.h ../include/send.h
+m_join.o: m_join.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/gline.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_chattr.h ../include/ircd_features.h \
+  ../include/ircd_reply.h ../include/ircd_string.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_debug.h \
+  ../include/s_user.h ../include/send.h
+m_jupe.o: m_jupe.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/jupe.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_features.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/match.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_conf.h \
+  ../include/s_misc.h ../include/send.h ../include/support.h
+m_kick.o: m_kick.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/send.h
+m_kill.o: m_kill.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_log.h ../include/ircd_policy.h \
+  ../include/ircd_reply.h ../include/ircd_snprintf.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_misc.h \
+  ../include/send.h ../include/whowas.h
+m_links.o: m_links.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_policy.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/match.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/s_user.h ../include/send.h
+m_list.o: m_list.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_alloc.h ../include/ircd_chattr.h \
+  ../include/ircd_features.h ../include/ircd_log.h \
+  ../include/ircd_reply.h ../include/ircd_string.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_bsd.h \
+  ../include/send.h
+m_lusers.o: m_lusers.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_policy.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/querycmds.h \
+  ../include/ircd_features.h ../include/s_user.h ../include/s_serv.h \
+  ../include/send.h
+m_map.o: m_map.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_policy.h ../include/ircd_reply.h \
+  ../include/ircd_snprintf.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/list.h ../include/match.h \
+  ../include/msg.h ../include/numeric.h ../include/s_user.h \
+  ../include/s_serv.h ../include/send.h ../include/querycmds.h \
+  ../include/ircd_features.h
+m_mode.o: m_mode.c ../config.h ../include/handlers.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_conf.h ../include/s_debug.h \
+  ../include/s_user.h ../include/send.h
+m_motd.o: m_motd.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_policy.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/match.h \
+  ../include/motd.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_conf.h ../include/class.h \
+  ../include/s_user.h ../include/send.h
+m_names.o: m_names.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_user.h ../include/send.h
+m_nick.o: m_nick.c ../config.h ../include/IPcheck.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_chattr.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_policy.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_debug.h ../include/s_misc.h \
+  ../include/s_user.h ../include/send.h
+m_notice.o: m_notice.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd_chattr.h ../include/ircd_relay.h \
+  ../include/ircd_reply.h ../include/ircd_string.h ../include/match.h \
+  ../include/msg.h ../include/numeric.h ../include/send.h \
+  ../include/handlers.h
+m_oper.o: m_oper.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_features.h ../include/ircd_log.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/ircd_xopen.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/querycmds.h \
+  ../include/s_conf.h ../include/s_debug.h ../include/s_user.h \
+  ../include/s_misc.h ../include/send.h ../include/support.h
+m_opmode.o: m_opmode.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/channel.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_features.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/send.h
+m_part.o: m_part.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/numeric.h ../include/numnicks.h \
+  ../include/send.h
+m_pass.o: m_pass.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/send.h
+m_ping.o: m_ping.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/hash.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/ircd.h \
+  ../include/struct.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_debug.h ../include/send.h
+m_pong.o: m_pong.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_user.h ../include/send.h
+m_privmsg.o: m_privmsg.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_chattr.h ../include/ircd_features.h \
+  ../include/ircd_relay.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/match.h ../include/msg.h \
+  ../include/numeric.h ../include/send.h
+m_privs.o: m_privs.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/numeric.h \
+  ../include/numnicks.h ../include/send.h
+m_proto.o: m_proto.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_alloc.h ../include/ircd_chattr.h \
+  ../include/ircd_reply.h ../include/ircd_string.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_debug.h \
+  ../include/s_misc.h ../include/send.h ../include/supported.h \
+  ../include/channel.h ../include/version.h
+m_quit.o: m_quit.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/struct.h \
+  ../include/s_misc.h ../include/ircd_reply.h
+m_rehash.o: m_rehash.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_log.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/motd.h \
+  ../include/numeric.h ../include/s_conf.h ../include/send.h
+m_reset.o: m_reset.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_features.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/numeric.h ../include/numnicks.h \
+  ../include/send.h
+m_restart.o: m_restart.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_log.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/numeric.h \
+  ../include/numnicks.h ../include/send.h
+m_rping.o: m_rping.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/opercmds.h \
+  ../include/s_user.h ../include/send.h
+m_rpong.o: m_rpong.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/opercmds.h \
+  ../include/send.h
+m_server.o: m_server.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_log.h \
+  ../include/ircd_features.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/jupe.h \
+  ../include/list.h ../include/match.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/querycmds.h \
+  ../include/s_bsd.h ../include/s_conf.h ../include/s_debug.h \
+  ../include/s_misc.h ../include/s_serv.h ../include/send.h \
+  ../include/userload.h
+m_set.o: m_set.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_features.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/numeric.h \
+  ../include/numnicks.h ../include/send.h
+m_settime.o: m_settime.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_features.h \
+  ../include/ircd_reply.h ../include/ircd_snprintf.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/list.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/s_user.h ../include/send.h
+m_silence.o: m_silence.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/list.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_user.h \
+  ../include/send.h
+m_squit.o: m_squit.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_chattr.h \
+  ../include/ircd_reply.h ../include/ircd_string.h ../include/numeric.h \
+  ../include/numnicks.h ../include/match.h ../include/s_debug.h \
+  ../include/s_misc.h ../include/s_user.h ../include/send.h
+m_stats.o: m_stats.c ../config.h ../include/handlers.h \
+  ../include/s_stats.h ../include/channel.h ../include/ircd_defs.h \
+  ../include/class.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/gline.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_alloc.h ../include/ircd_chattr.h \
+  ../include/ircd_features.h ../include/ircd_policy.h \
+  ../include/ircd_reply.h ../include/ircd_string.h ../include/list.h \
+  ../include/listener.h ../include/match.h ../include/motd.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/opercmds.h ../include/s_bsd.h ../include/s_conf.h \
+  ../include/s_debug.h ../include/s_misc.h ../include/s_serv.h \
+  ../include/s_user.h ../include/send.h ../include/userload.h
+m_time.o: m_time.c ../config.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_policy.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_misc.h \
+  ../include/s_user.h ../include/send.h
+m_topic.o: m_topic.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/send.h
+m_trace.o: m_trace.c ../config.h ../include/class.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/match.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/s_bsd.h ../include/s_conf.h ../include/s_user.h \
+  ../include/send.h ../include/version.h
+m_uping.o: m_uping.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/match.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/s_conf.h ../include/s_user.h ../include/send.h \
+  ../include/uping.h
+m_user.o: m_user.c ../config.h ../include/handlers.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_chattr.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/numeric.h ../include/numnicks.h \
+  ../include/s_debug.h ../include/s_misc.h ../include/s_user.h \
+  ../include/send.h
+m_userhost.o: m_userhost.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/numeric.h ../include/s_user.h \
+  ../include/struct.h
+m_userip.o: m_userip.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/numeric.h ../include/s_user.h \
+  ../include/struct.h
+m_version.o: m_version.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_features.h \
+  ../include/ircd_policy.h ../include/ircd_reply.h \
+  ../include/ircd_snprintf.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_debug.h ../include/s_user.h \
+  ../include/send.h ../include/supported.h ../include/channel.h \
+  ../include/version.h
+m_wallchops.o: m_wallchops.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_user.h ../include/send.h
+m_wallops.o: m_wallops.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/send.h
+m_wallusers.o: m_wallusers.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/send.h
+m_who.o: m_who.c ../config.h ../include/channel.h ../include/ircd_defs.h \
+  ../include/client.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_chattr.h \
+  ../include/ircd_log.h ../include/ircd_policy.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/match.h ../include/numeric.h \
+  ../include/numnicks.h ../include/send.h ../include/support.h \
+  ../include/whocmds.h
+m_whois.o: m_whois.c ../config.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/hash.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_policy.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/match.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/s_user.h ../include/send.h ../include/whocmds.h
+m_whowas.o: m_whowas.c ../config.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_policy.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/s_user.h ../include/s_misc.h \
+  ../include/send.h ../include/whowas.h
+match.o: match.c ../config.h ../include/match.h ../include/ircd_chattr.h
+motd.o: motd.c ../config.h ../include/motd.h ../include/class.h \
+  ../include/client.h ../include/ircd_defs.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/fileio.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_alloc.h ../include/ircd_features.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/match.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_conf.h \
+  ../include/s_debug.h ../include/s_user.h ../include/send.h
+msgq.o: msgq.c ../config.h ../include/msgq.h ../include/ircd_defs.h \
+  ../include/ircd_alloc.h ../include/ircd_snprintf.h ../include/s_debug.h
+numnicks.o: numnicks.c ../config.h ../include/numnicks.h \
+  ../include/client.h ../include/ircd_defs.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_alloc.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/match.h \
+  ../include/s_bsd.h ../include/s_debug.h ../include/s_misc.h
+opercmds.o: opercmds.c ../config.h ../include/opercmds.h \
+  ../include/class.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_chattr.h ../include/ircd_reply.h \
+  ../include/ircd_string.h ../include/listener.h ../include/match.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/s_conf.h ../include/send.h
+packet.o: packet.c ../config.h ../include/packet.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_chattr.h ../include/parse.h \
+  ../include/s_bsd.h ../include/s_misc.h ../include/send.h
+parse.o: parse.c ../config.h ../include/parse.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/channel.h \
+  ../include/handlers.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_alloc.h ../include/ircd_chattr.h \
+  ../include/ircd_features.h ../include/ircd_policy.h \
+  ../include/ircd_reply.h ../include/ircd_string.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/opercmds.h \
+  ../include/querycmds.h ../include/res.h ../include/s_bsd.h \
+  ../include/s_conf.h ../include/s_debug.h ../include/s_misc.h \
+  ../include/s_numeric.h ../include/s_user.h ../include/send.h \
+  ../include/sys.h ../include/whocmds.h ../include/whowas.h
+querycmds.o: querycmds.c ../config.h ../include/querycmds.h \
+  ../include/ircd_features.h
+random.o: random.c ../config.h ../include/random.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd_log.h ../include/ircd_reply.h ../include/send.h
+res.o: res.c ../config.h ../include/res.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_alloc.h ../include/ircd_log.h \
+  ../include/ircd_osdep.h ../include/ircd_reply.h \
+  ../include/ircd_snprintf.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/msg.h ../include/numeric.h \
+  ../include/s_bsd.h ../include/s_debug.h ../include/s_misc.h \
+  ../include/send.h ../include/support.h ../include/sys.h
+s_auth.o: s_auth.c ../config.h ../include/s_auth.h \
+  ../include/ircd_events.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_handler.h \
+  ../include/IPcheck.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_alloc.h ../include/ircd_chattr.h \
+  ../include/ircd_features.h ../include/ircd_log.h \
+  ../include/ircd_osdep.h ../include/ircd_snprintf.h \
+  ../include/ircd_string.h ../include/list.h ../include/numeric.h \
+  ../include/querycmds.h ../include/res.h ../include/s_bsd.h \
+  ../include/s_debug.h ../include/s_misc.h ../include/send.h \
+  ../include/sys.h
+s_bsd.o: s_bsd.c ../config.h ../include/s_bsd.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/IPcheck.h \
+  ../include/channel.h ../include/class.h ../include/hash.h \
+  ../include/ircd_log.h ../include/ircd_features.h \
+  ../include/ircd_osdep.h ../include/ircd_reply.h \
+  ../include/ircd_snprintf.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/ircd.h ../include/struct.h \
+  ../include/list.h ../include/listener.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/packet.h \
+  ../include/parse.h ../include/querycmds.h ../include/res.h \
+  ../include/s_auth.h ../include/s_conf.h ../include/s_debug.h \
+  ../include/s_misc.h ../include/s_user.h ../include/send.h \
+  ../include/support.h ../include/sys.h ../include/uping.h \
+  ../include/version.h
+s_conf.o: s_conf.c ../config.h ../include/s_conf.h ../include/IPcheck.h \
+  ../include/class.h ../include/client.h ../include/ircd_defs.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/crule.h ../include/ircd_features.h \
+  ../include/fileio.h ../include/gline.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_alloc.h \
+  ../include/ircd_chattr.h ../include/ircd_log.h ../include/ircd_reply.h \
+  ../include/ircd_snprintf.h ../include/ircd_string.h ../include/list.h \
+  ../include/listener.h ../include/match.h ../include/motd.h \
+  ../include/numeric.h ../include/numnicks.h ../include/opercmds.h \
+  ../include/parse.h ../include/res.h ../include/s_bsd.h \
+  ../include/s_debug.h ../include/s_misc.h ../include/send.h \
+  ../include/support.h ../include/sys.h
+s_debug.o: s_debug.c ../config.h ../include/s_debug.h \
+  ../include/ircd_defs.h ../include/channel.h ../include/class.h \
+  ../include/client.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd_alloc.h ../include/ircd_features.h \
+  ../include/ircd_log.h ../include/ircd_osdep.h ../include/ircd_reply.h \
+  ../include/ircd.h ../include/struct.h ../include/list.h \
+  ../include/numeric.h ../include/numnicks.h ../include/res.h \
+  ../include/s_bsd.h ../include/s_conf.h ../include/send.h \
+  ../include/sys.h ../include/whowas.h
+s_err.o: s_err.c ../config.h ../include/numeric.h ../include/s_debug.h \
+  ../include/ircd_defs.h
+s_misc.o: s_misc.c ../config.h ../include/s_misc.h ../include/IPcheck.h \
+  ../include/channel.h ../include/ircd_defs.h ../include/client.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_alloc.h ../include/ircd_log.h \
+  ../include/ircd_policy.h ../include/ircd_reply.h \
+  ../include/ircd_snprintf.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/list.h ../include/match.h \
+  ../include/msg.h ../include/numeric.h ../include/numnicks.h \
+  ../include/parse.h ../include/querycmds.h ../include/ircd_features.h \
+  ../include/res.h ../include/s_bsd.h ../include/s_conf.h \
+  ../include/s_debug.h ../include/s_user.h ../include/send.h \
+  ../include/support.h ../include/sys.h ../include/uping.h \
+  ../include/userload.h
+s_numeric.o: s_numeric.c ../config.h ../include/s_numeric.h \
+  ../include/channel.h ../include/ircd_defs.h ../include/client.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_policy.h ../include/ircd_snprintf.h \
+  ../include/numnicks.h ../include/send.h
+s_serv.o: s_serv.c ../config.h ../include/s_serv.h ../include/IPcheck.h \
+  ../include/channel.h ../include/ircd_defs.h ../include/client.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/gline.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_alloc.h \
+  ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/ircd_snprintf.h \
+  ../include/ircd_xopen.h ../include/jupe.h ../include/list.h \
+  ../include/match.h ../include/msg.h ../include/numeric.h \
+  ../include/numnicks.h ../include/parse.h ../include/querycmds.h \
+  ../include/ircd_features.h ../include/s_bsd.h ../include/s_conf.h \
+  ../include/s_debug.h ../include/s_misc.h ../include/s_user.h \
+  ../include/send.h ../include/sys.h ../include/userload.h
+s_stats.o: s_stats.c ../config.h ../include/s_stats.h ../include/class.h \
+  ../include/client.h ../include/ircd_defs.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_chattr.h \
+  ../include/ircd_log.h ../include/ircd_reply.h ../include/ircd_string.h \
+  ../include/listener.h ../include/match.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_conf.h \
+  ../include/s_user.h ../include/send.h
+s_user.o: s_user.c ../config.h ../include/s_user.h ../include/IPcheck.h \
+  ../include/channel.h ../include/ircd_defs.h ../include/class.h \
+  ../include/client.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/hash.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_alloc.h \
+  ../include/ircd_chattr.h ../include/ircd_features.h \
+  ../include/ircd_log.h ../include/ircd_policy.h ../include/ircd_reply.h \
+  ../include/ircd_snprintf.h ../include/ircd_string.h ../include/list.h \
+  ../include/match.h ../include/motd.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/parse.h \
+  ../include/querycmds.h ../include/random.h ../include/s_bsd.h \
+  ../include/s_conf.h ../include/s_debug.h ../include/s_misc.h \
+  ../include/s_serv.h ../include/send.h ../include/support.h \
+  ../include/supported.h ../include/sys.h ../include/userload.h \
+  ../include/version.h ../include/whowas.h ../include/handlers.h
+send.o: send.c ../config.h ../include/send.h ../include/channel.h \
+  ../include/ircd_defs.h ../include/class.h ../include/client.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_policy.h ../include/ircd_snprintf.h \
+  ../include/ircd_string.h ../include/ircd_chattr.h ../include/list.h \
+  ../include/match.h ../include/msg.h ../include/numnicks.h \
+  ../include/parse.h ../include/s_bsd.h ../include/s_debug.h \
+  ../include/s_misc.h ../include/s_user.h ../include/sys.h
+support.o: support.c ../config.h ../include/support.h ../include/fileio.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_defs.h \
+  ../include/ircd_chattr.h ../include/ircd_snprintf.h ../include/s_bsd.h \
+  ../include/s_debug.h ../include/send.h ../include/sys.h
+uping.o: uping.c ../config.h ../include/uping.h ../include/ircd_defs.h \
+  ../include/ircd_events.h ../include/client.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_alloc.h ../include/ircd_log.h \
+  ../include/ircd_osdep.h ../include/ircd_string.h \
+  ../include/ircd_chattr.h ../include/match.h ../include/msg.h \
+  ../include/numeric.h ../include/numnicks.h ../include/s_bsd.h \
+  ../include/s_conf.h ../include/s_debug.h ../include/s_misc.h \
+  ../include/s_user.h ../include/send.h ../include/sys.h
+userload.o: userload.c ../config.h ../include/userload.h \
+  ../include/client.h ../include/ircd_defs.h ../include/dbuf.h \
+  ../include/msgq.h ../include/ircd_events.h ../include/ircd_handler.h \
+  ../include/ircd.h ../include/struct.h ../include/msg.h \
+  ../include/numnicks.h ../include/querycmds.h ../include/ircd_features.h \
+  ../include/s_misc.h ../include/send.h ../include/sys.h
+whocmds.o: whocmds.c ../config.h ../include/whocmds.h \
+  ../include/channel.h ../include/ircd_defs.h ../include/client.h \
+  ../include/dbuf.h ../include/msgq.h ../include/ircd_events.h \
+  ../include/ircd_handler.h ../include/hash.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_chattr.h ../include/ircd_policy.h \
+  ../include/ircd_reply.h ../include/ircd_snprintf.h \
+  ../include/ircd_string.h ../include/list.h ../include/match.h \
+  ../include/numeric.h ../include/numnicks.h ../include/querycmds.h \
+  ../include/ircd_features.h ../include/random.h ../include/s_bsd.h \
+  ../include/s_conf.h ../include/s_misc.h ../include/s_user.h \
+  ../include/send.h ../include/support.h ../include/sys.h \
+  ../include/userload.h ../include/version.h ../include/whowas.h \
+  ../include/msg.h
+whowas.o: whowas.c ../config.h ../include/whowas.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/ircd.h \
+  ../include/struct.h ../include/ircd_alloc.h ../include/ircd_chattr.h \
+  ../include/ircd_features.h ../include/ircd_string.h ../include/list.h \
+  ../include/numeric.h ../include/s_debug.h ../include/s_misc.h \
+  ../include/s_user.h ../include/send.h ../include/support.h \
+  ../include/sys.h ../include/msg.h
+os_bsd.o: os_bsd.c ../config.h ../include/ircd_osdep.h ../include/msgq.h \
+  ../include/ircd_defs.h
+os_linux.o: os_linux.c ../config.h ../include/ircd_osdep.h \
+  ../include/msgq.h ../include/ircd_defs.h
+os_openbsd.o: os_openbsd.c ../config.h ../include/ircd_osdep.h \
+  ../include/msgq.h ../include/ircd_defs.h
+os_generic.o: os_generic.c ../config.h ../include/ircd_osdep.h \
+  ../include/msgq.h ../include/ircd_defs.h
+os_solaris.o: os_solaris.c ../config.h ../include/ircd_osdep.h \
+  ../include/msgq.h ../include/ircd_defs.h
+engine_devpoll.o: engine_devpoll.c ../config.h ../include/ircd_events.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_defs.h \
+  ../include/ircd_alloc.h ../include/ircd_features.h \
+  ../include/ircd_log.h ../include/s_debug.h
+engine_poll.o: engine_poll.c ../config.h ../include/ircd_events.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_defs.h \
+  ../include/ircd_alloc.h ../include/ircd_log.h ../include/s_debug.h
+engine_kqueue.o: engine_kqueue.c ../config.h ../include/ircd_events.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_defs.h \
+  ../include/ircd_alloc.h ../include/ircd_features.h \
+  ../include/ircd_log.h ../include/s_debug.h
+engine_select.o: engine_select.c ../config.h ../include/ircd_events.h \
+  ../include/ircd.h ../include/struct.h ../include/ircd_defs.h \
+  ../include/ircd_log.h ../include/s_debug.h
+chkconf.o: chkconf.c ../config.h ../include/s_conf.h ../include/client.h \
+  ../include/ircd_defs.h ../include/dbuf.h ../include/msgq.h \
+  ../include/ircd_events.h ../include/ircd_handler.h ../include/class.h \
+  ../include/fileio.h ../include/ircd.h ../include/struct.h \
+  ../include/ircd_alloc.h ../include/ircd_chattr.h \
+  ../include/ircd_string.h ../include/sys.h
index c9cf899adf692b6ae6221c155526449f336c5a23..1db947500ddb790b26822f16fbd03b30f650a73a 100644 (file)
@@ -162,11 +162,11 @@ struct Client* find_chasing(struct Client* sptr, const char* user, int* chasing)
  * Create a string of form "foo!bar@fubar" given foo, bar and fubar
  * as the parameters.  If NULL, they become "*".
  */
-static char *make_nick_user_host(const char *nick, const char *name,
-                                 const char *host)
+#define NUH_BUFSIZE    (NICKLEN + USERLEN + HOSTLEN + 3)
+static char *make_nick_user_host(char *namebuf, const char *nick,
+                                const char *name, const char *host)
 {
-  static char namebuf[NICKLEN + USERLEN + HOSTLEN + 3];
-  ircd_snprintf(0, namebuf, sizeof(namebuf), "%s!%s@%s", nick, name, host);
+  ircd_snprintf(0, namebuf, NUH_BUFSIZE, "%s!%s@%s", nick, name, host);
   return namebuf;
 }
 
@@ -174,10 +174,11 @@ static char *make_nick_user_host(const char *nick, const char *name,
  * Create a string of form "foo!bar@123.456.789.123" given foo, bar and the
  * IP-number as the parameters.  If NULL, they become "*".
  */
-static char *make_nick_user_ip(char *nick, char *name, struct in_addr ip)
+#define NUI_BUFSIZE    (NICKLEN + USERLEN + 16 + 3)
+static char *make_nick_user_ip(char *ipbuf, char *nick, char *name,
+                              struct in_addr ip)
 {
-  static char ipbuf[NICKLEN + USERLEN + 16 + 3];
-  ircd_snprintf(0, ipbuf, sizeof(ipbuf), "%s!%s@%s", nick, name,
+  ircd_snprintf(0, ipbuf, NUI_BUFSIZE, "%s!%s@%s", nick, name,
                ircd_ntoa((const char*) &ip));
   return ipbuf;
 }
@@ -410,7 +411,11 @@ static int is_banned(struct Client *cptr, struct Channel *chptr,
                      struct Membership* member)
 {
   struct SLink* tmp;
+  char          nu_host[NUH_BUFSIZE];
+  char          nu_realhost[NUH_BUFSIZE];
+  char          nu_ip[NUI_BUFSIZE];
   char*         s;
+  char*         sr = NULL;
   char*         ip_s = NULL;
 
   if (!IsUser(cptr))
@@ -419,19 +424,25 @@ static int is_banned(struct Client *cptr, struct Channel *chptr,
   if (member && IsBanValid(member))
     return IsBanned(member);
 
-  s = make_nick_user_host(cli_name(cptr), (cli_user(cptr))->username,
+  s = make_nick_user_host(nu_host, cli_name(cptr), (cli_user(cptr))->username,
                          (cli_user(cptr))->host);
+  if (HasHiddenHost(cptr))
+    sr = make_nick_user_host(nu_realhost, cli_name(cptr),
+                            (cli_user(cptr))->username,
+                            cli_user(cptr)->realhost);
 
   for (tmp = chptr->banlist; tmp; tmp = tmp->next) {
     if ((tmp->flags & CHFL_BAN_IPMASK)) {
       if (!ip_s)
-        ip_s = make_nick_user_ip(cli_name(cptr), (cli_user(cptr))->username,
-                                cli_ip(cptr));
+        ip_s = make_nick_user_ip(nu_ip, cli_name(cptr),
+                                (cli_user(cptr))->username, cli_ip(cptr));
       if (match(tmp->value.ban.banstr, ip_s) == 0)
         break;
     }
     else if (match(tmp->value.ban.banstr, s) == 0)
       break;
+    else if (sr && match(tmp->value.ban.banstr, sr) == 0)
+      break;
   }
 
   if (member) {
@@ -637,11 +648,12 @@ int client_can_send_to_channel(struct Client *cptr, struct Channel *chptr)
    * +n (no external messages) or +m (moderated).
    */
   if (!member) {
-    if ((chptr->mode.mode & (MODE_NOPRIVMSGS|MODE_MODERATED)) 
-       || IsModelessChannel(chptr->chname)) 
+    if ((chptr->mode.mode & (MODE_NOPRIVMSGS|MODE_MODERATED)) ||
+       IsModelessChannel(chptr->chname) ||
+       ((chptr->mode.mode & MODE_REGONLY) && !IsAccount(cptr)))
       return 0;
     else
-      return 1;
+      return !is_banned(cptr, chptr, NULL);
   }
   return member_can_send_to_channel(member); 
 }
@@ -669,7 +681,7 @@ const char* find_no_nickchange_channel(struct Client* cptr)
  * write the "simple" list of channel modes for channel chptr onto buffer mbuf
  * with the parameters in pbuf.
  */
-void channel_modes(struct Client *cptr, char *mbuf, char *pbuf,
+void channel_modes(struct Client *cptr, char *mbuf, char *pbuf, int buflen,
                           struct Channel *chptr)
 {
   assert(0 != mbuf);
@@ -689,9 +701,11 @@ void channel_modes(struct Client *cptr, char *mbuf, char *pbuf,
     *mbuf++ = 'i';
   if (chptr->mode.mode & MODE_NOPRIVMSGS)
     *mbuf++ = 'n';
+  if (chptr->mode.mode & MODE_REGONLY)
+    *mbuf++ = 'r';
   if (chptr->mode.limit) {
     *mbuf++ = 'l';
-    ircd_snprintf(0, pbuf, sizeof(pbuf), "%u", chptr->mode.limit);
+    ircd_snprintf(0, pbuf, buflen, "%u", chptr->mode.limit);
   }
 
   if (*chptr->mode.key) {
@@ -734,7 +748,7 @@ void send_channel_modes(struct Client *cptr, struct Channel *chptr)
   lp2 = chptr->banlist;
 
   *modebuf = *parabuf = '\0';
-  channel_modes(cptr, modebuf, parabuf, chptr);
+  channel_modes(cptr, modebuf, parabuf, sizeof(parabuf), chptr);
 
   for (first = 1; full; first = 0)      /* Loop for multiple messages */
   {
@@ -854,6 +868,7 @@ void send_channel_modes(struct Client *cptr, struct Channel *chptr)
 char *pretty_mask(char *mask)
 {
   static char star[2] = { '*', 0 };
+  static char retmask[NUH_BUFSIZE];
   char *last_dot = NULL;
   char *ptr;
 
@@ -926,7 +941,7 @@ char *pretty_mask(char *mask)
     host = ptr - HOSTLEN;
     *host = '*';
   }
-  return make_nick_user_host(nick, user, host);
+  return make_nick_user_host(retmask, nick, user, host);
 }
 
 static void send_ban_list(struct Client* cptr, struct Channel* chptr)
@@ -1005,6 +1020,9 @@ int can_join(struct Client *sptr, struct Channel *chptr, char *key)
        
   if (chptr->mode.limit && chptr->users >= chptr->mode.limit)
        return overrideJoin + ERR_CHANNELISFULL;
+
+  if ((chptr->mode.mode & MODE_REGONLY) && !IsAccount(sptr))
+       return overrideJoin + ERR_NEEDREGGEDNICK;
        
   if (is_banned(sptr, chptr, NULL))
        return overrideJoin + ERR_BANNEDFROMCHAN;
@@ -1320,6 +1338,7 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
     MODE_TOPICLIMIT,   't',
     MODE_INVITEONLY,   'i',
     MODE_NOPRIVMSGS,   'n',
+    MODE_REGONLY,      'r',
 /*  MODE_KEY,          'k', */
 /*  MODE_BAN,          'b', */
 /*  MODE_LIMIT,                'l', */
@@ -1465,7 +1484,7 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
     }
 
     /* send the messages off to their destination */
-    if (mbuf->mb_dest & MODEBUF_DEST_HACK2) {
+    if (mbuf->mb_dest & MODEBUF_DEST_HACK2)
       sendto_opmask_butone(0, SNO_HACK2, "HACK(2): %s MODE %s %s%s%s%s%s%s "
                           "[%Tu]",
 #ifdef HEAD_IN_SAND_SNOTICES
@@ -1477,18 +1496,6 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
                           rembuf_i ? "-" : "", rembuf, addbuf_i ? "+" : "",
                           addbuf, remstr, addstr,
                           mbuf->mb_channel->creationtime);
-      sendcmdto_serv_butone(&me, CMD_DESYNCH, mbuf->mb_connect,
-                           ":HACK: %s MODE %s %s%s%s%s%s%s [%Tu]",
-#ifdef HEAD_IN_SAND_SNOTICES
-                           cli_name(mbuf->mb_source),
-#else
-                           cli_name(app_source),
-#endif
-                           mbuf->mb_channel->chname,
-                           rembuf_i ? "-" : "", rembuf,
-                           addbuf_i ? "+" : "", addbuf, remstr, addstr,
-                           mbuf->mb_channel->creationtime);
-    }
 
     if (mbuf->mb_dest & MODEBUF_DEST_HACK3)
       sendto_opmask_butone(0, SNO_HACK3, "BOUNCE or HACK(3): %s MODE %s "
@@ -1522,7 +1529,7 @@ modebuf_flush_int(struct ModeBuf *mbuf, int all)
                addbuf_i ? "+" : "", addbuf, remstr, addstr);
 
     if (mbuf->mb_dest & MODEBUF_DEST_CHANNEL)
-      sendcmdto_channel_butserv(app_source, CMD_MODE, mbuf->mb_channel,
+      sendcmdto_channel_butserv_butone(app_source, CMD_MODE, mbuf->mb_channel, NULL,
                                "%H %s%s%s%s%s%s", mbuf->mb_channel,
                                rembuf_i ? "-" : "", rembuf,
                                addbuf_i ? "+" : "", addbuf, remstr, addstr);
@@ -1686,7 +1693,7 @@ modebuf_mode(struct ModeBuf *mbuf, unsigned int mode)
   assert(0 != (mode & (MODE_ADD | MODE_DEL)));
 
   mode &= (MODE_ADD | MODE_DEL | MODE_PRIVATE | MODE_SECRET | MODE_MODERATED |
-          MODE_TOPICLIMIT | MODE_INVITEONLY | MODE_NOPRIVMSGS);
+          MODE_TOPICLIMIT | MODE_INVITEONLY | MODE_NOPRIVMSGS | MODE_REGONLY);
 
   if (!(mode & ~(MODE_ADD | MODE_DEL))) /* don't add empty modes... */
     return;
@@ -1789,6 +1796,7 @@ modebuf_extract(struct ModeBuf *mbuf, char *buf)
     MODE_KEY,          'k',
 /*  MODE_BAN,          'b', */
     MODE_LIMIT,                'l',
+    MODE_REGONLY,      'r',
     0x0, 0x0
   };
   unsigned int add;
@@ -2434,6 +2442,7 @@ mode_parse(struct ModeBuf *mbuf, struct Client *cptr, struct Client *sptr,
     MODE_KEY,          'k',
     MODE_BAN,          'b',
     MODE_LIMIT,                'l',
+    MODE_REGONLY,      'r',
     MODE_ADD,          '+',
     MODE_DEL,          '-',
     0x0, 0x0
@@ -2646,7 +2655,7 @@ joinbuf_join(struct JoinBuf *jbuf, struct Channel *chan, unsigned int flags)
       jbuf->jb_type == JOINBUF_TYPE_PARTALL) {
     /* Send notification to channel */
     if (!(flags & CHFL_ZOMBIE))
-      sendcmdto_channel_butserv(jbuf->jb_source, CMD_PART, chan,
+      sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_PART, chan, NULL,
                                (flags & CHFL_BANNED || !jbuf->jb_comment) ?
                                ":%H" : "%H :%s", chan, jbuf->jb_comment);
     else if (MyUser(jbuf->jb_source))
@@ -2673,12 +2682,12 @@ joinbuf_join(struct JoinBuf *jbuf, struct Channel *chan, unsigned int flags)
                            "%H %Tu", chan, chan->creationtime);
 
     /* Send the notification to the channel */
-    sendcmdto_channel_butserv(jbuf->jb_source, CMD_JOIN, chan, ":%H", chan);
+    sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_JOIN, chan, NULL, ":%H", chan);
 
     /* send an op, too, if needed */
     if (!MyUser(jbuf->jb_source) && jbuf->jb_type == JOINBUF_TYPE_CREATE &&
        !IsModelessChannel(chan->chname))
-      sendcmdto_channel_butserv(jbuf->jb_source, CMD_MODE, chan, "%H +o %C",
+      sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_MODE, chan, NULL, "%H +o %C",
                                chan, jbuf->jb_source);
   }
 
index 4f416fb184f975db9aab1c689f242ae25ddaa8ab..3cbe27d96935d098b427b52c8ed1f2c2a62e7576 100644 (file)
@@ -49,6 +49,8 @@ int client_get_ping(const struct Client* acptr)
   struct ConfItem* aconf;
   struct SLink*    link;
 
+  assert(cli_verify(acptr));
+
   for (link = cli_confs(acptr); link; link = link->next) {
     aconf = link->value.aconf;
     if (aconf->status & (CONF_CLIENT | CONF_SERVER)) {
@@ -61,6 +63,7 @@ int client_get_ping(const struct Client* acptr)
     ping = feature_int(FEAT_PINGFREQUENCY);
 
   Debug((DEBUG_DEBUG, "Client %s Ping %d", cli_name(acptr), ping));
+
   return ping;
 }
 
index ece113a0a8ecb6c5ef63c917d17586cd63e7cea8..5cf7effdd6919435e2d4d04faae0b03dbd2ee0dc 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "ircd.h"
 #include "ircd_alloc.h"
+#include "ircd_features.h"
 #include "ircd_log.h"
 #include "s_debug.h"
 
@@ -40,8 +41,6 @@
 #define DEVPOLL_ERROR_THRESHOLD        20      /* after 20 devpoll errors, restart */
 #define ERROR_EXPIRE_TIME      3600    /* expire errors after an hour */
 
-#define POLLS_PER_DEVPOLL      20      /* get 20 pollfd's per turn */
-
 /* Figure out what bits to set for read */
 #if defined(POLLMSG) && defined(POLLIN) && defined(POLLRDNORM)
 #  define POLLREADFLAGS (POLLMSG|POLLIN|POLLRDNORM)
@@ -241,16 +240,26 @@ static void
 engine_loop(struct Generators* gen)
 {
   struct dvpoll dopoll;
-  struct pollfd polls[POLLS_PER_DEVPOLL];
+  struct pollfd *polls;
+  int polls_count;
   struct Socket* sock;
   int nfds;
   int i;
   int errcode;
   size_t codesize;
 
+  if ((polls_count = feature_int(FEAT_POLLS_PER_LOOP)) < 20)
+    polls_count = 20;
+  polls = (struct pollfd *)MyMalloc(sizeof(struct pollfd) * polls_count);
+
   while (running) {
+    if ((i = feature_int(FEAT_POLLS_PER_LOOP)) >= 20 && i != polls_count) {
+      polls = (struct pollfd *)MyRealloc(polls, sizeof(struct pollfd) * i);
+      polls_count = i;
+    }
+
     dopoll.dp_fds = polls; /* set up the struct dvpoll */
-    dopoll.dp_nfds = POLLS_PER_DEVPOLL;
+    dopoll.dp_nfds = polls_count;
 
     /* calculate the proper timeout */
     dopoll.dp_timeout = timer_next(gen) ?
@@ -269,7 +278,7 @@ engine_loop(struct Generators* gen)
        /* Log the poll error */
        log_write(LS_SOCKET, L_ERROR, 0, "ioctl(DP_POLL) error: %m");
        if (!errors++)
-         timer_add(&clear_error, error_clear, 0, TT_PERIODIC,
+         timer_add(timer_init(&clear_error), error_clear, 0, TT_PERIODIC,
                    ERROR_EXPIRE_TIME);
        else if (errors > DEVPOLL_ERROR_THRESHOLD) /* too many errors... */
          server_restart("too many /dev/poll errors");
@@ -282,13 +291,13 @@ engine_loop(struct Generators* gen)
 
     for (i = 0; i < nfds; i++) {
       assert(-1 < polls[i].fd);
-      assert(0 != sockList[polls[i].fd]);
-      assert(s_fd(sockList[polls[i].fd]) == polls[i].fd);
 
       sock = sockList[polls[i].fd];
       if (!sock) /* slots may become empty while processing events */
        continue;
 
+      assert(s_fd(sock) == polls[i].fd);
+
       gen_ref_inc(sock); /* can't have it going away on us */
 
       Debug((DEBUG_ENGINE, "devpoll: Checking socket %p (fd %d) state %s, "
index aafbb59b692822a4463495a0213d4028e1c4c689..892c595daa231df0625106febf548bbedc030553 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "ircd.h"
 #include "ircd_alloc.h"
+#include "ircd_features.h"
 #include "ircd_log.h"
 #include "s_debug.h"
 
@@ -40,8 +41,6 @@
 #define KQUEUE_ERROR_THRESHOLD 20      /* after 20 kqueue errors, restart */
 #define ERROR_EXPIRE_TIME      3600    /* expire errors after an hour */
 
-#define POLLS_PER_KQUEUE       20      /* get 20 kevents per turn */
-
 static struct Socket** sockList;
 static int kqueue_max;
 static int kqueue_id;
@@ -177,7 +176,7 @@ set_or_clear(struct Socket* sock, unsigned int clear, unsigned int set)
     i++; /* advance count... */
   }
 
-  if (kevent(kqueue_id, chglist, i, 0, 0, 0) < 0)
+  if (kevent(kqueue_id, chglist, i, 0, 0, 0) < 0 && errno != EBADF)
     event_generate(ET_ERROR, sock, errno); /* report error */
 }
 
@@ -278,7 +277,8 @@ engine_delete(struct Socket* sock)
 static void
 engine_loop(struct Generators* gen)
 {
-  struct kevent events[POLLS_PER_KQUEUE];
+  struct kevent *events;
+  int events_count;
   struct Socket* sock;
   struct timespec wait;
   int nevs;
@@ -286,7 +286,16 @@ engine_loop(struct Generators* gen)
   int errcode;
   size_t codesize;
 
+  if ((events_count = feature_int(FEAT_POLLS_PER_LOOP)) < 20)
+    events_count = 20;
+  events = (struct kevent *)MyMalloc(sizeof(struct kevent) * events_count);
+
   while (running) {
+    if ((i = feature_int(FEAT_POLLS_PER_LOOP)) >= 20 && i != events_count) {
+      events = (struct kevent *)MyRealloc(events, sizeof(struct kevent) * i);
+      events_count = i;
+    }
+
     /* set up the sleep time */
     wait.tv_sec = timer_next(gen) ? (timer_next(gen) - CurrentTime) : -1;
     wait.tv_nsec = 0;
@@ -295,7 +304,7 @@ engine_loop(struct Generators* gen)
           CurrentTime, wait.tv_sec));
 
     /* check for active events */
-    nevs = kevent(kqueue_id, 0, 0, events, POLLS_PER_KQUEUE,
+    nevs = kevent(kqueue_id, 0, 0, events, events_count,
                  wait.tv_sec < 0 ? 0 : &wait);
 
     CurrentTime = time(0); /* set current time... */
@@ -305,7 +314,7 @@ engine_loop(struct Generators* gen)
        /* Log the kqueue error */
        log_write(LS_SOCKET, L_ERROR, 0, "kevent() error: %m");
        if (!errors++)
-         timer_add(&clear_error, error_clear, 0, TT_PERIODIC,
+         timer_add(timer_init(&clear_error), error_clear, 0, TT_PERIODIC,
                    ERROR_EXPIRE_TIME);
        else if (errors > KQUEUE_ERROR_THRESHOLD) /* too many errors... */
          server_restart("too many kevent errors");
index b5ca2c7d498a622d5381683511cf469242ee9bf4..a166d4f2482d248730f3d38aaad79ce252114a78 100644 (file)
@@ -263,7 +263,7 @@ engine_loop(struct Generators* gen)
        /* Log the poll error */
        log_write(LS_SOCKET, L_ERROR, 0, "poll() error: %m");
        if (!errors++)
-         timer_add(&clear_error, error_clear, 0, TT_PERIODIC,
+         timer_add(timer_init(&clear_error), error_clear, 0, TT_PERIODIC,
                    ERROR_EXPIRE_TIME);
        else if (errors > POLL_ERROR_THRESHOLD) /* too many errors... */
          server_restart("too many poll errors");
index f09c7713c5466adaf4d2009d655d5aa9f09c4b8c..2149b8978b0ce6ea28873c190e7b6a55cef995be 100644 (file)
@@ -241,7 +241,7 @@ engine_loop(struct Generators* gen)
        /* Log the select error */
        log_write(LS_SOCKET, L_ERROR, 0, "select() error: %m");
        if (!errors++)
-         timer_add(&clear_error, error_clear, 0, TT_PERIODIC,
+         timer_add(timer_init(&clear_error), error_clear, 0, TT_PERIODIC,
                    ERROR_EXPIRE_TIME);
        else if (errors > SELECT_ERROR_THRESHOLD) /* too many errors... */
          server_restart("too many select errors");
index 6355a97e5cf45171c409173117564113d6171f96..e932ab3ff0eb70d04a2127b3dd94a443fcd35c89 100644 (file)
@@ -26,7 +26,7 @@
 #include <string.h>
 #include <time.h>
 
-#if !defined(NDEBUG)
+#if defined(MDEBUG)
 
 #ifndef HTABLE_SIZE
 #define HTABLE_SIZE 65539
@@ -650,5 +650,5 @@ char* fda_strdup(const char* src, const char* file, int line)
   return p;
 }
 
-#endif /* !defined(NDEBUG) */
+#endif /* defined(MDEBUG) */
 
index 403a1d42fbdf8bad349b2306b1f549355bf7e3fb..3e9970628917a548469765cb2eb05c9bbd142dd7 100644 (file)
@@ -609,7 +609,7 @@ gline_lookup(struct Client *cptr, unsigned int flags)
         continue;
     }
     else {
-      if (match(gline->gl_host, (cli_user(cptr))->host) != 0) 
+      if (match(gline->gl_host, (cli_user(cptr))->realhost) != 0) 
         continue;
     }
     return gline;
index 151f45956fee3c4153a88baf0aeaa32628282bf6..ea3a538f1e74868eb7452cb2ca6e02f715be12b7 100644 (file)
@@ -615,8 +615,8 @@ int main(int argc, char **argv) {
   uping_init();
 
   IPcheck_init();
-  timer_add(&connect_timer, try_connections, 0, TT_RELATIVE, 1);
-  timer_add(&ping_timer, check_pings, 0, TT_RELATIVE, 1);
+  timer_add(timer_init(&connect_timer), try_connections, 0, TT_RELATIVE, 1);
+  timer_add(timer_init(&ping_timer), check_pings, 0, TT_RELATIVE, 1);
 
   CurrentTime = time(NULL);
 
index 17c6571aab62694983ce09645bdbd9f506147953..d3630123ffa095d6978ca01b07bb7f3517b8f6ca 100644 (file)
@@ -29,7 +29,7 @@
 
 #include <assert.h>
 
-#if defined(NDEBUG)
+#if !defined(MDEBUG)
 /*
  * RELEASE: allocation functions
  */
@@ -71,7 +71,7 @@ void* MyCalloc(size_t nelem, size_t size)
   return p;
 }
 
-#else /* !defined(NDEBUG) */
+#else /* defined(MDEBUG) */
 /*
  * DEBUG: allocation functions
  */
@@ -81,5 +81,5 @@ void set_nomem_handler(OutOfMemoryHandler handler)
   fda_set_nomem_handler(handler);
 }
 
-#endif /* !defined(NDEBUG) */
+#endif /* defined(MDEBUG) */
 
index e59cd051f4cfd7590086cfde3aa76d5f4779554a..00616e64904ecf9d8fdaef166d809ee5285e2b23 100644 (file)
@@ -129,6 +129,8 @@ event_execute(struct Event* event)
 
   if (event->ev_type == ET_DESTROY) /* turn off active flag *before* destroy */
     event->ev_gen.gen_header->gh_flags &= ~GEN_ACTIVE;
+  if (event->ev_type == ET_ERROR) /* turn on error flag before callback */
+    event->ev_gen.gen_header->gh_flags |= GEN_ERROR;
 
   (*event->ev_gen.gen_header->gh_call)(event); /* execute the event */
 
@@ -217,6 +219,7 @@ timer_enqueue(struct Timer* timer)
 
   assert(0 != timer);
   assert(0 == timer->t_header.gh_prev_p); /* not already on queue */
+  assert(timer->t_header.gh_flags & GEN_ACTIVE); /* timer is active */
 
   /* Calculate expire time */
   switch (timer->t_type) {
@@ -368,6 +371,43 @@ event_generate(enum EventType type, void* arg, int data)
   event_add(ptr); /* add event to queue */
 }
 
+#if 0
+/* Try to verify the timer list */
+void
+timer_verify(void)
+{
+  struct Timer* ptr;
+  struct Timer** ptr_p = &evInfo.gens.g_timer;
+  time_t lasttime = 0;
+
+  for (ptr = evInfo.gens.g_timer; ptr;
+       ptr = (struct Timer*) ptr->t_header.gh_next) {
+    /* verify timer is supposed to be in the list */
+    assert(ptr->t_header.gh_prev_p);
+    /* verify timer is correctly ordered */
+    assert((struct Timer**) ptr->t_header.gh_prev_p == ptr_p);
+    /* verify timer is active */
+    assert(ptr->t_header.gh_flags & GEN_ACTIVE);
+    /* verify timer ordering is correct */
+    assert(lasttime <= ptr->t_expire);
+
+    lasttime = ptr->t_expire; /* store time for ordering check */
+    ptr_p = (struct Timer**) &ptr->t_header.gh_next; /* store prev pointer */
+  }
+}
+#endif
+
+/* Initialize a timer structure */
+struct Timer*
+timer_init(struct Timer* timer)
+{
+  gen_init((struct GenHeader*) timer, 0, 0, 0, 0);
+
+  timer->t_header.gh_flags = 0; /* turn off active flag */
+
+  return timer; /* convenience return */
+}
+
 /* Add a timer to be processed */
 void
 timer_add(struct Timer* timer, EventCallBack call, void* data,
@@ -380,13 +420,20 @@ timer_add(struct Timer* timer, EventCallBack call, void* data,
         timer_to_name(type)));
 
   /* initialize a timer... */
-  gen_init((struct GenHeader*) timer, call, data, 0, 0);
+  timer->t_header.gh_flags |= GEN_ACTIVE;
+  if (timer->t_header.gh_flags & GEN_MARKED)
+    timer->t_header.gh_flags |= GEN_READD;
+
+  timer->t_header.gh_ref = 0;
+  timer->t_header.gh_call = call;
+  timer->t_header.gh_data = data;
 
   timer->t_type = type;
   timer->t_value = value;
   timer->t_expire = 0;
 
-  timer_enqueue(timer); /* and enqueue it */
+  if (!(timer->t_header.gh_flags & GEN_MARKED))
+    timer_enqueue(timer); /* and enqueue it */
 }
 
 /* Remove a timer from the processing queue */
@@ -395,18 +442,16 @@ timer_del(struct Timer* timer)
 {
   assert(0 != timer);
 
-  if (timer->t_header.gh_flags & GEN_MARKED)
-    return; /* timer already marked for destruction */
+  timer->t_header.gh_flags &= ~GEN_READD;
 
-  timer->t_header.gh_flags |= GEN_DESTROY;
+  if (timer->t_header.gh_flags & GEN_MARKED)
+    return; /* timer is being used */
 
   Debug((DEBUG_LIST, "Deleting timer %p (type %s)", timer,
         timer_to_name(timer->t_type)));
 
-  if (!timer->t_header.gh_ref) { /* not in use; destroy right now */
-    gen_dequeue(timer);
-    event_generate(ET_DESTROY, timer, 0);
-  }
+  gen_dequeue(timer);
+  event_generate(ET_DESTROY, timer, 0);
 }
 
 /* Change the time a timer expires */
@@ -436,27 +481,27 @@ void
 timer_run(void)
 {
   struct Timer* ptr;
-  struct Timer* next = 0;
 
   /* go through queue... */
-  for (ptr = evInfo.gens.g_timer; ptr; ptr = next) {
-    next = (struct Timer*) ptr->t_header.gh_next;
+  while ((ptr = evInfo.gens.g_timer)) {
     if (CurrentTime < ptr->t_expire)
       break; /* processed all pending timers */
 
     gen_dequeue(ptr); /* must dequeue timer here */
-    if (ptr->t_type == TT_ABSOLUTE || ptr->t_type == TT_RELATIVE) {
-      Debug((DEBUG_LIST, "Marking timer %p for later destruction", ptr));
-      ptr->t_header.gh_flags |= GEN_MARKED; /* mark for destruction */
-    }
+    ptr->t_header.gh_flags |= (GEN_MARKED |
+                              (ptr->t_type == TT_PERIODIC ? GEN_READD : 0));
+
     event_generate(ET_EXPIRE, ptr, 0); /* generate expire event */
 
-    if (ptr->t_header.gh_flags & (GEN_MARKED | GEN_DESTROY)) {
+    ptr->t_header.gh_flags &= ~GEN_MARKED;
+
+    if (!(ptr->t_header.gh_flags & GEN_READD)) {
       Debug((DEBUG_LIST, "Destroying timer %p", ptr));
       event_generate(ET_DESTROY, ptr, 0);
-    } else if (ptr->t_type == TT_PERIODIC) {
-      Debug((DEBUG_LIST, "Re-enqueuing periodic timer %p", ptr));
-      timer_enqueue(ptr); /* re-queue periodic timer */
+    } else {
+      Debug((DEBUG_LIST, "Re-enqueuing timer %p", ptr));
+      timer_enqueue(ptr); /* re-queue timer */
+      ptr->t_header.gh_flags &= ~GEN_READD;
     }
   }
 }
@@ -550,7 +595,8 @@ socket_state(struct Socket* sock, enum SocketState state)
   /* connected datagram socket now unconnected */
   assert(sock->s_state != SS_CONNECTDG || state == SS_DATAGRAM);
 
-  if (sock->s_header.gh_flags & GEN_DESTROY) /* socket's been destroyed */
+  /* Don't continue if an error occurred or the socket got destroyed */
+  if (sock->s_header.gh_flags & (GEN_DESTROY | GEN_ERROR))
     return;
 
   /* tell engine we're changing socket state */
@@ -569,7 +615,8 @@ socket_events(struct Socket* sock, unsigned int events)
   assert(0 != evInfo.engine);
   assert(0 != evInfo.engine->eng_events);
 
-  if (sock->s_header.gh_flags & GEN_DESTROY) /* socket's been destroyed */
+  /* Don't continue if an error occurred or the socket got destroyed */
+  if (sock->s_header.gh_flags & (GEN_DESTROY | GEN_ERROR))
     return;
 
   switch (events & SOCK_ACTION_MASK) {
@@ -689,6 +736,9 @@ gen_flags(unsigned int flags)
   NS(unsigned int) map[] = {
     NM(GEN_DESTROY),
     NM(GEN_MARKED),
+    NM(GEN_ACTIVE),
+    NM(GEN_READD),
+    NM(GEN_ERROR),
     NE
   };
 
index 0baf30bdec48fe68d7b8da0a067410e5e96eb56d..269af261f4f3ad8e57714647080533a9d583e3d7 100644 (file)
@@ -240,6 +240,7 @@ static struct FeatureDesc {
   F_I(CLIENT_FLOOD, 0, 1024, 0),
   F_I(SERVER_PORT, FEAT_OPER, 4400, 0),
   F_B(NODEFAULTMOTD, 0, 1, 0),
+  F_S(MOTD_BANNER, FEAT_NULL, 0, 0),
   F_B(KILL_IPMISMATCH, FEAT_OPER, 0, 0),
   F_B(IDLE_FROM_MSG, 0, 1, 0),
   F_B(HUB, 0, 0, 0),
@@ -248,6 +249,8 @@ static struct FeatureDesc {
   F_N(RANDOM_SEED, FEAT_NODISP, random_seed_set, 0, 0, 0, 0, 0, 0),
   F_S(DEFAULT_LIST_PARAM, FEAT_NULL, 0, list_set_default),
   F_I(NICKNAMEHISTORYLENGTH, 0, 800, whowas_realloc),
+  F_B(HOST_HIDING, 0, 0, 0),
+  F_S(HIDDEN_HOST, FEAT_CASE, "users.undernet.org", 0),
 
   /* features that probably should not be touched */
   F_I(KILLCHASETIMELIMIT, 0, 30, 0),
@@ -274,6 +277,7 @@ static struct FeatureDesc {
   F_B(VIRTUAL_HOST, 0, 0, 0),
   F_I(TOS_SERVER, 0, 0x08, 0),
   F_I(TOS_CLIENT, 0, 0x08, 0),
+  F_I(POLLS_PER_LOOP, 0, 200, 0),
 
   /* features that affect all operators */
   F_B(CRYPT_OPER_PASSWORD, FEAT_MYOPER | FEAT_READ, 1, 0),
@@ -300,7 +304,7 @@ static struct FeatureDesc {
   F_B(OPER_LOPMODE, 0, 1, 0),
   F_B(OPER_BADCHAN, 0, 0, 0),
   F_B(OPER_LBADCHAN, 0, 0, 0),
-  F_B(OPER_SET, 0, 1, 0),
+  F_B(OPER_SET, 0, 0, 0),
   F_B(OPERS_SEE_IN_SECRET_CHANNELS, 0, 1, 0),
   F_B(OPER_WIDE_GLINE, 0, 1, 0),
 
index b406f54509cbc5c3f40e276fba09c6c87a9d0545..80691c7150fdfdffaa9c0b80885e560d650366cd 100644 (file)
@@ -153,7 +153,6 @@ jupe_activate(struct Client *cptr, struct Client *sptr, struct Jupe *jupe,
   unsigned int saveflags = 0;
 
   assert(0 != jupe);
-  assert(!JupeIsLocal(jupe));
 
   saveflags = jupe->ju_flags;
 
index b85597dae4ae459076ddc7c7f7d4fafbe9703ea4..ebb637e741482b82737c1dcbcf49bea896af52bd 100644 (file)
@@ -25,6 +25,7 @@
 #include "client.h"
 #include "ircd.h"
 #include "ircd_alloc.h"
+#include "ircd_events.h"
 #include "ircd_reply.h"
 #include "ircd_string.h"
 #include "listener.h"
@@ -140,6 +141,7 @@ static struct Connection* alloc_connection(void)
 #endif
 
   memset(con, 0, sizeof(struct Connection));
+  timer_init(&(con_proc(con)));
 
   return con;
 }
@@ -147,6 +149,8 @@ static struct Connection* alloc_connection(void)
 static void dealloc_connection(struct Connection* con)
 {
   assert(con_verify(con));
+  assert(!t_active(&(con_proc(con))));
+  assert(!t_onqueue(&(con_proc(con))));
 
   Debug((DEBUG_LIST, "Deallocating connection %p", con));
 
@@ -244,6 +248,9 @@ void free_client(struct Client* cptr)
    */
   assert(cli_verify(cptr));
   assert(cli_hnext(cptr) == cptr);
+  /* or from linked list? */
+  assert(cli_next(cptr) == 0);
+  assert(cli_prev(cptr) == 0);
 
   Debug((DEBUG_LIST, "Freeing client %s [%p], connection %p", cli_name(cptr),
         cptr, cli_connect(cptr)));
@@ -251,6 +258,10 @@ void free_client(struct Client* cptr)
   if (cli_auth(cptr))
     destroy_auth_request(cli_auth(cptr), 0);
 
+  /* Make sure we didn't magically get re-added to the list */
+  assert(cli_next(cptr) == 0);
+  assert(cli_prev(cptr) == 0);
+
   if (cli_from(cptr) == cptr) { /* in other words, we're local */
     cli_from(cptr) = 0;
     /* timer must be marked as not active */
@@ -299,6 +310,8 @@ void remove_client_from_list(struct Client *cptr)
 {
   assert(cli_verify(cptr));
   assert(con_verify(cli_connect(cptr)));
+  assert(!cli_prev(cptr) || cli_verify(cli_prev(cptr)));
+  assert(!cli_next(cptr) || cli_verify(cli_next(cptr)));
 
   if (cli_prev(cptr))
     cli_next(cli_prev(cptr)) = cli_next(cptr);
@@ -346,6 +359,9 @@ void remove_client_from_list(struct Client *cptr)
 void add_client_to_list(struct Client *cptr)
 {
   assert(cli_verify(cptr));
+  assert(cli_next(cptr) == 0);
+  assert(cli_prev(cptr) == 0);
+
   /*
    * Since we always insert new clients to the top of the list,
    * this should mean the "me" is the bottom most item in the list.
@@ -358,6 +374,36 @@ void add_client_to_list(struct Client *cptr)
     cli_prev(cli_next(cptr)) = cptr;
 }
 
+#if 0
+/* WARNING: Major CPU sink!
+ *
+ * This is a debugging routine meant to verify the integrity of the client
+ * linked list.  It is meant to be comprehensive, to detect *any* corruption
+ * of that list.  This means that it will be majorly CPU-intensive, and
+ * should *only* be enabled on servers that have DEBUGMODE enabled.  Ignore
+ * this warning at your peril!
+ */
+void verify_client_list(void)
+{
+  struct Client *client, *prev = 0, *sentinel = 0;
+  extern unsigned int ircrandom(void);
+
+  for (client = GlobalClientList; client; client = cli_next(client)) {
+    /* Verify that this is a valid client, not a free'd one */
+    assert(cli_verify(client));
+    /* Verify that the list hasn't suddenly jumped around */
+    assert(cli_prev(client) == prev);
+    /* Verify that the list hasn't become circular */
+    assert(cli_next(client) != GlobalClientList);
+    assert(!sentinel || client != sentinel);
+
+    prev = client; /* Remember what should preceed us */
+    if (!(ircrandom() % 50)) /* probabilistic loop detector */
+      sentinel = client;
+  }
+}
+#endif /* DEBUGMODE */
+
 /*
  * Look for ptr in the linked listed pointed to by link.
  */
index e0f92134e24de548c739195ee94a88a9023cb564..6959ff73acb05d1264bccdb069ab7fae6e055347 100644 (file)
@@ -428,7 +428,7 @@ static void accept_connection(struct Event* ev)
   if (ev_type(ev) == ET_DESTROY) /* being destroyed */
     free_listener(listener);
   else {
-    assert(ev_type(ev) == ET_ACCEPT);
+    assert(ev_type(ev) == ET_ACCEPT || ev_type(ev) == ET_ERROR);
 
     listener->last_accept = CurrentTime;
     /*
diff --git a/ircd/m_account.c b/ircd/m_account.c
new file mode 100644 (file)
index 0000000..f5615e5
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * IRC - Internet Relay Chat, ircd/m_account.c
+ * Copyright (C) 2002 Kevin L. Mitchell <klmitch@mit.edu>
+ *
+ * See file AUTHORS in IRC package for additional names of
+ * the programmers.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 1, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ */
+
+/*
+ * m_functions execute protocol messages on this server:
+ *
+ *    cptr    is always NON-NULL, pointing to a *LOCAL* client
+ *            structure (with an open socket connected!). This
+ *            identifies the physical socket where the message
+ *            originated (or which caused the m_function to be
+ *            executed--some m_functions may call others...).
+ *
+ *    sptr    is the source of the message, defined by the
+ *            prefix part of the message if present. If not
+ *            or prefix not found, then sptr==cptr.
+ *
+ *            (!IsServer(cptr)) => (cptr == sptr), because
+ *            prefixes are taken *only* from servers...
+ *
+ *            (IsServer(cptr))
+ *                    (sptr == cptr) => the message didn't
+ *                    have the prefix.
+ *
+ *                    (sptr != cptr && IsServer(sptr) means
+ *                    the prefix specified servername. (?)
+ *
+ *                    (sptr != cptr && !IsServer(sptr) means
+ *                    that message originated from a remote
+ *                    user (not local).
+ *
+ *            combining
+ *
+ *            (!IsServer(sptr)) means that, sptr can safely
+ *            taken as defining the target structure of the
+ *            message in this server.
+ *
+ *    *Always* true (if 'parse' and others are working correct):
+ *
+ *    1)      sptr->from == cptr  (note: cptr->from == cptr)
+ *
+ *    2)      MyConnect(sptr) <=> sptr == cptr (e.g. sptr
+ *            *cannot* be a local connection, unless it's
+ *            actually cptr!). [MyConnect(x) should probably
+ *            be defined as (x == x->from) --msa ]
+ *
+ *    parc    number of variable parameter strings (if zero,
+ *            parv is allowed to be NULL)
+ *
+ *    parv    a NULL terminated list of parameter pointers,
+ *
+ *                    parv[0], sender (prefix string), if not present
+ *                            this points to an empty string.
+ *                    parv[1]...parv[parc-1]
+ *                            pointers to additional parameters
+ *                    parv[parc] == NULL, *always*
+ *
+ *            note:   it is guaranteed that parv[0]..parv[parc-1] are all
+ *                    non-NULL pointers.
+ */
+#include "config.h"
+
+#include "client.h"
+#include "ircd.h"
+#include "ircd_reply.h"
+#include "ircd_string.h"
+#include "msg.h"
+#include "numnicks.h"
+#include "s_user.h"
+#include "send.h"
+
+#include <assert.h>
+
+/*
+ * ms_account - server message handler
+ *
+ * parv[0] = sender prefix
+ * parv[1] = numeric of client to act on
+ * parv[2] = account name (12 characters or less)
+ */
+int ms_account(struct Client* cptr, struct Client* sptr, int parc,
+              char* parv[])
+{
+  struct Client *acptr;
+
+  if (parc < 3)
+    return need_more_params(sptr, "ACCOUNT");
+
+  if (!IsServer(sptr))
+    return protocol_violation(cptr, "ACCOUNT from non-server %s",
+                             cli_name(sptr));
+
+  if (!(acptr = findNUser(parv[1])))
+    return 0; /* Ignore ACCOUNT for a user that QUIT; probably crossed */
+
+  if (IsAccount(acptr))
+    return protocol_violation(cptr, "ACCOUNT for already registered user %s "
+                             "(%s -> %s)", cli_name(acptr),
+                             cli_user(acptr)->account, parv[2]);
+
+  assert(0 == cli_user(acptr)->account[0]);
+
+  ircd_strncpy(cli_user(acptr)->account, parv[2], ACCOUNTLEN);
+  hide_hostmask(acptr, FLAGS_ACCOUNT);
+
+  sendcmdto_serv_butone(sptr, CMD_ACCOUNT, cptr, "%C %s", acptr,
+                       cli_user(acptr)->account);
+
+  return 0;
+}
index 3fed22caaee28fb18fe83022f4f6baccbe493cfa..b918f3b674441741dadb15615b17df8bbaf849d9 100644 (file)
@@ -118,6 +118,23 @@ int m_admin(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   assert(0 != cptr);
   assert(cptr == sptr);
 
+  if (parc > 1)
+    return send_reply(sptr, ERR_NOPRIVILEGES);
+
+  return send_admin_info(sptr);
+}
+
+/*
+ * mo_admin - oper message handler
+ *
+ * parv[0] = sender prefix
+ * parv[1] = servername
+ */
+int mo_admin(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
+{
+  assert(0 != cptr);
+  assert(cptr == sptr);
+
   if (parc > 1) {
     struct Client *acptr;
     acptr = FindUser(parv[1]);
index 642ea94eca844c0e778cf83295fe46404fe99878..a321f9bb21078513cf65f8e33bfdd47214d5bf6b 100644 (file)
@@ -124,9 +124,9 @@ static int user_set_away(struct User* user, char* message)
      */
     unsigned int len = strlen(message);
 
-    if (len > TOPICLEN) {
-      message[TOPICLEN] = '\0';
-      len = TOPICLEN;
+    if (len > AWAYLEN) {
+      message[AWAYLEN] = '\0';
+      len = AWAYLEN;
     }
     if (away)
       away = (char*) MyRealloc(away, len + 1);
index ecde2f46c3eaed8d8983b8da58dbcede0a79f170..8b84667083f49c3d8f07201c0bbfa39bab518c04 100644 (file)
@@ -309,7 +309,7 @@ int ms_burst(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
          }
 
          add_user_to_channel(chptr, acptr, default_mode);
-         sendcmdto_channel_butserv(acptr, CMD_JOIN, chptr, "%H", chptr);
+         sendcmdto_channel_butserv_butone(acptr, CMD_JOIN, chptr, NULL, "%H", chptr);
        }
       }
       param++;
index cbd961f88ce6629e0b81b649d0e71776c12e6055..9005bed9881999e95ec1a469d47f034f3a615699 100644 (file)
@@ -122,6 +122,7 @@ do_clearmode(struct Client *cptr, struct Client *sptr, struct Channel *chptr,
     MODE_KEY,          'k',
     MODE_BAN,          'b',
     MODE_LIMIT,                'l',
+    MODE_REGONLY,      'r',
     0x0, 0x0
   };
   int *flag_p;
index 1951dd775f77d2fa5f253e775d61b95f709fafe3..51c848e6e4aad693ddea4f635a4b1e3f5ca4c45e 100644 (file)
@@ -145,7 +145,7 @@ int m_kick(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
     sendcmdto_serv_butone(sptr, CMD_KICK, cptr, "%H %C :%s", chptr, who,
                          comment);
 
-  sendcmdto_channel_butserv(sptr, CMD_KICK, chptr, "%H %C :%s", chptr, who,
+  sendcmdto_channel_butserv_butone(sptr, CMD_KICK, chptr, NULL, "%H %C :%s", chptr, who,
                            comment);
 
   make_zombie(member, who, cptr, sptr, chptr);
@@ -224,7 +224,7 @@ int ms_kick(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
                          comment);
 
     if (member) { /* and tell the channel about it */
-      sendcmdto_channel_butserv(sptr, CMD_KICK, chptr, "%H %C :%s", chptr, who,
+      sendcmdto_channel_butserv_butone(sptr, CMD_KICK, chptr, NULL, "%H %C :%s", chptr, who,
                                comment);
 
       make_zombie(member, who, cptr, sptr, chptr);
index f2b2f00554367953290b3de7fd54edf561cc5c70..f32ea255a328c27b72d799563a9590ff59c5caa9 100644 (file)
@@ -124,7 +124,7 @@ m_mode(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
 
     *modebuf = *parabuf = '\0';
     modebuf[1] = '\0';
-    channel_modes(sptr, modebuf, parabuf, chptr);
+    channel_modes(sptr, modebuf, parabuf, sizeof(parabuf), chptr);
     send_reply(sptr, RPL_CHANNELMODEIS, chptr->chname, modebuf, parabuf);
     send_reply(sptr, RPL_CREATIONTIME, chptr->chname, chptr->creationtime);
     return 0;
index 38d47e29d5c74ae74bc63cb65557b3cc9a7a20d1..9ca6786325ede6f5147beaccb3f1317579cd80c4 100644 (file)
@@ -83,6 +83,7 @@
 
 #include "channel.h"
 #include "client.h"
+#include "ircd.h"
 #include "ircd_string.h"
 #include "struct.h"
 #include "s_misc.h"
  */
 int m_quit(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
 {
-  char comment[TOPICLEN];
   assert(0 != cptr);
   assert(0 != sptr);
   assert(cptr == sptr);
@@ -111,16 +111,10 @@ int m_quit(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
         return exit_client(cptr, sptr, sptr, "Signed off");
     }
   }
-
-  if (parc > 1) {
-    strcpy(comment,"Quit: ");
-    strncat(comment,parv[parc-1],sizeof(comment)-strlen("Quit: "));
-    comment[sizeof(comment)] = '\0';
-  }
-  else {
-    strncpy(comment,cli_name(cptr),sizeof(comment));
-  }
-  return exit_client(cptr, sptr, sptr, comment);
+  if (parc > 1 && !BadPtr(parv[parc - 1]))
+    return exit_client_msg(cptr, sptr, sptr, "Quit: %s", parv[parc - 1]);
+  else
+    return exit_client(cptr, sptr, sptr, "Quit");
 }
 
 
index 67d541bff1d15fc31b3ed57bbd4200434f068c54..b71d28e1b7d61aa2a7809d1caaa431880634b5b7 100644 (file)
@@ -71,10 +71,10 @@ int ms_squit(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   if (BadPtr(parv[parc - 1]))
        comment = cli_name(sptr);
        
-  acptr = FindNServer(server);
+  acptr = FindServer(server);
 
   if (!acptr)
-    acptr = FindServer(server);
+    acptr = FindNServer(server);
 
   if (!acptr) {
     protocol_violation(sptr, "Issued SQUIT for unknown server %s (ignored)",
@@ -85,8 +85,7 @@ int ms_squit(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   
   /* If they are squitting me, we reverse it */
   if (IsMe(acptr)) {
-       cptr = acptr;
-       acptr = &me;
+    acptr = cptr; /* Bugfix by Prefect */
   }
        
   timestamp = atoi(parv[2]);
index e4c9e939e4bcb49deab26cce57034cf6f2bb77df..a6cda1563501caebed7a8b6629eb4ce28c4bbf7b 100644 (file)
@@ -362,7 +362,7 @@ int m_stats(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
 #ifdef HEAD_IN_SAND_STATS_M
       return m_not_oper(sptr,cptr,parc,parv);
 #else
-#if !defined(NDEBUG)
+#if defined(MDEBUG)
       send_reply(sptr, RPL_STATMEMTOT, fda_get_byte_count(),
                  fda_get_block_count());
 #endif
@@ -667,7 +667,7 @@ int ms_stats(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
       break;
     }
     case 'M':
-#if !defined(NDEBUG)
+#if defined(MDEBUG)
       send_reply(sptr, RPL_STATMEMTOT, fda_get_byte_count(),
                  fda_get_block_count());
 #endif
@@ -887,7 +887,7 @@ int mo_stats(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
       }
       break;
     case 'M':
-#if !defined(NDEBUG)
+#if defined(MDEBUG)
       send_reply(sptr, RPL_STATMEMTOT, fda_get_byte_count(),
                  fda_get_block_count());
 #endif
index 950e0f472a3d18e6a026a76a11e5510da27d070a..b8cfc82822d0616b4af43318a33c5de8b28a0842 100644 (file)
@@ -118,8 +118,8 @@ static void do_settopic(struct Client *sptr, struct Client *cptr,
      sendcmdto_serv_butone(sptr, CMD_TOPIC, cptr, "%H :%s", chptr,
                           chptr->topic);
    if (newtopic)
-      sendcmdto_channel_butserv(sptr, CMD_TOPIC, chptr, "%H :%s", chptr,
-                                 chptr->topic);
+      sendcmdto_channel_butserv_butone(sptr, CMD_TOPIC, chptr, NULL,
+                                      "%H :%s", chptr, chptr->topic);
       /* if this is the same topic as before we send it to the person that
        * set it (so they knew it went through ok), but don't bother sending
        * it to everyone else on the channel to save bandwidth
index 0f66e7b8fd43d47f934b30cef9220b1d2e23a364..a42cbcc48acf53f1c2888e4f47d9b8fc2ef3d30a 100644 (file)
@@ -97,6 +97,7 @@ static void userip_formatter(struct Client* cptr, struct MsgBuf* mb)
   msgq_append(0, mb, "%s%s=%c%s@%s", cli_name(cptr),
              HasPriv(cptr, PRIV_DISPLAY) ? "*" : "",
              cli_user(cptr)->away ? '-' : '+', cli_user(cptr)->username,
+             HasHiddenHost(cptr) ? "127.0.0.1" :
              ircd_ntoa((const char*) &(cli_ip(cptr))));
 }
 
index 105b0f73bb1636dc221eec3d445fb0bd59716ec6..31dd236d9875649e2a4752d30b40be3cc52fb02f 100644 (file)
  *   parv[1] = remote server
  */
 int m_version(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
+{
+
+  if (parc > 1)
+    send_reply(sptr, ERR_NOPRIVILEGES);
+  else
+    send_reply(sptr, RPL_VERSION, version, debugmode, cli_name(&me),
+              debug_serveropts());
+
+  return 0;
+}
+
+/*
+ * mo_version - generic message handler
+ *
+ *   parv[0] = sender prefix
+ *   parv[1] = remote server
+ */
+int mo_version(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
 {
   struct Client *acptr;
 
index 052e562b11234592f56c75cf7cf8c7874f4ff499..06226678197bbcc99a45d0af756595f1287cfd0a 100644 (file)
@@ -97,7 +97,6 @@
 #include "support.h"
 #include "whocmds.h"
 
-
 #include <assert.h>
 #include <string.h>
 
@@ -395,6 +394,10 @@ int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
               || (!(cli_flags(cli_user(acptr)->server) & FLAGS_MAP)))
               && ((!(matchsel & WHO_FIELD_HOS))
               || matchexec(cli_user(acptr)->host, mymask, minlen))
+              && ((!(matchsel & WHO_FIELD_HOS))
+             || !HasHiddenHost(acptr)
+             || !IsAnOper(sptr)
+              || matchexec(cli_user(acptr)->realhost, mymask, minlen))
               && ((!(matchsel & WHO_FIELD_REN))
               || matchexec(cli_info(acptr), mymask, minlen))
               && ((!(matchsel & WHO_FIELD_NIP))
@@ -430,6 +433,10 @@ int m_who(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
             || (!(cli_flags(cli_user(acptr)->server) & FLAGS_MAP)))
             && ((!(matchsel & WHO_FIELD_HOS))
             || matchexec(cli_user(acptr)->host, mymask, minlen))
+            && ((!(matchsel & WHO_FIELD_HOS))
+           || !HasHiddenHost(acptr)
+           || !IsAnOper(sptr)
+            || matchexec(cli_user(acptr)->realhost, mymask, minlen))
             && ((!(matchsel & WHO_FIELD_REN))
             || matchexec(cli_info(acptr), mymask, minlen))
             && ((!(matchsel & WHO_FIELD_NIP))
index 20835b5d25e3687e6ece96989fd9bb1be4089a56..79a7205deb9865f2af543bcea53ba7c32badce0a 100644 (file)
@@ -200,6 +200,13 @@ static void do_whois(struct Client* sptr, struct Client *acptr, int parc)
     if (IsAnOper(acptr) && (HasPriv(acptr, PRIV_DISPLAY) ||
                            HasPriv(sptr, PRIV_SEE_OPERS)))
        send_reply(sptr, RPL_WHOISOPERATOR, name);
+
+    if (IsAccount(acptr))
+      send_reply(sptr, RPL_WHOISACCOUNT, name, user->account);
+
+    if (HasHiddenHost(acptr) && IsAnOper(sptr))
+      send_reply(sptr, RPL_WHOISACTUALLY, name, user->username,
+        user->realhost, ircd_ntoa((const char*) &(cli_ip(acptr))));
    
     /* Hint: if your looking to add more flags to a user, eg +h, here's
      *       probably a good place to add them :)
index 2d8e9d1fad116588deaffbf34122c4271cdbaed9..adcaaeac2352a868e26ccfd072b964eea5381dff 100644 (file)
@@ -136,11 +136,12 @@ int m_whowas(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
       if (0 == ircd_strcmp(nick, temp->name))
       {
        send_reply(sptr, RPL_WHOWASUSER, temp->name, temp->username,
+                  (IsAnOper(sptr) && temp->realhost) ? temp->realhost :
                   temp->hostname, temp->realname);
 #ifdef HEAD_IN_SAND_WHOIS_SERVERNAME
        if (!IsOper(sptr))
-         send_reply(sptr, RPL_WHOISSERVER, temp->name, "*.undernet.org",
-                    myctime(temp->logoff));
+         send_reply(sptr, RPL_WHOISSERVER, temp->name,
+                    HEAD_IN_SAND_SERVERNAME, myctime(temp->logoff));
        else
 #endif
          send_reply(sptr, RPL_WHOISSERVER, temp->name, temp->servername,
index 262e2eaa0a72351a0a04f938f8e2d727fa86673b..468a1511728fab89906bab88e5b3511888e5ef25 100644 (file)
@@ -288,6 +288,7 @@ void
 motd_signon(struct Client* cptr)
 {
   struct MotdCache *cache;
+  const char *banner = NULL;
 
   cache = motd_cache(motd_lookup(cptr));
 
@@ -295,6 +296,8 @@ motd_signon(struct Client* cptr)
     motd_forward(cptr, cache);
   else {
     send_reply(cptr, RPL_MOTDSTART, cli_name(&me));
+    if ((banner = feature_str(FEAT_MOTD_BANNER)))
+      send_reply(cptr, SND_EXPLICIT | RPL_MOTD, ":%s", banner);
     send_reply(cptr, SND_EXPLICIT | RPL_MOTD, ":\002Type /MOTD to read the "
               "AUP before continuing using this service.\002");
     send_reply(cptr, SND_EXPLICIT | RPL_MOTD, ":The message of the day was "
index 59951d154beb0a4539b8c0184679c85f5febc8b2..9e19f8f425279f5e80fe4d825e94b24da41750e9 100644 (file)
@@ -266,7 +266,7 @@ struct Message msgtab[] = {
     TOK_WHOIS,
     0, MAXPARA, MFLG_SLOW, 0,
     /* UNREG, CLIENT, SERVER, OPER, SERVICE */
-    { m_unregistered, m_whois, m_whois, m_whois, m_ignore }
+    { m_unregistered, m_whois, ms_whois, m_whois, m_ignore }
   },
   {
     MSG_WHO,
@@ -393,7 +393,7 @@ struct Message msgtab[] = {
     TOK_VERSION,
     0, MAXPARA, MFLG_SLOW | MFLG_UNREG, 0,
     /* UNREG, CLIENT, SERVER, OPER, SERVICE */
-    { m_version, m_version, ms_version, m_version, m_ignore }
+    { m_version, m_version, ms_version, mo_version, m_ignore }
   },
   {
     MSG_STATS,
@@ -418,7 +418,7 @@ struct Message msgtab[] = {
     TOK_ADMIN,
     0, MAXPARA, MFLG_SLOW | MFLG_UNREG, 0,
     /* UNREG, CLIENT, SERVER, OPER, SERVICE */
-    { m_admin, m_admin, ms_admin, m_admin, m_ignore }
+    { m_admin, m_admin, ms_admin, mo_admin, m_ignore }
   },
   {
     MSG_HELP,
@@ -574,6 +574,13 @@ struct Message msgtab[] = {
     /* UNREG, CLIENT, SERVER, OPER, SERVICE */
     { m_unregistered, m_not_oper, m_ignore, mo_privs, m_ignore }
   },
+  {
+    MSG_ACCOUNT,
+    TOK_ACCOUNT,
+    0, MAXPARA, MFLG_SLOW, 0,
+    /* UNREG, CLIENT, SERVER, OPER, SERVICE */
+    { m_ignore, m_ignore, ms_account, m_ignore, m_ignore }
+  },
   /* This command is an alias for QUIT during the unregistered part of
    * of the server.  This is because someone jumping via a broken web
    * proxy will send a 'POST' as their first command - which we will
@@ -586,9 +593,9 @@ struct Message msgtab[] = {
     0, MAXPARA, MFLG_SLOW, 0,
     /* UNREG, CLIENT, SERVER, OPER, SERVICE */
     { m_quit, m_ignore, m_ignore, m_ignore, m_ignore }
-  },  
+  },
   { 0 }
-}; 
+};
 
 
 static char *para[MAXPARA + 2]; /* leave room for prefix and null */
@@ -716,7 +723,7 @@ static struct Message *do_msg_tree_cmd(struct MessageTree *mtree, char *prefix,
     }
     return mptr;
   }
-  /* 
+  /*
    * This should never happen
    */
   assert(0);
@@ -745,7 +752,7 @@ void initmsgtree(void)
   int ii;
   struct Message **msgtab_tok;
   struct Message **msgtok;
-  
+
   for (i = 0; msg->cmd; ++i, ++msg)
     continue;
   qsort(msgtab, i, sizeof(struct Message),
@@ -1034,7 +1041,7 @@ int parse_server(struct Client *cptr, char *buffer, char *bufend)
     }
     else if (' ' == ch[1] || ' ' == ch[2])
       from = FindNServer(numeric_prefix);
-    else 
+    else
       from = findNUser(numeric_prefix);
 
     do
index 3af11a558605f6e547f0054e1145214bbf0f84ab..d4d85fd848c1c021646ebeb33a00bc09864ad88d 100644 (file)
@@ -308,7 +308,7 @@ res_ourserver(const struct __res_state* statp, const struct sockaddr_in* inp)
 /* Socket callback for resolver */
 static void res_callback(struct Event* ev)
 {
-  assert(ev_type(ev) == ET_READ);
+  assert(ev_type(ev) == ET_READ || ev_type(ev) == ET_ERROR);
 
   resolver_read();
 }
@@ -399,8 +399,10 @@ int init_resolver(void)
   requestListHead = requestListTail = 0;
 
   /* initiate the resolver timers */
-  timer_add(&resExpireDNS, expire_DNS_callback, 0, TT_RELATIVE, 1);
-  timer_add(&resExpireCache, expire_cache_callback, 0, TT_RELATIVE, 1);
+  timer_add(timer_init(&resExpireDNS), expire_DNS_callback, 0,
+           TT_RELATIVE, 1);
+  timer_add(timer_init(&resExpireCache), expire_cache_callback, 0,
+           TT_RELATIVE, 1);
 
   errno = h_errno = 0;
 
@@ -804,8 +806,10 @@ static int proc_answer(struct ResRequest* request, HEADER* header,
   u_char* current;             /* current position in buf */
   char** alias;                /* alias list */
   char** addr;                 /* address list */
+  char** base_addr;            /* original pointer to address list */
   char*  name;                 /* pointer to name string */
   char*  address;              /* pointer to address */
+  char*  base_address;         /* original pointer to address */
   char*  endp;                 /* end of our buffer */
   int    query_class;          /* answer class */
   int    type;                 /* answer type */
@@ -814,6 +818,7 @@ static int proc_answer(struct ResRequest* request, HEADER* header,
   int    n;                    /* temp count */
   int    addr_count  = 0;      /* number of addresses in hostent */
   int    alias_count = 0;      /* number of aliases in hostent */
+  int    t_ptr_seen = 0;       /* Seen a T_PTR in proc_answer? */
   struct hostent* hp;          /* hostent getting filled */
 
   assert(0 != request);
@@ -854,11 +859,14 @@ static int proc_answer(struct ResRequest* request, HEADER* header,
     ++addr;
     ++addr_count;
   }
+  base_addr = addr;
   /*
    * make address point to first available address slot
    */
   address = request->he.buf + ADDRS_OFFSET +
                     (sizeof(struct in_addr) * addr_count);
+  base_address = address;
+
   /*
    * find the end of the alias list
    */
@@ -928,7 +936,10 @@ static int proc_answer(struct ResRequest* request, HEADER* header,
     case T_A:
       /*
        * check for invalid rd_length or too many addresses
+       * ignore T_A relies if looking for a T_PTR
        */
+      if (t_ptr_seen)
+       return answer_count;
       if (rd_length != sizeof(struct in_addr))
         return answer_count;
       if (++addr_count < RES_MAXADDRS) {
@@ -952,6 +963,11 @@ static int proc_answer(struct ResRequest* request, HEADER* header,
       ++answer_count;
       break;
     case T_PTR:
+      t_ptr_seen = 1;
+      addr_count = 0;
+      addr = base_addr;
+      *addr = 0;
+      address = base_address;
       n = dn_expand(buf, eob, current, hostbuf, sizeof(hostbuf));
       if (n < 0) {
         /*
@@ -1597,7 +1613,7 @@ static struct CacheEntry* make_cache(struct ResRequest* request)
    * shouldn't happen but it just might...
    */
   assert(0 != hp->h_name);
-  assert(0 != hp->h_addr_list[0]);
+/*    assert(0 != hp->h_addr_list[0]); */
   if (!hp->h_name || !hp->h_addr_list[0])
     return NULL;
   /*
index 6ad278a87e35082cbe675434dbd573d4109b726c..17dce053b1627e5e382ae52aeb4f53f755bf6c24 100644 (file)
@@ -206,11 +206,12 @@ void destroy_auth_request(struct AuthRequest* auth, int send_reports)
       sendheader(auth->client, REPORT_FAIL_DNS);
   }
 
-  if (send_reports)
+  if (send_reports) {
     log_write(LS_RESOLVER, L_INFO, 0, "DNS/AUTH timeout %s",
              get_client_name(auth->client, HIDE_IP));
+    release_auth_client(auth->client);
+  }
 
-  release_auth_client(auth->client);
   unlink_auth_request(auth, authList);
   free_auth_request(auth);
 }
@@ -228,8 +229,8 @@ static struct AuthRequest* make_auth_request(struct Client* client)
   auth->fd      = -1;
   auth->client  = client;
   cli_auth(client) = auth;
-  timer_add(&auth->timeout, auth_timeout_callback, (void*) auth, TT_RELATIVE,
-           AUTH_TIMEOUT);
+  timer_add(timer_init(&auth->timeout), auth_timeout_callback, (void*) auth,
+           TT_RELATIVE, AUTH_TIMEOUT);
   return auth;
 }
 
@@ -304,6 +305,7 @@ static void auth_kill_client(struct AuthRequest* auth)
     delete_resolver_queries(auth);
   IPcheck_disconnect(auth->client);
   Count_unknowndisconnects(UserStats);
+  cli_auth(auth->client) = 0;
   free_client(auth->client);
   free_auth_request(auth);
 }
@@ -675,7 +677,7 @@ void read_auth_reply(struct AuthRequest* auth)
 
   assert(0 != auth);
   assert(0 != auth->client);
-  assert(auth = cli_auth(auth->client));
+  assert(auth == cli_auth(auth->client));
 
   if (IO_SUCCESS == os_recv_nonb(auth->fd, buf, BUFSIZE, &len)) {
     buf[len] = '\0';
index 5e78031256a5159ab33db4ffd58997a5b793cb0d..e379e61fb2e800b254ba151e0771139b501abdf3 100644 (file)
@@ -773,7 +773,7 @@ static int read_packet(struct Client *cptr, int socket_ready)
 
     /* If there's still data to process, wait 2 seconds first */
     if (DBufLength(&(cli_recvQ(cptr))) && !NoNewLine(cptr) &&
-       !(cli_freeflag(cptr) & FREEFLAG_TIMER)) {
+       !t_onqueue(&(cli_proc(cptr)))) {
       Debug((DEBUG_LIST, "Adding client process timer for %C", cptr));
       cli_freeflag(cptr) |= FREEFLAG_TIMER;
       timer_add(&(cli_proc(cptr)), client_timer_callback, cli_connect(cptr),
@@ -1066,9 +1066,9 @@ static void client_timer_callback(struct Event* ev)
 
   assert(0 == cptr || con == cli_connect(cptr));
 
-  con_freeflag(con) &= ~FREEFLAG_TIMER; /* timer has expired... */
-
   if (ev_type(ev)== ET_DESTROY) {
+    con_freeflag(con) &= ~FREEFLAG_TIMER; /* timer has expired... */
+
     if (!con_freeflag(con) && !cptr)
       free_connection(con); /* client is being destroyed */
   } else {
index 276d4265b80d73654a9e093e2581b8febafe3c99..4a1cbb096ac8b1826cd639f9f047ee001fbe381f 100644 (file)
@@ -1312,6 +1312,7 @@ int rehash(struct Client *cptr, int sig)
     else
       tmp = &tmp2->next;
   }
+
   for (i = 0; i <= HighestFd; i++) {
     if ((acptr = LocalClientArray[i])) {
       assert(!IsMe(acptr));
@@ -1337,6 +1338,7 @@ int rehash(struct Client *cptr, int sig)
       }
     }
   }
+
   return ret;
 }
 
index dca9205def79ba1615c22485f0c40e31eb47c587..c45a5325917a1fb9bf532641859b7cd91192599b 100644 (file)
@@ -82,8 +82,8 @@ const char* debug_serveropts(void)
     AddC((char)('0' + (bp / 1000000) % 10));
   }
 
-#ifdef  CHROOTDIR
-  AddC('c');
+#ifndef NDEBUG
+  AddC('A');
 #endif
 #ifdef  DEBUGMODE
   AddC('D');
@@ -381,7 +381,7 @@ void count_memory(struct Client *cptr, char *nick)
       dbufs_allocated + msg_allocated + msgbuf_allocated + rm;
   tot += sizeof(void *) * HASHSIZE * 3;
 
-#if !defined(NDEBUG)
+#if defined(MDEBUG)
   send_reply(cptr, SND_EXPLICIT | RPL_STATSDEBUG, ":Allocations: %zu(%zu)",
             fda_get_block_count(), fda_get_byte_count());
 #endif
index a08fbd39f42c29b77e2c9394d6911520416f5216..0fdcc6cbe9da25bd1d1ab7c36008e83e002055ef 100644 (file)
@@ -36,7 +36,7 @@ static Numeric replyTable[] = {
 /* 003 */
   { RPL_CREATED, ":This server was created %s", "003" },
 /* 004 */
-  { RPL_MYINFO, "%s %s dioswkg biklmnopstv bklov", "004" },
+  { RPL_MYINFO, "%s %s dioswkgx biklmnopstvr bklov", "004" },
 /* 005 */
   { RPL_ISUPPORT, "%s :are supported by this server", "005" },
 /* 006 */
@@ -646,7 +646,7 @@ static Numeric replyTable[] = {
 /* 306 */
   { RPL_NOWAWAY, ":You have been marked as being away", "306" },
 /* 307 */
-  { RPL_USERIP, ":", "307" },
+  { 0 },
 /* 308 */
   { 0 },
 /* 309 */
@@ -692,7 +692,7 @@ static Numeric replyTable[] = {
 /* 329 */
   { RPL_CREATIONTIME, "%s %Tu", "329" },
 /* 330 */
-  { 0 },
+  { RPL_WHOISACCOUNT, "%s %s :is logged in as", "330" },
 /* 331 */
   { RPL_NOTOPIC, "%s :No topic is set.", "331" },
 /* 332 */
@@ -708,11 +708,11 @@ static Numeric replyTable[] = {
 /* 337 */
   { 0 },
 /* 338 */
-  { 0 },
+  { RPL_WHOISACTUALLY, ":%s is actually %s@%s [%s]", "338" },
 /* 339 */
   { 0 },
 /* 340 */
-  { 0 },
+  { RPL_USERIP, ":", "340" },
 /* 341 */
   { RPL_INVITING, "%s %s", "341" },
 /* 342 */
@@ -986,7 +986,7 @@ static Numeric replyTable[] = {
 /* 476 */
   { ERR_BADCHANMASK, "%s :Bad Channel Mask", "476" },
 /* 477 */
-  { 0 },
+  { ERR_NEEDREGGEDNICK, "%s :Cannot join channel (+r)", "477" },
 /* 478 */
   { ERR_BANLISTFULL, "%s %s :Channel ban/ignore list is full", "478" },
 /* 479 */
index 1b1dcad7343b8dd4be0c20511e20c9a56346f0b5..1ea6d8ca701051c102ccf9562bcd05d74059dd9c 100644 (file)
@@ -233,7 +233,7 @@ static void exit_one_client(struct Client* bcptr, const char* comment)
      * that the client can show the "**signoff" message).
      * (Note: The notice is to the local clients *only*)
      */
-    sendcmdto_common_channels(bcptr, CMD_QUIT, ":%s", comment);
+    sendcmdto_common_channels_butone(bcptr, CMD_QUIT, NULL, ":%s", comment);
 
     remove_user_from_all_channels(bcptr);
 
@@ -245,6 +245,10 @@ static void exit_one_client(struct Client* bcptr, const char* comment)
     while ((lp = cli_user(bcptr)->silence))
       del_silence(bcptr, lp->value.cp);
 
+    /* Clean up snotice lists */
+    if (MyUser(bcptr))
+      set_snomask(bcptr, ~0, SNO_DEL);
+
     if (IsInvisible(bcptr))
       --UserStats.inv_clients;
     if (IsOper(bcptr))
index f66cf0d01fa5a995e5596c0681397a3e7a87f04c..5ed58e40239e0bc17b686321eeb45839705798df 100644 (file)
@@ -231,7 +231,7 @@ int server_estab(struct Client *cptr, struct ConfItem *aconf)
       sendcmdto_one(cli_user(acptr)->server, CMD_NICK, cptr,
                    "%s %d %Tu %s %s %s%s%s%s %s%s :%s",
                    cli_name(acptr), cli_hopcount(acptr) + 1, cli_lastnick(acptr),
-                   cli_user(acptr)->username, cli_user(acptr)->host,
+                   cli_user(acptr)->username, cli_user(acptr)->realhost,
                    *s ? "+" : "", s, *s ? " " : "",
                    inttobase64(xxx_buf, ntohl(cli_ip(acptr).s_addr), 6),
                    NumNick(acptr), cli_info(acptr));
index 690e150a218e50c7f4c149666be531e3a5cb0357..82709b3e5a5fab4972d3a6a490996f11dab684ab 100644 (file)
@@ -442,6 +442,7 @@ int register_user(struct Client *cptr, struct Client *sptr,
         return exit_client(cptr, sptr, &me, "Unknown error -- Try again");
     }
     ircd_strncpy(user->host, cli_sockhost(sptr), HOSTLEN);
+    ircd_strncpy(user->realhost, cli_sockhost(sptr), HOSTLEN);
     aconf = cli_confs(sptr)->value.aconf;
 
     clean_user_id(user->username,
@@ -621,7 +622,7 @@ int register_user(struct Client *cptr, struct Client *sptr,
   sendcmdto_serv_butone(user->server, CMD_NICK, cptr,
                        "%s %d %Tu %s %s %s%s%s%s %s%s :%s",
                        nick, cli_hopcount(sptr) + 1, cli_lastnick(sptr),
-                       user->username, user->host,
+                       user->username, user->realhost,
                        *tmpstr ? "+" : "", tmpstr, *tmpstr ? " " : "",
                        inttobase64(ip_base64, ntohl(cli_ip(sptr).s_addr), 6),
                        NumNick(sptr), cli_info(sptr));
@@ -649,7 +650,9 @@ static const struct UserMode {
   { FLAGS_SERVNOTICE,  's' },
   { FLAGS_DEAF,        'd' },
   { FLAGS_CHSERV,      'k' },
-  { FLAGS_DEBUG,       'g' }
+  { FLAGS_DEBUG,       'g' },
+  { FLAGS_ACCOUNT,     'r' },
+  { FLAGS_HIDDENHOST,  'x' }
 };
 
 #define USERMODELIST_SIZE sizeof(userModeList) / sizeof(struct UserMode)
@@ -664,6 +667,7 @@ int set_nick_name(struct Client* cptr, struct Client* sptr,
 {
   if (IsServer(sptr)) {
     int   i;
+    const char* account = 0;
     const char* p;
 
     /*
@@ -679,6 +683,8 @@ int set_nick_name(struct Client* cptr, struct Client* sptr,
         for (i = 0; i < USERMODELIST_SIZE; ++i) {
           if (userModeList[i].c == *p) {
             cli_flags(new_client) |= userModeList[i].flag;
+           if (userModeList[i].flag & FLAGS_ACCOUNT)
+             account = parv[7];
             break;
           }
         }
@@ -703,7 +709,13 @@ int set_nick_name(struct Client* cptr, struct Client* sptr,
     cli_serv(sptr)->ghost = 0;        /* :server NICK means end of net.burst */
     ircd_strncpy(cli_username(new_client), parv[4], USERLEN);
     ircd_strncpy(cli_user(new_client)->host, parv[5], HOSTLEN);
+    ircd_strncpy(cli_user(new_client)->realhost, parv[5], HOSTLEN);
     ircd_strncpy(cli_info(new_client), parv[parc - 1], REALLEN);
+    if (account)
+      ircd_strncpy(cli_user(new_client)->account, account, ACCOUNTLEN);
+    if (HasHiddenHost(new_client))
+      ircd_snprintf(0, cli_user(new_client)->host, HOSTLEN, "%s.%s",
+        account, feature_str(FEAT_HIDDEN_HOST));
 
     return register_user(cptr, new_client, cli_name(new_client), parv[4]);
   }
@@ -757,7 +769,7 @@ int set_nick_name(struct Client* cptr, struct Client* sptr,
      * on that channel. Propagate notice to other servers.
      */
     if (IsUser(sptr)) {
-      sendcmdto_common_channels(sptr, CMD_NICK, ":%s", nick);
+      sendcmdto_common_channels_butone(sptr, CMD_NICK, NULL, ":%s", nick);
       add_history(sptr, 1);
       sendcmdto_serv_butone(sptr, CMD_NICK, cptr, "%s %Tu", nick,
                             cli_lastnick(sptr));
@@ -1028,6 +1040,51 @@ void send_user_info(struct Client* sptr, char* names, int rpl, InfoFormatter fmt
   msgq_clean(mb);
 }
 
+/*
+ * hide_hostmask()
+ *
+ * If, after setting the flags, the user has both HiddenHost and Account
+ * set, its hostmask is changed.
+ */
+#define FLAGS_HOST_HIDDEN      (FLAGS_ACCOUNT|FLAGS_HIDDENHOST)
+int hide_hostmask(struct Client *cptr, unsigned int flags)
+{
+  struct Membership *chan;
+  int newflags;
+
+  if (MyConnect(cptr) && !feature_bool(FEAT_HOST_HIDING))
+    flags &= ~FLAGS_HIDDENHOST;
+    
+  newflags = cli_flags(cptr) | flags;
+  if ((newflags & FLAGS_HOST_HIDDEN) != FLAGS_HOST_HIDDEN) {
+    /* The user doesn't have both flags, don't change the hostmask */
+    cli_flags(cptr) |= flags;
+    return 0;
+  }
+
+  sendcmdto_common_channels_butone(cptr, CMD_QUIT, cptr, ":Registered");
+  ircd_snprintf(0, cli_user(cptr)->host, HOSTLEN, "%s.%s",
+    cli_user(cptr)->account, feature_str(FEAT_HIDDEN_HOST));
+  cli_flags(cptr) |= flags;
+
+  /*
+   * Go through all channels the client was on, rejoin him
+   * and set the modes, if any
+   */
+  for (chan = cli_user(cptr)->channel; chan; chan = chan->next_channel) {
+    sendcmdto_channel_butserv_butone(cptr, CMD_JOIN, chan->channel, cptr,
+      "%H", chan->channel);
+    if (IsChanOp(chan) && HasVoice(chan)) {
+      sendcmdto_channel_butserv_butone(&me, CMD_MODE, chan->channel, cptr,
+        "%H +ov %C %C", chan->channel, cptr, cptr);
+    } else if (IsChanOp(chan) || HasVoice(chan)) {
+      sendcmdto_channel_butserv_butone(&me, CMD_MODE, chan->channel, cptr,
+        "%H +%c %C", chan->channel, IsChanOp(chan) ? 'o' : 'v', cptr);
+    }
+  }
+  return 0;
+}
+
 
 /*
  * set_user_mode() added 15/10/91 By Darren Reed.
@@ -1048,6 +1105,7 @@ int set_user_mode(struct Client *cptr, struct Client *sptr, int parc, char *parv
   int snomask_given = 0;
   char buf[BUFSIZE];
   int prop = 0;
+  int do_host_hiding = 0;
 
   what = MODE_ADD;
 
@@ -1077,7 +1135,8 @@ int set_user_mode(struct Client *cptr, struct Client *sptr, int parc, char *parv
     m = buf;
     *m++ = '+';
     for (i = 0; i < USERMODELIST_SIZE; ++i) {
-      if ( (userModeList[i].flag & cli_flags(sptr)))
+      if ((userModeList[i].flag & cli_flags(sptr)) &&
+         !(userModeList[i].flag & FLAGS_ACCOUNT))
         *m++ = userModeList[i].c;
     }
     *m = '\0';
@@ -1176,6 +1235,10 @@ int set_user_mode(struct Client *cptr, struct Client *sptr, int parc, char *parv
         else
           ClearDebug(sptr);
         break;
+      case 'x':
+        if (what == MODE_ADD)
+         do_host_hiding = 1;
+       break;
       default:
         break;
       }
@@ -1243,6 +1306,8 @@ int set_user_mode(struct Client *cptr, struct Client *sptr, int parc, char *parv
     --UserStats.inv_clients;
   if (!(setflags & FLAGS_INVISIBLE) && IsInvisible(sptr))
     ++UserStats.inv_clients;
+  if (!(setflags & FLAGS_HIDDENHOST) && do_host_hiding)
+    hide_hostmask(sptr, FLAGS_HIDDENHOST);
   send_umode_out(cptr, sptr, setflags, prop);
 
   return 0;
@@ -1268,6 +1333,15 @@ char *umode_str(struct Client *cptr)
     if ( (c_flags & userModeList[i].flag))
       *m++ = userModeList[i].c;
   }
+
+  if (IsAccount(cptr)) {
+    char* t = cli_user(cptr)->account;
+
+    *m++ = ' ';
+    while ((*m++ = *t++))
+      ; /* Empty loop */
+  }
+
   *m = '\0';
 
   return umodeBuf;                /* Note: static buffer, gets
@@ -1450,6 +1524,7 @@ int is_silenced(struct Client *sptr, struct Client *acptr)
   struct User *user;
   static char sender[HOSTLEN + NICKLEN + USERLEN + 5];
   static char senderip[16 + NICKLEN + USERLEN + 5];
+  static char senderh[HOSTLEN + ACCOUNTLEN + USERLEN + 6];
 
   if (!cli_user(acptr) || !(lp = cli_user(acptr)->silence) || !(user = cli_user(sptr)))
     return 0;
@@ -1457,9 +1532,13 @@ int is_silenced(struct Client *sptr, struct Client *acptr)
                user->username, user->host);
   ircd_snprintf(0, senderip, sizeof(senderip), "%s!%s@%s", cli_name(sptr),
                user->username, ircd_ntoa((const char*) &(cli_ip(sptr))));
+  if (HasHiddenHost(sptr))
+    ircd_snprintf(0, senderh, sizeof(senderh), "%s!%s@%s", cli_name(sptr),
+                 user->username, user->realhost);
   for (; lp; lp = lp->next)
   {
-    if ((!(lp->flags & CHFL_SILENCE_IPMASK) && !match(lp->value.cp, sender)) ||
+    if ((!(lp->flags & CHFL_SILENCE_IPMASK) && (!match(lp->value.cp, sender) ||
+        (HasHiddenHost(sptr) && !match(lp->value.cp, senderh)))) ||
         ((lp->flags & CHFL_SILENCE_IPMASK) && !match(lp->value.cp, senderip)))
     {
       if (!MyConnect(sptr))
index 8f17ee6cfbd5c07c5beb95dd85d18b966393787b..2ba06e4993977d84dd347b159dbe57a833f607e9 100644 (file)
@@ -26,6 +26,7 @@
 #include "class.h"
 #include "client.h"
 #include "ircd.h"
+#include "ircd_policy.h"
 #include "ircd_snprintf.h"
 #include "ircd_string.h"
 #include "list.h"
@@ -215,12 +216,13 @@ void send_buffer(struct Client* to, struct MsgBuf* buf, int prio)
  *  addition -- Armin, 8jun90 (gruner@informatik.tu-muenchen.de)
  */
 
-static int match_it(struct Client *one, const char *mask, int what)
+static int match_it(struct Client *from, struct Client *one, const char *mask, int what)
 {
   switch (what)
   {
     case MATCH_HOST:
-      return (match(mask, cli_user(one)->host) == 0);
+      return (match(mask, cli_user(one)->host) == 0 ||
+        (HasHiddenHost(one) && match(mask, cli_user(one)->realhost) == 0));
     case MATCH_SERVER:
     default:
       return (match(mask, cli_name(cli_user(one)->server)) == 0);
@@ -330,6 +332,8 @@ void sendcmdto_serv_butone(struct Client *from, const char *cmd,
  * Send a (prefix) command originating from <from> to all channels
  * <from> is locally on.  <from> must be a user. <tok> is ignored in
  * this function.
+ *
+ * Update: don't send to 'one', if any. --Vampire
  */
 /* XXX sentalong_marker used XXX
  *
@@ -343,8 +347,9 @@ void sendcmdto_serv_butone(struct Client *from, const char *cmd,
  * message to, and then a final loop through the connected servers
  * to delete the flag. -Kev
  */
-void sendcmdto_common_channels(struct Client *from, const char *cmd,
-                              const char *tok, const char *pattern, ...)
+void sendcmdto_common_channels_butone(struct Client *from, const char *cmd,
+                                     const char *tok, struct Client *one,
+                                     const char *pattern, ...)
 {
   struct VarData vd;
   struct MsgBuf *mb;
@@ -370,16 +375,20 @@ void sendcmdto_common_channels(struct Client *from, const char *cmd,
   /*
    * loop through from's channels, and the members on their channels
    */
-  for (chan = cli_user(from)->channel; chan; chan = chan->next_channel)
+  for (chan = cli_user(from)->channel; chan; chan = chan->next_channel) {
+    if (IsZombie(chan))
+      continue;
     for (member = chan->channel->members; member;
         member = member->next_member)
       if (MyConnect(member->user) && -1 < cli_fd(cli_from(member->user)) &&
+          member->user != one &&
          sentalong[cli_fd(cli_from(member->user))] != sentalong_marker) {
        sentalong[cli_fd(cli_from(member->user))] = sentalong_marker;
        send_buffer(member->user, mb, 0);
       }
+  }
 
-  if (MyConnect(from))
+  if (MyConnect(from) && from != one)
     send_buffer(from, mb, 0);
 
   msgq_clean(mb);
@@ -388,10 +397,13 @@ void sendcmdto_common_channels(struct Client *from, const char *cmd,
 /*
  * Send a (prefixed) command to all local users on the channel specified
  * by <to>; <tok> is ignored by this function
+ *
+ * Update: don't send to 'one', if any. --Vampire
  */
-void sendcmdto_channel_butserv(struct Client *from, const char *cmd,
-                              const char *tok, struct Channel *to,
-                              const char *pattern, ...)
+void sendcmdto_channel_butserv_butone(struct Client *from, const char *cmd,
+                                     const char *tok, struct Channel *to,
+                                     struct Client *one, const char *pattern,
+                                     ...)
 {
   struct VarData vd;
   struct MsgBuf *mb;
@@ -406,7 +418,7 @@ void sendcmdto_channel_butserv(struct Client *from, const char *cmd,
 
   /* send the buffer to each local channel member */
   for (member = to->members; member; member = member->next_member) {
-    if (MyConnect(member->user) && !IsZombie(member))
+    if (MyConnect(member->user) && member->user != one && !IsZombie(member))
       send_buffer(member->user, mb, 0);
   }
 
@@ -519,7 +531,12 @@ void sendwallto_group_butone(struct Client *from, int type, struct Client *one,
     if (!(cptr = LocalClientArray[i]) ||
        (cli_fd(cli_from(cptr)) < 0) ||
        (type == WALL_DESYNCH && !(cli_flags(cptr) & FLAGS_DEBUG)) ||
+#ifdef HEAD_IN_SAND_WALLOPS
+       (type == WALL_WALLOPS && (!(cli_flags(cptr) & FLAGS_WALLOP) ||
+                                 !IsAnOper(cptr))) ||
+#else
        (type == WALL_WALLOPS && !(cli_flags(cptr) & FLAGS_WALLOP)) ||
+#endif
         (type == WALL_WALLUSERS && !(cli_flags(cptr) & FLAGS_WALLOP)))
       continue; /* skip it */
     send_buffer(cptr, mb, 1);
@@ -586,7 +603,7 @@ void sendcmdto_match_butone(struct Client *from, const char *cmd,
   sentalong_marker++;
   for (cptr = GlobalClientList; cptr; cptr = cli_next(cptr)) {
     if (!IsRegistered(cptr) || cli_from(cptr) == one || IsServer(cptr) ||
-       IsMe(cptr) || !match_it(cptr, to, who) || cli_fd(cli_from(cptr)) < 0 ||
+       IsMe(cptr) || !match_it(from, cptr, to, who) || cli_fd(cli_from(cptr)) < 0 ||
        sentalong[cli_fd(cli_from(cptr))] == sentalong_marker)
       continue; /* skip it */
     sentalong[cli_fd(cli_from(cptr))] = sentalong_marker;
index a83c57ed424817fe6a1ae5e9e290de01270fc08c..8f8965365d227a5b9646f3bcbcc4f1247c130477 100644 (file)
@@ -94,7 +94,7 @@ static void uping_erase(struct UPing* p)
 /* Called when the event engine detects activity on the UPing socket */
 static void uping_echo_callback(struct Event* ev)
 {
-  assert(ev_type(ev) == ET_READ);
+  assert(ev_type(ev) == ET_READ || ev_type(ev) == ET_ERROR);
 
   uping_echo();
 }
@@ -204,7 +204,7 @@ static void uping_read_callback(struct Event* ev)
     if (!pptr->freeable)
       MyFree(pptr); /* done with it, finally */
   } else {
-    assert(ev_type(ev) == ET_READ);
+    assert(ev_type(ev) == ET_READ || ev_type(ev) == ET_ERROR);
 
     uping_read(pptr); /* read uping response */
   }
@@ -271,9 +271,9 @@ static void uping_start(struct UPing* pptr)
 {
   assert(0 != pptr);
 
-  timer_add(&pptr->sender, uping_sender_callback, (void*) pptr,
+  timer_add(timer_init(&pptr->sender), uping_sender_callback, (void*) pptr,
            TT_PERIODIC, 1);
-  timer_add(&pptr->killer, uping_killer_callback, (void*) pptr,
+  timer_add(timer_init(&pptr->killer), uping_killer_callback, (void*) pptr,
            TT_RELATIVE, UPINGTIMEOUT);
   pptr->freeable |= UPING_PENDING_SENDER | UPING_PENDING_KILLER;
 
index 25f354519fcdb43b933cbba95a09df2a4bd52598..8bdb1ce8f36ac4038e44d9134b12abc3c9b4aedd 100644 (file)
@@ -136,7 +136,15 @@ void do_who(struct Client* sptr, struct Client* acptr, struct Channel* repchan,
 
   if (!fields || (fields & WHO_FIELD_SER))
   {
-    char *p2 = cli_name(cli_user(acptr)->server);
+    char *p2;
+#ifdef HEAD_IN_SAND_WHO_SERVERNAME
+    if (IsOper(sptr))
+#endif
+      p2 = cli_name(cli_user(acptr)->server);
+#ifdef HEAD_IN_SAND_WHO_SERVERNAME
+    else
+      p2 = HEAD_IN_SAND_SERVERNAME;
+#endif
     *(p1++) = ' ';
     while ((*p2) && (*(p1++) = *(p2++)));
   }
@@ -189,6 +197,8 @@ void do_who(struct Client* sptr, struct Client* acptr, struct Channel* repchan,
       if (SendDebug(acptr))
         *(p1++) = 'g';
     }
+    if (HasHiddenHost(acptr))
+      *(p1++) = 'x';
   }
 
   if (!fields || (fields & WHO_FIELD_DIS))
@@ -197,8 +207,7 @@ void do_who(struct Client* sptr, struct Client* acptr, struct Channel* repchan,
     if (!fields)
       *p1++ = ':';              /* Place colon here for default reply */
 #ifdef HEAD_IN_SAND_WHO_HOPCOUNT
-    strcat(p1, sptr == acptr ? "0" : "3");
-    p1++;
+    *p1++ = (sptr == acptr) ? '0' : '3';
 #else
     /* three digit hopcount maximum */
     p1 += ircd_snprintf(0, p1, 3, "%d", cli_hopcount(acptr));
index 48ab1035d497af62baeaa47ac5691a0f8327913b..2aa93998d2341d260c208257011dce10fbc398cc 100644 (file)
@@ -176,6 +176,8 @@ whowas_clean(struct Whowas *ww)
     MyFree(ww->username);
   if (ww->hostname)
     MyFree(ww->hostname);
+  if (ww->realhost)
+    MyFree(ww->realhost);
   if (ww->servername)
     MyFree(ww->servername);
   if (ww->realname)
@@ -218,6 +220,7 @@ whowas_init(struct Whowas *ww)
   ww->name = 0;
   ww->username = 0;
   ww->hostname = 0;
+  ww->realhost = 0;
   ww->servername = 0;
   ww->realname = 0;
   ww->away = 0;
@@ -290,6 +293,8 @@ void add_history(struct Client *cptr, int still_on)
   DupString(ww->name, cli_name(cptr));
   DupString(ww->username, cli_user(cptr)->username);
   DupString(ww->hostname, cli_user(cptr)->host);
+  if (HasHiddenHost(cptr))
+    DupString(ww->realhost, cli_user(cptr)->realhost);
   DupString(ww->servername, cli_name(cli_user(cptr)->server));
   DupString(ww->realname, cli_info(cptr));
   if (cli_user(cptr)->away)
diff --git a/tools/ringlog.c b/tools/ringlog.c
new file mode 100644 (file)
index 0000000..920ab5f
--- /dev/null
@@ -0,0 +1,341 @@
+/*
+** Copyright (C) 2002 by Kevin L. Mitchell <klmitch@mit.edu>
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+**
+** @(#)$Id$
+*/
+/*
+ * This file contains two separate pieces, along with some common
+ * gunk.  If RINGLOG_INSTRUMENT is defined, the two special functions
+ * __cyg_profile_func_enter() and __cyg_profile_func_exit() are
+ * defined; otherwise a main function is defined.  The common gunk is
+ * init_log(), which opens and, if necessary, initializes a special
+ * binary log file that is treated as a ring buffer (to prevent the
+ * file from growing unboundedly).
+ *
+ * The object produced when compiled with RINGLOG_INSTRUMENT is
+ * designed to work with the special gcc option
+ * -finstrument-functions; this option causes the
+ * __cyg_profile_func_*() functions mentioned above to be called when
+ * a function is entered or exited.  (Of course, ringlog.o should
+ * *not* be compiled with this option.)  These functions will in turn
+ * call store_entry(), which will call init_log() as needed to open
+ * the log file, ensure that a start record is output, and then will
+ * store records for the function calls.  The log file used is
+ * "call.ringlog" in the directory from which the program was
+ * started.
+ *
+ * When RINGLOG_INSTRUMENT is *not* defined while building, a main
+ * function is defined, and the result is an executable for
+ * interpretation of a ringlog.  Usage is very simple:  All arguments
+ * not beginning with '-' are treated as files to open, and all
+ * arguments beginning with '-' are treated as a specification for the
+ * number of entries new files should be created with.  If this
+ * specification is 0 (which it is by default), files will not be
+ * created if they do not already exist.
+ *
+ * For every filename argument, at least one line will be printed
+ * out.  If the file is not empty, the entries in the file will be
+ * printed out, one to a line.  Each entry is numbered with a logical
+ * number.  The entry numbers are followed by a two word description
+ * of the entry type ("Log start," "Function entry," "Function exit,"
+ * and "Invalid entry"), followed by a colon (":"), followed by the
+ * word "addr" and the address of the function, followed by the word
+ * "call" and the address from which the function was called.  The
+ * ringlog program is not able to convert these addresses to symbols
+ * or file and line numbers--that can be done with a program like
+ * addr2line (part of the binutils package).  The output has been
+ * carefully contrived to be parsable by a script.
+ *
+ * The file format is documented below.  Note that data is stored in
+ * host byte order.
+ *
+ *                      1                   2                   3
+ *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |                         Magic number                          |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |          First entry          |          Last entry           |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |                            Records                            |
+ * \                                                               \
+ * \                                                               \
+ * |                            Records                            |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * Record format:
+ *                      1                   2                   3
+ *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |                           Type code                           |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |                       Function address                        |
+ * /                                                               /
+ * /                                                               /
+ * |                       Function address                        |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |                       Calling location                        |
+ * /                                                               /
+ * /                                                               /
+ * |                       Calling location                        |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * Some systems may have pointers larger than 32 bits, which is why these
+ * fields are allowed to be variable width.
+ */
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+/* /etc/magic rules:
+ *
+ * 0   belong  0x52e45fd4      RingLog call trace file, big endian
+ * >4  beshort x               (First entry %u,
+ * >>6 beshort x               last entry %u)
+ * 0   lelong  0x52e45fd4      RingLog call trace file, little endian
+ * >4  leshort x               (First entry %u,
+ * >>6 leshort x               last entry %u)
+ */
+#define RINGLOG_MAGIC 0x52e45fd4       /* verify file format */
+
+#define RINGLOG_INIT  0x00000000       /* mark when a session was initiated */
+#define RINGLOG_ENTER 0x01010101       /* record function entry */
+#define RINGLOG_EXIT  0x02020202       /* record function exit */
+
+#define RINGLOG_FNAME "call.ringlog"   /* default file name */
+#define RINGLOG_ILEN  2000             /* default number of entries */
+
+/* length of the header and of individual entries */
+#define HEAD_LEN      (sizeof(u_int32_t) + 2 * sizeof(u_int16_t))
+#define ENTRY_LEN     (sizeof(u_int32_t) + 2 * sizeof(void *))
+
+/* return an lvalue to the specified type stored at the specified location */
+#define rl_ref(log, loc, type) (*((type *)((log) + (loc))))
+
+/* access particular header fields */
+#define rl_magic(log) rl_ref((log), 0, u_int32_t)
+#define rl_first(log) rl_ref((log), 4, u_int16_t)
+#define rl_last(log)  rl_ref((log), 6, u_int16_t)
+
+/* translate physical entry number to a file location */
+#define rl_addr(loc)  ((loc) * ENTRY_LEN + HEAD_LEN)
+
+/* extract the type, function, and call fields of an entry */
+#define rl_type(log, loc) rl_ref((log), rl_addr(loc), u_int32_t)
+#define rl_func(log, loc) rl_ref((log), rl_addr(loc) + sizeof(u_int32_t), \
+                                void *)
+#define rl_call(log, loc) rl_ref((log), rl_addr(loc) + sizeof(u_int32_t) + \
+                                sizeof(void *), void *)
+
+static char *log = 0; /* the log has to be global data */
+static size_t log_size = 0; /* remember the size of the log */
+static int log_length = 0; /* remember how many entries it'll hold */
+
+/* Open and initialize the log file */
+static int
+init_log(char *fname, size_t init_len)
+{
+  char c = 0;
+  int fd, err = 0, size = -1;
+  struct stat buf;
+
+  /* open file */
+  if ((fd = open(fname, O_RDWR | (init_len > 0 ? O_CREAT : 0),
+                S_IRUSR | S_IWUSR)) < 0)
+    return errno; /* return error */
+
+  if (fstat(fd, &buf)) { /* get size */
+    err = errno; /* save errno... */
+    close(fd); /* close file descriptor */
+    return err; /* return error */
+  }
+
+  if (buf.st_size <= 8) /* too small */
+    size = HEAD_LEN + ENTRY_LEN * init_len;
+  else if ((buf.st_size - 8) % ENTRY_LEN) /* not a multiple of entry length */
+    size = ((buf.st_size - 8) / ENTRY_LEN + 1) * ENTRY_LEN + 8; /* round up */
+
+  if (size >= 0) { /* need to set the size */
+    if (lseek(fd, size - 1, SEEK_SET) < 0) { /* seek to the end of our file */
+      err = errno; /* save errno... */
+      close(fd); /* close file descriptor */
+      return err; /* return error */
+    }
+
+    if (write(fd, &c, 1) < 0) { /* write a zero to set the new size */
+      err = errno; /* save errno... */
+      close(fd); /* close file descriptor */
+      return err; /* return error */
+    }
+
+    log_size = size; /* record log size */
+  } else
+    log_size = buf.st_size; /* record log size */
+
+  /* map the file to memory */
+  if ((log = (char *)mmap(0, log_size, PROT_READ | PROT_WRITE,
+                         MAP_SHARED, fd, 0)) == MAP_FAILED)
+    err = errno; /* save errno... */
+
+  close(fd); /* don't need the file descriptor anymore */
+
+  if (err) /* an error occurred while mapping the file; return it */
+    return err;
+
+  log_length = (log_size - HEAD_LEN) / ENTRY_LEN; /* store number of entries */
+
+  if (rl_magic(log) == 0) { /* initialize if necessary */
+    rl_magic(log) = RINGLOG_MAGIC;
+    rl_first(log) = -1;
+    rl_last(log) = -1;
+  }
+
+  if (rl_magic(log) != RINGLOG_MAGIC) { /* verify file format */
+    munmap(log, log_size); /* unmap file */
+    return -1; /* -1 indicates file format error */
+  }
+
+  return 0; /* return success */
+}
+
+#ifdef RINGLOG_INSTRUMENT
+
+/* store an entry in the log file */
+static void
+store_entry(u_int32_t type, void *this_fn, void *call_site)
+{
+  if (!log) { /* open the log file if necessary; die if unable */
+    assert(init_log(RINGLOG_FNAME, RINGLOG_ILEN) == 0);
+    store_entry(RINGLOG_INIT, 0, 0); /* mark start of logging */
+  }
+
+  if (++(rl_last(log)) >= log_length) /* select next entry to fill */
+    rl_last(log) = 0; /* wrap if needed */
+
+  if (rl_first(log) == rl_last(log)) { /* advance start pointer if collision */
+    if (++(rl_first(log)) >= log_length) /* wrap if necessary */
+      rl_first(log) = 0;
+  } else if (rl_first(log) == (u_int16_t)-1) /* no entries yet; enter one */
+    rl_first(log) = 0;
+
+  rl_type(log, rl_last(log)) = type; /* record the entry */
+  rl_func(log, rl_last(log)) = this_fn;
+  rl_call(log, rl_last(log)) = call_site;
+}
+
+/* called upon function entry */
+void
+__cyg_profile_func_enter(void *this_fn, void *call_site)
+{
+  store_entry(RINGLOG_ENTER, this_fn, call_site);
+}
+
+/* called upon function exit */
+void
+__cyg_profile_func_exit(void *this_fn, void *call_site)
+{
+  store_entry(RINGLOG_EXIT, this_fn, call_site);
+}
+
+#else /* !defined(RINGLOG_INSTRUMENT) */
+
+/* converts a type to a printable string */
+static char *
+get_type(u_int32_t type)
+{
+  switch (type) {
+  case RINGLOG_INIT:
+    return " Logging start";
+    break;
+  case RINGLOG_ENTER:
+    return "Function entry";
+    break;
+  case RINGLOG_EXIT:
+    return " Function exit";
+    break;
+  }
+
+  return " Invalid entry";
+}
+
+/* Print out entries from a starting point to an end point */
+static void
+extract(int *count, u_int16_t start, u_int16_t end)
+{
+  for (; start <= end; start++)
+    printf("% 4d %s: addr %p call %p\n", (*count)++,
+          get_type(rl_type(log, start)), rl_func(log, start),
+          rl_call(log, start));
+}
+
+int
+main(int argc, char **argv)
+{
+  char *arg;
+  int i, err, size = 0;
+
+  while ((arg = *++argv)) {
+    if (arg[0] == '-') { /* -<number> turns into log file size */
+      size = atoi(arg + 1);
+      continue;
+    }
+
+    log = 0; /* initialize our data */
+    log_size = 0;
+    log_length = 0;
+
+    switch ((err = init_log(arg, size))) { /* initialize the log */
+    case -1: /* file is in an invalid format */
+      printf("File %s not a valid ringlog file\n", arg);
+      continue;
+      break;
+
+    case 0: /* file has opened and is ready to be read */
+      break;
+
+    default: /* some error occurred */
+      printf("Error %d opening file %s: %s\n", err, arg, strerror(err));
+      continue;
+      break;
+    }
+
+    if (rl_first(log) == (u_int16_t)-1) /* it's an empty file */
+      printf("File %s is empty\n", arg);
+    else { /* print out file contents */
+      printf("File %s contents:\n", arg);
+
+      i = 0; /* initialize counter */
+      if (rl_last(log) <= rl_first(log)) { /* print out log file */
+       extract(&i, rl_first(log), log_length - 1); /* end of buffer... */
+       extract(&i, 0, rl_last(log)); /* then beginning of buffer */
+      } else
+       extract(&i, rl_first(log), rl_last(log));
+    }
+
+    munmap(log, log_size); /* unmap the file */
+  }
+
+  return 0;
+}
+
+#endif /* !RINGLOG_INSTRUMENT */
diff --git a/tools/ringlog.pl b/tools/ringlog.pl
new file mode 100755 (executable)
index 0000000..346b05f
--- /dev/null
@@ -0,0 +1,187 @@
+#! /usr/bin/perl -w
+#
+# Copyright (C) 2002 by Kevin L. Mitchell <klmitch@mit.edu>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# @(#)$Id$
+#
+# This program is intended to be used in conjunction with ringlog and
+# the binutils program addr2line.  The -r option specifies the path to
+# the ringlog program; the -a option specifies the path to addr2line.
+# (Both of these default to assuming that the programs are in your
+# PATH.)  All other options are passed to addr2line, and any other
+# arguments are treated as filenames to pass to ringlog.  If no
+# filenames are given, the program operates in filter mode, expecting
+# to get output from ringlog on its standard input.  In this case,
+# ringlog will not be directly executed, but addr2line still will.
+
+use strict;
+
+use Socket;
+use IO::Handle;
+
+sub start_addr2line {
+    my ($location, @args) = @_;
+
+    unshift(@args, '-f'); # always get functions
+
+    # Get a socket pair
+    socketpair(CHILD, PARENT, AF_UNIX, SOCK_STREAM, PF_UNSPEC)
+       or die "socketpair: $!";
+
+    CHILD->autoflush(1); # Make sure autoflush is turned on
+    PARENT->autoflush(1);
+
+    my $pid;
+
+    # Fork...
+    die "cannot fork: $!"
+       unless (defined($pid = fork));
+
+    if (!$pid) { # in child
+       close(CHILD);
+       open(STDIN, "<&PARENT");
+       open(STDOUT, ">&PARENT");
+       exec($location, @args); # exec!
+    }
+
+    # in parent
+    close(PARENT);
+
+    return \*CHILD; # Return a filehandle for it
+}
+
+sub xlate_addr {
+    my ($fh, $addr) = @_;
+
+    # Feed address into addr2line
+    print $fh "$addr\n";
+
+    # Get function name, file name, and line number
+    my $function = <$fh> || die "Couldn't get function name";
+    my $fileline = <$fh> || die "Couldn't get file name or line number";
+
+    # Remove newlines...
+    chomp($function, $fileline);
+
+    # If addr2line couldn't translate the address, just return it
+    return "[$addr]"
+       if ($function eq "??");
+
+    # return function(file:line)[address]
+    return "$function($fileline)[$addr]";
+}
+
+sub start_ringlog {
+    my ($location, @args) = @_;
+
+    # Build a pipe and fork, through the magic of open()
+    my $pid = open(RINGLOG, "-|");
+
+    # Make sure we forked!
+    die "couldn't fork: $!"
+       unless (defined($pid));
+
+    # Execute ringlog...
+    exec($location, @args)
+       unless ($pid);
+
+    return \*RINGLOG;
+}
+
+sub parse_ringlog {
+    my ($ringlog, $addr) = @_;
+    my $state = "reading";
+
+    while (<$ringlog>) {
+       chomp;
+
+       # Beginning of parsable data
+       if (/^File.*contents:$/) {
+           $state = "parsing";
+
+           # Here's actual parsable data, so parse it
+       } elsif ($state eq "parsing" && /^\s*\d+/) {
+           s/(0x[a-fA-F0-9]+)/&xlate_addr($addr, $1)/eg;
+
+           # Switch out of parsing mode
+       } else {
+           $state = "reading";
+       }
+
+       # Print the final result
+       print "$_\n";
+    }
+}
+
+# get an argument for an option that requires one
+sub getarg (\$) {
+    my ($iref) = @_;
+
+    $ARGV[$$iref] =~ /^(-.)(.*)/;
+
+    die "Argument for $1 missing"
+       unless ((defined($2) && $2 ne "") || @ARGV > $$iref + 1);
+
+    return defined($2) && $2 ne "" ? $2 : $ARGV[++$$iref];
+}
+
+my ($ringlog_exe, $addr2line_exe) = ("ringlog", "addr2line");
+my (@addr2line_args, @files);
+
+# Deal with arguments; note that we have to deal with -b and -e for
+# addr2line.
+for (my $i = 0; $i < @ARGV; $i++) {
+    if ($ARGV[$i] =~ /^-r/) {
+       $ringlog_exe = getarg($i);
+    } elsif ($ARGV[$i] =~ /^-a/) {
+       $addr2line_exe = getarg($i);
+    } elsif ($ARGV[$i] =~ /^-([be])/) {
+       push(@addr2line_args, "-$1", getarg($i));
+    } elsif ($ARGV[$i] =~ /^-/) {
+       push(@addr2line_args, $ARGV[$i]);
+    } else {
+       push(@files, [ $ARGV[$i], @addr2line_args ]);
+       @addr2line_args = ();
+    }
+}
+
+# Verify that that left us with executable names, at least
+die "No ringlog executable"
+    unless (defined($ringlog_exe) && $ringlog_exe ne "");
+die "No addr2line executable"
+    unless (defined($addr2line_exe) && $addr2line_exe ne "");
+
+# Ok, process each file we've been asked to process
+foreach my $file (@files) {
+    my ($addr2line, $ringlog) =
+       (start_addr2line($addr2line_exe, @{$file}[1..$#{$file}]),
+        start_ringlog($ringlog_exe, $file->[0]));
+
+    parse_ringlog($ringlog, $addr2line);
+
+    close($addr2line);
+    close($ringlog);
+}
+
+# Now if there are still more unprocessed arguments, expect ringlog
+# input on stdin...
+if (@addr2line_args) {
+    my $addr2line = start_addr2line($addr2line_exe, @addr2line_args);
+
+    parse_ringlog(\*STDIN, $addr2line);
+    close($addr2line);
+}