TinyMUX 2.0: CHANGES Last Update: December 2002 Major changes that may affect performance and require softcode tweaks: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- MUX 2.0 no longer uses any version of GDBM for it's database. -- Broad Time/Date from 27255 BC to 30826 AD with a proleptic Gregorian Calender. The internal resolution of time is 100 ns. -- Large 64-bit Integer Math support. -- Moved code from C to C++. -- Shared sources between Unix and Win32 including native NT networking. -- Queuing (@wait/@notify/@kick) is completely re-written and fits more seamlessly with the networking. -- Added optionally included WOD_REALMS support. -- Replace udb_ocache with an attribute cache using CHashTable. -- vmul() behavior didn't match PennMUSH, MUSH 3, or MUX 2 help files. Feature Additions: ~~~~~~~~~~~~~~~~~ -- Greatly improve @dbclean so that it checks the internal and external integrity of five data structures against themselves, removes stale attributes, and renumbers the attributes that remain. And, it's very much faster than the original version. Removing stale attributes by itself takes 6 seconds. -- Allow comtitles to -replace- your name instead of just prefix it. Staff continues to see who is who. This behavior is choosen with @cset/spoof . -- Server automatically creates a minimal database if one does not already exist. -- dbconvert will not allow you to load into a non-empty database or unload from a non-existent one. -- Added a TinyMUSH-style backup script which runs dbconvert, as well as creating a tarball that includes flatfile, mail.db, comsys.db, mux.config, GAMENAME.conf, and all .txt files except help and wizhelp. -- Added %cu for ANSI underline. -- columns() is fully ANSI-aware and maintains the intended color. -- strtrunc() is fully ANSI-aware and maintains the intended color. -- ucstr() and lcstr() are now fully-ANSI aware and only uppercases (lowercase) the non-ANSI text. -- ANSI has been re-worked and there are no known color leaking issues in the server. The server automatically goes to normal color mode even if you don't specify it explicitly in your text. ANSI sequences are optimized (sometimes totally out of existence). Truncation of ANSI strings into fixed-sized buffers or fixed-width fields is handled properly. -- Better NOBLEED support. NOBLEED support is accomplished with fewer ANSI codes. -- Reworked the game's command line processing and filled in some combinations. -- Added a @list resources command to show total number of open files, sockets, etc. -- Added @mail/reply[/quote], and @mail/replyall[/quote] -- Included safer_passwords configuration option. -- Configuration option added to deal with guest logins at reg-only MUXen. -- Added channel functions: comalias(), channels(), and comtitle(). -- Added functions: doing(), motd(), and poll(). -- Added @idletimeout -- Added SIGUSR2 signal handler. -- IRIX builds cleanly and runs. -- Solaris builds and runs cleanly. -- Added @log command. -- Added iadd(), div(), imul(), and isub() functions. -- Use dynamic string allocation in conf.cpp to support filenames longer than 30 characters. -- OpenBSD and FreeBSD build and run clean. -- comtitle prefix/replace behavior is now optional on a per-channel basis. See @cset/spoof -- Added @idletimeout -- Added comtitle(), alias(), comalias(), channels(), poll(), doing() and motd() functions. -- Tiny_ltoa() and Tiny_i64toa() are about twice as fast. -- db_write is about 4 times faster. -- putstring is about 30% faster. -- Added @function/list from RHostMUSH. -- Added /noeval to @pemit and @npemit -- ucstr(), lcstr(), capstr(), reverse(), and revwords() are now ANSI-aware. -- band(), bnand(), and bor() were added months ago. -- Added lpos() function from MUSH 3. -- Added @timecheck command from MUSH 3 and changed it to use MUX 2's internal time format and to work on WinNT and Win9x. -- Added flag_access configuration option from MUSH 3. -- Rewrote PERMISSIONS topic in wizhelp.txt to accurately reflect the code. -- Have server abort() with a log entry instead of just abort()'ing. -- Added 'head' access permission. -- Added 'lag_maximum' configuration option with default of 120 seconds. -- Added the object list stack originally from U1 and ChaoticMUX that keeps certain operations (when nested) from stepping on each other's object searches. -- Use ANSI_TruncateToField on object names so that embedded ANSI in object names are ANSI-optimized and correctly terminated with %cn. -- Added a 'report' command that shows a distribution of 'last logged in' times for a week in 8 hour intervals. -- Updated lnum() function to accept three arguments. -- Enhanced secs(), convsecs(), time(), and convtime() to handle both UTC and local timezones with room for others. -- Added the Mersenne Twister random number generator. -- Added various time/accounting functions from DooferMUX. This is controlled by the GAME_DOOFERMUX define and it's turned off by default. Some of the DooferMUX stuff may be removed at a future time. -- Subnets can now be expressed with the 'slash' notation. i.e, a.b.c.d/e -- guest_site configuration option is in, but based on input from ChaoticMUX, and RHostMUSH, this may be accomplished in another way or with a different name. And, there is currently no help for this option. -- Bug #401 - @dump/flatfile is now supported. -- Included all but two GAME_DOOFERMUX changes in the default build. -- Bug #251 - pos() is now ANSI-aware for pattern and source. I also optimized the single-character case. -- Bug #524 - Wizards can no longer clear each other's @mail with '@mail/debug clear='. -- Bug #493 - @function/pres and @function/priv are not allowed together. -- Bug #247 - ljust was ANSI-ignorant and now it supports a string for padding. -- Bug #248 - rjust was ANSI-ignorant and now it supports a string for padding. -- Bug #302 - center was ANSI-ignorant and now it supports a string for padding. -- Bug #531 - inc() should return 1. -- Bug #532 - inc(WIBBLE) should return 1. -- Bug #375 - Added table() function from PennMUSH. -- Bug #522 - Enhanced '@mail/debug' to check for and repair mailbag item reference counts. -- Bug #539 - Server will wait 10 seconds after startup before accepting @restart requests, and any SIGSEGVs during this period do not cause a @restart either, but a prompt abort. -- Added CRC32, PACK, and UNPACK softcode functions. -- Included changes from port to Tru64 Unix. -- Can now use @set and set() to set multiple flags at a time. -- Added ChaoticMUX's colored channel names including the same file format. -- Added floordiv(), remainder(), and changed mod(). -- Added INFO command which can be used at the connect screen and from within the game. -- Added automagic date parsing as part of convtime. The date parser supports free-form dates and also ISO formats including year/day, month/day, and weekofyear/dayofweek. -- Morgan added @conformat and @exitformat from PennMUSH. -- Marlek added @nameformat. -- Hellspawn added @dolist/notify. -- Hellspawn added @notify/quiet. -- @pemit/list to behave like a series of @pemits. Requested by Alierak. -- Added output separator to ITER, PARSE, and MAP. Patch from Ashen-Shugar. -- Added PICKRAND() from ChaoticMUX. -- Added LRAND() from TinyMUSH 3.0. -- GAGGED players no longer allowed to speak on channels. -- The WOD_REALMS option now shows up in INFO. -- Added LADD() from TinyMUSH 3.0. -- Bug #704 - Added T() from PennMUSH. Thanks Raevnos. -- Bug #563 - Add emit() function. Thanks Raevnos. -- Added remit() function. -- Bug #677 - Add oemit() function. Thanks Raevnos. -- Added if() from PennMUSH. Thanks Raevnos. -- Hellspawn added @backup from ChaoticMUX with corresponding backup script. -- @break command from Raevnos and PennMUSH. -- LROOMS() function from Marlek and RhostMUSH. -- Locks no longer require surrounding square brackets. -- switch() function now accepts < and > operators like @switch. -- Roy Anger updated comsys help. -- Reformatted wizhelp.txt. -- Freshened help for @aconnect and @adisconnect. -- Support second argument for squish(). -- Compiles under Cygwin. -- Changes for DEC Alpha Linux and IA64. -- Bug #799 - Update lcmds() to handle spaced commands and ^-listens. Bug Fixes: ~~~~~~~~~ -- Fixed: merge() let *bufc point one character too far. -- Fixed: space() SIGSEGV -- Fixed: lparent endless loop. -- Fixed: bad_command and shout log buffer overrun. -- Fixed: welcome screen character creation SIGSEGV -- Fixed: @mail could go blank if too large. -- Fixed: Players couldn't test dark wizards for AUDIBLE. -- Fixed: @mailer queuing loop if mailer was disabled. -- Fixed: help topic aliases were shown. -- Fixed: Removed DarkZone 990 character limits. -- Fixed: non-players can no longer use @mail. -- Fixed: @clone stepped on pennies. -- Fixed: @ps was not showing @wait 0 commands. -- Fixed: SIGSEGV in dbconvert with object @locked to sex:f when no other user-defined attributes have been defined. -- Fixed: subtle bug in ANSI_TruncateToField going from normal to normal color near the end of the buffer. -- Fixed: Buffer trash problem with delete() function. -- Fixed: Rounding bug in time_format_1 (affected WHO). -- Fixed: fun_ansi used ANSI_TruncateToField with the wrong field size. -- Fixed: idle() returned '0' for unconnected players instead of '-1'. -- Fixed: Protect math libraries against NaN and Inf with IEEE floating-point goo. -- Fixed: SIGSEGV bug in before() and after() if no second parameter was given. -- Fixed: HAVE_WAIT3 build issue on FreeBSD. -- Fixed: bsd.cpp SIGUSR1 blockage. The second SIGUSR1 would not be caught. -- Fixed: @program me SIGSEGV. -- Fixed: @pemit/list to a list of players sometimes used strtok a second time. -- Fixed: @dbclean and @prog bug caused by atr_add_raw/atr_get_raw idiom. -- Fixed: SIGSEGV in undocumented alphamin() and alphamax(). -- Fixed: Parser wasn't enforcing minimal number of arguments. -- Fixed: Lit() bug and unsaved parser mode. -- Fixed: Potential StringCopyTrunc overflow in site names. -- Fixed: Potential buffer resuse in atol call in do_open in create.cpp -- Fixed: mid() SIGSEGV. Also made mid() ANSI-aware. -- Fixed: fun_create SIGSEGV. Argument count not validated. -- Fixed: Edge case ANSI bleeding. -- Fixed: die() edge case SIGSEGV. -- Fixed: buildnum.data missing in distribution. -- Fixed: INT64/scanf/printf problem on FreeBSD. -- Fixed: Configuration file SIGSEGV. -- Fixed: Race conditions in @restart, @dump, and @shutdown which can cause DB corruption have been fixed. -- Fixed: @shutdown now waits for a forked dump to finish before exiting the game. -- Fixed: All known comsystem buffer overflow issues have been fixed. -- Fixed: Setting a room transparent and linking an exit to home would SIGSEGV. -- Fixed: Invalid master_room references would SIGSEGV. -- Fixed: protect against atof() SIGSEGV in certain libraries. -- Fixed: @program + LOGOUT + piping interactions would SIGSEGV. -- Fixed: NOBLEED with enough ANSI caused a buffer overrun and stack corruption and a SIGSEGV. -- Fixed: Buffer overflow problems with ucstr() and lcstr() causing SIGSEGV. -- Fixed: Buffer overflow problems with safe_tprintf_str that would SIGSEGV. -- Fixed: @mvattr would still remove the source attribute if it couldn't add the destination attribute. -- Fixed: events_daily_hour can now be hour 23 without causing daily activities to execute 3-4 times about every 15 minutes. -- Translate() now quotes backslashes correctly. -- @mail/fwd checks whether a message is already in progress. -- @doing color leaking. -- Trunc() now truly truncates a number instead of rounding. -- Fixed: @wait bug. -- Fixed: If you have @mail, and then purged it all (everything in all folders), you wouldn't be able to receive any further @mail until the game @restarts. -- User-attribute name length was enforced incorrectly. -- delcom showed DARK wizards leaving. -- Fixed a bug where parse_to was looking for an escape character on byte -before- beginning of an allocated buffer. -- Fixed a bug where pending characters in 'session' report was negative. It was caused by receiving a backspace without something to backspace over. Telnet clients usually demonstrate this bug. Other clients do the editing themselves before they send. -- @mail/fwd caused a SIGSEGV. get_attr_raw can return NULL. -- Set flag2 and flag3 to zero for a minimal room. This is just an uninitialized variable that left most of the flags set to random stuff on non-debug builds. -- Fixed a lot of lint-type issues. -- Fixed: mid() SIGSEGV. Also made mid() ANSI-aware. (from Robby Griffin) -- Fixed: fun_create SIGSEGV. Variable number of arguments, pointers not guaranteed valid. (from Robby Griffin) -- Fixed: edge case ANSI bleeding. (from Robby Griffin) -- die() SIGSEGV. (from Robby Griffin) -- Fixed: long integer problem in FreeBSD. (from Robby Griffin) -- Fixed: Configuration file SIGSEGV. (from Lew Newby) -- Changed: Config option added to deal with guest logins at reg-only MUXen. (from Audumla) -- Use g++ explicitly instead of gcc. This fixes a problem with builds under RH 5.1. (thanks MacGuyver) -- Documented band(), bnand(), and bor(). -- Documented link(), subeval(), tel(), and valid() from MUX 1.6 -- Documented allow_guest_from_registered_site configuration option. -- Obsoleted cache_depth, cache_trim, and cache_width in wizhelp.txt. -- Documented max_cache_size in wizhelp.txt. -- Changed default concentrator port in wizhelp.txt. -- Updated crash_database entry in wizhelp.txt -- Documented game_dir_file and game_pag_file configuration options. -- Obsoleted gdbm_database configuration option. -- do_conv now accepts "Jan 01 00:00:00 2000" as well as "Sat Jan 01 00:00:00 2000". Long-standing bug where the comments and the code describe different things. -- Fixed bug in trimmed_site where with a sufficiently large site_chars configuration limit, the server will overflow a MBUF_SIZE buffer. -- Fixed slow SBUF memory leak in find_power() which is called by the haspower() softcode function (from Robby Griffen). -- Found memory leak in !MEMORY_BASED + RADIX_COMPRESSION. -- Found typo that prevented !MEMORY_BASED + RADIX_COMPRESSION configuration from compiling. -- Fixed the way convtime() mishandled daylight savings time. -- TRUNC(5.0) would return 0 because the fractional part was zero and fun_trunc was testing the wrong number. This bug was introduced at the time as the IEEE floating-point Ind/+Inf/-Inf stuff was introduced. -- Subnet masks for restricted sites are now validated. -- Bits in the base IP address for restricted subnets are now removed. -- MEMORY_BASED attributes were allocated one byte too short (introduced in Beta 8). -- isValidSubnetMask() went through the wrong sequence of valid subnet masks (introduced in Beta 9). -- cf_log_syntax showed gibberish because of the way va_start/va_end-type arguments were handled (introduced in Beta 9). -- Setting #1 GOING is no longer permitted. -- @create no longer can create things with blank names. @create(%b,) -- MUX is more restrictive when loading comsys.db -- A KILLED database didn't have passwords in it (also with MEMORY_BASED). Introduced in Beta 10 (Build #267). -- objeval() security was too lax. -- The mail_sw and malias_sw tables were not terminated. -- Side-effect functions now enforce the same security that the corresponding commands enforce. -- CR, LF, and TAB are not allowed in @doing and @doing headers. -- Creating an exit like 'tes%crt;t' would leak ANSI color. -- Using a pipe with an unconnect player would duplicate output. -- Security flaw in @mail allowed WIZARD to use objeval to read @mail. -- Guests can no longer set attributes on themselves. -- @addcom allowed empty aliases. -- Strange player names are no longer allowed with '@wait 0=@pcreate %b=blah'. -- Buffer in view_atr was too small. No ill effects however. -- Bug with %v in the parser -- only apparent with syntactically incorrect use of %v. -- GetProcessorUsage assumed HAVE_GETRUSAGE. -- conn() now returns -1 for unconnected players as documented. -- A MEMORY_BASED build will now properly create a minimal database. -- Forward list length is now checked to avoid SIGSEGV. -- @toad now releases comsys and @mail resources associated with player. -- Bug in set_prefix_cmds that would effect space mods. -- Fixed minor bug in dbnum() used with sorting dbrefs. It's also smaller and faster. -- Fixed minor bug in GeneralTimeConversion with how to express the pluralization of '0'. -- Use time_t instead of long in test_time_t(). -- Bug #277 - escape() is now ANSI-aware. -- Bug #293 - secure() is now ANSI-aware. -- Bug #352 - @mail 0 now gives something reasonable. -- Bug #422 - Fixed @toad race condition. -- Bug #461 - Descriptors 0 and 1 could be closed after a @restart. -- Bug #462 - boot_slave could close it's own socket to the DNS slave. -- Bug #463 - identd info never made it through on Win32. -- Bug #464 - Flag aliases are now put into canonical form. -- Bug #480 - @toad strips the zone on chown objects. -- Bug #483 - Bad socket descriptions are now discovered and removed. -- Bug #484 - @dump/text prevented normal @restart/@dump/@shutdown. -- Bug #485, #486, #487, #488, #489, #490, #491 - possible buffer overflows. -- Bug #492 - @dbclean is no longer allowed while @dump'ing. -- Bug #495 - @destroy strip the zone on chown objects. -- Long @malias no longer SIGSEGV at game start time. @malias length is limited to 12. @malias description visual width is limited to 40. -- columns on @malias reports are lined up even if descriptions include ANSI color. -- Bug #502 - Don't allow filenames to be @admin'ed from inside the game. The bug allowed anyone with #1 access to read files that the MU server itself had access to. -- Bug #507 - A recursive @function will overflow the stack. -- Bug #509 - Wrong call to free_lbuf in comsys.cpp with pointer from RestrictTitleValue. -- Bug #510 - @teleport should not allow anyone to teleport anything into a garbage object. -- Bug #513 - SIGSEGV and jibberish from regmatch(). -- Bug #320 - There were some DarkZone 1000-character limits in mail.db and comsys.db which would SIGSEGV at load time if the mail.db or comsys.db file had a long line it in. -- Bug #520 - q-registers are not cleared properly. The value of the global registers leaks between interactive commands. Ancient bug made more obvious by MUX2's different scheduler. -- Bug #526 - table() didn't default for delimiter and separator. -- Bug #270 - Boolexp grammer was ambiguous and could cause the flatfile to be ambiguous. -- Bug #456 - Add limit to number of comsys aliases. -- Bug #414 - pmatch() behavior didn't match its helpfile topic. -- Bug #519 - @mail ref counts could be thrown off. -- Bug #389 - @mail subject was not ANSI-aware and could leak color. -- Bug #523 - Memory leak when importing +V1 mail.db files. -- Bug #543 - Because popen is more restrictive with it's second argument than fopen, the 'compression' config option didn't work on Unix. -- Bug #546 - @fixdb/rename uninitialized variable. -- Bug #547 - Buffer in pool_err needed to be larger. -- Bug #549 - An fread on the second pass in attrcache.cpp, line 110 needed to protect itself against truncated files (disk quota limits for example). -- Bug #564 - Encrypt/decrypt printf will leak passwords onto file descriptor 1 (which, frankly, could be anything). -- Bug #542 - timeconv(time()) is off by 1 hour during daylight savings time. -- Bug #544 - 'Previous' file is not handled properly with compression on. -- Bug #545 - @malias description width not set at @malias creation time. -- Bug #565 - Encrypt can be used to generate characters 28, 29, 30, 31, and probably more. -- Bug #568 - Encrypt/decrypt is not ANSI-aware. -- Bug #534 - pi() topic is wrong in helpfiles. -- Bug #541 - A page-split shouldn't give the message that it's waiting on a @dump unless it really is. -- Bug #265 - _ATTRS for Chimera. -- Bug #378 - A perpetual @restart doesn't stop until the game is crashed. -- Bug #449 - link() permissions need to be enhanced (and tel() and pemit()). -- Bug #611 - children() is unintentionally wiz-only. -- Bug #599 - @halt/all bug. Pennies are given to #0. Reference to dbref -1. -- Bug #601 - @notify over-notifies. -- Bug #570 - Objects should be able to send @mail. -- Bug #584 - Server hangs if mail.db is zero-length. -- Bug #581 - Important configuration dbrefs should be validated. -- Bug #590 - A combination of Zones, EnterLocks using user-attributes cause attribute name goofiness for examine. -- Bug #587 - No help for the ':' help. Bug in the code. -- Bug #500 - Change idle times and connect times to floored times instead of rounded to nearest. -- Bug #613 - #-1 RECURSION LIMIT EXCEEDED missing. -- Bug #625 - Fixed max() to work for negative numbers. -- Fixed typo that could have affected the logic, but didn't in this particular case. -- Bug #664 - The "playername" syntax at the connect screen was broken. -- Bug #623 - Interaction between GOING and @restart affected exits. -- Config commands didn't accept upper-case flag names. -- Bug #665 - @mail/nuke corrupted the post office. -- Bug #390 - @mail without a body isn't sent. -- Bug #637 - semaphores with timeouts wouldn't run when @notified until the timeout, and semaphores without timeouts didn't have a predicatable run time when @notified, but usually it was right away. -- Bug #640 - Whispering to an unconnected player should behave more like paging an unconnected player. -- Bug #661 - comtitles near the maximum length were truncated when the game first starts. -- Bug #693 - TRACE with large output causes SIGSEGV. Found on Due Rewards. Fixed by Brazil. Bug from MUX 1.6. -- Bug #706 - WIZARD could @chownall #1. Reported by Ashen-Shugar. Fixed by Hellspawn. Bug from MUX 1.6. -- Bug #708 - give to garbage objects. Reported by Ashen-Shugar. Partial fix by Hellspawn. Final fix by Marlek. Bug from MUX 1.6 -- Bug #757 - @wall/admin double emits. Report by many. Fixed by Hellspawn. Bug from MUX 1.6. -- Bug #751 - @nameformat, @conformat and @exitformat global registers are saved and cleared. Reported and fixed by Brazil. -- Clean up mkindx. Don't use '\r' in the index. Write clean structures. -- conntotal() and friends now account for multiple sessions properly. -- Fixed color leaks in long comsys headers. -- Work-around in sane_inet_addr() to handle 255.255.255.255. -- Bug #707 - Wizard can @chown garbage objects. Marlek fix. Reported by Ashen-Shugar. Bug from MUX 1.6. -- Bug #709 - Wizard can tel into objects that are inside garbage objects. Found by Ashen-Shugar. Fixed by Marlek. -- Bug #752 - pmatch() doesn't accept '*' as described in the help. Found by Ashen-Shugar. Fixed by Marlek. -- Can give objects to themselves. Fixed by Marlek. -- search() now uses the DbrefToBuffer() calls to ensure that returned dbrefs aren't truncated in the middle of the number. -- Workaround nonstandard continuation-line behavior of gcc 2.96 on Mandrake 8.0. Thanks Marlek. -- On Win32, the logs now use CRLF instead of NL. -- Clean build on gcc 3.0. Thanks Morgan. -- SIGSEGV bug in revwords(). Bug from Treyvan. -- lparent(), lcon(), and lexits() now use the DbrefToBuffer() calls to ensure that returned dbrefs aren't truncated in the middle of the number. -- Missing type case in destroy_obj(). Thanks Jake -- Possible check_pennies() SIGSEGV bug. Thanks Jake. -- Fix/extend the display of help so that blank lines in the help files are displayed as blank lines. -- The inet_ntoa() return value is to a static buffer, so it's value must be used or copied before making any other socket calls. -- TRACE output didn't keep track of the original player dbref. -- Bug #686 - Fix to @listcommands. @addcommand'ed commands weren't shown. -- Bug #710 - Leaving an object that is inside a garbage object may garble your location and randomly put the server into an endless loop. -- Bug #357 - objects on channel can now use MONITOR, @listen, or @ahear. @aahear worked before, and it still works. -- Bug Fix: cat() with no arguments causes SIGSEGV. -- Several semaphores waiting on the same object/attr could be @notified out of order. -- Channel messages are considered OOC. -- Bug #662 - SIGSEGV in @dbck. -- Bug #618 - Logic in new_home enables being inside a garbage object. -- Bug #424 - Linking deposit refund. Patch from Jake. -- Bug #585 - Parent isn't cleared during @destroy process. Patch from Jake. -- Bug #765 - whispering to objects with ears should still be allowed. -- Bug #602 - fun_ansi reaches backwards into the buffer. -- Bug #786 - Interaction between SUSPECT and 'log all_commands'. If both on, SUSPECT actions do not show up in the logs. Patch from Raevnos. -- The slave boot code doesn't update maxd which (depending on the descriptor value of the slave) can prevent communication with it. -- Try to avoid crashing with MUSH 2.2.x and U1 flatfiles that were garbled in the transfer between Unix and Win32. -- Unterminated buffer operation in setinter(). -- Fractional part of time request can get into the timezone info. -- @exitformat passed all exits into %0 if at least one of the exits was visible to the user. -- Objects could use flags() to see CONNECTED flag of DARK WIZARDs. -- Bug #799 - SIGSEGV possible in lcmds(). -- Fix use of %9 with udefault(). -- Fix edit(test,,a) --> 'testa'. Found by Ashen-Shugar. -- Fix the way nanoseconds are broken into milliseconds, microseconds, and nanoseconds. Probably not observable in MUX 2.0. -- Fix filter() behavior where a prefix of '1' was enough to test true. Fixed by Raevnos. -- @chzone should have cleared powers. Fix by Jake. -- Fix MAT_HOME bug. Found by Alierak. -- Fix channels() against the potential of having more than an LBUF in channel names. Channels can only be created by Wizards, so this isn't an urgent issue. -- Fix SIGSEGV bug in ANSI_String_Copy that becomes an issue with the use of center/ljust/rjust. Discovered by Elmeria@Crystal Bridges. -- Fixed uninitialized variable in a utility function used by LROOMS(). -- Fixed @listcommand when @addcommand'ed commands have previous aliases. It only affected the report. -- Fix '-0' display for 'think imul(1024,1024,1024,1024,1024,1024,8)' Reported by Alierak. -- Improve/fix 64-bit alignment of buffers via backpatching from MUX 2.1. Alierak prompted. -- Use A_VA name instead of equivalent literal 100. Reported by Alierak. -- pool_check() needed to verify PCACHE pool as well. Reported by Alierak. -- Fixed Prefix-without-suffix bug. Reported by Alierak. -- On a NetBSD/Alpha system in which sizeof(unsigned long) == 8, IPv4 mask validation gave false negatives. Reported by Alierak. -- On same NetBSD/Alpha system, reverse-DNS slave was non-functional because gethostbyname() choked on the eight-byte IPv4 argument. Reported by Alierak. -- IP ranges of the form 'a.b.c.d/m' would allow 'm' to be text and take it as a zero value. For example, 'forbid_site 1.2.3.4/foobar' would effect every IP address. Too easy to shoot yourself in the foot. Reported by Alierak. -- LROOMS() would not check across the entire database. It left off consideration of the database's last dbref. Reported by Alierak. -- For exits, loc(foo) did not return the same answer as rloc(foo,1). Reported by Alierak. -- Use long signal names if they are available. Bug from MUX 1.6. Reported by Alierak. -- Fixed a memcpy/strip-ansi idiom bug in pos(). Found by Jake. Bug introduced by Brazil. -- raw_broadcast() can be called from a signal handler and therefore, it shouldn't be allocating/freeing memory. -- After a @restart, '@list resources' reports zero open sockets. This was previously fixed in MUX 2.1, so we are just Backpatching. Prompted by Alierak. -- Fixed bug in ansi() that was previously fixed, but has returned. ansi() returned a result that is much shorter than it needs to be. Reported by Alierak (both first and second time). Brazil's bug. -- Backpatched some error messages for several zone functions from MUX 2.2. -- Don't allow children(#-1) to return all unparented dbrefs. Bug from MUX 1.6. Reported by Alierak. I'm calling it a bug, and yet, there is some value in the previous behavior. -- Fix IF(,,,,,) from reporting an invocation error for "IFELSE". Reported by Alierak. -- think dec(5,2) reported an invocation error for "INC". Reported by Alierak. -- Strip ANSI from argument to scramble to prevent ANSI from being scrambled. Backpatched from MUX 2.1. Prompted by Alierak. -- lstack(,,,) reported invocation error for "CSTACK". Reported by Alierak. -- empty(,,,) reported invocation error for "CSTACK". Reported by Alierak. -- items(,,,) reported invocation error for "NUMSTACK". Reported by Alierak. -- Fixed SIGSEGV bug in vmul(). Reported by Alierak. Bug from MUX 1.6. -- Fixed unlikely SIGSEGV bug in function table initialization. Brazil's bug. Fixed by Brazil. Reported by Kieran Boru. -- OutOfMemory() and AssertionFailed() reversed sense of bCanRestart. Reported by Alierak. Brazil's bug. -- Fixed convtime() SIGSEGV. Reported by Alierak. Brazil's bug. -- Fixed probable bug on the Win32 build where a socket could be setup as non-blocking. The non-blocking behavior has not been reported or reproduced, but if, by chance, the right four bytes of stack memory were zero, a reading of the code indicates that non-blocking would have been de-selected instead of selected. The Unix distribution is unaffected, and since this has not been reported or reproduced previously, the odds are good that the calling pattern with a connection is made doesn't allow those four bytes to be zero. Brazil's bug. Performance Enhancements: ~~~~~~~~~~~~~~~~~~~~~~~~ -- The parser speed has been substantially increased: TinyExec() and parse_to() -- Main networking loop is brief, to the point, and fast. -- Combined all the queues, do_second, dispatch, cache_tick, do_top, etc. and the way process_output and process_commands were scheduled into a single unified mini-task design. Everything is now scheduled, or it doesn't run. @kick, @timewarp, @enable/disable queuing all still work. The server will sleep until there is work to do or IO to perform, otherwise, it will sleep for an arbitrarily long time (which ight now is 5 minutes). The WinNT shovechars loop is now 12 lines long (not counting blanks, braces, or comments). Alarm() has been removed from the server. It caused the main networking loop to run once a second regardless of whether there was anything on the queue to run or whether the status of any connections changes. -- Commands that are waiting on quota are now scheduled more fluidly. -- The interface for safe_copy_chr() and safe_copy_str() is now different which was done to support a speed increase. -- Bread-and-butter dumping functions: putref, getref, putstring, and getstring_noalloc have all been highly optimized for speed. -- Translate() and all handling of ANSI functions has been optimized in terms of execution speed and also optimized in terms of using only the minimal number of sequences to accomplish the color goal. -- ansi() is faster. -- Got rid of unnecessary static buffers to save memory. -- and(), or(), xor(), add(), mul(), max(), and min() re-written for speed. They will also handle a single argument. -- Using ChashTable instead of the htab. The newer implementation uses extendable hashing of large pages of memory. This avoid the linked lists that are virtual memory hostile and keeps the server's working set small. Also this structure automatically grows as necessary without degrading performance. -- User memcpy or memmove appropriately depending on overlap assumptions. Compilers deal with memcpy as an instrinsic function and so these are typically the same as large structure assignments. -- Use stricmp, toupper, tolower as approriate instead of server's variety of these same functions. -- Avoided a lot of unnecessary memory allocations, improved code readability and performance of how help file topic names are indexed when the game loads. -- Changed the way user attributes are stored and accessed to save a duplicate copy of attribute names from memory. This saved 1.5MB of memory for me. -- Increased the size of stream buffers for @dump and game startup. -- Improved performance of dbconvert when loading a DB by doing some key sorting. -- mid() was still one character too agressive. -- repeat() was one character too conservative. -- Save and restore global registers using memcpy instead of strcpy. -- Save and restore global registers in a few extra places in the code. -- Use our own tables for character typing instead of ctype.h -- Use MakeCanonicalAttributeName and MakeCanonicalAttributeCommand with their truncation, uppercasing, and validity checking done in one place and in one pass. And have them called from one level in the code. This instead of having these steps performed redundantly at different levels in the code. -- Removed cache_reset calls throughout the server as the call is a null operation with CHashFile. -- Maintain a length for the current A_LIST so we can use memcpy instead of strcpy for speed. -- Wrote DbrefToBuffer_* functions that deal with creating dbref lists more efficiently. -- Improved speed of get(), xget(), and v() by using length from the database layer. -- Improved speed of switch() by avoiding a buffer allocation. -- Improved speed of lt(), lte(), gt(), gte(), eq(), and neq() by avoiding use of the floating point conversions when possibly. -- Use safe_chr instead of safe_str whereever possible for speed. -- Added safe_ltoa because it's faster than using safe_tprintf_str(buff, bufc, "%d", i); -- Improved speed of insert(), replace(), and ldelete() by using memcpy instead of strcpy. -- Re-wrote do_conv to avoid a buffer allocation, safe_db_copy call, etc. -- Re-wrote ljust() and rjust() for speed, and they do the right thing ANSI-wise as well. -- The random number generators are now given a seed which is based upon the full resolution of the current time (milliseconds or better) and the game's process id. -- LAST() is faster. -- Removed duplicate code. -- Improved speed and consistancy of object name checking. -- Use assert checking macros. -- Improve speed of queue argument and environment passing. -- Removed three unused LBUF_SIZE buffers in !RADIX_COMPRESSION builds. -- Rewrote parse_msglist to avoid an extra buffer. The parse is no longer destructive. -- Improved speed of Tiny_atol and Tiny_atoi64 by 68%. -- Improved speed of Tiny_atof by 13 times for common cases. -- Changed fval() to avoid using sprintf() and strip_useless_zeros for the common cases. -- Minor typo in quota.cpp that didn't change the statements logic. -- Fixed SIZEOF__LONG typo in code that would be very unlikely to affect any platform. -- Removed unintialized have_macros config option. Could have been an issue if you were running a non-DEBUG build and wanted to disable the comsys. -- Fixed SIGSEGV bug in timeutil with how the timezone offset table was maintained. It required three things to happen at the same time. -- Fixed memory leak of Bools upon a @backup or @dump/flatfile. Bug originated in MUX 1.6, first fixed in Chaotic MUX, and is already fixed in MUSH 3.0. -- Fixed @dbclean so that it updates the @addcommand and @function data structures as well. Cosmetic Changes: ~~~~~~~~~~~~~~~~ -- Removed the unused 'empty' column from @list hashstats. -- All the tools have a version number now so that you can tell that they go together. -- README and related server docs have been reviewed and updated. -- buildnum.data added into distribution. -- Spelling error in 'wizhelp have_macros' topic. -- Bug #521, #527, #529 - help topic typos. -- Freshened help. -- Changed db_load and db_unload usage message. -- @list hashstats report is reformated to avoid rolling over to negative numbers. Miscellaneous: ~~~~~~~~~~~~~ -- Game uses UTC time internally. -- Free memory properly when the game exits to allow potential memory leaks to be more easily found. -- Source code untars into its own directory. -- Miscellaneous server documentation moved to docs/ -- Increased the size trigger for rotating logfiles on Win32. -- Syncronized version.cpp, _build.cpp, and _build.h between Unix and Win32. -- No longer use vfork. -- Update config.guess and config.sub to support MAC OX X more conveniently.