Annotation of 43BSD/contrib/kermit/ckuker.upd, revision 1.1

1.1     ! root        1: C-KERMIT FOR UNIX, CHANGES FROM 4C(056) TO 4C(057), 31 JUL 85:
        !             2: 
        !             3: general (many modules affected):
        !             4: . Change "set send packet-length" to override Send-Init value.
        !             5: . Change still more global character variables from int or char to CHAR.
        !             6: . Fix 4.1BSD and C/70 support (Charles Brooks), 2.9 support (Herm Fischer).
        !             7: 
        !             8: ckcfns.c:
        !             9: . Server always executes generic (but not host) commands in text mode.
        !            10: . Change calling convention for getchx() to allow better reporting of eof.
        !            11:   Some earlier changes had apparently broken PDP-11 support for binary
        !            12:   files because of sign extension...
        !            13: . Again, several hours after initial announcement of 4C(057) found that above
        !            14:   change had busted things for 68000s (again) because of still more int/char
        !            15:   conversion problems.  Changed 'next' from int to char and moved its file
        !            16:   begin/end function to a new flag variable, 'first'.  Hopefully, not too many
        !            17:   copies got out; those that did are dated 29 July; the version with this fix
        !            18:   is dated 31 July.  Sigh...
        !            19: 
        !            20: ckuusr.c:
        !            21: . Fix timing statistics to work for 16-bit machines too (Dan).
        !            22: . Change calls to execl() to terminate with "(char *)0", not "0".
        !            23: 
        !            24: ckufio.c:
        !            25: . Fix bug that sometimes prevented sending files with 14-char long names.
        !            26: 
        !            27: ckutio.c:
        !            28: . Herm fixed it up so all the changes in previous edits that broke his
        !            29:   modem control code are now more compatible with it.  Also, myread() -- the
        !            30:   nonblocking equivalent of read() -- was fixed to report errors better.
        !            31: 
        !            32: ckudia.c:
        !            33: . Many changes from Herm & Dan, mostly relating to modem control and resetting
        !            34:   alarms to get the dialing-with-no-carrier-to-connected-with-carrier
        !            35:   transition working again.
        !            36: 
        !            37: 
        !            38: C-KERMIT FOR UNIX, CHANGES FROM 4C(055) TO 4C(056), 11 JUL 85:
        !            39: 
        !            40: ckcpro.w:
        !            41: . Make new ssfile state, to allow for display of data in ack to file header.
        !            42: . If data comes in ack to file header, log to transaction file.
        !            43: . Put local filename in data field of ack to F packet.
        !            44: . Add calls to new rtimer(), gtimer() to allow transactions to be timed.
        !            45: . When sending, include D in EOF packet in all cases when interrupted.
        !            46:   Previously, only "czseen" would do it, but not cxseen.
        !            47: . Upon receipt of Z packet, send Ack AFTER closing file rather than before.
        !            48:   If file can't be closed, send Error packet instead of Ack.
        !            49: . Upon receipt of error packet while receiving file, discard file.
        !            50: . Upon receipt of unexpected packet type, send Error, not Nak.
        !            51: 
        !            52: ckcfns.c:
        !            53: . Change clsof() to accept an argument specifying whether to discard.
        !            54: . Change clsof() to keep incomplete file regardless of arg if keep != 0.
        !            55: . Change clsof() to return -1 if output file could not be closed.
        !            56: . Change name of getch() to getchx() to avoid conflict with libraries.
        !            57: . Fix Yet Another Problem with 8th-bit Quoting Negotation.  The bug was that
        !            58:   if other side said 'N' we would treat 'N' as quoting prefix rather than "NO"
        !            59:   (but only if parity was set to other than none).
        !            60: . Remove input buffer flush from sfile() (why was it ever there???).
        !            61: . Change seof() to accept an argument to put in the Z-packet data field.
        !            62: . Add transaction timing statistics to reof(),reot() for transaction log.
        !            63: . Combine sfile() and sxpack() into one function.
        !            64: 
        !            65: ckcfn2.c:
        !            66: . Improve performance of rpack by reducing scan for soh to number of chars
        !            67:   read rather than whole buffer (required changing inlin()'s return code).
        !            68: . Allow rpack to skip over "blank lines" without failing; this was preventing
        !            69:   file transfer with some systems that always sent CRLF before transmitting
        !            70:   anything (e.g. UCLA's MVS/TSO VTAM).
        !            71: . Don't flush input buffer at end of rpack(), because if the packet that we
        !            72:   just read is a repeat or an echo, the one we want might be queued up after
        !            73:   it.  Instead, flush in input() only after the desired packet arrives.
        !            74: . Allow user to type ^A^C^C to interrupt rpack and exit cleanly from program.
        !            75: 
        !            76: ckuusr.c:
        !            77: . Add "incomplete" to "set" parse table and display incomplete in "show".
        !            78: . Add "%" command for comment lines.
        !            79: . Add elapsed time and effective baud rate display to "statistics" command.
        !            80: . Fix "show parameters", had send/receive end-of-packet reversed.
        !            81: . Make modem-type lookup in "show" a little cleaner.
        !            82: . Fix "echo" to interpret \ooo escapes in its argument.
        !            83: 
        !            84: ckuus2.c:
        !            85: . Add "help set incomplete".
        !            86: . Fix help message for "set line".
        !            87: 
        !            88: ckuus3.c:
        !            89: . Add "set incomplete" support.
        !            90: . Allow "set prompt" argument in doublequotes and strip quotes if used, to
        !            91:   allow specification of prompt with leading &/or trailing blanks.
        !            92: . Fix "set send/receive padding/pad-character" -- they had variables reversed.
        !            93: 
        !            94: ckufio.c:
        !            95: . For Pro/Venix V1, make MAXWILD and SSPACE even smaller, so malloc() still
        !            96:   has some space left to allocate...
        !            97: . Change zclose() to return -1 if file could not be closed.
        !            98: 
        !            99: ckutio.c:
        !           100: . Use Sys III/V nonblocking read() technique also for 4.xBSD -- improves
        !           101:   performance noticably!
        !           102: . Add rtimer() and gtimer() functions for resetting/getting elapsed time.
        !           103: . Don't return failure from tthang() if line wasn't open.
        !           104: . Print warning message if tthang() or ttunlk() fail.
        !           105: . In ttclos(), relinquish exclusive access.
        !           106: . Change some #ifdefs so they depend on features, like FIONREAD, rather than
        !           107:   system, like BSD4.  This allows collapsing a lot of redundant code.
        !           108: 
        !           109: ckucon.c:
        !           110: . Add hangup (h) option to escape character arguments.
        !           111: 
        !           112: ckuscr.c:
        !           113: . Change static timeInt() to global scrtime() to avoid problems on code
        !           114:   mapped systems.
        !           115: 
        !           116: 
        !           117: C-KERMIT FOR UNIX, CHANGES FROM 4C(054) TO 4C(055), 28 JUNE 85:
        !           118: 
        !           119: ckudia.c (all changes by Dan Schullman, DEC):
        !           120: . Add support for US Robotics modem (untested) from Joe Orost at Berkeley.
        !           121: . Reorganize MDMINF data structure to accommodate US Robotics (some char
        !           122:    fields had to become strings).
        !           123: . Allow interrupts (SIGINT, e.g. ^C) to cancel dialing in progress.
        !           124: . Ring bell when connection made successfully.
        !           125: . Close line on failures.
        !           126: . Allow stored numbers with DF100 and 200 modems.
        !           127: 
        !           128: ckudia.c now supports the following modems:
        !           129: . Cermetek Info-Mate 212 A
        !           130: . DEC DF03-AC
        !           131: . DEC DF100 Series
        !           132: . DEC DF200 Series
        !           133: . General Data Comm 212A/ED
        !           134: . Hayes Smartmodem 1200 & compatibles
        !           135: . Penril
        !           136: . Racal Vadic
        !           137: . US Robotics 212A
        !           138: . Ventel
        !           139: Plus "unknown" modems and direct (modemless) connections.
        !           140: 
        !           141: 
        !           142: C-KERMIT FOR UNIX, CHANGES FROM 4C(053) TO 4C(054), 25 JUNE 85:
        !           143: 
        !           144: ckuker.mak (makefile):
        !           145: . Add "make ft17" for Fortune 16:32 For:Pro 1.7.
        !           146: . Add "make uts24" for Amdahl UTS 2.4
        !           147: . Add "make valid" for Valid Scaldstar CAD system
        !           148: . Add "make c70" for BBN C/70 IOS 2.4
        !           149: 
        !           150: ckcmai.c:
        !           151: . Add call to sysinit()
        !           152: 
        !           153: ck[uvm]tio.c:
        !           154: . Add sysinit() function.  For VMS, open console.  For others, null for now.
        !           155: 
        !           156: ckutio.c, ckufio.c:
        !           157: . Add support for Fortune 16:32, mostly like 4.1bsd.
        !           158: . Ditto for Amdahl UTS 2.4, mostly like V7.
        !           159: 
        !           160: ckuus2.c:
        !           161: . Expand a couple tabs in hlp1 (-h help message) so things line up right.
        !           162: 
        !           163: 
        !           164: C-KERMIT FOR UNIX, CHANGES FROM 4C(052) TO 4C(053), 21 JUNE 85:
        !           165: 
        !           166: ckcfn2.c:
        !           167: . Change dopar() to be of type CHAR.
        !           168: . Fix dopar() to calculate odd parity correctly.
        !           169: 
        !           170: ckucon.c, ckuscr.c:
        !           171: . Add "extern CHAR dopar();" declarations.
        !           172: 
        !           173: 
        !           174: C-KERMIT FOR UNIX, CHANGES FROM 4C(050) TO 4C(052), 18 JUNE 85:
        !           175: 
        !           176: ckcfns.c:
        !           177: . Repair rpar() and spar() handling of 8th bit prefix negotiation.
        !           178: . In sinit(), when sending from stdin, allow "-a name" to work.
        !           179: . In rcvfil(), guard against receiving a null F packet.
        !           180: 
        !           181: ckcmai.c:
        !           182: . Change hlptxt[] to contain less than 256 characters (for Xenix)
        !           183: 
        !           184: ckcpro.c:
        !           185: . In proto() call ttopen() with a temp, x, rather than "local", then only
        !           186:   set local if x was set.
        !           187: 
        !           188: ckucmd.c:
        !           189: . In cmifi(), make y long rather than int.  This was making some 16-bit
        !           190:   machines erroneously report that files longer than 32K could not be found.
        !           191: 
        !           192: ckuker.mak (makefile): 
        !           193: . Change symbol 3BX to ATT3BX (has to start with letter)
        !           194: . Remove line continuations in the middle of strings
        !           195: . Add entry for sys3nid (System III/V on PDP-11 with no I&D space)
        !           196: 
        !           197: ckufio.c:
        !           198: . Add appropriate #ifdef for TOWER1 in zkself()
        !           199: . Add 2.9bsd identification string
        !           200: 
        !           201: ckutio.c: 
        !           202: . Move definition of CTTNAM from here to ckcdeb.h, so it can be shared.
        !           203: . In initrawq() (for V7 only) read the proc table again after fork().
        !           204: . Change symbol 3BX to ATT3BX.
        !           205: . Get rid of the (void) casts in strxxx() invocations -- the proliferation
        !           206:   of conditionals was getting ridiculous, and it was only to please lint.
        !           207: . In conbin() for Sys III/V, open terminal in 7-bit, parity-enabled mode rather
        !           208:   than 8-bit, no-parity mode (some sites actually use parity).
        !           209: . In conint(), trap and ignore QUIT signal, trap SIGHUP and handle like SIGINT.
        !           210:   This prevents lock files from being left behind after hangup or quit.
        !           211: . In connoi(), turn off traps for SIGQUIT, SIGHUP.
        !           212: . In ttopen(), add Sys III/V code using ctermid() to better determine remote/
        !           213:   local status when stdin redirected.  If not Sys III/V and stdin redirected,
        !           214:   assume local, rather than remote, so that "set speed" and other local-mode
        !           215:   only commands will work.
        !           216: . Add 2.9bsd identification string
        !           217: . Make new ANYBSD symbol to select 4.1, 4.2, and 2.9.  In some cases, all 3
        !           218:   work the same, in others, 2.9 and 4.2 are the same, 4.1 special.
        !           219: 
        !           220: ckuus*.c:
        !           221: . In command line invocation, base local/remote determination on CTTNAM.
        !           222: . In "set line" only ask ttopen() to set local/remote if not default tty.
        !           223: . Ignore SIGQUIT and SIGINT signals while inferior shell active in XXSHE:.
        !           224:   Previously, both Kermit and the inferior shell would catch them.
        !           225: . In XYLINE: call ttopen() with a temp, x, rather than "local", then only
        !           226:   set local if x was set.
        !           227: . Change message "status report..." to "status report:" to avoid dot confusion.
        !           228: 
        !           229: 
        !           230: C-KERMIT FOR UNIX, CHANGES FROM VERSION 4.2(030) TO 4C(050), 30 May 85:
        !           231: 
        !           232: All files except ckwart.* have been renamed according to a consistent
        !           233: convention, see ckaaaa.hlp for an explanation.
        !           234: 
        !           235: Copyright notices added to every module, so we can't be enjoined from
        !           236: distributing our own program if we give the right to other organizations,
        !           237: like Berkeley, to distribute it.
        !           238: 
        !           239: ckwart.c
        !           240: 
        !           241: . Move the #define in the txt1 string to not start on a new line.
        !           242: . Fix the comments printed by wart so they can't be construed as comments
        !           243:   by the compiler that compiles wart.
        !           244: . Include formfeed among the skipped-over whitespace characters.
        !           245: . Add wart version information. 
        !           246: 
        !           247: ckcdeb.h (formerly ckdebu.h):
        !           248: 
        !           249: Forget about typedefing LONG to be unsigned long -- it causes too many
        !           250: problems for PDP-11 C compilers, etc.  Just let LONG be long.
        !           251: 
        !           252: If symbols DEBUG and TLOG not defined (e.g. in Makefile), then define
        !           253: null macros to replace calls to the debug() and tlog() functions, to save
        !           254: space and execution time.  Program is too big for Macintosh with these
        !           255: functions compiled in.
        !           256: 
        !           257: Establish a symbol NLCHAR.  If this symbol is defined, then text (ascii)
        !           258: files are stored with a single character (such as lf or cr) terminating
        !           259: each line, and this character is the value of NLCHAR.  If not defined,
        !           260: then the system uses CRLF.  When NLCHAR is defined, C-Kermit maps between
        !           261: that character and CRLF.
        !           262: 
        !           263: ckcfns.c, ckcfn2.c (formerly ckfns.c, ckfns2.c):
        !           264: 
        !           265: . change all calls to screen() to new form.
        !           266: . fix bug in sfile() that sometimes prevented literal names from working.
        !           267: . don't translate send-as names in sfile, always use them literally.
        !           268: . change input() to always resend() after getting a NAK.
        !           269: . change getpkt to clear leftovers when starting new file (next = -1),
        !           270:   so that filenames in F pkt wouldn't have garbage after previous file
        !           271:   was interrupted.
        !           272: . Change call to zchin() to use new calling convention so bytes with
        !           273:   hi bit on won't be confused with eof on some systems.
        !           274: . Reset czseen in seof, not in clsif, so that remote ^X while C-Kermit
        !           275:   sending will result in correct Z packet with D in data.
        !           276: . In resend(), don't send any packet if packet buffer is empty.
        !           277: . Un-hardwire getch() from Unix newline text file convention.
        !           278: . Fix bug that sometimes resulted in contents of R or X packet
        !           279:   having first character doubled.
        !           280: . Fix bug in getpkt that prevented leftovers from being transmitted
        !           281:   after end of file.
        !           282: . Have tinit() clear c[xz]seen and filnam to prevent bad things happening
        !           283:   after interruption or emergency protocol exit.
        !           284: . Have syscmd() return 0 if called with null string.  This allows single
        !           285:   process systems like the Macintosh to act as servers, even if they can't do
        !           286:   commands like remote directory.
        !           287: . Send out initial nak when doing receive, so that there will be something
        !           288:   in the packet buffer to resend.
        !           289: . Check for failure return code from zchout, to catch disk full errors, etc.
        !           290: . When server getting input from a system function, call zopeni() on new
        !           291:   ZSYSFN channel, rather than circumventing zopeni() by calling zopen().
        !           292: . Clean up inlin() a little, use maxt vs MAXTRY consistently. 
        !           293: . Change rpack,spack,rpar,spar,etc to use the new, separated send/receive
        !           294:   packet parameters (padding,timeout,eol,soh,etc).
        !           295: 
        !           296: ckcker.h (formerly ckermi.h):
        !           297: 
        !           298: . Removed #include <stdio.h> and <ctype.h> from ckermi.h.  Macintosh does not
        !           299:   need all that... (thanks, Bill)
        !           300: . Remove include of ckdebu.h (now ckcdeb.h).
        !           301: . Add defs for LF and NUL.
        !           302: . Add def for new ZSYSFN file i/o channel.
        !           303: 
        !           304: ckcpro.w (formerly ckprot.w) Protocol Module:
        !           305: 
        !           306: . Add "a" state to cancel any transaction.
        !           307: . Remove entries for input='N', since this is now handled by input().
        !           308: . Fix "a" state to not cause "OK" message when files closed.
        !           309: 
        !           310: ckucmd.c (formerly ckcmd.c) Unix Command Package:
        !           311: 
        !           312: . Set global cmerrp (error prefix) to be same as prompt, but with '>' stripped.
        !           313: . Allow interactive command continuation using trailing '\'.
        !           314: . Change "*bp++ == NUL;" in getwd() to simply "bp++;".
        !           315: . Test for CR as well as NL for line termination (for Apollo Aegis).
        !           316: . In ckucmd.h, #define getchar specially for VMS and Aegis.
        !           317: . In cmfld, return(0) from filling out default when ESC typed; this prevents
        !           318:   "log trans <ESC>transact.log <ESC>transact.log <ESC>transact.log ..."
        !           319: . In cmtxt, preserve pointers & counts across calls in case of reparse.
        !           320: . In getwd, return -1, NOT -2, if ^U (line kill) is typed.
        !           321: 
        !           322: ckucon.c (formerly ckconu.c) Connect module:
        !           323: 
        !           324: . When writing to session log, make some minimal attempt to recover
        !           325:   from disk full or other i/o errors (just turn off logging flag).
        !           326: . Add baud and parity info to status display.
        !           327: 
        !           328: ckudia.c (formerly ckdial.c) Dial command:
        !           329: 
        !           330: . Support added for Racal-Vadic, Cermetek, Penril, General Datacomm.
        !           331: . Use msleep() for higher precision timing.
        !           332: 
        !           333: ckufio.c (formerly ckzunx.c, and before that ckzbsd.c):
        !           334: 
        !           335: Started from Charles Brooks's 4.2 ckzunx.c, which is the original C-Kermit
        !           336: release 4.2 version, to which he added 4.1bsd support.
        !           337: 
        !           338: . Fixed zltor() to only count dots after the last '/'.
        !           339: . Declared malloc as "char *malloc()".
        !           340: . Change fprintf(fp[n],s) to fputs(s, fp[n]) in zsout & zsoutl.
        !           341: . Added zkself() function to log self out, for use by server "bye".
        !           342: . Changed calling convention for zchin() to allow 68000's etc to return EOF.
        !           343: . Make zopeno() chown the file to self, in case program set[ug]id'd.
        !           344: . Changed znewn() to try not to contruct a name that is too long.
        !           345: . Merge in Gregg Wonderly's v7 support.
        !           346: . Make various changes to v7 support to fit proc table stuff to other systems.
        !           347: 
        !           348: . (023) Changed zopeni(), when called with new ZSYSFN channel number,
        !           349:   to invoke zxcmd() to start a fork and get its fd; also changed zclose()
        !           350:   and chkfn() accordingly.
        !           351: 
        !           352: . (024) In zchki(), allowed 0 as well as S_IFREG as S_IFMT value for ordinary
        !           353:   file; Sys V stat() can return either of these values for an ordinary file.
        !           354:   Also, insert missing #else in zkself().
        !           355: 
        !           356: . (025) declare zchki() to be of type 'long', so that it can return valid
        !           357:   file sizes for big files.  Also fix internal variables that hold size to
        !           358:   also be long.  (Same change to ckvfio.c.)  Also, change ckcfns.c and ckucmd.c
        !           359:   to declare 'long zchki();'.
        !           360: 
        !           361: ckutio.c (formerly ckxunx.c and ckxbsd.c):
        !           362: 
        !           363: Started from Charles Brooks's 4.2 ckxunx.c, which is the original C-Kermit
        !           364: release 4.2 version, to which he added 4.1bsd support.
        !           365: 
        !           366: . Added the following for Pro/Venix Version 1:
        !           367:    - Filled in msleep() using alarm(-clockticks).
        !           368:    - Filled in conchk() and ttchk() using TIOCQCNT.
        !           369:    - Changed default tty name (dftty) to be "/dev/com1.dout".
        !           370:    - Added line locking via /usr/spool/uucp/LCK..devname and TIOCEXCL.
        !           371: . Changed local variable c from int to CHAR in ttinl().
        !           372: . Let CEB's code to hangup line upon close in 4.1bsd also work for 4.2bsd.
        !           373: . Removed flock() from ttopen(), call ttlock() before trying to open tty.
        !           374: . Corrected some places where alarms & signals were not turned off.
        !           375: 
        !           376: . Changed calling convention for ttopen() to allow it to set the "local"
        !           377:   variable, since ttopen can call the system to figure out whether a given
        !           378:   device is the job's controlling tty.  Also had to change all modules that
        !           379:   call ttopen() to pass this variable by reference instead of by value.
        !           380: 
        !           381: . In ttopen, copy ttname string into a static ttnmsv string global to ckutio
        !           382:   module, rather than just copying the pointer (which is pointing at a moving
        !           383:   target).  Should fix PC/IX tthang() problem.
        !           384: 
        !           385: . Add support for AT&T 3B-series under 3BX conditional; initially, it just
        !           386:   follows UXIII conditional, but uses special uucp lock file name.
        !           387: 
        !           388: ckuusr.c, ckuus2.c, ckuus3.c (formerly ckuser.c, ckusr2.c, ckusr3.c):
        !           389: 
        !           390: . all occurrences of printf(s) replaced by printf("%s",s) or puts(s).
        !           391: . shortening of remaining long strings.
        !           392: . continuation lines now allowed in commands if line ends with "\".
        !           393: . make "dir" command arg default to ".", not "*", to prevent recursive listing.
        !           394: . make "!" command with no args do system("$SHELL").
        !           395: . removed redundant definitions of ncmd, nrmt, nprm.
        !           396: . totally redefined and rewrote screen() function.
        !           397: . Change send-as to use cmtxt, not cmfld; remove cmcfm.
        !           398: . Fix send command to wait for confirmation after wild filespec (this was
        !           399:   broken by send-as change above, few people saw it).
        !           400: . Put 'log debug' command in #ifdef DEBUG
        !           401: . Put 'log transaction' command in #ifdef TLOG
        !           402: . Use 'transact.log' as default name for transaction log, rather than
        !           403:   'transaction.log', which is too long for all but 4.2bsd Unixes.
        !           404: . Use symbols for exit() & doexit() return codes, not hardwired 0 and 1.
        !           405: . Use symbol for name of init file.
        !           406: . Put Unix-specific messages in #ifdef's
        !           407: . In 'set line', put speed back to -1 if not local.
        !           408: . Change "*xargv++;" in cmdlin() to simply "xargv++;".
        !           409: . Change all "if (x = (cmcfm()) < 0)" to "if ((x = cmcfm()) < 0)".
        !           410: . In ckuus3, change "turnch == y" to "turnch = y"; this bug prevented
        !           411:   "set handshake" from working.
        !           412: . Add code in shopar() to look up and display modem type correctly.
        !           413: . Change "set line" code to have ttopen() figure out local/remote mode.
        !           414: . Fix "set line" not to erroneously set ttname if it ttopen fails.
        !           415: . In remote cwd parsing, accept CR as well as NL as password terminator.
        !           416: . In local directory command, use DIRCMD rather than "ls -l ".
        !           417: . In screen() function SCR_QE, print long argument with %ld so the ^A
        !           418:   status report doesn't show all 0's on systems where ints and longs
        !           419:   are different length (%ld was already used in the other screen functions).
        !           420: . Fix multiline 'get' parsing to allow editing (required fixes to ckucmd.c).
        !           421: . Add conditionals for init file name for various systems.
        !           422: . Phase out the following set commands:
        !           423:   set end-of-packet, set start-of-packet, set timeout, set padding & pad-ch.
        !           424:   Replace by set send (each of these) and set receive (each of these), to
        !           425:   allow inbound & outbound packet parameters to be set separately.
        !           426: . Put new set send/receive params in show command display.
        !           427: . Add version info for ckudia and ckuscr to 'sho ver'.
        !           428: . Add init file name to 'sho param'.
        !           429: . Replace system("pwd") in XXCWD code with system(PWDCMD), defined in ckufio.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.