No development has been done on this project for over 2 months now. This is because a number of smaller and more urgent projects have taken priority.
However, I expect development to resume within the next month. Also, a lot of the core design will be redone using stricter and more appropriate techniques.
Atfer some testing of the cmd_privmsg module, I decided that the existing queue processing system (one line in and out per server cycle) is inadequate for dealing with client data.
Therefore, I am currently testing a new queue system that attempts to empty both a clients recvq and their sendq on each server cycle. This new system will also send many lines of data with a single write() call. This has so far made the server much smoother from a clients point of view. ... read more
After some experimentation with loading shared libraries, I have decided to implement a module system into the IRCd. All of the commands will be loaded from modules, and it theory it will be possible for the server admin to enable/disable and remove/add commands at runtime.
Well, writing my own async DNS resolver proved to be more difficult than expected. However, I have just converted the IRCd to use the c-ares resolver library. This library seems to be a lot faster than UDNS, and I have so far not experienced any unexplained errors.
One issue that does need to be addressed is DNS queries finishing after a client has exited (and thus their pointer now invalid) and attempting to use clients data. To resolve this I will have the DNS callback functions report finished requests in a "DNS Query queue", which will later be checked for pending clients requests.
Well, the UDNS library is causing too much trouble. Even with a conversion from vectors to linked lists, the library functions seem to magically mess up client data.
Other async DNS libraries seem to be either non-functional or have no good documentation. Therefore I have decided to build async DNS functions directly into the IRCd, using UDNS as a guide.
The DNS resolver appeared to be doing strange things when it was given a cClient pointer. This caused fatal problems, such as segfaults involving almost every cClient member.
This has been resolved by passing the client's index to the DNS query rather than the pointer.