The following list describes the changes made to the original source code for the Version 6 (V6) UNIX Thompson shell and global command in porting them to run on modern UNIX systems. ------------------------------------------------------------------------------- [etsh-current] (development): * Work In Progress ( see https://etsh.nl/src/current/ ) ------------------------------------------------------------------------------- [etsh-5.4.0] (latest): * Please see CHANGES as well. sh.h: * Changed struct tnode . LICENSE defs.h fd2.c if.c: * Updated LICENSE as needed. * defs.h: Added SIZE_T_EOVERFLOW(num, siz), a macro derived from the OpenBSD malloc(3) manual to check for size_t overflow and do an error exit if/when true. It could be that it's not needed here, as the code in the etsh project that uses malloc(3) and friends is generally limited in the maximum size sense by other arbitrary size limits in the shell (e.g., PATH_MAX, ARG_MAX, LINEMAX, WORDMAX, TREEMAX). Still, it's better to be safe than sorry. * fd2.c: Changed to use SIZE_T_EOVERFLOW(num, siz) as an example. * if.c: Changed to use SIZE_T_EOVERFLOW(num, siz) as an example. glob.c goto.c: * Replaced instances of UChar with u_char, UCHAR with U_CHAR, and UCPTR with U_CPTR to sync with defs.h . goto.c: * Moved CONFIG_BROKEN blog post to https://etsh.nl/blog/ubuntu-16/ , and changed the associated comment; this problem has been fixed; thus, it is no longer a problem. ------------------------------------------------------------------------------- [etsh-5.3.1]: * Please see CHANGES. pexec.c sh_err.h: * Added a missing error message, ": too large", found in the original V6 Thompson shell source code; see History/sh.c for more information. * C: This error message is available in both etsh & tsh. ------------------------------------------------------------------------------- [etsh-5.3.0]: * Please see CHANGES. scratch/tes: * Synced with v6scripts/tes.tsh; (date: 2018/08/06 03:39:46 UTC) tsh.1: * Changed communicat(e|ed) to convey(ed) for better word flow. (date: 2018/08/05 13:57:37 UTC) tsh.c: * Fixed having added a call to setenv_tes() in main() before tsh(1) ended up calling rpx_line() for its normal read/parse/execute a command line sequence. Doing so stopped the tes script from working correctly. (date: 2018/07/03 20:07:21 UTC) ------------------------------------------------------------------------------- [etsh-5.2.0]: * Please see CHANGES. tsh.[1c]: * tsh now sets its current exit status as TES in the environment in order to communicate it to the user as an unsigned decimal integer. I also added scratch/tes here, which is identical to the new tes.tsh (installs as tes) found in v6scripts-current. Having copied scratch/tes to a directory in your PATH, you can do the following (assuming you've updated recompiled & reinstalled tsh): % '' : not found % tes -v TES=127 127 % / /: cannot execute % tes -v TES=126 126 % false % tes 1 % : ' ... and this is true (0), as : always is, of course ... ' % tes 0 . * Added a description of TES to the ENVIRONMENT section of tsh(1). ------------------------------------------------------------------------------- [etsh-5.1.5]: * Please see CHANGES. ------------------------------------------------------------------------------- [etsh-5.1.0]: * Please see CHANGES. ------------------------------------------------------------------------------- [etsh-5.0.2]: tsh.1: * Changed where etsh(1) appears in `SEE ALSO' so that it is a little more alphabetical. ------------------------------------------------------------------------------- [etsh-5.0.1]: tsh.1: * Substituted @LIBEXECDIRSH6@ with @LIBEXECDIRTSH@ so that the installed manual contains the correct directory name instead of an unexpanded macro. ------------------------------------------------------------------------------- [etsh-5.0.0]: * Trimmed CHANGES6 ( see https://etsh.io/src/CHANGES6-trim as noted below ), and moved CHANGES6 to CHANGES-tsh+ . * Moved sh6.[1c] to tsh.[1c], and made all associated changes that this required (e.g., to the Makefile and so forth). See CHANGES for more details about the Makefile changes. * C: Removed (+) from `Broken pipe' termination message in etsh.1, and added `Broken pipe' termination message to tsh.1 and tsh.c for compatibility reasons. The original V6 Thompson shell did not print this termination message when its process received a SIGPIPE signal. It was documented but not implemented. For etsh and tsh though, it is both documented and implemented. ------------------------------------------------------------------------------- [etsh-4.9.0]: sh6.c, defs.h: * Increased size of line buffer & word pointer array. Previously, line only allowed a maximum of 2042 characters in each command line. It now allows 2063 and gives a "Too many characters" error at 2064 and beyond. For word, instead of allowing a maximum of 1018 arguments/words per command line and giving "Too many args" at 1019 and beyond, it now allows 1026 and errors at 1027 and beyond. glob.c, sh6.c, sh.h, err.h, defs.h: * Had what amounted to being a cleanup fest of sorts... Without going into too much detail, this provided a good opportunity to revisit, check, and fix a couple of problems (not problems). Many of the cleanups were because of reports by splint(1) only when the shell was in full DEBUG mode. This gave me a chance to change some splint annotations. if.[1c]: * For the if(1) - conditional command of sh6/tsh, made == a synonym for =. 1) The rationale is simple; 'if s1 == s2 echo equal' evaluates the expression for equality; 'if s1 = s2 echo equal' does too, but it looks like an assignment. 2) In effect, this improves if(1) syntax compatibility between sh6/tsh and csh/tcsh. ------------------------------------------------------------------------------- [etsh-4.8.0]: sh6.c: * Added 3 comments in main() to allow easier comparison with osh.c . ------------------------------------------------------------------------------- [etsh-4.7.0]: *: * Changed v6shell (dot) org references to etsh (dot) io, and v6shell.org references to etsh.io too, almost a s/v6shell.org/etsh.io/ in effect, but not quite. * No code changes. sh6.1: * Reworded the description of how an interactive shell prompts the user for the sake of clarity. ------------------------------------------------------------------------------- [etsh-4.6.0]: if.1, if.c: * Added two new primaries, -n to test for non-zero length string & -z to test for zero length string, like the same primaries found in test(1). ------------------------------------------------------------------------------- [etsh-4.5.1]: * No changes. ------------------------------------------------------------------------------- [etsh-4.5.0]: * See CHANGES. ------------------------------------------------------------------------------- [osh-4.4.0]: [fgis]*.1: * Changed osh and sh6 references to match their binary names set in *.1.out by configure. fd2.c, glob.c, goto.c, if.c, sh6.c: * No code changes. ------------------------------------------------------------------------------- [osh-4.3.2]: * No changes. ------------------------------------------------------------------------------- [osh-4.3.1]: [fgis]*.1: * s/General Commands/General Commands Manual/ fd2.c, glob.c, goto.c, if.c, sh6.c: * No code changes. ------------------------------------------------------------------------------- [osh-4.3.0]: * Changed LIBEXECDIR layout to support both sh6 & osh. The sh6(1) external utilities moved into a new sh6 subdirectory. A new osh subdirectory exists for osh support scripts & files; these files came (and will be removed) from the V6Scripts Collection. mkconfig, sh6.c, goto.c: * Disabled sh6 compilation on Ubuntu 16.(04|10). sh6.c: * Updated sh_magic() & xgetc() to make it behave more like osh. This protects the user and her / his terminal from getting fouled up if/when accidentally trying to execute binary files as shell scripts / command files. ------------------------------------------------------------------------------- [osh-4.2.1 - osh-060124]: * Changes for these releases are at https://etsh.nl/src/CHANGES6-trim . ------------------------------------------------------------------------------- [Unreleased]: The following ports of the original Sixth Edition UNIX source code were never released to the public. sh6.c 1.1 (jneitzel) 2004/01/26: * Changed the source file name from `sh.c' to `sh6.c' and the resulting binary name from `sh' to `sh6' to avoid name conflict and confusion with the system shell, sh(1), on modern UNIX systems. * Transformed the source code from K&R C into ANSI C. * This is nothing more than a simple port to modern UNIX systems. It is now 64-bit clean. At least, this is true for the 64-bit systems to which the porter has access. * Removed support for the shell's accounting of process times (see times(3)) which allowed the shell to record command execution data in a log file. * Fixed a buffer overflow in the word() function. glob6.c 1.1 (jneitzel) 2004/01/26: * Changed the source file name from `glob.c' to `glob6.c' and the resulting binary name from `glob' to `glob6', matching the similar change to the name of the shell (see above). * Transformed the source code from K&R C into ANSI C. * This is nothing more than a simple port to modern UNIX systems. * Fixed possible overflow of the argument-list buffers in the cat() function. ------------------------------------------------------------------------------- [Original]: Here is some pertinent information about the original files. The following description refers to Sixth Edition (V6) UNIX obtained from: http://www.tuhs.org/Archive/Distributions/Research/Dennis_v6/ ... A portion of the `http://www.tuhs.org/Archive/Distributions/DETAILS' file reads as follows: Dennis_v6 --------- v6root.gz, v6src.gz and v6doc.gz are a set of three RK05 images of Sixth Edition with root, /usr and documentation, from Dennis Ritchie. The tape bootstraps are not included. The most recent timestamp on any file is July 19th 1975. v6root.tar.gz, v6src.tar.gz and v6doc.tar.gz are tar archives of the three RK05 images. ... The following files and the corresponding manual pages were all obtained from the tar archives described above: sh.c: What: Original source code for the Sixth Edition (V6) UNIX Thompson shell Date: July 17, 1975 From: Sixth Edition UNIX /usr/source/s2/sh.c glob.c: What: Original source code for the Sixth Edition (V6) UNIX global command Date: May 14, 1975 From: Sixth Edition UNIX /usr/source/s1/glob.c Jeffrey Allen Neitzel 2019/04/16 @(#)$Id: CHANGES-tsh+,v 1.12 2019/04/16 03:04:44 jneitzel Exp $