TinyMUX 2.6: CHANGES Last Update: April 2010 Major changes that may affect performance and require softcode tweaks: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Deprecated LSTACK(), POP(), PUSH(), PEEK(), EMPTY(), and ITEMS(). These functions are still available via the --enabled-deprecated configuration switch. Requested by Ian. -- Port code to the 64-bit edition of Windows XP. Jake and Brazil. Feature Additions: ~~~~~~~~~~~~~~~~~ -- FCOUNT() to tally function invocations in . Requested by Ian. -- Add SITEINFO() to return the site flags for a player or port. Added by Jake. -- Use Moniker instead of name in enter/leave emits, rob, kill, @toad, boot, and in other similar situations. -- Add support for %= substitution. From TinyMUSH 3. -- Use localtime_r() if available. By Brazil. -- Added command line switch (-n) to control choice of networking method on Win32. -- Added support for 2-argument mix(). -- Added optional third 'step' parameter to lnum(). -- Added optional second argument for lcon() for subseting the returned list by type. -- The 'You own a floating room' message is only given for rooms which are not connected to either the player_startint_room or to a room marked FLOATING. Previously, every room not connected to the player_starting_room had to be marked FLOATING. -- Added QUELL flag from Firan to temporarily suppress Wizard powers. -- Added @switch/notify. -- Merge Firan MUX source modification and collected them under the --enable-firanmux ./configuration switch. This also typically requires the --enable-memorybased switch. Some of the following may eventually be enabled in the default build: Attributes: @alead, @lead, @olead, and @color Permissions: no_immobile, no_restricted Options: immobile_message, sql_server, sql_user, sql_password, sql_database, mail_server, mail_ehlo, mail_sendaddr, mail_sendname, and mail_subject. Flags: LINEWRAP, IMMOBILE, RESTRICTED, and PARENT. Functions: sql(), setparent(), setname(), trigger(), mailsize(), mailsubj(), mailj(), text(), successes(), and distribute(). -- Added @email command from Firan MUX to the default build. -- Added --enable-firanmuxconvert which turns on code to remap three conflicting attribute numbers. The first database load requires this switch, and then it should be turned off. -- Included distribute() in the default build. -- Added float_precision configuration parameter. -- Added TRACE attribute flag which provide a finer-grain debugging tool than @set'ing TRACE on the object. Requested by Nixer. Implemented by Brazil. -- Added escapes for CR, LF, TAB, and ESC to the flatfile format. This flatfile no longer contains a mix of CRLF and LF to confuse flatfile portability. -- Add lflags(/) form similar to flags(/). -- @power will accept multiple power changes in one command. -- Add @trigger/notify. -- Added etimefmt(). -- Added nine additional parameters to map() which (if present) are passed in as arguments %1-%9. Suggested by Ian. -- Added nine additional parameters to filter() and filterbool() which (if present) are passed in as arguments %1-%9. Suggested by Ronan. -- Added lbuf_size as a read-only configuration option so that config(lbuf_size) can report it to softcode. -- Added STEP() following TinyMUSH and RhostMUSH (Issue 1). -- Add /nostrip switch to @chown, @chownall, and @clone. -- Add new successes() code from Jon@Firan. -- Combine old and new versions of SUCCESSES(). -- Added comalias, doing, exitname, malias, maliasdesc, and password tests to VALID() (Issue 211). -- Added no_name attribute flag to suppress name on oattribute emits (Issue 220). -- Added /no_name switch to @verb (Issue 221). -- Added stripped_flags configuration option (Issue 200). This affects guests, @chown, @chownall, and @clone. -- Do not display MOTD/WIZMOTD unless @motd/@wizmotd is set. -- Add support for loading TinyMUX 2.7 flatfiles, mail, and comsys. Bug Fixes: ~~~~~~~~~ -- Fix over one thousand level 4 warnings. Jake and Brazil. -- Deprecate use of strcpy() and strncpy(). Jake and Brazil. -- Use size_t where appropriate. Jake and Brazil. -- Deprecate use of sprintf(). By Brazil. -- Deprecate use of localtime(). By Brazil. -- Fix 'round(-0.5,0)' --> '-0' to be '0' instead. -- Disallow the train command from being used on itself. -- Add protection to @chownall that victim be a player object. -- Fix uninitialized variable in HASRXLEVEL(). It should have used 'executor' instead of 'player'. -- Fix time_t handling for 64-bit machines. Timezones could be wrong for dates earlier than Jan 1 1970 on 64-bit Unix. -- Fix @hook for goto command. Being unable to move also affected the ability to use other commands. Reported by K hall. -- Added checking to convsecs() to return '#-1 INVALID DATE" if first argument is outside the supported range. -- All but the last part of very Long lines from the network were discarded when for very long lines, only the first part should be saved. Not a crashing bug. -- Server should not attempt to @clone Created and Modified attributes. -- Fix single-character case in pos(). It would never return success. Bug introduced in 2.6. It does not appear in 2.4. -- Change isdbref() to return '0' instead of '#-1 ISDBEF EXPECTS...' -- Fix ANSI overflow bug in ANSI_String_Copy() introduced by using an unsigned size_t in place of a signed 'int'. Bug introduced in 2.6. -- Add 'other half' of buffer overflow protection to a case in process_cmdent(). Without the other half, the first half causes a crash instead of prventing it. Found and fixed by Sparks. -- Remove double evaluation from distribute() and sql(). -- Save/Restore global registers while executing @descformat. -- Fix map(), filter(), and filterbool() to avoid evaluating the given attribute for an empty list. -- Strip ANSI from messages before matching messages against @filter and @infilter patterns. -- Zap trailing NL in help topics. -- Added help topic for HTML flag. -- When listening on multiple ports, continue to run the server as long as one of the requested ports is available. -- mix() doesn't include a function-invocation test (Issue 71). -- Examples in help topics show old-style 'say' (Issue 72). -- Attribute-level tracing does not report sortby() comparisons (Issue 73). -- @email help doesn't mention @mail addy/subject=body form (Issue 86). -- @email - do {} while () to simplify the sources and reduce the sizeof the program (Issue 79). -- @email - MUX_VERSION replaced with mudstate.short_ver (Issue 78). -- @email - mod_email_sock_readline() adds a '\0' one position too far (Issue 87). -- @email - Remove unnecessary zeroing of buffers (Issue 80). -- @email - Typo in do_plusmail of '0' instead of '\0' (Issue 90). -- @email - Unnecessary strlen() (Issue 81). -- @email - do_plusmail loops look at undefined bytes if inputline is 1, 2, or 3 bytes long (Issue 89). -- @email - Memory leaks (Issue 84). -- Fix SIGSEGV when udefault() gets more than 12 arguments. Fixed by Alierak. -- @email - initialize input buffer to the empty string to cover return(0) error cases. Probably introduced by Issue 80 fix. Fixed by Alierak. -- @email - Comment doesn't match code (Issue 82). -- %v accepts accented characters (Issue 91). Found by Alierak. -- sortby() breaks when nested (Issue 88). Found by Alierak. -- @email - Config options may contain CRLF sequences (Issue 76). Found by Alierak. -- @email - Subject and recipient address may contain CRLF sequences (Issue 77). Found by Alierak. -- Fix theoretical crash if DNS slave returns half a result. Found and fixed by Alierak. -- Fix lbuf leak from Issue 88 fix. Found and fixed by Alierak. -- All return paths from process_command(), new_connection(), and check_connect() must restore mudstate.debug_cmd. Found and fixed by Alierak. -- Multiple addcom gives no warning (Issue 93). Fixed addcom topic. -- @email - Message body may be too long to append CRLF.CRLF (Issue 74). Found by Alierak. -- @email needs to handle CRLF.CRLF in message body (Issue 75). Found by Alierak. -- @email - Accents could affect message validity (Issue 85). Found by Alierak. -- Allow addcom to channel names containing spaces (Issue 58). -- Fixed channels() help topic (Issue 54). The channels() implementation doesn't not return a comma-space separated list, but a space-only separated list. -- Fixed an lbuf leak in hasquota() introduced in TinyMUX 2.1. Bug found and fixed by Alierak. -- Document @clone/preserve switch. -- Update TRACE helpfile for new attribute flag functionality (Issue 104). -- Add @htdesc and @vrml_url documentation (Issue 44). -- Local declaration of ltdWarp in cque.cpp hid global declaration. @timewarp/queue would have ignored and become a no-op (Issue 167). -- @timewarp/queue advanced a queued command's displayed time (as seen by @ps), but did not update the run time of the underlying task, so the command did not execute any sooner (Issue 172). -- Protect qsort() from invalid arguments that should not happen (Issue 125 and 159). -- Add 'GameFull' reason which should never be referenced, but it suppresses a compiler warning (Issue 148). -- Remove arbitrary constant, 1000, and re-work @forwardlist codepaths (Issue 168 and 175). -- Suppress compiler warning in anum_extend() and compact code (Issues 169 and 170). -- Suppress compiler warning in add_helpfile() (Issue 165). -- Corrected 'shutodnw' typo in 'wizhelp signals' (Issue 177). -- Add checking and warning messages for next free attribute, range of numbers used with names, and range of numbers used with objects (Issues 176, 180, and 181). -- Require flagnames to be at least 1 character (Issue 183). -- Fix @flag wizhelp topic (Issue 182). -- Suppress compiler warning in conf.cpp (Issues 161 and 164). -- Suppress compiler warning in command.cpp (Issue 149). -- Write mux_open() to avoid direct use of open() (Issue 121). -- Remove all calls to fscanf() in mail.cpp and comsys.cpp (Issue 119). -- Fixed color leak in object names for @find, examine, inventory, and look when length of ANSI sequence exceeded 200 byte (Issue 184). Reported by K Hall. Not a crashing issue. -- Suppress compiler warnings in player.cpp (Issue 143 and 144). -- Suppress compiler warnings in stringutil.cpp (Issue 109). -- Suppress compiler warnings in help.cpp (Issue 132). -- Suppress compiler warnings in netcommon.cpp (Issues 141, 142, 186, and 210). -- Fixed uninitialized variables in fun_fmod() and fun_power() for non-typical build. -- Fix two configuration tests that broke with gcc 4.1.2. -- Avoid using strerror() directly (Issue 120). -- Fix compiler warnings in strtod.cpp (Issues 113, 114, and 115). -- Fix compiler warnings in functions.cpp (Issues 123, 124, 126, 127, 128, 129, 130, and 131). -- Fix compiler warnings in funceval.cpp (Issue 122). -- Fix compiler warnings in comsys.cpp (Issues 151, 157 and 158). -- Avoid using strncpy (Issue 118). -- Fix compiler warnings in mail.cpp (Issues 133, 134, 135, 136, 137, 138, 139, and 140). -- Fix compiler warnings in conf.cpp (Issue 162, 163, and 166). -- Fixed double lbuf_free() introduced in 2.6.0.3 (Issue 188). -- Fixed compiler warnings in alloc.cpp (Issue 146 and 147). -- Fixed infinite loop in linewrap_general() resulting from safe_chr() being a macro instead of a function. -- Fixed subtle $-command exclusion (Issue 193). -- Fixed @color interactions with @name and @moniker (Issue 194). -- Fixed v() references in 'help substitutions3' (Issue 195). -- @clist/full column alignment with six-digit dbrefs (Issue 196). -- @mail index listing alignment with @moniker (Issue 197). -- Added local.cpp hook to affect INFO and populate Patches: line with other compile-time switches besides WOD_REALMS (Issue 51). -- Fix unlikely memory leak if executor of a queue task happens to be a bad object by the time the queued entry is executed. -- Prevent @ccreate from creating channels with duplicate names (Issue 206). -- Wizhelp SUSPECT should describe that all commands from SUSPECT-set players are logged as controlled by the 'log' configuration option (Issue 199). -- @moniker without any argument gave 'I don't see that here.' followed by 'Permission denied.' (Issue 40). -- Update PATCHES file (Issue 189). -- RxLevel and TxLevel were reversed in @examine leading to much confusion in using reality levels (Issue 62). -- Added separate recursion limit protection on nesting of iter() and list() (Issue 216). MAX_ITEXT is 100, but raising the function recursion limit above that leaves iter() and list() open to step on nearby mudstate structures including help and global_registers. -- Disable WHO in Firan build (Issue 218). -- Fixed crash due to failure to clear @program data after logout (Issue 217). Found and fixed by Alierak. -- Disallow negative charge for channels (Issue 222). Found by Alierak. -- Fixed cases of look and @idesc interaction (Issue 45). -- Updated 'wizhelp @attribute' for clarity (Issue 190). -- Removed 'Attr. Cache' row from @list hashstats report for memory-based build (Issue 226). -- page, say, @pemit, and pose with /noeval would strip curly braces (Issue 225). -- Version and error strings containing the label 'Win32' were used in Win64 builds of TinyMUX (Issue 228). -- Fixed potential lbuf leak in munge() (Issue 227). Found and fixed by Alierak. -- Fixed lbuf leak when @hook attribute is empty (Issue 229). Found and fixed by Alierak. -- Fixed build error in version.cpp (Issue 230). -- INFO should show 'Patches' or 'INFO 1', but not both (Issue 236). -- @dolist and @trig were not passing TRACE bit through (Issue 237). -- @verb/no_name used unterminated verb_sw table (Issued 243). -- Fix typo in do_say() which left a bit-wise instead of a logical AND operation (Issue 245). -- Fix trailing padding in center() (Issue 253). -- Fix buffer overflow in fun_ladd (Issue 282). -- Fixed memory leak in scheduler because of running out of memory. -- Fixed non-player object's ability to hold coins. -- Fixed loading of coins from flatfile (i.e., across @restart for memory-based) (Issue 224). -- Fix Firan build break in fun_trigger() (Issue 288). -- Fixed +glance softcode in SGP minimal database (Issue 291). -- Fix memory leak in @mail error code path. -- Fix memory leak in process_cmdent(). -- HEIGHT() and WIDTH() returned least-idle port when given a port rather than the specified port. -- Fix doing header across @restart. -- Fix handle leak in comsys.db if initial parsing fails. -- Fix type-punning bug in mux_fpclass() that broke when compiled with gcc 4.1 or later with -O2 (which turns on -fstrict-aliasing) (Issue 322). -- Properly terminate uses of mux_exec(). Most of these are protected by EV_TOP or something else. -- CLog::AppendLog() does not actually position log at end of existing log file. Net result is only that first two lines (Containing to INI/LOAD entries) are lost. -- Allow %= to support single-letter attribute names and document. Issue 341. -- Fix WIDTH() to default to 78 instead of 24 (Issue 354). -- Open permissions on WIDTH() and HEIGHT() (Issue 356). -- hasflag() would not check for no_name (Issue 360). -- Fix the attribute flag names returned by lflags() (Issue 362). -- @set2 help topic does not mention case, trace, or no_name attribute flags (Issue 361). -- Fix LOG_DIR across @restarts (Issue 46). -- Drop dependency on QueryPerformanceCounter() (Issue 369). -- The flag_access configuration handler would SIGSEGV if a flagname was given without a list of permissions. -- The power_alias and flag_alias configuration handlers would SIGSEGV if flagname and alias were not both given. -- If guest_char was a THING instead of a PLAYER, copying the flagset of the guest_char wiped the object type (Issue 390). -- Fix buffer overflow with %=<> substitution (Issue 406). -- Fix comma handling in SGP places code for join, ojoin, depart, and odepart. -- grepi() failed to find patterns composed of both upper-case and lower-case versions of the same letter (Issue 425). -- @notify/quiet behaved like @notify/all (Issue 426). Reported by Barton. -- Improve ValidateConfigurationDbrefs() to prevent player_starting_room and similar dbref configuration options from refering to NOTHING (Issue 441). -- Fix escape() to adding leading backslash when string starts with color (Issue 453). -- Fix merge() to be ANSI-aware. -- Fix translate(%xua%xn%xyb,p) --> '%xua%xu%xyb' (Issue 461). -- Fix interaction between @notify and @destroy that left non-default semaphores blocked on garbage object (Issue 435). -- Add page-colon-space case (e.g., page p1=: 's clock ticks.'). -- Help did not match behavior of mail(, ) (Issue 477). -- Buffer footer corruption and SIGSEGV with columns() (Issue 501). -- Exits could be teleported to JUMP_OK locations (Issue 518) -- Fix Visual C++ 2008 Express Edition build error (Issue 509) -- Test MEMALLOC() return value in mguests.cpp (Issue 505). -- @toad wasn't deleting the right name from an internal table. -- Leading Ctrl-A in attribute was converted to '?' during 2.7 flatfile conversion. -- Set MYSQL_OPT_RECONNECT and MYSQL_SET_CHARSET_NAME MySQL options. -- Fix mid() with negative length (Issue 539). -- Fix padding in SHA1_Final() for data 9 bytes shorter than a multiple of 64 (Issue 544). -- Don't strip MSG_SAYPOSE or MSG_OOC when forwarding messages to contents, exits, etc. -- Option table was defined one element too large. -- Use CXXFLAGS instead of CFLAGS. -- Should be starting_pay instead of paystart and find_money_chance instead of payfind (Issue #589). -- Fix @dolist help topic (Issue 593). -- Change reference to no_program which should be no_command. -- Topic reference should be to 'regexp syntax'. -- Fix typo in substitutions3 (Issue 605). -- Fix typo on help @lock compound (Issue 606). -- Clarify use of see_all @power (Issue 584). -- Fix one case of #elif without a condition. -- Add missing attributes to muxattrs.dat. -- Fix @dbclean to not strip attribute owner and flags on attributes that it re-numbers (Issue 621). -- Fix access of uninitialized memory during dbconvert when @queuemax is set on player object (Issue 623). Performance Enhancements: ~~~~~~~~~~~~~~~~~~~~~~~~ -- In MEMORY_BASED, avoid malloc() call each time an attribute is added to an object. -- Optimize atr_add_raw_LEN() to reduce Firan load time from 40 seconds to 15 seconds (which includes firan.db, mail.db, and comsys.db). This translates to something upward of 28 MB/s. -- Optimize do_comsystem() ability to recognize what is not an alias. Alierak. -- Added reference counting to global registers which should improve performance and greatly reduce memory usage for games which use the queue heavily. -- Issue 207: Maintain message length in mail bag to avoid touching mail body. -- Issue 201: Trim priority queue data structures during @dbck to save memory. -- Re-arrange parse_boolexp() to perform simple work first. Cosmetic Changes: ~~~~~~~~~~~~~~~~ -- Increased width of certain columns in @list hashstats (Requests, Hits, and Checks) and @list allocations (Allocs). -- Fix spelling errors in readme files and respace. -- Remove unused configuration option, use_http. -- Flag letter 'z' should be OPEN_OK. -- The examples for WIDTH() and HEIGHT() are for 'say' instead of 'think'. -- Fix typo in orflags() topic (Issue 504). Miscellaneous: ~~~~~~~~~~~~~ -- Add mux_fopen() utility function to replace direct use of fopen(). -- Updated config.guess, config.sub, and configure to later versions. -- Updated to autoconf 2.61. -- Refer to tinymux.org instead of tinymux.com. -- Added SQL readme (Issue 47). -- Updated to doxygen 1.5.1. -- Freshened ATTACK, BACKUPS, BETA, CREDITS, NOTES, README, and readme.txt. -- Documented Lbufref and Regref pools in 'wizhelp @list alloc'. -- Increase MAX_ALIASES_PER_PLAYER from 50 to 100. -- Fix gcc constant string warnings. -- Remove unfinished sqlshared.cpp, sqlshare.h, and sqlslave.cpp. -- Switch to using Visual Studio 2003 and Intel Compiler v10.1. -- Firan is now using 24000-byte buffers. -- Increase Debian debhelper compat level. -- Build updates for Intel Compiler v11.1.