# What's New in Synchronet v3.14

- All Servers
  - Startup file (`ctrl/sbbs.ini`) now supports `!include filename` directive to nest initialization files
  - Support per-server/service/protocol socket option settings in `ctrl/sockopts.ini` (replacing `sockopts.cfg`)
    For example, a section named `[telnet|rlogin]` would set the socket options for either Telnet or RLogin sessions, while `[telnet]` would set the socket options only for Telnet sessions
    Automatically reads a `[tcp]` or `[udp]` section, if it exists (based on the socket type)
  - Replaced the "log mask" concept with a much simpler "log level" concept:
    instead of a bit-mask representing all the log levels to actually "see", we use a single numeric (or nmemonic) level value (e.g. ERROR, WARNING, NOTICE, etc.) and less severe log levels (levels with a higher numeric value) will be filtered (e.g. not "seen" or logged)
    `LogMask` values in your `ctrl/sbbs.ini` file are no longer used (replaced with `LogLevel`)
  - Bug-fixes in ARS compilation:
    - Wasn't accounting for correct lengths of keywords: WIN32, UNIX, LINUX, and PROT
    - Didn't support >8 char internal codes in SUBCODE and DIRCODE values
    - Would skip pass the line (null) terminator causing stack corruption or crash when parsing values for SUBCODE, DIRCODE, or SHELL keywords as the last keyword
  - Bug-fix: buffer overflow if global QWKnet tagline is > 80 characters in length
  - New ARS Keywords: DELETED, INACTIVE, and ACTIVE (user account is not deleted or inactive)
    Allows user listing/editor searches to exclude deleted or inactive user slots
  - Added support for ARS Keywords: GROUP, SUB, SUBCODE, LIB, DIR, and DIRCODE
    These ARS keywords were previously only supported in the Telnet/RLogin server
- Web Server
  - Default web root dir is now `../web/root` (changed from `../web/html`)
    You'll probably want to update the `RootDirectory` value in the `[web]` section of your `ctrl/sbbs.ini` file to reflect this
  - Support new `webctrl.ini` files (optional access control and configuration files sprinkled through-out the `web/root` hierarchy)
    This allows overriding server settings on a per-directory or per-filespec basis.
    Allowed keys are:
    - `ErrorDirectory` - Changes the directory where error pages are served from
    - `CGIDirectory` - Overrides the `CGIDirectory` value from the `[web]` section of the `sbbs.ini` file
    - `AccessRequirements` - Access Requirements String (ARS) required for this resource (Overrides `access.ars`)
    - `Realm` - Authentication realm name to send to remote
    Note: `access.ars` usage is now deprecated
  - Support for chunked mode ssjs files
    In chunked mode, data written out from the SSJS script is sent immediately, and the keep-alvie session is maintained.
    chunked mode is ONLY sent to HTTP/1.1 clients, and is preferred over fast mode.
    This means fast mode is now only usefull for HTTP/1.0 and HTTP/0.9 requests.
  - Add in an output thread which handles chunking. This should improve JS output, and prevent gobs 'o errors
    This output buffering is controlled with the `OutbufHighwaterMark` and `OutbufDrainTimeout` values in the `[web]` section of the `ctrl/sbbs.ini` file
  - Added support for range requests (e.g. for streaming podcasts)
  - Added cookie support (for server-side JS)
  - Bug-fix: Win32-CGI race condition
    where the exec_cgi() loop could (sometimes) detect that the CGI process had terminated, before reading all the data from the stdout pipe
  - Fix for PATH_INFO-based scripts installed as an index filename in the root of the host. (ie: `index.cgi`)
    This would allow `index.cgi` to be (say) `viewcvs.cgi` and URLs such as:
    `http://cvs.synchro.net/src/sbbs3/websrvr.c` to work
  - External redirects are MOVED_TEMP, not MOVED_STAT
  - Add `REQUEST_URI` CGI variable (Apache extension)
  - Drain STDOUT as well as STDERR
  - Don't drain STDIO until script is terminated
  - Do not send `Content-length` header for CGI scripts.
  - Properly handle partial writes of CGI output using sock_sendbuf()
  - Support FreeBSDs accf_http(9) kernal option/module designed specifically for HTTP server optimizations
