ChangeLog

2004-03-16 Bruce.Guenter.dyndns.org <bruce@lorien.untroubled.org>

- daemon/listdomain.cc: The code is internally NUL-terminated, so don't add another NUL on output.

2004-03-15 Bruce.Guenter.dyndns.org <bruce@lorien.untroubled.org>

- cgi/vadduser.cc, cgi/vaddalias.cc: Fixed several one-off bugs.
- commands/vupgrade.cc (open_table): Fixed up the test to see if the new vpwtable reader is valid.
- commands/dumpvuser.cc: Added new source.
- commands/vadduser.cc (add_alias), commands/vsetup.cc (setup_alias): Make sure even aliases have a userdir set.

2002-05-03 Bruce Guenter <bruce@lorien.untroubled.org>

- commands/vadduser.cc: Fixed incorrect usage note for vaddalias.
- lib/config/Makefile.am (noinst_LIBRARIES): Fixed the use of libstdc++ in showvconfig.

2001-03-07 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- commands/vcheckquota.cc: Fixed abbreviated error message.
- doc/FAQ.sgml: Added note regarding mixing system and virtual accounts.
- Moved from old "cli" library to renamed "cli++" library.

2000-11-20 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- lib/vpwentry/to.cc (to_record): Fixed typo -- flags is now 5 bytes, not 3.

2000-10-30 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- commands/vdeliver.cc (cli_main): Make 99 return codes from executed programs cause vdeliver to exit (with code 99) without delivering the message.
- lib/misc/exec.cc (execute): Don't silently ignore the 99 error code.

2000-10-27 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- commands/vchforwards.cc (cli_main): Fixed the same bug here as for daemon/lookup.cc -- need to lookup users with nodefault set.

2000-10-25 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- python/commands.py (adduser): Added the new has_mailbox parameter, defaulting to false.
- python/daemon.py (encode_str): Explicitly cast non-string objects to string before encoding.
- daemon/adduser.cc (CMD(adduser3)): Renamed the file adduser2.cc to adduser.cc; Renamed the adduser2 command to adduser3 to make the additional argument explicit.

2000-10-13 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- Most code was restructured to accomodate the below two changes.
- lib/vpwtable/vpwtable.h (class vpwtable_reader): Modified this interface to return a vpwentry*.
- lib/vpwentry/vpwentry.h (struct vpwentry ): Modified this data structure to rename "mailbox" to "directory", and add a "has_mailbox" flag. Also made the default constructor and set_defaults protected.

2000-10-10 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- daemon/stat.cc: Added a rewritten version of this support from Eugene Miretskiy to retrieve statistics about a maildir.

2000-10-07 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- commands/vpasswd2db.cc: Converted to use new vpwtable_writer interface.
- lib/vpwtable/vpwtable.h: Added new vpwtable_writer interface.

2000-10-05 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- python/daemon.py (Daemon.read_response_noraise): Fixed a bug in reading zero-length responses (like from listdomain) on certain OSes.

2000-09-30 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- Released version 0.96.9
- python/commands.py (adduser): Fixed a typo that prevents users without a mailbox from being added.

2000-09-15 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- authenticate/authvlib.cc (check): Always set VUSER, even if virtname is blank.

2000-09-14 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- daemon/main.cc: Exit immediately if a SIGPIPE or SIGALRM is caught.

2000-09-12 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- pyadmin/vmailmgr_lib.py (Flag.html): Added this method to print out a HTML select list with the correct item selected.
- pyadmin/vmailmgr_sessiond.py: New program set up to track session status in memory instead of on disk.
- pyadmin/vmailmgr_pyadmin.py (cgi_main): Create a Context object for passing in to format_page.
- pyadmin/vmailmgr_parser.py (Context): Defined this context object that wraps context data. This will be extended to stack contexts. When doing a __getitem__, if the key is not found in the context dictionary, that key is evaluated as an expression with the dictionary as local variables. (Foreach.do_end): Pass the formatted sections to stack.append_or_print instead of printing them directly.

2000-09-11 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- Removed all old Python support code, replace by the new "pyadmin" interface.

2000-09-05 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- daemon/dispatch.cc (dispatch_cmd): Don't add "-virtuser" to baseuser name if virtuser is empty.

2000-09-04 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- python/vmailmgr_cgi.py.in (Session): Added prototype for new class to manage session data.
- daemon/check.cc (CMD): Simplified the logic, elimited the return value. Now returns either error or OK.

2000-09-01 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- doc/FAQ.sgml: Added section on long POP3 logins.

2000-08-22 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- commands/vdeliver.cc (deliver_partial): Fail permanently if: the open failed, EDQUOT is defined, and the error number is EDQUOT.

2000-08-15 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- daemon/deluser.cc (CMD): Use new form of vdomain::deluser.
- lib/vpwtable/reader.cc (vpwtable_reader): Removed the call to end here, which produced a missing reference to vpwtable_reader::end.

