The InspIRCd Project
Home | Developers | Wiki | Forums | Bug Tracker | SVN | Download | Blog | Stats
Personal tools

ChangeLog/1.1 Alpha

From the makers of InspIRCd.

Jump to: navigation, search
Historical Historical Material - Information posted here may be inaccurate as a result of being obsolete. This information is kept for historical reference purposes.


1.1.0 Technology Preview

    *  Fix for bug which can lock up ircd if someone adds a timed ban when the banlist is full
    * Started UserManager class
    * Allow invalid nicks from remote users in NICK (we'll need this soon for UID nick collision handling)
    * Remove documentation of m_operwho from here
    * Remove m_operwho, no longer required in 1.1 as standard /who can do its job
    * Finish off /WHO (i think it covers everything). Now has a few extra options
    * Document <options:syntaxhints> and <options:nouserdns>, Change syntaxhints to seperate RPL_TEXT (prefix SYNTAX)
    * Take invisible requirement out of chlist()
    * Tidyup message.cpp, remove some really old craq., Improve tidiness of new common_channels function, Add timeout value to blocking CleanAndResolve function
    * Change all references to voodoo numbers (7, 3 etc) to the new bitwise constants for user->registered, Change a lot of user->fd > -1 to use the IS_LOCAL() macro
    * Change some if fd > -1 to IS_LOCAL macro
    * Optimize common_channels
    * Change chlist() to use a chained append
    * Make the error more obvious, still has 'not enough params' on the start now
    * Re-order stuff so that users cant get syntax for commands they dont have access to
    * Add support for syntax of commands in place of the text 'Not enough parameters' in numeric 461, where supported., To support this each derived class of command_t must set the value of command_t::syntax to a non-empty string.
    * Allow SAMODE and remote users to set +qa without local-user checks (bug?)
    * Change std:air<bool,std::string> to neater typedef "ModePair"
    * Mode merging during FJOIN with ourts==theirts. Only +k and +l have CheckTimestamp methods atm, needs to be finished by me and TIDIED.
    * Fix the remote +k-k stuff
    * Allow freaky stuff with +k when coming from a server or remote user (allow +k when already a +k, or -k without correct key)
    * Fix crashbug when exiting a remote client with threaded dns on (oops)
    * * Fix Server::SendMode to actually work again., * In the 1.1 protocol we now use FMODE for everything possible, rather than MODE.
    * commit remainder of new mode bouncing stuff for TS based modes
    * Add extra method to mode handler, ModeHandler::ModeSet()., Returns a std:air<bool,string>., if the bool is true, the mode is set, and the second item in the pair is the parameter set on it, if any, If the bool is false, the mode is not set, and the parameter given is returned as the second item of the pair, To be used in mode bouncing, to build a safe set of bounced modes (dont ask yet)
    * Fix reiterpret_cast stuff that doesnt work right
    * Adapt m_spanningtree to use irc::tokenstream instead of its own irc-line-parser (that was teh sux)
    * Migrate towards FMODE with TS, remove the SYNCTS command idea
    * Remove numeric which makes some clients (Xchat, more?) think their nick is in use. Apparently it's not needed
    * Exclude LUSERS lines with zero counts (NO WE WONT CHANGE THE SPELLING OF connection(s)!)
    * Prevent notice loops on servermasks
    * Allow PRIVMSG and NOTICE targets of $<servermask> to the module events (this wasnt trivial and is almost a damn feature)
    * Correct static build
    * Fix NOTICE $* to go between servers
    * Change watchlist to a list of pointers, can operate and iterate much faster
    * In the constructor which doesnt set Request::id, we set Request::id explicitly to '\0', which will prevent such a request accidentally breaking an id-supporting module with an uninitialized buffer
    * Tidyup and bugfix, not copying the correct column names
    * Change to use GetId() and ID rather than GetData() and data
    * Fixed to dynamically allocate the fieldlist
    * Add an ID field to Request and a GetId() method, takes const char* and returns it - Added new constructor to use it, all modules using ID should convert to the 'new' way of doing Requests, data is now theoretically depreceiated
    * Move mysql_rpath into extra
    * *boot* youuuuu're outta here - old blocking SQL API replaced with sexy new async one <3
    * Free, as they should be, fieldlist and/or fieldmap in destructor of PgSQLresult *if* they were allocated
    * More stuff to return empty lists and maps when there are no more rows in the dataset
    * Adjust m_mysql to match the assumed behaviour of m_pgsql exactly, e.g. when there are now rows left return an empty row, Fix mistake which required a reference to be freed (?!)
    * Tidyups, optimisations and make the log messages make sense...
    * simple logic error (check they already are +o before you set it), seems to fix +o issue
    * Mostly updated to new API; Currently doesn't check config o:lines (should be tried before SQL ones); Doesn't seem to set UMODE +o properly
    * Give SQLfield's constructor parameters default values (effectively giving it a default constructor), lets SQLfieldMap actually be useable..
    * Remove unused variable and assignment
    * Make m_pgsql return the number of affected rows for an UPDATE or INSERT query., Make m_testclient do an INSERT and test this
    * Added m_mysql.so and m_pgsql.so to docs, remove m_sql.so, RETAIN ALPHA ORDER., *ALL OTHER DEVS* please add your modules to this config file when you have time, thanks ;p
    * Alter for Rows() == X, Cols() == 0 for 'X rows affected' queries
    * Change to doxygen-friendly comments, and actually document the lot
    * Change comment to actually be rightish
    * Reorder a couple of constructor prototypes for consistency
    * Add m_sqlutils - Currently provides ID->chan/user lookups, Update m_sqlauth to use m_sqlutils
    * I hate the fucking mysql devs. Craq smoking bastards., Upon Insert, number of rows is the number of rows effected but the number of columns is 0??, Add check to MySQLreply::Rows() to ensure the user doesnt see N rows and 0 columns!
    * Allocate id properly
    * Actually hook up the OnUnloadModule event
    * This compiles, dont expect it to work yet
    * Logic error, success is when the error ID *is* NO_ERROR
    * Stop publishing MySQL feature - check for successful publishing of SQL feature
    * Stop publishing the PgSQL feature ( :-'( )
    * Fix -modupdate to not break inspircd_se_config.h (a configure-written header that contains an include for the socketengine header)
    * Make OnCheckReady safe against the user being killed, SO LONG AS THE MODULE WHICH D/C'S THE USER RETURNS FALSE
    * Explicitly return false after killing user in OnCheckReady() (theoretically no change, but just makes sure..)
    * * Change to use QREPLY_FAIL, * Adjust error message so that it appears in the format: "<errno>: <err message>"
    * Handle queries failing properly, actually work
    * Set the SQLresult's error field properly when the query fails
    * Add new QREPLY_FAIL error code (bad query syntax etc)
    * Add extra parameter to MySQLresult and SQLresult
    * Fix test client error cheecking on result types
    * Update to SQLv2 API
    * Set the ID in the request *before* we copy it by value why not..
    * *hide*, I forgot to include the ID in the SQLresult *rehide*
    * One mess and a half that compiles. To be tidied some day after it works (i dread that day.)
    * Deal with ? substitution, we're at the point now where we can call the mysql_real_query function, (mysql_real_query takes char* and length params, mysql_query just takes char*, and cant deal with NULLs), TODO after this: signal the main ircd thread that theres a result ready on a given db id, and to fetch that result and post it back to the caller
    * Seems to work to a point (dont use it, it wont actually execute a query yet)
    * This now compiles, i gaurantee it doesnt work
    * Change includes, use --libs_r rather than mysql_config --libs, we want re-enterant libs for pthreads
    * Move this to m_mysql.cpp - dont even bother reading this yet its unchanged from m_sql
    * Set the query string in the SQLquery to the copy with parameters substituted in.
    * Implemenet parameter substitution (damn sexy if you ask me..)
    * ParamL needs to be a deque rather than a vector *thwap*
    * Add tiny perl script to detect version and pass an appropriate -D to gcc. Make m_pgsql #ifdef around PQescapeStringConn() which is only available in PostgreSQL >= 8.1.4
    * API header and client module updates for new multi-parameter query request. Needs proper implementation in m_pgsql and documentation
    * Slight tidyup: type name = type(args); --> type name(args);
    * Make SQLexception inherit ModuleException
    * Add comments, remove debug, alter message in ./configure
    * Fixed, no longer a memory leak (Thread leak)
    * Updates, should be able to safely unload client modules with queries in progress now..., Ideas on how to test this welcome ;p
    * Okay, working PostgreSQL module, API header and example client module in /extra/, enjoy
    * Someone please take a look at this and tell me why a thread doesnt free itself like it should when it exits, freeing the ram
    * Move a confusing debug message within its conditional
    * Make threaded dns stable by placing some mutexes around some stl stuff (this really needs lots of testing now)
    * Threaded dns stuff - im going to try and make this stable in 1.1
    * Okay, this is getting towards working now. It just needs the API finishing...everything in the backend part seems to be working okay
    * Removed all that lastcreate and wantclose craq from dns.cpp (WHAT THE FUCK WERE THE FIREDNS GUYS SMOKING)
    * Change stats recv/send to double, so they can hold truly massive numbers of transferred bytes (they would overflow after about 6 weeks on a busy net otherwise), Fix some warnings
    * Change counters to unsigned long to prevent overflow to negative counts
    * Completely remove need for memset., When we uniq_id++, we can wrap to 0 theoretically after 4 billion output messages, HOWEVER, when we do, 0 will be a valid comparison within the array
    * Set 'copyright' property on all items, informational only, effects nothing
    * Add #include <sys/select.h> to select engine, we probably need it
    * Whoops, forgot SocketEngine::SocketEngine() gets called recursively from *Engine::*Engine() (where * is the type being built)
    * * Seperate out socket engines into derived classes of SocketEngine., * Add a classfactory SocketEngineFactory to create a new socketengine of the configured type, * Implement configure hax to compile only the required socketengine and the base class, * Eliminates ugly defines, and is more in line with C++ ways
    * Change size of already_sent from char to int to work with uniq_id value
    * Speed up writecommon, writecommon_noformat, writechannel, etc (by quite a bit) - eliminate 99.99999999999% of the memsets
    * Special checking for muppet providers that make their reverse resolution resolve back to the same reverse resolution., *WHY* DO PEOPLE IN CONTROL OF THE RDNS RECORDS EVEN *ALLOW* SUCH LUNACY?!
    * Fix motd with new buffering
    * Tried to implement sprintf that returns std::string of any size, realized it would scale like unreal scales to ircnet (e.g. it wouldnt!) so took it back out., Moved chop() functionality into userrec::AddWriteBuf and make it nicer (no strlen)
    * Improved connect time by not referencing the hash for each user value, store a temp pointer
    * Ignore empty lines, don't try and process them as commands
    * Only attempt forward lookup if the user still exists
    * Craq removal service, at your service
    * i'm doing this in increments, because if i try and change too much at once, it breaks
    * Fixing sendq crask
    * Update to new API - I think this is right, compiles...
    * Fixed it myself so i can carry on coding1
    * WHO refactoring. In progress currently.
    * *Changed user input/output buffering to incur less copies, *Fix warnings in command_parse
    * Change to a DIFFERENT HOOK for added goodness.
    * Document irc::commasepstream and irc::tokenstream
    * Document loopcall (its still complicated in concept, but now easier to read and possibly easier to understand)
    * Created new class irc::commasepstream., Will read comma seperated lists and works identically to irc::tokenstream, It's re-entrant so we can run two of them together for JOIN
    * Fix case sensitive commands issue due to new std::string based parser, improve the craq disabled commands check that was potentially O(n) where n is the number of disabled commands (erk)
    * mass tidyup, change A LOT of stuff to const char** which was char** (such as parameters to commands in handlers), which makes the new lineparser work neater with no casts. This also removes tons of casts from other locations, (all in all, ive added 2 casts and removed almost a hundred)
    * MAJOR tidy of line parser, some parts rewritten and major chunks removed
    * Fixes/codes of the query queue, various prototypes and stuff...mostly commited so I can do other stuff without typing the paths out manually
    * const the std::string reference in tokenstream's constructor
    * This should be faster, we read it like a stream now with GetToken until GetToken returns ""., The optimizations done by gcc means theres only one std::string constructor call per token, which is mmm yum.
    * irc::tokenstream is a token parser which using std::string and std::vector builds a list of tokens using irc parsing rules., e.g.:, :arse PRIVMSG #chan :foo bar baz, becomes, a[0] = ":arse", a[1] = "PRIVMSG", a[2] = "#chan", a[3] = "foo bar baz"., *** SOMEONE *** needs to optimize this or at least verify its neatness (without making it total craq and unreadable). Feel free to mess with my code., Any optimizations you make, run them against the COMMENTED OUT TEST SUITE at the top of main() in src/inspircd.cpp and ensure ALL output is the same, with no crashes. (note: if you comment out and build with the test suite, all inspircd will do is output test data and exit!)
    * Removed GCC2 checks as we havent supported gcc2 for years
    * 3.3 -> 3.4 fix (the 3.3 stuff was actually craq)
    * Don't allow SAQUIT, SANICK, SAPART and SAJOIN on ulined clients
    * Changed to different way of clearing users on netsplit (uses less ram and should be less bug prone), WE NEED TESTERS FOR THIS. MAKE TEST NETWORKS FULL OF 1_0_STABLE SVN SERVERS AND FILL THEM WITH BOTS/PSEUDOS THEN CAUSE NETSPLITS!
    * Add <options:nouserdns> - defaults to off. if set to on, no user dns lookups are performed, saving resources
    * Fix dns socket leak found in stable
    * Fix -modupdate to actually work (doesnt force a total rebuild when you add a module)
    * Tiny tiny docs update, not even worth re-generating the docs for atm
    * Document class Resolver
    * I don't know if this works yet -- needs testing, Nonblocking DNS calls
    * A few updates to the API header
    * Add part-finished m_cgiirc module for Brain to play with
    * Add exception handling here
    * Throw moduleexception if you:, (a) try and resolve hosts before the core is initialized (HOW?!), ( try and resolve a host and the domain server is totally unreacable e.g. through lack of fd's or ifconfig eth0 down (this is the only safe way, any other way may result in a developer inserting an invalid pointer into a list of Resolver* theyre watching)
    * Test framework in m_testcommand, add interface
    * Added class Resolver (needs testing)
    * Topic support in channel list - NOTE THIS ISNT SAFE AGAINST XSS YET
    * Added stylesheet support
    * Now has a shiney 'valid xhtml 1.1' icon, just because it can.
    * Channel size sorting with a tricksy sort that converts it on the fly from std::map to std::vector for displaying
    * FIX channel user count stuff. next to do, order the user count list
    * Channel user count stuff
    * Check for uri and only claim /stats and /stats/
    * Basic html output other than chickens
    * Allow modules to change the content-type of the document (defaults to text/html)
    * Make it not b0rk on empty headers
    * Stop the chickens reproducing :X
    * Stuff for adding extra headers to a response (for Authorization: and Location: etc)
    * This works now, m_httpd_stats.so prints 'chickens' on all pages except the index
    * We might as well start on some module to interface with the service provider, eh
    * Event class for m_httpd.cpp
    * Add single parameter versions of Extensible::Extend and Extensible::GetExt for storing boolean values, seckshayer
    * Fix my last broken commit
    * Move openSockfd[] into ServerConfig
    * Change last vestiges of m_http.so -> m_httpd.so
    * Sucky default index, maybe some day someone should do a better one., Once we have a virtual filesystem module of some description to make use of it.
    * Dir for storing http stuff in., Updates to make m_http not do sucky things.
    * ContentSize speedups
    * Fugly code band-aid^H^H^H^H^Hfix
    * Add FileReader::ContentSize and FileReader::Contents
    * Ok, hands up who forgot to initialise Srv :/
    * Move logging further up in inspsocket so we get the right error for bind failure
    * Try to make this serve some static content
    * Http service provider module (this doesnt do anything yet!)
    * Update docs to indicate new templated GetExt and Extend, remove references to char* and void* pointers in here, and indicate how its now possible to store a NULL in Extensible
    * Added refcount to classbase, static classbase::id
    * Inherit just about everything from classbase
    * Inherit tons of stuff from classbase that should always have been
    * Making lots of stuff inherit from classbase so we can use it as a holdall class that we can throw around with dynamic_cast<>
    * Remove commented out old methods that became templates
    * Sort include dependencies of dns.h
    * Made a load more stuff Extensible which might be of use to someone
    * Properly set the resulting pointer to NULL when the object isnt found
    * Convert to templated GetExt, and a lot more readable
    * If you ask me, it looks a hell of a lot tidier without forcing the cast.
    * - userrec:rocessNoticeMasks - provide a way to set or unset masks.
    * - Add notice masks display to MODE nick, using a modified version of Unreal's 008 (no stupid formatting, display it like 221)
    * - Add usermode +n for notice masks - our implementation of snomasks. We're not sure how this will tie in with +s yet.
    * -Clone mode methods into notice mask methods for userrec., - Modify userrec to add char [] of notice masks, works in the same function as modes.
    * Add install line for libIRCDsnomasks.so
    * Add empty snomasks.cpp (still got to add headers here so the build doesnt barf on the empty file?)
    * Add interface to AddModeWatcher and DelModeWatcher into class Server
    * Added ModeParser::AddModeWatcher() and ModeParser:elModeWatcher()
    * Add HAS_STDINT checks here, this had been sitting not in extra/ and using stdint.h for aaaages anyway...
    * Support for systems without stdint.h (we make a guess at sizeof(unsigned int) == 32... if youre running an outdated OS its your own fault)
    * #ifdef's around stdint.h include
    * Updated to detect stdint (same fix as 1_0_stable branch)
    * Update docs to indicate _ to space
    * Added Spacify() function local to cmd_whois.cpp which translates _ in oper names to " "
    * Add missing Server::AddMode()
    * Add stuff for propogating mode out on +f * ban
    * send_mode event for spanningtree (this will be backported to stable as its really a bugfix too (honest!))
    * Finally finished documenting new mode parser. Lots of comments.
    * Same here, tidy up the parameter to show what we actually stored (e.g. 1:5fdfds -> 1:5)
    * Tidy up invalid numbers passed to this function
    * Added Server::GetModuleName(), Module* to filename
    * Reorder to avoid warning., We could make the autotidy stuff part of the 'check argument' virtual method in banexception and inviteexception at a later date?
    * Altered u_listmode to have a constructor arg 'autotidy' which if set to true runs input through ModeParser::CleanMask() otherwise leaves it alone
    * And we're all done!!! (well, it compiles, anyway)
    * Tweak mode parser so that oper-only modes are only enforced on local clients, so that during a burst the remote server can set them and we dont get desyncs
    * Move to stack-allocated OnRehash()-local ConfigReader *duck*
    * Add a missing cf->DoImplements(List);
    * Okay..updates to u_listmode, general cleanups and add some virtual methods which subclasses can override to alter behaviour..all looking much nicer and more flexible now., Update m_chanfilter to use u_listmode, demonstrates most or all of the new features of it and looks a hell of a lot prettier
    * Add a parameter to set what config tag to parse (defaults to what was previously hardcoded); Some other cleanups using initialisation lists, and using a ConfigParser stack-allocated rather than keeping a persistent heap-allocated one; Remove hardcoded filename prefixes in log messages
    * Add a return MODEACTION_DENY, fixes 'control reaches end of non-void function warning'
    * Fixed pointless dereference spotted by Foamy
    * Tidied up m_testcommand (removed a mode handler)
    * Convert m_censor to new api
    * Did some renaming so that the methods for modes in chanrec and userrec are identical., bool IsModeSet(const unsigned char c);, void SetMode(const unsigned char c, bool value);, Fixed m_botmode for new api
    * Convert to new API and optimize colour checking (we were using 0 ... string::length() when we could use std::string::iterator)
    * Port m_blockcaps to new api, remove OnExtendedMode and OnDisplayList events entirely
    * Convert to new API
    * Convert u_listmode and m_banexception to new api
    * Remove Server::AddExtendedMode and Server::AddExtendedListMode, replace with Server::AddMode (makes more sense naming wise too as all modes are modes, all the same now), NOTE: Modules that implement modes WILL NO LONGER COMPILE NOW UNTIL THEY ARE PORTED TO THE NEW API
    * Forward port of fix for Add*Line to apply automatically
    * Implement DisplayList virtual method calls, and implement it in cmode_b
    * Add code to remove an opers opertype when they oper down
    * Add usermode +o, with special checking so that an oper may only remove the mode not set it (on himself or others) -, Finish off facility for oper-only user and channel modes
    * Added DisplayCurrentModes which will display the modes of a channel or nick
    * Add code to display umode changes when they occur
    * TODO: Make more use of userrec::HasUmode('c') rather than user->modes['c'-65] *oogly*, Next - get umode +o working!
    * Convert new +isw modes to new mode format
    * Refactored user modes to work like the channel modes - core and module data now the same storage format without ::modebits
    * Added usermodes +swi., Note the usermode system needs a bit of a refactor to combine, module and core modes into the same storage neatly (as we did , with channels) this is next on my todo.
    * Remove comemnted-out GiveVoice and TakeVoice
    * Add cmode +v - that's all the RFC channel modes done now
    * Remove the TakeHops and GiveHops from comments
    * Add support for cmode +h
    * Tidyup, and add numeric 472 "unknown mode char"
    * Put back security checks so non-ops cant set modes again
    * Integrate +o into handlers
    * Add cmode +o (op/deop) and in the process change a lot of char* to const char* to avoid unneccessary casts
    * Convert the output limit back to the parameter
    * Add channelmode +l
    * Add chmode +k, cut down includes in use in mode.cpp
    * ModeHandler documented
    * Add support for channelmode +i
    * Add cmode_n and cmode_t
    * Add channel modes +n and +t
    * Save ourselves 3 dereferences
    * Clean 'removed' bans too
    * Tidier than a trinary op
    * Move BanItem into the class
    * Remove the transposition of @ and ! stuff, doesnt work right and not a good enough idea to be worth fixing, Fix mode parser so that if a handler nukes its parameter to an empty string, but its said it MUST have a parameter, (e.g. +b or +L) then thats equivalent to MODEACTION_DENY as we cant do anything without the param. The whole mode, and its parameter get 'eaten' and the next character is moved to instead.
    * Avoid throwing a std:ut_of_range exception when given a ban without ! or @ in it (whooops)
    * toomanyexclamation and toomanyat are no longer required here
    * Fix to check for colon (accidentally typed pos_of_dot)
    * Mask cleaning., nick -> nick!*@*, nick!ident -> nick!ident@*, host.name -> *!*@host.name, ident@host.name -> *!ident@host.name, transposed @ and !, swap @ and ! to form proper n!u@h ordering, Hostname determined by containing a dot or a colon
    * Make +b use CleanMask()
    * Started work on ModeParser::CleanMask()
    * A bit more debugging
    * 'Activate' +m by putting it in the constructor
    * Added cmode_m (channel mode +m)
    * Fix syntax example
    * GCC defines and <hash_map> -> "hash_map.h"
    * Tidy up space indents so Om and w00t dont murder me
    * Fix listmodes and modes with params
    * Add mode +b to active list
    * fix channel mode +b
    * Mode +b stuff, probably wont work yet
    * Tidied up checking in ModeParser::AddMode() and added a humorous comment about modes like '^' and '_'.
    * Add cmode_p (private)
    * Initialize mode handlers and watchers to 0 in the constructor, or mucho pain can ensue
    * Added masking stuff., Basically, so that we can hold user modes and channel modes in the same list, we use bitwise masking., We have a list of handlers, 256 in size 0 through 255, and to work out where a mode handler is dependent, on WHAT it is, we use this simple hashing algorithm (no collisions can occur):, (modeletter - 65) | mask, Where mask is 128 (10000000b) if its a user mode, or 0 (00000000b, duh) if its a channel mode., Smart, and much faster than using a map of pairs.
    * Added hashing stuff to hold both user and channel modes in the watcher/handler list
    * Mode parser WORKS! (for simple non-parameterized channel modes), Tested with channel mode +s.
    * Dummy framework to insert the class for channelmode +s
    * Header for cmode_s.cpp
    * Added cmode_s, skeleton mode handler for channel mode +s., The naming convention for this dir is as follows: cmode_* -> channel modes, umode_* -> user modes., Case sensitive mode letters on the end of the name such as cmode_s etc. Note,, this dir can only hold the core RFC modes, so we won't get name collisions e.g., S and s.
    * More stuff for m_pgsql in, provider-side API stuff semi-done, Add m_sqlv2 header for the new API
    * change std::string's to const std::string references for *Feature() funcs
    * Added InspSocket::WantWrite(), InspSocket:nWriteReady() and private data methods to make it work., See the XXX'ed section for a bit of minor craq
    * modules.*: Put some void* back to char*, sorry if they were only like that because of me...
    * Add pippijn under code contributors for m_connflood
    * Added docs for conflood
    * Change InspSocket's private members to only be protected, I couldn't find any other way to do this before we get around to rewriting the socket engine., Commit very first, very alpha, not-very functional version of the PostgreSQL module. It compiles..and that's..err..about it
    * Someone made silence require 1 parameter, so no way to list the silence entries
    * Add m_connflood, pippijn's connect throttle module (now we are offering another paid unreal feature for nothing )
    * Cleanups, change ugly if(\!*line.c_str()) to if(line.empty()); remove some craq..
    * Make spanningtree compile again
    * Enhance with new numerics for latest turkish moron detection
    * relocate the Move* methods to private: where they belong, rename erase_factory and erase_module to be more appropriate EraseFactory and EraseModule methods
    * Make WritePID a public function of class InspIRCd
    * Move SetSignals(), Start() and DaemonSeed() into private methods of class InspIRCd, move MakeLowerMap() into private: section
    * Change WriteChannelWithServ and it's _NoFormat to take a const char* servername rather than char* - although it doesn't seem to be used :<, Lose some more casts in m_spanningtree, unneeded because of above changes, Make xline_set_creation_time() take const char* rather than char* for it's first parameter, lose more casts in spanningtree because of this, Make do_whois take a const char* rather chan char* nick, lose yet more casts
    * Replace rather craq'y loop with a couple of std::string calls, Change GetServerDescription to take const char* rather than char*, Change userrec::server from char* to const char*, this is more 'correct' as it's not safe to modify it (pointer as returned by std::string::c_str()), Change WhoWasGroup::server, see above about userrec::server
    * forward port of r4092
    * Tweak to IS_LOCAL macro to exclude invalid fd's that are > MAX_DESCRIPTORS
    * *** Interesting fix ***, When a remote kill occurs, the user record for the remotely killed user may still hang around in the servers user list which is used when removing users during a netsplit., I managed to duplicate the old 'crash on netsplit' bug by sending a remote kill to a server, and then squitting that server without receipt of the corresponding QUIT., The fix now removes the user record explicitly upon remote kill (this also includes collisions)
    * Forward port of CullList and my bragging rights
    * And add the include to make all the modules compile...
    * This already adds the file and line number itself, call do_log() rather than log() then
    * You don't need to cast a char* to a char* to put it through a const char*...
    * Remove hardcoded filename prefix to log message, with the new macro these are un-needed., Remove un-needed cast, ffs guys, templates stop you needing to cast the stuff inside them... So why do you do it anyway? :<
    * Change log() to a #define, the real symbol is now do_log(), the new macro auto-prefixes all log messages with the file and line number where log() was called - should be nice for debugging and telling wtf is coming from what.Currently uses a (probably very standard) g++ extension to make the macro work. Shouldn't be an issue., You must make clean and rebuild all of insp.
    * Convert char* to const char* in InspSocket constructor prototype. Shouldn't break anything but ought to help lose some ugleh casts... >
    * Added missing return in Server::UnpublishFeature()
    * Added SQLQuery::GetError() and removed a lot of space indenting
    * More stuff for allowing hostnames in <bind> and <link> again - note there is a FIXME here.
    * Allow binding to hosts again in <bind> and <link>
    * Add m_services_account
    * We can re-enable special's security fix now - note this is good for boxes with one or more static ip's and still doesnt resolve the issue for smelly dynamic-ip users (well boo hoo )
    * Added auto-binding, picks the first ip in the <bind> tags that isnt localhost or INADDR_ANY, and auto binds to that IP to allow us to put back the security tweak
    * Temporarily disable special's security improvement until we have either/or bind= and mask=
    * Extra safety for user lists to not keep bad pointers hanging about
    * Dont allow /REMOVE of a uline, dont allow /REMOVE of a user who isnt on the channel (*slaps* Om)
    * Forwardport of safety fixes for Write* functions
    * Forward port of samode edits
    * Remove un-needed cast, I have a horrible feeling I'll get stabbed for this. Please let me know before you do...
    * m_services_account - now with 100 percent more elite.
    * Forward port of server link DDoS/oper flood fix
    * Fix for ./inspircd restart not working half the time
    * Added Server:ublishFeature(),, Server::UnpublishFeature(),, Server::FindFeature()., See comments in modules.h for usage
    * Class Request and class Event now take a void* in their constructor to save on a cast., Please note that the data type *returned* by GetData() in both cases is still char*, as, C++ will not let you return a void*. This to be addressed by someone else with templates, when they have the time.
    * Don't allow non-ulines to kick ulines from channels - return numeric 482 if this is attempted (you are not a chanop) with different text
    * Forward-port CBAN expiry fix
    * On remote kill, send KILL notice. mIRC doesnt seem happy with just the STANDARD message, it wants specially crafted quit notices too, but i say fuck mIRC.
    * Bring forward fix for w00t., Note - umode +r may not be removed from a user when you svsnick them. Svsnick is not designed for this, type of "abuse" anyway and usually svsnick will only be used on someone who has no +r.
    * Finished m_check. I am the best. It only took me 3 months
    * Now only logs commands from local opers, that are oper commands they have permission to execute
    * Fix for m_ssl_openssl dying if the DH params file doesn't exist, compiles but untested cause I'm sleepy
    * Helper script for rpath of mysql
    * Now uses mysql_config and mysql_rpath.pl
    * Nicer SQLQuery::Sanitise
    * Look at this further later - 64 bit fixes
    * Remove reference to secret ChatSpike CC # detection features
    * If the <ALLOW> or <DENY> tag specifies an ip, and this user resolves,, then their ip will be taken as 'priority' anyway, so for example,, <connect allow="127.0.0.1"> will match joe!bloggs@localhost
    * Fix for mode string getting cut, breaks on some +L
    * Fix for segfault if a user quits before their ident is complete, due to session limit reached, Do this by checking their pointer in the fd_ref_table against the pointer we got when we started, the lookup, so we can know if its been invalidated or not (just in case the OnClose occurs, before we NULL the user)
    * Fix for collisions when clock is out
    * Fix for an/a and vowel detection in "is an ircop" numeric, noticed by Smartys
    * Fix for bug found by douglas - when replace= is undefined value (probably due to config error) a crash can occur, and this crash can (and will) propogate to other ircds on the network
    * Fixed logic for OnWhois "is using SSL" numeric. Was broken: required the user to have the 'ssl' extensible AND be in the listen ports, so it didnt work on remote users which didnt have the listen port., Now properly checks to display by using: if(dest->GetExt("ssl") || (IS_LOCAL(dest) && isin(dest->port, listenports)))
    * Prevent crash when displaying error for server already existing (this only happens for lauren anyway)
    * Apply mirq's optimization patches
    * - Documentation fix: SELinux is not a distribution, but a patchset. Clarify.
    * Broken kline matching in connect code (reported by LeaChim)
    * Fix bug when knocking on non-existent channel
    * Increase length of dhost
    * Fix output corruption when host is exactly 64 chars long
    * Fix for crash on: /OS RAW PUSH non-existent-nick :::nick!ident@host KICK #chan nick :any reason, (yes, REALLY.)
    * Fixed to work with -j 3, On multiprocessor systems, do the initial make command with: make -j 3 (or whatever) and the -j option will recurse to the other make processes.
    * Let ulines do NOTICE/PRIVMSG $* without oper again, so that OS GLOBAL on services packages is fixed
    * LeaChim is a grammer nazee
    * Added satmd's multi-channel patch, and matched with inspircd coding-style and indent-style
    * Add new arguments to ./inspircd, 'screendebug' starts insp inside gdb and detaches the session, 'valdebug' starts insp inside valgrind, valgrind will start gdb in the event of a crash, 'screenvaldebug' (ugleh name :[) does the same but runs valgrind in a detached screen session
    * Oper logging module -- this still needs test compiling and test running
    * Ignore EAGAIN when write()ing
    * Checks for negative fd's when adding them to the socketengine so we can generate less debug output
    * New header at the top of this file clarifying gplv2 only (we hadnt made it clear in this package before)
    * Forwardport (yes those do happen)., Because of a re-arrangement in the way sockets work, there is a chance a socket can still be in existence, after the user its connected to (in the case of ident) is no longer valid. Neatly NULL the value so we can, avoid goofing around in bad data.
    * Need checks in two places for escaping to work., First check when reading lines, to let the parser know that \" etc dont open new quotes or close them,, then second check when parsing that line so that the parser knows that \" etc dont delimit a value.
    * Ability to use the \ symbol to escape ascii values in a tag, e.g.:, <server name="\"Bollocks\" Said pooh, as he cought his testicles in the vice!">
    * change to ability for QueryCount to return -1 for both of the 1.1 sql api's
    * In 1.1, we return a negative value when QueryCount has a downed connection - not changed in 1.0 for backwards compatibility
    * Merge of peaveydk's diff (at last)
    * Synching of channel TS after a whole channel has been sent., Please note that because a channels joins may consist of multiple FJOINs we cannot just sync the TS at the end of every FJOIN command otherwise we WILL get a desync., Instead, we send a command after the last FJOIN for a channel which tells the other servers it is now ok to sync that channels timestamp., (still to document: SYNCTS command in protocol docs)
    * Error checking of raise(), so that if theres no coredump and raise fails, we know why
    * signal/raise in the sigsegv handler to re-raise the sig for a coredump
    * In static build save munged files as .m_name_static.cpp rather than m_name_static.cpp so they arent immediately visible, and less likely to be edited
    * When i find out what IDIOT changed all the module_init's to e.g. devoice_init and chanprotect_init, severely breaking them for no reason, im gonna trout them good!
    * maxbuf -> maxquit (this isnt finished yet)
    * Check for NULL, set pointers to NULL after deletion
    * delete operator tracking in debug mode (using a macro -- live with it.)
    * Changed first of files to match new location of headers
    * Movement of cmd_* headers into include/commands (this is incomplete)
    * This dir will hold headers for mode handlers
    * Extra stuff to explicitly link execinfo.so
    * Add /usr/local/include (why isnt this included as default?!)
    * execinfo - backtrace() and backtrace_symbols() where available
    * Added detection of execinfo.h (part of the libexecinfo port on freebsd, default in glibc) -- can be used to make inspircd generate its OWN backtraces :>
    * Fix for crashes in m_ident (should work)
    * Fix reversed parameters in x:y - joinflood was not broken
    * make make install install ssl stuff
    * Better handling of dependencies, doesnt always rebuild mode handler files now
    * Someone didnt test their fixes in cygwin *gets tortoise torture kit*
    * Delete spanningtree_ng for now, it breaks cygwin compile - and has no changes. Commit /check, though it's probably broken at current.
    * Made FindMatching(Global|Local) available via users.h
    * Remove an extern, partly because it's unused, partly because it then gets shadowed by something else, but mostly because it confused the hell out of me :/
    * Route some more stuff through socket.h and hash_map.h. Add #define protection to timer.h and remove some unneeded includes and externs from timer.cpp
    * Routing more socket includes through socket.h
    * Typedef an ugly iterator, dont send mode string if no modes were in the output sequence
    * A few more typedefs defined and put into use.
    * Add time.h include to inspircd.h. Random cleanups in channels.cpp, mostly using the typedef'ed names already defined rather than having the full template names everywhere. Remove some unneeded casts too.
    * Assorted changes here, Extend() is not templated so you can pass it any pointer type and it will automatically be cast to char* for you. Also some speedups, store an iterator rather than calling find() once to check if it exists and again to access the value.
    * INSERT foot INTO mouth WHERE user='Brain'
    * I hate HATE HATE templates.
    * istringstream not ostringstream
    * Extra allowance for modes which have different number of params when being set to being unset (read as: jro smoking craq)
    * Start of new mode parser
    * Om's way is better and lets watchers change mode parameters for the modes theyre watching
    * Start of mode parser refactoring
    * Shuffle some more includes around, const reference a few functions in inspircd.*
    * Remove references to inspircd_io from these, stop configure making all the modules depend on it too. And remove some more un-needed includes
    * Remove uneccessary socket includes now included in socket.h
    * Helps to svn add these too
    * And remember to add this one, just a little header with the #ifdef GCC3 ... stuff that's repeated in about 56543432 places
    * Split inspircd_io.* insp inspsocket.* and configreader.* with a few odd bits going into inspircd.*, doesn't look like I've broken anything...
    * Remove some unused headers and unneeded casts
    * - first steps towards a working IPv6 port. I'll work more on this tomorrow. :-P
    * - useless IPv6 yesno() for now
    * - fork off spanningtree module for UUID stuffs
    * Make WriteServ use WriteServ_NoFormat, code duplication = bad >:/, Change some weirdness using a stringstream for a simple append., Force a flush of all opers' write buffers after they get the oper notice about a /DIE
    * Slight optimisation to config reader, looks nicer even if it's not faster., Make ./inspircd script use -nolog (it already used -debug, which didn't exist until now!?), Add commandline options -nolog and -debug, -debug forces all log messages to be output regardless of level. -nolog stops the logfile , being written, so you can run with -debug without filling up your disk., make clean && make install, apparently some of the core doesn't depend on inspircd_io.h in the makefiles..so it'll probably segfault if , you don't.
    * Same error message somewhere else, and actually define the const char* version of ConfVarEnum so it doesn't just return 1 all the time...
    * Change error message so it's not 'out of range' when a tag doesn't exist
    * Holy christ that was a LOT OF SPACES. TABS, USE THEM, LOVE THEM, APPRECIATE THEM - we now have no stupid spaces. This was mostly a mass find/replace, so some indentation may be stuffed. Minor issue, though.
    * More verbose error output
    * Connection refused bug is FIXED!!!!
    * Remove 'validation' for server description and network name (didn't do anything)
    * Tweaks to hopefully prevent 100% cpu use issue
    * Missing helperfuncs and someone took writeopers out of globals.h
    * And the bit I missed... :/
    * Remove a load of unneeded debugging output
    * Just indentation tidyups, dont worry i didnt break your lovely parser <3
    * move do_whois to cmd_whois, i'm stopping now. really.
    * Add WriteOpers_NoFormat, now to remember what I wanted it for
    * Extra error detection, thwap me if this comes up with false positives
    * Remove duplicate error messages
    * Die properly on included config file errors
    * Undo the last tweak, which broke it, and show filenames in the error messages
    * combine a couple of if()'s
    * Remove some random unneeded casts
    * All new shiny config parser, there's probably some bugs there somewhere but hey...I've been up all night. make clean before you try and compile this. Really. And nobody dare complain
    * Forward port the removal of -nolimit (doesn't seem to be in the current command line stuff regardless?)
    * This doesn't belong in userprocess.cpp.
    * Test fixes for cpu eating issue
    * Fix Odin & Dune's obscure bug when you have the name of a config variable within the value of another variable in a single tag <--- Phew
    * Initialise OperSpyWhois value to false, just in case.
    * Remove un-needed strlen and pointer in duration()
    * split_clist will never send lines over 512 chars, also should be faster
    * Fix to prevent adding empty phrases to +g list
    * Copy of 1_0_stable fix for malformed (>64 chars) hostnames.
    * Undo me screwing stuff up
    * Add amd64/linux to list of OS'es tested, but mainly CIA test
    * Fixes for stability of connects (these didnt make it into trunk!!!)
    * Put <optionsperspywhois> in the example config, off by default
    * Make the comment make sense ;<
    * Make chlist() use an ostringstream, should be faster
    * Add configuration option <optionsperspywhois> to set if opers see invisble and private channels in /whois, also clean up the code for whois a bit, removing more uneccessary casts.
    * Make /whois code a little prettier, make /whowas show real host as well as displayed host and show real server/fake server correctly (real to opers). Remove some unecessary casts
    * Backport of 100% cpu on connection refused bug, Technical details: Set this->ClosePending on connection refused error so that within one cycle it is removed from the list
    * Cleanups. Don't have a colon with no part reason. Parameter order not changed
    * Allow for safer cloaking of hosts > 64 (backport from stable)
    * Fix for desync in channels with keys a'la services
    * "I'm a tester, honest!"
    * Indentation fixes, and stop it snoticing on every join by an override-allowed oper when there's no limit set
    * if(chan->limit >= Srv->CountUsers(chan)) snotice & allow!?
    * Undo this test commit too..
    * Test commit with new trunk/branches
    * Experimental (it compiles..) channel support for /check. Not yet finished, but meh.
    * Founders CANNOT be kicked, so don't let them be removed either.
    * Remove unused variable
    * Removed unused check for valid channel name - if it's invalid, it won't exist in the first place ;p