- Mail Server
  - New feature to solve a common sysop misconfiguration issue:
    Automatically detect the DNS server (randomly chosen from the list of system-configured DNS servers) if no DNS server is configured in Synchronet.
    For *nix, this assumes you have read access to `/etc/resolv.conf` (where da 'e'?) (You have to buy vowels)
    For Win32, this assumes you have `IPHLPAPI.DLL` on your system (included with Win98+).
  - Bug-fix: do not adjust for daylight savings time when generating RFC822-compliant date/time strings
    This caused an off-by-one-hour bug in the "Date:" header field of sent Internet mail when DST is in effect
  - Overhaul mail index loading in sendmail thread:
    Don't directly access the index (`.sid`) file stream, reading a record at time with no locking.
    Instead, read all the relevant index records in one safe locked operating (using loadmail())
    This should fix the multi-server heavy traffic `mail.sid` corruption bug
  - Always lock the entire message base when re-writing existing header and index records (using smb_putmsg())
    Keeps the index file from being truncated during the operation (nightly purging of deleted message indexes?) causing corruption
  - Set the SMB recipient extension header field when routing to QWKnet node
    (this is necessary for FIXSMB to be able to reconstruct the index file)
  - Bug-fix: clear the from extension for bounced messages (they're not from a user)
  - Bug-fix: forwarding mail to a non-standard SMTP port (via the `ctrl/alias.cfg` file) no longer worked
    because the ":port" portion of the destination address wasn't being removed
  - Enhancement: only perform MX-record lookup if no port number specified in destination domain portion of recipient e-mail address
  - Enhancement: don't attempt to send to MX servers with an IP address of 0.0.0.0
  - Enhancement: The default charset for sent SMTP messages is now configurable, if blank (in `sbbs.ini` [mail] DefaultCharset), then not used
  - Enhancement: apply `twitlist.cfg` to SMTP-received mail, checking both the sender's name and e-mail address
  - Enhancement: don't apply subject filter to messages from authenticated users
  - Enhancement: don't send notification telegram for mail received from DNSBL-listed servers
  - Enhancement: added 'To' header field checking against `email.can` file
  - Bug-fix: 'From' header field checking against `email.can` file wasn't working (would still accept the message)
  - Bug-fix: memory leak when parsing `ctrl/mailproc.ini`, caught by valgrind
  - Do not allow receipt of mail for built-in sysop pseudonyms (i.e. "sysop" and "postmaster") unless the ALLOW_SYSOP_ALIASES option is enabled (disabled by default) or the alias is specifically listed in the `ctrl/alias.cfg` file
  - The 'target' field in the `ctrl/alias.cfg` file no longer supports the built-in sysop pseudonyms (i.e. "sysop" and "postmaster"), use user number (e.g. 1) instead
  - If the `ctrl/alias.cfg` file correlates a user *number* with an alias, support receipt of mail to that alias even if the RX_BY_NUMBER option is not enabled This allows us to use '1' instead of 'sysop' in the default `alias.cfg` file
- FTP Server
  - New option: Lookup Passive IP
    Enabled by adding `LOOKUP_PASV_IP` to the `Options` value in the `[ftp]` section of the `ctrl/sbbs.ini` file:
    This option tells the FTP server to perform a hostname lookup (on the BBS's hostname) to determine the correct/current public IP address to use in PASV responses
    This is one more kludge to work around stupid NAT devices (consumer firewalls/routers)
  - 'Last Downloaded' date/time stamp is now updated in the database when files are downloaded
  - Failed Login verbiage is now configurable by creating the optional text file: `text/ftpbadlogin.txt`
  - Bug-fix: added support for `%@` command-line specifier
    (used in Extractable File Type command-lines)
- Telnet/RLogin Server
  - Secure Shell (SSH) support thanks to Deuce and Cryptlib
    This feature is in the beta development stage, so testing and verification is needed, feedback and/or bug reports welcome!
  - Daily maintenance event (resets statistics, deletes logon.lst, backs-up data, expires/purges old users and e-mail)
    will now run in the event thread, if it's running
    Solves the problem of statistics and other data not being correctly maintained if no one logs on (via Telnet or RLogin) for an entire day
  - External message editors now always use a DOS-compatible (8.3 format) file in the node's `temp` directory which solves two problems:
    1. editors restricted to the temp dir (e.g. PICO) can now be used to edit files in other directories (e.g. `data/user/*.sig` files)
    2. DOS editors can now be used to edit files with long filenames (e.g. `data/user/*.plan` files)
  - Added supoprt for `RESULT.ED` external-editor drop file (e.g. from WWIVedit)
    - can now modify the message subject/title from within some external editors (e.g. fseditor.js)
  - New users can no longer change the subject/title of the "New user validation" feedback
  - When reading messages and updating existing message header and index records, always lock the entire message base - preventing corruption
  - When replying to a message, if the posting user was the author of the original message, use the original message's recipient as the recipient of the new reply message as well (no need to post "to" yourself)
  - When replying to an Internet e-mail which includes a REPLY-TO header field, send the reply to the reply-to address (by default) instead of the FROM address
  - Bug-fix: potential buffer over-runs in the expansion of some @-codes
  - Bug-fix: uninitialized pointer dereference in temporary file section
  - Bug-fix: split-screen chat corruption
  - Bug-fix: do not adjust for daylight savings time when generating QWK and Fido date/time stamps
  - Bug-fix: do not adjust for daylight savings time when calculating time until next event
  - Bug-fix: ignore disabled events when calculating time until next event
  - Bug-fix: bad drop file path if using startup-dir (e.g. `c:\sbbs\xtrn\game\/door.sys`)
  - Bug-fix: `data/hungup.log` wasn't being updated
  - Bug-fix: exceptions occurring in JS script run from another JS script would not be reported to the console/log
  - Bug-fix: report JS script compilation errors (exceptions) immediately
  - Bug-fix: only allowed 7 digits when editing credit value of file - increased to 10 digits
  - Bug-fix: ctrl key handler no longer ignores Ctrl-J (LF)
  - Put Micros~1 shortened filenames in the `DOSXTRN.ENV` file,
    allowing at least some XSDK doors to possibly work when run from `C:\Synchronet\...`
  - When generating drop files for 16-bit DOS programs, put Micros~1 shortened paths in the drop files
    Another fix for installations to e.g. "`C:\Synchronet`"
  - Telegard and Renegade "pipe codes" actually must have 2 decimal digits
    This will reduce the liklihood of false-positive TG/RG pipe code interpretation
  - ANSI output optimization (combine attribute changes into a single ESC[m code):
    `ESC[0;1;5;32;40m`
    Is shorter than:
    `ESC[0mESC[1mESC[5mESC[32mESC[40m`
    ...by about eight chars.
  - Include QWK text files (e.g. `HELLO, GOODBYE, BBSNEWS, BLT-*`) when prepacking QWK packets (or packing for FTP download)
  - Introduced `K_NOSPIN` mode flag for getkey()
    to over-ride (temporarily disable) user's spinning cursor setting
  - Don't use the SyncTerm/RLogin "password" parameter for new user accounts unless it meets minimum secure-password requirements
    (e.g. isn't the same as the user's name or alias)
  - Bug-fix: delete environment variables from the processes environment block when adding new environment strings
    otherwise, existing values (for say "SBBSNODE") would not be over-ridden
    This was cause of the well-known DoorMUD incompatibility with v3.13a.
  - If a file name doesn't include a suffix/extension in the native program list, then any command-line executing a program with the same base filename will be considered "native"
    (e.g. `"unzip.exe"` will be considered native if `"unzip"` is in the native program list)
  - When executing a module via `"*modname ..."`, with no file extension specified
    if `modname.js` exists, it will be executed instead of `modname.bin`
    Previously, the `.bin` extension was always assumed if it wasn't specified on the command-line
    This modification allows `exec/bullseye.js` to take precedence over `exec/bullseye.bin` without any change to the command-line configuration
    Execute `"*modname.bin"` if you want to specifically execute `modname.bin` and not `modname.js` (if it exists)
  - External program yielding interval on Windows NT is now handled in `exec/sbbsexec.ini`
    (not in `ctrl/sbbs.ini` or in SBBSCTRL:Telnet->Configure->External Yield)
    See Virtual Device Driver section for more details
  - New option to allow socket-based file transfer protocols on *nix
  - Bug-fix: disable file upload/attach mode if SCFG->Message Options->Allow Uploads in E-mail is set to "No".
    This option has been in SCFG for 10(+?) years and was never used. :-)
  - Better seeding of random number generator
  - Rework the output buffer loop to simplify slightly and fix an issue with the highwater/timeout being innefective when the ring buffer received many small writes very quickly (ie: During the "Synch" logo display)
    For some reason, this seems to happen most on fast connections
    (Possibly the socket implementation manages to combine the write()s on a slow connection)
  - If the highwater mark is zero, and `TCP_MAXSEG` is supported (BSD and Linux),
    then automatically tune the highwater mark to be the MSS and never send() a buffer larger than that
  - Stale (> 24 hours old) mutex files (e.g. `data/pack####.lock`) are now ignored
    so crashed instances with locked mutexes will no longer need manual clean-up (auto-revovery)
  - Bug-fix: 100% CPU utilization while sitting at Inter-BBS Instant Message menu prompt
  - New global JS function: write_raw()
    used for sending strings with NULLs and other control characters to the remote client
  - Provide example RLogin "Game Server" option in `exec/logon.js` (disabled by default)
  - Added support for random logon screens (`text/menu/random*.*`) in `exec/logon.js`
  - Added "E-mail Forgotten Password" feature in `exec/login.js`
    Set `email_passwords=false` to disable
  - Skip Win32 hidden and system files when bulk-uploading
  - Use Deuce's xp_printf module for Baja/PCMS printf/sprintf/fprintf functions:
    - eliminates segfaults/AVs on incorrect usage
    - auto-converts arguments to correct format type
    - eliminates portability problems with non-x86 platforms
- JavaScript
  - Use Deuce's xp_printf module for all JS printf/sprintf/fprintf methods:
    - eliminates segfaults/AVs on incorrect usage
    - auto-converts arguments to correct format type
    - eliminates portability problems with non-x86 platforms
  - load(true,...) (background scripts)
    - log() is now available in background scripts
    - Bug-fix: accessing additional arguments
      passed to background scripts (as argv[]) could cause crashes and JS errors
    - argc is now always defined, even if it's 0 (zero)
  - console object improvements:
    - Optionally set current attribute, as argument, to clear(), clearline() and cleartoeol() methods
    - Bug-fix: option argument didn't work in telent_command() method
    - ctrlkey_passthru property assignment enhancement:
      No longer requires "freaky numeric constants" to set ctrlkey_passthru
      Examples:
      `"+AB"` will add CTRL-A and CTRL-B to the set
      `"AB"` will change the set to only CTRL-A and CTRL-B
      `"-AB"` will remove both CTRL-A and CTRL-B from the set
      `"+A-B"` will add CTRL-A to the set and remove CTRL-B
  - Added MsgBase header object property: forward_path (currently not used)
  - Bug-fix: MsgBase.remove_msg() was zeroing the to/from/subject (and other string header fields)
  - Bug-fix: Queue.peek() was freeing memory it shouldn't
    Resulting in crashes when the Queue was later freed or the item read()
  - Bug-fix: in xtrn_area object, ignore "event only" flag for external programs if event type is set to "None"
  - Bug-fix: file_area.lib array could contain a bogus value
  - New file_area properties: sysop_dir, user_dir, upload_dir, and lib[x].offline_dir
  - Bug-fix: file_area.*.can_upload and can_download properties
    now take the user's 'D' and 'U' restrictions into account
  - Bug-fix: msg_area.grp array could contain a bogus value
  - bbs object:
    - Bug-fix: list_files() and list_file_info() methods needed "padded" 8.3 filenames
    - Renamed scan_posts() to scan_msgs(), left old name as alias
    - New method: list_msgs() for various listing (as opposed to scan/reading) modes (text search, message to-you, etc.)
    - New property: command_str exposes the current command shell's command string ('`str`')
    - New properties: cursub_code and curdir_code
      to more-easily get the current sub-board or file directory internal code (string)
    - New methods: send_file() and receive_file()
    - private_chat() now supports an optional argument: bool local (default: false)
      used for forcing user into local sysop chat (as opposed to private node-to-node chat)
    - Bug-fix: logkey(), comma was always true if any argument was given
  - User class (and user object):
    - Big performance/design improvement:
      User data is now cached in the user object's "private storage"
      reducing (by a large factor) the number of unnecessary calls to getuserdat()
      which opens/seeks/locks/reads/closes the user data base.
      This should have a profound performance improvement on web/ssjs scripts, especially the `userlist.ssjs`
    - New property: cached to reflect the current cached user data state (true/false)
      and allow external manipulation if necessary
    - New methods to allow the atomic (safe) adjustment of numeric/statistical user fields:
      - adjust_credits(count)
      - adjust_minutes(count)
      - posted_message([count=1])
      - sent_email([count=1] [,feedback=false])
      - uploaded_file(bytes [,files=1])
      - downloaded_file(bytes [,files=1])
      In the methods where "count" is optional (in square brackets), the default value is '1'.
      So to increment the user's messages-posted statistcs by one (for today and total),
      User.posted_message() is all that is needed.
      Specifying a negative value allows adjust downwards (subtraction).
      e.g. to remove 1000 credits: User.adjust_credits(-1000);
      The User.stats properties are intentionally read-only (i.e. not a bug)
      since there is no "safe" way to modify these properties using normal mathematical operators (e.g. `+=`), hence the need for these new methods
  - New method: js.get_parent() a useful function for walking backward through an object/scope hierarchy
  - New property: js.global for easy reference to the global (top level) object
  - New property: system.timer high-resolution timer, in seconds (fractional seconds supported)
  - New properties: system.version_num and system.version_hex
    These allow easy Synchronet version comparison in scripts.
    Example:

        		if(system.version_num < 31301) /* v3.13b */
        			print("version 3.13b or later required");

    system.version_hex allows easy major/minor version number checking, parsing or printing using right-shift operations instead of division/rounding.
    Example:

        			31301/100 == 313.01
        			0x31301>>8 == 0x313

  - New property: system.cmd_shell for getting the current OS command processor/shell filename
  - base64_encode(), crc16_calc(), crc32_calc(), chksum_calc() and md5_calc()
    functions now support string arguments with \0 (ASCII 0, NULL) embedded in them
  - file_mutex() function now supports an optional max_age argument
    to detect and remove stale mutex files
  - New function: wildmatch() for simplified pattern matching (wildcards supported: '?' and '*')
  - New function: disk_size() which reports the total number of bytes (or units, e.g. kilobytes) of the disk (not just the "free space")
  - Bug-fix: ctrl() didn't toggle the correct bit for ASCII to Ctrl-char conversion
  - Bug-fixes: quote_msg() and word_wrap() over-hauls by Deuce
  - Baja modules ported to JS:
    - login.bin to login.js
    - str_cmds.bin to str_cmds.js
    - chat_sec.bin to chat_sec.js
    - default.bin to classic_shell.js
  - File class:
    - Strings containing \0 (ASCII 0, NULL) can now be read from or written to files
    - New methods: iniRemoveKey() and iniRemoveSection() for removing elements from a `.ini` file
    - New method: truncate()
  - Socket class:
    - constructor now supports an optional protocol string argument to specify the protocol or service name the socket is to be used for
      (Used for automatically setting protocol and service-specific socket options from `ctrl/sockopts.ini`)
    - Strings containing \0 (ASCII 0, NULL) can now be read from or written to sockets
    - New property: option_list:
      an array of option names supported by the current platform and socket type combination
    - Bug-fix: peek() length wasn't initialized with default value
    - Get/set of `SO_LINGER` socket option now works like `ctrl/sockopts.ini`:
      0 = linger disabled (no time-out value)
      non-zero = time-out value (in seconds), linger enabled
    - sendfile() now uses a proven implementation (from the XPDEV library)
  - JSexec:
    - Mutex-protect the log-output (to the console typically) so that foreground and background threads don't step on eachother (as well as error reports and status messages)
    - `jsexec -v` now dumps the version details and exits
    - Bug-fix: prompt() no longer returns the '`\n`' with the string
    - Now displays the number of seconds/milliseconds it took to compile and execute a script (if either duration is greater than 0)
    - alert() now returns the string printed
    - The variable exit_code is only used for the return value if it's a number
    - Bug-fix: random number generator wasn't being seeded
    - New uifc object for local full-screen user interface scripts (ala SCFG)
      load("uifcdefs.js") for constant definitions
      Methods:
      `
      - Boolean init(String title)
      - void bail()
      - void msg(String text)
      - void pop([String text])
      - String input(mode, left, top, prompt, org_str, max_length, kmode)
      - String list(mode, left, top, width, default, bar, title, Array options)
      `
      Properties:
      `
      - Boolean initialized
      - Number mode
      - Boolean changes
      - Number save_num
      - Number screen_length
      - Number screen_width
      - Number list_height
      - Number esc_delay
      - String help_text
      - Number background_color
      - Number frame_color
      - Number text_color
      - Number inverse_color
      - Number lightbar_color
      `
- SBBSecho
  - Netmail packets, for attach-style mailers, are now created with filenames of `.pkt` (rather than `.pk_`)
    EchoMail packets still use the temporary file extension of `.pk_`
  - Bug-fix: NetMail packets are now correctly terminated (with 2 NULL bytes)
  - Bug-fix: Do not adjust for daylight savings time when generating UTC time stamps
  - Now strips ctrl chars (garbage) from var-length message header fields (i.e. to/from/subject)
  - Now sends AreaFix responses back to the user name that made the request (rather than "SYSOP")
- Synchronet Console
  - [Unix] Bug-fix: call do_seteuid() as soon as possible to avoid creating dirs/files as startup user (often root)
- Synchronet Control Panel (for Win32)
  - Now supports the `ctrl/recycle[.ctrl]` and `ctrl/shutdown[.ctrl]` semaphore files so:
    1. SCFG will touch `ctrl/recycle` causing SBBSCTRL to reload its copy of the configuration files
       This resolves the FAQ about why users appear to be running the wrong external program in the Nodes window
       after adding/removing external programs in SCFG
    2. The control panel can now be gracefully shutdown by touching ctrl/shutdown
  - Mail Server Configuration:
    - Display "auto" if the DNS server field is left blank or set to an invalid IP address or hostname
    - Created an "Advanced" tab which allows the sysop to toggle options that could previously only be enabled/changed in the `sbbs.ini` file:
      - SendMail: Ignore 'in transit' attribute
      - Retain received mail files (in temp directory)
      - Allow receipt of mail by user number
      - Check 'Received' header fields against DNSBL
      - Throttle DNS blacklisted server sessions
  - Created a right-click popup menu on the File->Preview window to change the current font
  - New tray-icon popup menu items to configure web server and services
  - New splash screen image (from Mike)
  - New Help->Technical Support menu item to load tech support web page
  - Added `ftpbadlogin.txt` to FTP->Edit menu
  - Bug-fix: Wasn't displaying the "server in use, terminate yes/no" message box if Synchronet NT services were installed, but disabled
  - Bug-fix: Exceptions/access violations while shutting down if Synchronet NT services were installed, but disabled
- Synchronet FOSSIL Driver (`dosxtrn.exe`)
  - Now provides interrupt 14h service routine "signature" required by some (very few) programs to detect the FOSSIL driver's presence
  - Bug-fix (NT only): funtion 18h is supposed to be a block-read with *no* wait (return immediately if no data)
    we were blocking if there was no data waiting (cause of hang in Star Fight door game)
  - Bug-fix (NT only): incorrect baud rate returned in information block (function 1Bh)
  - Bug-fix (NT only): size of information block was off-by-one (+1) due to padding
  - Correct driver revision and ID string is now returned in information block (NT only)
  - Treat interrupt 21h function 2Ch (DOS "GET SYSTEM TIME") as a "poll" with potential forced yield (NT only)
    this "tames" BRE down to single-digit CPU utilization!
  - External programs can now "hangup" (disconnect) the user
    (this capability of the FOSSIL driver can be disabled in the `exec/sbbsexec.ini` file)
- Synchronet Windows NT Virtual Device Driver (`sbbsexec.dll`)
  - This driver now virtualizes (emulates) a UART (COM port):
    By default, COM1 (IRQ 4, I/O Address 3F8)
    This feature allows you to run DOS doors without FOSSIL support
    This feature is configurable/disableable in `exec/sbbsexec.ini`, even on a per-program basis
    Most programs will perform better in FOSSIL mode, but some may perform better in UART/COM Port mode (depends on the program)
  - Time-slice yielding (for both UART virtualized and FOSSIL programs) is now handled in `exec/sbbsexec.ini`, even on a per-program basis
- Synchronet NT Services
  - Bug-fix: the "SynchronetEvent" NT event log source wasn't being registered
- Synchronet Services
  - Allow log level to be configurable in `ctrl/services.ini` either globally (in the root section) or per service
    using the `LogLevel` key (default value: "DEBUG")
  - `ctrl/services.ini` now supports `!include filename` directive for nested initialization files
  - Now ignores services with no configured commad-line, but logs warning
  - Bug-fix: when parsing the `services.ini` file, don't use the default `NotHost` value for host_name comparison
    under some strange circumstances, the startup->host_name could be blank
  - Bug-fix: Now includes a working readln() global JS function
- ListServer
  - Bug-fix: Don't call convert_msg_header() inside process_contribution()
    the header has already been processed and is passed in as an argument
  - Implement Cyclops subject modification for exported messages
    if `"subject_mod = true"` in the `listserver.ini` for the particular list (default: false)
  - Don't add the `[listname]` subject prefix if it's already in the subject string
  - Remove `[listname]` from imported subjects (list contributions)
- NewsLink
  - Bug-fix: Specifically call msgbase.close()
    fixes reported problem with fdopen() failure opening massive number of newsgroups (e.g. >170 total)
  - Better support for "folded" header fields (e.g. subject)
- Finger Service
  - Add support for `.plan` files
    New `;PLAN` Telnet/RLogin string command (in `exec/str_cmds.js`) which allows editing of `.plan` files by users
  - Added support for abitrary "special request" files in the (optional) `data/finger` directory
  - Special finger requests can now be triggered with '.' (e.g. `".ver@yourbbs"` instead of `"?ver@yourbbs"`)
    since some finger gateways (e.g. `finger.cgi`) don't like the '?'
- NNTP Service
  - If `-notag` option is specified on command-line
    do not add tear/tagline to local message body text sent to Q-restricted accounts
  - If `-ascii` option is specified or the sub-board has been flagged for ASCII-only
    extended-ASCII chars (in message body or subject) are converted to ASCII before being sent to client
  - Bug-fix: msgbase could be non-NULL even though no newsgroup had been selected
    check 'selected' instead of 'msgbase' to determine if a msgbase has indeed been selected or not
  - Added support for the (non-RFC standard) `LIST EXTENSIONS` command
  - Bug-fix: return a 500 (syntax error) response for any `"LIST etc."` commands not supported
  - Support `HDR` command as well as `XHDR`
  - `OVER/XOVER` response now contains article range
  - Handle spaces following NNTP commands without error (e.g. `"LIST "`)
  - Added support for `"LIST NEWSGROUPS"` command (from RFC 2980)
  - Added support for wildcard matching for RFC 2980 commands that support [wildmat] arguments
    only * and ?, not complete WILDMAT pattern syntax
  - Bug-fix: support passwords with spaces in them
  - Better support for "folded" header fields (e.g. subject)
- IRC Daemon
  - Lots of bug-fixes and enhancements by Cyan
  - For details, see ircd.js, ircd_user.js, ircd_channel.js, ircd_server.js and ircd_unreg.js
- Documentation
- Message Bases (SMBLIB v2.41)
  - New function: smb_updatemsg()
    used to safely update the header and index records of a message
  - smb_putmsg() now calls smb_init_idx() automatically to initialize or re-synchronize the index fields with the header fields
    no longer need to call smb_init_idx() from smb_addmsg() and other places (e.g. FIXSMB)
  - Moved smb_init_idx() from `smbhash.c` to `smblib.c`
  - smb_dump_msghdr() now displays the to/from/replyto network address header fields in a human-readable format
  - If smb_getmsgidx() is called with a negative offset, it actually sets the correct offset (from the beginning of the index) in the msg struct
  - smb_putmsgidx() will now return an error if asked to write to an index record offset past the end of the file (typically leaving a "hole" of zeroes in the index file)
  - smb_putmsgidx() and smb_putmsghdr() now returns the result of the final fflush() call (normally 0, same as `SMB_SUCCESS`)
  - Bug-fix: smb_tzutc() - subtract 60 minutes from US timezones with DST in effect
- SCFG
  - Saving changes in SCFG now recycles all services and services
    including the Web server and the Synchronet Control Panel (no manual reload of configuration required)
  - Changed default `zip/unzip` command-lines to use Info-ZIP instead of PKZIP
  - New option to allow socket-based (instead of stdio-based) file transfer protocols on *nix
  - Bug-fix: imported internal codes (from `subs.txt` or `dirs.txt`) had non-alphanum chars removed if > 7 chars instead of > 8 chars
  - Eliminated unnecessary internal code and pointer index checking while importing subs (no need to check newly-created subs for dupes) - eliminates exponential importation time witnessed with large numbers (thousands) of message areas being imported from a single file
  - New File "Import Areas..." option to automatically generate the `DIRS.RAW` file (if it doesn't exist)
    or just create a temp directory listing file to import "invisibly"
  - Bug-fix: clear "event only" flag for external programs when setting event type to "None"
- ADDFILES
  - Unix-friendly command-line syntax for specifying uploader's name (now `-xname`) and enabling auto-add ('-' in place of directory code or '-filename')
  - Bug-fix: added support for the `%@` command-line specifier
- SEXYZ
  - Added control over how filenames are written to the DSZLOG, via the `sexyz.ini` file `[DSZLOG]` section:
    - the `Path` key controls whether the full path is logged
    - the `Short` key controls whether the Micros~1 shortened `path/filename` is logged (on Windows only)
    - the `Quotes` key controls whether the filename is logged in double-quotes (for EleBBS long filename compatibility)
      Note: The "Quotes" feature can also be enabled with the "-quotes" command-line option
- SMBUTIL
  - New command: `x`, used to dump a message base index
- CHKSMB
  - Verify that if the index.to field is non-zero or there's a to_ext header field, that they match
    This will catch a QWK networking bug in previous Synchronet versions where the index.to was non-zero
    (the number of the QWKnet node account), but there was no hdr.to_ext field
    thus the index could not be recreated from the information in the header (e.g. by `fixsmb`).
    This was actually an intentional design decision at the time, but in hindsight, it's a bug
    (the index file is not supposed to contain any unique information)
- MAKEUSER
  - Prevent crash (NULL-dereference) on invalid command-line syntax (e.g. -S50)
  - Sets `AUTOTERM` (automatic terminal type detection) in user.misc for new users
- New GTK Utilities (Unix only)
  - Three new experimental GTK+ based utilities have been added to the default *nix build.
    These utilities require read/write access to the sbbs directories.
    They do NOT need to be running on the same machine.
    - gtkmonitor - Based loosely on the Win32 control panel without the log output.
      Shows current activity and allows some sysop control.
    - gtkuseredit - Based on the Win32 useredit utility allows editing of users
    - gtkuserlist - Lists users supporting ARS filters and allows quick validation sets
      to be applied to multiple users simultaneously.
  - These utilities are lightly tested and require GTK+ and Glade libraries and headers to be installed at the time of the Synchronet build.
- New SYNCVIEW Utility (Unix only?)
  - A simple viewer for ANSI files.
    - Can be piped the output from ASC2ANS to display .ASC files
- Miscellaneous
  - SLOG (System/Node Statistics Log Viewer) utility ported to 32-bit (by Deuce)
  - ALLUSERS (Bulk User Editor) utility ported to 32-bit (by Deuce)
  - DELFILES (Remove expired/offline files) utility ported to 32-bit (by Deuce)
  - ANS2ASC and ASC2ANS now support '-' in place of a filename on the command-line to specify standard in/out instead of a file

For many more changes since v3.10, see v311_new.html, v312_new.html, and v313_new.html

For changes to the JavaScript Object Model, see v314_jsnew.html

Copyright © 2005 Rob Swindell
$Id: v314_new.html,v 1.11 2006/12/29 09:03:56 rswindell Exp $