2000-08-13 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- commands/*.cc: Moved all the POD man page documentation into the source files using a new CLI documentation generator.

2000-08-11 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- commands/vdeluser.cc: Added an option to prevent vdeluser from deleting a user with a mailbox.
- lib/vdomain/deluser.cc (deluser): Added a flag to make deluser not delete users with a mailbox.
- daemon/main.cc: Fixed up some of the cli_* values.
- doc/FAQ.sgml: Added note regarding difference between vmailmgr and vpopmail.
- lib/vpwtable/gdbm_read.cc (class gdbm_vpwtable_reader): Added this new subclass of vpwtable_reader.
- lib/vpwtable/cdb_read.cc (class cdb_vpwtable_reader): Added this new subclass of vpwtable_reader.
- lib/vpwtable/vpwtable.h (class vpwtable_reader): Removed the short-sighted conditional mess in this class with virtual methods.

2000-08-10 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- Released version 0.96.8
- authenticate/authvlib.cc (set_user): Call pwentry::export_env instead of doing it manually.
- lib/misc/pwentry_export_env.cc (export_env): Added this routine to export USER and HOME for a real user.
- commands/vcheckquota.cc (link_softquota_message): Fixed bug in multiple use of atoi.
- doc/HOWTO.sgml: Added a note on vsetup.

2000-08-04 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- doc/FAQ.sgml: Added notes on location of qmail-autoresponder and the CVS repository.
- daemon/autoresponse.cc (autoresponse_read): If the normal autoresponse file can't be read, try the disabled file. (autoresponse_status): Added status command.
- commands/vcheckquota.cc (link_softquota_message): Added code to symlink in warning message if softquota fails. This will link the message in each time soft quota fails.

2000-08-03 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- commands/vdeliver.cc (cli_main): Make sure to rewind stdin before executing vdeliver-postdeliver.
- daemon/lookup.cc: Rewritten to output the entire virtual user data instead of just the mailbox and aliases.
- commands/vcheckquota.cc: Changed many instances of "int" to "unsigned". (check_quota): Always check incoming message size, and check max count even if no quotas apply.
- lib/misc/exec.cc (execute_one): Fixed a bug where this would return the raw status value instead of WEXITSTATUS(status).

2000-08-02 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- daemon/autoresponse.cc (autoresponse_write): Applied bugfix that would allow disabled autoresponses to be written.

2000-08-01 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- commands/vcheckquota.cc (exit_msg): Fixed typo (used to say "vdeliver:"). (cli_main): Fixed another typo -- VUSER_MAILDIR is not set, plain MAILDIR is.
- authenticate/checkvpw.cc (main): Removed call to execute checkvpw-postsetuid.
- authenticate/authvlib.cc (set_user): Added a hook to execute the proper presetuid script. (authenticate): Added a hook to execute the proper postsetuid script.

2000-07-31 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- daemon/lookup.cc (lookup_and_validate): Set the "nodefault" flag in vdomain::lookup to true instead of false -- it's never correct to look up the default user in the daemon.

2000-07-18 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- commands/vcheckquota.cc: Added this new program, originally authored by Eugene Miretskiy, and subsequently modified.

2000-07-17 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- doc/HOWTO.sgml, doc/FAQ.sgml: Updated documentation.

2000-07-05 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- Released version 0.96.7.
- lib/vpwtable/cdb_read.cc: Added CDB support for the vpwtable reader class.
- daemon/listdomain.cc (CMD_FD): Adjusted to use the new vpwtable reader.
- commands/listvdomain.cc (cli_main): Adjusted to use new vpwtable reader.
- lib/vpwtable/gdbm_read.cc (vpwtable_reader): Added this new class to replace the stream reading support from the vpwtable class.

2000-07-04 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- lib/vpwtable/gdbm_getbyname.cc (getbyname): Lowercase the name before retrieving it.
- commands/listvdomain.cc (cli_main): Exit with error if listing an individual user fails.
- lib/vpwtable/gdbm_get.cc (start): Fixed missing gdbm_firstkey.
- commands/vpasswd2db.cc: Added new utility to convert plain text password tables into whatever vpwtable format was configured.

2000-06-25 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- python/vmailmgr.py.in: Added deluser and chattr commands.

2000-06-24 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- doc/configuration.texi (socket-file): Reinstated this config section.
- daemon/autoresponse.cc (autoresponse_delete): Added a new command to delete the autoresponse data.
- lib/misc/maildir.cc (delete_directory): Renamed from delete_maildir.
- daemon/autoresponse.cc (autoresponse_write): Create the autoresponse directory if it does not already exist.

2000-06-19 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- lib/vpwtable: Added GDBM support in the gdbm_*.cc files.
- lib/vpwtable/cdb_vpwtable.cc: Made the ".cdb" string a constant.
- lib/vpwtable: Renamed all the .cc files to "cdb_*.cc".

2000-06-14 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- doc/configuration.texi: Added notes on the autoresponse configuration items, removed the notes on max-fork and socket-file.

2000-06-13 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- daemon/main.cc (cli_main): Rewrote main to use the cli library. This removes extra command line parsing code and incidentally fixes a problem with random not being initialized.
- daemon/log.cc (log): Revised handling of printing PIDs.
- daemon/dispatch.cc: Removed "forkstat" command.
- daemon/main.cc: Removed support code needed to create and accept connections on a UNIX domain socket, in favour of using the new ucspi-unix package.

2000-06-01 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- Released version 0.96.6
- commands/vdeliver.cc (cli_main): Fixed typo in order of operands in call to exit_msg.
- lib/misc/map_table.cc (map_table): Lower case all keys to allow for case insensitive comparisons.
- lib/misc/lookup_domain.cc (find_virtual): Fixed bug: domain names are not case sensitive.

2000-05-31 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- python/vmailmgr.py.in (VUser.from_binary): Fixed some bugs in the conversion of flags.

2000-05-25 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- python/vmailmgr_cgi.py.in (print_html): Added code to print out a HTML error if the requested file could not be printed. (wrap_print): Print out basename+"-success" on success, and provide a default error response if the error file does not exist.
- daemon/daemon.h (CMD): Removed a bogus "const" from the declarations of the CMD and CMD_FD macros.
- daemon/autoresponse.cc (CMD_FD): Added proper command logging to this command. (CMD_FD): Fixed type -- a virtual user's password is acceptable.
- daemon/log.cc: Added a new LOG_MESSAGE constant.
- doc/FAQ.sgml: Added a brief section on how to configure qmail+patches for use with vmailmgr.
- doc/configuration.texi (qmail-root): Added this missing section.

2000-05-24 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- python/vmailmgr_cgi.py.in (cgi_main): Trap trying to run the program outside of a CGI environment.
- python/vmailmgr.py.in (VUser): Added this class to represent the data associated with a virtual user. A special __getitem__ routine allows the data to be read as a dictionary. (Daemon): More code reorganization in this class. (listdomain): Added this command, which returns a dictionary of all the users in the domain. (adduser): Added this command to add a virtual user. (autoresponse): Added this command, which executes the daemon "autoresponse" command.
- python/vmailmgr_cgi.py.in (wrap_print): Added this new routine, which wraps a call to a vmailmgr command in a try/except block, and prints an output file based on the results.
- Added SGML documentation from Dan Kuykendall.

2000-05-16 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- python/vmailmgr_cgi.py.in: Moved all the CGI specific functionality into this new module.
- python/vmailmgr.py.in: Removed the "Response" class and turned error responses into exceptions. The server socket is not closed at the end of a command to allow a listdomain command to read more data after the initial response.

2000-05-09 Bruce Guenter <bruce@bruce-guenter.dyndns.org>

- commands/vdeliver.cc (cli_main): Error exits from executing "vdeliver-predeliver" would unconditionally result in a temporary failure for qmail. Fixed to return the actual error number to qmail.

2000-05-02 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- cgi/vchforwards.cc (CGI_MAIN ): Fixed an internal glitch -- the new "do_enable" and "do_disable" internal variables were duplicated.
- daemon/lookup.cc (lookup_and_validate): Modified to use the new set_defaults method.
- commands/vchattr.cc: Make size limits refer to bytes.
- doc/configuration.texi: Indicate that size limits are in units of bytes.
- commands/vadduser.cc: Make size limits refer to bytes everywhere.
- commands/vsetup.cc (setup_alias): Modified to use the new set_defaults method.
- commands/vpasswd2cdb.cc (getpw): Removed set_defaults call, since from_record calls set_defaults after doing conversion from the old format data.
- commands/vaddusers.cc (add_one): Modified to use the new set_defaults method.
- lib/vpwentry/from_old.cc (from_old_record): Modified to use the new set_defaults method.
- commands/vadduser.cc: Modified to use the new set_defaults method.
- lib/vpwentry/defaults.cc (set_defaults): Add a flag to set the creation time to either now (true) or 0 (false -- for old records), as well as a flag to set the boolean flags.
- lib/misc/strtou.c: Use UINT_MAX instead of (unsigned)-1.
- lib/config/showvconfig.cc.in: Use UINT_MAX instead of (unsigned)-1.
- lib/config/configrc.in: Use UINT_MAX instead of (unsigned)-1.
- lib/misc/lookup_domain.cc (find_virtual): Use UINT_MAX instead of (unsigned)-1.
- lib/vpwentry/defaults.cc (set_defaults): Use UINT_MAX instead of (unsigned)-1.
- lib/misc/utoa.cc (utoa): Use UINT_MAX instead of (unsigned)-1.
- lib/vpwentry/from_ver1.cc (from_ver1_record): Set the flags before returning.
- lib/vpwentry/from_old.cc (from_old_record): Set the flags before returning.

2000-04-19 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- doc/vchattr.pod: Added note regarding personal information.
- doc/vmailmgr-cgi.texi (Top): Added note regarding personal information.
- commands/vchattr.cc: Allow changing the personal information.
- lib/vdomain/chattr.cc (chattr): Added code to handle changing the personal information.

2000-04-18 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- doc/FAQ.texi (Does vmailmgr support IMAP?): Updated to describe current status of IMAP support.
- daemon/dispatch.cc: Added autoresponse dispatch entry.
- daemon/autoresponse.cc: Added autoresponse command from Mike Bell.

2000-04-14 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- Modified the spec file to put the Courier IMAP module into a seperate package.
- Copied the necessary sources from Courier IMAP to build a minimal stand-alone libauthmod in order to build the authentication module without needing the Courier IMAP sources.

2000-04-13 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- Released version 0.96.5
- doc/vchattr.pod: Wrote a man page for the vchattr command.

2000-04-12 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- commands/vdeliver.cc (cli_main): Check if the account has expired before delivering.
- authenticate/authvlib.cc (check): Check if the acount has expired and fail if so.
- lib/vpwentry/export_env.cc (export_env): Set "VUSER_MAILBOX_ENABLED" to the new flag.
- authenticate/authvlib.cc (check): If looking up the base user fails, and virtual_only is set, return instead of failing hard.
- daemon/chattr.cc (CMD): Allow mailbox enabled flag to be changed by virtual users.
- commands/listvdomain.cc (show_user): Print out "(disabled)" next to the mailbox directory if the "is_mailbox_enabled" flag is not set.
- cgi/listvdomain.cc (show_user): Adapted to using vpwentry::from_record instead of vpwentry::from_ver1_record.
- lib/vpwentry/vpwentry.cc: Set the flag defaults here on creation instead of in set_defaults.
- lib/vdomain/chattr.cc (chattr): Modified to use the new vpwentry is_mailbox_enabled flag.
- lib/vpwentry/from_ver1.cc (from_ver1_record): Made this a protected non-static method.
- lib/vpwentry/from_ver2.cc (from_ver2_record): Made this a protected non-static method.
- lib/vpwentry/from_old.cc (from_old_record): Made this a protected non-static method.
- lib/vpwentry/from.cc (from_record): Made this a non-static method.
- lib/vpwentry/decode.cc: Moved the common pieces from from_ver1 and from_ver2 into seperate routines and moved them here.
- lib/vpwentry/from_ver2.cc (from_ver2_record): Added this routine to do conversions from the new binary record format.
- lib/vpwentry/to.cc (to_record): Modified to create the new binary record format.
- lib/vpwentry/from_uint.cc (from_uint): Moved this routine out of from_ver1.cc, as it's common to both ver1 and ver2 (and other) records.
- lib/vdomain/chattr.cc: Returned the extraneous definition of strtou from here.
- lib/config/read_uns.cc (read_uns): Coded to use our strtou.
- lib/misc/strtou.c (strtou): Renamed the C++ source to a C source, and added a header file. Added a null-pointer and leading space check.
- lib/vpwentry/vpwentry.h (struct vpwentry ): Removed the enable/disable routines and added a "is_mailbox_enabled" boolean flag.

2000-04-11 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- cgi/vadduser.cc (CGI_MAIN ): Added code to handle adding forwarding at the same time as the user.
- lib/misc/lookup_baseuser.cc (lookup_baseuser): Modified to use mystring::left instead of a hacked-up constructor call.
- cgi/vchforwards.cc (CGI_MAIN ): Added code here to handle enabling and disabling the mailbox.
- commands/vchattr.cc: Added handling in this code for the new flag.
- lib/vdomain/chattr.cc (chenabled): Added this function to enable or disable delivery to a virtual user.
- lib/vpwentry/is_enabled.cc (is_enabled): Modified this routine to return false if no mailbox path is set.
- commands/vdeliver.cc (cli_main): Handle the "enabled" flag here by not doing mailbox delivery if is_enabled returns false.
- lib/vpwentry/is_enabled.cc (is_enabled): Created this routine to determine if the account has been disabled.
- lib/vpwentry/disable.cc: Created routines here to enable and disable an account by removing and creating a "disabled" file in the virtual user's mailbox directory.
- Released version 0.96.4
- lib/misc/exec.cc (presetenv): Changed this routine to allocate a new string (char*) that it never frees. This seems to fix the problems with garbage making its way into the environment.

2000-04-10 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- lib/vpwentry/export_env.cc (export_env): Moved the setenv routine that exported a vpwentry to this method of vpwentry.
- lib/misc/exec.cc (presetenv): Renamed "setenv" to this, to prevent confusion with any built-in "setenv" functions.
- authenticate/authvmailmgr.cc: Made the user name, pass phrase, and domain name into globals, to prevent their memory from being deallocated prematurely.

2000-04-09 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- doc/vmailmgr-cgi.texi: Adjusted this documentation to fit the new CGIs.
- cgi/vaddalias.cc (CGI_MAIN ): Modified to handle a comma-seperated list of destinations.
- cgi/vchforwards.cc: Renamed vchalias to this file, to match the command-line program's name change. (CGI_MAIN ): Modified to handle a comma-seperated list of destinations.

2000-04-07 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- Updates for new mystring and fdbuf libraries.
- commands/vsetup.cc: Added a "quiet" flag.
- commands/vpopbull.cc: Added a "quiet" flag.
- commands/vpasswds.cc: Added a "quiet" flag.
- commands/vpasswd2cdb.cc: Added a "quiet" flag.
- commands/vpasswd.cc: Added a "quiet" flag.
- commands/vdeluser.cc: Added a "quiet" flag.
- commands/vaddusers.cc: Added a "quiet" flag.
- commands/vdeliver.cc: Added a "quiet" flag.
- commands/vchforwards.cc: Added a "quiet" flag.
- commands/vchattr.cc: Added a "quiet" flag.
- commands/listvdomain.cc: Added a "quiet" flag.
- commands/vadduser.cc: Added a "quiet" flag.
- authenticate/authvlib.cc (check): make the virtual / non-virtual decision here rather than in authenticate, in order to handle "baseuser-virtuser" type usernames. This fixes the Courier-IMAP auth module problems.

2000-04-06 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- doc/FAQ.texi (Upgrading from Previous Versions): Added this section to answer questions regarding what needs to be done to upgrade to the current version.

2000-04-05 Bruce Guenter <bguenter@daedalus.bfsmedia.com>

- Released version 0.96.3

2000-04-04 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- doc/vmailmgr-cgi.texi (Top): Expanded the "vadduser" section to explain the new optional "userdir" field.
- cgi/vadduser.cc (CGI_MAIN ): Modified to use the new adduser2 interface.
- cgi/vaddalias.cc (CGI_MAIN ): Modified to use the new adduser2 interface.
- daemon/dispatch.cc: Removed dispatch entries for adduser, addalias, and addaliasp.
- daemon/adduser2.cc (CMD): Added this new command, which combines the functionality of adduser, addalias, and addaliasp.
- daemon/addaliasp.cc (CMD): Modified to use build_forwards.
- daemon/addalias.cc (CMD): Modified to use build_forwards.
- daemon/adduser.cc (CMD): Only add non-empty forwarding addresses. (build_forwards): Moved the forward-list building code common to adduser, addalias, and addaliasp into this routine.
- daemon/main.cc (handle_connection): Log command response before attempting to send data back to client. (abortreq): Log abort code before closing FD. (decode_data): Removed the test to check for empty parameters, since some of the modules expect this possibility.

2000-04-03 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- authenticate/vauthenticate.cc (getdata): Buffer doesn't need to be static.
- authenticate/checkvpw.cc (getdata): buffer doesn't need to be static.
- lib/vpw/vpwtable.h (class vpwtable): Moved the vpwtable class definition into this file.

2000-04-01 Bruce Guenter <bruceg@daedalus.bfsmedia.com>

- Released version 0.96.2
- daemon/state.cc: Since the daemon always forks, remove all of the uid/gid saved state, and never restore it. This class should be renamed, since it does not really "save" any significant state.
- commands/vaddalias: Fixed quoting bug in this script.

2000-03-21 Bruce Guenter <bruceg@daedalus.bfsmedia.com>

- authenticate/vauthenticate.cc (main): Authenticate as virtual only, and print out the user data if authentication succeeds.
- authenticate/authvlib.cc (authenticate): Fixed typo declaring "baseuser" twice, preventing authentication from working.

2000-03-07 Bruce Guenter <bruceg@daedalus.bfsmedia.com>

- authenticate/vauthenticate.cc: Added this simple module that accepts domain name, user name, and pass phrase on stdin, and exits successfully if they can be authenticated.

2000-02-12 Bruce Guenter <bruceg@daedalus.bfsmedia.com>

- commands/vaddalias: Made this mini-program into a shell script.
- daemon/chattr.cc (CMD): Translate multiple values into a single NUL-delimited list.
- commands/vsetup.cc (cli_main): Added error messages if execution of vsetup-pre or vsetup-post fails.
- Removed old php3 support and placed Mike Bell's PHP3 code in.
- Applied patches by Mike Bell to allow vsetup to run a command before and after executing.

2000-02-03 Bruce Guenter <bruceg@daedalus.bfsmedia.com>

- doc/FAQ.texi: Fixed typo reversing virtuser and baseuser.

2000-01-12 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- authenticate/authvmailmgr.cc: Completed initial coding of this module, still needs testing.
- authenticate/checkvpw.cc (fail): Removed unused string "r".

2000-01-05 Bruce Guenter <bguenter@bguenter.pointsnorth.com>

- authenticate/authvmailmgr.cc: Started authentication module for Courier IMAP.
- authenticate/authvlib.cc: Moved some of the functions out of checkvpw.cc and generalized them here.
- authenticate: Moved checkvpw directory here.

1999-10-12 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- checkvpw/checkvpw.cc (authenticate): Changed logic here to assume a missing entry in both locals and virtualdomains is intended to be local.

1999-10-08 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/*.cc: Modified to use new validate_forward.
- lib/misc/vdomain_chattr.cc (chdest): Modified to use new validate_forward.
- lib/misc/vdomain_validate.cc (validate_forward): Renamed validate_redirect to this, and removed the handling for a comma-seperated list of addresses.
- commands/vchforwards.cc (cli_main): Added code to validate the forwarding addresses.
- commands/vadduser.cc (make_user): Validate the forwarding addresses before creating the user.

1999-10-07 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/chattr.cc (CMD): Changed call to strtol to strtoul.
- lib/config/read_uns.cc (read_uns): Modified this routine to treat all negative numbers as -1, and changed the call from strtol to strtoul.

1999-10-04 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/FAQ.texi: Updated the answers and added information about how mail gets delivered.
- lib/misc/vdomain_add.cc: Removed both vdomain::addalias and vdomain::adduser.
- commands/vsetup.cc (setup_alias): Removed the use of vdomain::addalias.
- commands/vadduser.cc (add_alias): Removed the use of vdomain::addalias.
- commands/vaddusers.cc (add_one): Removed the use of vdomain::adduser and vdomain::addalias.

1999-10-03 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.96.1
- doc/vmailmgr-cgi.texi: Updated listvdomain documentation.
- cgi/listvdomain.cc (show_user): Merged show_mbox and show_alias into this one routine. (load_users): Fixed length of incoming code. (show_user): Changed formatting of aliases.

1999-10-01 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- cgi/listvdomain.cc: Recoded to use modified listdomain protocol interface.
- lib/misc/vdomain_add.cc (addalias, adduser): Call set_defaults on new vpwentry.
- lib/misc/vpwentry_from_old.cc (from_old_record): Call set_defaults on resulting vpwentry.
- commands/vadduser.cc (make_user): Call set_defaults on new vpwentry.
- daemon/lookup.cc (lookup_and_validate): Call set_defaults on new vpwentry.
- lib/misc/vpwentry.cc: Moved vpwentry::set_defaults into its own module, and removed the call to set_defaults from the constructors.
- lib/misc/vpwentry_from.cc: Made the from_old_record and from_ver1_record public, and moved them into their own modules.
- daemon/listdomain.cc (CMD_FD): Changed the protocol to strip the count from the initial message, to output each entry as a seperate response (with length and all), and to include full vpwentry details in each entry rather than requiring seperate lookups.

1999-09-30 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.96
- checkvpw/checkvpw.cc (main): Removed extraneous ; causing bug.
- lib/misc/exec.cc (execute): Skip over directories with identical parents, to prevent double execution.
- checkvpw/checkvpw.cc (check): Fixed inverted "nodefault" flag to domain->lookup.
- lib/misc/vpwentry_from.cc (from_record): Turned the if/else block into a switch statement.
- commands/vadduser.cc (set_defaults): Turn off creation of a mailbox if the base command name is "vaddalias". Also, use argv0base instead of "vadduser" for the command name.
- lib/misc/vpwentry_from.cc (from_ver1_record): Fixed bug in importing version 1 records.
- commands/vdeliver.cc (dump): The input needs to be rewound here the second time through, so rewind it always.

1999-09-29 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/listvdomain.cc (cli_main): Print out a banner before the listing.

1999-09-27 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/configuration.texi: Updated the configuration documentation to match current implementation aspects.
- lib/misc/exec.cc (execute): Changed behavior of execute to execute the global before the local directories, and to abort on any error, but translate 99 to 0 (no error).

1999-09-23 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- cgi/vaddalias.cc (CGI_MAIN ): Adjusted for changed parameter ordering.
- daemon/log.cc: Added several password-obscuring constants, rather than repeating them in each command.
- daemon/lookup.cc (CMD): Changed format of result.
- daemon/check.cc (CMD): Changed format of result to seperate parts with a NUL.
- daemon/addalias.cc (CMD): Now takes multiple destinations.
- daemon/addaliasp.cc (CMD): Changed order of parameters to allow for multiple destination parameters.
- daemon/log.cc (logcommand): Removed all varieties of this function except the one that takes a single "command" argument.
- daemon/adduser.cc (CMD): Added handling for a list of forwards.
- daemon/dispatch.cc (dispatch_cmd): Changed handling of commands: there is now a minimum and a maximum number of arguments, and the "decode_virtual" is a manditory -- if set, the "baseuser-virtual" format is not allowed. This means all the server commands now require seperate domain name and virtual user name arguments (all the CGIs do this anyways).
- daemon/check.cc (CMD): Added handling for mailbox and multiple forwards of virtual users.
- daemon/dispatch.cc: Added check back into the list of commands.
- cgi/vcommand.py (main): Adapted to new interface.
- cgi/vmailmgr.py: Revised the interface to be somewhat more object based, and tested minimally.

1999-09-22 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- cgi/listvdomain.cc (setup_format): Added handling for cell and title prefix and suffix strings, as well as cell, paragraph, and table alignment.

1999-09-20 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- cgi/vmailmgr.py: Split off most of the generic functionality from vcommand.py into this module, completed base CGI functionality.

1999-09-19 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- cgi/vcommand.py: Started this generic Python vmailmgr command CGI.

1999-09-16 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vdeliver.cc (cli_main): Adapted to the new execution framework.
- checkvpw/checkvpw.cc (check): Adapted to the new execution framework.
- lib/misc/exec.cc (execute): Removed the old "exec" framework in favour of this function, which traverses through the configuration directories and tries to execute the named file.
- doc/vadduser.pod: Updated this documentation.
- commands/vadduser.cc: Added an option to not create a mailbox for this user, allowing this program to be used in place of vaddalias. (add_user): Modified logic to optionally ask for a password.
- commands/vconf2dir: Fixed quoting when creating the new config files, and removed the "set -x" flag at the top.
- commands/vchforwards.cc (cli_main): Adapted this program from vchalias, and removed vchalias from the distribution.
- commands/vchattr.cc: Wrote this command to change a virtual user or users' attributes.

1999-09-15 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- checkvpw/checkvpw.cc: Login failures cause execution of "config/checkvpw-loginfail", and other failures cause execution of "config/checkvpw-error", both with an error message in $CHECKVPW_ERROR.
- commands/vdeliver.cc (deliver_partial): Rewrote loop so that looping will always sleep. If the file creation failed, it would previously loop immediately.

1999-09-14 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/FAQ.texi: Replaced references to vmailmgr.conf with vmailmgr/

1999-09-11 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/vpopbull.pod: Wrote a man page for vpopbull.

1999-09-10 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/vpwentry_auth.cc (authenticate): Wrote this new routine, to replace the use of crypt_cmp when authenticating virtual users.
- lib/misc/pwentry_auth.cc (authenticate): Wrote this new routine, to replace the use of crypt_cmp when authenticating users.

1999-09-07 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/listvdomain.cc: Added options to list only users, only aliases, or selected names listed on the command line.
- lib/misc/vpwentry_from.cc (from_ver1_record): Fixed off-by-one bug.
- lib/misc/vpwentry_to.cc (to_record): Fixed problem in creating records without any forwarding addresses.
- commands/vadduser.cc: Commented out extra-data handling.
- lib/misc/exec.cc (setenv): Commented out
- lib/misc/vpwentry.h (struct vpwentry ): Commented out the extra data string.
- cgi/vchattr.cc (CGI_MAIN ): Wrote this simple modification to vchalias, which can change any attribute.
- daemon/chattr.cc (CMD): Convert the attr string to an integer before running domain.chattr.
- lib/misc/vdomain_chattr.cc (chattr): Added attribute handlers for message size/count and account expiry.
- lib/misc/vdomain.h (class vdomain): Changed attribute name constants from strings to integers.

1999-08-23 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/configuration.texi (Search Order): Corrected a typo: the local directory is named ".vmailmgr", not "vmailmgr".

1999-08-21 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vadduser.cc: Added hard/soft quota options, and a password option for vaddalias.
- lib/misc/vpwentry.h (struct vpwentry ): Added hard/soft quota values.

1999-08-18 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vpasswd.cc (cli_main): Modified to call vdomain::chattr.
- commands/vpasswds.cc (change_one): Modified to call vdomain::chattr.
- cgi/vchalias.cc (CGI_MAIN ): Use ATTR_DEST instead of a hard-coded string.
- cgi/vpasswd.cc (CGI_MAIN ): Use ATTR_PASS instead of a hard-coded string.
- daemon/chattr.cc (CMD): Modified to call vdomain::chattr.

1999-08-16 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/vdomain_chattr.cc (chattr): Created this new routine to generalize attribute modification.

1999-08-15 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/exec.cc (exec_list): Takes a strlist parameter instead of a string.
- lib/misc/strlist.h (class strlist ): Removed the NUL constant.
- lib/misc/vpwentry.h (struct vpwentry ): Removed the NUL constant in favour of the new one in mystring.
- lib/config/read_list.cc (read_list): Adapted to use strlist::read instead of a custom list reading function.

1999-08-14 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/strlist.h (class keystrlist): Split off the functionality to handle keyed strings ("key=value" format) into a seperate class.
- lib/misc/vpwentry.h (struct vpwentry ): Adapted to using strlist functions.
- lib/misc/strlist.h (class strlist ): Moved the string list management into its own class.
- commands/vquota.cc: Started writing this quota management utility.
- commands/vdeliver.cc (cli_main): Fixed invocation of exec* functions.
- commands/vadduser.cc: Added code to set the default values of the new data items, and to set them when creating the user.
- checkvpw/checkvpw.cc (main): Fixed invocation of exec* functions.

1999-08-13 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/configuration.texi: Did some minor re-organization, and added a higher level note regarding environment variables and return codes for executed programs.

1999-08-12 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/exec.cc (setenv): Set environment variables for quota, message size, message count, creation time, expiry time, personal data, and all the extra data. (exec_list): Changed interface to all the exec_* routines: the error message string is passed as a parameter, and the return value is the error return code or zero.
- lib/misc/vpwentry_from.cc (from_uint): Modified to accept "-*" as the negative pattern.
- lib/misc/utoa.cc (utoa): Moved this routine into its own module.

1999-08-10 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- cgi/vpasswd.cc (CGI_MAIN ): Modified to call "chattr".
- cgi/vchalias.cc (CGI_MAIN ): Modified to call "chattr".
- daemon/dispatch.cc: Removed entries for chpass, chalias, and delalias.
- daemon/chattr.cc (CMD): Merged the functions of chalias and chpass into this new command.
- lib/misc/vdomain.h (class vdomain): Removed delalias command.
- lib/misc/vdomain_deluser.cc (deluser): Removed mailbox test to see if the named entry was a "user".
- commands/vdeliver.cc (inject): Handle failure properly here.

1999-08-09 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vdeliver.cc (deliver_partial): Rewrote the delivery mechanism to do partial file delivery. (write_envelope): Rewrote the envelope handling code to use mystring_iter (big simplification).
- commands/vconf2dir: Fixed non-portable increment statement.
- commands/vadduser.cc: Added options for the extra virtual user data, but not the code to handle the options.

1999-08-08 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vpasswd2cdb.cc (getpw): Call vpwentry::from_record, since the original text file format is compatible with its import routine.
- lib/misc/vdomain_validate.cc (validate_redirect): Call exists instead of lookup.
- lib/misc/vdomain_lookup.cc (exists): Wrote this routine to test if a name exists in a virtual domain.
- lib/misc/vpwtable_exists.cc (exists): Added this routine to do a simple check if a user exists, without doing any format translations.
- lib/misc/vpwentry.h (class vpwtable): Turned the "cdb" pointer into a void pointer to allow for easier extension to non-CDB formats.
- lib/config/*: Added new default configuration items for the quota and expiry items.
- lib/misc/vdomain_*.cc: Adpoted to the new vpwentry conventions.
- lib/misc/exec.cc (setenv): Always set MAILDIR to vpw->mailbox, which will be empty for an alias user.
- lib/misc/vpwentry.cc (set_defaults): Added this new routine to set the defaults on a vpwentry from the current configuration.
- lib/misc/vpwentry_from.cc (from_record): Moved this routine into its own module, and added parsing for the new fields.
- lib/misc/vpwentry_to.cc (to_record): Moved this routine into its own module.
- lib/misc/vpwentry.h (struct vpwentry ): Added new fixed fields to the structure: personal, quota, msgsize, msgcount, ctime, and expiry.

1999-08-07 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/vpwentry_getset.cc (get): Added this routine to get the value of a data variable. (set): Added this routine to add a variable to the data set, replacing its value if it already exists.
- lib/misc/vpwentry.cc (to_record): Rewrote this routine to output the new "version 1" record format.
- lib/misc/vpwentry.h (struct vpwentry ): Expanded this structure, replacing the "dest" field with "mailbox" and "forwards" items, and added a "datastr" field.
- lib/misc/vpwentry.cc (from_old_record): Adapted this code from the old vpwentry::from_record routine.
- Released version 0.95

1999-08-06 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vpopbull.cc (scan_bulletins): Modified the logic here to not fail if one of the bulletin scans fails.
- commands/vdeliver.cc (inject): Fixed missing argv[0] in call to execl here.

1999-08-05 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vpopbull.cc: Moved this program into the commands directory. (scan_bulletins): Added specific information to error messages.
- lib/misc/exec.cc (setenv): Moved the common code to set up the environment for virtual users into a common routine here from checkvpw.cc and vdeliver.cc.

1999-08-04 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/configuration.texi: Added sections for the new execution hooks.
- checkvpw/checkvpw.cc (check): Fixed this to set the VUSER environment variable immediately after looking up the base user.

1999-08-03 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- checkvpw/checkvpw.cc (main): Modified to execute the contents of checkvpw-postexec.
- lib/config/showvconfig.cc.in: Built this new program template to show the config parameters.
- commands/vdeliver.cc (cli_main): Make vdeliver execute a list of commands before and after doing the delivery. Will set $MAILDIR and $VUSER.
- checkvpw/vpopbull.cc: Moved bulletins.cc into this file, built a main routine, and added error logging.
- lib/misc/exec.cc (exec_list): Created this routine to execute a list of commands, returning the first error as a string. (exec_one): Created this routine to shell and execute a single command using "/bin/sh -c '<command>'".
- checkvpw/checkvpw.cc: Added a hook to execute a list of programs before and after running setuid. The "before" programs are read from the global config to avoid security holes. $HOME and $USER are set for both, and $MAILDIR and $VUSER are set for the "after" programs.

1999-08-02 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.94
- daemon/dispatch.cc: Commented out the "stat" and "statall" commands, that no longer do anything useful (the forking daemon causes the statistics to be meaningless). Also removed the code in "dispatch" to count invocations of a particular method.
- daemon/lookup.cc (lookup_and_validate): Fixed a false negation in the logic when checking for an existing virtual user.
- lib/misc/maildir.cc (mkdirp): Fixed off-by-one bug in recursive case.
- commands/vdeliver.cc: Fixed bug caused by assigning from an int to a bool through a pointer (since bools are only a single byte).
- checkvpw/checkvpw.cc: Rewrote this code to do the password checking directly without calling up to the daemon.
- daemon: moved lookup_baseuser into lib/misc, removed the call to setup a saved_state from it, and adjusted all the calls to lookup_baseuser in the daemon to fit.

1999-07-30 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vdeliver.cc: Moved this program from clients into commands, and made it work the the CLI library. (cli_main): Does a call to domain.lookup now instead of a server call. (read_me): Rewrote to use config->qmail_root() instead of a hard-coded /var/qmail. This is the last place (verified with grep) that has a hard-coded /var/qmail.

1999-07-29 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/config/config_read.cc (config_read): Fixed a typo: I had typed '=' instead of '+' to create the full name.

1999-07-27 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/chpass.cc (CMD): Calls the vdomain::chpass routine instead of doing it by hand through the vpwtable code.
- commands/vpasswd2cdb.cc (cli_main): Removed an extraneous call to end_getpw.
- lib/misc/vpwentry.h (class vpwtable): Added this new abstraction, a virtual password table, that contains all the low-level table manipulation routines. All other code has been adjusted to fit this model.

1999-07-26 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/lookup_domain.cc: Moved is_local and find_virtual into this file from daemon/lookup.cc.
- daemon/lookup.cc (CMD): Converted to using vdomain::lookup.
- daemon/check.cc (CMD): Converted to using vdomain::lookup.
- lib/misc/vdomain_lookup.cc (lookup): Moved the daemon function lookup_virtuser into this method.
- Inserted the latest cli library and adapted all the command line programs to handle the changes.
- Inserted the latest mystring class and adapted all the code to handle it.
- Rewrote the virtual user manipulation code from lib/misc/vuser*, and moved it all into the vdomain class (was struct). Adjusted all other references to use this new code.

1999-07-25 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.93
- daemon/adduser.cc (CMD): Prefix the user dir destination with "./".
- lib/misc/vuser_set.cc (vuser_set): Allow leading '/' in destination string, in addition to leading '.' and '&'.

1999-07-22 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vsetup.cc (setup_passwd): Modified to use the new string iterator class.
- lib/misc/stringiter.h (class mystring_iter): Wrote this class to provide an iterator over a newline (or NUL, even) seperated list within a string.

1999-07-20 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vsetup.cc (setup_passwd): Changed the alias seperator character from ',' to '\n'.
- lib/config/read_list.cc (read_list): Wrote this routine to read a config item containing a list of values.
- lib/config/config_readlist.cc (config_readlist): Wrote this new routine to read a list of values from a file, newline seperated.

1999-07-19 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/configuration.texi: Wrote this new document describing the new configuration structure, adapted from the now obsolete vmailmgr.conf.sample.

1999-07-18 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/config/read_*.cc: Moved the overhead for maintaining the cache into these read functions instead of duplicating it in each config variable function.
- lib/config/build-config.sh: Create a cache for each config variable in order to eliminate duplicate readings of a single variable.
- daemon/pwentry_table.cc (operator[]): Replaced the previous implementation (a cache) with one that just calls getpwnam. This avoids creating extra dynamic data in the form of many pwentry structures.
- daemon/lookup.cc (lookup_baseuser): Removed an extraneous re-creation of the pwentry returned from the pwentry_table.
- lib/config/read_*.cc: Removed the translation from '_' to '-' for filenames from the code and moved it into the build-config.sh script. This moves the constant conversion from run-time to build-time.
- lib/config/configrc.cc (configuration): Made the constructor take a pointer instead of a reference, which was probably the saner thing to do from the start.
- lib/config/read_dir.cc (read_dir): Modified the logic here so that the macros for creating the config reading routines can be completely uniform.
- daemon/state.cc (saved_state): Since the saved state is never un-saved, don't try to establish what the previous state is with getuid and getegid.
- daemon/state.h: Turned the CHANGE_STATE macro into a no-op, since the state is already saved when doing any lookup.
- daemon/lookup.cc (lookup_baseuser): Set up the saved state immediately upon successfully doing a base user lookup.
- daemon/state.h (class saved_state): Removed the pwentry pointer and made the domain a non-pointer as well.

1999-07-17 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/state.cc: Modified these routines to set up a pwentry before setting up the vdomain, as well as properly restoring the old config pointer.
- commands/*.cc: Replaced all instances of "domain->" with "domain.", since "domain" is no longer a pointer.
- clients/vdeliver.cc (main): Modified to set up a pwentry before setting up the vdomain.
- clients/checkvpw.cc (set_user): Modified to set up a pwentry before setting up the vdomain.
- commands/vcommand.cc (go_home): Modified to create a global pwentry named "user", and build the domain and config based on that.
- lib/misc/vdomain.cc (vdomain): Modified the constructors to take a pwentry parameter to build the domain config from.
- lib/misc/pwentry.cc: Moved this file here from daemon, added a "config" structure entry, and added a default constructor. (pwfile): Removed the pwfile_cache member, which was a kluge for what I thought was a bug somewhere else.

1999-07-15 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Forwarded-ported envelope delivery re-write from 0.92.2 for clients/vdeliver.cc.

1999-07-13 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/lookup.cc: Converted is_local and find_virtual to use the qmail_root config item.
- Forwarded-ported logic fix from 0.92.1 for clients/vdeliver.cc.
- clients/vdeliver.cc (inject): Use the new qmail_root config item to locate the qmail-queue binary.

1999-06-24 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/hash_table.h: Fixed a typo in the hash table prime list (the last numbers were truncated).

1999-06-14 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/FAQ.texi: Added a "troubleshooting" section, to be filled in as questions arrive.

1999-06-07 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Modified all the sources to use the new configuration class members.
- commands/vcommand.cc (go_home): Initialize the password_file global from config->password_file() here.
- lib/config/configrc.cc: Totally re-wrote the configuration system to use a subdirectory style config, with individual files containing the configuration values on their first line. The configuration modules are also built by a script, and broken down into individual object modules to reduce the size of programs that don't use all the options.

1999-06-05 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/*.cc: Moved the calls to CHANGE_STATE to immediately after validating the user, to allow the config set up by the saved_state to be used immediately.
- clients/checkvpw.cc (set_user): Set up a vdomain here and set the config to allow for locally-configured bulletin directories. (main): Moved the call to set_user higher, to allow the config to be used earlier to set the error maildir.
- clients/vdeliver.cc (main): Set up a vdomain and set the config to its config, to load a local configuration when doing deliveries.
- daemon/pwentry.cc: Removed the definitions for user_dir_rel and user_dir_abs, since vdomain::userdir will do the job now (it seems that user_dir_abs wasn't even used, too).
- daemon/state.cc: Moved the constructor and desctuctor for saved_state into this object, and added a call to push a new configuration if state was changed successfully.
- commands/vcommand.cc: Moved the go_home routine into here, and added a global "domain" pointer that will point to the current virtual domain. (go_home): Push the domain config onto the config stack. Now all the command programs will use a local configuration. This routine will eventually be rewritten to handle multiple domains in the same user.
- commands/vadduser.cc: Converted to using a vdomain object.
- Converted all instances of "config." to "config->" where appropriate (the vdomain class has a non-pointer config member, so it doesn't count).
- lib/misc/server.cc: Rewrote call and connect to take as a parameter the socket filename to use. server_call::call has a default argument now of config->socket_file to prevent having to change any code, but this might disappear, too.
- lib/misc/configrc.cc: Turned the global 'config' item into a pointer, to allow other code to essentially push down local configurations onto it. Wrote config_push and config_pop to assist with this.
- commands/vaddusers.cc (add_one): Make the alias name lower case before using it, call vuser_adduser with the maildir argument set.
- lib/misc/vuser_add.cc (vuser_adduser): Modified this routine to remove the call to userdir, forcing the maildir name to be created at a higher level.

1999-06-04 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/configrc.cc (configuration): Eliminated the #defined default constants, as they are used only once, and moved them directly into the default configuration constructor.
- lib/misc/configrc.h (class configuration ): Added a "parent" member item that points to the object from which the defaults for this configuration was set (set to NULL in the default object).
- lib/misc/vdomain.cc: Created this construct to represent a virtual domain. Copied the functionality from userdir.cc into here (with the plan of removing userdir.cc in the future). This will become the status-holder for multiple domains within a single real user.
- lib/misc/configrc.cc (configuration): Added a new constructor that copies the values from a set of defaults and reads in a config file to override those defaults. To be used for local configuration handling. Relegated the default constructor to only setting the default values, and added a new global const object config_defaults to hold these.
- commands/*: Added a call to go_home in every cli_main.
- commands/go_home.cc (go_home): Wrote this routine to chdir to the user's HOME directory.

1999-06-03 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/listvdomain.cc (cli_main): I forgot to check the return value of start_getpw here, leading to a core dump when the password table can't be opened. Fixed.

1999-06-01 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vsetup.cc (setup_qmail_default): Changed the mode of the created .qmail-default file to 0444 (minus umask) instead of 0666 to prevent qmail from complaining on systems where umask defaults to 002 instead of 022, and to prevent inadvertent editing of the .qmail-default file.

1999-05-30 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.92

1999-05-28 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- clients/vdeliver.cc: Rewrote the alias delivery routines to send the email to qmail-queue instead of qmail-inject, since qmail-inject will attempt to reformat the message.

1999-05-27 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/check.cc (CMD): Added a check to ensure that checking the password for an alias fails.
- doc/*: Changed references from qcc.sk.ca to em.ca.

1999-05-26 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/addaliasp.cc (CMD): Added this new command to add an alias with a password.
- doc/vmailmgr-cgi.texi: Updated the documentation for vaddalias. Changed all instances of "necessary" to "required".
- cgi/vaddalias.cc (CGI_MAIN ): Now allows for an optional new password field pair, and calls addaliasp if they are not empty.
- lib/misc/server.cc (server_call): Added a new server_call for 5 parameters.
- daemon/log.cc (logcommand): Added a new logcommand routine to handle 5 parameters.
- daemon/dispatch.cc: Modified the dispatch entry for addalias.
- daemon/chpass.cc (CMD): Removed the custom password checking since it is now merged into lookup_and_validate.
- daemon/chalias.cc (CMD): Call lookup_and_validate with the "userpass" flag set to true to allow owners of virtual aliases set up with a password to change their alias.
- daemon/lookup.cc (lookup_and_validate): Modified to optionally do comparisons against the virtual user's password if the comparison against the administrator's password fails. Removed the allowance for empty passwords. Made all the password mis-match messages the same. The admin password check is done before the virtual user check to avoid giving away information about virtual users.
- commands/vaddalias.cc (cli_main): Set passwords on aliases by passing in a '-p' or '--password' flag.
- lib/misc/vuser_add.cc (vuser_addalias): Modified to allow passwords on aliases.

1999-05-25 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.91

1999-05-24 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/chalias.cc (CMD): Bug fix: was passing "false" for "mustexist" to lookup_and_validate, when it should have been "true".
- commands/vdelalias.cc, commands/vdeluser.cc, commands/vaddusers.cc, commands/vaddalias.cc, commands/vpasswds.cc, commands/vchalias.cc: Added a mechanism to count and report the number of errors encountered.
- doc/vmailmgr-cgi.texi: Added a chapter for the chalias command. Also added sections for vdelalias and vdeluser, as well as sorting the sections into alphabetical order.
- cgi/vchalias.cc: Wrote the CGI program to call the chalias command.
- doc/vchalias.pod: Wrote the documentation page for the vchalias command.

1999-05-15 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/configrc.cc (DEFAULT_DEFAULT_USERNAME): Changed the default default username from '*' to '+', to avoid shell screwups. Updated documentation.

1999-05-04 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/checkvpw.pod: Fixed filename glitch -- replaced all instances of virtualhosts with virtualdomains.

1999-05-01 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/vpwentry_putpw.cc (putpw): Changed logic of "onlyadd" parameter. If set, will fail if the name already existed. If not set, will fail if the name did not already exist.
- daemon/dispatch.cc: Added a dispatch entry for chalias.
- daemon/chalias.cc (CMD): Created this server command to change an existing alias to a new destination, using the new vuser_set.
- daemon/adduser.cc (CMD): Changed to use vuser_set.
- daemon/addalias.cc (CMD): Changed to use vuser_set.
- lib/misc/vuser_add.cc: Changed to use vuser_set.
- commands/vadduser.cc (add_user): Changed to use vuser_set.
- lib/misc/vuser_set.cc (vuser_set): Renamed vuser_add to vuser_set, and moved it into this file. vuser_set can be used to change existing entries as well as to add new entries.
- commands/vrehash.cc (lock_dir): Set permissions on created CDB file to 0600.
- commands/vpasswd2cdb.cc (cli_main): Set permissions on created CDB file to 0600.
- lib/misc/vpwentry_putpw.cc (putpw): Set permissions on created CDB file to 0600.
- lib/misc/vpwentry_delpw.cc (delpw): Set permissions on created CDB file to 0600.
- clients/vdeliver.cc: Changed all I/O to use fdbuf primitives. (deliver): Changed permissions on created file to 0666 to 0600 (mail should be private).

1999-04-29 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.90.2

1999-04-25 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/userdir.cc (userdir): Use the multiple-argument mystring constructor to make pasting the slices together more efficient.
- daemon/main.cc: Added include of <stdio.h> to pull in perror properly.

1999-04-08 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.90.1

1999-04-07 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/vpwentry_putpw.cc: Removed include of errnos.h
- lib/misc/md5-crypt.c: Added definitions for MIN and MAX if they aren't defined.

1999-04-05 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/vmailmgr.conf.sample: Removed the entry for cdb-password-file, as that variable is not used.

1999-04-04 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.90
- doc/FAQ.texi: Noted that the C++ libraries are no longer needed.
- clients/bulletins.cc (stat_maildir): Fixed two bugs: timestamp file was named "maildir/cur/.timestamp" instead of just "maildir/.timestamp"; timestamp file was opened for writing without a mode, causing the resulting file to have an indeterminate mode.
- doc/FAQ.texi: Added an answer regarding IMAP support.

1999-04-03 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/main.cc (handle_connection): Only print out the "Accepted connection" message if the verbose flag is set.

1999-04-01 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/md5-crypt.c (md5_crypt_r): This routine depended on the result of "strncpy" pointing to the end of the destination string. This is non-standard behavior. Fixed such that the "cp" pointer tracks its position manually.
- cgi/listvdomain.cc: Converted to fdbuf.
- daemon/main.cc (usage): Converted to fdbuf.
- daemon/log.cc: Converted to fdbuf.
- daemon/map_table.cc (map_table): Converted to fdbuf.
- daemon/list_table.cc (list_table): Converted to fdbuf.
- commands/*: Converted from iostream to fdbuf.
- lib/cli/main.cc: Use the new "operator<<" methods of fdobuf.
- lib/misc/validate.cc (validate_redirect): Converted from using ostrstream to mystring for growing error messages.
- lib/misc/configrc.cc (read_config): Use the new "operator<<" methods of fdobuf for writing messages.
- lib/misc/passwdfn.cc: Converted to using fdbuf objects.

1999-03-31 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/pwcrypt.cc: Adapted these routines to using the GNU MD5 library and the md5_crypt routine. (crypt_cmp): Revised the algorithm here to use the old MD5 routine only for old passcodes, md5_crypt for hashes starting with "$1$", and crypt otherwise. This should be compatible with all implementations.
- lib/misc/configrc.cc (read_config): Modified to use fdibuf instead of ifstream. (cmp): Fixed logic to properly parse "STR *= *STR" instead of "STR *(=+ *)+STR".
- Changed the copying policy to GPL.

1999-03-25 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.89.1
- configure.in: Add a --enable-md5 flag to set USE_MD5.
- lib/misc/pwcrypt.cc: Imported implementation of crypt_cmp and pwcrypt from 0.87, using USE_MD5 as a selector.

1999-03-24 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.89
- daemon/main.cc (handle_connection): Move the exit(0) out of the if block so that the child always exits.
- daemon/fork.cc (do_fork): Bump up the fork counters in the child as well as the parent so that the accounting commands work properly.
- clients/bulletins.cc (stat_maildir): Fixed type: open the timestamp file for output, not the maildir.

1999-03-20 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- clients/bulletins.cc (stat_maildir): The timestamp on the "cur" directory is unreliable. Create a zero-length ".timestamp" file and use its modification mode for last-login information.

1999-03-18 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/listdomain.cc (CMD): Fixed a non-incrementing loop counter.
- daemon/fork.cc (handle_children): Now checks for both pid == -1 and pid == 0 to terminate the wait loop.
- lib/misc/vpwentry_putpw.cc (putpw): If the input file does not exist, skip the loop and add the record to a new output file.
- lib/cdb++/cdb_reader.cc (cdb_reader): Set the failed flag to the result of opening the file.
- lib/misc/vpwentry_putpw.cc (putpw): Fixed inverted boolean bug.
- daemon/lookup.cc (lookup_baseuser): Fixed bug: the pwentry pointer returned by operator[] on the pwentry_table gets deleted when the pwentry_table goes out of scope (and all kinds of weird things happen to the data).
- daemon/pwentry.cc (pwfile): Cache the value of pwfile for future calls.
- daemon/lookup.cc (lookup_baseuser): Use "right" instead of the silly pointer increment logic to get the virtual name substring.

1999-03-17 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/dispatch.cc (dispatch_cmd): Remove all fork handling from this routine.
- daemon/main.cc (handle_connection): Call do_fork immediately after accepting the connection.

1999-03-16 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vsetup.cc (setup_qmail_default): Set the initial value of .qmail-default to "|@BINDIR@/vdeliver".
- commands/vrehash.cc: Rewrote to use CDB functions.
- daemon/listdomain.cc (CMD): Send output to 'fd' instead of hard-coded file descriptor 2.
- daemon/dispatch.cc (dispatch_cmd): Pass the file descriptor to the dispatched function.
- daemon/main.cc (handle_connection): Modified logic to better suit the always-fork mentality.
- daemon/dispatch.cc (dispatch_cmd): Changed logic to always fork.
- At this point, all cache support in vmailmgrd has been removed, and all virtual password table functions will read CDBs.
- daemon/lookup.cc: Converted the functions here to using the tables instead of the caches.
- daemon/pwentry_table.cc (pwentry_table): Converted the implementation of pwentry_reader into this class.
- daemon/hash_table.h (class hash_table): Fixed a long-standing const method issue.
- daemon/list_table.cc (list_table): Converted the implementation of list_reader into this class.
- daemon/map_table.cc (map_table): Converted the implementation of map_reader into this class.
- daemon/listdomain.cc (CMD): Removed the use of the vpwentry cache table.
- lib/misc/vpwentry_get.cc (rewind_getpw): Wrote this routine to rewind an open cdb table witout re-opening it. (getpw): Converted to using autodelete.
- daemon/chpass.cc (CMD): Removed the use of the vpwentry cache table.
- daemon/lookup.cc (lookup_virtuser): Removed the use of the vpwentry cache table.
- daemon/pwentry.h (struct pwentry): Removed the vpwtable entry.

1999-03-15 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/vpwentry_*.cc: Append ".cdb" to the filename for the CDB file name.
- lib/misc/configrc.cc: Removed the cdb_password_file entry.

1999-03-13 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/vpwentry_putpw.cc (putpw): Converted to using CDB functions.
- commands/passwd2cdb.cc (cli_main): Converted to use to_record.
- lib/misc/vpwentry.cc (to_record): Wrote this one-liner to build a CDB record from the entry.
- lib/misc/vpwentry_delpw.cc (delpw): Converted to using CDB functions.
- lib/misc/vpwentry_get.cc (start_getpw): Rewrote to use vpwentry::from_record.
- lib/misc/vpwentry_getpw.cc (getpw_byname): Rewrote to use vpwentry::from_record.
- lib/misc/vpwentry.cc (from_record): Wrote this routine to build a vpwentry from a CDB record.

1999-03-12 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/misc/vpwentry_getpw.cc (getpw_byname): Converted to using CDB functions.
- lib/misc/vpwentry_get.cc: Converted to using CDB functions.
- lib/misc/configrc.cc: Added support for configuring the CDB password table name.
- commands/passwd2cdb.cc: Wrote this program to convert a standard virtual password table into a CDB table. The initial record format is identical to the old to reduce library conversion issues.
- lib/misc/vpwentry_get.cc (start_getpw): This routine now returns bool to indicate if the table was opened successfully.
- Major reorganization of the libraries and header files. All the libraries are in subdirectories under "lib", and the headers under "include" (with a pile of symlinks).

1999-03-11 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.88
- configure.in: Check for libinet and libsocket.

1999-03-10 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/vmailmgr-cgi.texi (Top): Removed warning about passwords being limited to eight characters.
- commands/vpasswds.cc (change_one): Removed warning about passwords being truncated to eight characters.
- lib/passwdfn.cc (getpasswd_interactive): Removed warning about passwords being truncated to eight characters. (getpasswd_stdin): Removed another eight character warning.

1999-03-07 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/pwcrypt.cc: Add a passcode type digit to the MD5 hashes on output, and check for this digit on comparison to determine what type of hashing to use.

1999-03-04 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/check.cc (CMD): Tidied up result string creation code.
- lib/vpwentry_getpw.cc (getpw_byname): Copied logic from getpw.
- lib/vpwentry_get.cc (getpw): Fixed minor logic flaws.
- lib-dbi/passcode.cc: Added a stub for MD5 authentication.
- daemon/chpass.cc (CMD): Use renamed pwcrypt.
- daemon/adduser.cc (CMD): Use renamed pwcrypt.
- commands/vadduser.cc (add_user): Use renamed pwcrypt.
- lib/vuser_add.cc (vuser_adduser): Use renamed pwcrypt.
- lib/vuser_chpass.cc (vuser_chpass): Use renamed pwcrypt.
- lib/pwcrypt.cc (crypt_cmp): Modified to automatically handle MD5 hashed passcodes. Renamed encrypt to pwcrypt, which calls encrypt_md5 to produce MD5 hashed passcodes.
- Completed conversion of source packaging from custom makefiles to automake.

1999-02-25 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.87
- Removed my kludged handling for building shared libraries. This greatly simplifies the process of moving to both automake and libtool. The executables are somewhat larger, but still come in under about 25K each (on i386 Linux).
- clients/bulletins.cc (scan_bulletins): Skip scanning the local bulletin directory if the user is non-virtual.
- clients/checkvpw.cc (struct user_data): Added a non_virtual flag to this data, indicating that the user is not a virtual user. (main): Pass the non_virtual flag into scan_bulletins.
- lib/ac-wait.h: Moved the #include ladder that is required to use wait(2) functions here.
- lib/ac-dirent.h: Moved the #include ladder that is required to use dirent functions here.
- lib/ac-time.h: Moved the #include ladder that is required to use time functions here, and rewrote all the files that include either <time.h> or <sys/time.h> to instead include "ac-time.h"
- commands/vpasswds.cc (cli_main): Removed call to srandom.
- commands/vpasswd.cc (cli_main): Removed call to srandom.
- commands/vaddusers.cc (cli_main): Removed call to srandom.
- commands/vadduser.cc (cli_main): Removed call to srandom.
- lib-cli/main.cc (main): Call srandom here to give all the CLI programs a properly initialized random function automatically.

1999-02-24 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/main.cc: All signal handlers call signal to re-enable signal handling on systems that reset signals.
- daemon/fork.cc (handle_children): Re-assert the SIGCHLD signal handler after a signal is received, since some systems will reset the behavior of signals after they've been received.

1999-02-22 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib-cgi/cgi-base.cc (main): Eliminated the timezone setup since it is totally unnecessary.

1999-02-09 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib-dbi/user.h: Moved the password validation method out of the ruser/vuser classes into struct passcode. This class may eventually be split into multiple classes, one per passcode type.

1999-02-06 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.86
- clients/bulletins.cc: Changed logic in all routines to not fail if an error occurrs. (link_file): Fixed several logic flaws.

1999-01-30 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- clients/bulletins.cc: Completed prototype code.

1999-01-28 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- clients/bulletins.cc (scan_bulletins): Roughed-in bulletin scanning support.
- clients/checkvpw.cc (main): Added call to scan bulletins.
- lib/configrc.h (class configuration ): Added variables to be used to set up bulletin directories.

1999-01-26 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vadduser.cc: Modified to accept a "directory" argument of where to put the user's mailbox.

1999-01-12 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Rewrote various sources to take advantage of new mystring library constructor functions.
- Inserted revised mystring library.

1999-01-09 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.85
- daemon/vpwentry_cache.cc (dirname): Fixed stupid bug -- used "right" instead of "left" to get the directory part of the filename. This bug was introduced by the following change.
- All files: reworked code to remove cases where an automatic conversion from type mystring to "const char*' was expected. Instead, all the code uses the c_str() function in mystring.
- Added a note in the FAQ regarding the default username.
- lib-cli/main.cc: Rewrote the CLI library to remove dependance on the GNU libiberty getopts.

1998-12-29 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- clients/vdeliver.cc (main): Changed the default for adding the leading "From " line to false.
- Released version 0.84

1998-12-25 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/response_read.cc (read): Removed the __GNUG__ cruft here that was only really necessary to optimize on old "mystring" use (and probably only added nearly useless complexity even then).
- lib/userdir.cc (userdir): Added a work-around for the apparent egcs inlining bug to fix those core dumps when running vadduser and friends. Using egcs -finline-functions causes them to core dump, without inlining everything works OK.

1998-12-09 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vadduser.cc (cli_main): Fixed off-by-one error introduced by the use of lib-cli.

1998-12-08 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- configure.in: Added a check to determine if the C++ compiler is buggy and abort if so.

1998-12-03 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- configure.in: Modified the tests for -fno-exceptions and -fno-rtti to actually run the C++ compiler and check its result.

1998-12-02 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/*.cc: Refitted all the command programs to use lib-cli.

1998-11-29 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vaddalias.cc: Refitted to use lib-cli.
- lib-cli/main.cc: Wrote a top-level command-line interface helper, which handles automatic help-screen generation, short and long argument parsing, and will eventually handle switching between "standard" command use and server-call usages.

1998-11-28 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/listvdomain.cc: Wrote this program to list the contents of a virtual domain.
- configure.in: Added a somewhat poor hack to handle support for static vs shared libraries.
- lib/vpwentry_get.cc: added start_getpw, end_getpw, and getpw routines.

1998-11-24 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/main.cc: Fixed handling of aborted and timed out requests. A timed out request will result in two error messages, one from the alarm, and one from the failed read.

1998-11-07 Bruce Guenter <bguenter@hal.qcc.sk.ca>

- Released version 0.83
- doc/vmailmgr-cgi.texi: Added a section to describe the use of the listvdomain CGI.
- cgi/listvdomain.cc (show_dest): Split original show_user into show_dest which calls show_mbox or show_alias. (show_mbox): Modified output to show mailbox destination. (CGI_MAIN ): Accepts form inputs mboxlink and aliaslink, which are links inserted on each mailbox or alias name, with '%' replaced by the mailbox or alias name.

1998-10-29 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/main.cc (handle_connection): It appears that accept may return with an error if a signal occurred while the accept was being processed. So, loop around accept until a valid fd is returned.

1998-10-12 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/cgi-*: Moved these files into lib-cgi.

1998-10-01 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- */*.cc, */*.h: Changed all remaining instances of "const mystring&" to "mystring".

1998-09-29 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/server.cc, lib/response*.cc: Changed all instances of "const mystring&" to "mystring".
- cgi/listvdomain.cc (CGI_MAIN ): Forgot to output a content type before the HTML content. Fixed. (show_domain): The user list is now sorted on output.
- lib/cgi-args.cc: Changed all instances of "const mystring&" to "mystring".
- lib/cgi-base.cc: Exported content_type function. Changed all instances of "const mystring&" to "mystring".

1998-09-25 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.82

1998-09-24 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/main.cc (exit_fn): Check the count of active forked processes and sleep until they are all no longer active.
- daemon/daemon.h: Moved parts of this file into command.h and log.h.
- daemon/*.cc: Replaced all instances of "cout" that produce log messages with "log()" or "log(msg)".
- daemon/log.cc (log): Added new routine that prefixes log lines with "[pid] " if the log is being output from a child process.
- cgi/listvdomain.cc (show_domain): Fixed loop logic to properly truncate the buffer when repeating. Set up the output to display a table instead of a list. (show_user): Added this routine to output a single user, doing a lookup to determine if the name is a mailbox or alias.
- daemon/dispatch.cc: Changed all the entries that would modify a user to be "forked" methods.

1998-09-23 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/listdomain.cc (CMD): write_buf returns true on success, not false. Fixed.
- lib/response_message.cc (message): Fixed a minor bug: the "msg" portion of the response was treated as a NUL-terminated C string instead of as binary data, causing potential truncation when used with the listdomain facility.

1998-09-21 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- clients/checkvpw.cc (authenticate): Modified to handle extra maildir value in string, eliminating an extra lookup.
- daemon/check.cc (CMD): Modified return string to include a maildir for virtual users.
- daemon/fork.cc: Removed all the code that dealt with process slots to fix a race condition: the forked process could exit before the parent registers it as a child, causing the active process counts to become incorrect and eventually prevent any further forks.

1998-09-20 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/main.cc (handle_connection): Modified to use new fork logic. (usage): Added -v/-V option to usage message.
- daemon/dispatch.cc (dispatch_cmd): Fixed logic of "did_fork" flag to become two flags: needs_write and needs_exit.
- daemon/main.cc (main): Removed use of atexit(exit_fn) to automatically remove the socket file, since it must not be removed when exiting from a forked routine.
- daemon/dispatch.cc (dispatch_cmd): dup2 returns -1, not non-zero, on error. Fixed.
- doc/vmailmgr.pod: Added the full list of programs that are part of this package to a "SEE ALSO" list.

1998-09-12 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- clients/checkvpw.cc (main): Fixed design flaw in the "missing maildir" design caused by setting the MAILDIR environment variable before checking for the existance of the maildir. (find_maildir): Changed search logic -- if no matching string is found, indicate that the last argument is the "maildir" argument. (main): Removed several redundant checks that were a result of the above change.

1998-09-09 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/response_read.cc (read_response): Fixed the missing "break" in the switch statement.

1998-09-08 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/main.cc (handle_intr): Ignore PIPE signals while exiting, as there is a potential for an infinite loop to occur if stdout is a pipe that closes before this program exits.

1998-09-05 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/response_read.cc (receive_string): Moved this routine here from lib/server.cc. (read): Moved the former implementation of response::response(int) into a static read_response routine, and renamed it response::read.
- lib/server.cc: Fixed several compile bugs.
- cgi/listvdomain.cc: Fixed compile bugs, still not tested.

1998-08-21 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- cgi/listvdomain.cc (CGI_MAIN ): Completed the preliminary implementation of this CGI.
- lib/server.cc (call): Modified to use the new response constructor to read the response from the client.
- lib/response.h (struct response): Added a constructor to read the data from a file descriptor.

1998-08-13 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/lookup.cc (lookup_and_validate): Fixed the behavior when the password table contains a "default" user, the requested user does not exist, and the "mustexist" flag is set.

1998-07-31 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- cgi/listvdomain.cc: Started this CGI program to list the users in a virtualdomain, using the new "listdomain" server function.
- lib/server.h (class server_call): Added a routine 'socket' to return the open socket.
- lib/server.cc (call): Modified to record the file descriptor for the connection and to close it when the server_call is destructed.

1998-07-26 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/dispatch.cc (dispatch_cmd): In the case of a forked dispatch, move the output to fd #2 (usually stderr), to give it a constant location.
- lib/response.h (struct response): Added the 'maxsize' constant representing the maximum size of any one transmitted message.
- daemon/listdomain.cc (CMD(listdomain)): Completed implementation of this command.
- daemon/lookup.cc: Moved the functions is_local and find_virtual into this file from dispatch.cc.

1998-07-21 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/listdomain.cc (CMD(listdomain)): Started building this routine to list the users in a virtual domain.

1998-07-20 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/main.cc (parse_options): Added support for a "verbose" flag.
- daemon/fork.cc (do_fork): Wrote this new routine to fork a new process and record its pid in a table (if slots are available in the table). (handle_children): Wrote this new routine to handle any children that were forked and have exited.
- daemon/main.cc (handle_connection): Added support for commands that cause forked connections.
- lib/configrc.h (class configuration ): Added new configuration variable "max_fork" -- the maximum number of forked processes to handle.
- daemon/main.cc (handle_connection): Modified this routine to simply close the socket fd and continue if the previous operation forked (the other "half" of the fork will handle the output).
- daemon/dispatch.cc (struct dispatch ): Added a field to this structure to indicate that the operation needs to fork.

1998-07-09 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.80
- clients/checkvpw.cc (getdata): Fixed a longstanding error in setting the password/stamp fields. Fortunately, this error had no impact at all on the data we use, but would have been immediately visible if we were to try to use the timestamp.
- daemon/lookup.cc (lookup_virtuser): Added code to look up a default user if the lookup of a named user fails.
- lib/configrc.h (class configuration ): Added a new configuration variable "default_username".
- clients/vdeliver.cc (build_command): Fixed a bug that would cause an infinite loop when delivering to multiple destinations. (build_command): Moved the appending of the hostname from enqueue into here, to allow it to be added on each recipient.

1998-06-17 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- doc/vrehash.pod: Started man page for vrehash.
- commands/vrehash.cc: Wrote this program to move all users directories around into the proper hashed directory (see the man page).
- commands/vpasswds.cc (change_one): Fixed incorrect status message (was "vpasswd:" should be "vpasswds:").

1998-06-15 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/maildir.cc (make_maildir): Modified this routine to make all the directories leading up to the named directory.
- lib/configrc.h (class configuration ): Added the fields user_dir_bits and user_dir_slices to support userdir.
- lib/vuser_add.cc (vuser_add): Modified an error message to make it more informative.
- daemon/pwentry.cc (user_dir_abs): Modified to use userdir. (user_dir_rel): Modified to use userdir.
- lib/vuser_add.cc (vuser_adduser): Modified to use userdir.
- lib/userdir.cc (userdir): Wrote this routine, which produces a relative user directory name, including a hashed-out path and subdirectories, from a username.

1998-06-12 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- clients/checkvpw.cc (main): Added a test to check if the user's maildir exists and, if not, set the maildir to the configured "error_maildir" string.
- daemon/main.cc (handle_intr): Fixed shutdown logic to handle both cases: interrupted while handing a connection, or while waiting for a connection.
- lib/configrc.h (class configuration ): Added new configuration variable "error_maildir", which is a read-only maildir that contains an error mail message.

1998-06-11 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/configrc.cc (configuration): Commented out the code to read a local configuration file.
- lib/configrc.h: Moved the DEFAULT_* definitions out of here and into configrc.cc again.
- Backed out all the vdomain and configuration patches, in order to fix all the confusion I had been generating.
- daemon/main.cc (main): Changed the "interrupt" logic to exit after the current request instead of potentially exiting during the request (and leaving files in a indeterminate state).

1998-06-09 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/vdomain.h (struct vdomain): Added a "config" item to this class.

1998-06-07 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/state.h (class saved_state): Added code to effectively push/pop a local configuration when entering a saved_state.
- */*.cc: Changed the use of the "config" variable to account for it being a pointer.
- commands/*.cc: Added the line "config = local_config();" to the main routine before anything else is executed.
- lib/configrc.cc (local_config): Added this routine to create a local configuration based on the given home directory.
- lib/configrc.h: Moved the DEFAULT_* definitions out of here and into configrc.cc (the only place they are referenced). Modified the constructors to support "stacking" of configurations. Made the global "config" variable into a pointer to allow it to change.
- daemon/vdomain.h (struct vdomain): Wrote this new structure to encapsulate a virtual domain. These domains are stored in a hash table "vdomains", indexed by base directory.
- daemon/chpass.cc, daemon/lookup.cc: Adjusted to use the new vdomains global.
- daemon/pwentry.h (struct pwentry): Removed the vpwentry_cache from this structure. This will eliminate the expensive lookups at startup (the file "passwd" is looked up for each real user) and a significant amount of memory overhead.

1998-06-05 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.79

1998-06-01 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/passwdfn.cc: Got rid of __GLIBC__ ifdef for crypt.h
- lib/pwcrypt.cc: Got rid of __GLIBC__ ifdef for crypt.h

1998-05-31 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/configrc.h: Removed the comment regarding DO_SHADOW.
- daemon/pwentry_cache.cc: Modified the reader to make only a single pass through the password and shadow password files.
- lib/configrc.h: Renamed lib/config.h to this to avoid name conflicts with the autoconf/configure-generated config.h.
- various: Fixups mandated by the use of autoconf.

1998-05-29 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/dispatch.cc: Made the "echo" daemon command conditionally compiled if TEST_DAEMON is defined.
- daemon/vpwentry_cache.cc: Added code to log when the virtual password caches are loaded/reloaded.
- daemon/pwentry_cache.cc: Added code to log when the password cache is loaded/reloaded.
- commands/vsetup.cc (setup_passwd): Modified to use the new postmaster config variables.
- lib/config.cc (read_config): Changed the "postmaster" configuration variable into "postmaster_email" and added "postmaster_aliases".

1998-05-27 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.78
- lib/vpwentry_putpw.cc (putpw): Fixed logic to deal with an existant but non-readable original password file.
- lib/vuser_add.cc (vuser_add): Changed the order of creating the maildir and adding the user to the passwd file. This allows the maildir to be erased if adding the user fails, since the newly created maildir is guaranteed to be empty.
- lib/maildir.cc (make_maildir): Modified the code to remove any newly-created directories if creation of any directory fails.
- lib/passwdfn.cc (getpasswd_stdin): Changed use of "gets" to "cin.get".

1998-05-26 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vpasswd.cc (main): Changed the "fprintf" to use IOStreams.
- lib/passwdfn.cc (getpasswd_*): Print a warning if the password is longer than 8 characters.
- commands/vpasswds.cc: Wrote this new program to change the passwords of a list of users. The input for this list is taken from standard input and is of the form "name password". Anything following the password is ignored.
- lib/config.cc: Added a new configuration item: postmaster.
- commands/vadduser.cc (main): Removed the call to setup.
- commands/vaddusers.cc (main): Removed the call to setup.
- commands/vsetup.cc: Wrote this program to set up a new virtual domain with the proper ".qmail-default" file and a users directory, along with some useful system aliases.
- daemon/vpwentry_cache.cc (write): Use "rename" system call.
- lib/vpwentry_putpw.cc (putpw): Use "rename" sytem call.
- lib/vpwentry_delpw.cc (delpw): Use "rename" system call instead of "unlink/link/unlink" combination to guarantee atomicity of the operation.
- commands/_setup.cc (setup): Moved this routine out of vadduser.cc so that it could be shared with vaddusers.cc. It should probably go into the shared library under a different name.
- commands/vaddusers.cc: Wrote this new program that adds a list of users. The input for this list is taken from standard input and is of the form "name password [alias ...]".
- lib/vpwentry_putpw.cc (putpw): Fixed a bug in the logic that prevented the temporary password file from being renamed to a non-existant original file.

1998-05-25 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.77
- lib/vpwentry_putpw.cc (putpw): Fixed bug that would cause a failed addition to leave behind a temporary file as well as merged the case if the file does not already exist.

1998-05-24 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/pwentry_cache.cc: Fixed this code to deal with shadow passwords. Thanks to Andrew Gillespie for the initial patch to show the problems. The new code properly deals with caching both the contents of /etc/shadow and /etc/passwd, as well as handling the case where shadow passwords don't exist.

1998-05-22 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.76
- daemon/file_cache.h (write_file): Call force_valid to avoid having to re-read the cached table immediately after having written its contents. Do this _before_ unlocking the directory to avoid a race condition.
- daemon/file_cache.cc (force_valid): Added this routine to force the cache state to indicate that the file is valid (if the file is present).

1998-05-15 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/dispatch.cc (find_virtual): Fixed bug preventing use of wildcards in virtualdomains.

1998-05-13 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/vpwentry_cache.cc (write): Set the new file mode to 0600.
- lib/vpwentry_putpw.cc (putpw): Set the new file mode to 0600, not 0700 (no execute bit).

1998-05-12 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/vpwentry_cache.cc (operator): Modified code to delete entries that fail insertion into the table (ie duplicates).
- daemon/chpass.cc (CMD): Removed the calls to begin/end_modify.
- daemon/file_cache.h (file_cache_writer::write_file): Removed the begin/end_modify routines and bundled them into this routine.

1998-05-11 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/vpwentry_cache.cc (unlock): Fixed bug in unlocking the directory.
- daemon/chpass.cc (CMD): Modified to use the file cache to modify the password table instead of the vuser_chpass routine.

1998-05-08 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.75
- daemon/main.cc (TIMEOUT): Changed the connection timeout to one second, as values larger than that are useful only for debugging the connection handling code.
- lib/vpwentry_putpw.cc (putpw): Modified to use '\n' instead of the endl operator to mark line ends.
- lib/vpwentry_delpw.cc (delpw): Modified to use '\n' instead of the endl operator to mark line ends (allows the output stream to properly buffer writes).

1998-05-07 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- clients/checkvpw.cc, clients/vdeliver.cc: Moved these to files from "commands" to the "clients" subdirectory
- daemon/pwentry_cache.cc (operator): Convert the user names to lowercase before inserting.
- daemon/vpwentry_cache.cc (operator): Fixed bug: make the virtual users' names lowercase before inserting into the table.
- daemon/check.cc (CMD): Fixed bug: initialize virtpw pointer.
- daemon/lookup.cc (lookup_maildir): Removed obsolete routine. (CMD): Fixed bug: must initialize the pointers that previously used autodelete.
- daemon/vpwentry_cache.cc (operator): Fixed a bug that caused the password and destination strings to be both stored in the password field.
- daemon/file_cache.cc (validate_cache): Check both the last modification time on the file and the inode number to determine if the file has changed.
- daemon/*.cc: Changed all variables of type "autodelete<vpwentry>" back to type "vpwentry*".
- daemon/pwentry.cc: Removed the "getpw_byname" routine, now obsoleted by the pwentry_cache.
- daemon/lookup.cc (lookup_virtuser): Modified to handle the new vpwtable cache in the pwentry.
- daemon/pwentry.cc (pwentry): Initialize the vpwtable on creation.
- daemon/pwentry.h (struct pwentry): Added a vpwentry_cache to this object.
- daemon/vpwentry_cache.cc (write): Changed the end-of-line marker from endl to "\n", as endl will cause the buffer to be flushed.
- daemon/main.cc (read_data): Removed support for protocol one requests (which allows me to remove one more read syscall from the fast path, shrinking it down to a total of two reads).

1998-05-06 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/main.cc (read_data): Modified to read messages using either protocol one or two.
- lib/server.cc (build_msg): Modified to build messages using protocol 2.
- daemon/qmail.*: Removed these obsolete source files.
- daemon/dispatch.cc (find_virtual): Wrote this routine that mimics the old behavior of find_virtual from qmail.cc to find a mapping from a virtual domain name to a prefix, using a map_cache on control/virtualdomains.
- daemon/file_cache.h (class file_cache): Modified the behavior to automatically load the cache on construction, instead of waiting.
- daemon/map_cache.h: Wrote the classes for map_cache, a generic qmail-style map-file cache (the key and value pair is separated by a colon, one per line).
- daemon/list_cache.h: Renamed locals_cache to list_cache, as a generic list-file cache class.
- daemon/dispatch.cc (is_local): Fixed to check the cached result.
- daemon/file_cache.cc: Moved the actual code for file_cache_base here.
- daemon/file_cache.h (class file_cache_base): Created this class to contain the common code in the file_cache template.
- daemon/lookup.cc (lookup_baseuser): fixed the lookup to only read the cached "pwentries" object once per invocation, and to check the result.
- daemon/qmail.cc (is_local): Removed this routine, as its functionality can be duplicated with a locals cache.
- daemon/locals_cache.cc: Wrote this object to cache the "locals" table used by qmail to determine what domains are "local".
- daemon/qmail.cc: Moved this object here from lib.
- daemon/*.cc: Changed all variables of type "autodelete<pwentry>" back to type "pwentry*", as the lookup functions that would set these variables now return non-deletable references.
- daemon/lookup.cc: Modified the various lookup routines that look up base users to use the pwentries cache.
- daemon/file_cache.h:
- daemon/hash_table.h:
- daemon/crc32.h:
- daemon/crc32.cc:
- daemon/crc_hash.h:
- daemon/pwentry_cache.cc:
- daemon/pwentry_cache.h:
- daemon/vpwentry_cache.cc:
- daemon/vpwentry_cache.h: Merged from temporary development tree. Current functionality consists of a generic hash table, mapping from mystring keys to generic objects; a file cache that will automatically reload a cached object only when necessary; and specific code for building caches of the base user password table (pwentry_cache) and virtual password tables (vpwentry_cache).
- lib/vpwentry_putpw.cc (putpw): Now opens the temporary file with "noreplace" to avoid races, and mode 0700.
- lib/vpwentry_delpw.cc (delpw): Now opens the temporary file with "noreplace" to avoid races, and mode 0700.

1998-05-04 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/pwentry.*: Moved these files here from lib, as no other module uses them.
- lib/pwentry.cc (getpw_byname): Moved this function here from pwentry_getpw.cc.
- lib/vpwentry_delpw.cc: Renamed this file from pwentry_delpw.cc
- lib/vpwentry_putpw.cc: Renamed this file from pwentry_putpw.cc
- lib/vpwentry_getpw.cc: Added the getpw_byname function from pwentry_getpw.cc.
- lib/pwentry_getpw.cc: Removed the vpwentry function.

1998-05-03 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/vuser.h: Only include "vpwentry.h", not "pwentry.h"
- lib/vpwentry.cc: Moved the vpwentry constructors and destructors here.
- lib/pwentry.cc: Removed the vpwentry portions.
- lib/pwentry.h: Removed the portions that only deal with vpwentry's.
- lib/vpwentry.h: Split the portions of pwentry.h that only deal with vpwentry's into this file.
- spec: Forgot to add a call to "ldconfig" in %post.

1998-04-24 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.74.

1998-04-23 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/chpass.cc (CMD): modified to use save_state.
- daemon/deluser.cc (CMD): modified to use save_state.
- daemon/delalias.cc (CMD): modified to use save_state.
- daemon/addalias.cc (CMD): modified to use save_state and lookup_and_validate.
- daemon/adduser.cc (CMD): Modified to use save_state.
- daemon/state.h (class saved_state): Created this class from saved_uidgid -- it also does a chdir to the user's home directory. By doing so, it allows the use of relative paths as if operating as the given user.
- daemon/lookup.cc (lookup_and_validate): Modified to optionally create a new vpwentry if the named virtual shouldn't and doesn't exist yet.
- daemon/adduser.cc (CMD): Modified to use lookup_and_validate and pwentry::user_dir_rel.
- lib/pwentry.cc (user_dir_rel, user_dir_abs): Created these two routines that return the relative (to home) and absolute directory name of a new virtual user's directory according to the configured user_dir parameter.
- commands/checkvpw.cc: Added function declarations missing on Solaris.
- commands/vdeliver.cc: Added function declarations missing on Solaris.
- lib/cgi-base.cc: Added function declarations missing on Solaris.
- commands/vpasswd.cc: Added function declarations missing on Solaris.
- commands/vadduser.cc: Added function declarations missing on Solaris.
- lib/pwcrypt.cc: Added function declarations missing on Solaris.
- daemon/dispatch.cc (dispatch_cmd): Add the domain name to the error message for an invalid domain name, as the request won't have been printed by the time this happens.

1998-04-21 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vadduser.cc (add_alias): Fixed bug: this routine previously looked up the user name instead of the alias when checking for the existance of the alias.
- lib/validate.cc (validate_field): Fixed bug: find_first returns -1 if nothing is found, not zero.
- commands/vadduser.cc (add_alias): No longer necessary to add the '&' prefix.
- commands/vaddalias.cc (main): No longer neccessary to add the '&' prefix.
- lib/vuser_add.cc (vuser_addalias): Automatically prepend a '&' to the destination.
- daemon/addalias.cc (CMD(addalias)): Call validate_redirect before adding the alias.

1998-04-17 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vaddalias.cc (main): Removed the destination validation code from this program and made it call validate_redirect.
- lib/validate.cc (validate_redirect): Created this routine to validate a redirect destination.

1998-04-16 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/validate.cc (validate_username): Revised this to disallow '/' in user names.
- vmailmgr.conf.sample: Added notes regarding which component(s) uses each of the listed settings.
- lib/config.h: Removed the macro definitions that just served as aliases for parts of the configuration class.

1998-04-14 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/lookup.cc: Removed the 'userlookup' routine.
- lib/maildir.cc (make_maildir): Moved this routine here from vuser_add. (delete_maildir): Moved this routine here from vuser_deluser, renamed from deltree.

1998-04-13 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/vuser_add.cc (vuser_add): Use validate routines instead of hard-coded checks. (vuser_adduser): Renamed the simple vuser_add to vuser_adduser to avoid confusion between the two vuser_add routines.
- lib/validate.cc (validate_username): Wrote this routine to ensure that a username is valid; returns true if so.
- daemon/delalias.cc (CMD(delalias)): Switched from userlookup to lookup_and_validate.
- daemon/addalias.cc (CMD(addalias)): Switched from userlookup to lookup_{baseuser,virtuser}. Removed check for invalid alias name (already done by vuser_addalias).
- daemon/deluser.cc (CMD(deluser)): Switched from userlookup to lookup_and_validate.
- daemon/adduser.cc (CMD(adduser)): Switched from userlookup to lookup_{baseuser,virtuser}. Removed check for invalid user name (already done by vuser_add). Removed duplicated code from vuser_adduser.
- daemon/check.cc (CMD(check)): Switched from userlookup to lookup_{baseuser,virtuser}.
- daemon/chpass.cc (CMD(chpass)): Switched from userlookup to lookup_and_validate.
- daemon/lookup.cc (lookup_and_validate): Wrote this routine, which looks up base and virtual users and validates them, replacing several lines of common code in many of the interfaces.
- commands/checkvpw.cc (main): Use the separators configuration item instead of just '@'.
- lib/config.cc (read_config): Added a new configuration option, "separators", which lists valid separators between the user name and virtual domain name when logging in via checkvpw. Defaults to "@:"
- lib/mystring.cc (find_first): Added this routine, finds the first character that matches any one in a set.
- daemon/lookup.cc (userlookup): Split this function into its two parts, lookup_baseuser and lookup_virtuser.

1998-04-11 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vaddalias.cc (main): Modified this code to handle (and check) multiple recipients.
- commands/vdeliver.cc (enqueue): Split this routine into three parts, and added the functionality to deal with multiple recipients in a destination address (separated by commas).

1998-04-08 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- commands/vdeliver.cc (enqueue): Changed the calls to setenv to equivalent calls to putenv, as some system's don't have setenv.
- commands/checkvpw.cc (set_environ): Changed the calls to setenv to equivalent calls to putenv, as some system's don't have setenv.

1998-04-05 Bruce Guenter <bguenter@hal.qcc.sk.ca>

- Released version 0.73
- commands/vdeliver.cc (main): Fixed bug with handling of ??LINE environment variables (local variables had erroneously overridden previously global variables).
- vmailmgr-cgi.texi: Filled in the details for the form fields of vpasswd.
- cgi/*.cc: Remove the "CGI_INPUT" lines for "vdomain" and "password", as they are defined by the top-level CGI constructor.
- lib/cgi-base.cc (CGI): Add "vdomain" and "password" to the list of fields that are automatically retrieved for all the CGIs, as all CGIs will operate on a virtual domain, and all require a password.

1998-04-02 Bruce Guenter <bguenter@hal.qcc.sk.ca>

- vmailmgr-cgi.texi: Started writing documentation on how to configure the CGI programs.

1998-04-01 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- HOWTO.texi: Started writing instructions on how to do certain tasks with vmailmgr.

1998-03-31 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/config.cc (read_config): Rewrote this routine to only go through the file once (instead of once per variable), and to print out errors on invalid lines.

1998-03-29 Bruce Guenter <bguenter@hal.qcc.sk.ca>

- various: Use pwentry::pwfile and pwentry::user_dir in place of computing their values repeatedly.
- lib/pwentry.cc (pwentry::pwfile): Wrote this routine, returns the password file name for the given base user. (pwentry::user_dir): Returns the user directory for the given base user.
- lib/config.cc (post_process): Wrote this routine to "tidy up" some of the configuration strings, such as directories that should always have a trailing slash ('/').
- lib/config.h: Change all the defined configuration macros (except for DO_SHADOW) to their configuration variables.
- various: Treat the configuration defines as variables instead of as constant strings.
- lib/config.cc (configuration): Initialize all the strings to default values.

1998-03-28 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/config.cc: Started this module, which can read a configuration file for default values at runtime. The default configuration initialization will read both a global configuration file and a local one.

1998-03-26 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- Released version 0.72
- commands/vdeliver.cc (main): Fixed the bug that caused empty environment variables (valid) to be treated as non-existant environment variables. This caused bounces to vdeliver to double bounce.
- Released version 0.71

1998-03-22 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- cgi/*.cc: Use "msg", not "message()" from the response as the error response message.
- lib/cgi-args.cc (get_parts): Strings weren't being terminated properly before being set. Fixed.

1998-03-20 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- daemon/dispatch.cc: Added entries for deluser, delalias, and addalias.
- daemon/delalias.cc (CMD(delalias)): Wrote this routine to delete an alias.
- daemon/addalias.cc (CMD(addalias)): Wrote this routine to add an alias.
- cgi: Merged in all the code and libraries for CGI programs into the standard build. At this point, there is a basic framework that all CGI programs will use, which includes a mechanism that automatically pulls the inputs from a POST form, and a base class that is executed on startup. The CGI module defines the routine CGI_MAIN, which is executed by the program startup code. The CGI module should call either error() or success() at the end of its execution, which will handle printing out an appropriate message. All of the v* programs (vpasswd, vadduser, vdeluser, vaddalias, and vdelalias) have a CGI equivalent.
- daemon/deluser.cc (CMD(deluser)): Wrote this routine to delete a user.

1998-03-19 Bruce Guenter <bguenter@mikhail.qcc.sk.ca>

- lib/server.cc: include un.h
- daemon/main.cc: include un.h
- lib/un.h: Wrote this header to define SUN_LEN and to include necessary things for doing sockets.
- daemon/main.cc (make_socket): Split the code to create a socket into this routine; fixed the permissions bug that caused the socket to be created without other-write permission when launched with a non-zero umask.
- Released version 0.70