From 03792666d462c5b037a60195ca2487d0f32d59e2 Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Fri, 24 Jun 2011 03:29:52 +0100 Subject: [PATCH] temporarily add .txt and .ini files from ckermit-211 --- ckaaaa.txt | 385 ++ ckc211.txt | 3595 ++++++++++++ ckcbwr.txt | 1467 +++++ ckccfg.txt | 1766 ++++++ ckcplm.txt | 3076 ++++++++++ ckermit.ini | 618 ++ ckermit70.txt | 17956 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ckermit80.txt | 10349 ++++++++++++++++++++++++++++++++ ckermod.ini | 144 + ckubwr.txt | 5330 +++++++++++++++++ ckuins.txt | 3519 +++++++++++ ckututor.txt | 1959 +++++++ 12 files changed, 50164 insertions(+) create mode 100644 ckaaaa.txt create mode 100644 ckc211.txt create mode 100644 ckcbwr.txt create mode 100644 ckccfg.txt create mode 100644 ckcplm.txt create mode 100644 ckermit.ini create mode 100644 ckermit70.txt create mode 100644 ckermit80.txt create mode 100644 ckermod.ini create mode 100644 ckubwr.txt create mode 100644 ckuins.txt create mode 100644 ckututor.txt diff --git a/ckaaaa.txt b/ckaaaa.txt new file mode 100644 index 0000000..efa83a5 --- /dev/null +++ b/ckaaaa.txt @@ -0,0 +1,385 @@ +ckaaaa.txt 10 Apr 2004 + + C-KERMIT VERSION 8.0.211 + OVERVIEW OF FILES + + Communications software for UNIX and (Open)VMS. + + And in former versions also for: + Stratus VOS, AOS/VS, QNX, + Plan 9, OS-9, Apollo Aegis, and the Commodore Amiga. + The Apple Macintosh, the Atari ST. + + The Kermit Project - Columbia University + + http://www.columbia.edu/kermit/ - kermit@columbia.edu + + + Copyright (C) 1985, 2004, + Trustees of Columbia University in the City of New York. + All rights reserved. See the C-Kermit COPYING.TXT file or the + copyright text in the ckcmai.c module for disclaimer and permissions. + + +DOCUMENTATION + + C-Kermit is documented in the book "Using C-Kermit", Second Edition, by + Frank da Cruz and Christine M. Gianone, Digital Press, ISBN 1-55558-164-1, + supplementated by Web-based updates for C-Kermit 7.0 and 8.0. + +PLATFORMS + Security + Name Included Last Updated + + Unix Yes 8.0.211 10 Apr 2004 + (Open)VMS No 8.0.208 10 Apr 2004 + Windows (K95) Yes 8.0.208 14 Mar 2003 (K95 2.1) + OS/2 (K95) Yes 8.0.208 14 Mar 2003 (K95 2.1) + DG AOS/VS No 7.0.196 1 Jan 2000 + Stratus VOS No 7.0.196 1 Jan 2000 + Bell Plan 9 No 7.0.196 1 Jan 2000 + Microware OS-9 No 7.0.196 1 Jan 2000 + Commodore Amiga No 7.0.196 1 Jan 2000 + Macintosh No 5A(190) 16 Aug 1994 (Mac Kermit 0.991) + Atari ST No 5A(189) 30 Jun 1993 + +QUICK START FOR FTP USERS + + If you have a Web browser, go to: + + http://www.columbia.edu/kermit/ckermit.html + + And take it from there. Otherwise... + + The definitive FTP source for Kermit software is kermit.columbia.edu. + Kermit software obtained from other FTP sites is not necessarily complete + or up to date, and may have been modified. + +C-Kermit for UNIX computers that have a C compiler and 'make' program: + + Directory kermit/archives, binary mode, file cku211.tar.Z or cku211.tar.gz + + This is a compressed tar archive of UNIX C-Kermit source code, makefile, and + other files. It unpacks into its current directory, so download it into a + fresh directory. Transfer in binary mode, uncompress (or gunzip), untar (tar + xvf cku211.tar), and then give the appropriate "make" command to build for + your UNIX system; read the comments in the makefile and ckuins.txt for + further info. + +C-Kermit for VMS: + + If you have VMS UNZIP, get the file kermit/archives/ckv211.zip in binary + mode, unzip, and build with CKVKER.COM. + +Others: In the kermit/f or kermit/test directories under the appropriate +prefixes, explained below. + + +INSTALLATION + +Installation procedures depend on the system. Please read the CK?INS.TXT, +if any, file for your system (?=U for UNIX, V for VMS, etc). Please note +the naming and placement for the initialization files: + + CKERMIT.INI + The standard initialization file. Please leave it as is unless you + know what you are doing and (if you are changing it or replacing it + for others to use) you are prepared to support it. Rename this file + to .kermrc in UNIX, OS-9, BeBox, or Plan 9. In Stratus VOS, rename + it ckermit.ini (lowercase). On multiuser systems, it goes either in the + (or EACH) user's home (login) directory, or else in a common shared + place if C-Kermit has been configured to look in that place (see + ckccfg.txt for details). + + CKERMOD.INI + A *sample* customization file. On multiuser OS's, a copy of this file + goes in each user's home directory, and then each user edits it to suit + her needs and preferences; e.g. by defining macros for their common + connections. + + DIALING DIRECTORIES + Dialing directory files can be system-wide, per-group, or per-user, or + any combination. For example, there can be a corporate wide directory + shared by all users, a supplemental directory for each division or + department, and a personal directory for each user. Simply be sure the + dialing directory files are identified a SET DIAL DIRECTORY command in + the user's (or the system-wide) C-Kermit initialization file, or in the + environment variable (logical name, symbol) K_DIAL_DIRECTORY. (The + standard initialization file looks by default in the user's home or login + directory.) When installing C-Kermit on multiuser platforms from which + users will dial out, you can also set environment variables for area + code, country code, and the various dialing prefixes as described on page + 478 of "Using C-Kermit" (second edition), so users don't have to worry + about defining these items themselves. Network directories and service + directories can also be set up in a similar manner. + + DOCUMENTATION + In UNIX, the general C-Kermit man page (or one of the versions tailored + for a specific platform, like HP-UX or Solaris) should be installed in + the appropriate place. In VMS, the VMS help topic (CKVKER.HLP) should + be installed as described in CKVINS.TXT. Plain-text documentation such + as CKERMIT2.TXT should be put in whatever place people are accustomed + to looking. + +FILES AND FILE NAMING CONVENTIONS + +C-Kermit is a family of Kermit programs for many different computer systems. +The program shares a common set of system-independent file transfer protocol +modules, written in the C language. System-dependent operations are collected +into system-specific modules for each system. + +C-Kermit file names all start with the letters "CK", followed by a single +letter indicating the subgroup. When referring to these files in the UNIX, +AOS/VS, or VOS environments, use lowercase letters, rather than the uppercase +letters shown here. Subgroups: + + _: Security/Authentication/Encryption code, possibly regulated by law + a: General descriptive material and documentation + b: BOO file encoders and decoders (obsolete) + c: All platforms with C compilers + d: Data General AOS/VS + e: Reserved for "ckermit" files, like CKERMIT.INI, CKERMIT80.TXT + f: (reserved) + g: (reserved) + h: (reserved) + i: Commodore Amiga (Intuition) + j: (unused) + k: (unused) + l: Stratus VOS + m: Macintosh with Mac OS + n: Microsoft Windows NT + o: OS/2 and/or Microsoft Windows 95/98/ME/NT/2000/XP/... + p: Bell Labs Plan 9 + q: (reserved) + r: DEC PDP-11 with RSTS/E (reserved) + s: Atari ST GEMDOS (last supported in version 5A(189)) + t: DEC PDP-11 with RT-11 (reserved) + u: UNIX or environments with UNIX-like C libraries + v: VMS and OpenVMS + w: Wart (Lex-like preprocessor, used with all systems) + x: (reserved) + y: (reserved) + z: (reserved) + 0-3: (reserved) + 4: IBM AS/400 (reserved) + 5-8: (reserved) + 9: Microware OS-9 + +Examples: + + ckaaaa.txt - This file + ckufio.c - File i/o for UNIX + ckstio.c - Communications i/o for the Atari ST + makefile - makefile for building UNIX C-Kermit + ckpker.mk - makefile for building Plan 9 C-Kermit + ckvker.com - build procedure for VMS C-Kermit + +IMPORTANT FILES (use lowercase names on UNIX, VOS, or AOS/VS): + + ckaaaa.txt - This file (overview of the C-Kermit files). + For system-specific distributions, this will normally + be replaced by a system-specific READ.ME file. + + ckermit70.txt - Updates: Supplement to "Using C-Kermit", 2nd Ed, for 7.0. + ckermit80.txt - Updates: Supplement to "Using C-Kermit", 2nd Ed, for 8.0. + ckututor.txt - C-Kermit Tutorial for Unix (plain text) + ckcbwr.txt - "Beware file" (limitations, known bugs, hints), general. + ckermit.ini - Standard initialization file (rename to .kermrc in UNIX, OS-9) + ckermod.ini - Sample customization file (rename to .mykermrc in UNIX, OS-9) + +The following can be found at the Kermit FTP site: + + ckermit.kdd - Sample dialing directory file (rename to .kdd in UNIX, OS-9) + ckermit.knd - Sample dialing directory file (rename to .knd in UNIX, OS-9) + ckermit.ksd - Sample services directory file (rename to .ksd in UNIX, OS-9) + ckedemo.ksc - Demonstration macros from "Using C-Kermit" + ckepage.ksc - Ditto + ckevt.ksc - Ditto + +UNIX-specific files: + + ckuins.txt - UNIX-specific installation instructions. + ckubwr.txt - UNIX-specific beware file. + ckuker.nr - "man page" for UNIX. + +VMS-specific files: + + ckvins.txt - VMS-specific installation instructions. + ckvbwr.txt - VMS-specific beware file + ckvker.hlp - VMS C-Kermit HELP topic (needs updating). + +DG AOS/VS-specific files: + + ckdins.txt - Data General AOS/VS C-Kermit installation instructions + ckdbwr.txt - AOS/VS "beware" file + ckd*.cli - Procedures for building AOS/VS C-Kermit + +The following files are of interest mainly to programmers and historians +(find them at the Kermit ftp site): + + ckcker.ann - Release announcements. + ckccfg.txt - Configuration information (feature selection), general. + ckcplm.txt - Program logic manual (for programmers). + ckc211.txt - Program update history for edit 201-211. + ckc200.txt - Program update history for edit 198-200 (big) + ckc197.txt - Program update history for edit 195-197 (big) + ckc190.txt - Program update history for edits 189-190 (big). + ckc188.txt - Program update history, edits 179-188 (big). + ckc178.txt - Program edit history, 5A edits through 178 (very big). + ckcv4f.txt - Program edit history, version 4F. + ckcv4e.txt - Program edit history, version 4E. + +BINARIES + +If you have FTP access to kermit.columbia.edu (also known as +kermit.cc.columbia.edu, ftp.cc.columbia.edu), you can also retrieve various +C-Kermit binaries from the directory kermit/bin/ck*.*, or more conventiently +from the web page: + + http://www.columbia.edu/kermit/ck80binaries.html + +Test versions would be in kermit/test/bin/ck*.*. Be sure to transfer these +files in binary mode. The READ.ME file in that directory explains what's +what. + +SOURCE FILES + +The source files for the UNIX version (all UNIX versions) are available in +kermit/archives/ckuNNN.tar.Z, approximately 1MB in size. Transfer this file +in binary mode. This is a compressed tar archive. There is also a gzip'd +version, cku211.tar.gz. To get the binary tar archive: + + mkdir kermit (at shell prompt, make a Kermit directory) + cd kermit (make it your current directory) + + ftp kermit.columbia.edu (make an ftp connection) + user: anonymous (log in as user "anonymous", lower case!) + password: (use your email id as a password) + cd kermit/archives (go to the archives directory) + type binary (specify binary file transfer) + get cku211.tar.Z (get the tar archive) (or get cku192.tar.gz) + bye (disconnect and exit from ftp) + + uncompress cku211.tar.Z (at the shell prompt, uncompress the archive) + tar xvf cku211.tar (extract the files from the tar archive) + make xxx (build C-Kermit for your system) + +(where "xxx" is the makefile entry appropriate for your system.) + +All C-Kermit source and other text files are also kept separately in the +kermit/f directory. The files necessary to build a particular implementation +of C-Kermit are listed in the appropriate makefile or equivalent: + + UNIX: makefile (or rename ckuker.mak to makefile) + 2.11 BSD: ckubs2.mak (rename to makefile), ckustr.sed + Plan 9: ckpker.mk (rename to mkfile) + Macintosh: ckmker.mak (rename to kermit.make, use MPW C 3.2) + VMS: CKVKER.COM (DCL) (and optionally also CKVKER.MMS) + or CKVOLD.COM (for VMS 4.x) + Amiga: CKIKER.MAK (Aztec C) or CKISAS.MAK (SAS C) + Atari ST: CKSKER.MAK + OS-9: ck9ker.mak or ck9ker.gcc + AOS/VS: ckdmak.cli, ckdcc.cli, ckdlnk.cli +Stratus VOS: cklmak.cm + +Minimal source files for building selected versions (these patterns get all +the files you need, and in some cases maybe a few extra): + + UNIX: ck[cuw]*.[cwh] (including QNX, Plan 9, and BeBox) + UNIX: ck[cuw_]*.[cwh] (Unix with security modules) + VMS: ck[cuwv]*.[cwh] + Mac: ck[cuwm]*.[cwhr] + AOS/VS: ck[cuwd]*.[cwh] + VOS: ck[cwhl]*.[cwh] + Amiga: ck[cuwi]*.[cwh] + Atari: ck[cuws]*.[cwh] + OS-9: ck[cuw9]*.[cwha] + +For a detailed, specific source file list for this C-Kermit release, see the +file ckcxxx.txt, where xxx is the current C-Kermit edit number, such as 211. + +Finally, here is a more detailed description of the C-Kermit file naming +conventions. A C-Kermit filename has the form: + + CK. + +where: + + is described earlier in this file; + + is the file type (use lowercase on UNIX, VOS, or AOS/VS): + + c: C language source + h: Header file for C language source + w: Wart preprocessor source, converted by Wart (or Lex) to a C program + r: Macintosh resource file (8-bit text) + a: Assembler source + + txt: Plain text. + nr: Nroff/Troff text formatter source for UNIX "man page" + mss: Scribe text formatter source + ps: Typeset material to be printed on a PostScript printer + hlp: A VMS Help topic + + ini: Initialization file + ksc: A Kermit Script to be executed by the TAKE command + kdd: A Kermit Dialing Directory + knd: A Kermit Network Directory + ksd: A Kermit Services Directory + + mak: A Makefile or other build procedure (often needs renaming) + com: (VMS only) a DCL command procedure + cli: (AOS/VS only) a command procedure + cmd: (OS/2 only) a Rexx command procedure + + boo: "boo"-encoded executable program, decode with CKBUNB program. + hex: "hex"-encoded executable program, decode with CKVDEH program (VMS only). + hqx: BinHex'd Macintosh Kermit program, decode with BinHex version 4.0. + uue: A uuencoded binary file, decode with uudecode or (DG only) CKDECO. + + def: An OS/2 linker definitions file. + sh: A UNIX shell script. + sed: A UNIX sed (editor) script. + str: A file of character strings extracted from C-Kermit (BSD 2.1x only). + + is mnemonic (up to 3 characters) for what's in the file: + +NOTE: After C-Kermit 6.0, text filetypes such as .DOC and .HLP were changed +to .TXT to avoid confusion in Windows-based Web browsers, which would +otherwise mistake them for Microsoft Word or Windows Help documents. + + aaa: A "read-me" file, like this one + ins: Installation instructions or procedures + bwr: "Beware" file -- things to watch out for, hints and tips + plm: Program Logic Manual + ker: General C-Kermit definitions, information, documentation + + nnn: Digits: C-Kermit edit number (e.g. cku211.tar.gz) + cmd: Command parsing + con: CONNECT command + cns: CONNECT command (UNIX only - version that uses select(), not fork()) + deb: Debug/Transaction Log formats, Typedefs + dia: Modem/Dialer control + fio: System-depdendent File I/O + fns: Protocol support functions + fn2: More protocol support functions (and FN3, ...) + lib: Common library routines module + mai: Main program + net: Network i/o module + pro: Protocol + scr: SCRIPT command + tel: Telnet protocol module + tio: System-dependent communications i/o & control and interrupt handing + sig: Signal handling module + usr: Interactive/script user interface + us2: More user interface (mainly help text) + us3: Still more user interface (and USR4, USR5, USR6, USR7) + usx: Common user interface functions + usy: Command-line parsing + xla: Character set translation module + uni: Unicode support + pty: Pseudoterminal support + mdb: Malloc-debugging module (not included in real builds) + str: Strings module (only for 2.xBSD) + +(End of ckaaaa.txt) diff --git a/ckc211.txt b/ckc211.txt new file mode 100644 index 0000000..1886725 --- /dev/null +++ b/ckc211.txt @@ -0,0 +1,3595 @@ +C-KERMIT CHANGE LOG (Changes since 8.0.200 of 12 Dec 2001) + +Chronological order: Go to the bottom to find the newest edits. + +---8.0.200--- + +Known bugs (+ = fixed after release): + + + 1. tilde_expand() can call getcwd() with NULL arg. + + 2. getexedir() called too early (fatal in combination with (1)). + + 3. Kermit "get blah" where blah is a symlink; server refuses to send it. + Should not do this if GET not recursive. + ? 4. Dave Sneddon's report about VMS fore/background confusion. + + 5. FTP GET path/file doesn't work - path not stripped - but MGET works. + + 6. IRIX 5.3 compilation problems (have patches from Marcus Herbert) + X 7. Filename completion bug (see below) (deferred). + + 8. QNX6 herald and other problems. + +------------- + +Merged Jeff's changes, 20 Dec 2001: + + . Changed all occurrences of "ttnproto == NP_TELNET" to "IS_TELNET()" to + account for the difference between SSH and Telnet. ckuscr.c, + ckuus[3457].c, ckcnet.h, ckcfns.c, ckudia.c, ckutio.c, ckucon.c, ckucns.c. + + . Moved SSH pty failure warnings. ckuusr.c. + + . Security adjustments to FTP module, plus fix an error message. ckcftp.c. + + . Adjustment of some security-related #ifdefs. ckcdeb.h, ckuus2.c, ckctel.c. + + . Guard against calling getpwnam() with a NULL arg in tilde_expand() ckufio.c. + + . Moved getexedir() call to later, where it's safe. ckcmai.c. + +Added SSH ADD and many SSH SET commands from Jeff's spec. Fixed SHOW SSH +to not dump core if variables weren't set. ckcker.h, ckuus[r3].c, 20 Dec 2001. + +C-Kermit in server mode, client says "get foo" where foo is a symlink. +Server says "no files meet selection criteria" instead of sending the file. +It should only refuse to follow symlinks if it's a recursive get. Fixed +in sgetinit(): ckcpro.w, 21 Dec 2001. + +More work on SSH and SET/SHOW SSH commands. ckuus[r3].c, 21 Dec 2001. + +Undid Jeff's replacement of the SSH pseudoterminal allocation failure +message, because now it comes out any time an SSH command has to be +reparsed (in the non-SSHBUILTIN case). ckuusr.c, 21 Dec 2001. + +More SSH and SET SSH command work back & forth with Jeff, plus Jeff added +SET HOST /NET:SSH. ckcmai.c, ckuus[r37].c, ckcdeb.h, ckuusr.h, 22 Dec 2001. + +Added SSH OPEN switches. ckuusr.c, 22 Dec 2001. + +Added SSH CLEAR, HELP SSH, and HELP SET SSH. ckuus[r2].c, 23 Dec 2001. + +From Jeff: + . SET TCP commands now apply to SSH + . SSH V2 REKEY and FORWRD-{LOCAL,REMOTE}-PORT commands now implemented + . Missing DLLs automatically disable appropriate authentication mechanisms. +ckuusr.c ckcnet.c ckuus3.c ckcmai.c ckcnet.h ckuus4.c, 26 Dec 2001. + +From Jeff: + . Remove SET SSH KEEPALIVES. + . Add help text for SSH AGENT { ADD, DELETE, LIST }. +ckuus[23].c, 28 Dec 2001. + +Added parsing for SSH AGENT { ADD, DELETE, LIST }. ckuusr.c, 28 Dec 2001. + +From Jeff: + . Fixed a crash that can happen when making an SSH connection. + . Filled in SSH AGENT actions. + . Changed default for strict host key check (to ASK) and help text. + . uploaded new binaries include ~kermit/os2test/beta/ssh-agent.exe + . Read man ssh-agent on ftp.kermit.columbia.edu for details on what it does. +ckuus[r23].c, 28 Dec 2001. + +"ftp get path/filename" didn't work; the FTP client did not strip the path +from the local copy of the filename when doing a GET, even though it did +for MGET. Diagnosis: in doftpget(), the "if (!getone && !skipthis)" statement +lacked an "else" part for the getone case. ckcftp.c, 28 Dec 2001. + +A while back Jeff reported that in FTP MGET, if you cancel a file with 'x', +all the rest of the files arrive truncated to 0 bytes. I tried this on both +Unix and Windows and couldn't reproduce it. + +In the last-minute flurry to release C-Kermit 8.0, I thought I noticed the FTP +client failing to update the fullscreen file-transfer display. But it seems +to work right, at least in Unix. When downloading a big file with FTP, all +the display fields are updated as expected. But smaller files might go by too +fast for the display to do anything. HOWEVER, in K95 the file transfer +display does not update itself until the end of the file, even if the file +takes a long time to transfer. This happens in both the Console and GUI +versions. A thread thing? (Jeff says no.) Yet the same display works fine +on Telnet connections. + +In IRIX 5.3, the select()-based CONNECT module had to include +or else it blew up with "struct timeval" unknown. Since there already was +a SYSTIMEH CFLAG, I added the #include within #ifdef SYSTIMEH..#endif and +rebuilt with KFLAGS=-DSYSTIMEH, only to discover that the irix5* targets +didn't bother to propogate KFLAGS. Fixed in ckucns.c, makefile, 30 Dec 2001. + +Increased IRIX5x Olimit from 2400 to 3000 because of ckuus[34].c. Added +-ansi, since (Marcus Herbert reported) we were not actually getting ANSI-C +compilation even though CK_ANSIC was defined. But now that we are, we get +warnings in , which is included by ckcnet.h: + + bit-field 'th_off' type required to be int, unsigned int, or signed int. + (3.5.2.1(30)) + u_char th_off:4, + ------ ^ +Tough. makefile, 30 Dec 2001. + +But adding -ansi to the IRIX 5x targets also make compilation bomb whenever we +referenced fdopen() or popen(), which evidently don't have prototypes in any +of the header files. Luckily we already have CFLAGS for this occasion too: +DCLFDOPEN and DCLPOPEN. Added these to the irix51 target. Also had to copy +the fdopen()-popen() prototype section to ckuusx.c, which has a new reference +to fdopen() in a workaround for the curses console buffering bug. makefile, +ckuusx.c, 30 Dec 2001. + +The QNX6 version did not receive a proper herald (it announced itself as +"unknown version". Reshuffled #ifdefs in ckuver.h, added display of QNX6 +and NEUTRINO symbols to ckuus5.c, 30 Dec 2001. + +Lucas Hart sent in a patch for the VMS problem. Apparently it was even worse +than Dave Sneddon had reported: 8.0 couldn't run at all under Batch. ckvtio.c, +31 Dec 2001. + +A major obstacle to the usability of the FTP client is that certain commands +don't behave as FTP users expect: CD, DIR, DELETE, MKDIR, etc, which are local +rather remote, and there are no LCD (etc), USER, or ACCOUNT commands. We +could fix this by adding an FTP command-language personality, but file +management commands can also be remote or local on connections to Kermit +servers too. So: + +SET LOCUS { LOCAL, REMOTE, AUTO } + Sets the locus for unprefixed file management commands. + When LOCAL, a REMOTE (or R) prefix is required for + to send file management commands to a remote server (e.g. RCD, RDIR). + When REMOTE, an L prefix is required to issue local file management + commands (e.g. LCD, LDIR). The word LOCAL can't be used as a prefix + since it is used for declaring local variables. + +This applies to all types of connections, and thus is orthogonal to SET +GET-PUT-REMOTE, which selects between Kermit and FTP for remote file-transfer +and management commands. + +The default LOCUS is AUTO, which means we switch to REMOTE whenever an FTP +connection is made, and to LOCAL whenever a non-FTP connection is made, +and switch back accordingly whenever a connnection is closed. + +Implementation (31 Dec 2001): + . None of this is compiled if LOCUS is not defined. + . Added XYLOCUS (SET LOCUS) and LOCUS definitions: ckuusr.h. + . Override by defining NOLOCUS (which inhibits definition of LOCUS). + . Added LOCUS to SET keyword table: ckuusr.c. + . Added locus & autolocus variables: ckuusr.c. + . Added SET LOCUS parsing and variable setting: ckuus3.c. + . Added display of LOCUS setting to SHOW COMMAND: ckuus5.c. + . Added automatic locus setting to setlin(): ckuus7.c. + . Added automatic locus setting to ftpopen() and ftpclose(): ckcftp.c. + +How to catch all the places where a Kermit connection is closed? Turns out +we've done this before, when we added the connection log. So I made +dologend() take care of locus switching. But dologend() was not compiled in +if certain symbols were defined, such as NOLOCAL, or not defined, such as +CKLOGDIAL. So I (a) rearranged the #ifdefs so that even if these would +otherwise have obliviated dologend(), now they leave a piece of it for +locus-setting; (b) moved the prototype out of #ifdefs; and (c) took all calls +to it out of #ifdefs. ckcker.h, ckcfn2.c, ckcmai.c, ckucns.c, ckucon.c, +ckuus[r347x].c, 31 Dec 2001. + +Added locus checking to the following commands: DIRECTORY, CD/CWD, CDUP, +DELETE, PWD, MKDIR, RMDIR, RENAME. ckuusr.c, 31 Dec 2001. + +Added LDIRECTORY, LCD/LCWD, LCDUP, LDELETE, LPWD, LMKDIR, LRMDIR, +LRENAME. ckuusr.[ch], 31 Dec 2001. + +Added USER and ACCOUNT commands, which are the same as FTP USER and FTP +ACCOUNT. ckuusr.[ch], ckcftp.c, 31 Dec 2001. + +Since automatic locus switching could be a big surprise for most people, I +printed message any time it changed. ckcftp.c, ckuus[37].c, 31 Dec 2001. + +Added help text for the new L commands and filled in missing HELP text for +SET GET-PUT-REMOTE, CDUP, MKDIR, and RMDIR. ckuus2.c, 31 Dec 2001. + +Changed help text of CD, DIR, etc, for LOCUS. Changed the help text for +RCD, RPWD, RDEL, RDIR, etc, to mention that they also work with FTP servers. +Updated HELP REMOTE for this too. ckuus2.c, 31 Dec 2001. + +Made sure code builds with NOLOCAL, NOLOGDIAL, and NOLOCUS (it does). + +The IKSD command, when given with a /USER: switch, sends the user ID to the +IKSD. But the SET HOST /USER: command does not, when making a connection to a +Kermit service. This makes it impossible to script IKSD interactions using +only client commands. Furthermore, even if you include a /PASSWORD switch +with the IKSD command, it does not send the password. I added code near the +bottom of setlin() to do this. If we have a connection to a Kermit service +and a /USER: switch was given, then we attempt a REMOTE LOGIN. If a +/PASSWORD: switch was not given then if the username is "ftp" or "anonymous", +we automatically supply a password of user@host; otherwise we prompt for a +password. If a /USER: switch was not given, it acts like before. It all +works, but it might not be the best way (or place) to do it. setlin(): +ckuus7.c, 31 Dec 2001. + + NOTE: The above change doesn't help with IKSD /USER:anonymous, + the server prompts for password anyway, not sure why. + + NOTE 2: What about secure authentication? We have to test to see + if user was already authenticated before sending the login packet. + +Added /opt/kermit and /opt/kermit/doc to info_dir[] list (for Solaris). +ckuus5.c, 31 Dec 2001. + +From Jeff: new Help text for SET TERM FONT (K95 GUI). ckuus2.c, 1 Jan 2002. + +More work on help text for file management commands -- e.g. we can't lump +the L-commands together with the unprefixed ones; they need separate entries. +Also: added missing HELP REMOTE PWD, improved the default case (in which +help text had been omitted for a valid command). ckuus2.c, 1 Jan 2002. + +It seems VMS C-Kermit was pretty much ignoring the -B (force background) and +-z (force foreground) command-line options. Fixed in congm(): ckvtio.c, +1 Jan 2002. + +Tested the SET LOCUS business with VMS C-Kermit, which does not have a +built-in FTP client. Of course in this case there is no automatic locus +switching, but SET LOCUS REMOTE works nicely on IKSD connections. + +From Jeff: + . #ifdef adjustments for LOCUS changes. + . SSH KEY CREATE /TYPE:SRP. + . Fix \v(serial) to not be 8N2 by default if speed is 0. + . Don't let doexit() run if sysinit() hasn't been called first. +ckuus[r247x].c, 2 Jan 2002. + +Made SET BACKGROUND { ON, OFF } do exactly the same as -B and -z options. +ckuus3.c, 2 Jan 2002. + +Updated user-visible copyright dates to 2002 (but still need to do all the +source-module comments). ckcmai.c, ckuus[25].c, 2 Jan 2002. + +Rearranged #include in ckucns.c that was done for IRIX 5.3, +to avoid conflicts in SV/68 R3v6. 3 Jan 2002. + +From Dave Sneddon: Code changes in VMS sysinit() and congm() to work around +problems in batch, SPAWN'd, etc, and change CTTNAM from TT: to SYS$INPUT:. +ckcdeb.h, ckvtio.c, 3 Jan 2002. + +From Jeff: + . Fixed typo in definition of CTTNAM for VMS. ckcdeb.h + . Moved macro definitions for SSHBUILTIN from ckuus3.c to ckuusr.h + so they can be referenced in ckuus7.c + . Added SSH functionality to SET HOST: + SET HOST /NET:SSH /CONNECT hostname [port] /switches + . Fixed SET NET TYPE so it won't reject SSH if SSH is installed. + . Changes to allow IKSD to continue functioning. Somehow this minor change + to ckcmai.c got lost in one of the back and forth exchanges. + . HELP TEXT for UCS2 kverb + . Fix a problem in K95 where multiple threads could be attempting to + send a telnet negotiation simultaneously. +ckcmai.c ckcdeb.h ckuus2.c ckuus3.c ckuusr.c ckuusr.h ckuus7.c ckctel.c +ck_crp.c ckuat2.h ckuath.c, 4 Jan 2002. + +From Jeff: + + Peter Runestig complaining that the Telnet Forward X code was corrupting + data. This resulted in a very thorough examination of the telnet module + code and a discovery of some rather significant problems. The root of the + problems is the lack of thread safety. To correct this problem the + following was done. + + All code (regardless of module) which outputs telnet commands is placed + into a mutex region to ensure that competing output threads do not result + in interleaving their output. This could happen for instance when the + forward-x thread is forwarding data and the user changes the window size + or sends an AYT or BREAK. Next the buffer used for input and output + processing were identical. This means that output data could be treated + as input or vice versa. Ugh.... + + I also spent some more time cleaning up setlin(). Mostly reorganizing the + code into single if (...) blocks so that breaking it up will be easier. + +ckctel.c ckuus7.c, 4 Jan 2002. + +Updated internal copyright notices. All modules, 5 Jan 2002. + +From Jeff: + More of same, plus new makefile target and changes from Spike Gronim + for freebsd44+srp+openssl. +ckcdeb.h ckcnet.c ckctel.c ckuus7.c ck_ssl.c makefile, 5 Jan 2002. + +Some minor updates and fixes to SSH and SET SSH help text. +ckuus2.c, 6 Jan 2002. + +Added SET RGB-COLORS for GUI. ckuusr.[ch], ckuus3.c, 6 Jan 2002. + +From Jeff: More Telnet changes, Debug semaphores for K95, etc: ckcdeb.h, +ckuusr.h, ckuus[r35x].c, ckctel.[ch], ckuath.c, 7 Jan 2002. + +Added --xpos:n --ypos:n, SET GUI WINDOW POSITION x y, and changed SET +RGB-COLORS to SET GUI RGBCOLOR. Action needs to be filled in (in setguiwin() +in ckuus3.c), and gui_xpos and gui_ypos need to be defined in cko???.c. +ckuusr.h, ckuus[r3y].c, 7 Jan 2002. + +Added --fontname:name --fontsize:name (and facename as synonym for fontname). +ckuusr.h, ckuus[7y].c, 7 Jan 2002. + +Moved GUI (not OS/2) SET TERM FONT code in ckuus7.c to its own routine, +setguifont(), in ckuus3.c, and made GUI SET TERM FONT call this routine, +and also made SET GUI FONT call the same routine. ckuus[37].c, 7 Jan 2002. + +Added --termtype:, --height:, --width:, --user:. Also added symbols for +--telnet:, --ssh:, --ftp:, --[remote-]charset, and --password:, but didn't +fill them in. --password: is probably not a good idea (but we allow it for +FTP); the others involve a lot of code-shuffling and reconciliation, which +I'll try to do when I get a chance (especially the connection ones, which +can be done as part of the setlin() restructuring). ckuusr.h, ckuusy.c, +8 Jan 2002. + +Also I tried commenting out the #ifndef KUI..#endif's around SET TERMINAL +CHARACTER-SET (easier said than done because a crucial #endif was mislabeled). +Let's see if it compiles & works... ckuus7.c, 8 Jan 2002 + +Added FTP [ OPEN ] /NOINIT, meaning don't send REST, STRU, and MODE commands +upon making an FTP connection. This allows connection to servers that close +the connection (or worse) when given these commands (e.g. Linux 2.4 TUX 2.0 +FTP server). ckcftp.c, 8 Jan 2002. + +Looked at adding caller ID support for the ANSWER command: + + . SET ANSWER CALLER-ID { ON, OFF } + . SET ANSWER RINGS + . \v(callid_xxx) xxx = { date, time, name, nmbr, mesg } + . CKD_CID modem capability + . Set CKD_CID for modems that have it. + . A quick survey shows: + - USR V.90: No (but Jeff says some USRs have it). + - V.250: No + - Lucent Venus: No + - USR: #CID=1 (the ones that have it -- X2?) + - Diamond Supra: #CID=1 + - Rockwell 56K: #CID=1 + - PCTEL: #CID=1 + - Zoltrix: +VCID=1 + - Conexant: +VCID=1 + . Since there are different commands to enable caller ID reporting, + we need a new field in struct MDMINF. + . SHOW MODEM and SHOW DIAL would need updating. + . etc etc... + +This is all way too much for now so I just did the setting of the \v(callid_*) +variables. These are reset at the beginning of an ANSWER command, and then +set by the ANSWER command if they come in; thus they persist from the time +they are collected until another ANSWER command is given. To take advantage +of autoanswer, the user has to enable it in the modem (all the modems I found +that support it have it disabled by default), and also has to set the number +of rings to at least 2. This can be done with (depending on the modem): + + set modem command autoanswer on ATS0=2#CID=1\{13} + set modem command autoanswer on ATS0=2+VCID=1\{13} + +and undone with: + + set modem command autoanswer on ATS0=1#CID=0\{13} + set modem command autoanswer on ATS0=1+VCID=0\{13} + +The variables can be accessed only after the call is answered. Therefore the +only way to refuse a call is to answer it, inspect the variables, and then +hang it up if desired. Future Kermit releases can do this more nicely (as +sketched out above.) Also while I was in the dialing code, I added result +code VCON (= VOICE), used by several of the newer modems. These changes are +untested. The SET ANSWER command is written but commented out. ckuusr.h, +ckcker.h, ckuus[r3].c, ckudia.c, 8 Jan 2002. + +From Jeff: fixes to --termtype:, --height:, --width:, --user:, and filling in +of --rcharset:, which required extracting code from settrm() into a separate +parse-method-independent remote character-set setting routine. ckuus[7y].c, +8 Jan 2002. + +From Jeff: More work on TERMINAL CHARACTER-SET code reorganization, and +reinstatement of SET TERMINAL CHARACTER-SET in K95G. Also, fix char/CHAR +warnings in Telnet module. ckuus7.c, ckctel.c, 9 Jan 2002. + +Made SET TERM CHARACTER-SET visible for all builds, including K95G, and filled +in HELP text for it. ckuus[27].c, 9 Jan 2002. + +Added help text for new extended options. ckuusy.c, 9 Jan 2002. + +Commented out the return(-2) statement at the end of xgnbyte() to make the +"Statement not reached" errors go away, after checking to make sure that there +was no path that could fall through to the end. I'm 99.99% sure there isn't, +but that doesn't mean that some compilers might not still complain. ckcfns.c, +9 Jan 2002. + +From Jeff: fix typo in the K95 extended-option help text; add more +semaphores to network i/o. ckuusy.c, ckcnet.c, 10 Jan 2002. + +Undid ansiisms in set{lcl,rem}charset() declarations. ckuus7.c, 10 Jan 2002. + +Removed a duplicated clause from the install target. makefile, 10 Jan 2002. + +From Jeff: more semaphores. ckcnet.c, 11 Jan 2002. + +Moved references to tmpusrid and tmpstring out of NOSPL #ifdefs -- they can +be used with NOSPL. setlin(): ckuus7.c, 13 Jan 2002. + +Made a dummy dologend() routine outside of #ifndef NOICP, so we don't have +to enclose every reference to dologend in #ifdefs. (I had added a bunch of +calls to dologend() throughout the code to handle automatic LOCUS switching.) +ckuus3.c, 13 Jan 2002. + +Moved "extern int nettype" outside of NOICP #ifdefs in ckuus4.c for NOICP +builds. 13 Jan 2002. + +Moved a misplaced #ifdef in the VERSION command. ckuusr.c, 13 Jan 2002. + +Did 81 different feature-selection builds on Linux (RH 7.0), all OK after the +changes listed above for today. 13 Jan 2002. + +Added prototypes for set{rem,lcl}charset(). ckcxla.h, 13 Jan 2002. + +Added ckcxla.h to dependencies for ckuusy.c. ckvker.com, 13 Jan 2002. + +Made a correction to the HELP SET LOCUS text and supplied a missing comma +for HELP REMOTE. ckuus2.c, 13 Jan 2002. + +Built OK on HP-UX 11.11 (K&R and ANSI), Solaris 8 (cc), Solaris 2.5.1 (gcc), +SunOS 4.1.3 (cc and gcc), VMS 7.1 (DEC C, net and nonet), Unixware 7.1.1, +Tru64 4.0G, HP-UX 10.20 (K&R), AIX 4.3.3, FreeBSD 2.2.8, Slackware 8.0, IRIX +6.5.13f, IRIX 5.3 (??? Can't tell -- the computer ran out of swap space -- but +it was OK a few days ago), VMS 5.5-2 (VAX C, UCX + nonet)... HP-UX 9.05, ... + +Some corrections to comments in HP targets from PeterE. makefile, 14 Jan 2002. + +Corrections to prototypes for set{rem,lcl}charset() (VOID, not void) from Jeff. +ckcxla.h, 14 Jan 2002. + +Builds, cont'd... SINIX 5.42, Red Hat Linux 5.2 on i386, SuSE 7.0 on S/390, +Red Hat 7.1 on IA64, QNX 4.25, HP-UX 5.21/WinTCP, ..., + +Dell Coleman noticed that in AIX, the COPY command always +says "Source and destination are the same file" when the destination file +doesn't exist. This is because in AIX, realpath() fails with ENOENT (errno +2). The zfnqfp() code already accounts for this, but evidently not well +enough. So I did what I should have done long ago. zfnqfp() was originally +accomplished with do-it-yourself code. Later I added support for realpath(), +and partitioned the routine into mutually exclusive compile-time sections: +#ifdef CKREALPATH realpath()... #else do-it-yourself... #endif. But if +realpath() failed, there was no recourse to the do-it-yourself code. Today I +replaced the #else with the #endif, so the do-it-yourself part is always +included and is executed if the realpath() call fails. Built and tested on +AIX 4.3.3 and Solaris 2.5.1, as well as on Linux with and without the +realpath() code included. zfnqfp(): ckufio.c, 16 Jan 2002. + +Separated K95 and C-Kermit test version numbers, so C-Kermit can be RC.02 +while K95 is Beta.01. ckcmai.c, 16 Jan 2002. + +Inhibited 0-length writes by conol() and conoll(), since they cause big +trouble with the AIX 4.3.3 pty driver, e.g. when you have an SSH connection +into AIX and run C-Kermit there. ckutio.c, 16 Jan 2002. + +Suppressed "Switching LOCUS..." messages from FTP client when it was invoked +from the command line. ckcfns.c, 17 Jan 2002. + +Dave Sneddon noticed that FOPEN /APPEND gets "?Write access denied" in VMS +if the file exists. This is apparently because VMS zchko() does the wrong +thing. Commenting out the call zchko() in the VMS case gets past this but +then the appended part of the file has different attributes than the orignal +part, e.g.: + + abc <- original line (horizontal, normal) + d <- appended line (vertical) + e + f + +VMS fopen() takes an optional 4th argument: a series of RMS keyword=value +pairs. Kermit doesn't give any. Experimentation shows that appending to +a Stream_LF works fine. That'll be a restriction for now, until somebody +sends in code to get the RMS attributes of the original file and feed them +to fopen(). Also need code to fix VMS zhcko() to say whether it's OK to +append to a file. ckuus7.c, 17 Jan 2002. + +Somebody suggested I could get a working Kermit for Neutrino 2+ by doing the +QNX6 build on Neutrino itself. I verified that this can't be done -- at least +not by me -- since Netutrino 2+ doesn't have a compiler, and we already know +the version cross-built for it on QNX4 doesn't work. 17 Jan 2002. + +From Jeff: SET SSH GSSAPI KEY-EXCHANGE { ON, OFF } parsing, SHOW SSH. +ckuus3.c, 18 Jan 2002. + +PeterE suggested that SET ESCAPE allow 8-bit escape characters because of the +difficulty in entering Ctrl-\ on European keyboards and the hardship (e.g. to +EMACS and VI users) of sacrificing another C0 control character. Like +everything these days, this turns out to be rather a bigger deal than it would +seem. The SET ESCAPE parser calls setcc(), which accepts control characters +in various formats (literal, ^X notation, or numbers), and gives an error +return if the value is not 0-31 or 127. This is changed easily enough to also +allow numbers between 128 and 255. But who else calls setcc()? The commands +for setting Kermit packet start and end characters. No big deal, this gives +people a bit more flexibility in case they need it, but it won't be +documented. setcc(): ckuus7.c, 18 Jan 2002. + +Since code to display the escape character is scattered all over the place, +and some of it indexes into an array based on the character value (which would +now dump core if the escape character was > 128), I put the code in one place, +a new shoesc() routine in ckuusx.c (which needs to be outside #ifndef NOICP, +since the CONNECT modules use it even in command-line only builds). Also +discovered that this code was indexing into the nm[] array with tt_escape to +get "enabled" or "disabled", which is no longer appropriate, so fixed this +too. ckuusr.h, ckuus[5x].c, 18 Jan 2002. + +Made SHOW ESCAPE, SHOW TERM, and the various CONNECT modules call shoesc(), +and updated HELP SET ESC. ckuus[25].c, ckucns.c, ck[cuvd9]con.c, 18 Jan 2002. + +After all that, it occurred to me that this is a really bad idea for K95, +with all the confusion about Console code pages, OEM code pages, Windows +code pages, and Unicode. But I tried "echo \161" at the K95 prompt and got +the expected 8-bit character in both the Console version and the GUI, so +maybe it's OK after all. + +Removed the automatic IKSD login code from setlin() since it complicates +interactive anonymous login. ckuus7.c, 20 Jan 2002. + +An #ifdef clause from Matthew Clarke to avoid "redeclaration of free" error +when building a curses version of C-Kermit for AIX 2.2.1 on RT PC. ckuusx.c, +22 Jan 2002. + +Took care of one detail I omitted when adding the 8-bit escape character: +not stripping the 8th bit before comparing the keyboard char with the escape +char. ck[uv]con.c, ckucns.c, 24 Jan 2002. + +Started to go through Jeff's changes of the last week but he had run trim -t +on them, which untabifies, so the diffs were huge. Retabifying Jeff's files +only makes matters worse. So instead of comparing each old and new source +file in EMACS windows with M-X Compare-Windows like I usually do (which can't +be told to ignore whitespace), I had to work from the diff -c -b listings. +In ascending order of size of diffs: + +ckcker.h: Add I_AM_SSHSUB definition. +ckuusr.h: XXLINK and VN_PERSONAL, etc, definitions. +ckuusy.c: Support for "I Am SSHSUB" invocation. +ckuus5.c: Support for new K95 directory structure. +ckcmai.c: Init endianness earlier (K95 TYPE was broken), "I Am SSHSUB" support. +ckuus7.c: Security #ifdefs, SSH OPEN /PASSWORD, SSHSUB support +ckcftp.c: <-- SAVE TIL LAST +ckuus6.c: Add LINK command for K95 on NT. +ckuus4.c: Support for new K95 directory structure; SSHSUB support +ckuus3.c: Support for new K95 directory structure; some SSH changes +ckuus2.c: Changes to SSH related help text, add HELP LINK text +ckuusr.c: LINK command, SSH OPEN /PASSWORD: /SUBSYSTEM: switches, + Pattern-management fixes. +ckctel.c, ck_ssl.c, ckuath.c, ckcnet.c: + Took Jeff's without looking. +ckuusx.c, ckucns.c, ckucon.c, ckwart.c: + My changes from weeks ago that were never picked up. + +Built OK on Solaris with gcc and on SunOS with (K&R non-ANSI) cc. +31 Jan 2002. + +Meanwhile, Jeff had made various changes in response to Jaya Natarajan at IBM, +whose basic complaint was that numerous failure conditions were not being +detected if the fullscreen file-transfer display was active. Jeff found that +this was because big blocks of code were skipped in that case and changed the +code not to do that, which fixed the reported problems. But later Jaya said +that "ftp mget file1 file2" acted like "ftp mget *", so it seemed that Jeff's +fixes broke file selection. After taking Jeff's fixes for ckcftp.c, however, +I still could not reproduce the problem. ckcftp.c, 31 Jan 2002. <-- Later, +it turned out the problem was with IBM's custom FTP server. + +Fixed updates that I missed yesterday in ckcftp.c, ckuusr.c. Moved misplaced +#ifdef in ckuusy.c breaking nonet builds. Added #ifdefs to sysinit() for +nonet builds in ckutio.c. Ran through build-in-many-configurations script +in Linux, all builds OK. 1 Feb 2002. + +Moved shoesc() definition outside of NOXFER to fix NOXFER builds. +ckuusx.c, 1 Feb 2002. + +Added MYCUSTOM definition alongside KERMRC and changed KERMCL to be the +same as CKMAXPATH, instead of some random hardwired number. ckuusr.h, +1 Feb 2002. + +Changed ckcdeb.h to define DIRSEP and ISDIRSEP(), and put #ifndef +[IS]DIRSEP..#endif around all [IS]DIRSEP definitions in ck[udso]fio.c, so we +can finally put away the many repeated #ifdef chains when we get around to it. +1 Feb 2002. + +Make VMS zkermini() return 1 on success, 0 on failure, rather than 0 always. +ckvfio.c, 1 Feb 2002. + +Added code to doinit(), just before it goes to execute the init file. If the +init file name we are about to open is empty or fails zchki(), substitute the +customization filename. For now this code is in #ifdef USE_CUSTOM..#endif, +which is not defined by default. It does the trick in Unix and VMS. Also +included code from Jeff for K95, but this needs verification and testing. +Also used DIRSEP and ISDIRSEP() throughout doinit() instead of the long #ifdef +chains. ckuus5.c, 1 Feb 2002. + +Moved shoesc() prototype from ckuusr.h to ckcker.h so modules that need it +don't have to include ckuusr.h just for this one thing (example: ckvcon.c). +1 Feb 2002. + +Defined USE_CUSTOM by default, except if NOCUSTOM is defined. ckuusr.h, +1 Feb 2002. + +Fixed kermit-sshsub code to really enter server mode, and to print +"KERMIT READY TO SERVE..." so scripts can wait for it. Also bumped the +C-Kermit test ID to RC.03 and the K95 one to Beta.02. ckcpro.w, ckcmai.c, +2 Feb 2002. + +I was thinking about adding SET COMMAND BUFFER-SIZE to let people allocate +as big a buffer as they wanted at runtime, mainly for defining huge macros. +Moved the SCMD_blah definitions from ckuusr.h to ckuus3.c, since they aren't +used anywhere else. But stopped there since the rest turns out to be a rather +big deal. ckuusr.h, ckuus3.c, 2 Feb 2002. + +From Jeff, 3 Feb 2002: + . Fix an out-of-order modem name in the SET MODEM TYPE table: ckudia.c. + . Use SET LOGIN USER and PASSWORD if present. ckcftp.c. + +Cody Gould noticed that array declarations had become case sensitive, and +upper case didn't work. Diagnosis: misplaced case conversion in xarray(). +Fixed in ckuus5.c, 4 Feb 2002. + +SHOW VAR dumps core on \v(sexpression) or \v(svalue) -- failure to check for +NULL pointer. I wonder why this didn't happen before (answer: because I was +doing it on SunOS; now I'm doing it on Solaris). ckuus4.c, 6 Feb 2002. + +I've had several requests for "show var name name name...". I added this to +doshow(), such that SHOW VAR works exactly as it did before (if you don't give +it an arg, it lists all variables; if you give it an arg, it appends "*" to it +and lists all matching variables) but now you can also give more than one arg +and it works the same way with each one as it did before if you gave it a +single item (i.e., "*" is appended, so "show var os cmd" shows all variables +whose names begin with "os" or "cmd". You can also freely use pattern +notation, including anchors. Hmmm, no, actually it's different in that now +each includes an implied * before AND after, so "show var version" shows all +variables whose name contain "version" rather than all variables whose names +start with it. ckuus5.c, 6 Feb 2002. + +Cody Gould reported that WRITE FILE blah blah \fexec(anything) ... got a +spurious "File or Log not open" error. This turns out to be a rather +pervasive problem -- whenever you use \fexec() it calls the parser recursively +and this can run roughshod over global variables, such as our innocent little +x, y, and s. The fix in this case was to put x and y on the stack. The same +thing probably needs doing in about 10,000 other places. Too bad C isn't +Algol. ckuusr.c, 6 Feb 2002. + +Minor fix to SHO VAR -- the "^" anchor wasn't working (e.g. "show var ^os"). +ckuus5.c, 6 Feb 2002. + +Fixes from Jeff for FTP file-transfer character-set translation in K95 and +in WIKSD, plus updated K95 SSH help text. ckcftp.c, ckcfns.c, ckuus2.c, +7 Feb 2002. + +Server has its date set in the past. Client says "remote dir". Server sends +A packet containing old date. If client has FILE COLLISION UPDATE, it +rejects the directory listing. Changed gattr() to only reject real files +(introduced by F packet), not X-packet material like directory listings. +ckcfn3.c, 7 Feb 2002. + +Up-down arrow keys for command recall. People have been asking for it for +years but now it's actually important because of PDAs that don't have Ctrl +keys. Would have been trivial except that we use getchar() rather than +coninc() for reading from the keyboard in Unix so conchk() doesn't help. In +fact there are lots of other places where conchk() is used this way and works +only by accident. The only reason we never noticed a problem before is that +characters don't usually arrive from the keyboard that fast. But when an +arrow key sends "ESC [ A" all once, the stdin buffer gets some extra stuff in +it, which getchar() will return next time, but which coninc()/conchk() will +never see. So I added a new cmdconchk() routine which, if the keyboard is +being read with getchar() rather than coninc(), looks at the stdin buffer. +Unfortunately, however, there is no API for this, nor is there any standard +way to access the stdin buffer directly. So first I did it for Solaris. Then +to make it portable requires a survey of the headers for every platform. I +found four major variations: + + stdin->_r: + {Free,Open,Net}BSD, BSDI + stdin->_cnt: + SunOS, Solaris, HP-UX 5-6, AIX, VMS, SINIX, IRIX 5.3-6.5, DGUX + 4.2BSD, 4.3BSD, OSF/1..Tru64, QNX4, Unixware 1.0-2.1.0 + stdin->__cnt: + HP-UX 7-11, SCO: OSR5.0.6a, Unixware 2.1.3-7.x, OU8, UNIX 3.2v4.x + Subtract read from end pointer (_IO_file_flags defined): + Linux (tested on RH 5.2 thru 7.1) + +The Linux method is new and different to account for multibyte characters. +All the others assume character == byte. + +For docs: ANSI only, 7-bit only; both application and cursor modes are +accepted. Only up and down arrow are handled; left and right arrows cause +a beep. ckucmd.c, 8 Feb 2002. + +Build-all: Discovered that changing CTTNAM from TT: to SYS$INPUT: in VMS +(which was done on 3 Jan 2002 to work around problems starting Kermit in +batch, spawn'd, etc) breaks Kermit on VMS 5.5/VAX (concb() fails with "lacks +sufficient privilege"; if you enable all privs Kermit starts but then spews +out a constant stream of BEL characters). If you put dftty back to "TT:", +everything is fine -- I have no idea why, so I used #ifdef VMSV70 to decide, +which is totally crude. Next I had to find where the boundary really is: VAX +vs Alpha? VAX C vs DEC C? Or between VMS releases? Built on: + . VMS 6.2 Alpha (DEC C) - OK with TT: + . VMS 6.2 Alpha (DEC C) - OK with SYS$INPUT: <-- keep this one + . VMS 7.1 VAX (DEC C) +So the final condition is #ifdef VMSV60. ckvker.com, ckvtio.c, ckuus5.c. + +QNX 6 needed some attention too: + . Whoever did the makefile target made the default port "/dev/ser1". + . Arrow keys... +But I gave up on getting arrow keys to work -- it should be just like *BSD, +but for some reason gcc complains that struct FILE has no _r member, even +though it does (getchar uses it). + +Checked stdio.h on Mac OS X and it looks like the *BSDs. + +--- C-Kermit 8.0.201 --- + +Removed -g from solaris2xg+krb5+krb4+openssl+shadow makefile target -- it +was producing a 15MB binary! makefile, 14 Feb 2002. + +Fixed a couple thinkos in "make install": $(DESTDIR) should not have been +included in the tests for whether INFODIR or SRCDIR were desired. makefile, +14 Feb 2002. + +(tarball refreshed 16 Feb 2002) + +--- C-Kermit 8.0.201 --- + +From Jeff: Better seeding of \frandom(): ckcmai.c, ckuus4.c, 18 Feb 2002. + +From Jeff: Make arrow keys work in WIKSD, but now also unconditionally +compile arrow-key code in all versions. ckucmd.c, 18 Feb 2002. + +From Jeff: ckuath.c, ck_ssl.c, ckcnet.c (didn't look). 18 Feb 2002. + +Added ORIENTATION command, that lists the various important directories, and +\flongpathname() and \fshortpathname(), which do path format conversions in +Windows, and are just synonynyms for \fpathname() elsewhere. The new functions +need building and testing in Windows. ckuusr.h, ckuus[r24].c, 18 Feb 2002. + +Changed PWD for Windows only to show both short and long paths (but only if +they are different; otherwise it behaves as before). ckuusr.c, 18 Feb 2002. + +Changed default Windows prompt to show long pathname. ckuus5.c, 18 Feb 2002. + +Updated INTRO command to mention FTP, HTTP, and SSH. ckuus2.c, 18 Feb 2002. + +From Jeff: fixes for typos in GetLongPathName() code: ckuus[r4].c, 22 Feb 2002. + +From Jeff: net/auth updates: ckcnet.c, ckuath.c, 22 Feb 2002. + +Added -DUSE_FILE__CNT to NCR MPRAS targets, George Gilmer: makefile, +24 Feb 2002. + +From Jeff: Add support for GetLongPathName() in Win95 and NT: ckcdeb.h, +ckuus[r4].c, 24 Feb 2002. + +From Jeff: More fixes for FTP SIGINT, plus fix [M]PUT /MOVE. ckcftp.c, +24 Feb 2002. + +Fixed an unguarded reference to inserver, gtword(): ckucmd.c, 24 Feb 2002. + +Adapted RETRIEVE for use with FTP connections; this one was missed when +adapting GET, REGET, MOVE, etc. ckuus6.c, ckcftp.c, 24 Feb 2002. + +Added special COPYRIGHT command text for the free version of WIKSD. +ckcmai.c, ckuusr.c, 24 Feb 2002. + +C-Kermit, when in CONNECT mode and given the U sequence, would +unconditionally close the connection if it was a network connection. This +is bad when Telnetting to a modem server. I added to code to prevent this +in the RFC2117 TELNET COMPORT case but I'm not sure how to exend this to the +general case (or whether it would be a good idea). ckucns.c, 24 Feb 2002. + +During file transfer, chktimo() calls ttgspd() for every packet, which clearly +doesn't make sense on network connections, especially since on Telnet COMPORT +connections it results in a network speed query for every packet. Rearranged +the code so this happens only on true serial-port connections. ckcfn2.c, +24 Feb 2002. + +From Jeff: Fix reversed ANSI/non-ANSI function declarations clauses in +ckcftp.c, 26 Feb 2002. + +Changed Unix CONNECT module to call kstart() only when it has a chance of +doing anything (i.e. a Kermit packet has been partially detected, or the +packet start character just came in), rather than unconditionally on every +incoming character. ckucns.c, 8 Mar 2002. + +FTP PUT /SERVER-RENAME:, /RENAME-TO:, /MOVE-TO: were sticky. Patch: In +ckcftp.c, near the top of doftpput(), add the lines marked with "+": + + makestr(&filefile,NULL); /* No filename list file yet. */ ++ makestr(&srv_renam,NULL); /* Clear /SERVER-RENAME: */ ++ makestr(&snd_rename,NULL); /* PUT /RENAME */ ++ makestr(&snd_move,NULL); /* PUT /MOVE */ + putpath[0] = NUL; /* Initialize for syncdir(). */ + +ckcftp.c, 26 Mar 2002. + +\fday() and \fnday() were broken for dates prior to 17 Nov 1858. Fixed in +fneval(): ckuus4.c, 28 Mar 2002. + +From Jeff: + . New calling convenion for demoscrn(): ckucmd.c, ckuusx.c + . Fix for host-initiated 80/132 col screen mode change. ckuus7.c. + . New \v(desktop) variable: K95 user desktop directory, ckuusr.h, ckuus4.c + . New \v(rfc2717_signature) var: Telnet Com Port, ckuusr.h, ckuus4.c + . Uncomment "not-reached" return(-2) in xgnbyte(): ckcfns.c + . New dates: ckcmai.c. + . Telnet Com Port fixes: ckutio.c + . SET PRINTER fixes for K95: ckuus3.c + . Session limit adjustments: ckuus3.c + . New directory layout for K95 (TAKE, ORIENT): ckuusr.c + . Fixes for Telnet Com Port, recycling SSH connections: ckuusr.c + +From me, not picked up by Jeff previously: + . kstart() speedup: ckucns.c. + +1 Apr 2002. + +---K95 1.1.21--- + +From Jeff, 4 Apr 2002: + . More fixes for Telnet Com Port: ckuus4.c, ckudia.c, ckutio.c, ckcnet.c: + . network connections will check for carrier detect if SET + CARRIER-WATCH is ON. This could have a potential conflict if + the option is negotiated and the carrier is off, but the site + requires login. + . modem hangup message generated since the dial module did not + believe that network modems could be reset with a DTR drop. + . Version number adjustments: 8.0.203, 1.1.99: ckcmai.c. + . Security: ck_ssl.[ch], ckuath.c. + +---C-Kermit 8.0.203--- + +From Jeff, 6 Apr 2002: + . Fix typo in HELP REMOTE HOST: ckuus2.c. + . More Telnet Com Port fixes: ckctel.c, ckcnet.c, ckudia.c, ckutio.c + +From Jeff, 9 Apr 2002: + . Fix autodownload problem: ckcfn[2s].c. + +Chiaki Ishikawa reported that in Linux (two different kinds), if you choose +hardware parity, CONNECT, then escape back, the speed can change. I tracked +this down to the following statement in ttvt(): + + tttvt.c_cflag &= ~(IGNPAR); /* Don't discard incoming bytes */ + +Somehow execution of this statement corrupted the speed words of the termios +struct, which are entirely separate words that are nowhere near the c_cflag +member. Anyway, the statement is wrong; it should be: + + tttvt.c_cflag |= IGNPAR; /* Don't discard incoming bytes */ + +Fixing it cured the problem; don't ask me why. ckutio.c, 9 Apr 2002. + +From Jeff: + fixes the problem reported by robi@hastdeer.com.au. The request to + enter server mode was received while we were entering server mode. + But the server was waiting for the response to REQ_STOP sent to the + client. Therefore, we weren't quite in server mode yet and the + request to enter server mode was rejected. A check for the sstate + value solves the problem. ckctel.c, 10 Apr 2002. + +Chiaki Ishikawa (CI) discovered the real cause for the speed changing problem. +I was setting the IGNPAR bit in the wrong flag word: it should have been +c_iflag instead of c_oflag, silly me. Fixed in ttvt() and ttpkt(): ckutio.c. +I also did a thorough census of all the termio[s] flags to ensure each was +applied to the right flag word -- they were, IGNPAR in the HWPARITY case was +the only mistake. CI also discovered that the speed words in the Linux +termios struct are not used at all -- the speeds are encoded in an +undocumented field of c_cflag, which explains the problem. 10 Apr 2002. + +Any use of \{nnn} character notation in a macro definition, loop, or other +braced block caused an "unbalanced braces" parse error. The backslash in this +case is not quoting the open brace; it's introducing a balanced braced +quantity. Special-cased in getncm(): ckuus5.c, 12 Apr 2002. + +The semantics of "if defined \v(xxx)" were changed in 8.0 to avoid obnoxious +error messages when xxx was not a built-in variable (see notes of 19 Nov +2000), such that "if defined \v(xxx)" would always succeed if there were such +a variable, even if it had no value. The behavior that is documented in the +book (and also in ckermit70.html) and that we had in versions 6 and 7, was +that IF DEFINED \v(xxx) would fail if \v(xxx) was defined but had an empty +value OR if it was not defined, and would succeed only if it was defined and +had a value. Fixed in boolexp(): ckuus6.c, 12 Apr 2002. + +What about \function()s? IF DEF \fblah() presently succeeds if the function +exists; you don't even have to give arguments. I think this behavior is more +useful than if I required valid arguments and then evaluated the function -- +you can do that anyway with 'if not eq "\fxxx(a,b)" "" ...' Of course this +argument applies to "if def \v(xxx)" too, except that the current behavior is +consistent with the 7.0 behavior, so there is no need for a change. + +Kent Martin discovered that if a macro contains a LOCAL statement for a +variable whose name is the same as, or a unique left substring of, the macro's +name, then undefining the local variable makes the macro disappear: + + define DateDiff { + echo {DateDiff(\%1) executing...} + } + define Kent { + do DateDiff {2} + local date + assign date {} + do DateDiff {3} <-- This fails (A) + } + do DateDiff {1} + do Kent + do DateDiff {4} <-- So does this (B) + +The first part of the problem is that "assign date {}" called delmac with +exact=0, so delmac evidently deleted first macro whose name started with +"date" -- and since the only one was DateDiff, that's the one that was +deleted. Fixing this (change "delmac(vnp,0)" to "delmac(vnp,1)" in dodef()) +got us past A. The second part was making the same fix to the delmac() +call in popclvl(). ckuus[56].c, 13 Apr 2002. + +The INPUT command ignored the parity setting, thus SET PARITY EVEN, +INPUT 10 "login:" didn't work. Fixed in doinput(): ckuus4.c. Also fixed a +bogus #ifdef COMMENT section that messed up the block structure of the module +and therefore EMACS's indenting. 18 Apr 2002. + +Added sco32v500net+ssl and Added sco32v505net+ssl targets, from Scott Rochford +at Dell (not sure yet if they work). Makefile, 19 Apr 2002. + +From Jeff, 22 Apr 2002: + . Added "darkgray" color and made "dgray" an invisible synonym: ckuus3.c. + . Fix carrier sense on Telnet Com Port immediately after dial: ckudia.c. + . Change krb5_des_blah() arg list: ckutio.c. + . Fix ttgmdm() for Telnet Com Port: ckutio.c. + . Fix tthang() return code: ckutio.c. + . Add aix43gcc+openssl target: makefile. + +From Jeff, 25 Apr 2002: + . Fix SET GUI keyword table: ckuus[37].c. + . A final fix to Telnet Com Port: ckctel.c, ckcnet.c. + +From Jeff, 26 Apr 2002: + . Another final fix to Telnet Com Port: ckctel.c, ckudia.c. + +From Jeff, 27 Apr 2002: + . separate the wait mechanism for TELNET SB COMPORT synchronous messages + from the asynchronous TELNET SB COMPORT MODEMSTATUS messages: ckctel.[ch] + . fix debug messages in Certificate verify functions: ck_ssl.c, ckcftp.c.a + +Frank, 27 Apr 2002: + . Fixed VMS zgetfs() to fail when file doesn't exist: ckvfio.c. + . Fixed UNIX zgetfs() to check for null or empty arg: ckufio.c. + . Added #include for time() call: ckcmai.c. + . Add casts to args in tn_wait() calls: ckctel.c. + +SINIX-P 5.42 (Pyramid architecture) makefile target from Igor Sobrado. +makefile (no source-code changes), 1 May 2002. + +From Jeff, 5 May 2002, + . Fix some "unknown host" messages: ckcftp.c. + . Add more casts to tnc_wait() calls: ckudia.c. + . Improvements to SHOW SSH, SHOW GUI: ckuus3.c. + . Fixes to SET COMMAND { WIDTH, HEIGHT }: ckuus3.c. + . Updates to ck_ssl.[ch], ckctel.c, ckcnet.c. + +Fixed the erroneous setting of ssh_cas during switch parsing rather than +after cmcfm() in setlin(): ckuus7.c, 5 May 2002. + +setlin() decomposition (2300 lines), Part One: + + . Copied a big chunk from the end of setlin(), beginning with net directory + lookup, but only the network-specific and common parts, to a new routine, + cx_net(), 900 lines. + + . Extracted many repetitious lines of error-message code from cx_net() + to a new routine, cx_fail(). Error messages are stored in slmsg, and + also printed but only if we were not called from a GUI dialog (and + QUIET wasn't set, etc etc). Any adjutments in this policy can now be + made in one place. + + . I put a call to cx_net() in setlin() just before all the code it replaced. + It works for TELNET and SET HOST /TELNET. + + . Built with mkwatsol-k5k4ssl; after a couple fixes it builds OK and makes + Kerberized connections OK. + + . Copied the serial-port and common parts of the setlin() post-cmcfm() + code to another new routine, cx_serial(), about 275 lines. Fixed + messages not to come out when called from GUI dialog, etc. Inserted + a call to cx_serial() at the appropriate spot in setlin(). Tested + serial connections on watsun with "set line /dev/ttyh6", works OK. + + . Removed all the code from setlin() that was copied to cx_*(). This slims + setlin() down to 1120 lines. Tested regular Telnet, Kerberized Telnet, and + serial connections again, all OK. The Unix version of the SSH command is + OK too. + +setlin() deconstruction, Part Two: + +Now that we have the common network and serial connection pieces moved out of +setlin(), we still need to move out the little code snippets for each network +type that take place between command confirmation and the common code we just +replaced. As far as I can tell, this needs doing only for SSH. The code +labeled "Stash everything" copied to cx_ssh() but I didn't remove the original +code since I can't test this. I think I'm done -- maybe I'm overlooking +something but I don't know what... First we need to test the heck out of it +in all command-line versions (K95 and C-Kermit). Then to use this from +the GUI, see the calling sequences for cx_serial(), cx_net(), and cx_ssh(): + + . For serial or TAPI connections, the GUI should call cx_serial(). + . For SSH connections, it should call cx_ssh() and then cx_net(). + . For all other network connections, just calls cx_net(). + +ckuus7.c, Cinco de Mayo de 2002. + +New ckuus7.c from Jeff, 8 May 2002. Merge cx_ssh() into cx_net(). Also: I +had made line[] an automatic variable, since the global line[] buffer is used +by almost every parsing routine in C-Kermit to hold string fields between +parsing and execution but Jeff says he found that some code somewhere depended +on line[] containing the hostname after setlin() was finished. + +From Jeff, 10 May 2002: + . Fix SET SSH STRICT-HOST-CHECKING parse: ckuus3.c. + . Add prototypes for cx_net() and cx_serial(): ckuusr.h. + . Add ANSI versions of cx_net() and cx_serial() declarations and supply a + missing parameter in the cx_serial() invocation, change SSHCMD cx_net() + invocation to new form. + +From Jeff, 16 May 2002: + . ANSI strictness changes: ck_ssl.[ch] + . New DIALER command: ckuusr.[ch] + . Correction to how -0 turns off autodownload: ckuusy.c + . Prototypes for GUI menu action functions: ckuusr.h. + . Replace setting of GUI-action variables by function calls: ckuus[3457x].c + . Fix FTP -z switch parsing: ckcftp.c. + . Fix SET HOST testing of setlin() return code: ckuus3.c + +From Jeff, 18 May 2002: + . Allow half-size GUI fonts: ckuus[35y].c. + +Fixed setguifont() to parse fractional font sizes and round to nearest half +point. ckuus3.c, 18 May 2002. + +For GUI, wrote front ends for getyesno(), readtext(), and readpass(): + + . uq_ok() prints text and gets Yes/No, OK/Cancel, or just OK response. + This replaces getyesno() and can also be used for alert or help boxes. + + . uq_txt() prints text and gets a single text response. Replaces + readtext() and readpass(). + + . uq_mtxt() is like uq_txt() but allows multiple text fields. Replaces + any combination of readtext() and readpass(). + +Obviously the #ifdef KUI portions of the uq_blah() routines need filling in. +ckuusr.h, ckuus3.c, 18 May 2002. + +Converted selected getyesno() calls to uq_ok(): ckcftp.c, ckuus3.c, ckuus6.c. +Some were not converted because it was inappropriate, e.g. DELETE /ASK; others +because they're in Jeff's code. The most interesting conversions are in the +DIAL command when DIAL CONFIRMATION is ON. Here there is a dialog for each +phone number asking if it's OK (ug_ok()) and if not, asking for a replacement +(uq_txt()); seems to work fine in C-Kermit. All the candidates for uq_mtxt() +are in Jeff's code. 18 May 2002. + +From Jeff: Convert remaining getyesno/readtext/readpass calls to uq_blah() +so they can be GUI dialogs. ckuus[37].c, ckcftp.c, ckuath.c, ck_ssl.c, +21 May 2002. + +Added KCD command = CD to symbolic directory name (EXEDIR, COMMON, APPDATA, +TMPDIR, etc etc). ckuusr.h, ckuus[r25].c, 21 May 2002. + +From Jeff, 28 May 2002: + . --title: commandline option: ckuusr.h, ckuusy.c + . Fix some #includes, move some declarations: ckcfns.c + . Change K95 version from Dev.00 to Beta.01 + . ASK[Q] /GUI: ckuus6.c. + . Various GUI screen updates and #ifdefs: ckuus7.c + . Add missing cx_net() calls to new setlin() for file SuperLAT..: ckuus7.c + . Updated uq_*() routines for GUI dialogs: ckuus3.c. + +Added GETOK switches (/TIMEOUT for all; /POPUP and /GUI for K95G): +ckuus6.c, 29 May 2002. + +Added HELP SET GUI text. ckuus2.c, 29 May 2002. + +From Jeff: + . Another K95-specific #include for ckcfns.c. + . More items for K95G Actions menu. + . Change K95G Locus switching to call setlocus() rather than set variable. + . Ditto for several other variables now settable from Actions menu. + . Fix SET HOST /NET:SSH status code so IF SUCCESS works. + . Fix SHOW SSH port-forwarding. +ckcfns.c, ckuus[r367].c, ckcftp.c, ckcmai.c, 30 May 2002. + +Changed SET LOCUS to have a new value, ASK, corresponding to new autolocus +value of 2, K95G only. Changed setlocus() to not do anything if the new and +old loci are the same, otherwise to invoke a GUI dialog in K95G if autolocus +is 2, and also to handle any text messages. Changed SHOW COMMAND to show ASK +value for SET LOCUS. Rewrote HELP SET LOCUS. ckuusr.[ch], ckuus[23].c, +ckcftp.c, 30 May 2002. + +Add a missing space to Locus popup, and fix Jeff's version of the code to +compile in C-Kermit. ckuusr.c, 31 May 2002. + +From Jeff, for K95 GUI, 6 June 2002: + . Force some GUI popups to be in foreground: ckuus3.c. + . Fix SHOW TERM font display: ckuus5.c. + . Update K95 version numbers and date (4 June 2002): ckcmai.c. + . Add note about encrypted private keys vs scripts to HELP SET AUTH: ckuus2.c. + . Fix SET HOST for DECnet: ckuus7.c. + +--- K95 2.0 --- + +From Jeff, 7 June 2002: + . Fix some #ifdefs for Unix builds (locus, dial, etc): ckuus7.c + . Add gui_resize_scale_font() prototype: ckuus3.c + . Add some missing SET GUI commands: ckuus3.c + . Update version numbers: ckcmai.c + +--- K95 2.0.1 --- + +From Jeff, 11 June 2002: + . Conditionalize Locus-switching popup text for GUI/Console: ckuusr.c. + . Fix the SRP_installed_as_server() function. The new API returns TRUE even + if the SRP config and password files cannot be found. Went back to the old + API. This bug affects C-Kermit 8 when built with SRP as well as 1.1.21 + through 2.0.1. Since iksdnt.exe has not been shipped yet I fixed it and + uploaded a new non-beta build of it. ckuath.c. + +From Jeff, 12 June 2002: + . Fix SSH AGENT ADD: ckuusr.c. + . Fix --facename: option to not fail if name unknown: ckuusy.c. + . Fixes for OpenSSL 0.9.7 and OpenBSD 3.1: ck_ssl.c. + . Fix SET AUTH TLS VERIFY NO to prevent a dialog but still a warning if + SET AUTH TLS VERBOSE ON is set: ck_ssl.c. + . Fix FTP code to verify the hostname as specified by the user and not + the hostname discovered by the reverse DNS lookup. For example, + FTP OPEN kermit.columbia.edu + should produce a dialog because that name is not in the certificate + even though ftp.kermit.columbia.edu (the reverse DNS name) is: ckcftp.c. + +Add support for Solaris 9 and NetBSD 1.6. makefile, ckuver.h, ckcdeb.h, +13 Jun 2002. + +Discovered that Solaris 9 wants to hide the members of struct FILE, and +enforces this for 64-bit builds. They offer some functions like __fbufsize() +to get the info, but not the info we need for reading escape sequences (the +_cnt member). Let's hear it for political correctness. Created new solaris9g +(32-bit) and solaris9g64 (64-bit) targets. Sorry, no arrow keys in 64-bit +mode. Also no more direct access to sys_errlist[]; must use strerror(). +makefile, ckucmd.c, 13 Jun 2002. + +Added solaris9g+openssl+zlib+pam+shadow, which in turn required adding +solaris2xg32+openssl+zlib+pam+shadow, needed for gcc 3.1 in which you have +to specify 32-bit. Fails for some mysterious reason in link step +(can't find libssl.so.0.9.6 even though it's there). makefile, 13 Jun 2002. + +Solaris 8 empty socket problems again -- tthang() times out, subsequent +tcsetattr() calls do horrible things. Added a bandaid to ttclos(): don't +call tcsetattr() any more if hangup timed out. ckutio.c, 14 June 2002. + +Gerry B reported the bandaid got us bit farther but Kermit still disappears. +Added code to reassert the alarm signal handler, since it is likely that +Solaris has become stricter about this since last time I looked. (Later +Gerry reported back that this did the trick -- C-Kermit now exits normally +and releases the lockfile). ttclos(): ckutio.c, 17 Jun 2002. + +If you use Kermit to copy a file to a destination file that already exists and +is longer than the source file, the destination file is not truncated. I had +mistakenly assumed that setting O_CREAT in the open() call in zcopy() would +create a new copy of the file. Fixed by also setting O_TRUNC. ckufio.c, +17 Jun 2002. + +Updated HELP INPUT and MINPUT text to explain 0 and -1 timeout values, and +HELP DIAL to explain about entering CONNECT mode automatically. ckuus2.c, +17 Jun 2002. + +Got rid of client-side "Press the X or E key to cancel" message when giving +a REMOTE command if QUIET is set or if XFER DISPLAY is NONE. ckuus7.c, +17 Jun 2002. + +From Jeff 25 Jun 2002: + . Add SUN terminal type: ckuusr.h, ckuus[57].c. + . Add GUI file transfer display: ckcker.h, ckuus[47x].c. + . Changes to allow C-Kermit to build with OpenSSL 0.9.7. Current + C-Kermit code is designed to compile with 0.9.6 and earlier. To + compile with 0.9.7 you must specify -DOPENSSL_097. This avoids + missing symbols in the DES library. The functions in OpenSSL were + renamed in 0.9.7 to avoid link time conflicts with Kerberos 4. + ckufio.c ck_crp.c ckuath.c ck_ssl.h ck_ssl.c, makefile. + +From Jeff 26 Jun 2002: + . apparently the SSL Passphrase Callback function was not converted + from readpass() to uq_txt() + . FTP Authentication failure errors were not being reported to the + user. So a failure would appear to be a successful completion + unless FTP DEBUG was ON. Now the message is reported unless + the QUIET flag is set. +ck_ssl.c, ckcftp.c. + +SET TRANSFER MODE MANUAL didn't work for FTP; fixed in putfile() and getfile(): +ckcftp.c, 1 Jul 2002. + +Changed debug log for FTP to log "FTP SENT" and "FTP RECD" for protocol +messages, just like we do for Telnet, to make it easy to grep them out of +the log. ckcftp.c, 1 Jul 2002. + +In FTP MGET /UPDATE, equal times spuriously caused download. doftpget() was +misinterpreting chkmodtime()'s return code. ckcftp.c, 3 Jul 2002. + +In FTP MGET /RECOVER, recovery is skipped if the local file is newer than +the remote. This would seem to make sense, but when a download is +interrupted, the partial file never gets the date of the remote file, so +the partial file is always newer, and recovery never works. Fixed in +recvrequest() by commenting out the date check. ckcftp.c, 3 Jul 2002. + +A better way to fix the previous problem is to always set the file date from +the server and then only allow /RECOVER to work when the dates are equal. +But that's not possible because MDTM is not implemented universally, and it +conflicts with how Kermit currently works, namely that FTP DATES are OFF by +default. Also, checking dates prevents [M]GET /RECOVER from working with +files that were incompletely downloaded by some other FTP client. + +In FTP MGET /RECOVER ..., the first file in each group +is always downloaded. Diagnosis: Kermit sends "TYPE A" prior to NLST (as it +must). Then when it sends its first SIZE command, it's still in ASCII mode, +so the server sends the "ASCII size" rather than the binary size, which does +not agree with the size of the local file (which was downloaded in binary +mode), so recovery is always attempted even when the files are identical. The +TYPE A command is sent by initconn(). After the remote_files() call, we have +to change the type back to the prevailing type before sending the first SIZE +command. Fixed in cmdlinget() and doftpget(): ckcftp.c, 3 Jul 2002. + +In FTP MGET /EXCEPT: used with SET XFER DISPLAY brief, files that +are skipped just say ERROR instead of saying why they were skipped. Fixed +in doftpget(): ckcftp.c, 3 Jul 2002. + +Added EXIT to top-level HELP text. ckuus2.c, 13 Jul 2002. + +Strip braces in REINPUT n {string}. ckuusr.c, 13 Jul 2002. + +Added /QUIET switch to ASK-class commands. This means not to print any error +messages when an ASK-class command times out waiting for a response. Made +sure that when a timeout occurs, the command fails. Also made sure the +c-Kermit prompt doesn't write over the ASK prompt if ASK times out. Also +fixed ASK, when it times out, not to return -9, which it did in one case, +which causes a command-stack dump. ckuus[267].c, ckucmd.c, 13 Jul 2002. + +Fixed SET FILE INCOMPLETE help text, which said that both KEEP and AUTO were +the default. ckuus2.c, 13 Jul 2002. + +If you SET FTP DEB ON and then turn it OFF, the MGET temp file is still kept. +Fixed by getting rid of ftp_knf variable and using ftp_deb to control whether +temp file is deleted (ftp_knf was being set from ftp_deb anyway, but then +wasn't being reset by SET FTP DEB OFF). ckcftp.c, 13 Jul 2002. + +If an FTP transfer was in progress but the FTP connection drops and automatic +locus switching is enabled, the locus does not change; thus (for example) a +subsequent DELETE command makes Kermit send a REMOTE DELETE packet on stdout. +Fixed in lostpeer(): ckcftp.c, 13 Jul 2002. + +For docs: FTP CD with no arg might not be accepted by the server; e.g. the +Kermit FTP server says "501 Invalid number of arguments". + +The FTP module never handled SET INCOMPLETE. Fixed in doftprecv2(). ckcftp.c, +13 Jul 2002. + +When FTP DATES is ON, we set an incoming file's date only if the file was +received successfully. Changed the code to set the file's date even if it was +received only partially (assuming we can get the date from server). ckcftp.c, +13 Jul 2002. + +Suppose we were doing FTP MGET /UPDATE from a server directory of 100,000 +files. Kermit would send a SIZE command for every file unconditionally. On +some connections, e.g. to the Red Hat Rawhide server, each one could take up +to 30 seconds. That would be 3 million seconds = 34 days. Don't send a SIZE +command during the selection phase unless a /SMALLER or /LARGER selector was +given. Once the file is selected, send a SIZE command only if one hadn't been +sent for that file already. ckcftp.c, 13 Jul 2002. + +Made [M]GET and [M]PUT /UPDATE switch imply FTP DATES ON, since they didn't +work unless it was. ckcftp.c, 13 Jul 2002. + +Added FTP [M]GET /DATES-DIFFER, which is like /UPDATE except it selects files +that are newer or older, rather than only newer. This allows updates from +sources where files might be rolled back to earlier versions. It's a bit +dangerous if you use it without knowing what it's for, since it allows older +files to overwrite newer ones. (Code is also in place for [M]PUT +/DATES-DIFFER, and it works, but I commented it out because it's either +useless or dangerous since when uploading, you can't set the the file dates +when they are arrive on the server.) ckcftp.c, 13 Jul 2002. + +Changed chkmodtime() to remember if MDTM fails on a particular connection +because it's an unknown command (500, 502, or 202), and if so, not to ask +again. ckcftp.c, 13 Jul 2002. + +With this last change, I think it's safe to change the default for FTP DATES +from OFF to ON. ckcftp.c, 13 Jul 2002. + +Increased max number of /EXCEPT: patterns from 8 to 64 for file transfer (not +necessarily for other things). This is now a compile-time symbol NSNDEXCEPT. +ckcker.h, ckcmai.c, ckclib.c, ckcfns.c, ckcftp.c, ckuus[rx].c. 13 Jul 2002. + +Fixed FTP MGET to not send SIZE command when there is a name collision and +FILE COLLISION is DISCARD, even if /SMALLER or /LARGER were also specified. +ckcftp.c, 15 Jul 2002. + +MGET fails if no files were transferred, even if the reason is that no files +met the selection critieria: /COLLISION:DISCARD, /UPDATE, /SMALLER, etc. +Changed MGET to succeed in that case. domget(): ckcftp.c, 16 Jul 2002. + +Big problems with canceling MGET; Ctrl-C cancels the current file, but we +don't break out of the file loop, we just go on to the next file. Worse, if +we're executing a command file that has a series of MGETs, Ctrl-C doesn't +break us out of the command file. Fixed by making failftprecv() and +failftprecv2() "chain" to the main SIGINT handler, trap(). This is fine in +Unix, but I'd be really surprised if it works in K95 so I put it in #ifndef +OS2. Ditto for MPUT: Added the same treatment to failftpsend() and +failftpsend2(). Ditto for cmdcancel(). To adapt to K95, search for "TEST ME +IN K95" (5 places). ckcftp.c, 16 Jul 2002. + +Fixed previous fix to account for the fact that failftpblah() can be called +not only upon Ctrl-C, but also if transfer interrupted with X or Z. +ckcftp.c, 16 Jul 2002. + +Yesterday's fixes revealed another problem: Interrupt MGET with Ctrl-C, start +another MGET, and the file list is total garbage. Diagnosis: secure_getc() +and secure_getbyte() use internal static buffer pointers. The only way they +ever get reset is when the data connection is closed by the server, so if you +interrupt a GET, the pointers are not reset and the next network read (e.g. of +an NLST response) returns whatever junk was lying around in the old buffer. +ckcftp.c, 17 Jul 2002. + +FTP MGET temp file is kept only if FTP DEBUG is ON. Changed FTP module to +also keep it if the regular debug log is active. ckcftp.c, 17 Jul 2002. + +Fixed version test in ckermit.ini: should be 6 digits, not 5. 17 Jul 2002. + +Changed C-Kermit version number to 8.0.205 so scripts can test for the +recent changes. ckcmai.c, 18 Jul 2002. + +---8.0.205--- + +SET FILE COLLISION UPDATE would unset FTP DATES due to a typo in the recent +changes. ckcftp.c, 21 Jul 2002. + +FTP [M]GET /DATES-DIFFER really should have been a collision option. Added +this option (implemented for FTP only) to both SET FTP COLLISION and the +FTP [M]GET /COLLISION: table, so this way if you have lots of [M]GETs, you +don't have to put /DATES-DIFFER on each one. ckcker.h, ckcftp.c, 21 Jul 2002. + +"FTP MGET a* b* c*" would fail to get any c*'s if no b*'s existed. +ckcftp.c, 21 Jul 2002. + +From Jeff, 22 Jul 2002: + . Beginnings of Ann Arbor Ambassador terminal emulation for K95; + ckuus[57].c, ckuusr.h. + . Bump K95 version number to 2.0.2: ckcmai.c + +Added -DCK_PAM -DCK_SHADOW to all Solaris targets, 2.6 and above. makefile, +23 Jul 2002. + +Discovered that CK_SCRIPTS path search for TAKE files was #ifdef'd out +except for K95. Fixed in ckuusr.c, 25 Jul 2002. + +From Jeff: changes to support K95 italics: ckuus[57].c, 25 Jul 2002. + +Fixed path search for TAKE to not search the CK_SCRIPTS path if the filespec +contains any directory or path parts. Added a new function to check for +this: int hasnopath(filespec) in ckucmd.c: 26 Jul 2002. + +Update HP-UX build instructions from PeterE: makefile, 26 Jul 2002. + +Commented out "const" from struct pam_message declarations because it +causes "initialization type mismatch" warnings. ckufio.c, 26 Jul 2002. + +Suppose you have a network directory containing a listing for host "foo": + + foo tcp/ip foo.bar.com + +Then in K95 you give a command "set host /network-type:ssh foo". This +results in the directory lookup replacing the "ssh" network type with TCP/IP, +and making a Telnet connection. Fix attempted at about line 8625 of ckuus7.c +in cx_net(); needs testing in K95. 26 Jul 2002. + +FTP Password: prompt in Unix was not allowing editing. The code looked right; +I put in some debugging and suddenly it worked. Took out the debugging and +it still worked. Maybe I dreamed it. Anyway, I fixed the "FTP SENT" debug +log entry to not record the password, and removed a redundant section above +to log the same thing, but prior to any charset conversion. ckcftp.c, +27 Jul 2002. + +From Jeff, 28 Jul 2002: + . Fix typo in initxlist(): ckcmai.c. + . Fix typo in Friday's set-host fix: ckuus7.c. + . Move parsing of --height/width command-line args after prescan(): ckuusy.c. + +Added invisible top-level SITE and PASSIVE commands for FTP as a convenience +for habituated FTP client users. ckuusr.[ch], ckcftp.c, 28 Jul 2002. + +A while back a user asked if it was possible to MGET a bunch of files from +an FTP server and have them all appended to each other upon arrival. The +obvious way to do this would have been: + + mget /collision:append /as-name:bigfile *.* + +But to make this work, I had to get rid of the "as-name must contain +variables" check in the MGET parser. doftpget(): ckcftp.c, 28 Jul 2002. + +Verified that it was possible to do the same thing (GET a bunch of files +and append them all into one result file) with Kermit protocol. It works +fine but in this case there is no /COLLISION switch; you have to SET FILE +COLLISION APPEND first. 30 Jul 2002. + +Changed COPY /APPEND to allow wild source to single destination file, e.g. +"copy /append *.* bigfile". ckuus6.c, 30 Jul 2002. + +From Mark Berryman: a replacement for zchkpath(), the VMS routine that checks +whether a file is in the current directory; the old one (that I wrote) was +a hack that only worked sometimes. Martin Vorlaender verified Mark's code in +the situation where mine was breaking (server running in captive account). +ckvfio.c, 30 Jul 2002. + +PeterE reported a problem with SWITCH case labels that start with '#': +The problem is that the SWITCH variable contents in this case happens to be +a comment, e.g.: + + CMD(M)[_forward # Stand: 24.07.2002] + +so the GOTO target is null. The solution would be for SWITCH to put the GOTO +(_FORWARD) target in quotes. But GOTO does not strip quotes or braces from +around its target. Fixed in ckuusr.c, 30 Jul 2002. + +Fixed the SWITCH macro definition to put the _FORWARD target in quotes. +ckuus5.c, 30 Jul 2002. + +PeterE also reported that an empty SWITCH case label did not work. There's no +particular reason why it should, but after a brief look, it wasn't that hard +so I did it. It required commenting out the check for empty labels and fixing +the comparison in dogoto(). Now it's possible to read lines from a file and +use each line as a SWITCH variable, with patterns as case labels, including an +empty label to match empty lines, #* labels to match comment lines, etc. +ckuus[r6].c, 30 Jul 2002. + +PeterE also reported the value of \%* acquiring a trailing blank when +referenced inside a SWITCH statment. This happens because \%* is formed using +\fjoin() on the \&_[] array based on its dimension, and at some point the +dimension is spuriously increased by one. As a workaround, I made \fjoin() +ignore trailing empty \&_[] array elements and oddly enough this also fixed +the growing dimensions problem. The many script torture tests reveal no ill +effects, so it seems like a keeper. ckuus4.c, 30 Jul 2002. + +Some of Peter's sample scripts made C-Kermit 8.0.201 dump core, but no more. + +Fixed "delete xxx" to print an error message and fail if if xxx does not exist. +Ditto for when xxx is a directory. ckuus6.c, 30 Jul 2002. + +Patches to SSL modules from Jeff based on yesterday's advisory. ck_ssl.[ch], +31 Jul 2002. + +Fixed some typos affecting the filename collision action during command-line +FTP [M]GET. ckcftp.c, 31 Jul 2002. + +Fixed SHOW FTP to handle FTP COLLISION DATES-DIFFER. ckcftp.c, 31 Jul 2002. + +A while back someone pointed out that SET CONTROL UNPREFIX ALL and SET +PREFIXING NONE gave different results. Fixed them to use the same code. +Also made "set prefixing none" visible. ckuus3.c, 4 Aug 2002. + +Added SET CD HOME , to let the user specify which directory is intended +when "CD" or "KCD" is given by itself. This is because in Windows, some +applications set up their own HOME environment variable that isn't necessarily +where the user wants "cd" to go, but redefining HOME can interfere with the +application (example: Windows EMACS). SET CD HOME was done by adding a myhome +variable, initially a NULL pointer, and then changing homepath() to use it if +it is set. zhome() is not affected. Also the homepath() prototype had been +missing from header files. ckcmai.c, ckuusr.h, ckuus[2345].c, 4 Aug 2002. + +PeterE got another core dump with his SWITCH statement. Found a place where +an out-of-bounds array reference could occur if the switch variable was +empty. ckuus6.c, 5 Aug 2002. + +PeterE noticed that if the switch variable contained a comma, spurious matches +could occur with the label pattern. The real problem turns out to be what +happens when the SWITCH variable doesn't match any of the case labels and +there is no DEFAULT label. Fixed by having dogoto() in the SWITCH (_FORWARD) +case pop the command stack before returning failure, i.e. by moving the +"if (stopflg) return(0);" statement down a few lines. ckuus6.c, 5 Aug 2002. + +PeterE noticed that a SWITCH case label of :* did not match an empty SWITCH +variable. Fixed in doswitch(): ckuus6.c, 6 Aug 2002. + +In testing the previous fix, I found it only worked sometimes. Inspection +of the debug log showed that a statement like: + + if (y == -3) s = "{}"; + +was assigning "{" rather than "{}" to s. Replacing the string constant by a +buffer containing the same string fixed it. The reason (guessed correctly by +PeterE) was the following sequence: + + y = cmfld("Variable name","",&s,xxstring); + if (y == -3) s = "{}"; + len = ckstrncpy(tmpbuf,brstrip(s),TMPBUFSIZ); + +brstrip() (by design and as documented) affects the string in place. But in +this case the string is a constant, not data in a buffer, so all further uses +of "{}" get the wrong string (at least in optimized builds). The only real +cure is to change brstrip() to make a copy of its argument if it has to do +anything to it. This will slow down some scripts, but it's too risky to +leave it as it was. ckclib.c, 6 Aug 2002. + +The previous change required an audit of the C-Kermit code to make sure that +no references to brstrip() depended the result buffer being persistent, or the +result pointer indicating a position in the source buffer. Oops, it turns out +that thousands of places rely on brstrip() working in place. Therefore the +change had to be undone. There's no good way to write a dummy-proof brstrip(); +programmers either have be sure they're not calling it with a pointer to a +string constant, or else they have to copy the result back to the right place +each time. Better to leave it as it was and audit the code to fix any calls +that refer to string constants (turns out there were only two). Restored the +original fix to doswitch() (replacing the string constant by a buffer holding +the same string), plus minor fixes to ckcftp.c, ckuus[r36].c, 6 Aug 2002. + +We need file dialogs in several situations in the K95 GUI. I added a "user +query" routine for this, uq_file(), in ckuus3.c, filling it in only for Unix. +Then I added code to call it from rcvfil() when (a) it's an autodownload, and +(b) SET TERM AUTODOWNLOAD is ASK (I just added this option; it needs to be set +to see it in action -- maybe it should be the default for KUI, in which case +initialize "int autodl = ?" to TAD_ASK in ckcmai.c). Works fine, except of +course it interferes with the file-transfer display, but that won't be a +problem in K95G. ckuusr.h, ckuus[37].c, ckcfns.c, ckucns.c, 6 Aug 2002. + +Another place we need a file dialog is when Kermit is a URL interpreter. The +problem is: how can we let the user decide whether Kermit should ask? There +really isn't any way. Either it always asks or it never does. In this case I +think it makes sense to always ask if it's KUI, otherwise never. I added the +code for ftp: URLs to to doftprecv2(), which I tested successfully in Unix +before putting it into #ifdef KUI..#endif. Also added code for http[s] to +ckuusy.c in #ifdef KUI..#endif, not tested. + +Still need this added for K95G Actions->Capture. The clearest example is the +FTP one. Just search for KUI in the FTP module. + +Some minor adjustments to yesterday's work, mainly just comments, plus +generate the full pathname for the default file. ckuus3.c, ckcftp.c, +7 Aug 2002. + +Note: for some reason cmofi() is not supplying the default value if user +enters an empty name... (but that won't affect the Windows version). + +Added /USER: and /PASSWORD: switches to SET TCP { HTTP-PROXY, SOCKS-SERVER }. +ckuus3.c, 7 Aug 2002. + +New 'uninstall' target from PeterE, works by having the 'install' target +write an UNINSTALL shell script. makefile, 8 Aug 2002. + +Added some debugging statements to the VMS communications i/o module to try +to track down a problem that occurs when the controlling terminal is a LAT +device. ckvtio.c, 10 Aug 2002. + +Fixed the non-K95 uq_file() to respect the given default name, but still show +the fully qualified absolute pathname for the default in the dialog. The +reason to not use the fully qualifed name as the default in the cmxxx() calls +is that this can easily result in a whole directory tree being created due to +directory aliases, symlinks, etc. So when you get a file by referring to its +URL (e.g. ftp://kermit.columbia.edu/kermit/READ.ME), uq_file() converts the +READ.ME part to (e.g.) /home/fdc/tmp/READ.ME but gives just "READ.ME" as the +default when parsing the name. This way the user knows where it will go and +gets an opportunity to change it, and if the default is accepted, it goes into +the current directory. uq_file(): ckuus3.c, 10 Aug 2002. + +Found the spot for calling uq_file() for kermit:// URL downloads. Added +prefatory text to filename prompts for Kermit and FTP downloads. ckcfns.c, +ckcftp.c, 10 Aug 2002. + +Now with kermit:// or ftp:// URL downloads there's no way to disable the +prompting. I could easily make SET TERMINAL AUTODOWNLOAD ASK cover these +cases too (even though "terminal" has nothing to do with FTP or URL +downloads). OK, I did this, but now prompting is disabled by default. +ckcftp.c, ckcfns.c. 10 Aug 2002. + +Enabled file prompting (adl_ask) by default in K95G, disabled it by default +everywhere else. So now FTP and Kermit URL downloads as well as terminal-mode +Kermit (but not Zmodem) downloads are prompted for if TERMINAL AUTODOWNLOAD is +ASK, which is it by default only in K95G. But this will happen only if +uq_file() is filled in for K95G; otherwise everything should work as before. +ckcmai.c, 10 Aug 2002. + +Notes: + . Need a better command to control this. + . FTP URL downloads are almost instantaneous, whereas Kermit URL downloads + take a really long time to set up (logging in takes at least 10 seconds). + +From Jeff, 13 Aug 2002: + . Increase K95 version to 2.1.0: ckcmai.c. + . SET TCP { HTTP-PROXY, SOCKS-SERVER } /USER: /PASSWORD: actions: ckuus3.c. + +From PeterE: a new install target that's only about half as a big as the +previous one, yet still generates an UNINSTALL script. makefile, 13 Aug 2002. + +Vace wanted to be able to give the FTP client an offset for the server time, +in case the server's time (or timezone) is set incorrectly. I added this by +building on all the date/time parsing/arithmetic code -- notably delta times +-- that was done for C-Kermit 8.0. The new command is SET FTP +SERVER-TIME-OFFSET delta-time; shows up in SHOW FTP and HELP SET FTP. +ckcftp.c, 13 Aug 2002. + +Fixed HELP ASK and HELP GETOK text. ckuus2.c, 14 Aug 2002. + +Fixed GETOK to accept /GUI switch even in K95.EXE and C-Kermit, just like ASK +does (in which case, it just ignores it). ckuus6.c, 14 Aug 2002. + +SET XFER CHAR TRANSPARENT no longer disables character-set translation because +file-scanning turns it back on. The "new way" to disable character-set +translation is SET XFER TRANSLATION OFF. This needlessly confuses users who +expect the old way to still work. So I fixed SET XFER CHAR TRANSPARENT to set +XFER TRANSLATION OFF, and SET XFER CHAR anything-else to set it back ON. +ckuus3.c, 15 Aug 2002. + +Fixed SET TERM AUTODOWNLOAD { ON, OFF } to turn off the ASK flag (adl_ask). +ckuus7.c, 16 Aug 2002. + +Added FEAT query to FTP client from draft-ietf-ftpext-mlst-13.txt. FEAT is +sent along with REST 0, MODE S, and STRU F if /NOINIT is not included in the +FTP OPEN command. Parsing the FEAT result is handled by turning the "auth" +argument to getreply() into a function code: GRF_AUTH to parse AUTH reply; +GRF_FEAT to parse FEAT reply. For GRF_FEAT, getreply() fills in a flag array, +sfttab[] (server feature table); sfttab[0] > 0 means server responded to the +FEAT query, in which case individual elements are set > 0 for each supported +feature. ckcftp.c, 18 Aug 2002. + +If server sends a feature list, display it if FTP DEBUG is on, then set mdtmok +and sizeok (the flags that say whether it's OK to send MDTM and SIZE commands) +accordingly. If user gives an [M]PUT /RECOVER command and server has +announced it doesn't support REST, print a warning but try anyway (maybe +change this later). Responses about other features that we use such as AUTH +and PBSZ are ignored for now -- i.e. we try them anyway. And of course +responses for features we don't care about (LANG, TVFS, PROT) are ignored. +ckcftp.c, 18 Aug 2002. + +If the server says it supports MLST, use MLSD instead of NLST to get the file +list. This is done in remote_files() with some simple string-twiddling. Then +replace the relevant (but not all) SIZE commands with code to first check if +we already got the size from the MLSD response and use that instead rather +than asking again. Same deal for MDTM. ckcftp.c, 18 Aug 2002. + +Checked that this works when giving pathnames in the MGET filespec. Checked +to make sure everything works as before with servers that don't support FEAT +or MLSD. Checked to make sure FTP OPEN blah /NOINIT worked with servers that +do support FEAT and MLSD. Checked that FTP CHECK works. It's all OK. + +Tested only with Ipswitch server; need to find and test with others. + +The stack of temp files needed for MGET /RECURSIVE is annoying because what +if we run out of file descriptors... But the spec doesn't provide a way to +request a recursive listing. + +Supplied a missing comma in HELP SET CD text. ckuus2.c, 19 Aug 2002. + +Generalized parsing of MLST/MLSD file facts and values. Got file type from +server and had MGET skip non-regular files. ckcftp.c, 19 Aug 2002. + +Kirk Turner-Rustin reported that if Unix C-Kermit has a SET +HOST PTY connection (e.g. SSH) open, local window size changes are not +propogated through the connection to the host. I imagine that must be because +the SIGWINCH signal is caught by Kermit and its children don't see it; maybe +if I pass it along to the child fork, all will be OK. Began by exporting +"slavepid" from the pty module and changing its name to pty_fork_pid. Moved +the SIGWINCH handler, winchh(), from ckctel.c to ckutio.c. Armed it from Unix +sysinit() so it's always armed. This way window changes affect Unix C-Kermit +no matter what mode it's in: tt_rows, tt_cols, cmd_rows, and cmd_cols are all +kept in sync. Then if we're not in remote mode (i.e. we have a ttyfd), we +call tn_snaws() and rlog_snaws() (which should be ok since they return right +away if the appropriate kind of connection is not open) and then if +(pty_fork_pid > -1), a SIGWINCH signal is sent to it. ckupty.c, ckctel.c, +ckutio.c, 20 Aug 2002. + +All this works fine except the PTY part; in other words, the original problem +is not fixed. The "kill(pty_fork_pid,SIGWINCH)" call executes without error +but has no effect because the size of the PTY never changed. To make this +work I had to add an ioctl() to change the size of the PTY before sending it +the SIGWINCH. Compiles and works ok on Linux and Solaris; Kirk also confirmed +it for AIX 4.3.3. ckutio.c, 20 Aug 2002. + +Fixed xlookup() to work for uppercase keywords. ckucmd.c, 20 Aug 2002. + +Fixed FTP parsefeat() and parsefacts() to use xlookup() instead of lookup(), +since abbreviated keywords are not allowed. ckcftp.c, 20 Aug 2002. + +Adjusted some lines from yesterday's window-size code for platforms I hadn't +tried yet. ckutio.c, 21 Aug 2002. + +EXIT from K95 when it has an FTP connection open and it pops up the +Locus dialog. Made it not do this if it knows it's in the act of EXITing. +ckuus[rx].c, 22 Aug 2002. + +In K95, FTP GET in ASCII mode results in a file with Unix line terminators +even though the protocol is correct: + + RETR smjulie.txt + 150 Opening ASCII mode data connection for smjulie.txt (1878 bytes). + +The source file is a regular Unix text file with LF at the end of each line. +It's incredible that nobody noticed this before. It only came to light when +somebody tried to open a downloaded text file with Notepad, which doesn't +handle Unix-format files (Wordpad and Emacs have no problems with them). The +problem was in doftprecv2() in the FTT_ASC section. There was no conditional +code for Unix vs Windows. In all cases, the code discarded incoming CR's in +ASCII mode. I put the CR-discarding code in #ifdef UNIX..#endif. ckcftp.c, +22 Aug 2002. + +Removed super-verbose debugging from gtword(): ckucmd.c, 23 Aug 2002. + +Gregory Bond reported a problem with "if defined \$(BLAH) ..." inside of a +SWITCH statement. It wasn't really the SWITCH that was doing it, it was the +fact that he had enclosed the SWITCH case in braces, which made it an +"immediate macro" (XXMACRO). The XXMACRO code parsed the macro definition +(the part inside the braces) with cmtxt(...,xxstring), which should have been +cmtxt(...,NULL) to defer the evaluation of the interior of the macro until it +was executed. This is better illustrated with the following example: + + { echo START, for \%i 1 3 1 { echo \%i }, echo STOP } + +which totally fell on its face prior to the fix. Also fixed ?-help for +immediate macros, which was broken too. ckuusr.c, 23 Aug 2002. + +RFC959 says STOU does not take an argument. But every FTP server I've +encountered but one accepts the arg and constructs the unique name from it, +which is better than making up a totally random name for the file, which is +what RFC959 calls for. Especially because there is no way for the client to +find out the name chosen by the server (because RFC 959 and 1123 are +contradictory, plus no servers follow either one of them for this anyway). So +we try STOU with the argument first, which works with most servers, and if it +fails, we retry it without the arg, for the benefit of the one picky server +that is not "liberal in what it accepts" UNLESS the first STOU got a 502 code +("not implemented") which means STOU is not accepted, period (which happens +with ProFTPD). ckcftp.c, 25 Aug 2002. + +Added SET FTP ANONYMOUS-PASSWORD (plus help text and show value). ckcftp.c, +25 Aug 2002. + +Made FTP command "not available" if NOFTP is defined. ckuusr.c, 25 Aug 2002. + +Forced client to send a TYPE command upon initial connection, since given +the variable quality of FTP servers, it's not safe to assume the server is +in ASCII or any other particular mode. ckcftp.c, 25 Aug 2002. + +SET FTP CHARACTER-SET-TRANSLATION ON is completely broken in K95, although it +works fine in C-Kermit. Furthermore it is broken in both the GUI and Console +versions, so it's not a Unicode vs OEM console-character-set issue. + +Added Concurrent PowerMAX OS target from Tom Horsley. makefile, ckuver.h, +27 Aug 2002. + +Minor fixes to FTP module from Jeff. ckcftp.c, 27 Aug 2002. + +New Makefile target for Mac OS X 10.2, needs -DNDSYSERRLIST added, from +William Bader. 2 Sep 2002. + +SET OPT DIR /DOTFILES didn't work for server listings. A few years ago when +I front-ended zxpand() with nzxpand(), I missed a couple places where +traverse() needed to refer to xmatchdot (nzxpand's argument flag) rather than +global matchdot. Fixed in traverse(): ckufio.c, 2 Sep 2002. + +From Jeff, 4 Sep 2002: + . setautodl(x) -> setautodl(x,y): ckuusr.h, ckuus[7y].c + . Add another parameter to popup_readblah(): ckuus6.c + . Sort out some confusion in scanfile() where a parameter was also used as a + local flag. ckuusx.c. + . Protect restoring of saved terminal idle parameters with a flag that says + they were actually saved. ckuusr.c. + . Rework uq_text() and uq_mtxt(). ckuus3.c. + . Fix FTP charset translation for little-endian hardware: ckcftp.c. + +The latter still doesn't work in Linux: + + (/home/fdc/kermit/) C-Kermit>set ftp server-character-set latin1-iso + (/home/fdc/kermit/) C-Kermit>set file character-set utf8 + (/home/fdc/kermit/) C-Kermit>get latin1.txt + +Results in "????????: file not found". But it works fine on the Sun. + +Jeff's patch removed a little-endian byte-swap (LEBS) from doftpsend2(). But +the real problem was that LEBS was not being done consistently throughout the +module. There were similar xgnbyte()/xpnbyte() loops elsewhere in the code, +and all of them needed to work the same way. Undoing Jeff's fix and then +adding the LEBS to the loop in getreply() makes downloads work right, but the +messages are still messed up (they come out in Chinese :-) Begin by moving all +byte-swapping operations that occur in ckcftp.c itself into a new function, +bytswap(). It's either right to do it all the time, or to do it never; this +way we can turn it on and off in one place. + +xp/gnbyte() include behavior that depends on what Kermit is doing: W_SEND, +etc. xpnbyte() tests W_KERMIT, which is a combination of W_SEND, W_RECV, etc. +Defined a new symbol W_XFER, which is like W_KERMIT but includes W_FTP. These +are all the "whats" in which character sets might need to be converted. +Changed the W_KERMIT reference in xpnbyte() to W_XFER. Fixed the inderminate +"what" state after an FTP command by moving "what = W_COMMAND;" from before +the main parse loop to inside it (this didn't matter before the addition of +FTP but now it does). ckcker.h, ckcftp.c, ckuus5.c, 6 Sep 2002. + +Finally I changed xlatec() to be consistent with all the other xgnbyte() / +xpnbyte() usage throughout the FTP module and, poof, everything worked in +Linux (and still works on the Sun). We still need some work in Windows (where +the file character-set is not necessarily the console character set for +messages) but we can tackle that next. ckcftp.c, 6 Sep 2002. + +Checking yesterday's work: + +Kermit file transfers with charset translation work fine in both directions. + +FTP GET with charset translation works fine on both BE and LE + +Fixed a typo in yesterday's changes that made FTP PUT with charset translation +always upload 0-length files. ckcftp.c, 7 Sep 2002. + +FTP PUT (after the typo was fixed) with charset translation works fine on BE, +but on LE the message comes out in Chinese and the resulting file gets ? or +nothing for all for the accented letters: + + FTP... Kermit + Up Dn Up Dn Term + BE OK OK OK OK xx + LE no OK OK OK xx + +xx = C-Kermit CONNECT mode with translation doesn't seem to do anything, not +only in today's code, but also in the 8.0 release version: "set term char +latin1 utf8" -- SHOW CHAR shows the right stuff, but no translation is done. +Ditto for the 7.0 release. That can't be right... + +But one problem at a time -- what's wrong with LE FTP uploads? Note that +XLATE works on the same machine, so it's obviously confusion in xgnbyte() +about "what". Suppose we make xgnbyte() ALWAYS return bytes in BE order. +This makes sense because xgnbyte() is almost always used to feed xpnbyte(), +and xpnbyte() requires its bytes to come in BE order. This means that all +code that uses xgnbyte()/xpnbyte() loops can be simplifed, which I did for +the FTP module. ckcfns.c, ckcftp.c, 7 Sep 2002. + +Of course Kermit protocol uses xgnbyte() too, but only for filling +packets, and packets never contain UCS2 and even if they did, it would have +to be big-endian, so no changes needed for getpkt(). Now we have: + + FTP... Kermit + Up Dn Up Dn + BE OK OK OK OK + LE OK OK OK OK + +Now let's look at the remaining xgnbyte() calls in the rest of the code: + +ckuus4.c: + xlate() uses it of course. I simplified the general-case loop. + Works OK on both Sun and Linux. + +ckuus6.c: + typegetline() uses it. I commented out the byte swap. Seems OK. + +Built and tested on Linux, Solaris, and SunOS. I'm sure I must have broken +something, but the main things are better than they were. Kermit and FTP +transfers need testing in K95, as well as the TYPE command (there's a bunch of +special K95 code in there). C-Kermit charset translation during CONNECT is +still broken, or else I forgot how to use it, but that's a separate issue +since xgnbyte()/xpnbyte() are not involved. And we still need to do something +in FTP getreply() for K95 to convert messages to the console character set for +display, rather than the file character set (should be trivial). Also there's +still a lot of extra debugging and commented-out junk in ckcftp.c to be +cleaned up after more testing. + +During yesterday's testing, I noticed that REMOTE SET { FILE, XFER } +CHARACTER-SET didn't work. The server accepted these commands but they didn't +seem to do anything. In fact, they did work, but they were undone later by +code in sfile() that restored the global settings in case they had been +temporarily overridden by autoswitching or whatever. The solution is to +"unsave" the saved values whenever a global setting is performed explicitly. +Tested successfully against Sun and Linux servers. Also the server end of +REMOTE SET needed updating for Unicode. ckcfn[s3].c, ckuus3.c, 8 Sep 2002. + +Cleaned commented-out cruft and extra debugging from ckcftp.c. 8 Sep 2002. + +Kermit autodownload with ASK file dialog: if user supplied an absolute +pathname, it was treated like a relative one. Fixed the invocation of +uq_file() in rcvfil() to temporarily override the RECEIVE PATHNAMES setting. +ckcfns.c, 10 Sep 2002. + +Added SET TERMINAL ROLL KEYSTROKES { SEND, RESTORE-AND-SEND, IGNORE }, parse +only. Needs implementation (search for tt_rkeys and rollkeytab in ckuus7.c). +ckuusr.h, ckuus[27].c, 10 Sep 2002. + +If FILE INCOMPLETE is DISCARD and a file is being received by IKSD but IKSD +gets a Telnet LOGOUT command, the partial file is not deleted. In fact this +happens any time doexit() is called for any reason during file reception, +e.g. because of SIGHUP. Added code to doclean() to check if a download +output file was open, and if so, to delete it after closing it if keep==0. +ckuusx.c, 10 Sep 2002. + +Added a brief one-line message after remote-mode file transfer saying +what (or how many) file(s) were transferred, where they went, and whether +the transfer was successful -- kind of an automatic WHERE command, useful +with autodownloads so you know what happened. ckcpro.w, 11 Sep 2002. + +The Unix and VMS C-Kermit CONNECT modules have botched remote-charset to +local-UTF8 translation ever since the Unicode was first added in v7.0. Fixed +in ckucns.c, ckucon.c, ckvcon.c, 11 Sep 2002. + +On to pattern-matching... The matchdot business should apply only for (Unix) +filename matching, not for general string matching. Fixed in ckmatch(): +ckclib.c, 11 Sep 2002. + +A bigger problem occurs in filename matching. Somehow the dirsep == fence +business interferes with matching {foo,bar,baz} segments. For example, I have +a filename "foo" and I want to match it with the pattern "{foo,bar}". Somehow +the segment pattern becomes "*/foo" and doesn't match the string. Where does +the '/' get tacked on? I don't even know how to explain this, but the short +story was that ckmatch(), under certain circumstances, would back up to before +the beginning of the filename string, which just happened to contain a "/" +(and before that a ".") because of who was calling it. Obviously this is not +how to write a pattern matching function... Ensuring that it never backs up +beyond the beginning of a string fixed the immediate problem and does not seem +to have broken any other matching scenarios (I have 150 of them in my test +script). ckclib.c, 11 Sep 2002. + +There's still a problem though. Suppose the a client sends "dir {{.*,*}}" to +a server. This asks for a directory listing of all files that begin with +dot as well as all files. Still doesn't work because we don't normally show +dot-files, but in this case it SHOULD work because ".*" was explicitly +requested. Staring at the ckmatch() code revealed how to fix this, and I did, +but that was only half the problem. The other half was that the list of +files being fed to ckmatch() did not include the dotfiles in the first place. +The cure here is to change nzxpand() to prescan the pattern to see if it +includes a leading dot, and if so to set the "xmatchdot" flag itself, even +if it wasn't set by the caller. ckclib.c, ckufio.c, 11 Sep 2002. + +Now that {foo,bar,...} patterns work better, I added a quick hack to the +DIRECTORY command to allow multiple filespecs to be given, in which case we +combine them into a {file1,file2,...} pattern before calling nzxpand(). Works +fine but it's a hack because you don't get file lists upon "?" in the second +and subsequent filespec fields, but I doubt anyone will notice. So now, +finally, people can do "dir .* *" like they do in Unix (except with ls) to get +a listing of all files in a directory without having to know about or use the +/DOTFILES switch. This was NOT done for the server end of RDIR because of +ambiguity of spaces as separators versus filename characters.) domydir(): +ckuus6.c, ckuus[r2].c, 11 Sep 2002. + +Added a CONTINUE command. In a script, this does whatever CONTINUE did before +(e.g. in a FOR or WHILE loop). At the prompt, it calls popclvl(), which gives +a more natural way to continue a script that has "shelled out" to the prompt. +ckuusr.[ch], 11 Sep 2002. + +Added help text for CONTINUE. ckuus2.c, 12 Sep 2002. + +From Jeff, 16 Sep 2002: + . SET TERM ROLL KEYSTROKES for K95: ckuusr.h, ckuus7.c + . Remove the doexit() call from the Telnet TELOPT_LOGOUT handler: ckctel.c + +Fixed an FTP debug message to be consistent with Kermit ones. +ckcftp.c, 16 Sep 2002. + +Added SET/SHOW TRANSFER REPORT to turn the post-transfer report off and on. +ckuusr.h, ckuus[234].c, 16 Sep 2002. + +Fixed Solaris (and maybe some other SVORPOSIX builds) to find out their full +hostname rather than just short form (e.g. watsol.cc.columbia.edu rather than +just watsol). ckhost(): ckuusx.c, 16 Sep 2002. + +"cat somefile | kermit -Ts -" is supposed to send stdin in text mode, but +K95's file transfer display reports BINARY. Looked at C-Kermit code; it seems +fine. Looked at packet and debug logs; C-Kermit was indeed sending in text +mode and announcing it correctly. K95 gattr() is doing the right thing: + + gattr file type[AMJ]=3 + gattr attribute A=text=0 + gattr sets tcharset TC_TRANSP[A] + +Same thing happens when C-Kermit is receiving. Yet when I send an actual +file, rather than stdin, it's received in text mode. The only difference is +that stdin does not have a Length attribute in its A-packet, so in this case +the receiver skips any calls to screen() that show the length or percent done. +Aha, so maybe it's just a display problem -- scrft() is not being called to +repaint the file type if the size was not known. Fixed in opena() by +removing the IF clause from "if (fsize > -1L) xxscreen(SCR_FS,0,fsize,"");". +ckcfn3.c, 18 Sep 2002. + +K95 user has a listfile containing some regular filenames and then some +filenames that include paths and has all kinds of problems with MGET /LISTFILE +(pieces of different names concatenated to each other, etc). Setting up the +same scenario here, I don't see the same problems but I do see "Refused: Name" +when we go to get a path/name file. This happens because (a) we had already +got a top-level file with a certain name, (b) a file in a subdirectory has the +same name, (c) we are stripping the path before calling zchki(), and (d) +FTP COLLISION is set to DISCARD. How do we make FTP not strip the path? + +This is an interesting question... The answer depends on where the user +wants the file to go. Normally if you tell an FTP client to "get foo/bar", +you want the file "bar" to be downloaded to the current directory. + +Anyway, it turns out the FTP module uses paths locally during MGET only if +/RECURSIVE was specified. So: + + mget /listfile:blah /recursive + +should have made this work, but it didn't because in the /LISTFILE case, +we have effectively turned an MGET into a series of GETs, where the code to +check whether to strip the path didn't check the recursive flag because how +could a GET (as opposed to an MGET) be recursive? Adding this exception to +the if-condition got us a bit farther but now when we try to open the output +file in doftprecv2(), zopeno() fails because the name contains a dirsep. +We have to call zmkdir() first but that wasn't happening because some other +flag wasn't set right in this case. Finally zmkdir was called, but with +the wrong string. After fixing that, it works. Now we should be able +to use /RECURSIVE to force the pathname to be used on the local end. +ckcftp.c, 19 Sep 2002. + +Checked FTP filename conversion issues. FTP FILENAMES AUTO is supposed to +mean LITERAL if "wearealike" OR server is UNIX or Windows, otherwise +CONVERTED, but there were places where this rule was not applied consistently, +fixed now. ckcftp.c, 21 Sep 2002. + +Added SET FTP DISPLAY, which is like SET TRANSFER DISPLAY but applies only to +FTP, mainly because I tended to type it all the time. Now if you have dual +sessions, each session can have its own transfer display style. ckcftp.c, +ckuusr.h, ckuus[347].c, 21 Sep 2002. + +Back to FTP MLSD. We're supposed to match the pattern locally, not rely on +the server to filter its list according to the client's pattern. Thus we must +also allow an empty argument to MGET and must not send a filespec with MLSD. +Actually this is tricky -- how is the client supposed to know whether to send +a filespec. For example, if the user's command is "mget foo*bar", and the +server supports MLSD, then what should the client do? The client does not +know the wildcard syntax on the server, so for all the client knows, this +might be a valid directory name, in which case it should be sent. On the +other hand, the user might intend it as a wildcard, in which case it should +NOT be sent. But the FTP client can't read the user's mind. This is another +serious flaw in the Elz/Hethmon draft. Anyway, I got the local matching +business working for MLSD as long as the user's MGET arg is really a pattern +and not a directory name. To be continued... ckcftp.c, 21 Sep 2002. + +Added FTP { ENABLE, DISABLE } { FEAT, MLST }. If we always send FEAT, we +usually get a complaint. If we send FEAT and MLST is negotiated, there is a +good chance it is misimplemented or will have undesirable side effects, such +as sending huge file lists. NOTE: /NOINIT on the FTP OPEN command also +disables both of these. ckcftp.c, 22 Sep 2002. + +Fixed mkstemp() code in FTP remote_files(). mktemp() does not open the file, +mkstemp() does open it; previously we had been opening it again and never +closing the first instance so every MGET would create another open file +descriptor. ckcftp.c, 22 Sep 2002. + +Added debug messages for temp-file creation and lines read from the temp file. +ckcftp.c, 22 Sep 2002. + +Eliminated sending of some extraneous TYPE commands, but there's still room +for improvement. ckcftp.c, 22 Sep 2002. + +Moved definition of build date to top of ckcmai.c. 22 Sep 2002. + +Added recursion to MGET with MLSD... It's all done in remote_files(). +Temp-file pointers are on a stack (max size 128). When parsing MLSD lines +from the temp file and we see "type=dir", we create the local directory by +calling zmkdir(), change to the remote by sending CWD, increment the depth, +and call ourselves. When reading from a temp file, upon EOF we close and +dispose of the temp file, return -3 if currently at top level, otherwise we +free the tmpfile name, decrement the depth, send CDUP to the server, "cd .." +locally, and go back and read the next line from the previous but now current +temp file. Conceptually simple but needed hours of debugging -- what must +be static, what must be on the stack... Seems OK now but still needs some +heavy testing. ckcftp.c, 22 Sep 2002. + +Added FTP { ENABLE, DISABLE } { SIZE, MDTM } and add help text for FTP +ENABLE and DISABLE. ckcftp.c, 23 Sep 2002. + +Don't allow restart if SIZE disabled. ckcftp.c, 23 Sep 2002. + +Make sure all implicit SIZE commands are surpressed if SIZE disabled. +ckcftp.c, 23 Sep 2002. + +If an explicit FTP MODTIME command is sent when MDTM is DISABLED, and it +succeeds, re-ENABLE MDTM. Ditto for SIZE. ckcftp.c, 23 Sep 2002. + +If an explicit FTP FEATURES command is sent during an FTP session, redo the +features database from it. ckcftp.c, 23 Sep 2002. + +After further discussion with Robert Elz, I realized I had to expose the +underlying MGET mechanisms to the user; the draft isn't going to change, and +the new spec will result in undesirable effects if the client tries to "do the +right thing" by magic in all situations; thus the user must have some new +controls: + + MGET [ /MLST, /NLST, /MATCH:xxx ] [ filespec [ filespec [ ... ] ] ] + +These switches let the user force the use of MLSD or NLST when there's a +choice, and to force local use of a pattern rather than sending it to the +server, and even to send a directory name to the server at the same time as +specifying a pattern for local matching, and of course by default we try to do +the right thing in all scenarios. Symbols only; not coded yet. ckuusr.h, +23 Sep 2002. + +Added the three new switches to MGET, plus /MLST is an invisible synonym for +/MLSD. If /NLST or /MLSD is given it, it forces the corresponding FTP protocol +directive. ckcftp.c, 25 Sep 2002. + +Now for the tricky part: now we have two separate concepts for what to send to +the server: a filename or wildcard to be interpreted by the server (NLST only) +or a directory from which to get a list of all the files (NLST or MLSD), +possibly together with a pattern to be used by the client to match filenames +returned by the server. This required giving remote_files() an additional +argument. Now it uses "pattern" (if any) strictly for local pattern matching +(because now it is the /MATCH: switch argument, not the MGET filespec), and +"arg" (the MGET filespec) is what it sends to the server, maybe (see the +comments in the code for the actual details); either or both these can be +null. ckcftp.c, 25 Sep 2002. + +Discovered that "mget foo", where foo is a directory name, never worked. +Fixed in remote_files(): ckcftp.c, 25 Sep 2002. + +Going through every combination of NLST, MLSD, /MATCH:, and MGET arg and +debugging each case until OK... Then also with the panix.com NetBSD server +(lukemftpd 1.0) which also supports MLSD.... 11 test cases all debugged and +tested OK. ckcftp.c, 26 Sep 2002. + +Added /NODOTFILES switch to FTP MGET, to control what happens with dot-files +if the server includes their names in the list (as lukemftpd does). There's +no point in adding a /DOTFILES switch because what could it possibly do? +ckcftp.c, 26 Sep 2002. + +Changed a bunch of "skipthis++" to "continue" in doftpget(), to avoid +error messages when skipping files that user said she wanted to skip. +ckcftp.c, 26 Sep 2002. + +Added help text for the new MGET switches. ckcftp.c, 26 Sep 2002. + +Don't switch LOCUS when making an FTP connection until logged in. +ckcftp.c, 26 Sep 2002. + +Fixed LDIR to run Kermit's built-in DIRECTORY code rather than the external +directory program. ckuusr.c, 26 Sep 2002. + +Protect iswild() against NULL args. ckufio.c, 26 Sep 2002. + +From Jeff: SET GUI WINDOW RUN-MODE { MAXIMIZE, MINIMIZE, RESTORE }, +plus variables for GUI Window X position, GUI Window Y position, GUI +Window X resolution, GUI Window Y resolution, GUI Window Run mode. +ckuusr.h, ckuus[24].c, 27 Sep 2002. + +From Ronan Flood: updated FreeBSD 1.0 makefile entry, plus an #ifdef to protect +sysconf() calls. makefile, ckutio.c, 28 Sep 2002. + +Change ftp_auth() to return(0) if an AUTH command gets a 500 response, so it +doesn't keep sending other kinds of AUTH commands. ckcftp.c, 29 Sep 2002. + +Changes from Jeff to yesterday's changes. ckcftp.c, 30 Sep 2002. + +From Jeff: SSH command-line personality. Uses same command line as the Telnet +personality. ckcker.h, ckcmai.c, ckuus[4y].c, 3 Oct 2002. + +From Jeff, 7 Oct 2002: + . SET PRINTER CHARACTER-SET. ckuxla.c, ckuusr.h, ckuus[25].c + . Promotion of K95 to Beta.01. ckcmai.c + . Promotion of SET GUI { MENUBAR, TOOLBAR } to visible. ckuus3.c + +Changed the URL parser as follows: if the username and/or password fields are +present but empty, as in: + + ftp://@ftp.xyzcorp.com/somepath + or: ftp://:@ftp.xyzcorp.com/somepath + but not: ftp://:ftp.xyzcorp.com/somepath + +the pointer for these items becomes a pointer to an empty string, rather than +a NULL pointer. Then when we go to open the connection, if the username +string pointer points to an empty string, we prompt for the username (and/or +password). ckuusy.c 9 Oct 2002. + +Jason Heskett reported an interesting bug involving a core dump when an +ON_EXIT macro is defined that executes another macro. Sometimes. He was able +to send a short command file that always crashed. Diagnosis: ON_EXIT, when it +is called, pokes itself out of the macro table by setting its own entry in the +macro name list to an empty string. But this interferes with any macro +lookups that are done while executing ON_EXIT's body and also evidently some +code is not happy with empty macro names... To fix: replace "on_exit" with +"on_exxx", so the replacement keyword is (a) nonempty, and (b) doesn't wreck +the alphabetical sorting of the table. ckuusx.c, 9 Oct 2002. + +Added makefile targets for FreeBSD 4.6 and 5.0. Built and tested on 4.6; +don't know about 5.0. ckuver.h, makefile, 9 Oct 2002. + +Added targets for AIX 5.2 and 5.3; totally untested. ckuver.h, makefile, +9 Oct 2002. + +Built current source on Unixware 7.1.3 (make uw7); it's fine. 9 Oct 2002. + +Promoted C-Kermit to 8.0.206 Beta.01 in hopes of a simultaneous release +with K95 2.1. ckcmai.c, 9 Oct 2002. + +From Jeff: Change KERMITFONT definitions to use the new (Unicode 3.1) code +points for the terminal graphics characters (such as VT100 horizontal scan +lines), rather than private-use codes. ckcuni.c, 10 Oct 2002. + +Jason Heskett also complained that REMOTE CD would print the name of the new +directory returned by the server even if he SET QUIET ON. This is a tricky +one. Which server replies should the QUIET settings apply to? If I give a +REMOTE DIRECTORY command, it means I want to see the directory listing, +period. But if I give a REMOTE CD command, I get an "unsolicited" response +message that SET QUIET ON should suppress. Adding message suppression to +rcv_shortreply() is close, but not totally right; for example, it also +suppresses the response to REMOTE PWD, which is not helpful. The only right +way to do this is to suppress for REMOTE CD only, which can be done only by +setting a (new) global flag, rcdactive. ckuus[r57].c, ckcpro.w, 10 Oct 2002. + +Ditto for REMOTE LOGIN response message ("Logged in"). ckuus7.c, 11 Oct 2002. + +From Jeff: SET GUI WINDOW FONT { NAME, SIZE }. ckuusr.h, ckuus4.c, 11 Oct 2002. + +Quick preliminary 8.0.206 build-all: + + OK SunOS 4.1.3 + OK Solaris 2.5.1 + OK Solaris 9 + OK AIX 4.3.3 + OK HP-UX 10.20 + OK VMS 7.1 Alpha + TCP/IP + OK VMS 7.1 Alpha nonet + OK VMS 5.5 VAX + TCP/IP + OK VMS 5.5 VAX nonet + OK Unixware 7.1.3 + OK FreeBSD 3.1 + OK FreeBSD 4.6 + OK NetBSD 1.5.2 MVME (Gerry B) + OK Sinix 5.42 + +Sinix build got stuck on ckuusr.c even though we're not optimizing on Sinix +any more. Rebooting the machine fixed it. + +Fixed some #ifdefs for VMS in new incomplete-file deletion code in doclean(). +ckuusx.c, 11 Oct 2002. + +Moved uq_blah() prototypes from ckuusr.h to ckcker.h because these routines +are called in modules that don't (and shouldn't have to) include ckuusr.h. +11 Oct 2002. + +Jeff verified secure builds on Linux and Solaris. + +Custom-build workout: 80 different feature-selection combinations: + . Fixed yesterday's change for NOSPL: ckcfns.c. + . Fixed conflict between NORECALL and USE_ARROWKEYS: ckucmd.c. + . Moved setseslog() from ckuus5.c to ckuusx.c to avoid link-time foulups. + . Fixed an unguarded reference to zmkdir() in ckcftp.c. + . Protected rmsg() by #ifndef NOXFER: ckuus7.c. + . Protected initxlist() by #ifndef NOXFER: ckcmai.c. + . Fixed unguarded references to g_url struct in xx_ftp(): ckuusy.c. + . Fixed unguarded references to tt_snaws() in winchh(): ckutio.c. + +--- 8.0.206 Beta.01 11 Oct 2002 --- + +From Jeff, 16 Oct 2002: + . Fix K95 RMDIR: ckcfn3.c. + . Makefile targets for Red Hat 7.2, 7.3, 8.0: ckuver.h, makefile. + . Added \v(log_xxx) for each kind of log for PeterE: ckuusr.h, ckuus4.c. + . Added SET TERM ATTRIBUTE DIM { ON, OFF }: ckuus[27].c. + . Change "const" to "CONST" in some PAM declarations. ckufio.c. + +Added SET MATCH { DOTFILE, FIFO } { ON, OFF }. A FIFO special file is a named +pipe, used for interprocess communication. It must be opened at both ends, so +it's silly to match them by default; opening a FIFO and attempting to read +will block forever unless somebody is writing into the other end. Made the +MATCH FIFO default OFF in all cases. The dotfile default is the same as +always (OFF for UNIX, ON elsewhere); SET MATCH DOTFILE is simply a more +untuitive and findable command than SET WILD KERMIT /MATCH-DOT-FILES. Note +that SET MATCH DOTFILE undoes SET OPTIONS DIRECTORY /[NO]DOTFILES, and vice +versa. ckcmai.c, ckuusr.h, ckuus[23].c, ckufio.c. 17 Oct 2002. + +Added client and server end of REMOTE SET MATCH { DOTFILE, FIFO } { ON, OFF }. +The new protocol codes are 330 and 331, respectively. ckuus[367].c, ckcfns.c, +17 Oct 2002. + +Adjusted the "match dot if pattern starts with dot" heuristic in nzxpand() +to not kick in if the filespec is "./foo". This probably needs more work. +ckufio.c, 17 Oct 2002. + +Fixed typo in transcribing Jeff's ckcfn3.c code from yesterday. 18 Oct 2002. + +Moved some help text out of #ifdef ANYSSH that had nothing to do with SSH. +(Idea for a new EMACS feature: M-X list-ifdef-environment.) +ckuus2.c, 18 Oct 2002. + +Removed "set file { permission, protection }" keywords, which led nowhere. +ckuus7.c, 18 Oct 2002. + +Added -DSV68 to all SV/68 targets. Make ckgetfqhostname() just return its +argument in SV/68; it dumps core otherwise. In case this happens anywhere +else, add -DNOCKGETFQHOST to CFLAGS. makefile, ckcnet.c, 18 Oct 2002. + +For PeterE, added SET { SEND, RECEIVE } PERMISSIONS { ON, OFF } so incoming and +outbound permission attributes can be set separately. ckuus[27].c, 18 Oct 2002. + +Changed SHOW ATTRIBUTES to show In and Out permissions separately. +ckuus5.c, 18 Oct 2002. + +Fixed REDO to display the command it's redoing and to add it to the bottom +of the recall buffer. ckuusr.c, 18 Oct 2002. + +Discovered that DATE SATURDAY dumps core... Apparently it always did; this +case was not included in the date-time torture test script. The crash happens +because the DATE parsing code doesn't check for a NULL date-converion +error-message pointer. Fixed in ckuusr.c, 18 Oct 2002. + +The reason DATE SATURDAY got a date-conversion error was that this path thru +the code left a result pointer unset. Fixed in cmcvtdate(): ckucmd.c, +19 Oct 2002. + +DATE SUNDAY +1DAY returned incorrect results (for any day-of-week name, any +delta time), even though DATE TODAY +1DAY worked fine. Fixed in cmcvtdate(): +ckucmd.c, 19 Oct 2002. + +SET TAKE ECHO ON counted each line twice when GOTO was active. Fixed in +dogoto(): ckuus6.c, 19 Oct 2002. + +Jeff noticed: +"KERMIT READY TO GET... + RCVD: (2 files) Last: [/amd/prost/p/kd/jaltman/.src/ckonet.c] (OK) +the last file attempted may have been ckonet.c but it certainly was +not the last file received" (similarly for sending). Fixed by having two +pointers for each name; a preliminary pointer, which is set for each file at +the beginning of the transfer (when we have all the needed info), and a final +one that is set from the preliminary one only after the file was transferred +successfully. This corrects not only the automatic "wheremessage" at the end +of a remote-mode transfer, but also the WHERE and SHOW FILE command results. +ckuusx.c, ckcfn[s3].c, ckcpro.w, 19 Oct 2002. + +From Jeff: Improve ORIENTATION message for K95 to say which directories are +for which INI files. ckuusr.c, 23 Oct 2002. + +Removed Beta designation from herald. ckcmai.c, 23 Oct 2002. + +Put final dates and ID strings in Unix and VMS build procedures. +Makefile, ckvker.com, 23 Oct 2002. + +Build-all... #ifdef adjustments: ckcfns.c... 83 different feature-set +combinations build OK on Linux. 23 Oct 2002. + +From Jeff: SET WIN95 HORIZONTAL-SCAN-LINE-SUBSTITUTIONS. ckuusr.h, ckuus7.c, +24 Oct 2002. + +Fixed Heath-19 graphic character-set table to use new Unicode 3.1 values +if WIN95 HORIZ OFF. ckcuni.c, 24 Oct 2002. + +Changed tx_usub() to return Unicode 3.1 values if WIN95 HORIZ OFF. +ckcuni.c, 24 Oct 2002. <-- No backed off on this. + +Some problems during build-all: + + . VMS 7.1 TGV 4.2: If I make a Telnet connection with it, then try to send + a file (itself. wermit.exe) over the connection, the connection drops + after about 20%, the thermometer zooms out to 100% and SUCCESS is reported. + This doesn't happen with UCX. + + . VMS 7.3 TGV 4.3: ckcmai.c won't compile because of a complaint about the + declaration of select() (which ckcmai.c doesn't use) in + SYS$COMMON:[SYSLIB]DECC$RTLDEF.TLB. Ditto in VMS 7.2 TGV 4.3. + Adding NOSELECT to CFLAGS doesn't help. I don't think the VMS version + even uses select(). But the TGV 4.3 builds were OK in 8.0.201, so what + changed? I don't see anything in ckcnet.h that would have done it. + +It builds OK with VMS 7.1 / TGV 4.2 but sending files on Telnet connections +fails in a strange way: the connection drops, but the thermomoter goes to 100% +and success is reported. I don't know why the connection is dropping (s_errno +is 32 == "broken pipe"), but the spurious success indication is because of +a double failure in sdata(): (1) The packet-sending loop index could go +negative without breaking the loop when streaming; (2) if spack() fails, +sdata() should return -2, not -1 (which means EOF). Also if any ttchk() in +sdata() returns < 0, sdata should return -2. I fixed this code (which has +been this way for YEARS) and now VMS C-Kermit properly fails when it gets +the spack() error, but ttchk() in this case still doesn't think the connection +is lost, but that must be our new problem with MultiNet. ckcfns.c, +27 Oct 2002. + +The compilation failure in ckcmai.c is a clue... The problem was that I added +#ifdef VMS / #include / #endif to shut up complaints about the time() +call. Evidently something in VMS gives MultiNet a bad case of +indigestion; removing it fixes the compilation and the result works fine. The +transmission failures in the other case seem to be a coincidence -- something +to do with the U of Arizona (probably some obscure VMS quota on my IDs there, +or some kind of network connection throttling), since it doesn't happen +anywhere else. ckcmai.c, 27 Oct 2002. + +Changed four occurrences of "void" to "VOID" in ckcftp.c, 27 Oct 2002. + +Defined NOCKFQHOSTNAME for HPUXPRE65. Might also need this for HP-UX 7 +and maybe 8. ckcnet.c, 27 Oct 2002. + +From Jeff: PAM_CONST definition to clear up warnings caused by different +vendors' definitions of PAM structs. ckufio.c, 28 Oct 2002. + +Unixware 2.1.0 build bombs immediately with "UX:make: ERROR: line too long" +(which line?) Not worth chopping up the makefile to fix but in a pinch it +could be done. 2.1.3 builds OK. + +Did another 20-some platform builds, bringing the total to 83, plus a final +runthrough of the build-with-84-different-feature-set-combinations script on +Linux. Should be good to go! + +--- 8.0.206 24 Oct 2002 --- + +Finally got access to Linux on IA64 again. Builds OK but dumps core +immediately on startup. Adding -DNOCKGETFQHOST was necessary but not +sufficient. In this case, the very call to ckgetfqhostname() from ckhost() +(which is in ckuusx.c) was dumping core; thus I had to move the definition of +NOCKGETFQHOST from ckcnet.c to ckcdeb.h, add an #ifdef __ia64__ clause to it, +and protect the call to ckgetfqhostname() with it. Obviously there has to be +a better fix but this will have to for now. ckcnet.c, ckuusx.c, ckcdeb.h, +31 Oct 2002. + +Link step fails in Mandrake 9.0 with undefined references to res_search, +dn_expand, and crypt. Turns out the linux makefile target tests for the +existence of libcrypt.a and libresolv.a, but in Mandrake 9.0 they exist +only as *.so. Changed linux target to look for both. makefile, 1 Nov 2002. + +Vace reported that "ftp mget a b c" would get ALL files from the server's +directory if c did not exist. Diagnosis: off-by-one error in counting MGET +args processed. Naturally fixing this bug revealed another (this time +cosmetic) one, which resulted in spurious error messages when hitting MGET +args that have no match on the server. Fixed in ckcftp.c, 1 Nov 2002. + +Rebuilt about 60 of the most important Unix binaries to pick up the fixes +31 Oct - 1 Nov 2002, and refreshed the FTP site with new sources, tarballs, +ZIP files, etc. Sat Nov 2 19:11:30 2002 + +From Martin Vorlaender and Jeff, SSL/TLS support for VMS: +ckuusr.h, ckuath.h, ckcnet.c, ckctel.c, ckuath.c, 10 Nov 2002. + +Added PASV as invisible synonym for PASSIVE. ckcftp.c, 10 Nov 2002. + +--- 8.0.206 24 Oct 2002 #2 --- + +More work on SSL in VMS: Jeff + Martin Vorlaender: ck_ssl.c ckcmai.c ckcnet.c +ckctel.c ckuath.h ckvcon.c ckvtio.c ckvker.com 10-15 Nov 2002. + +Discovered that ckvfio.c would not compile on VMS 6.1 with UCX 4.1 because + was missing, which is explicitly included. Enclosed the +#include in #ifdef NOCONVROUTINES..#endif and rebuilt with +@[users.fdc.src]ckvker.com "" "" "NOCONVROUTINES". 16 Nov 2002. + +Fixed the "ftp mget */data/*" problem with two small changes to doftpget(): +ckcftp.c, 16 Nov 2002. Placed a copy of ckcftp.patch in ~kermit/f. + +From Lucas Hart: Fixes for VAX C 2.x and CMU TCP/IP. "Can't guarantee that +the revised CKVOLD will work for all combinations of more recent +VMS/compiler/TCPIP releases, but I've tested it for compatibility on our AXP +VMS 6.2, UCX 4.0, DECC 5.6, your AXP VMS 7.1, DEC TCPIP 5.1, DECC 6.0 as well +as with VAX VMS 5.4, VAX C 3.2, CMU12 and VAX VMS 4.7, VAX C 2.4." ckvfio.c, +ckvtio.c, ckuus5.c, ckvker.com, ckvold.com, 17 Nov 2002. + +From Jeff: More work on VMS SSL. Now it actually works, even in CONNECT mode, +except it hangs when it gets an error alert or the remote closes the +connection. ckcnet.c. ckvtio.c, 17 Nov 2002. + +NOTE: Lucas's changes should go into the 8.0.206 source code but it's too +late since ckvtio.c (upon which he based his changes) is already full of +SSL code. + +MGET in K95 in totally broken FOR SOME PEOPLE (mainly me) if the TMP (or TEMP) +value is too long. It works fine if you set these to C:\TMP. Diagnosis: (1) +we were malloc'ing only 16 bytes for the temp file name (I think this was my +fault -- I was only looking at the "ckXXXXXX" part and forgetting that this +was appended to the TMP path); (2) the Windows version of mktemp() wants you +to use the value pointed to by the pointer it returns, rather than assuming +the mktemp() arg will be modified in place. The code was changed to malloc a +longer string and to use the return value from mktemp() (if any) rather than +assuming that mktemp() modified its argument string (in K95 only -- not sure +about Unix platforms; the man pages differ on this, but at least this way if +some mktemp() version does NOT alter its argument, we still have a usable +filename (like /tmp/ckXXXXXX)). Of course this won't be good for recursive +MLSD downloads, but we can always issue patches for the Unix version later if +needed. The Linux and BSD versions use mkstemp() anyway. There is, however, +a danger of a memory leak in the Unix version if the user has defined a TMPDIR +or CK_TMP environment variable whose value is longer than 9 bytes. All this +is highly unlikely so we should be OK. ckcftp.c, 17 Nov 2002. + +--- K95 2.1.1 and updated ck[uv]206.{tar,zip} but not C-Kermit binaries --- + +From Jeff: Fixes for Telnet Com Port Control, update to a newer release of +OpenSSL: ck_ssl.c ck_ssl.h ckcdeb.h ckcftp.c ckcmai.c ckcnet.c ckctel.c +ckuath.c ckuath.h ckucns.c ckuus4.c ckuus5.c ckuusr.c ckuusr.h ckvcon.c +ckvfio.c ckvker.com ckvtio.c ckvvms.h, 25 Nov 2002. + +--- K95 2.1.2 and C-Kermit 8.0 CDROM --- + +From Jeff, 28 Nov 2002: + . Updated SSL modules: ck_ssl.[ch]. + . Fixed cipher-list display in SHOW AUTH & FTP ssl_auth(): ckuus7.c. ckcftp.c + . Some minor tn_wait() fixes: ckctel.c. + . Preliminary SSL support for VMS CONNECT: ckvcon.c. + +Bumped C-Kermit edit number to 207. + +From Jeff, 29 Nov 2002: "[C-Kermit was dumping core on SCO OSR5 Telnet Com Port +connections because] the SCO compiler treats all characters as signed. This +was causing 'sprintf(buf,"02x ",ch);' to produce strings such as "ffffffc2" +instead of "c2" for values between 128 and 255. This wrote beyond the end of +a buffer and blew away the stack. Having fixed this I also noticed that +conect() did not properly check for carrier when TN CPC was negotiated. This +has now been fixed as well." ckucns.c, ckucon.c, ckctel.c, 29 Nov 2002. + +From Jeff, 30 Nov 2002: Fix SSL for VMS and also carry forward the CPC fixes +to VMS. ckcnet.c, ckvtio.c, ckvcon.c, 30 Nov 2002. + +Changed copyright dates that are displayed (but not yet all the internal +ones) from 2002 to 2003. ckcmai.c, 3 Jan 2003. + +Fixed the FTP module's brief-format transaction log, which had the status +inverted: OK for FAILED and v.v. ckcftp.c 3 Jan 2003. + +From Jeff, 4 Jan 2003: + . Make /MOVE-TO:xxx convert xxx to full pathname: ckuus[r67].c, + . Make SHOW OPTIONS ALL show both kinds of options: ckuus2.c. + . More command-line personalities: ckcmai.c, ckuusy.c. + . New NOSCROLL command for K95: ckuusr.[ch], ckuus2.c. + . New lockdown and other command-line options: ckuusr.h, ckuusy.c. + . SSL interface updated to OpenSSL 0.9.7: ck_ssl.c. + . SET TERM LINE-SPACING and CURSOR xxx NOBLINK: ckuus[27]c. + . Expanded SHOW GUI command: ckuus3.c + . New SHOW TABS code: ckuus5.c. + +Updated SUPPORT (BUG), NEWS, and INTRO texts. ckuus[26].c. 5 Jan 2003. + +Fixed FTP module to suppress "'FEAT': Command not understood" message +unless FTP DEBUG is ON. ckcftp.c, 6 Jan 2003. + +Got a report that C-Kermit dumps core on Solaris when executing a certain +script. Seems to be related to changing vnambuf[] in zzstring() from an +automatic array to a malloc'd buffer (see notes from 29 Jun 2000). Changed +it to an automatic buffer except for K95. ckuus4.c, 6 Jan 2003. + +Nope, that's not it. It evidently happens only after FTP PUT has been used. +Fixed solaris9g makefile target to include -funsigned-char and built a new +binary. Determined that building with gcc and -funsigned-char makes no +difference. makefile, 7 Jan 2003. + +I did a preliminary audit, looking at the items in the left column: if used in +a given routine, are there any obvious mistakes: + + 1 2 3 4 5 + doftpput->putfile->sendrequest->doftpsend2->secure_write +malloc OK OK OK OK OK +makestr OK OK OK OK OK +automatic arrays OK OK OK OK OK +[ck]str[n]cpy OK OK OK OK OK +[ck]str[n]cat OK OK OK OK OK +sprintf OK OK OK OK OK +nzltor OK OK OK OK OK +zfnqfp OK OK OK OK OK +memcpy OK OK OK OK OK +bcopy OK OK OK OK OK + +secure_write sends the data directly on clear-text connections. On secure +connections, it calls secure_putbuf(), which calls secure_putbyte(), but we +aren't using those, so secure_write() is the end of the call chain for FTP +PUT. doftpsend2 has buf[] as an automatic array, which it reads file data +into using zxin (binary mode only), but this looks OK. Still, I changed it +read 1 less than the buffer size (fread) just in case. Also there was one +debug() statement that referred to an automatic array (fullname[]) before it +was initialized (but not used in this case), which I fixed. ckcftp.c, +7 Jan 2003. + +FTP GET /RECURSIVE somepath/somefile still didn't work, despite what the +notes of 19 Sep 2001 say. There are so many paths through the code, +depending on switch values, GET vs MGET, etc, that a crucial spot was missed. +Fixed in doftpget(): ckcftp.c, 7 Jan 2003. + +Back to the core dump... after two days of full-time debugging, I found the +culprit: the buffer-full test in the zzout() macro should have been ">=" +rather than just ">", thus Kermit wrote 1 byte past the end of the malloc'd +FTP PUT output buffer, ucbuf. Why did it never happen in K95? Because, since +it's a secure build, FUDGE_FACTOR is defined there. But it's not defined in +Solaris or other clear-text builds. Although the crash wouldn't happen in +secure builds, the 1-byte leak might have caused errors in the data transfer. +In non-Solaris clear-text builds, like Linux, I suspect that malloc() tends +add something for safety (especially given the man page statement that it +allocates "at least" what you asked for). Another reason the problem escaped +notice is that zzout() is used only for text-mode PUTs (and then only when +there is no character-set translation), but most transfers these days are +binary and/or downloads. Anyway, in the course of debugging, a lot of small +cleanups were done: sizeof(blah) for all arrays was replaced by the same +symbolic size that was used to allocate the array, numeric array sizes were +replaced with symbolic ones, etc. The real fix is one character long. +ckcftp.c, 9 Jan 2003. + +Got a report that "mget /recursive */somedir/*" downloaded the files into +the current directory, rather than re-creating the remote directory structure. +Fixed in doftpget(): ckcftp.c, 10 Jan 2003. + +Unix C-Kermit did not allow file transfer if started under inetd and accessed +via Internet raw socket (or whatever). Diagnosis: isatty() and friends would +fail causing ttopen() to fail. Fixed by adding escape clauses for "-l 0" +situations (i.e. Kermit invoked with an already-open file descriptor) at the +appropriate places. ckcmai.c, ckutio.c, 14 Jan 2003. + +From Jeff for K95 2.1.3 + . Add test for startflags & 128 to trap() for ignoring BREAK. + . Fix for SHOW TRANSMIT. + +--- K95 2.1.3 --- + +FTP USER, FTP ACCOUNT, plus the various prompts and switches for FTP username, +password, and account all neglected to strip quotes, and in most cases quotes +are necessary to specify a username that contains spaces. ckcftp.c, +15 Jan 2003. + +FTP MPUT f1 f2 f3... gets a parse error if any of the fn's do not match an +existing file. This is bad for scripts. In doftpput(), cmfdb() looks for +keywords (switches) or CMIFI. When it hits CMIFI, it exits from the initial +parse loop and then does additional cmifi()s in a loop until done. The most +obvious fix is to parse each field with cmfdb(CMIFI,CMFLD), i.e. fall back to +CMFLD if CMIFI doesn't match anything. Then if CMFLD was used, we don't add +the filespec to the list. This is a rather big change but it seems to work. +No error messages or failures happen for non-matching fields, but an error +message is printed (and the MPUT command fails) if none of the fields match +any files. This fix got in too late for 2.1.3; workaround: use C-Shell +like wildcard list (ftp mput "{*.abc,foo.*}"). ckcftp.c, 16 Jan 2003. + +GREP did not pass its pattern through the expander, thus variables could +not be used for patterns. This must have been an oversight -- I can't find +anything in my notes about it. Fixed in dogrep(): ckuus6.c, 24 Jan 2003. + +New makefile target for HP-UX 11.xx with OpenSSL from Tapani Tarvainen. +makefile, 31 Jan 2003. + +From Jeff: + . Avoid core dump when dereferencing tnc_get_signature(): ckuus4.c. + . Bump version numbers to 8.0.208, 2.1.4: ckcmai.c. + +Added /NOLOGIN to FTP [OPEN]. ckcftp.c, 10 Feb 2003. + +Don't dump core if FTP DEBUG is ON and FTP OPEN does not include a service. +openftp(): ckcftp.c, 10 Feb 2003. + +HELP PATTERN text incorrectly identified commands and functions with +floating and anchored patterns. The corrected lists are: +Floating: GREP, TYPE /MATCH:, /EXCEPT: patterns, \farraylook(), +Anchored: IF MATCH, file-matching wildcards, \fsearch(), \frsearch() +ckuus2.c, 10 Feb 2003. + +INPUT n \fpattern(xxx) did not work for case-independent comparisons. +Fixed in doinput(): ckuus4.c, 10 Feb 2003. + +It seems \fpattern() didn't work with MINPUT at all. There was no code to +handle \fpattern() in the MINPUT parse loop, so it never worked. The code +had to be totally rewritten to use cmfld() in a loop, rather than cmtxt() +and then cksplit(). Furthermore, whenever any of the fields was an +\fjoin(), this had to be split. ckuusr.c, 10 Feb 2003. + +Macro replacement via \m() and \fdefinition() does not work as advertised +(i.e. case sensitively) for associative array elements; e.g. \m(xxx) is +treated the same as \m(xxx), contrary to section 7.10.10 of the C-Kermit +7.0 update notes, and to the fact that the two really do exist separately. +Fixed by adding a static function isaarray(s) which succeeds if s is an +associative array reference and fails otherwise, and then having \m() +and \fdef() call mxxlook() (case-sensitive lookup) if isaarray(), otherwise +(as before) mxlook()). ckuus4.c, 11 Feb 2003. + +Fixed FTP OPEN to allow the /USER switch to override SET FTP AUTOLOGIN OFF, +just as /NOLOGIN overrides SET FTP AUTOLOGIN ON. ckcftp.c, 11 Feb 2003. + +In K95, "set key \1234 \27H" (any SET KEY command in which the first char of +the definition was backslash, and the ONLY character after the backslash +quantity was an uppercase letter, that letter would be lowercased). Diagnosis: +xlookup() poking its argument (see notes from July 2000). Jeff sent a fix. +ckucmd.c, 15 Feb 2003. + +Ran my S-Expression torture test to make sure Sexps still worked. They do, +except the bitwise & and | operators were broken, e.g. (& 7 2) and (| 1 2 4) +get "Invalid operand" errors. Jeff's code had added an early failure return +from the lookup loop when when a single-byte keyword matched a keyword that +started with the same byte but was more than one byte long. So "&" would hit +"&&" and fail instead of continuing its search (xlookup tables aren't sorted +so there can be no early return). Fixed in xlookup(): ckucmd.c, 16 Feb 2003. + +Got rid of "krbmit" target from makefile. It's still there, but we don't +use it any more. All secure targets now use "xermit", and produce a binary +called wermit, just like the regular ones do (except the old ckucon.c ones). +Non-secure targets, since they don't define any of the security symbols, +wind up compiling and linking to (mostly) empty security modules. makefile, +15 Feb 2003. + +Added \fcvtdate(xxx,3) to format its result in MDTM format (yyyymmddhhmmss, +all numeric, no spaces or punctuation). Of course these numeric strings +are too big to be 32-bit numbers and are useless for arithmetic, but they're +useful for lexical comparison, etc. ckuus[24].c, 16 Feb 2003. + +The following FTP commands did not set FAILURE when they failed: RMDIR, +CD, CDUP, Fixed in the corresponding doftpblah() routines. ckcftp.c, +16 Feb 2003. + +RENAME would sometimes not print an error message when it failed, e.g. in K95 +when the destination file already existed. ckuus6.c, 17 Feb 2003. + +Fixed COPY error messages, which did not come out in standard format when +/LIST was not included. ckuus6.c, 17 Feb 2003. + +Fixed #ifdefs in ck_crp.c to allow nonsecure builds on old platforms like +System V/68 R3. 19 Feb 2003. + +Similar treatment for ck_ssl.c. 20 Feb 2003. + +From Jeff, 21 Feb 2003: + . AIX53 and AIX52 symbols for ckcdeb.h, makefile. + . New gcc targets for various AIX 4.x/5.x versions: makefile. + . Copyright date updates: ck_crp.c, ck_ssl.c. + . ENABLE/DISABLE QUERY broken because keyword table out of order: ckuusr.c. + . Fixed the use of HTTP proxies for HTTP [RE]OPEN for Unix: ckcnet.c. + +Also for K95 only: Allow file transfer when K95 is invoked on the remote end +of a connection to a Pragma Systems Terminal Server connection; automatically +SET EXIT HANGUP OFF when invoked with open port handle ("k95 -l nnnn"). + +"cd a*" failed even when "a*" matched only one directory. Fixed in cmifi(): +ckucmd.c, 21 Feb 2003. + +In the Unix version, replace "extern int errno;" with "#include " +if __GLIBC__ is defined, since glibc now defines a thread-specific errno. +ckcdeb.h, 26 Feb 2003. + +Added #ifdefs to skip compilation of ckuath.c in nonsecure builds. Tested +by building both secure and regular versions in Linux. ckuath.c, 26 Feb 2003. + +Ran the build-in-84-different-configurations script on Linux to make sure it +still builds with all different combinations of feature selection options. +All OK. 26 Feb 2003. + +Built on VMS. Needed to add a prototype for mxxlook*() to ckuusr.h; built +OK otherwise. 26 Feb 2003. + +From Jeff: More #ifdef shuffling for nonsecure builds: ckuath.c, ck_ssl.c, +27 Feb 2003. + +Added code to ensure \v(download) ends in a directory separator in Unix, +Windows, and OS/2. ckuus7.c, 27 Feb 2003. + +Added code to K95 zfnqfp() to tack on directory separator when returning +a directory name. ckofio.c, 27 Feb 2003. + +Somehow an old copy of ckuath.c popped to replace the new one. Put the new +one back. 28 Feb 2003. + +From Jeff: Fix typo in my K95 zfnqfp() code from yesterday; fixes for handling +UNCs uniformly, no matter which way their slashes are leaning. ckofio.c, +28 Feb 2003. + +At Jeff Mezei's suggestion, separate text and binary mode open sequences +for VMS session log. ckvfio.c, 28 Feb 2003. + +Added freebsd48 target for FreeBSD 4.8. makefile, 1 Mar 2003. + +Changed Mac OS X entries to include -DUSE_STRERROR. makefile, 2 Mar 2003. + +Fixed GETOK /GUI to evaluate its text argument. ckuus6.c, 3 Mar 2003. + +Jeff fixed the K95 Dialer QUICK dialog to (a) allow templates, and (b) have +a Save-As option. 3 Mar 2003. + +Jeff fixed a problem with the Xmodem-CRC checksum being crunched whenever +there was a retransmission. 7 Mar 2003. + +Added target/banner for Tru64 5.1B. makefile, ckuver.h, 5 Mar 2003. + +In Unix, the zcopy() routine (used by the COPY command) reset the user's umask +to 0 for the remainder of the Kermit process lifetime. The bug was in +ckufio.c 8.0.194, 24 Oct 2002, and is fixed in ckufio.c 8.0.195, 6 Mar 2003. +Of course this happened after building 155 C-Kermit 8.0.208 binaries. (But +before officially releasing 8.0.208.) + +In the VMS version, changed: + + while ((n--) && xx_inc(2) > -1) ; +to: + while ((n--) && xx_inc(2) >= 0) ; + +to suppress the "...is being compared with a relational operator to a constant +whose value is not greater than zero" warning. ckvtio.c, 7 Mar 2002. + +Added a debug call to dologend in hopes of catching overzealous Locus +switching, which seems to happen only in K95. ckuus3.c, 7 Mar 2002. + +Rebuilt binaries for some of the more current Unix releases: AIX 4.3.3-5.1, +Solaris 7-9 , Red Hat 7.0-8.0, Slackware 8.1, Freebsd 4.7-4.8, NetBSD 1.6, +OpenBSD 3.2, Unixware 7.1.3, Open Unix 8, OSR5.0.6a, etc. A Unix binary with +COPY umask fix shows a 6 Mar 2003 date for "UNIX File support" in SHOW +VERSIONS; a binary without the fix shows 24 Oct 2002. + +C-Kermit 8.0.208 dated 14 March 2003 released on 10 March 2003. + +---8.0.208--- + +From Jeff 13 Mar 2003: + . Updated SSL module allows importation of tickets from host. + . freebsd50+openssl target: makefile. + . FTP PUT /PERMISSIONS error message for K95: ckcftp.c. + +Fixed MINPUT to strip quotes or braces from around targets (this was broken +on Feb 10th). Thanks to Jason Heskett for discovering and reporting this +(killer) bug. ckuusr.c, 14 Mar 2003. + +Changed version number to 209 Dev.00. ckcmai.c, 14 Mar 2003. + +While debugging the alphapage script, I found that the command "minput 8 \6\13 +\21\13 \13\27\4\13 \30\13" gets "?Not confirmed" in 8.0.208 and 8.0.209, but +not in 206 and earlier. This problem too was introduced on Feb 10th by +changing MINPUT parsing from cmtxt() followed by cksplit() to cmfld() in a +loop. cmfld() uses setatm() to return its result and of course setatm() +breaks on \13. Changing setatm() not to do this would break everything else. +But cmfld() has no arguments that let us tell it to do anything different in +this case. Changing the API would be a disaster. The only solution is to add +an "MINPUT ACTIVE" (minputactive) global variable that tells cmfld() to tell +setatm() not to break on CR. Now MINPUT with braced targets containing CR +and/or LF works in 209, 206, and 201 (but not 208). ckucmd.c, ckuusr.c, +ckuus5.c, 15 Mar 2003. + +MINPUT n \fjoin(&a) works OK if all the members of \&a[] are text strings, but +if they are strings of control chars (as above), they don't get separated by +the spaces. For example in: + + dcl \&a[] = "\4\5" "\6\7" xxx + minput 10 \fjoin(&a) + +MINPUT gets two targets: "aaa" and "\4\5 \6\7 xxx". The bug was in the +cksplit() call in the \fjoin() case of MINPUT: it needed to specify an +include set consisting of all the control characters except NUL. ckuusr.c, +16 Mar 2003. + +But there's still a problem: + + dcl \&a[] = "\4\5\13\10" "\6\7" "xxx" + +creates an array whose first member is "^D^E (one doublequote included). But +if braces are used instead, there's no problem. Same deal as MINPUT: cmfld() +breaks on CR or LF, thus the end quote is lost. If I set minputactive for +DECLARE initializers too, that fixes it. Is there any reason not to do this? +Can't think of any (famous last words)... ckuusr.c, 16 Mar 2003. + +Since it has multiple applications, changed the flag's name from minputactive +to keepallchars. ckucmd.c, ckuus[r5].c, 16 Mar 2003. + +\v(exedir) wasn't being set correctly (it included the program name as well +as the directory). Fixed in getexedir(): ckuus4.c, 16 Mar 2003. + +SET CARRIER-WATCH "auto matic" (spurious space in supplied keyword). +Cosmetic only; it still worked. Fixed in setdcd(): ckuus3.c, 16 Mar 2003. + +"directory a b c" listed too many files -- all files whose names END WITH a, +b, or c, rather than the files whose names WERE a, b, or c. Diagnosis: The +filespec is changed into a pattern: {a,b,c}, which is the correct form. It is +passed to nzxpand(), which goes through the directory getting filenames and +sending each one to ckmatch() with the given pattern. ckmatch() receives the +correct pattern but then prepends a "*" -- that's not right. It's not just +in filename matching either. The following succeeds when it shouldn't: + + if match xxxxc {{a,b,c}} + +Changing ckmatch() to not prepend the "*" to each segment fixes the command +above but breaks lots of others. Running through the "match" torture-test +script shows the problem occurs only when the {a,b,c} list is the entire +pattern, and not embedded within a larger pattern. Testing for this case +fixed the problem. ckmatch(): ckclib.c, 16 Mar 2003. + +Fixed FTP MODTIME to not print anything if QUIET ON. ckcftp.c, 16 Mar 2003. + +Picked up a new ckuath.c from Jeff, not sure what the changes are. 16 Mar 2003. + +Did a few regular and secure builds to make sure I didn't wreck anything. + +Changed version number to 209 (final). ckcmai.c, 16 Mar 2003. + +Jason Heskett found another bug: if you define a macro FOO inside the +definition of another macro BAR, and FOO's definition includes an odd number +of doublequotes (such as 1), FOO's definition absorbs the rest of BAR's +definition. Example: + + def TEST { + .foo = {X"} + sho mac foo + } + do test + sho mac foo + +Results in: + + foo = {X"}, sho mac foo + +Diagnosis: the TEST definition becomes: + + def TEST .foo = {X"}, sho mac foo + +and the macro reader is erroneously treating the doublequote as an open +quote, and then automatically closes the quote at the end of the definition. +The error is that a doublequote should be significant only at the beginning of +a field. But the macro reader isn't a command parser; it doesn't know what +a field is -- it's just looking for commas and skipping over quoted ones. +First we have to fix an oversight: SET COMMAND DOUBLEQUOTING OFF should have +worked here, but it wasn't tested in this case. Fixed in getncm(): ckuus5.c, +17 Mar 2003. + +There are only certain cases where it makes sense to treat doublequotes as +signicant: + + . An open quote must be at the beginning or preceded by a space. + . A close quote is only at the end or else followed by a space. + +This too was fixed in getncm(): ckuus5.c, 17 Mar 2003. + +A fix from Jeff SSL/TLS FTP data decoding. ckcftp.c, 18 Mar 2003. + +Tried building C-Kermit on a Cray Y-MP with UNICOS 9.0. "int suspend", +declared in ckcmai.c and used in many modules, conflicts with: + + unistd.h:extern int suspend __((int _Category, int _Id)); + +The "=Dsuspend=xsuspend" trick doesn't work for this; there is no way around +the conflict other than to rename the variable: ckcmai.c, ckutio.c, +ckuus[35xy].c. 26 Mar 2003. VMS and K95 not affected. + +OK that gets us past ckcmai.c... Then in ckutio.c I had to add a new #ifdef +around the LFDEVNO setting, because the Cray didn't have mkdev.h. Could not +find a Cray-specific manifest symbol, so I made a new makefile target (cray9) +that sets this symbol. Having done this I have no idea what kind of lockfile +would be created, but I also doubt if anybody dials out from a Cray. The +binary should run a C90, J90, or Y-MP. makefile, 26 Mar 2003. + +Added a target for SCO OSR5.0.7. makefile, ckuver.h, 30 Mar 2003. + +Changed since 208: +makefile ckuver.h ckcmai.c ckclib.c ckcftp.c ckucmd.c ckuus*.c ckutio.c. + +---8.0.209--- + +From Mark Sapiro, a fix for the March 17th doubleqote fix, getncm(): ckuus5.c, +4 Apr 2003. + +From Jeff, 29 Apr 2003: + . Corrected target for HP-UX 11.00 + OpenSSL: makefile, + . Do not allow WILL AUTH before WONT START_TLS: ckctel.h ckctel.c + . Add hooks for SFTP and SET/SHOW SFTP: ckcdeb.h ckuusr.h ckuusr.c ckuus3.c + . Add SKERMIT ckuusr.h ckuusr.c + . Add ADM-5 terminal emulation: ckuus7.c, ckuus5.c + . Uncomment and update HELP SET SSH V2 AUTO-REKEY: ckuus2.c + . Enable IF TERMINAL-MACRO and IF STARTED-FROM-DIALER for C-Kermit: ckuus6.c + . Fix conflicting NOSCROLL keyword definition: ckuusr.h + . Set ttname when I_AM_SSH: ckuusy.c + . Add extended arg parsing for SSH, Rlogin, Telnet: ckuusy.c, ckuus4.c + . Security updates: ckuath.c, ck_ssl.c + . Change K95 version number to 2.2.0: ckcmai.c + . Save K95 term i/o state before executing keyboard macro: ckuus4.c + . Add tests for SSH Subsystem active during INPUT/OUTPUT/CONNECT: ckuus[45].c + . Enable K95 SET SSH V2 AUTO-REKEY: ckuus3.c + +SFTP and SET SFTP subcommands are implemented up to the case statements. + +Files of mine that Jeff hadn't picked up: + ckuver.h ckcftp.c ckutio.c ckuusx.c (just minor changes for last build-all) + +On 4 Jan 2003, SET RECEIVE MOVE-TO was changed to convert is argument to an +absolute path, which made it impossible to specify a relative path, then +move to different directories and have it apply relatively to each directory. +Changed this as follows: + + . Parser uses cmtxt() rather than cmdir() so it won't fail at parse time. + . If path is absolute, we fail at parse time if directory doesn't exist. + . In reof() we run the the path through xxstring (again, in case deferred + evaluation of variables is desired) and then, if not null, use it. + . If the directory doesn't exist, rename() fails and reof() returns -4, + resulting in a protocol error (this is not a change). We do NOT create + the directory on the fly. + +I also fixed SET SEND/RECEIVE RENAME-TO to parse with cmtxt() rather than +cmdir(), since it's parsing a text template, not a directory name, e.g. +"set receive rename-to file-\v(time)-v(date)-\v(pid)". This was totally +broken, since when I don't know. We don't call xxstring() in this parse, so +evaluation is always deferred -- I'd better not change this. ckuus7.c, +ckcfns.c, 1 May 2003. + +From Jeff, Sat May 3 14:15:23 2003: + . Pick up the right isascii definition for K95: ckctel.c + . malloc... ckuath.c (new safe malloc routines for K95) + . Add author listing: ckuus5.c + . SSH Heartbeat support (K95 only): ckuus[23].c + . Prescan --height and --width to avoid window resizing at startup: ckuusy.c + . Add checks for fatal() or doexit() called from sysinit(): ckuusx.c + . Move some K95-specific definitions to ckoker.h: ckcdeb.h + . Add support for ON_CD macro in zchdir(): ckufio.c + . Add a command to let FTP client authenticate with SSLv2: ckcftp.c + . Fix parsing of FTP file facts like "UNIX.mode": ckcftp.c + +ON_CD will need some explaining (to be done). It's implemented for Unix, +VMS, WIndows, and OS/2. + +The FTP file facts fix came from first exposure to the new OpenBSD FTP +server: ftp://ftp7.usa.openbsd.org/pub/os/OpenBSD/3.3/i386/ +The period in "UNIX.mode" caused an erroneous word break, adding junk to +the filename. + +About the malloc changes, Jeff says "K95 is not behaving well in low memory +environments. I'm not sure that C-Kermit does much better. The program does +not crash but it certainly does not behave the way the user expects it to. +I'm beginning to think that any malloc() error should be treated as fatal." + +Not visible in these changes because it's in K95-specific modules: Jeff made +SET ATTRIBUTES OFF and SET ATTRIBUTES DATE OFF apply to XYZMODEM transfers. + +From Jeff, 11 May 2003: + . Add support for SSH Keepalive to relevant SET command (K95): ckuus3.c + . Reduce max overlapped i/o requests from 30 to 7 (K95): ckuus7.c + . Don't call sysinit() in fatal(): ckuusx.c. + . Some new conditionalizations for SSL module: ck_ssl.c + +The doublequote-parsing fixes from March and April broke the SWITCH statement, +which is implemented by internally defining, then executing, a macro. If I +drop back to the old dumb handling of doublequotes, everything is fixed except +the problem of March 17th. But can we really expect getncm() to pre-guess +what the parser is going to do? getncm()'s only job is to find command +boundaries, which are represented by commas. Commas, however, is needed IN +commands too. We take a comma literally if it is quoted with \, or is inside +a matched pair of braces, parens, or doublequotes. It is not unreasonable to +require a doublequote in a macro definition to be prefixed by \ when it is to +be taken literally. The proper response to Jason Heskett's complaint of March +17th should have been to leave the code alone and recommand an appropriate +form of quoting: + + def TEST { + .foo = {X\"} + sho mac foo + } + +And this is what I have done. Another reason for sticking with the old method +is that it's explainable. The "improved" method, even if it worked, would be +be impossible to explain. Btw, in testing this I noticed that the switch-test +script made 8.0.201 dump core. Today's version is fine. The problem with +quoted strings inside of IF {...} clauses and FOR and WHILE loops is fixed +too. Perhaps "unbroken" would be a better word. ckuus5.c, 11 May 2003. + +Vace discovered that FTP MGET /EXCEPT:{... (with an unterminated /EXCEPT list) +could crash Kermit. Fixed in ckcftp.c, 11 May 2003. + +CONTINUE should not affect SUCCESS/FAILURE status. ckuusr.c, 11 May 2003. + +Fixed an oversight that goes back 15 years. While \{123} is allowed for +decimal codes, \x{12} and \o{123} were never handled. ckucmd.c, 11 May 2003. + +Added support for Red Hat and /usr/sbin/lockdev. Supposedly this +allows Kermit to be installed without setuid or setgid bits and still be able +to lock and use the serial device. Compiles and starts, but not tested. +ckcdeb.h, makefile, ckutio.c, ckuus5.c, 16 May 2003. + +From Jeff: FTP ASCII send data to host when FTP /SSL was in use was broken. +ftp_dpl is set to Clear when FTP /SSL is in use. This was causing the data to +be written to the socket with send() instead of the OpenSSL routines. +ckcftp.c, ckuath.c, 21 May 2003. + +From Jeff: Stuff for Kerberos 524: ckcdeb.h. Fixes for FTP; "FTP ASCII send +data did not properly compute the end of line translations. On Unix (and +similar platforms) the end of line was correct for no character sets but +incorrect when character sets were specified. On Windows/OS2, the end of line +was correct when character sets were specified and incorrect when they were +not. On MAC, both were broken. Also, FTP Send Byte counts were incorrect +when character sets were specified." ckcftp.c. 17 Jun 2003. + +From Jeff: fixes to HTTP /AGENT: and /USER: switch action: ckcnet.c ckuus3.c +ck_crp.c ckcftp.c ckuus2.c ckuusy.c ckuusr.c ckcnet.h, 21 Jun 2003. + +From Jeff: Fix SET DIALER BACKSPACE so it can override a previous SET KEY +(e.g. from INI file): ckuus7.c. Some SSL/TLS updates: ck_ssl.c. HTTP support +for VMS and other VMS improvements (e.g. a way to not have to hardwire the +C-Kerit version number into the build script) from Martin Vorlaender: +ckcnet.h, ckuus[r3].c, ckcdeb.h, ckvtio.c, ckcnet.c, ckvker.com. Built on +Solaris (gcc/ansi) and SunOS (cc/k&r). The new VMS script tests the VMS +version and includes HTTP support only for VMS 6.2 or later. 2 Jul 2003. + +Tried to build on our last VMS system but it seems to be dead. Looks like a +head crash (makes really loud noises, boot says DKA0 not recognized) (fooey, I +just paid good money to renew the VMS license). Tried building at another +site with: + + Process Software MultiNet V4.3 Rev A-X, + Compaq AlphaServer ES40, OpenVMS AXP V7.3 + Compaq C V6.4-008 on OpenVMS Alpha V7.3 + +Had to make a few corrections to ckvker.com. But still, compilation of +ckcnet.c bombs, indicating that the SELECT definition somehow got lost +somewhere since the 209 release (i.e. no SELECT type is defined so it falls +thru to "SELECT is required for this code"). But I don't see anything in +ckcdeb.h or ckcnet.[ch] that would explain this. Not ckvker.com either +(putting the old one back gives the same result). OK, I give up, maybe it's +just that I haven't tried building it on MultiNet recently. What about UCX? +Aha, builds fine there except for warnings about mlook, dodo, and parser in +ckvfio.c (because of ON_CD) -- I suppose I have #include ... (done) +Anyhow it builds OK and the HTTP code is active and almost works (HTTP OPEN +works; HTTP GET seems to succeed but creates an empty file every time). Tried +building under MultiNet at another installation; same bad result. + +OK so why won't it build for MultiNet? Comparing ckcnet.c with the 209 +version, not a single #ifdef or #include is changed. Tried building with +p3="NOHTTP" -- builds OK, aha. Where's the problem? Not ckcnet.h... +Not ckcdeb.h... OK I give up, will revisit this next time I get time to +do anything with the code. + +Later Jeff said "Martin did not implement VMS networking for the HTTP code. +All he did was activate the #define HTTP which happens to work because his +connections are using SSL/TLS connections. http_inc(), http_tol(), etc have +no support for VMS networking regardless of whether it is UCX or MULTINET. +The vast majority of HTTP connections are not secured by SSL/TLS. It makes no +sense to support HTTP on VMS until someone is willing to either do the work or +pay have the work done to implement VMS networking in that code base." So the +fix is to not enable HTTP for VMS after all. Removed the CKHTTP definition +for VMS from ckcdeb.h, 6 Jul 2003. + +Fixed ckvfio.c to #include (instead of ) to pick up +missing prototypes. 6 Jul 2003. + +From Arthur Marsh: solaris2xg+openssl+zlib+srp+pam+shadow and the corresponding +Solaris 7 target. makefile, 6 Jul 2003. + +Remove duplicate #includes for , , and from +ckcftp.c. 6 Jul 2003. + +Add -DUSE_MEMCPY to Motorola SV/68 targets because of shuffled #includes in +ckcftp.c. 8 Jul 2003. + +From Jeff: Fix problems mixing SSL and SRP without Kerberos. Plus a few minor +#define comment changes and a reshuffling of #defines in ckcdeb.h to allow me +to build on X86 Windows without Kerberos. ckcdeb.h, ck_crp.c, ckuath.c, +10 Jul 2003. + +From Jeff: updated ckuat2.h and ckuath.c, 29 Jul 2003. + +Mats Peterson noticed that a very small Latin-1 file would be incorrectly +identified as UCS-2 by scanfile(). Fixed in ckuusx.c, 29 Jul 2003. + +Fixed ACCESS macro definition to account for the fact that FIND is now a +built-in command. ckermit.ini, 30 Jul 2003. + +From Jeff: Fix for typo in urlparse() (svc/hos): ckuusy.c, 18 Aug 2003. + +From Jeff: Redhat9 makefile targets (needed for for OpenSSL 0.9.7): +makefile, 19 Aug 2003. + +GREP /NOLIST and /COUNT did too much magic, with some undesirable fallout: +"GREP /NOLIST /COUNT:x args" printed "file:count" for each file. "GREP +/COUNT:x /NOLIST args" did not print "file:count", but neither did it set the +count variable. Removed the magic. Also one of the GREP switches, +/LINENUMBERS, was out of order. Fixed in ckuus6.c, 20 Aug 2003. + +From Jeff: "Reorganizing code to enable building with different subsets of +options; a few typos corrected as well." ckcdeb.h, ckuver.h (for RH9), +ckcnet.c, ckuus7.c, ckuus3.c: 24 Aug 2003. + +Scanfile misidentified a big PDF file as text because the first 800K of it +*was* text (most other PDF files were correctly tagged as binary). Fixed +by adding a check for the PDF signature at the beginning of the file. +scanfile(): ckuusx.c, 25 Aug 2003. + +Ditto for PostScript files, but conservatively. Signature at beginning of +file must begin with "%!PS-Ado". If it's just "%!" (or something nonstandard +like "%%Creator: Windows PSCRIPT") we do a regular scan. Also added "*.ps" +to all binary filename patterns. ckuusx.c, 4 Sep 2003. + +Ditto (but within #ifndef NOPCLSCAN) for PCL (E) and PJL (%) files, +but no binpatterns (note: ".PCL" is the extension for TOPS-20 EXEC scripts). +ckuusx.c, 4 Sep 2003. + +Added comments about OpenSSL 0.9.7 to all linux+openssl targets. +makefile, 4 Sep 2003. + +From Jeff: Added - #define ALLOW_KRB_3DES_ENCRYPT. When this symbol is defined +at compilation Kermit will allow non-DES session keys to be used during Telnet +Auth. These session keys can then be used for Telnet Encrypt. The reason +this is not compiled on by default is that the MIT Kerberos Telnet does not +follow the RFC for constructing keys for ENCRYPT DES when the keys are longer +than 8 bytes in length. ckuath.c, ckuus5.c, 4 Sep 2003. + +"ftp mget a b c" succeeded if one or more of the files did not exist, even +with "set ftp error-action proceed". This is because the server's NLST file +list does not include any files that don't exist, so the client never even +tries to get them. Fortunately, the way the code is structured, this one was +easy to fix. ckcftp.c, 14 Sep 2003. + +From Jeff: Corrected code in ckcnet.c to ensure that Reverse DNS Lookups are +not performed if tcp_rdns is OFF. Fixed ck_krb5_getrealm() to actually return +the realm of the credentials cache and not the default realm specified in the +krb5.conf file. Previously krb5_cc_get_principal() was not being called. +Fixed ck_krb5_is_tgt_valid() to test the TGT in the current ccache and not the +TGT constructed from the default realm. ckcnet.c, ckuath.c, 14 Sep 2003. + +Marco Bernardi noticed that IF DIRECTORY could produce a false positive if +the argument directory had previously been referenced but then removed. This +is because of the clever isdir() cache that was added to speed up recursion +through big directory trees. Changed IF DIRECTORY to make a second check +(definitive but more expensive) if isdir() succeeds, and changed the +directory-deleting routine, ckmkdir(), to flush the directory cache (UNIX +only -- this also should be done in K95 but it's not critical). This was +done by adding a routine, clrdircache() to ckufio.c, which sets prevstat +to -1 and prevpath[0] to NUL. ckcfn3.c, ckuus6.c, ckufio.c, 18 Sep 2003. + +Marco reported the second fix still didn't work for him (even though it did +for me). Rather than try to figure out why, I concluded that the directory +cache is just not safe: a directory found a second ago might have been deleted +or renamed not only by Kermit but by some other process. Why did I add this +in the first place? The log says: + + Some debug logs showed that isdir() is often called twice in a row on the + same file. Rather than try to sort out clients, I added a 1-element cache + to Unix isdir(). ckufio.c, 24 Apr 2000. + +Experimentation with DIR and DIR /RECURSIVE does not show this happening at +all. So I #ifdef'd out the directory cache (see #ifdef ISDIRCACHE in ckufio.c; +ISDIRCACHE is not defined) and backed off the previous changes: ckufio.c, +ckcfn3.c, ckuus6.c, 28 Sep 2003. + +From Jeff: Replace the compile time ALLOW_KRB_3DES_ENCRYPT with a run-time +command SET TELNET BUG AUTH-KRB5-DES which defaults to ON: ckctel.[ch], +ckuus[234].c, ck_crp.c, ckuath.c. 4 Oct 2003. + +Allow DIAL RETRIES to be any positive number, and catch negative ones. +Also added code to check for atoi() errors (e.g. truncation). At least on +some platforms (e.g. Solaris) atoi() is supposed to set errno, but it +doesn't. ckuus3.c, ckucmd.c, 4 Oct 2003. + +Added /DEFAULT: to ASK-class commands (ASK, ASKQ, GETOK): + + . For popups: no way to send defaults to popup_readtext() or popup_readpass(). + . For GUI ASK[Q], pass default to gui_txt_dialog(). + . For GUI GETOK, convert "yes" "ok" or "no" default to number for uq_ok(). + . For Text GETOK, add default to cmkey(). + . For Text ASK[Q], add default to cmtxt(). + . For GETC, GETKEY, and READ: no changes. + +GETOK, ASK, and ASKQ with /TIMEOUT: no longer fail when the timer goes off +if a /DEFAULT was supplied. The GUI functions (uq_blah) don't seem to +support timeouts. Only the text version has been tested. ckuus[26].c, +4 Oct 2003. + +From Jeff: add /DEFAULT: for popups. ckuus6.c. 6 Oct 2003. + +Change SET DIAL INTERVAL to be like SET DIAL RETRIES. ckuus[34].c, 6 Oct 2003. + +Added target for HP-UX 10/11 + OpenSSL built with gcc, from Chris Cheney. +Makefile, 12 Oct 2003. + +From Jeff, 6 Nov 2003: + . #ifdef adjustments: ckcftp.c, ckcdeb.h + . Fix spurious consumption of first byte(s) on Telnet connection: ckctel.c + . Another HP PJL test for scanfile: ckuusx.c. + . K95: Recognize DG4xx protected fields in DG2xx emulation: ckuus7.c. + . Add SSLeay version display to SHOW AUTH command: ckuus7.c + . Improved SET MOUSE CLEAR help text: ckuus2.c. + . Improved Kverbs help text: ckuus2.c (+ new IBM-3151 Kverbs). + . Some changes to ck_ssl.c, ckuath.c. + +From PeterE, 10 Nov 2003: + . Improved HP-UX 10/11 makefile targets for OpenSSL. + . #ifdef fix for OpenSSL on HP-UX: ck_ssl.c. + +Another new makefile from PeterE with improved and integrated HP-UX targets. +12 Nov 2003. + +A couple fixes to the solaris9g+krb5+krb4+openssl+shadow+pam+zlib target +from Jeff. Added a solaris9g+openssl+shadow+pam+zlib target. makefile, +21 Nov 2003. + +From Jeff, 30 Nov 2003: + . Fix SEND /MOVE-TO: ckuusr.c. + . Fix K95 SET TITLE to allow quotes/braces around text: ckuus7.c. + . Improved "set term autodownload ?" response: ckuus5.c. + . Fix SHOW FEATURES to specify the protocol for encryption: ckuus5.c + . Make {SEND, RECEIVE} {MOVE-TO, RENAME-TO} work for XYZMODEM (K95 only). + +From Jeff: 7 Jan 2004: + . At one point Frank started to add a timer parameter to the + uq_txt() function but he only did it for the non-ANSI + compilers. I added it for the ANSI compilers, fixed the + prototypes and provided a default value easily changed + DEFAULT_UQ_TIMEOUT: ckcker.h, ckuus[36].c, ck_ssl.c, ckcftp.c, ckuath.c. + . Fixed SET TERMINAL DEBUG ON (typo in variable name): ckuus7.c. + . Fixed BEEP INFORMATION; previously it made no sound, now uses + MB_ICONQUESTION. ckuusx.c. + +From Ian Beckwith (Debianization), 7 Jan 2004: + . Search dir/ckermit for docs, as well as dir/kermit in cmdini(): ckuus5.c. + . New linux+krb5+krb4+openssl+shadow+pam target (kitchen sink minus SRP, + which Debian does not distribute): makefile. + ? Mangles the DESTDIR support in makefile to install into a staging area: + makefile (I didn't take this one yet). + +Updated copyright notices for 2004, all modules. 7 Jan 2004. + +Added INPUT /NOMATCH, allowing INPUT to be used for a fixed amount of time +without attempting to match any text or patterns, so it's no longer +necessary to "input 600 STRING_THAT_WILL_NEVER_COME". If /NOMATCH is +included, INPUT succeeds if the timeout expires, with \v(instatus) = 1 +(meaning "timed out"); fails upon interruption or i/o error. ckuusr.h, +ckuus[r24].c, 7 Jan 2004. + +Added SET INPUT SCALE-FACTOR . This scales all INPUT timeouts by the +given factor, allowing time-sensitive scripts to be adjusted to changing +conditions such as congested networks or different-speed modems without +having to change each INPUT-class command. This affects only those timeouts +that are given in seconds, not as wall-clock times. Although the scale +factor can have a fractional part, the INPUT timeout is still an integer. +Added this to SHOW INPUT, and added a \v(inscale) variable for it. +ckuusr.h, ckuus[r257].c, 7 Jan 2004. + +undef \%a, \fverify(abc,\%a) returns 0, which makes it look as if \%a is a +string composed of a's, b's, and/or c's, when in fact it contains nothing. +Changed \fverify() to return -1 in this case. ckuus4.c, 12 Jan 2004. + +\fcode(xxx) returned an empty string if its argument string was empty. This +makes it unsafe to use in arithmetic or boolean expressions. Changed it to +return 0 if its argument was missing, null, or empty. ckuus4.c, 12 Jan 2004. + +Updated \verify() and \fcode() help text. ckuus2.c, 12 Jan 2004. + +While setting up IKSD, Ian Beckwith noticed that including the --initfile: +option caused Kermit to start parsing its own Copyright string as if it were +the command line, and eventually crash. I couldn't reproduce on Solaris / +Sparc but I could in Linux / i386 (what Ian is using) -- a change from Jeff +on 28 Apr 2003 set the command-line arg pointer to a literal empty string in +prescan() about line 1740 of of ckuus4.c; the pointer is incremented next +time thru the loop, resulting in random memory being referenced. Fixed by +setting the pointer to NULL instead of "". ckuus4.c, 12 Jan 2004. + +declare \&a[999999999999999] would dump core on some platforms. atoi() +or whatever would truncate the dimension to maxint. When we add 1 to the +result, we get a negative number, which is used as an index, loop test, etc. +Fixed both dodcl() and dclarray() to check for (n+1 < 0). ckuus[r5].c, +12 Jan 2004. + +Unix zchki() would fail on /dev/tty, which is unreasonable. This prevented +FOPEN /READ from reading from the terminal. zchki() already allowed for +/dev/null, so I added /dev/tty to the list of specials. Ditto for FOPEN +/WRITE and zchko(). ckufio.c 13 Jan 2004. + +Added untabify() routine to ckclib.[ch], 13 Jan 2004. +Added FREAD /TRIM and /UNTABIFY. ckuus[27].c, 13 Jan 2004. +Added \funtabify(). ckuusr.h, ckuus[24].c, 13 Jan 2004. + +Dat Nguyen noticed that (setq u 'p') followed by (u) dumped core. This was +caused by an over-clever optimization that skipped mallocs for short +literals, but then went on later to try to free one that hadn't been +malloc'd. Fixed in dosexp(): ckuus3.c, 14 Jan 2004. + +Catch another copyright date. ckuus5.c, 14 Jan 2004. + +Fixed SWITCH to work even when SET COMMAND DOUBLEQUOTE OFF (from Mark +Sapiro). ckuus5.c, 15 Jan 2004. + +Changed version to 8.0.211 so scripts can test for recently added features. +ckcmai.c, 15 Jan 2004. + +Fixed a glitch in K95 "help set port". ckuus2.c, 20 Jan 2004. + +Fix from Jeff: Connections to a TLS-aware protocol which require a reconnect +upon certificate verification failure could not reconnect if the connection +was initiated from the command line or via a URL. ckctel.c ckcmai.c +ckuusr.c ckuus7.c ckuusy.c, 20 Jan 2004. + +From Alex Lewin: makefile target and #ifdef for Mac OS X 10.3 (Panther): +makefile, ckcnet.c, 7 Feb 2004. + +Added KFLAGS to sco32v507 targets to make PTY and SSH commands work. The +same flags could probably also be added to earlier OSR5 targets but they +have not been tested there. makefile, 7 Feb 2004. + +Checked a complaint that "LOCAL &a" did not make array \&a[] local. Indeed +it did not, and can not. You have to use the full syntax in the LOCAL +command, "LOCAL \&a[]", or else it doesn't know it's not a macro named &a. +7 Feb 2004. + +Fixed some confusion in creating IKSD database file and temp-file names. +I was calling zfnqfp() without remembering that the path member of the +returned struct included the filename, so to get just the directory name, +I needed to strip the filename from the right. ckuusy.c, 2 Mar 2004. + +New ckuath.c, ck_ssl.c from Jeff. 2 Mar 2004. + +Updated Jeff's affiliation in VERSION command text. ckuusr.c, 2 Mar 2004. + +Designation changed from Dev.00 to Beta.01. ckcmai.c, 2 Mar 2004. + +Fixed zrename() syslogging -- it had success and failure reversed. +Beta.02: ckufio.c, 4 Mar 2004. + +Problem: when accessing IKSD via a kermit:// or iksd:// URL, and a user ID +is given but no password, doxarg() set the password to "" instead of leaving +it NULL, but all the tests in dourl() are for NULL. Fixed in doxarg(): +ckuusy.c, 5 Mar 2004. + +The logic in dourl() about which macro to construct (login and connect, +login and get directory listing, or login and fetch a file) was a bit off, +so all three cases were not handled. ckcmai.c, 5 Mar 2004. + +Trial Beta builds: + . HP-UX B.11.11 PA-RISC + . HP-UX B.11.23 IA64 + . Tru64 4.0G Alpha + . Tru64 5.1B Alpha + . Debian 3.0 i386 + . Red Hat ES 2.1 i386 + . Slackware 9.1 i386 + . VMS 7.3-1 Alpha + UCX 5.3 + . VMS 7.3-1 Alpha no TCP/IP + . VMS 7.3 Alpha MultiNet 4.3 A-X + . SCO UnixWare 7.1.4 i386 + . SCO OSR5.0.7 i386 + . Solaris 9 Sparc + +Fixed compiler warning in doxarg() caused by typo (NULL instead of NUL) in +the 5 March doxarg() edit. ckuusy.c, 9 Mar 2004. + +IKSD (kermit://) command-line URLs did not work right if the client had +already preauthenticated with Kerberos or somesuch because they tried to log +in again with REMOTE LOGIN. The macros constructed in doxarg() needed to +check \v(authstate) before attempting REMOTE LOGIN. ckcmai.c, 10 Mar 2004. + +Added ckuker.nr to x.sh (ckdaily upload) and updated ckuker.nr with current +version number and dates. 10 Mar 2004. + +Replaced hardwired references to /usr/local in makefile with $(prefix) +(which defaults to /usr/local, but can be overridden on the command line), +suggested by Nelson Beebe for use with Configure. 10 Mar 2004. + +From Nelson Beebe: In the Kermit makefile in the install target commands, +line 981 reads: + + cp $(BINARY) $(DESTDIR)$(BINDIR)/kermit || exit 1;\ + +Could you please add this line before it: + + rm -f $(DESTDIR)$(BINDIR)/kermit;\ + +Some sites (mine included) keep multiple versions of software around, +with hard links between $(prefix)/progname and $(prefix)/progname-x.y.z. +Failure to remove the $(prefix)/progname at "make install" time then +replaces the old $(prefix)/progname-x.y.z with the new one, destroying +an old version that the site wanted to be preserved. makefile, 10 Mar 2004. + +Minor syntax and typo fixes (mostly prototypes): ckcdeb.h, ckcfns.c, +ckclib.c, ckufio.c, ckuusr.h, ckuusx.c, 10 Mar 2004. (I still have a few +more to do.) + +Added CC=$(CC) CC2=$(CC2) to many (but not all) makefile targets that +reference other makefile targets. On some platforms (notably AIX, Solaris, +SunOS) there are specific targets for different compilers, so I skipped +those. makefile, 10 Mar 2004. + +Added error checking to kermit:// URL macros, so they don't plow ahead +after the connection is closed. ckcmai.c, 11 Mar 2004. + +Added FreeBSD 4.9 and 5.1 targets (only the herald is affected). +makefile, ckuver.h, 11 Mar 2004. + +Added "LIBS=-lcrypt" to bsd44 targets since nowadays crypt is almost always +unbundled from libc. Also added explanatory notes. makefile, 11 Mar 2004. + +Changed MANDIR to default to $(manroot)/man/man1, and manroot to default +to $(prefix). More adding of CC=$(CC) clauses: {Free,Net,Open}BSD, 4.4BSD. +makefile, 11 Mar 2004. + +Miscellaneous cleanups: ckuusx.c, ckcnet.c, ckufio.c, 11 Mar 2004. + +Corrected the check in the linux target to see if /usr/include/crypt.h +exists, and if so to define HAVE_CRYPT_H, which is used in ckcdeb.h to +#include to get the prototype for crypt() and prevent bogus +conversions on its return type on 64-bit platforms (the previous test wasn't +quite right and the resulting symbol wasn't spelled right). makefile, +12 Mar 2004. + +From Jeff, 14 Mar 2004: + . Initialize localuidbuf[] in tn_snenv(): ckctel.c. + . Remove remote-mode checks in hupok() for K95G only (why?): ckuus3.c. + . Add help text for new K95-only TYPE /GUI switches: ckuus2.c. + . TYPE /GUI parsing, ...: ckuusr.c. + . TYPE /GUI action, dotype(): ckuus6.c + . Change Jeff's affiliation: most modules. + +20 Mar 2004: Looked into adding long file support, i.e. handling files more +than 2GB (or 4GB) long. Discovered very quickly this would be a major +project. Each platform has a different API, or environment, or transition +plan, or whatever -- a nightmare to handle in portable code. At the very +least we'll need to convert a lot of Kermit variables from long or unsigned +long to some new Kermit type, which in turn is #defined or typedef'd +appropriately for each platform (to off_t or size_t or whatever). Then we +have to worry about the details of open() vs fopen(); printf() formats (%lld +vs %Ld vs %"PRId64"...), platforms like HP-UX where you might have to use +different APIs for different file systems on the same computer, etc. We'll +need to confront this soon, but let's get a good stable 8.0.211 release out +first! Meanwhile, for future reference, here are a few articles: + +General: http://freshmeat.net/articles/view/709/ +Linux: http://www.ece.utexas.edu/~luo/linux_lfs.html +HP-UX: http://devrsrc1.external.hp.com/STK/partner/lg_files.pdf +Solaris: http://wwws.sun.com/software/whitepapers/wp-largefiles/largefiles.pdf + +Looked into FTP timeouts. It appears I can just call empty() (which is +nothing more than a front end for select()) with the desired timeout before +any kind of network read. If it returns <= 0, we have a timeout. This is +not quite the same as using alarm() / signal() around a recv() (which could +get stuck) but alarm() / signal() are not not used in the FTP module and are +not naturally portable to Windows, but select() is already in use in the FTP +module for both Unix and Windows. This form of timeout could be used +portably for both command response and data reads. What about writes to the +command or data socket? They can get stuck for hours and hours without +returning too, but the select() approach won't help here -- we need the +actual send() or recv() to time out, or be wrapped in an alarm()/signal() +kind of mechanism. But if we can do that for sends, we can also do it for +receives. Better check with Jeff before I start programming anything. +20 Mar 2004. + +Later: Decided to postpone the above two projects (ditto IPv6) until after +8.0.211 is released because both will have major impacts on portability. +Grumble: all i/o APIs should have been designed from the beginning with a +timeout parameter. To this day, hardly any have this feature. + +3-4 Apr 2004: More 8.0.211 Beta.02+ test builds: + + . FreeBSD 3.3 + . FreeBSD 4.4 + . Linux Debian 2.1 + . Linux RH 6.1 + . Linux RH 7.1 + . Linux RH 7.2 + . Linux RH 9 (with 84 different combinations of feature selection) + . Linux SuSE 6.4 + . Linux SuSE 7.0 + . NetBSD 1.4.1 + . NetBSD 1.5.2 + . OpenBSD 2.5 + . OpenBSD 3.0 + . QNX 4.25 + . SCO UnixWare 2.1.3 + . SCO UnixWare 7.1.4 + . SCO OpenServer 5.0.7 + . SCO XENIX 2.3.4 (no TCP) + +Changes needed: None. + +Problem: SCO XENIX 2.3.4 network build failed in the FTP module with +header-file syntax and conflicting-definitions trouble. I'm not going to +try to fix it; 8.0.209 built OK with FTP, so we'll just keep that one +available. + +Got access to VMS 8.1 on IA64. Building the nonet version of C-Kermit +required minor modifications to ckvvms.h, ckv[ft]io.c, and ckvcon.c, to +account for a third architecture. Also to SHOW FEATURES in ckuus5.c. Once +that was done, the UCX 5.5 version built OK too. Starts OK, makes Telnet +connection OK, sends files. Has some obvious glitches though -- "stat" +after a file transfer reports 0 elapsed time (in fact it was 00:09:48) and +1219174400 cps (when in fact it was 10364). This doesn't happen on the +Alpha. Btw, the IA64 binary is twice as big as the Alpha one. Changed +to Beta.03. 5 Apr 2004. + +Fixed the ckdaily script to include the makefile and man page in the Zip +file (they were not included because the Zip file was intended mainly for +VMS users, but some Unix users prefer Zip to tar.gz). 6 Apr 2004. + +Traced problems in VMS/IA64 statistics report to rftimer()/gftimer() in +ckvtio.c, which use sys$ and lib$ calls to figure elapsed time. These work +on VAX and Alpha but not IA64. Sent a report to the chief engineer of the +IA64 VMS port; he says it's probably a bug in VMS 8.1 (which is not a real +release); he'll make sure it's fixed in 8.2. As an experiment, tried +swapping in the Unix versions of these routines (which call gettimeofday() +etc). They seem work just fine (it hung a couple times but I think that's +because the underlying system hung too; trying it later on a new connection, +it was fine; however I noticed a BIG discrepancy in throughput between +sending and receiving). Moved definitions for VMS64BIT and VMSI64 to +ckcdeb.h so all modules can use them and added them to the SHOW FEATURES +display. Added VMSV80 definition to build procedure. Beta.03+. ckcdeb.h, +ckcuus5.c, ckcvvms.h, ckvtio.c, ckvker.com, 6 Apr 2004. + +While doing the build-all, I noticed the VMS version did not build with +Multinet or older UCX versions, always with the same errors -- undeclared +variables, undefined symbols, all TCP/IP related. This didn't happen a +couple weeks ago... Somehow the order of #includes was messed up -- +ckuusr.h depended on symbols that are defined in ckcnet.h, but ckcnet.h +was being included after ckuusr.h... this was compounded by two missing +commas in ckvker.com. 11 Apr 2004. + +Removed Beta designation, released as 8.0.211, 10 Apr 2004. + +---8.0.211--- + +I had somehow lost the edit to ckutio.c that changed the UUCP lockfile for +Mac OS X from /var/spool/uucp to /var/spool/lock. So I slipped it in and +re-uploaded version 8.0.211. You can tell the difference because SHOW +VERSIONS has a 17 Apr 2004 for the Communications I/O module. Also the 10.3 +executable now has a designer banner: "Mac OS X 10.3". makefile, ckuver.h, +ckutio.c, ckuus[45].c, 17 Apr 2004. + +*********************** diff --git a/ckcbwr.txt b/ckcbwr.txt new file mode 100644 index 0000000..5e70e65 --- /dev/null +++ b/ckcbwr.txt @@ -0,0 +1,1467 @@ + + C-Kermit 8.0 General Hints and Tips + + Frank da Cruz + [1]The Kermit Project, [2]Columbia University + + As of: C-Kermit 8.0.211, 17 March 2003 + This page last updated: Sat Apr 10 16:37:37 2004 (New York USA Time) + + IF YOU ARE READING A PLAIN-TEXT version of this document, it is a + plain-text dump of a Web page. You can visit the original (and + possibly more up-to-date) Web page here: + + [3]http://www.columbia.edu/kermit/ckcbwr.html + + This document contains platform-independent C-Kermit hints and tips. + Also see the platform-specific C-Kermit hints and tips document for + your platform, for example: + + [4]http://www.columbia.edu/kermit/ckubwr.html + + for Unix. This document also applies to [5]Kermit 95 for Windows, + which is based on C-Kermit. + + [ [6]C-Kermit ] [ [7]TUTORIAL ] + ________________________________________________________________________ + + CONTENTS + + 0. [8]PATCHES + 1. [9]INCOMPATIBLE CHANGES + 2. [10]THE C-KERMIT COMMAND PARSER + 3. [11]MULTIPLE SESSIONS + 4. [12]NETWORK CONNECTIONS + 5. [13]MODEMS AND DIALING + 6. [14]DIALING HINTS AND TIPS + 7. [15]TERMINAL SERVERS + 8. [16]TERMINAL EMULATION + 9. [17]KEY MAPPING + 10. [18]FILE TRANSFER + 11. [19]SCRIPT PROGRAMMING + ________________________________________________________________________ + + 0. PATCHES + + [ [20]Top ] [ [21]Contents ] [ [22]Next ] + + Source-level patches for C-Kermit 8.0.211: + + (None) + ________________________________________________________________________ + + 1. INCOMPATIBLE CHANGES + + [ [23]Top ] [ [24]Contents ] [ [25]Next ] + + These are not necessarily exhaustive lists. + + 1.1. C-Kermit 6.0 + + C-Kermit 6.0 was released 6 September 1996 and is completely + documented in [26]Using C-Kermit, 2nd Edition. The following + incompatible changes were made in C-Kermit 6.0: + + * Unless you tell C-Kermit otherwise, if a serial or network + connection seems to be open, and you attempt to EXIT or to open a + new connection, C-Kermit warns you that an active connection + appears to be open and asks you if you really want to close it. If + you do not want these warnings, add SET EXIT WARNING OFF to your + customization file or script, or give this command at the prompt. + * The default for SET { SEND, RECEIVE } PATHNAMES was changed from + ON to OFF, to prevent unexpected creation of directories and + depositing of incoming files in places you might not know to look. + * The default for SET FILE INCOMPLETE was changed from DISCARD to + KEEP to allow for file transfer recovery. + * The default file-transfer block-check is now 3, rather than 1. If + the other Kermit does not support this, the two will drop back to + type 1 automatically unless the other Kermit fails to follow the + protocol specification. + * The default flow-control is now "auto" ("do the right thing for + each type of connection"), not Xon/Xoff. + * Backslash (\) is no longer a command continuation character. Only + - (hyphen, dash) may be used for this in C-Kermit 6.0 and later. + * Negative INPUT timeout now results in infinite wait, rather than 1 + second. + + 1.2. C-Kermit 7.0 + + C-Kermit 7.0 was released 1 January 2000. Its new features are + documented in the C-Kermit 7.0 Supplement, + [27]http://www.columbia.edu/kermit/ckermit2.html. The following + incompatible changes were made in C-Kermit 7.0: + * The "multiline GET" command is gone. Now use either of the + following forms instead: + get remote-name local-name + get /as-name:local-name remote-name + If either name contains spaces, enclose it in braces (or, in + C-Kermit 8.0, doublequotes). + * To include multiple file specifications in a GET command, you must + now use MGET rather than GET: + mget file1 file2 file3 ... + * C-Kermit 7.0 and later use FAST Kermit protocol settings by + default. This includes "unprefixing" of certain control + characters. Because of this, file transfers that worked with + previous releases might not work in the new release especially + against a non-Kermit-Project Kermit protocol implementation (but + it is more likely that they will work, and much faster). If a + transfer fails, you'll get a context-sensitive hint suggesting + possible causes and cures. Usually SET PREFIXING ALL does the + trick. + * By default C-Kermit 7.0 and later send files in text or binary + mode by looking at each file to see which is the appropriate mode. + To restore the previous behavior, put SET TRANSFER MODE MANUAL and + the desired SET FILE TYPE (TEXT or BINARY) in your C-Kermit + initialization file. + * The RESEND and REGET commands automatically switch to binary mode; + previously if RESEND or REGET were attempted when FILE TYPE was + TEXT, these commands would fail immediately, with a message + telling you they work only when the FILE TYPE is BINARY. Now they + simply do this for you. + * SET PREFIXING CAUTIOUS and MINIMAL now both prefix linefeed (10 + and 138) in case rlogin, ssh, or cu are "in the middle", since + otherwise ~ might appear in Kermit packets, and this would + cause rlogin, ssh, or cu to disconnect, suspend,escape back, or + otherwise wreck the file transfer. Xon and Xoff are now always + prefixed too, even when Xon/Xoff flow control is not in effect, + since unprefixing them has proven dangerous on TCP/IP connections. + * In UNIX, VMS, Windows, and OS/2, the DIRECTORY command is built + into C-Kermit itself rather than implemented by running an + external command or program. The built-in command might not behave + the way the platform-specific external one did, but many options + are available for customization. Of course the underlying + platform-specific command can still be accessed with "!", "@", or + "RUN" wherever the installation does not forbid. In UNIX, the "ls" + command can be accessed directly as "ls" in C-Kermit. + * SEND ? prints a list of switches rather than a list of filenames. + If you want to see a list of filenames, use a (system-dependent) + construction such as SEND ./? (for UNIX, Windows, or OS/2), SEND + []? (VMS), etc. + * In UNIX, OS-9, and Kermit 95, the wildcard characters in previous + versions were * and ?. In C-Kermit 7.0 they are *, ?, [, ], {, and + }, with dash used inside []'s to denote ranges and comma used + inside {} to separate list elements. If you need to include any of + these characters literally in a filename, precede each one with + backslash (\). + * SET QUIET { ON, OFF } is now on the command stack, just like SET + INPUT CASE, SET COUNT, SET MACRO ERROR, etc, as described on p.458 + of [28]Using C-Kermit, 2nd Edition. This allows any macro or + command file to SET QUIET ON or OFF without worrying about saving + and restoring the global QUIET value. For example, this lets you + write a script that tries SET LINE on lots of devices until it + finds one free without spewing out loads of error messages, and + also without disturbing the global QUIET setting, whatever it was. + * Because of the new "." operator (which introduces assignments), + macros whose names begin with "." can not be invoked "by name". + However, they still can be invoked with DO or \fexecute(). + * The syntax of the EVALUATE command has changed. To restore the + previous syntax, use SET EVALUATE OLD. + * The \v(directory) variable now includes the trailing directory + separator; in previous releases it did not. This is to allow + constructions such as: + cd \v(dir)data.tmp + to work across platforms that might have different directory + notation, such as UNIX, Windows, and VMS. + * Prior to C-Kermit 7.0, the FLOW-CONTROL setting was global and + sticky. In C-Kermit 7.0, there is an array of default flow-control + values for each kind of connection, that are applied automatically + at SET LINE/PORT/HOST time. Thus a SET FLOW command given before + SET LINE/PORT/HOST is likely to be undone. Therefore SET FLOW can + be guaranteed to have the desired effect only if given after the + SET LINE/PORT/HOST command. + * Character-set translation works differently in the TRANSMIT + command when (a) the file character-set is not the same as the + local end of the terminal character-set, or (b) when the terminal + character-set is TRANSPARENT. + + 1.3. C-Kermit 8.0 + + The following incompatible changes were made in C-Kermit 8.0: + * C-Kermit now accepts doublequotes in most contexts where you + previously had to use braces to group multiple words into a single + field, or to force inclusion of leading or trailing blanks. This + might cause problems in contexts where you wanted the doublequote + characters to be taken literally. Consult [29]Section 5 of the + [30]C-Kermit 8.0 Update Notes for further information. + * Using the SET HOST command to make HTTP connections is no longer + supported. Instead, use the new [31]HTTP OPEN command. + ________________________________________________________________________ + + 2. THE C-KERMIT COMMAND PARSER + + [ [32]Top ] [ [33]Contents ] [ [34]Next ] [ [35]Previous ] + + Various command-related limits are shown in the following table, in + which the sample values are for a "large memory model" build of + C-Kermit, typical for modern platforms (Linux, Solaris, AIX, VMS, + etc). You can see the values for your version of Kermit by giving the + SHOW FEATURES command. The maximum length for a Kermit command (CMDBL) + also determines the maximum length for a macro definition, since + DEFINE is itself a command. The maximum length for a variable name is + between 256 and 4096 characters, depending on the platform; for array + declarations and references, that includes the subscript. + ______________________________________________________________ + + Item Symbol Sample + Value Definition + Number of characters in a command CMDBL 32763 ckucmd.h + Number of chars in a field of a command ATMBL 10238 ckucmd.h + Nesting level for command files MAXTAKE 54 ckuusr.h + Nesting level for macros MACLEVEL 128 ckuusr.h + Nesting level for FOR / WHILE loops FORDEPTH 32 ckuusr.h + Number of macros MAC_MAX 16384 ckuusr.h + Size of INPUT buffer INPBUFSIZ 4096 ckuusr.h + Maximum files to match a wildcard MAXWLD 102400 ckcdeb.h + Filespecs in MSEND command MSENDMAX 1024 ckuusr.h + Length for GOTO target label LBLSIZ 50 ckuusr.h + \fexecute() recursion depth limit CMDDEP 64 ckucmd.h + ______________________________________________________________ + + If you need to define a macro that is longer than CMDBL, you can break + the macro up into sub-macros or rewrite the macro as a command file. + In a pinch you can also redefine CMDBL and recompile C-Kermit. All of + these numbers represent tradeoffs: the bigger the number, the more + "powerful" Kermit in the corresponding area, but also the bigger the + program image and possibly disk footprint, and the longer it takes to + load and initialize. + + In the interactive command parser: + + * EMACS- or VI-style command line editing is not supported. + * Editing keys are hardwired (Ctrl-U, Ctrl-W, etc). + + If you interrupt C-Kermit before it has issued its first prompt, it + will exit. This means that you cannot interrupt execution of the + initialization file, or of an "application file" (file whose name is + given as the first command-line argument), or of an alternative + initialization file ("-y filename"), and get to the prompt. There is, + however, one exception to this rule: you *can* interrupt commands -- + including TAKE commands -- given in the '-C "command list"' + command-line argument and -- if there were no action commands among + the command-line arguments -- you will be returned to the C-Kermit + prompt. So, for example, if you want to start C-Kermit in such a way + that it executes a command file before issuing its first prompt, and + you also want to be able to interrupt the command file and get to the + prompt, include a TAKE command for the desired command in the -C + argument, for example: + + kermit -C "take dial.scr" + + At the command prompt, if you use the backslash (\) prefix to enter a + control character, space, or question mark into a command literally, + the backslash disappears and is replaced by the quoted character. If + it was a control character, it is shown as a circumflex (^). This + allows editing (backspace, delete, Ctrl-W) to work correctly even for + control characters. + + Priot to C-Kermit 8.0, the only way to include a comma literally in a + macro definition -- as opposed to having it separate commands within + the definition -- is to enter its ASCII value (44) in backslash + notation, e.g.: + + DEFINE ROWS RUN MODE CO80\{44}\%1 + + In C-Kermit 8.0 you can use constructions like this: + + DEFINE ROWS RUN MODE "CO80,\%1" + + If you quote special characters in a filename (e.g. in the SEND + command), filename completion may seem to work incorrectly. For + example, if you have a file whose name is a*b (the name really + contains an asterisk), and you type "send a\\*", the "b" does not + appear, nor will Ctrl-R redisplay the completed name correctly. But + internally the file name is recognized anyway. + + Question-mark help does not work during execution of an ASKQ command. + The question marks are simply accepted as text. + + In OUTPUT commands only, \B sends a BREAK signal, \L sends a Long + BREAK signal, and \N sends a NUL (ASCII 0). BREAK and Long BREAK are + special signals, not characters, and NUL is a character that normally + cannot be included in a C string, since it is the C string terminator. + If you really want to output a backslash followed by a B, an L, or an + N (as is needed to configure certain modems, etc), double the + backslash, e.g. "output \\B". In C-Kermit 7.0 or later, you can disarm + and re-arm the special OUTPUT-command escapes (\B, \L, and \N) with + SET OUTPUT SPECIAL-ESCAPES { OFF, ON }. + + When using the command-line processor ("kermit -l /dev/tty00 -b + 19200", etc), note that in some cases the order of the command-line + options makes a difference, contrary to the expectation that order of + command-line options should not matter. For example, the -b option + must be given after the -l option if it is to affect the device + specified in the -l option. + ________________________________________________________________________ + + 3. MULTIPLE SESSIONS + + [ [36]Top ] [ [37]Contents ] [ [38]Next ] [ [39]Previous ] + + C-Kermit 7.0 and earlier do not support multiple sessions. When you + SET LINE (or SET PORT, same thing) to a new device, or SET HOST to a + new host, the previous SET LINE device or network host connection is + closed, resulting in hangup of the modem or termination of the network + connection. In windowing environments like HP-VUE, NeXTSTEP, Windows, + OS/2, etc, you can run separate copies of Kermit in different windows + to achieve multiple sessions. + + To achieve multiple sessions through a single serial port (e.g. when + dialing up), you can install SLIP or PPP on your computer and then use + C-Kermit's TCP/IP support over the SLIP or PPP connection, assuming + you also have TCP/IP networking installed on your computer. + + C-Kermit 8.0 has the same restriction on SET LINE and SET HOST + sessions: only one regular session (dialout, Telnet, etc) can be open + at a time. However, version 8.0 adds two new kinds of sessions: FTP + and HTTP; one or both of these can be open at the same as a regular + session. + ________________________________________________________________________ + + 4. NETWORK CONNECTIONS + + [ [40]Top ] [ [41]Contents ] [ [42]Next ] [ [43]Previous ] + + FTP Client Bugs + + The Unix C-Kermit 8.0.206 FTP client had the following bugs at the + time most of the 8.0.206 binaries were built for the C-Kermit 8.0 + CDROM: + + 1. FTP MGET fails when directory segments contain wildcards, as in + "ftp mget */data/*.dat". Work around by doing a separate MGET for + each source directory. + 2. FTP MGET can fail or produce random side effects if you have a + TMPDIR or CK_TMP environment variable definition in effect, or a + SET TEMP-DIRECTORY value, longer than 7 characters. Work around by + giving a SET TEMP-DIRECTORY command with a short value, such as + "/tmp". + + These two bugs are fixed in the source code that is included on the + CDROM, and also in Kermit 95 2.1.1. You can tell if a C-Kermit 8.0.206 + binary has these fixes by typing SHOW VERSION; if it says "FTP Client, + 8.0.200, 24 Oct 2002" it has the fixes; if the edit number is less + that 200, it doesn't, in which case can build a new binary from the + source code (or contact us and we'll try to get get one for you). + + Making TCP/IP Connections Can Take a Long Time + + The most frequently asked question in many newsgroups is "Why does it + take such a long time to make a Telnet connection to (or from) my + (e.g.) Linux PC?" (this applies to Kermit as well as to regular Telnet + clients): + + 1. Most Telnet servers perform reverse DNS lookups on the client for + security and/or logging reasons. If the Telnet client's host + cannot be found by the server's local DNS server, the DNS request + goes out to the Internet at large, and this can take quite some + time. The solution to this problem is to make sure that both + client and host are registered in DNS. + 2. C-Kermit itself performs reverse DNS lookups unless you tell it + not to. This is to allow C-Kermit to let you know which host it is + actually connected to in case you have made a connection to a + "host pool" (multihomed host). You can disable C-Kermit's reverse + DNS lookup with SET TCP REVERSE-DNS-LOOKUP OFF. + 3. C-Kermit 7.0 and later strictly enforce Telnet protocol rules. One + such rule is that certain negotiations must be responded to. If + C-Kermit sends a such a negotiation and the host does not respond, + C-Kermit waits a long time for the reply (in case the network is + congested or the host is slow), but eventually will time out. To + eliminate the waits (and therefore risk possible protocol + mismatches -- or worse -- between Telnet client and server), tell + C-Kermit to SET TELNET WAIT OFF (or include the /NOWAIT switch + with the TELNET command). + + The Rlogin Client + + In multiuser operating systems such as UNIX and VMS, TCP/IP Rlogin + connections are available only to privileged users, since "login" is a + privileged socket. Assuming you are allowed to use it in the first + place, it is likely to behave differently depending on what type of + host you are rlogging in to, due to technical reasons having to do + with conflicting interpretations of RFC793 (Out-Of-Band Data) and + Rlogin (RFC1122)... "Specifically, the TCP urgent pointer in BSD + points to the byte after the urgent data byte, and an RFC-compliant + TCP urgent pointer points to the urgent data byte. As a result, if an + application sends urgent data from a BSD-compatible implementation to + an [44]RFC-1122 compatible implementation then the receiver will read + the wrong urgent data byte (it will read the byte located after the + correct byte in the data stream as the urgent data byte)." Rlogin + requires the use of OOB data while Telnet does not. Therefore, it is + possible for Telnet to work between all systems while BSD and System V + TCP/IP implementations are almost always a bad mix. + + The Telnet Client + + On a TCP/IP TELNET connection, you should normally have PARITY set to + NONE and (except in VMS C-Kermit) FLOW-CONTROL also set to NONE. If + file transfer does not work with these settings (for example, because + the remote TELNET server only gives a 7-bit data path), use SET PARITY + SPACE. Do not use SET PARITY MARK, EVEN, or ODD on a TELNET connection + -- it interferes with TELNET protocol. + + If echoing does not work right after connecting to a network host or + after dialing through a TCP/IP modem server, it probably means that + the TELNET server on the far end of the connection is executing the + TELNET protocol incorrectly. After initially connecting and + discovering incorrect echoing (characters are echoed twice, or not at + all), escape back, give the appropriate SET DUPLEX command (FULL or + HALF), and then CONNECT again. For a consistently misbehaving + connection, you can automate this process in a macro or TAKE file. + + TELNET sessions are treated just like serial communications sessions + as far as "terminal bytesize" and "command bytesize" are concerned. If + you need to view and/or enter 8-bit characters during a TELNET + session, you must tell C-Kermit to SET TERMINAL BYTESIZE 8, SET + COMMAND BYTESIZE 8, and SET PARITY NONE. + + If you SET TELNET DEBUG ON prior to making a connection, protocol + negotiations will be displayed on your screen. You can also capture + them in the debug log (along with everything else) and then extract + them easily, since all Telnet negotiations lines begin with + (uppercase) "TELNET". + ________________________________________________________________________ + + 5. MODEMS AND DIALING + + [ [45]Top ] [ [46]Contents ] [ [47]Next ] [ [48]Previous ] + + External modems are recommended because: + + * They don't need any special drivers. + * They are less likely to interfere with normal operation of your + computer. + * You can use the lights and speaker to troubleshoot dialing. + * You can share them among all types of computers. + * You can easily turn them off and on when power-cycling seems + warranted. + * They are more likely to have manuals. + + Modems can be used by C-Kermit only when they are visible as or + through a regular serial port device. Certain modems can not be used + in this normal way on many kinds of computers: Winmodems, RPI modems, + Controllerless modems, the IBM Mwave, etc; all of these require + special drivers that perform some, most, or all of the modem's + functions in software. Such drivers are generally NOT available in + UNIX or other non-Windows (or non-OS/2, in the case of the Mwave) + platforms. + + In order to dial a modem, C-Kermit must know its repertoire of + commands and responses. Each modem make and model is likely to have a + different repertoire. Since Kermit has no way of knowhing which kind + of modem will be dialed, normally you have to tell it with a SET MODEM + TYPE command, e.g.: + + set modem type usrobotics + set line /dev/cua0 + set speed 57600 + dial 7654321 + + In the early days, there was a wide variety of modems and command + languages. Nowadays, almost every modem uses the Hayes AT command set + (but with some differences in the details) and its startup + configuration includes error correction, data compression, and + hardware (RTS/CTS) flow control. As long as C-Kermit is capable of + hardware flow control (as it is on many, but not all, the platforms + where it runs, since some operating systems don't support it), the + modem can be dailed immediately, without lengthy configuration + dialogs, and in fact this is what SET MODEM TYPE GENERIC-HIGH-SPEED + does. In C-Kermit 8.0, GENERIC-HIGH-SPEED has become the default modem + type, so now it is usually possible to SET LINE, SET SPEED, and DIAL + without having to identify your modem. If this doesn't work, of + course, then you might have to fall back to the tradiational method: + Give a SET MODEM TYPE for a specific modem first, then SET LINE, SET + SPEED, and DIAL. + + An important change in C-Kermit 6.0 is that when you give a SET MODEM + TYPE command to tell Kermit what kind of modem you have, Kermit also + sets a number of other modem-related parameters automatically from its + internal modem database. Thus, the order in which you give + modem-related commands is significant, whereas in prior releases they + could be given in any order. + + In particular, MODEM SPEED-MATCHING is set according to whether the + modem is known to be capable of speed buffering. SET MODEM TYPE + HAYES-2400 automatically turns SPEED-MATCHING ON, because when the + Hayes 2400 reports a particular speed in its CONNECT message, that + means its interface speed has changed to that speed, and C-Kermit's + must change accordingly if it is to continue communicating. This might + cause some confusion if you use "set modem type hayes" for dialing a + more advanced type of modem. + + The new default for flow control is "auto", meaning "do the right + thing for each type of connection". So (for example) if your version + of C-Kermit supports SET FLOW RTS/CTS and your modem also supports + RTS/CTS, then Kermit automatically sets its flow control to RTS/CTS + and set modem's flow control to RTS/CTS too before attempting to use + the modem. + + For these reasons, don't assume that "set modem type hayes" should be + used for all modems that uses the Hayes AT command set. "set modem + type hayes" really does mean Hayes 1200 or 2400, which in turn means + no hardware flow control, and no speed buffering. This choice will + rarely work with a modern high-speed modem. + ________________________________________________________________________ + + 6. DIALING HINTS AND TIPS + + [ [49]Top ] [ [50]Contents ] [ [51]Next ] [ [52]Previous ] + + If you have a high-speed, error-correcting, data-compressing, + speed-buffering modem, you should fix the modem's interface speed as + high as possible, preferably (at least) four times higher than its + maximum connection (modulation) speed to allow compression to work at + full advantage. In this type of setup, you must also have an effective + means of flow control enabled between C-Kermit and the modem, + preferably hardware (RTS/CTS) flow control. On platforms that do not + support hardware flow control, it is usually possible to select + software flow control (Xon/Xoff), and C-Kermit will do its best to set + the modem for local Xon/Xoff flow control too (but then, of course, + Ctrl-S and Ctrl-Q characters can not be transmitted on the + connection). + + If you are having trouble dialing your modem, SET DIAL DISPLAY ON to + watch the dialing interactions between C-Kermit and your modem. + Consult Chapters 3-4 of [53]Using C-Kermit (2nd Ed) for modem-dialing + troubleshooting instructions. The following sections offer some + addtional hints and tips. + + 6.1. Syntax + + If you want to dial a number that starts with #, you'll need to quote + the "#" character (as \# or \{35}), since it is also a comment + introducer: + + C-Kermit>dial #98765421-1-212-5551212 ; Looks like a comment + ?You must specify a number to dial + C-Kermit>dial \#98765421-1-212-5551212 ; Works OK + C-Kermit>dial =#98765421-1-212-5551212 ; This works too + + When using a dialing directory, remember what happens if a name is not + found: + + C-Kermit>dial xyzcorp + Lookup: "xyzcorp" - not found - dialing as given + + This normally does no harm, but some modems might behave strangely + when given dial strings that contain certain letters. For example, a + certain German modem treats any dial string that contains the letter + "s" as a command to fetch a number from its internal list, and replies + OK to the ATD command, which is normally not a valid response except + for partial dialing. To avoid this situation, use: + + lookup xyzcorp + if success dial + + 6.2. The Carrier Signal + + Remember: In many C-Kermit implementations (depending on the + underlying operating system -- mostly Windows, OS/2, and + System-V-based UNIX versions, and in C-Kermit 7.0, also VMS), you + can't CONNECT to a modem and type the modem's dialing command (like + "ATDT7654321") manually, unless you first tell C-Kermit to: + + SET CARRIER-WATCH OFF + + This is because (in these implementations), the CONNECT command + requires the modem's Carrier Detect (CD) signal to be on, but the CD + signal doesn't come on until after dialing is complete. This + requirement is what allows C-Kermit to pop back to its prompt + automatically when the connection is hung up. See the description of + SET CARRIER-WATCH in "Using C-Kermit". + + Similarly, if your dialed connection drops when CARRIER-WATCH is set + to AUTO or ON, you can't CONNECT back to the (now disconnected) screen + to see what might have happened unless you first SET CARRIER-WATCH + OFF. But sometimes not even SET CARRIER-WATCH OFF will help in this + situation: certain platforms (for example Unixware 2.1), once carrier + drops, won't let the application do i/o with the device any more. In + that case, if you want to use the device again, you have to CLOSE it + and OPEN it again. Or you can have Kermit do this for you + automatically by telling it to SET CLOSE-ON-DISCONNECT ON. + + 6.3. Dialing and Flow Control + + Don't SET FLOW RTS/CTS if your modem is turned off, or if it is not + presenting the CTS signal. Otherwise, the serial device driver can get + stuck waiting for this signal to appear. + + Most modern modems support RTS/CTS (if they support any hardware flow + control at all), but some computers use different RS-232 circuits for + the same purposes, e.g. DTR and CD, or DTR and CTS. In such cases, you + might be able to make your computer work with your modem by + appropriately cross-wiring the circuits in the cable connector, for + example the computer's DTR to the modem's RTS, and modem's CD to the + computer's CTS. HOWEVER, C-Kermit does not know you have done this. So + if you have (say) SET FLOW DTR/CD, C-Kermit will make no attempt to + tell the modem to use RTS/CTS. You probably did this yourself when you + configured the modem. + + 6.4. The Dial Timeout + + If it takes your call longer to be completed than the timeout interval + that C-Kermit calculates, you can use the SET DIAL TIMEOUT command to + override C-Kermit's value. But beware: the modem has its own timeout + for completing the call. If it is a Hayes-like modem, C-Kermit adjusts + the modem's value too by setting register S7. But the maximum value + for S7 might be smaller than the time you need! In that case, C-Kermit + sets S7 to 0, 255, or other (modem-specific) value to signify "no + timeout". If Kermit attempts to set register S7 to a value higher than + your modem's maximum, the modem will say "ERROR" and you will get a + "Failure to initialize modem" error. In that case, use SET DIAL + TIMEOUT to override C-Kermit's calculation of the timeout value with + the highest value that is legal for your modem, e.g. 60. + + 6.5. Escape Sequence Guard Time + + A "TIES" (Time-Independent Escape Sequence) modem does not require any + guard time around its escape sequence. The following text: + + +++ATH0 + + if sent through a TIES modem, for example because you were uploading + this file through it, could pop the modem back into command mode and + make it hang up the connection. Later versions of the Telebit T1600 + and T3000 (version LA3.01E firmware and later), and all WorldBlazers, + use TIES. + + Although the probability of "+++" appearing in a Kermit packet is + markedly lower than with most other protocols (see the [54]File + Transfer section below), it can still happen under certain + circumstances. It can also happen when using C-Kermit's TRANSMIT + command. If you are using a Telebit TIES modem, you can change the + modem's escape sequence to an otherwise little-used control character + such as Ctrl-_ (Control-Underscore): + + AT S2=31 + + A sequence of three consecutive Ctrl-_ characters will not appear in a + Kermit packet unless you go to extraordinary lengths to defeat more + than a few of Kermit's built-in safety mechanisms. And if you do this, + then you should also turn off the modem's escape-sequence recognition + altogether: + + AT S48=0 S2=255 + + But when escape sequence recognition is turned off, "modem hangup" + (+++ATH0) will not work, so you should also SET + MODEM HANGUP RS232-SIGNAL (rather then MODEM-COMMAND). + + 6.6. Adaptive Dialing + + Some modems have a feature called adaptive dialing. When they are told + to dial a number using Tone dialing, they check to make sure that + dialtone has gone away after dialing the first digit. If it has not, + the modem assumes the phone line does not accept Tone dialing and so + switches to Pulse. When dialing out from a PBX, there is almost always + a secondary dialtone. Typically you take the phone off-hook, get the + PBX dialtone, dial "9" to get an outside line, and then get the phone + company's dialtone. In a situation like this, you need to tell the + modem to expect the secondary dialtone. On Hayes and compatible + modems, this is done by putting a "W" in the dial string at the + appropriate place. For example, to dial 9 for an outside line, and + then 7654321, use ATDT9W7654321: + + SET PBX-OUTSIDE-PREFIX 9W + + (replace "9" with whatever your PBX's outside-line prefix is). + + 6.7. The Busy Signal + + Some phone companies are eliminating the busy signal. Instead, they + issue a voice message such as "press 1 to automatically redial until + the number answers, or...". Obviously this is a disaster for modem + calls. If your service has this feature, there's nothing Kermit can do + about it. Your modem will respond with NO CARRIER (after a long time) + rather than BUSY (immediately), and Kermit will declare the call a + failure, rather than trying to redial the same number. + + 6.8. Hanging Up + + There are two ways to hang up a modem: by turning off the serial + port's DTR signal (SET MODEM HANGUP-METHOD RS232-SIGNAL) or sending + the modem its escape sequence followed by its hangup command (SET + MODEM HANGUP-METHOD MODEM-COMMAND). If one doesn't work, try the + other. If the automatic hangup performed at the beginning of a DIAL + command causes trouble, then SET DIAL HANGUP OFF. + + The HANGUP command has no effect when C-Kermit is in remote mode. This + is on purpose. If C-Kermit could hang up its own controlling terminal, + this would (a) most likely leave behind zombie processes, and (b) pose + a security risk. + + If you DIAL a modem, disconnect, then SET HOST or TELNET, and then + HANGUP, Kermit sends the modem's hangup command, such as "+++ATHO". + There is no good way to avoid this, because this case can't reliably + be distinguished from the case in which the user does SET HOST + terminal-server, SET MODEM TYPE name, DIAL. In both cases we have a + valid modem type selected and we have a network connection. If you + want to DIAL and then later make a regular network connection, you + will have to SET MODEM TYPE NONE or SET DIAL HANGUP OFF to avoid this + phenomenon. + ________________________________________________________________________ + + 7. TERMINAL SERVERS + + [ [55]Top ] [ [56]Contents ] [ [57]Next ] [ [58]Previous ] + + Watch out for terminal server's escape character -- usually a control + character such as Ctrl-Circumflex (Ctrl-^). Don't unprefix it in + Kermit! + + Ciscos -- must often be told to "terminal download"... Cisco ASM + models don't have hardware flow control in both directions. + + Many terminal servers only give you a 7-bit connection, so if you + can't make it 8-bit, tell Kermit to "set parity space". + + The following story, regarding trouble transferring 8-bit files + through a reverse terminal server, was contributed by an Annex + terminal server user: + + Using C-Kermit on an HP 9000 712/80 running the HP-UX 10.0 + operating system. The HP was connected to a Xylogics Annex + MICRO-ELS-UX R7.1 8 port terminal server via ethernet. On the + second port of the terminal server is an AT&T Paradyne 3810 modem, + which is connected to a telephone line. There is a program which + runs on the HP to establish a Telnet connection between a serial + line on the Annex and a character special file on the HP (/dev + file). This is an Annex specific program called rtelnet (reverse + telnet) and is provided with the terminal server software. The + rtelnet utility runs on top of the pseudo-terminal facility + provided by UNIX. It creates host-originiated connections to + devices attached ot Annex serial ports. There are several command + line arguments to be specified with this program: the IP address of + the terminal server, the number of the port to attach to, and the + name of the pseudo-device to create. In addition to these there are + options to tell rtelnet how to operate on the connect: -b requests + negotiation for Telnet binary mode, -d turns on socket-leve + debugging, -f enables "connect on the fly" mode, -r removes the + device-name if it already exists, etc. The most important of these + to be specified when using 8 data bits and no parity, as we found + out, was the -t option. This creates a transparent TCP connection + to the terminal server. Again, what we assumed to be happening was + that the rtelnet program encountered a character sequence special + to itself and then "eating" those kermit packets. I think this is + all of the information I can give you on the configuration, short + of the values associated with the port on the terminal server. + + How to DIAL from a TCP/IP reverse terminal server (modem server): + + 1. (only if necessary) SET TELNET ECHO REMOTE + 2. SET HOST terminal-server-ip-name-or-address [ port ] + 3. SET MODEM TYPE modem-type + 4. (only if necessary) SET DIAL HANGUP OFF + 5. (for troubleshooting) SET DIAL DISPLAY ON + 6. DIAL phone-number + + The order is important: SET HOST before SET MODEM TYPE. Since this is + a Telnet connection, serial-port related commands such as SET SPEED, + SET STOP-BITS, HANGUP (when MODEM HANGUP-METHOD is RS232), etc, have + no effect. However, in C-Kermit 8.0, if the modem server supports + [59]RFC-2217 Telnet Com-Port Control protocol, these commands do + indeed take effect at the server's serial port. + ________________________________________________________________________ + + 8. TERMINAL EMULATION + + [ [60]Top ] [ [61]Contents ] [ [62]Next ] [ [63]Previous ] + + Except for the Windows, OS/2, and Macintosh versions, C-Kermit does + not emulate any kind of terminal. Rather, it acts as a + "semitransparent pipe", passing the characters you type during a + CONNECT session to the remote host, and sending the characters + received from the remote host to your screen. Whatever is controlling + your keyboard and screen provides the specific terminal emulation: a + real terminal, a PC running a terminal emulator, etc, or (in the case + of a self-contained workstation) your console driver, a terminal + window, xterm, etc. + + Kermit is semitrantsparent rather than fully transparent in the + following ways: + + * During a TELNET ("set host") session, C-Kermit itself executes the + TELNET protocol and performs TELNET negotiations. (But it does not + perform TN3270 protocol or any other type of 3270 terminal + emulation.) + * If you have changed your keyboard mapping using SET KEY, C-Kermit + replaces the characters you type with the characters or strings + they are mapped to. + * If you SET your TERMINAL CHARACTER-SET to anything but + TRANSPARENT, C-Kermit translates your keystrokes (after applying + any SET KEY definitions) before transmitting them, and translates + received characters before showing them on your screen. + * If your remote and/or local TERMINAL CHARACTER-SET is an ISO 646 + 7-bit national character set, such as German, French, Italian, + Swedish, etc, or Short KOI used for Cyrillic, C-Kermit's CONNECT + command automatically skips over ANSI escape sequences to avoid + translating their characters. Only ANSI/ISO standard + (VT100/200/300-like) 7-bit escape sequence formats are supported + for this purpose, no proprietary schemes like H-P, Televideo, + Tektronix, etc. + * If your version of C-Kermit includes SET TERMINAL APC command, + then C-Kermit's CONNECT command will handle APC escape sequences + if TERMINAL APC is not set to OFF (which is the default). + + You can make C-Kermit fully transparent by starting it with the -0 + (dash zero) command-line option. + + If you are running C-Kermit under a console driver, or in a terminal + window, that emulates the VT100, and use C-Kermit to log in to a VMS + system, the console driver or terminal window (not Kermit) is supposed + to reply to the "what are you?" query (ESC Z) from the VAX. If it + doesn't, and you can't make it do so, then you can (a) live with the + "unknown terminal" problem; (b) tell VMS to SET TERMINAL/DEVICE=VT100; + (c) program a key using SET KEY to send the appropriate sequence and + then punch the key at the right time; or (d) use the VMSLOGIN macro + that is defined in CKERMIT.INI to do this for you automatically. + + SET SESSION-LOG { TEXT, BINARY }, which is effective in UNIX and + AOS/VS but not other C-Kermit versions, removes CR, DEL, NUL, XON, and + XOFF characters (Using C-Kermit neglects to mention that XON and XOFF + are removed). The TEXT-mode setting is ineffective during SCRIPT + command execution, as well as on X.25 connections. + ________________________________________________________________________ + + 9. KEY MAPPING + + [ [64]Top ] [ [65]Contents ] [ [66]Next ] [ [67]Previous ] + + Except in the terminal-emulating versions, C-Kermit's key mapping + facilities are limited to normal "ASCII" keys, and cannot be used with + function keys, arrow keys, arcane key combinations, etc. Since + C-Kermit runs on such a wide variety of hardware platforms (including, + for example, more than 360 different UNIX platforms), it is not + possible for C-Kermit to support every conceivable keyboard under + every release of every UNIX (or VMS, or ...) product on every + different kind of computer possibly under all manner of different + console drivers, even if it had the means to do so. + + In technical terms, C-Kermit uses the read() function to read + keystrokes, and read() returns a single byte (value 0 through 255). + C-Kermit's SET KEY function applies to these single-byte codes. + "Extended function" keys, such as F-keys, arrow keys, etc, usually + return either a 2-byte "scan code" or else a character string (such as + an escape sequence like " O p"). In both cases, C-Kermit has no + way to tell the difference between such multibyte key values, and the + corresponding series of single-byte key values. This could only be + done by accessing the keyboard at a much lower level in a highly + platform-dependent manner, probably requiring tens of thousands of + lines of code to support even a sampling of the most popular + workstation / OS combinations. + + However, most workstation console drivers (terminal emulation windows, + etc) include their own key-mapping facility. For example in AIX, the + AIXterm program (in whose window you would run C-Kermit) allows + rebinding of the F1-F12 keys to arbitrary strings. The same is true of + Xterm and DECterm windows, etc. Consult the technical documentation + for your workstation or emulator. See sample Xterm (Xmodmap) mappings + in the [68]Unix C-Kermit Hints and Tips document. + + The SET KEY command (except in Kermit 95) does not allow a key + definition to be (or contain) the NUL (\0) character. + ________________________________________________________________________ + + 10. FILE TRANSFER + + [ [69]Top ] [ [70]Contents ] [ [71]Next ] [ [72]Previous ] + + C-Kermit 7.0 is the first release of C-Kermit to use fast (rather than + robust and therefore slow) protocol defaults: long packets, sliding + windows, control-character unprefixing, and streaming where possible. + This makes most transfers (partner willing) dramatically faster "out + of the box" but might break some combinations that worked before. If + transfers with C-Kermit 7.0 or later fail where transfers worked with + earlier C-Kermit versions, try the following (one at a time, in this + order): + + 1. SET PREFIXING ALL: Disables control-character unprefixing. + 2. SET STREAMING OFF: Disables streaming. + 3. CAUTIOUS: Selects medium but cautious protocol settings. + 4. ROBUST: this command reverts to the most conservative protocol + settings. + + Execution of multiple file transfers by C-Kermit from a command file + when in remote mode might exhibit long delays between each transfer. + To avoid this, just include the command "SET DELAY 0" in your command + file before any of the file-transfer commands. + + File transfer failures can occur for all sorts of reasons, most of + them listed in Chapter 10 of [73]Using C-Kermit. The following + sections touch on some that aren't. + + The [74]C-Kermit 7.0 Release Notes document SEND /COMMAND as taking an + argument, but it doesn't. Instead of SEND /COMMAND:{some command}, + use: + +SEND /COMMAND [ other switches such as /AS-NAME: ] command [ arguments... ] + + 10.1. Laptops + + Watch out for laptops and their assorted power-saver features; for + example, a built-in modem's "auto timeout delay" hanging up the + connection in the middle of a file transfer. Most modems, even if they + have this feature, do not have it enabled by default. But if you + experience otherwise inexplicable disconnections in the midst of your + Kermit sessions, check the modem manual for such things as "idle + timeout", "auto timeout", etc, and add the command to disable this + feature to Kermit's init string for this modem. + + 10.2. NFS + + If uploading a large file to an NFS-mounted disk fails (or is + painfully slow), try uploading it to a local disk (e.g. /tmp on Unix) + and then copying to the NFS disk later. + + 10.3. Modems + + If you are dialing out and find that downloads work but uploads don't, + try again with a lower serial-port speed. Case in point: dialing out + on a certain PC from Linux at 115200 bps using a USR Courier 56K + "V.Everything" external modem and RTS/CTS flow control. Downloads + worked flawlessly, uploads stopped dead after the first few packets + were sent. The modem lights showed constant retraining (ARQ light + blinks slowly), and the CTS light was off 95% of the time, allowing + nothing to get through. Reducing the serial port speed to 57600 bps + made the problems go away. Evidently the PC in question has a very + fast serial port, since dialing the same modem with a different PC at + 115200 bps works without incident. + + 10.4. TCP/IP Connections + + If you have trouble transferring files over a TCP/IP connection, tell + Kermit to SET PARITY SPACE and try again. If that doesn't work, also + try a shorter packet length or smaller window size (to compensate for + certain well-known broken Telnet servers), and/or SET RELIABLE OFF. + + 10.5. Multihop Connections + + If you have a multihop connection, with the interior nodes in CONNECT + mode (Kermit, Telnet, Rlogin, or any other), you can expect (a) file + transfer to be slower, and (b) the connection to be less transparent + (to control characters, perhaps to the 8th bit) than a more direct + connection. C-Kermit 7.0 and later have a "-0" (dash-zero) + command-line option to make it 100% transparent in cases where it is + to be used in the middle. + + 10.6. Recovery + + The recovery feature (RESEND command) that was added in version + 5A(190) works only for binary-mode transfers. In order for this + feature to be useful at all, the default for SET FILE INCOMPLETE was + changed from DISCARD to KEEP. Otherwise an interrupted transfer would + leave no partial file behind unless you had remembered to change the + default. But now you have to pay closer attention to Kermit's messages + to know whether a transfer succeeded or failed -- previously, if it + failed, the file would not show up on the receiving end at all; in + 5A(190) and later, you'll get a partial file which could easily be + mistaken for the complete file unless you change the default back to + DISCARD or read the screen messages, or keep a transaction log. + + 10.7. Filename Collisions + + SET FILE COLLISION BACKUP is the default. This means: + + * If you send the same file lots of times, there will be many backup + files. There is no automatic mechanism within Kermit to delete + them, no notion of a "version retention count", etc, but you can + use the PURGE command to clean them up. + * If a file arrives that has the same name as a directory, the file + transfer fails because Kermit will not rename a directory. Send + the file with another name, or use SET FILE COLLISION RENAME. + * If the directory lacks write permission, the file transfer fails + even if you have write access to the file that is being backed up; + in that case, switch to SET FILE COLLISION OVERWRITE or APPEND, or + send to a different directory. + + SET FILE COLLISION UPDATE depends on the date/time stamp in the + attribute packet. However, this is recorded in local time, not + Universal Time (GMT), and there is no indication of time zone. The + time is expressed to the precision of 1 second, but some file systems + do not record with this precision -- for example, MS-DOS records the + file date/time only to the nearest 2 seconds. This might cause update + operations to send more files than necessary. + + (This paragraph does NOT apply to UNIX, where, as of C-Kermit 7.0, + C-Kermit pipes incoming mail and print material directly the mail or + print program): When C-Kermit is receiving files from another Kermit + program that has been given the MAIL or REMOTE PRINT command, C-Kermit + follows the current filename collision action. This can be + disconcerting if the action was (for example) BACKUP, because the + existing file will be renamed, and the new file will be mailed (or + printed) and then deleted. Kermit cannot temporarily change to RENAME + because the file collision action occurs when the filename packet is + received, and the PRINT or MAIL disposition only comes later, in the + Attribute packet. + + Watch out for SET FILE COLLISION RENAME, especially when used in + conjunction with recovery. Recall that this option (which is NOT the + default) renames the incoming file if a file already exists with the + same name (the default is to rename the previously existing file, and + store the incoming file with its own name). It is strongly recommended + that you do not use SET FILE COLLISION RENAME if you ever intend to + use the recovery feature: + + * When the file is first received by C-Kermit, its name is changed + if another file already has the same name. When you RESEND the + same file after a failure, C-Kermit will probably try to append + the re-sent portion to the wrong file. + * Assuming that you get RESEND to work with FILE COLLISION RENAME, + C-Kermit, when receiving the remainder of the file during a RESEND + operation, will report back the wrong name. Nothing can be done + about this because the name is reported back before the receiving + Kermit program finds out that it is a recovery operation. + + Also watch out for DISABLE DELETE, since this implicitly sets FILE + COLLISION to RENAME. And note tht DELETE is DISABLEd automatically any + time you Kermit is in local mode (i.e. it makes a connection). Also + note that for purposes of DISABLE and ENABLE, "set host *" connections + do not count as local mode even though, strictly speaking, they are. + + 10.8. DOS Pathnames + + When referring to foreign MS-DOS, Windows, Atari ST, OS/2, or other + file specifications that contain backslash characters in a C-Kermit + command, you might have to double each backslash, for example: + + C-Kermit>get c:\\directory\\foo.txt + + This is because backslash is used in C-Kermit commands for introducing + special character codes, variables, functions, etc. + + 10.9. Cancellation + + If attempting to cancel local-mode file reception at a very early + stage (i.e. before data packets are exchanged) with X or Z does not + work, use E or Ctrl-C instead, or wait until the first data packets + are sent. + + If you cancel a transfer that is underway using X or Z, and a lot of + window slots are in use, it might take a while for the cancellation to + take effect, especially if you do this on the receiving end; that's + because a lot of packets might already be on their way to you. In that + case, just be patient and let Kermit "drain" them. + + If C-Kermit is sending a file, remote-mode packet-mode breakout (three + consecutive Ctrl-C's by default) is not effective until after C-Kermit + sends its first packet. If C-Kermit is receiving a file or is in + server mode, it is effective right away. In the former case, the SET + DELAY value determines the earliest time at which you can break out of + packet mode. + + 10.10. Partner Peculiarities + + When one or both partners is on an SCO operating system such as OSR5, + you might issue the command: + +mapchan -n + + to disable character-set conversion by the terminal driver. Similarly + for AIX: + +setmaps -t NOMAP + + When using C-Kermit to transfer files with the HP48SX calculator, you + must SET FLOW NONE. The HP48SX does not support flow control, and + evidently also becomes confused if you attempt to use it. You might + also need to use SET SEND PAUSE 100 (or other number). For greater + detail about transferring files the the HP-48, see: + + [75]http://www.columbia.edu/kermit/hp48.html + + Some communication programs have errors in their implementation of + Kermit attribute packets. If you get an error message from your + communication program like "Attribute error", tell C-Kermit to SET + ATTRIBUTES OFF. Better yet, switch to a real Kermit program. + + Some communication software claims to implement Kermit sliding + windows, but does so incorrectly. If sliding window transfers fail, + set C-Kermit's window size to the smallest one that works, for + example, SET WINDOW 1. + + For lots more detail about how to cope with defective Kermit partners, + see: + + * [76]Coping with Faulty Kermit Implementations (C-Kermit 7.0 and + later). + * [77]Coping with Broken Kermit Partners (C-Kermit 8.0 and later). + + The UNIX version of C-Kermit discards carriage returns when receiving + files in text mode. Thus, "bare" carriage returns (sometimes used to + achieve overstriking) are lost. + ________________________________________________________________________ + + 11. SCRIPT PROGRAMMING + + [ [78]Top ] [ [79]Contents ] [ [80]Previous ] + + 11.1. Comments Versus the SCRIPT Command + + Remember that ";" and "#" introduce comments when (a) they are the + first character on the line, or (b) they are preceded by at least one + blank or tab within a line. Thus constructions like: + + INPUT 5 ; + SCRIPT ~0 #--#--# + + must be coded using backslash notation to keep the data from being + ignored: + + INPUT 5 \59 ; 59 is the decimal ASCII code for ";" + SCRIPT ~0 \35--#--# ; 43 is the decimal ASCII code for "#" + + or, more simply: + + INPUT 5 \; ; Just quote the semicolon + SCRIPT ~0 \#--#--# ; Just quote the "#" + ________________________________________________________________________ + + 11.2. Alphabetic Case and the INPUT Command + + INPUT and MINPUT caseless string comparisons do not work for non-ASCII + (international) characters. Workaround: SET INPUT CASE OBSERVE. Even + then, the "lexically less than" and "lexically greater than" + operations (IF LLT, IF LGT) probably won't work as expected. The same + is true for the case-conversion functions \Flower() and \Fupper(). + C-Kermit does not know the collating sequence for different character + sets and languages. (On the other hand, it might work depending on + such items as how Kermit was linked, whether your operating supports + "locales", etc) + ________________________________________________________________________ + + 11.3. NUL (0) Characters in C-Kermit Commands + + You can't include a NUL character (\0) in C-Kermit command text + without terminating the character string in which it appears. For + example: + + echo In these brackets [\0] is a NUL + + will echo "In these brackets [". This applies to ECHO, INPUT, OUTPUT, + and all other commands (but you can represent NUL by "\N" in an OUTPUT + string). This is because C-language strings are terminated internally + by the NUL character, and it allows all of C-Kermit's string + comparison and manipulation functions to work in the normal "C" way. + + To illustrate: + + INPUT 5 \0 + + is equivalent to: + + INPUT 5 + + and: + + INPUT 5 ABC\0DEF + + is equivalent to: + + INPUT 5 ABC + + INPUT operations discard and ignore NUL characters that arrive from + the communication device, meaning that they do not figure into + matching operations (e.g. AB matches AB); they are not deposited + in the INPUT buffer (\v(input)); and they are not counted in + \v(incount), with two exceptions: + + 1. An arriving NUL character restarts the INPUT SILENCE timer. + 2. An arriving NUL character terminates the INPUT command with the + SUCCESS condition if the INPUT command was given an empty search + string. In this case \v(incount) is set to 1. + + Also, the \v(inchar) variable is null (completely empty) if the last + INPUT character was NUL. That is, there is no way to tell only by + looking at \v(inchar) the difference between a NUL that was INPUT and + no INPUT at all. If the INPUT command succeeded but \v(inchar) is + empty, then a NUL character was input. Also, \v(incount) will be set + to 1. + + Here's a sample script fragment to read characters, possibly including + NUL, from the communication connection and write them to a file: + + while true { + input 1 ; read one byte + if fail break ; timed out or connection closed + fwrite /char \%c \v(inchar) ; record the byte + } + + This works because when \v(inchar) is NUL, that's equivalent to FWRITE + /CHAR having no text argument at all, in which case it writes a NUL + character. + + \v(incount) and \v(inchar) are NOT affected by the CLEAR command. + ________________________________________________________________________ + + 11.4. \ffiles() and \fnextfile() Peculiarities + + The following script program: + + for \%i 1 \ffiles(oofa.*) 1 { + send \fnextfile() + } + + did not work as expected in C-Kermit 6.0 and earlier but does work in + C-Kermit 7.0 and later. + ________________________________________________________________________ + + 11.5. Commands That Have Only Local Effect + + Certain settings are local to each command level, meaning that + subordinate command levels (macros or command files) can change them + without affecting their values at higher command levels. When a new + command level is invoked, the value is inherited from the previous + level. These settings are: + + CASE + COUNT and \v(count) + INPUT CASE + INPUT TIMEOUT + MACRO ERROR + QUIET + TAKE ERROR + + This arrangement allows CASE, TIMEOUT, and ERROR settings, which are + used to control automatic exit from a command file or macro upon + error, to be automatically restored when the command file or macro + exits. + + The COUNT variable follows this rule too, which permits nested SET + COUNT / IF COUNT loops, as in this example in which the inner loop + counts down from the current COUNT value of the outer loop (try it): + + DEFINE INNER WHILE COUNT { WRITE SCREEN { Inner:}, SHOW COUNT } + SET COUNT 5 + WHILE COUNT { WRITE SCREEN Outer:, SHOW COUNT, DO INNER } + + Keep in mind that an inferior command level cannot manipulate the + COUNT value held by a higher level. For example: + + DEFINE OOFA SHOW COUNT, IF COUNT GOTO LOOP + SET COUNT 5 + :LOOP + OOFA + ECHO Done + + results in an infinite loop; the COUNT value remains at 5 because it + is never decremented at the same level at which it was set. + ________________________________________________________________________ + + 11.6. Literal Braces in Function Calls + + Since braces are used in function calls to indicate grouping, there is + no way to pass literal braces to the function itself. Solution: Define + a variable containing the string that has braces. Example: + + define \%a ab{cd + echo \fsubstring(\%a) + ab{cd + + If the string is to start with a leading brace and end with a closing + brace, then double braces must appear around the string (which itself + is enclosed in braces): + + define \%a {{{foo}}} + echo \fsubstring(\%a) + {foo} + + This also works for any other kind of string: + + define \%a {{ab{cd}} + echo \fsubstring(\%a) + ab{cd + ________________________________________________________________________ + + 11.7. Defining Variables on the C-Kermit Command Line + + To define variables on the C-Kermit command line, use the -C + command-line option with one or more DEFINE or ASSIGN commands. Note + that the C-Kermit command line must cope with the quoting rules of + your shell. Examples: + + kermit -C "define \\%a foo, define phonenumber 7654321" + + In this case we follow UNIX quoting rules by doubling the backslash. + Once C-Kermit starts, the \%a and \m(phonenumber) variables are + defined as indicated and can be used in the normal way. + + In DOS or Windows or OS/2 the command would be: + + kermit -C "define \%%a foo, define phonenumber 7654321" + + Here we need to double the percent sign rather than the backslash + because of DOS shell quoting rules. + ________________________________________________________________________ + + 11.8. Per-Character Echo Check with the OUTPUT Command + + Sometimes the OUTPUT command must be used to send commands or data to + a device in "echoplex" mode, meaning that characters must be sent one + at a time, and the next character can not be sent until the echo from + the previous one has been received. For example, a certain PBX might + have this characteristic. Let's say a Kermit script is used to program + the PBX. If characters are sent too fast, they can be lost. It would + seem that the command: + + SET OUTPUT PACING milliseconds + + could be used to take care of this, but the pacing interval is + constant and must be set large enough to allow even the slowest echo + to finish. If the script is large (an actual example is 14,000 lines + long), this can cause it to take hours longer than it needs to. + + Here is a macro you can use to OUTPUT a string in an Echoplex + environment: + + define XOUTPUT { + local \%c \%i + set output pacing 0 + for \%i 1 \flen(\%*) 1 { + asg \%c \fsubstr(\%*,\%i,1) + output \%c + input 2 \%c + } + } + + C-Kermit 7.0 or later is required. + + It sends one character at a time and then waits up to 2 seconds for + the character to be echoed back, but continues to the next character + as soon as the echo appears, so no time is wasted. You can add an IF + FAIL clause after the INPUT in case you want to do something special + about failure to detect an echo within the timeout period. Obviously + you can also change the 2-second limit, and adjust the script in any + other desired way. + ________________________________________________________________________ + + 11.9. Scripted File Transfer + + Sometimes a user complains that when she makes a connection by hand, + logs in, and transfers a file, there are no problems, but when she + scripts the the exact same sequence, the file transfer always fails + after a few packets. Here's a scenario where this can happen: + + 1. Upon logging in to the remote computer, it sends a "What Are You?" + escape sequence. + 2. When you log in interactively, your terminal emulator sends the + response. This is invisible to you; you don't know it's happening. + 3. When you script the login, and begin a file transfer immediately + upon logging in, the host still sends the "What Are You?" + sequence. Kermit's INPUT ECHO setting is ON by default, so the + escape sequence passes through to the terminal, and the terminal + sends its response. But by this time Kermit has already started + the file transfer. + 4. By default, the local Kermit program examines the keyboard for + interruption characters between every packet. The "What Are You" + response is sitting in the keyboard buffer. Eventually Kermit will + read a character such as "c" that is a valid interruption + character, and the file transfer stops with "User cancelled". + + The right way to handle this situation is to have your look for the + "What Are You?" sequence and send the response itself, as described in + Using C-Kermit, pp.429-431. Or you can work around it by telling the + local Kermit to "set input echo off" and/or "set transfer interruption + off". + ________________________________________________________________________ + + 11.10. Other... + + Escape sequences (or any strings that contain control characters) + can't be used as labels, GOTO targets, or SWITCH cases. + + [ [81]Top ] [ [82]Contents ] [ [83]C-Kermit Home ] [ [84]C-Kermit 8.0 + Overview ] [ [85]Kermit Home ] + _________________________________________________________________ + + C-Kermit 8.0 Unix Hints and Tips / [86]The Kermit Project / + [87]Columbia University / [88]kermit@columbia.edu / 10 April 2004 + +References + + 1. http://www.columbia.edu/kermit/ + 2. http://www.columbia.edu/ + 3. http://www.columbia.edu/kermit/ckcbwr.html + 4. http://www.columbia.edu/kermit/ckubwr.html + 5. http://www.columbia.edu/kermit/k95.html + 6. http://www.columbia.edu/kermit/ckermit.html + 7. http://www.columbia.edu/kermit/ckututor.html + 8. http://www.columbia.edu/kermit/ckcbwr.html#x0 + 9. http://www.columbia.edu/kermit/ckcbwr.html#x1 + 10. http://www.columbia.edu/kermit/ckcbwr.html#x2 + 11. http://www.columbia.edu/kermit/ckcbwr.html#x3 + 12. http://www.columbia.edu/kermit/ckcbwr.html#x4 + 13. http://www.columbia.edu/kermit/ckcbwr.html#x5 + 14. http://www.columbia.edu/kermit/ckcbwr.html#x6 + 15. http://www.columbia.edu/kermit/ckcbwr.html#x7 + 16. http://www.columbia.edu/kermit/ckcbwr.html#x8 + 17. http://www.columbia.edu/kermit/ckcbwr.html#x9 + 18. http://www.columbia.edu/kermit/ckcbwr.html#x10 + 19. http://www.columbia.edu/kermit/ckcbwr.html#x11 + 20. http://www.columbia.edu/kermit/ckcbwr.html#top + 21. http://www.columbia.edu/kermit/ckcbwr.html#contents + 22. http://www.columbia.edu/kermit/ckcbwr.html#x2 + 23. http://www.columbia.edu/kermit/ckcbwr.html#top + 24. http://www.columbia.edu/kermit/ckcbwr.html#contents + 25. http://www.columbia.edu/kermit/ckcbwr.html#x2 + 26. http://www.columbia.edu/kermit/ck60manual.html + 27. http://www.columbia.edu/kermit/ckermit2.html + 28. http://www.columbia.edu/kermit/ck60manual.html + 29. http://www.columbia.edu/kermit/ckermit80.html#x5 + 30. http://www.columbia.edu/kermit/ckermit80.html + 31. http://www.columbia.edu/kermit/ckermit80.html#x2.2 + 32. http://www.columbia.edu/kermit/ckcbwr.html#top + 33. http://www.columbia.edu/kermit/ckcbwr.html#contents + 34. http://www.columbia.edu/kermit/ckcbwr.html#x3 + 35. http://www.columbia.edu/kermit/ckcbwr.html#x1 + 36. http://www.columbia.edu/kermit/ckcbwr.html#top + 37. http://www.columbia.edu/kermit/ckcbwr.html#contents + 38. http://www.columbia.edu/kermit/ckcbwr.html#x4 + 39. http://www.columbia.edu/kermit/ckcbwr.html#x2 + 40. http://www.columbia.edu/kermit/ckcbwr.html#top + 41. http://www.columbia.edu/kermit/ckcbwr.html#contents + 42. http://www.columbia.edu/kermit/ckcbwr.html#x5 + 43. http://www.columbia.edu/kermit/ckcbwr.html#x3 + 44. ftp://ftp.isi.edu/in-notes/rfc1122.txt + 45. http://www.columbia.edu/kermit/ckcbwr.html#top + 46. http://www.columbia.edu/kermit/ckcbwr.html#contents + 47. http://www.columbia.edu/kermit/ckcbwr.html#x6 + 48. http://www.columbia.edu/kermit/ckcbwr.html#x4 + 49. http://www.columbia.edu/kermit/ckcbwr.html#top + 50. http://www.columbia.edu/kermit/ckcbwr.html#contents + 51. http://www.columbia.edu/kermit/ckcbwr.html#x7 + 52. http://www.columbia.edu/kermit/ckcbwr.html#x5 + 53. http://www.columbia.edu/kermit/ck60manual.html + 54. http://www.columbia.edu/kermit/ckcbwr.html#x10 + 55. http://www.columbia.edu/kermit/ckcbwr.html#top + 56. http://www.columbia.edu/kermit/ckcbwr.html#contents + 57. http://www.columbia.edu/kermit/ckcbwr.html#x8 + 58. http://www.columbia.edu/kermit/ckcbwr.html#x6 + 59. ftp://ftp.isi.edu/in-notes/rfc2217.txt + 60. http://www.columbia.edu/kermit/ckcbwr.html#top + 61. http://www.columbia.edu/kermit/ckcbwr.html#contents + 62. http://www.columbia.edu/kermit/ckcbwr.html#x9 + 63. http://www.columbia.edu/kermit/ckcbwr.html#x7 + 64. http://www.columbia.edu/kermit/ckcbwr.html#top + 65. http://www.columbia.edu/kermit/ckcbwr.html#contents + 66. http://www.columbia.edu/kermit/ckcbwr.html#x10 + 67. http://www.columbia.edu/kermit/ckcbwr.html#x8 + 68. http://www.columbia.edu/kermit/ckubwr.html + 69. http://www.columbia.edu/kermit/ckcbwr.html#top + 70. http://www.columbia.edu/kermit/ckcbwr.html#contents + 71. http://www.columbia.edu/kermit/ckcbwr.html#x11 + 72. http://www.columbia.edu/kermit/ckcbwr.html#x9 + 73. http://www.columbia.edu/kermit/ck60manual.html + 74. http://www.columbia.edu/kermit/ckermi70.htm + 75. http://www.columbia.edu/kermit/hp48.html + 76. http://www.columbia.edu/kermit/ckermit70.html#x4.22 + 77. http://www.columbia.edu/kermit/ckermit80.html#x15 + 78. http://www.columbia.edu/kermit/ckcbwr.html#top + 79. http://www.columbia.edu/kermit/ckcbwr.html#contents + 80. http://www.columbia.edu/kermit/ckcbwr.html#x10 + 81. http://www.columbia.edu/kermit/ckcbwr.html#top + 82. http://www.columbia.edu/kermit/ckcbwr.html#contents + 83. http://www.columbia.edu/kermit/ckermit.html + 84. http://www.columbia.edu/kermit/ck80.html + 85. http://www.columbia.edu/kermit/index.html + 86. http://www.columbia.edu/kermit/index.html + 87. http://www.columbia.edu/ + 88. mailto:kermit@columbia.edu diff --git a/ckccfg.txt b/ckccfg.txt new file mode 100644 index 0000000..5870974 --- /dev/null +++ b/ckccfg.txt @@ -0,0 +1,1766 @@ + + C-Kermit Configuration Options + + Frank da Cruz + [1]The Kermit Project + [2]Columbia University + + As of: C-Kermit 8.0.211, 10 April 2004 + This page last updated: Sun Apr 11 16:45:55 2004 (New York USA Time) + + IF YOU ARE READING A PLAIN-TEXT version of this document, note that + this file is a plain-text dump of a Web page. You can visit the + original (and possibly more up-to-date) Web page here: + + [3]http://www.columbia.edu/kermit/ckccfg.html + + [ [4]C-Kermit Home ] [ [5]Kermit Home ] + ________________________________________________________________________ + + CONTENTS + + 1. [6]FILE TRANSFER + 2. [7]SERIAL COMMUNICATION SPEEDS + 3. [8]FULLSCREEN FILE TRANSFER DISPLAY + 4. [9]CHARACTER SETS + 5. [10]APC EXECUTION + 6. [11]PROGRAM SIZE + 7. [12]MODEM DIALING + 8. [13]NETWORK SUPPORT + 9. [14]EXCEPTION HANDLING + 10. [15]SECURITY FEATURES + 11. [16]ENABLING SELECT() + 12. [17]I/O REDIRECTION + 13. [18]FLOATING-POINT NUMBERS, TIMERS, AND ARITHMETIC + 14. [19]SPECIAL CONFIGURATIONS + I. [20]SUMMARY OF COMPILE-TIME OPTIONS + ________________________________________________________________________ + + OVERVIEW + + This document describes configuration options for C-Kermit (5A and + later). The major topics covered include program size (and how to + reduce it), how to include or exclude particular features, notes on + serial-port, modem, and network support, and a list of C-Kermit's + compile-time options. + + For details about your particular operating system, also see the + system-specific installation instructions file, such as the + [21]C-Kermit Installation Instructions for Unix. + + [ [22]C-Kermit Home ] [ [23]Kermit Home ] + ________________________________________________________________________ + + 1. FILE TRANSFER + + [ [24]Top ] [ [25]Contents ] [ [26]Next ] [ [27]Previous ] + + Prior to version 7.0, C-Kermit was always built with the most + conservative Kermit file-transfer protocol defaults on every platform: + no control-character prefixing, 94-byte packets, and a window size of + 1. + + Starting in version 7.0, fast settings are the default. To override + these at compile time, include: + + -DNOFAST + + in the C compiler CFLAGS. Even with the fast defaults, C-Kermit + automatically drops down to whatever window and packet sizes requested + by the other Kermit, if these are smaller, when sending files (except + for control-character unprefixing, which is not negotiated, and which + is now set to CAUTIOUS rather than NONE at startup). C-Kermit's + settings prevail when it is receiving. + + [ [28]C-Kermit Home ] [ [29]Kermit Home ] + ________________________________________________________________________ + + 2. SERIAL COMMUNICATION SPEEDS + + [ [30]Top ] [ [31]Contents ] [ [32]Next ] [ [33]Previous ] + + As of 6 September 1997, a new simplified mechanism for obtaining the + list of legal serial interface speeds is in place: + + * If the symbol TTSPDLIST is defined, the system-dependent routine + ttspdlist() is called at program initialization to obtain the + list. + * This symbol should be defined only for C-Kermit implementations + that have implemented the ttspdlist() function, typically in the + ck?tio.c module. See [34]ckutio.c for an example. + * TTSPDLIST is automatically defined in [35]ckcdeb.h for UNIX. Add + the appropriate #ifdefs for other platforms when the corresponding + ttspdlist() functions are filled in. + * If TTSPDLIST is (or normally would be) defined, the old code + (described below) can still be selected by defining NOTTSPDLIST. + + The ttspdlist() function can obtain the speeds in any way that works. + For example, based simply on #ifdef Bnnnn..#endif (in UNIX). Although + it might be better to actually check each speed against the currently + selected hardware interface before allowing it in the array, there is + usually no passive and/or reliable and safe way to do this, and so + it's better to let some speeds into the array that might not work, + than it is to erroneously exclude others. Speeds that don't work are + caught when the SET SPEED command is actually given. + + Note that this scheme does not necessarily rule out split speed + operation, but effectively it does in C-Kermit as presently + constituted since there are no commands to set input and output speed + separately (except the special case "set speed 75/1200"). + + Note that some platforms, notably AIX 4.2 and 4.3, implement high + serial speeds transparently to the application, e.g. by mapping 50 bps + to 57600 bps, and so on. + + That's the whole deal. When TTSPDLIST is not defined, the following + applies: + + Speeds are defined in two places: the SET SPEED keyword list in the + command parser (as of this writing, in the [36]ckuus3.c source file), + and in the system- dependent communications i/o module, ck?tio.c, + functions ttsspd() (set speed) and ttgspd() (get speed). The following + speeds are assumed to be available in all versions: + + 0, 110, 300, 600, 1200, 2400, 4800, 9600 + + If one or more of these speeds is not supported by your system, you'll + need to change the source code (this has never happened so far). Other + speeds that are not common to all systems have Kermit-specific + symbols: + + Symbol Symbol + Speed (bps) to enable to disable + 50 BPS_50 NOB_50 + 75 BPS_75 NOB_75 + 75/1200 BPS_7512 NOB_7512 + 134.5 BPS_134 NOB_134 + 150 BPS_150 NOB_150 + 200 BPS_200 NOB_200 + 1800 BPS_1800 NOB_1800 + 3600 BPS_3600 NOB_3600 + 7200 BPS_7200 NOB_7200 + 14400 BPS_14K NOB_14K + 19200 BPS_19K NOB_19K + 28800 BPS_28K NOB_28K + 38400 BPS_38K NOB_38K + 57600 BPS_57K NOB_57K + 76800 BPS_76K NOB_76K + 115200 BPS_115K NOB_155K + 230400 BPS_230K NOB_230K + 460800 BPS_460K NOB_460K + 921600 BPS_921K NOB_921K + + The [37]ckcdeb.h header file contains default speed configurations for + the many systems that C-Kermit supports. You can override these + defaults by (a) editing ckcdeb.h, or (b) defining the appropriate + enabling and/or disabling symbols on the CC command line, for example: + + -DBPS_14400 -DNOB_115200 + + or the "make" command line, e.g.: + + make blah "KFLAGS=-DBPS_14400 -DNOB_115200" + + Note: some speeds have no symbols defined for them, because they have + never been needed: 12.5bps, 45.5bps, 20000bps, etc. These can easily + be added if required (but they will work only if the OS supports + them). + + IMPORTANT: Adding one of these flags at compile time does not + necessarily mean that you will be able to use that speed. A particular + speed is usable only if your underlying operating system supports it. + In particular, it needs to be defined in the appropriate system header + file (e.g. in UNIX, cd to /usr/include and grep for B9600 in *.h and + sys/*.h to find the header file that contains the definitions for the + supported speeds), and supported by the serial device driver, and of + course by the physical device itself. + + ALSO IMPORTANT: The list of available speeds is independent of how + they are set. The many UNIXes, for example, offer a wide variety of + APIs that are BSD-based, SYSV-based, POSIX-based, and purely made up. + See the ttsspd(), ttgspd(), and ttspdlist() routines in [38]ckutio.c + for illustrations. + + The latest entries in this horserace are the tcgetspeed() and + ttsetspeed() routines found in UnixWare 7. Unlike other methods, they + accept the entire range of integers (longs really) as speed values, + rather than certain codes, and return an error if the number is not, + in fact, a legal speed for the device/driver in question. In this + case, there is no way to build a list of legal speeds at compile time, + since no Bnnnn symbols are defined (except for "depracated, legacy" + interfaces like ioctl()) and so the legal speed list must be + enumerated in the code -- see ttspdlist() in [39]ckutio.c. + + [ [40]C-Kermit Home ] [ [41]Kermit Home ] + ________________________________________________________________________ + + 3. FULLSCREEN FILE TRANSFER DISPLAY + + [ [42]Top ] [ [43]Contents ] [ [44]Next ] [ [45]Previous ] + + New to edit 180 is support for an MS-DOS-Kermit-like local-mode full + screen file transfer display, accomplished using the curses library, + or something equivalent (for example, the Screen Manager on DEC VMS). + To enable this feature, include the following in your CFLAGS: + + -DCK_CURSES + + and then change your build procedure (if necessary) to include the + necessary libraries. For example, in Unix these are usually "curses" + or "ncurses" (and more recenlty, "ncursesw" and "slang"), perhaps also + "termcap", "termlib", or "tinfo": + + "LIBS= -lcurses -ltermcap" + "LIBS= -lcurses -ltermlib" + "LIBS= -lncurses" + "LIBS= -ltermlib" + "LIBS= -ltinfo" + + "man curses" for further information, and search through the Unix + [46]makefile for "CK_CURSES" to see many examples, and also see the + relevant sections of the [47]Unix C-Kermit Installation Instructions, + particularly Sections [48]4 and [49]9.2. + + There might still be a complication. Some implementations of curses + reserve the right to alter the buffering on the output file without + restoring it afterwards, which can leave Kermit's command processing + in a mess when the prompt comes back after a fullscreen file transfer + display. The typical symptom is that characters you type at the prompt + after a local-mode file transfer (i.e. after seeing the curses + file-transfer display) do not echo until you press the Return (Enter) + key. If this happens to you, try adding + + -DCK_NEWTERM + + to your makefile target (see comments in screenc() in [50]ckuusx.c for + an explanation). + + If that doesn't fix the problem, then use a bigger hammer and replace + -DCK_NEWTERM with: + + -DNONOSETBUF + + which tells Kermit to force stdout to be unbuffered so CBREAK mode can + work. + + In SCO Xenix and SCO UNIX, there are two separate curses libraries, + one based on termcap and the other based on terminfo. The default + library, usually terminfo, is established when the development system + is installed. To manually select terminfo (at compile time): + + compile -DM_TERMINFO and link -ltinfo + + and to manually select termcap: + + compile -DM_TERMCAP and link -ltcap -ltermlib + + looks at M_TERMINFO and M_TERMCAP to decide which header + files to use. /usr/lib/libcurses.a is a link to either libtinfo.a or + libtcap.a. The C-Kermit compilation options must agree with the + version of the curses library that is actually installed. + + NOTE: If you are doing an ANSI-C compilation and you get compile time + warnings like the following: + + Warning: function not declared in ckuusx.c: wmove, printw, wclrtoeol, + wclear, wrefresh, endwin, etc... + + it means that your file does not contain prototypes for + these functions. The warnings should be harmless. + + New to edit 190 is the ability to refresh a messed-up full-screen + display, e.g. after receiving a broadcast message. This depends on the + curses package including the wrefresh() and clearok() functions and + the curscr variable. If your version has these, or has code to + simulate them, then add: + + -DCK_WREFRESH + + The curses and termcap libraries add considerable size to the program + image (e.g. about 20K on a SUN-4, 40K on a 386). On some small + systems, such as the AT&T 6300 PLUS, curses can push Kermit over the + edge... even though it compiles, loads, and runs correctly, its + increased size apparently makes it swap constantly, slowing it down to + a crawl, even when the curses display is not in use. Some new makefile + targets have been added to take care of this (e.g. sys3upcshcc), but + similar tricks might be necessary in other cases too. + + On the curses file-transfer display, just below the "thermometer", is + a running display of the transfer rate, as a flat quotient of file + characters per elapsed seconds so far. You can change this to an + average that gives greater weight to recent history (0.25 * + instantaneous cps + 0.75 * historical cps) by adding -DCPS_WEIGHTED to + your CFLAGS (sorry folks, this one is not worth a SET command). You + can choose a second type of weighted average in which the weighting + smooths out progressively as the transfer progresses by adding + -DCPS_VINCE to -DCPS_WEIGHTED. + + An alternative to curses is also available at compile time, but should + be selected if your version of Kermit is to be run in local mode only + in an ANSI terminal environment, for example on a desktop workstation + that has an ANSI console driver. To select this option in place of + curses, define the symbol MYCURSES: + + -DMYCURSES + + instead of CK_CURSES. The MYCURSES option uses built-in ANSI (VT100) + escape sequences, and depends upon your terminal or console driver to + interpret them correctly. + + In some C-Kermit builds, we replace printf() via #define printf... + However, this can cause conflicts with the [n]curses header files. + Various hacks are required to get around this -- see [51]ckutio.c, + [52]ckufio.c, [53]ckuusx.c, [54]ckucmd.c, etc. + + [ [55]C-Kermit Home ] [ [56]Kermit Home ] + ________________________________________________________________________ + + 4. CHARACTER SETS + + [ [57]Top ] [ [58]Contents ] [ [59]Next ] [ [60]Previous ] + + Since version 5A, C-Kermit has included support for conversion of + character sets for Western European languages (i.e. languages that + originated in Western Europe, but are now also spoken in the Western + Hemisphere and other parts of the world), via ISO 8859-1 Latin + Alphabet 1, for Eastern European languages (ISO Latin-2), Hebrew (and + Yiddish), Greek, and Cyrillic-alphabet languages (ISO Latin/Cyrillic). + Many file (local) character sets are supported: ISO 646 7-bit national + sets, IBM code pages, Apple, DEC, DG, NeXT, etc. + + To build Kermit with no character-set translation at all, include + -DNOCSETS in the CFLAGS. To build with no Latin-2, add -DNOLATIN2. To + build with no Cyrillic, add -DNOCYRIL. To omit Hebrew, add -DNOHEBREW. + If -DNOCSETS is *not* included, you'll always get LATIN1. To build + with no KANJI include -DNOKANJI. There is presently no way to include + Latin-2, Cyrillic, Hebrew, or Kanji without also including Latin-1. + + [61]Unicode support was added in C-Kermit 7.0, and it adds a fair + amount of tables and code (and this is only a "Level 1" implementation + -- a higher level would also require building in the entire Unicode + database). On a PC with RH 5.2 Linux, building C-Kermit 7.0, we get + the following sizes: + + NOCSETS NOUNICODE NOKANJI Before After + [ ] [ ] [ ] 1329014 (Full) + [ ] [ ] [ X ] 1325686 (Unicode but no Kanji) + [ ] [ X ] [ ] 1158837 (All charsets except Unicode) + [ X ] [ x ] [ x ] 1090845 (NOCSETS implies the other two) + + Note, by the way, that NOKANJI without NOUNICODE only removes the + non-Unicode Kanji sets (Shift-JIS, EUC-JP, JIS-7, etc). Kanji is still + representable in UCS-2 and UTF-8. + + [ [62]C-Kermit Home ] [ [63]Kermit Home ] + ________________________________________________________________________ + + 5. APC EXECUTION + + [ [64]Top ] [ [65]Contents ] [ [66]Next ] [ [67]Previous ] + + The Kermit CONNECT and INPUT commands are coded to execute Application + Program Command escape sequences from the host: + + _\ + + where is a C-Kermit command, or a list of C-Kermit commands + separated by commas, up to about 1K in length. + + To date, this feature has been included in the OS/2, Windows, VMS, + OS-9, and Unix versions, for which the symbol: + + CK_APC + + is defined automatically in [68]ckuusr.h. For OS/2, APC is enabled at + runtime by default, for UNIX it is disabled. It is controlled by the + SET TERMINAL APC command. Configuring APC capability into a version + that gets it by default (because CK_APC is defined in [69]ckuusr.h) + can be overridden by including: + + -DNOAPC + + on the CC command line. + + C-Kermit's autodownload feature depends on the APC feature, so + deconfiguring APC also disables autodownload (it doesn't use APC + escape sequences, but uses the APC switching mechanism internally). + + [ [70]C-Kermit Home ] [ [71]Kermit Home ] + ________________________________________________________________________ + + 6. PROGRAM SIZE + + [ [72]Top ] [ [73]Contents ] [ [74]Next ] [ [75]Previous ] + + SECTION CONTENTS + + 6.1. [76]Feature Selection + 6.2. [77]Changing Buffer Sizes + 6.3. [78]Other Size-Related Items + 6.4. [79]Space/Time Tradeoffs + + (Also see [80]Section 4) + + Each release of C-Kermit is larger than the last. On some computers + (usually old ones) the size of the program prevents it from being + successfully linked and loaded. On some others (also usually old + ones), it occupies so much memory that it is constantly swapping or + paging. In such cases, you can reduce C-Kermit's size in various ways, + outlined in this section. The following options can cut down on the + program's size at compile time by removing features or changing the + size of storage areas. + + If you are reading this section because all you want is a small, fast, + quick-to-load Kermit file-transfer application for the remote end of + your connection, and the remote end is Unix based, take a look at + G-Kermit: + + [81]http://www.columbia.edu/kermit/gkermit.html + + 6.1. Feature Selection + + Features can be added or removed by defining symbols on the CC (C + compiler) command line. "-D" is the normal CC directive to define a + symbol so, for example, "-DNODEBUG" defines the symbol NODEBUG. Some C + compilers might use different syntax, e.g. "-d NODEBUG" or + "/DEFINE=NODEBUG". For C compilers that do not accept command-line + definitions, you can put the corresponding #define statements in the + file ckcsym.h, for example: + + #define NODEBUG + + The following table shows the savings achieved when building C-Kermit + 8.0 (Beta.04) with selected feature-deselection switches on an + Intel-based PC with Red Hat Linux 7.0 and gcc 2.96. The sizes are for + non-security builds. The fully configured non-security build is + 2127408 bytes. + + Option Size Savings Effect + NOICP 545330 74.4% No Interactive Command Parser (command-line only) + NOLOCAL 1539994 27.6% No making connections. + NOXFER 1551108 27.1% No file transfer. + IKSDONLY 1566608 26.4% Internet Kermit Server only. + NOCSETS 1750097 17.7% No character-set conversion. + NOSPL 1800293 15.4% No Script Programming Language. + NONET 1808575 15.0% No making network connections. + NOUNICODE 1834426 13.8% No Unicode character-set conversion. + NOHELP 1837877 13.6% No built-in help text. + NODEBUG 1891669 11.1% No debug log. + NOFRILLS 1918966 9.8% No "frills". + NOFTP 1972496 7.3% No FTP client. + NODIAL 1984488 6.7% No automatic modem dialing. + NOPUSH 2070184 2.7% No shell access, running external programs, etc. + NOIKSD 2074129 2.5% No Internet Kermit Server capability. + NOHTTP 2082610 2.1% No HTTP client. + NOFLOAT 2091332 1.7% No floating-point arithmetic. + NOCHANNELIO 2095978 1.5% No FOPEN/FREAD/FWRITE/FCLOSE, etc. + MINIDIAL 2098035 1.4% No built-in support for many kinds of modems. + NOSERVER 2098987 1.3% No server mode. + NOSEXP 2105898 1.0% No S-Expressions. + NOPTY 2117743 0.5% No pseudoterminal support. + NORLOGIN 2121089 0.3% No RLOGIN connections. + NOOLDMODEMS 2124038 0.2% No built-in support for old kinds of modems. + NOSSH 2125696 0.1% No SSH command. + + And here are a few combinations + + Options Size Savings Effect + NODEBUG NOICP NOCSETS NOLOCAL 281641 86.7% No debug log, parser, + character sets, or making connections. + NOICP NOCSETS NOLOCAL 376468 82.3% No parser, character sets, or + making connections. + NOICP NOCSETS NONET 427510 79.9% No parser, character sets, or network + connections. + NOSPL NOCSETS 1423784 33.1% No script language, or character sets. + + -DNOFRILLS removes various command synonyms; the following top-level + commands: CLEAR, DELETE, DISABLE, ENABLE, GETOK, MAIL, RENAME, TYPE, + WHO; and the following REMOTE commands: KERMIT, LOGIN, LOGOUT, PRINT, + TYPE, WHO. + + 6.2. Changing Buffer Sizes + + Most modern computers have so much memory that (a) there is no need to + scrimp and save, and (b) C-Kermit, even when fully configured, is + relatively small by today's standards. + + Two major factors affect Kermit's size: feature selection and buffer + sizes. Buffer sizes affect such things as the maximum length for a + Kermit packet, the maximum length for a command, for a macro, for the + name of a macro, etc. Big buffer sizes are used when the following + symbol is defined: + + BIGBUFOK + + as it is by default for most modern platforms (Linux, AIX 4 and 5, + HP-UX 10 and 11, Solaris, etc) in [82]ckuusr.h. If your build does not + get big buffers automatically (SHOW FEATURES tells you), you can + include them by rebuilding with BIGBUFOK defined; e.g. in Unix: + + make xxxx KFLAGS=-DBIGBUFOK + + where xxxx is the makefile target. On the other hand, if you want to + build without big buffers when they normally would be selected, use: + + make xxxx KFLAGS=-DNOBIGBUF + + There are options to control Kermit's packet buffer allocations. The + following symbols are defined in [83]ckcker.h in such a way that you + can override them by redefining them in CFLAGS: + + -DMAXSP=xxxx - Maximum send-packet length. + -DMAXRP=xxxx - Maximum receive-packet length. + -DSBSIZ=xxxx - Total allocation for send-packet buffers. + -DRBSIZ=xxxx - Total allocation for receive-packet buffers. + + The defaults depend on the platform. + + Using dynamic allocation (-DDYNAMIC) reduces storage requirements for + the executable program on disk, and allows more and bigger packets at + runtime. This has proven safe over the years, and now most builds + (e.g. all Unix, VMS, Windows, and OS/2 ones) use dynamic memory + allocation by default. If it causes trouble, however, then omit the + -DDYNAMIC option from CFLAGS, or add -DNODYNAMIC. + + 6.3. Other Size-Related Items + + To make Kermit compile and load successfully, you might have to change + your build procedure to: + + a. Request a larger ("large" or "huge") compilation / code-generation + model. This is needed for 16-bit PC-based UNIX versions (most or + all of which fail to build C-Kermit 7.0 and later anyway). This is + typically done with a -M and/or -F switch (see your cc manual or + man page for details). + b. Some development systems support overlays. If the program is too + big to be built as is, check your loader manual ("man ld") to see + if an overlay feature is available. See the 2.10/2.11 BSD example + in the UNIX makefile. (Actually, as of version 7.0, C-Kermit is + too big to build, period, even with overlays, on 2.xx BSD). + c. Similarly, some small and/or segment-based architectures support + "code mapping", which is similar to overlays (PDP11-based VENIX + 1.0, circa 1984, was an example). See the linker documentation on + the affected platform. + + It is also possible to reduce the size of the executable program file + in several other ways: + + a. Include the -O (optimize) compiler switch if it isn't already + included in your "make" entry (and if it works!). If your compiler + supports higher levels of optimization (e.g. -O2 or higher number, + -Onolimit (HP-UX), etc), try them; the greater the level of + optimization, the longer the compilation and more likely the + compiler will run out of memory. The the latter eventuality, some + compilers also provide command-line options to allocate more + memory for the optimizer, like "-Olimit number" in Ultrix. + b. If your platofrm supports shared libraries, change the make entry + to take advantage of this feature. The way to do this is, of + course, platform dependent; see the NeXT makefile target for an + example. some platforms (like Solaris) do it automatically and + give you no choice. But watch out: executables linked with shared + libraries are less portable than statically linked executables. + c. Strip the program image after building ("man strip" for further + info), or add -s to the LNKFLAGS (UNIX only). This strips the + program of its symbol table and relocation information. + d. Move character strings into a separate file. See the 2.11 BSD + target for an example. + + 6.4. Space/Time Tradeoffs + + There are more than 6000 debug() statements in the program. If you + want to save both space (program size) and time (program execution + time), include -DNODEBUG in the compilation. If you want to include + debugging for tracking down problems, omit -DNODEBUG from the make + entry. But when you include debugging, you have two choices for how + it's done. One definition defines debug() to be a function call; this + is cheap in space but expensive in execution. The other defines debug + as "if (deblog)" and then the function call, to omit the function call + overhead when the debug log is not active. But this adds a lot of + space to the program. Both methods work, take your choice; IFDEBUG is + preferred if memory is not a constraint but the computer is likely to + be slow. The first method is the default, i.e. if nothing is done to + the CFLAGS or in [84]ckcdeb.h (but in some cases, e.g. VMS, it is). To + select the second method, include -DIFDEBUG in the compilation (and + don't include -DNODEBUG). + + [ [85]C-Kermit Home ] [ [86]Kermit Home ] + ________________________________________________________________________ + + 7. MODEM DIALING + + [ [87]Top ] [ [88]Contents ] [ [89]Next ] [ [90]Previous ] + + -DNODIAL removes automatic modem dialing completely, including the + entire [91]ckudia.c module, plus all commands that refer to dialing in + the various ckuus*.c modules. + + -DMINIDIAL leaves the DIAL and related commands (SET/SHOW MODEM, + SET/SHOW DIAL) intact, but removes support for all types of modems + except CCITT, Hayes, Unknown, User-defined, Generic-high-speed, and + None (= Direct). The MINIDIAL option cuts the size of the dial module + approximately in half. Use this option if you have only Hayes or CCITT + modems and don't want to carry the baggage for the other types. + + A compromise between full dialer support and MINIDIAL is obtained by + removing support for "old" modems -- all the strange non-Hayes + compatible 1200 and 2400 bps modems that C-Kermit has been carrying + around since 1985 or so. To remove support for these modems, add + -DNOOLDMODEMS to CFLAGS at compilation time. + + Finally, if you keep support for old modems, you will notice that + their names appear on the "set modem ?" menu. That's because their + names are, by default, "visible". But the list is confusing to the + younger generation, who have only heard of modems from the + V.32bis-and-later era. If you want to be able to use old modems, but + don't want their names cluttering up menus, add this to CFLAGS: + + -DM_OLD=1 + + [ [92]C-Kermit Home ] [ [93]Kermit Home ] + ________________________________________________________________________ + + 8. NETWORK SUPPORT + + [ [94]Top ] [ [95]Contents ] [ [96]Next ] [ [97]Previous ] + + SECTION CONTENTS + + 8.1. [98]TCP/IP + 8.2. [99]X.25 + 8.3. [100]Other Networks + + C-Kermit supports not only serial-port and modem connections, but also + TCP/IP and X.25 network connections. Some versions support other + network types too like DECnet, LAT, NETBIOS, etc. If you define the + following symbol: + + NONET + + then all network support is compiled away. + + 8.1. TCP/IP + + SUBSECTION CONTENTS + + 8.1.1. [101]Firewalls + 8.1.2. [102]Compilation and Linking Problems + 8.1.3. [103]Enabling Host Address Lists + 8.1.4. [104]Enabling Telnet NAWS + 8.1.5. [105]Enabling Incoming TCP/IP Connections + 8.1.6. [106]Disabling SET TCP Options + + C-Kermit's TCP/IP features require the Berkeley sockets library or + equivalent, generally available on any Unix system, as well as in + Windows 9x/NT, OS/2, VMS, AOS/VS, VOS, etc. The TCP/IP support + includes built-in TELNET, FTP, and HTTP protocol. To select TCP/IP + support, include -DTCPSOCKET in your makefile target's CFLAGS, or (in + VMS) the appropriate variant (e.g. -DWOLLONGONG, -DMULTINET, + -DEXCELAN, -DWINTCP, etc). + + The VMS and/or early Unix third-party TCP/IP products are often + incompatible with each other, and sometimes with different versions of + themselves. For example, Wollongong reportedly put header files in + different directories for different UNIX versions: + + * in.h can be in either /usr/include/sys or /user/include/netinet. + * telnet.h can be in either /usr/include/arpa or + /user/include/netinet. + * inet.h can be in either /usr/include/arpa or /user/include/sys. + + In cases like this, use the -I cc command-line option when possible; + otherwise it's better to make links in the file system than it is to + hack up the C-Kermit source code. Suppose, for example, Kermit is + looking for telnet.h in /usr/include/arpa, but on your computer it is + in /usr/include/netinet. Do this (as root, or get the system + administrator to do it): + + cd /usr/include/arpa + ln /usr/include/netinet/telnet.h telnet.h + + ("man ln" for details about links.) + + The network support for TCP/IP and X.25 is in the source files + [107]ckcnet.h, [108]ckctel.c, [109]ckctel.c, [110]ckctel.h, + [111]ckcftp.c, with miscellaneous SHOW commands, etc, in the various + ckuus*.c modules, plus code in the ck*con.c or ckucns.c (CONNECT + command) and several other modules to detect TELNET negotiations, etc. + + Within the TCPSOCKET code, some socket-level controls are included if + TCPSOCKET is defined in the C-Kermit CFLAGS and SOL_SOCKET is defined + in in the system's TCP-related header files, such as . + These are: + + SET TCP KEEPALIVE + SET TCP LINGER + SET TCP RECVBUF + SET TCP SENDBUF + + In addition, if TCP_NODELAY is defined, the following command is also + enabled: + + SET TCP NODELAY (Nagle algorithm) + + See the [112]C-Kermit user documentation for descriptions of these + commands. + + 8.1.1. Firewalls + + There exist various types of firewalls, set up to separate users of an + internal TCP/IP network ("Intranet") from the great wide Internet, but + then to let selected users or services get through after all. + + One firewall method is called SOCKS, in which a proxy server allows + users inside a firewall to access the outside world, based on a + permission list generally stored in a file. SOCKS is enabled in one of + two ways. First, the standard sockets library is modified to handle + the firewall, and then all the client applications are relinked (if + necessary, i.e. if the libraries are not dynamically loaded) with the + modified sockets library. The APIs are all the same, so the + applications do not need to be recoded or recompiled. + + In the other method, the applications must be modified to call + replacement routines, such as Raccept() instead of accept(), Rbind() + instead of bind(), etc, and then linked with a separate SOCKS library. + This second method is accomplished (for SOCKS4) in C-Kermit by + including -DCK_SOCKS in your CFLAGS, and also adding: + + -lsocks + + to LIBS, or replacing -lsockets with -lsocks (depending on whether the + socks library also includes all the sockets entry points). + + For SOCKS5, use -DCK_SOCKS5. + + Explicit firewall support can, in general, not be a standard feature + or a feature that is selected at runtime, because the SOCKS library + tends to be different at each site -- local modifications abound. + + The ideal situation occurs when firewalls are supported by the first + method, using dynamically linked sockets-replacement libraries; in + this case, all your TCP/IP client applications negotiate the firewall + transparently. + + 8.1.2. Compilation and Linking Problems + + If you get a compilation error in [113]ckcnet.c, with a complaint like + "incompatible types in assignment", it probably has something to do + with the data type your system uses for the inet_addr() function, + which is declared (usually) in . Kermit uses "unsigned + long" unless the symbol INADDRX is defined, in which case "struct + inaddr" is used instead. Try adding -DINADDRX to CFLAGS in your make + entry, and if that fixes the problem, please send a report to + kermit@columbia.edu. + + Compilation errors might also have to do with the data type used for + getsockopt() and setsockopt() option-length field. This is normally an + int, but sometimes it's a short, a long, or an unsigned any of those, + or a size_t. To fix the compilation problem, add -DSOCKOPT_T=xxx to + the CFLAGS in your makefile target, where xxx is the appropriate type + (use "man getsockopt" or grep through your system/network header files + to find the needed type). + + 8.1.3. Enabling Host Address Lists + + When you give Kermit an IP host name, it calls the socket routine + gethostbyname() to resolve it. gethostbyname() returns a hostent + struct, which might or might not not include a list of addresses; if + it does, then if the first one fails, Kermit can try the second one, + and so on. However, this will only work if the symbol "h_addr" is a + macro defined as "h_addr_list[0]", usually in netdb.h. If it is, then + you can activate this feature by defining the following symbol in + CFLAGS: + + HADDRLIST + + 8.1.4. Enabling Telnet NAWS + + The Telnet Negotiation About Window Size (NAWS) option requires the + ability to find out the terminal screen's dimensions. E.g. in Unix, we + need something like ioctl(0, TIOCGWINSZ, ...). If your version of + Kermit was built with NAWS capability, SHOW VERSIONS includes CK_NAWS + among the compiler options. If it doesn't, you can add it by defining + CK_NAWS at compile time. Then, if the compiler or linker complain + about undefined or missing symbols, or there is no complaint but SHOW + TERMINAL fails to show reasonable "Rows =, Columns =" values, then + take a look at (or write) the appropriate ttgwsiz() routine. On the + other hand, if CK_NAWS is defined by default for your system (in + [114]ckcnet.h), but causes trouble, you can override this definition + by including the -DNONAWS switch on your CC command line, thus + disabling the NAWS feature. + + This appears to be needed at least on the AT&T 3B2, where in + [115]ckutio.c, the routine ttgwsiz() finds that the TIOCGWINSZ symbol + is defined but lacks definitions for the corresponding winsize struct + and its members ws_col and ws_row. + + The UNIX version of C-Kermit also traps SIGWINCH, so it can send a + NAWS to the Telnet server any time the local console terminal window + size changes, e.g. when you stretch it with a mouse. The + SIGWINCH-trapping code is enabled if SIGWINCH is defined (i.e. in + signal.h). If this code should cause problems, you can disable it + without disabling the NAWS feature altogether, by defining NOSIGWINCH + at compile time. + + 8.1.5. Enabling Incoming TCP/IP Connections + + This feature lets you "set host * port" and wait for an incoming + connection on the given port. This feature is enabled automatically at + compile if TCPSOCKET is defined and SELECT is also defined. But watch + out, simply defining SELECT on the cc command line does not guarantee + successful compilation or linking (see [116]Section 11). + + If you want to disable incoming TCP/IP connections, then build + C-Kermit with: + + -DNOLISTEN + + 8.1.6. Disabling SET TCP Options + + The main reason for this is because of header file / prototype + conflicts at compile time regardting get- / setsockopt(). If you can't + fix them (without breaking other builds), add the following in CFLAGS: + + -DNOTCPOPTS + + 8.2. X.25 + + X.25 support requires (a) a Sun, (b) the SunLink product (libraries + and header files), and (c) an X.25 connection into your Sun. Similarly + (in C-Kermit 7.0 or later) Stratus VOS and IBM AIX. + + In UNIX, special makefile targets sunos4x25 and sunos41x25 (for SUNOS + 4.0 and 4.1, respectively), or aix41x25, are provided to build in this + feature, but they only work if conditions (a)-(c) are met. To request + this feature, include -DSUNX25 (or -DIBMX25) in CFLAGS. + + SUNX25 (or -DIBMX25) and TCPSOCKET can be freely mixed and matched, + and selected by the user at runtime with the SET NETWORK TYPE command + or SET HOST switches. + + 8.3. Other Networks + + Support for other networking methods -- NETBIOS, LAT, Named Pipes, etc + -- is included in ck*net.h and ck*net.c for implementations (such as + Windows or OS/2) where these methods are supported. + + Provision is made in the organization of the modules, header files, + commands, etc, for addition of new network types such as DECnet, X.25 + for other systems (HP-UX, VMS, etc), and so on. Send email to + [117]kermit@columbia.edu if you are willing and able to work on such a + project. + + [ [118]C-Kermit Home ] [ [119]Kermit Home ] + ________________________________________________________________________ + + 9. EXCEPTION HANDLING + + [ [120]Top ] [ [121]Contents ] [ [122]Next ] [ [123]Previous ] + + The C language setjmp/longjmp mechanism is used for handling + exceptions. The jump buffer is of type jmp_buf, which almost + everywhere is typedef'd as an array, in which case you should have no + trouble compiling the exception-handling code. However, if you are + building C-Kermit in/for an environment where jmp_buf is something + other than an array (e.g. a struct), then you'll have to define the + following symbol: + + JBNOTARRAY + + [ [124]C-Kermit Home ] [ [125]Kermit Home ] + ________________________________________________________________________ + + 10. SECURITY FEATURES + + [ [126]Top ] [ [127]Contents ] [ [128]Next ] [ [129]Previous ] + + Security, in the sense of secure authentication and strong encryption, + can be built into versionf of C-Kermit for which the appropriate + libraries and header files are available (Kerberos IV, Kerberos V, + OpenSSL, SRP), as explained in great detail in the Kermit Security + Reference + . The following symbols govern C-Kermit's security features at build + time: + + NO_AUTHENTICATION + Means do not configure any TELNET AUTHENTICATION support. It + implies NO_ENCRYPTION and undefines any of the auth and encrypt + types. It does not undefine CK_SSL even though builds with + CK_SSL cannot succeed without CK_AUTHENTICATION. (This will be + supported in a future release. It will be needed to allow + C-Kermit to be built only as an FTP client.) + + NO_KERBEROS + Means do not compile in any KERBEROS support when + CK_AUTHENTICATION has been defined. + + NO_SRP + Do not compile in any SRP support when CK_AUTHENTICATION has + been defined. + + NO_SSL + Do not compile in any SSL/TLS support + + NO_ENCRYPTION + Do not compile in any Telnet encryption support. It does not + affect the use of SSL/TLS + + NOSSH + Do not compile in any SSH support whether internal or external + + CK_AUTHENTICATION + Telnet AUTHENTICATION support. (Also, required if SSL/TLS + support is desired.) On most platforms this does not autodefine + any authentication mechanisms such as Kerberos V, Kerberos IV, + SRP, ... Those need to be defined separately. + + CK_KERBEROS + Defined automatically when KRB4, KRB5, or KRB524 are defined. + Implies that some version of Kerberos is in use. + + KRB4 + Should be defined when Kerberos IV support is desired. + + KRB5 + Should be defined when Kerberos V support is desired. + + KRB524 + Should be defined if both Kerberos V and Kerberos IV are used + and the Kerberos IV support is provided by the MIT Kerberos IV + compatibility library in the current Kerberos 5 distribution. + + KRB5_U2U + Should be defined if KRB5 is defined and Kerberos 5 User to + User mode is desired. + + HEIMDAL + Should be defined if Kerberos V support is provided by HEIMDAL. + Support for this option is not complete in C-Kermit 8.0. Anyone + interested in working on this should contact kermit-support. + + CK_SRP + Should be defined if SRP support is desired. + + CK_ENCRYPTION + Should be defined if TELNET ENCRYPTION option support is + desired. This option does not define any particular encryption + types. That should be done by defining CK_DES or CK_CAST. + + CK_DES + Should be defined if either DES or 3DES Telnet Encryption + option support is desired. + + LIBDES + If CK_DES is defined and DES support is being provided by + either Eric Young's libdes.a or OpenSSL 0.9.6x or earlier, this + option must be defined. If it is not defined, it will be + assumed that DES support is provided by the MIT Kerberos IV + libraries. + + CK_CAST + Should be defined if CAST Telnet Encryption option support is + desired + + CK_SSL + Should be defined if SSL/TLS support (OpenSSL) is desired. + + SSL_KRB5 + If KRB5 is defined, and OpenSSL is built to support the + Kerberos 5 ciphers, then you should define SSL_KRB5 + + NOSSLKRB5 + If you are using OpenSSL 0.9.7 or higher and do not wish to + build with support for Kerberos 5 TLS ciphers, this option must + be defined. + + ZLIB + If you are using OpenSSL 0.9.6 or higher and it has been + compiled with support for ZLIB compression, this option should + be defined to enable Kermit to properly enable the use of + compression. + + SSHCMD + Defined for C-Kermit to enable the use of external SSH clients + from the Kermit command language + + SSHBUILTIN + Defined for Kermit implementations that have integrated SSH + support. Currently only Windows. + + ANYSSH + Defined if either SSHCMD or SSHBUILTIN are defined. + + CK_SNDLOC + Telnet Send Location support. + + NOSNDLOC + Do not include Telnet Send Location support. + + CK_XDISPLOC + Telnet X-Display Location support. Determines if the X-Display + location information is sent to the Telnet server either via + Telnet XDISPLOC or NEW-ENV options. + + NOXDISPLOC + Do not include Telnet X-Display Location support. + + CK_FORWARD_X + Telnet Forward X Windows Session Data option. Used to protect + the privacy and integrity of X Windows Sessions when secure + telnet sessions are in use. + + NOFORWARDX + Do not include Telnet Forward X Windows Session Data option. + + Besides the strong forms of security listed above, C-Kermit also + embodies various internal security features, including: + + NOPUSH + Compiling with the NOPUSH symbol defined removes all the "shell + escape" features from the program, including the PUSH, RUN, and + SPAWN commands, the "!" and "@" command prefixes, OPEN !READ, + OPEN !WRITE, job control (including the SUSPEND command), the + REDIRECT command, shell/DCL escape from CONNECT mode, as well + as the server's execution of REMOTE HOST commands (and, of + course, the ENABLE HOST command). Add NODISPO to also prevent + acceptance of incoming MAIL or REMOTE PRINT files. For UNIX, + also be sure to read [130]Section 11 of the [131]Unix C-Kermit + Installation Instructions. about set[ug]id configuration. + Additional restrictions can be enforced when in server mode; + read about the DISABLE command in the user manual. + + NOCCTRAP + Compiling with NOCCTRAP prevents the trapping of SIGINT by + Kermit. Thus if the user generates a SIGINT signal (e.g. by + typing the system's interrupt character), Kermit will exit + immediately, rather than returning to its prompt. + + NOPUSH and NOCCTRAP together allow Kermit to be run from restricted + shells, preventing access to system functions. + + [ [132]C-Kermit Home ] [ [133]Kermit Home ] + ________________________________________________________________________ + + 11. ENABLING SELECT() + + [ [134]Top ] [ [135]Contents ] [ [136]Next ] [ [137]Previous ] + + Kermit works best if it can do nonblocking reads, nondestructive input + buffer checking, and millisecond sleeps. All of these functions can be + accomplished by the select() function, which, unfortunately, is not + universally available. Furthermore, select() is required if incoming + TCP/IP connections are to be supported. + + select() was introduced with Berkeley UNIX, rejected by AT&T for + System V, but is gradually creeping in to all UNIX versions (and other + operating systems too) by virtue of its presence in the sockets + library, which is needed for TCP/IP. AT&T SVID for System V R4 + includes select(), but that does not mean that all SVR4 + implementations have it. + + Furthermore, even when select() is available, it might work only on + socket file descriptors, but not on others like serial ports, pipes, + etc. For example, in AOS/VS and BeOS, it works only with file + descriptors that were created by socket() and opened by connect() or + accept(). + + Other alternatives include poll() and rdchk(). Only one of these three + functions should be included. The following symbols govern this: + + SELECT Use select() (BSD, or systems with sockets libraries) + CK_POLL Use poll() (System V) + RDCHK Use rdchk() (SCO XENIX and UNIX) + + If your system supports the select() function, but your version of + C-Kermit does not, try adding: + + -DSELECT + + to the CFLAGS, and removing -DRDCHK or -DCK_POLL if it is there. If + you get compilation errors, some adjustments to ck*tio.c and/or + ck*net.c might be needed; search for SELECT (uppercase) in these files + (note that there are several variations on the calling conventions for + select()). + + Various macros and data types need to be defined in order to use + select(). Usually these are picked up from or . + But on some systems, they are in . In that case, add the + following: + + -DSELECT_H + + to the CFLAGS to tell C-Kermit to #include . A good + indication that you need to do this would be if you get compile-time + complaints about "fd_set" or "FD_SET" not being declared or defined. + + In UNIX, the use of select() vs fork() in the CONNECT command is + independent of the above considerations, and is governed by choosing a + particular makefile target. + + As of C-Kermit 7.0, select() is also the preferred control mechanism + for the CONNECT command. Unfortunately, the structures used by the + original UNIX CONNECT command, based on fork(), and those used by + select(), are so different, it was not practical to implement them + both in one module. So the select()-based CONNECT command module for + UNIX is [138]ckucns.c, and the fork-based one remains [139]ckucon.c. + To choose the fork-based one, which is more portable (but slower and + more fragile), use "wermit" as the make target. To choose the + select-based one, use "xermit". Only do this if you can verify that + the CONNECT command works on serial connections and PIPE connections + as well as TCP connections. + + The select()-based Unix CONNECT module, ckucns.c, must be used if + encryption is to be done, since the fork() version (ckucon.c) loses + its ability to share vital state information between the two forks. + Also note that the select() version is superior in many other ways + too. For example, it recovers better from exterior killing, forced + disconnections, etc, plus it goes faster. + + SHOW VERSIONS tells whether the CONNECT module uses fork() or + select(). + + C-Kermit 8.0 adds learned script capability, which depends on + select(). All the "wermit" based targets (as opposed to "xermit") had + NOLEARN added to them. Whenever changing a target over from wermit to + xermit, also remember to remove NOLEARN. + + [ [140]C-Kermit Home ] [ [141]Kermit Home ] + ________________________________________________________________________ + + 12. I/O REDIRECTION + + [ [142]Top ] [ [143]Contents ] [ [144]Next ] [ [145]Previous ] + + The REDIRECT command allows a local program to be run with its i/o + redirected over the communications connection. Your version of + C-Kermit has a REDIRECT command if it was built with the following + CFLAG: + + -DCK_REDIR + + This, in turn, is possible only if the underlying API is there. In the + case of UNIX this is just the wait() system call, so all UNIX versions + get this feature as of 6.0.192 (earlier versions needed a + header file defining the symbols WIFEXITED and WEXITSTATUS). + + As of version 7.0, file transfer can be done using pipes and filters. + To enable this feature, #define PIPESEND (and fill in the code). To + disable on systems where it is normally enabled, define NOPIPESEND. + This feature is, of course, also disabled by building with NOPUSH (or + giving the "nopush" command at runtime). + + C-Kermit 7.0 also adds the PIPE and SET HOST /COMMAND commands, which + provide another form of redirection. This feature is selected with + -DNETCMD. CK_RDIR must also be defined, since the same mechanisms are + used internally. + + [ [146]C-Kermit Home ] [ [147]Kermit Home ] + ________________________________________________________________________ + + 13. FLOATING-POINT NUMBERS, TIMERS, AND ARITHMETIC + + [ [148]Top ] [ [149]Contents ] [ [150]Next ] [ [151]Previous ] + + Floating-point support was added in C-Kermit 7.0. + + Floating-point numbers are enabled internally, at least for use in + high-precision file-transfer timers and statistics, unless the + following symbol is defined at compile time: + + -DNOFLOAT + + This might be necessary on old PCs that do not have built-in + floating-point hardware. + + When NOFLOAT is not defined, the following symbol tells which + floating-point type to use: + + -DCKFLOAT=xxxx + + The value is either "double" (normal for 32- and 16-bit architectures) + or "float" (normal for 64-bit architectures). + + C-Kermit can be configured to use high-precision file-transfer timers + for more accurate statistics. This feature is enabled with: + + -DGFTIMER + + and disabled with: + + -DNOGFTIMER + + If you try to build with -DGFTIMER but you get compilation errors, + either fix them (and send email to kermit@columbia.edu telling what + you did), or else give up and use -DNOGFTIMER (or -DNOFLOAT) instead. + Hint: depending on your machine architecture, you might have better + luck using double than float as the data type for floating-point + numbers, or vice versa. Look in [152]ckcdeb.h for the CKFLOAT + definition. + + Floating-point arithmetic is also supported in the script programming + language. First via the \fpp...() functions, such as \fppadd(), which + adds two floating-point numbers, second in S-Expressions. Addition, + subtraction, multiplication, and division are always available. But + other functions such as logs, raising to powers, sines and cosines, + etc, require the C Math library. To include user-level floating-point + math you must put: + + -DFNFLOAT + + and in Unix you must link with the Math library: + + LIBS=".... -lm" + + In K95 and VMS, FNFLOAT is defined automatically if CKFLOAT is + defined. In Unix, however, FNFLOAT must be added to each makefile + target individually, because of the special linking instructions that + must also be added to each target. + + Note: S-Expressions require FNFLOAT. + + [ [153]C-Kermit Home ] [ [154]Kermit Home ] + ________________________________________________________________________ + + 14. SPECIAL CONFIGURATIONS + + [ [155]Top ] [ [156]Contents ] [ [157]Previous ] + + As of C-Kermit 7.0, if you build C-Kermit normally, but with -DNOICP + (No Interactive Command Parser), you get a program capable of making + serial connections (but not dialing) and network connections (if + TCPSOCKET or other network option included), and can also transfer + files using Kermit protocol, but only via autodownload/upload. + Furthermore, if you call the executable "telnet", it will act like + Telnet -- using the command-line options. However, in this case there + is nothing to escape back to, so if you type Ctrl-\c, it just prints a + message to this effect. + + You can also build C-Kermit with -DNOXFER, meaning omit all the + file-transfer features. This leaves you with a scriptable + communications program that is considerably smaller than the full + C-Kermit. + + [ [158]C-Kermit Home ] [ [159]Kermit Home ] + ________________________________________________________________________ + + APPENDIX I: SUMMARY OF COMPILE-TIME OPTIONS + + [ [160]Top ] [ [161]Contents ] + + These are the symbols that can be specified on the cc command line, + listed alphabetically. Others are used internally, including those + taken from header files, those defined by the compiler itself, and + those inferred from the ones given below. Kermit's SHOW VERSIONS + command attempts to display most of these. See [162]ckcdeb.h and + [163]ckcnet.h for inference rules. For example SVR3 implies ATTSV, + MULTINET implies TCPSOCKET, and so on. + + Here is the complete list of the Kermit-specific compile-time + switches: + + ACUCNTRL Select BSD 4.3-style acucntrl() bidirectional tty control. + aegis Build for Apollo Aegis (predefined on Apollo systems). + AIX370 Build for IBM AIX/370 for IBM mainframes. + AIXESA Build for IBM AIX/ESA for IBM mainframes. + AIXPS2 Build for IBM AIX 3.0 for PS/2 series (never formally + released). + AIXRS Build for IBM AIX 3.x on RS/6000. + AIX41 Build for IBM AIX 4.x on RS/6000. + AMIGA Build for Commodore Amiga with Intuition OS. + ATT6300 Build for AT&T 6300 PLUS. + ATT7300 Build for AT&T 7300 UNIX PC (3B1). + ATTSV Build for AT&T System III or V UNIX. + AUX Build for Apple A/UX for the Macintosh. + BIGBUFOK OK to use big buffers - "memory is not a problem" + BPS_xxxx Enable SET SPEED xxxx + BSD29 Build for BSD 2.9 or 2.10. + BSD4 Build for BSD 4.2. + BSD41 Build for BSD 4.1. + BSD43 Build for BSD 4.3. + BSD44 Build for BSD 4.4. + C70 Build for BBN C/70. + CIE Build for CIE Systems 680/20. + CKCONINTB4CB Work around prompt-disappears after escape back from + CONNECT. + CKLEARN Build with support for learned scripts. + CKLOGDIAL Enable connection log. + CKMAXPATH Maximum length for a fully qualified filename. + CKREGEX (misnomer) Include [...] or {xxx,xxx,xxx} matching in + ckmatch(). + CKSYSLOG Enable syslogging. + CK_ANSIC Enable ANSI C constructs - prototypes, etc. + CK_ANSILIBS Use header files for ANSI C libraries. + CK_APC Enable APC execution by CONNECT module. + CK_CURSES Enable fullscreen file transfer display. + CK_DSYSINI Use system-wide init file, with name supplied by Kermit. + CK_DTRCD DTR/CD flow control is available. + CK_FAST Build with fast Kermit protocol defaults. + CK_FORK_SIG UNIX only: signal() number for CONNECT module forks. + CK_IFRO IF REMOTE command is available (and can run in remote mode). + CK_INI_A System-wide init file takes precedence over user's. + CK_INI_B User's init file takes precedence over the system-wide one. + CK_LABELED Include support for SET FILE TYPE LABELED. + CK_LBRK This version can send Long BREAK. + CK_LINGER Add code to turn of TCP socket "linger" parameter. + CK_MKDIR This version has a zmkdir() command to create directories. + CK_NAWS Include TELNET Negotiate About Window Size support. + CK_NEWTERM Use newterm() rather than initscr() to initialize curses. + CK_PAM Include PAM authentication (might also require -lpam). + CK_PCT_BAR Fullscreen file transfer display should include + "thermometer". + CK_POLL System-V or POSIX based UNIX has poll() function. + CK_POSIX_SIG Use POSIX signal handing: sigjmp_buf, sigsetjmp, + siglongjmp. + CK_READ0 read(fd,&x,0) can be used to test TCP/IP connections. + CK_REDIR Enable the REDIRECT command. + CK_RESEND Include the RESEND command (needs zfseek() + append). + CK_RTSCTS RTS/CTS flow control is available. + CK_SHADOW Include support for shadow passwords (e.g. for IKSD + authentication). + CK_SOCKBUF Enable TCP socket-buffer-size-increasing code. + CK_SOCKS UNIX only: Build with socks library rather than regular + sockets + CK_SOCKS5 UNIX only: Build with socks 5 lib rather than regular + sockets + CK_SPEED Enable control-character unprefixing. + CK_SYSINI="xxxxx" Quoted string to be used as system-wide init file + name. + CK_TIMERS Build with support for dynamically calculated packet + timeouts. + CK_TMPDIR This version of Kermit has an isdir() function. + CK_TTYFD Defined on systems where the communications connection file + descriptor (ttyfd) can be passed to other processes as a command-line + argument via \v(ttyfd). + CK_URL Parse URLs as well as hostnames, etc. + CK_XONXOFF Xon/Xoff flow control available. + CK_XYZ Include support for XYZMODEM protocols. + CK_WREFRESH Curses package includes wrefresh(),clearok() for screen + refresh. + CKFLOAT=type Floating-point data type, "double" or "float". + CKTYP_H=xxx Force include of xxx as file. + CLSOPN When hanging up a tty device, also close and reopen it. + CMDDEP Maximum recursion depth for self-referential user-defined fn's. + COHERENT Build for Mark Williams Coherent UNIX + CONGSPD Define if this version has congspd() routine in ck?tio.c + datageneral Build for Data General AOS/VS or AOS/VS II + DCLPOPEN popen() is available but needs to be declared + DEC_TCPIP Build with support for DEC TCP/IP (UCX) for (Open)VMS + DGUX430 Build for DG/UX 4.30 + DGUX540 Build for DG/UX 5.40 + DEFPAR=x Default parity, 0, 'e', 'o', 'm', or 's'. + DFTTY=xxx Default communications device name. + DIRENT UNIX directory structure to be taken from . + DIRPWDRP Prompt for password in REMOTE CWD command. + DTILDE Include UNIX ~ notation for username/home-directory + DYNAMIC Allocate file transfer packet buffers dynamically with malloc. + ENCORE Build for Encore Multimax computers. + EXCELAN Build with excelan TCP/IP. + FNFLOAT Include floating-point math functions (logs, sin, cos, exp, + etc) + FT18 Build for Fortune For:Pro 1.8. + FT21 Build for Fortune For:Pro 2.1. + GEMDOS Build for Atari ST GEMDOS. + GFTIMER Use high-precision floating-point file-transfer timers. + GID_T=xxx Group IDs are of type xxx (usually int, short, or gid_t). + HADDRLIST If gethostbyname() hostent struct contains a list of + addresses. + HDBUUCP Build with support for Honey DanBer UUCP. + HPUX Build for Hewlett Packard HP-UX. + HPUX9 Build for Hewlett Packard HP-UX 9.x. + HPUX10 Build for Hewlett Packard HP-UX 10.x. + HWPARITY Define if this version can SET PARITY HARDWARE { EVEN, + ODD...} + I386IX Build for Interactive System V R3. + IFDEBUG Add IF stmts "if (deblog)" before "debug()" calls. + INADDRX TCP/IP inet_addr() type is struct inaddr, not unsigned long. + INTERLAN Build with support for Racal/Interlan TCP/IP. + ISDIRBUG System defs of S_ISDIR and S_ISREG have bug, define + ourselves. + ISIII Build for Interactive System III. + IX370 Build for IBM IX/370. + KANJI Build with Kanji character-set translation support. + LCKDIR UUCP lock directory is /usr/spool/uucp/LCK/. + LFDEVNO UUCP lockfile name uses device numbers, as in SVR4. + LINUXFSSTND For Linux, use FSSTND UUCP lockfile conventions (default). + LOCK_DIR=xxx UUCP lock directory is xxx (quoted string). + LOCKF Use lockf() (in addition to lockfiles) on serial lines + LONGFN BSD long filenames supported using and opendir(). + LYNXOS Build for Lynx OS 2.2 or later (POSIX-based). + MAC Build for Apple Macintosh with Mac OS. + MATCHDOT Make wildcards match filenames that start with period (.) + MAXRP=number Maximum receive-packet length. + MAXSP=number Maximum send-packet length. + MDEBUG Malloc-debugging requested. + MINIDIAL Minimum modem dialer support: CCITT, Hayes, Unkown, and None. + MINIX Build for MINIX. + MIPS Build for MIPS workstation. + MULTINET Build with support for TGV MultiNet TCP/IP (VAX/VMS). + M_UNIX Defined by SCO. + NAP The nap() is available (conflicts with SELECT and USLEEP) + NAPHACK The nap() call is available but only as syscall(3112,...) + NDIR BSD long filenames supported using and opendir(). + NDGPWNAM Don't declare getpwnam(). + NDSYSERRLIST Don't declare sys_errlist[]. + NEEDSELECTDEFS select() is avaible but we need to define FD_blah + ourselves. + NETCMD Build with support for SET HOST /COMMAND and PIPE commands. + NEXT Build for NeXT Mach 1.x or 2.x or 3.0, 3.1, or 3.2. + NEXT33 Build for NeXT Mach 3.3. + NOANSI Disable ANSI C function prototyping. + NOAPC Do not include CK_APC code. + NOARROWKEYS Exclude code to parse ANSI arrow-key sequences. + NOB_xxxx Disable SET SPEED xxxx + NOBIGBUF Override BIGBUFOK when it is the default + NOBRKC Don't try to refer to t_brkc or t_eof tchars structure members. + NOCKFQHOSTNAME Exclude code to get fully qualified hostname in case it + causes core dumps. + NOCCTRAP Disable Control-C (SIGINT) trapping. + NOCKSPEED Disable control-prefix removal feature (SET CONTROL). + NOCKTIMERS Build without support for dynamic timers. + NOCKXYZ Overrides CK_XYZ. + NOCKREGEX Do not include [...] or {xxx,xxx,xxx} matching in ckmatch(). + NOCMDL Build with no command-line option processing. + NOCOTFMC No Close(Open()) To Force Mode Change (UNIX version). + NOCSETS Build with no support for character set translation. + NOCYRIL Build with no support for Cyrillic character set translation. + NOCYRILLIC Ditto. + NODEBUG Build with no debug logging capability. + NODIAL Build with no DIAL or SET DIAL commands. + NODISPO Build to always refuse incoming MAIL or REMOTE PRINT files. + DNODISPLAY Build with no file-transfer display. + NOESCSEQ Build with no support for ANSI escape sequence recognition. + NOFAST Do not make FAST Kermit protocol settings the default. + NOFDZERO Do not use file descriptor 0 for remote-mode file transfer. + NOFILEH Do not #include . + NOFLOAT Don't include any floating-point data types or operations. + NOFRILLS Build with "no frills" (this should be phased out...) + NOFTRUNCATE Include this on UNIXes that don't have ftruncate(). + NOGETUSERSHELL Include this on UNIXes that don't have getusershell(). + NOGFTIMER Don't use high-precision floating-point file-transfer + timers. + NOHEBREW Build with no support for Hebrew character sets. + NOHELP Build with no built-in help. + NOIKSD Build with IKSD support excluded. + NOINITGROUPS Include this on UNIXes that don't have initgroups(). + NOICP Build with no interactive command parser. + NOJC Build with no support for job control (suspend). + NOKANJI Build with no support for Japanese Kanji character sets. + NOKVERBS Build with no support for keyboard verbs (\Kverbs). + NOLATIN2 Build with no ISO Latin-2 character-set translation support. + NOLEARN Build with no support for learned scripts. + NOLINKBITS Use of S_ISLNK and _IFLNK untrustworthy; use readlink() + instead. + NOLOCAL Build without any local-mode features: No Making Connections. + NOLOGDIAL Disable connection log. + NOLOGIN Build without IKSD (network login) support. + NOLSTAT Not OK to use lstat(). + NOMDMHUP Build without "modem-specific hangup" (e.g. ATH0) feature. + NOMHHOST Exclude the multihomed-host TCP/IP code (if compilcation + errors) + NOMINPUT Build without MINPUT command. + NOMSEND Build with no MSEND command. + NONAWS Do not include TELNET Negotiate About Window Size support. + NONET Do not include any network support. + NONOSETBUF (See NOSETBUF) + NOPARSEN Build without automatic parity detection. + NOPIPESEND Disable file transfer using pipes and filters. + NOPOLL Override CK_POLL definition. + NOPOPEN The popen() library call is not available. + NOPURGE Build with no PURGE command. + NOPUSH Build with no escapes to operating system. + NOREALPATH In UNIX, realpath() function is not available. + NORECALL Disable the command-recall feature. + NOREDIRECT Disable REDIRECT command. + NORENAME Don't use rename() system call, use link()/unlink() (UNIX). + NORESEND Build with no RESEND command. + NORETRY Build with no command-retry feature. + NOSCRIPT Build with no SCRIPT command. + NOSELECT Don't try to use select(). + NOSERVER Build with no SERVER mode and no server-related commands. + NOSETBUF Don't make console writes unbuffered. + NONOSETBUF DO make console writes unbuffered. + NOSETREU setreuid() and/or setregid() not available. + NOSHOW Build with no SHOW command (not recommended!). + NOSIGWINCH Disable SIGWINCH signal trapping. + NOSPL Build with no script programming language. + NOSTAT Don't call stat() from mainline code. + NOSYMLINK Include this for UNIXes that don't have readlink(). + NOSYSIOCTLH Do not #include . + NOSYSTIMEH Co not include . + NOSYSLOG Disable syslogging code. + NOTCPOPTS Build with no SET TCP options or underlying support. + NOTLOG Build with no support for transaction logging. + NOTM_ISDST Struct tm has no tm_isdst member. + NOUNICODE Build with no support for Unicode character-set translation. + NOURL Don't parse URLs + NOUUCP Build with no UUCP lockfile support (dangerous!). + NOWARN Make EXIT WARNING be OFF by default (otherwise it's ON). + NOWREFRESH Override built-in definition of CK_WREFRESH (q.v.). + NOXFER Build with no Kermit or other file-transfer protocols. + NOXMIT Build with no TRANSMIT command. + NOXPRINT Disables transparent print code. + OLDMSG Use old "entering server mode" message (see [164]ckcmai.c). + OLINUXHISPEED Build in old Linux hi-serial-speed code (for Linux <= + 1.0). + OPENBSD Build for OpenBSD. + OS2 Build for OS/2. + OSF Build for OSF/1. + OSFPC Build for OSF/1 on a PC. + OSF32 Digital UNIX 3.2 or later. + OSF40 Build for Digital UNIX 4.0. + OSF50 Build for Digital UNIX 5.0. + OSK Build for OS-9. + OXOS Build for Olivetti X/OS 2.3. + PCIX Build for PC/IX + PID_T=xxx Type for pids is xxx (normally int or pid_t). + POSIX Build for POSIX: use POSIX header files, functions, etc. + _POSIX_SOURCE Disable non-POSIX features. + PROVX1 Build for Venix 1.0 on DEC Professional 3xx. + PTX Build for Dynix/PTX + PWID_T=xxx getpwid() type is xxx. + RBSIZ=xxx Define overall size of receive-packet buffer (with DYNAMIC). + RDCHK rdchk() system call is available. + RENAME rename() system call is available (UNIX). + RTAIX Build for AIX 2.2.1 on IBM RT PC. + RTU Build for Masscomp / Concurrent RTU. + SAVEDUID BSD or other non-AT&T UNIX has saved-setuid feature. + SBSIZ=xxx Define overall size of send-packet buffer (use with + DYNAMIC). + SDIRENT Directory structure specified in . + SELECT select() function available (conflicts with RDCHK and CK_POLL) + SELECT_H Include for select()-releated definitions. + SETEUID BSD 4.4-style seteXid() functions available. + SIG_V Type for signal() is void. Used to override normal assumption. + SIG_I Type for signal() is int. Used to override normal assumption. + SOCKOPT_T Override default data type for get/setsockopt() option + length. + SOLARIS Build for Solaris. + SOLARIS25 Build for Solaris 2.5 or later. + SONYNEWS Build for Sony NEWS-OS. + STERMIOX is available. + STRATUS Build for Stratus VOS. + STRATUSX25 Include Stratus VOS X.25 support. + SUN4S5 Build for SUNOS 4.x in the System V R3 environment. + SUNOS4 Build for SUNOS 4.0 in the BSD environment. + SUNOS41 Build for SUNOS 4.1 in the BSD environment. + SUNX25 Build with support for SunLink X.25. + SVR3 Build for AT&T System V Release 3. + SVR3JC Allow job control support on System V Release 3 UNIX versions. + SVR4 Build for AT&T System V Release 4. + SW_ACC_ID UNIX only -- swap real & effective ids around access() + calls. + sxaE50 Build for PFU Compact A Series SX/A TISP. + SYSLOGLEVEL=n Force syslogging at given level. + SYSTIMEH Include . + SYSUTIMEH Include for setting file dates (88OPEN) + TCPSOCKET Build with support for TCP/IP via Berkeley sockets library. + TERMIOX header file is available (mostly SVR4). + TNCODE Include TELNET-specific code. + TOWER1 Build for NCR Tower 1632 with OS 1.02. + TRS16 Build for Tandy 16/6000. + UID_T=xxx Type for uids is xxx (normally int or uid_t). + UNIX Must be defined for all UNIX versions. + UNIX351M AT&T UNIX 3.51m on the AT&T 7300 UNIX PC. + USE_ARROWKEYS Include code to parse ANSI arrow-key sequences. + USE_LSTAT OK to use lstat(). + USE_MEMCPY Define this if memcpy()/memset()/memmove() available. + USE_STRERROR Define this if strerror() is available. + USLEEP usleep() system call available (conflicts with NAP & SELECT). + UTEK Build for Tektronix workstations with UTEK OS. + UTIMEH Include for setting file dates (SVR4, POSIX) + UTS24 Build for Amdahl UTS 2.4. + V7 Build for Version 7 UNIX. + VMS Build for VAX/VMS. + VOID=xxx VOID type for functions (int or void). + VXVE Build for CDC VX/VE 5.2.1. + WAIT_T=xxx Type of argument passed to wait(). + WINTCP Build with Wollongong VAX/VMS TCP/IP (implies TCPSOCKET) + WOLLONGONG Build with Wollongong UNIX TCP/IP (implies TCPSOCKET) + XENIX Build for Xenix (SCO, Tandy, others). + XNDIR Support for BSD long filenames via . + XYZ_INTERNAL Support for XYZMODEM protocols is internal, not external. + ZFCDAT Define this if zfcdat() function is available in Kermit. + ZILOG Build for Zilog ZEUS. + ZJDATE Has zjdate() function that converts date to Julian format. + XPRINT Transparent print code included in CONNECT module. + + [ [165]Top ] [ [166]Contents ] [ [167]C-Kermit Home ] [ [168]Kermit + Home ] + _________________________________________________________________ + + + C-Kermit Configuration Options / [169]The Kermit Project / + [170]Columbia University / [171]kermit@columbia.edu / 14 March 2003 + +References + + 1. http://www.columbia.edu/kermit/ + 2. http://www.columbia.edu/ + 3. http://www.columbia.edu/kermit/ckccfg.html + 4. http://www.columbia.edu/kermit/ckermit.html + 5. http://www.columbia.edu/kermit/index.html + 6. http://www.columbia.edu/kermit/ckccfg.html#x1 + 7. http://www.columbia.edu/kermit/ckccfg.html#x2 + 8. http://www.columbia.edu/kermit/ckccfg.html#x3 + 9. http://www.columbia.edu/kermit/ckccfg.html#x4 + 10. http://www.columbia.edu/kermit/ckccfg.html#x5 + 11. http://www.columbia.edu/kermit/ckccfg.html#x6 + 12. http://www.columbia.edu/kermit/ckccfg.html#x7 + 13. http://www.columbia.edu/kermit/ckccfg.html#x8 + 14. http://www.columbia.edu/kermit/ckccfg.html#x9 + 15. http://www.columbia.edu/kermit/ckccfg.html#x10 + 16. http://www.columbia.edu/kermit/ckccfg.html#x11 + 17. http://www.columbia.edu/kermit/ckccfg.html#x12 + 18. http://www.columbia.edu/kermit/ckccfg.html#x13 + 19. http://www.columbia.edu/kermit/ckccfg.html#x14 + 20. http://www.columbia.edu/kermit/ckccfg.html#xa1 + 21. http://www.columbia.edu/kermit/ckuins.html + 22. http://www.columbia.edu/kermit/ckermit.html + 23. http://www.columbia.edu/kermit/index.html + 24. http://www.columbia.edu/kermit/ckccfg.html#top + 25. http://www.columbia.edu/kermit/ckccfg.html#contents + 26. http://www.columbia.edu/kermit/ckccfg.html#x2 + 27. http://www.columbia.edu/kermit/ckccfg.html#x0 + 28. http://www.columbia.edu/kermit/ckermit.html + 29. http://www.columbia.edu/kermit/index.html + 30. http://www.columbia.edu/kermit/ckccfg.html#top + 31. http://www.columbia.edu/kermit/ckccfg.html#contents + 32. http://www.columbia.edu/kermit/ckccfg.html#x3 + 33. http://www.columbia.edu/kermit/ckccfg.html#x1 + 34. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 35. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h + 36. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus3.c + 37. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h + 38. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 39. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 40. http://www.columbia.edu/kermit/ckermit.html + 41. http://www.columbia.edu/kermit/index.html + 42. http://www.columbia.edu/kermit/ckccfg.html#top + 43. http://www.columbia.edu/kermit/ckccfg.html#contents + 44. http://www.columbia.edu/kermit/ckccfg.html#x4 + 45. http://www.columbia.edu/kermit/ckccfg.html#x2 + 46. ftp://kermit.columbia.edu/kermit/c-kermit/makefile + 47. http://www.columbia.edu/kermit/ckuins.html + 48. http://www.columbia.edu/kermit/ckuins.html#x4 + 49. http://www.columbia.edu/kermit/ckuins.html#x9.2 + 50. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusx.c + 51. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 52. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c + 53. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusx.c + 54. ftp://kermit.columbia.edu/kermit/c-kermit/ckucmd.c + 55. http://www.columbia.edu/kermit/ckermit.html + 56. http://www.columbia.edu/kermit/index.html + 57. http://www.columbia.edu/kermit/ckccfg.html#top + 58. http://www.columbia.edu/kermit/ckccfg.html#contents + 59. http://www.columbia.edu/kermit/ckccfg.html#x5 + 60. http://www.columbia.edu/kermit/ckccfg.html#x3 + 61. http://www.columbia.edu/kermit/unicode.html + 62. http://www.columbia.edu/kermit/ckermit.html + 63. http://www.columbia.edu/kermit/index.html + 64. http://www.columbia.edu/kermit/ckccfg.html#top + 65. http://www.columbia.edu/kermit/ckccfg.html#contents + 66. http://www.columbia.edu/kermit/ckccfg.html#x6 + 67. http://www.columbia.edu/kermit/ckccfg.html#x4 + 68. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusr.h + 69. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusr.h + 70. http://www.columbia.edu/kermit/ckermit.html + 71. http://www.columbia.edu/kermit/index.html + 72. http://www.columbia.edu/kermit/ckccfg.html#top + 73. http://www.columbia.edu/kermit/ckccfg.html#contents + 74. http://www.columbia.edu/kermit/ckccfg.html#x7 + 75. http://www.columbia.edu/kermit/ckccfg.html#x5 + 76. http://www.columbia.edu/kermit/ckccfg.html#x6.1 + 77. http://www.columbia.edu/kermit/ckccfg.html#x6.2 + 78. http://www.columbia.edu/kermit/ckccfg.html#x6.3 + 79. http://www.columbia.edu/kermit/ckccfg.html#x6.4 + 80. http://www.columbia.edu/kermit/ckccfg.html#x4 + 81. http://www.columbia.edu/kermit/gkermit.html + 82. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusr.h + 83. ftp://kermit.columbia.edu/kermit/c-kermit/ckcker.h + 84. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h + 85. http://www.columbia.edu/kermit/ckermit.html + 86. http://www.columbia.edu/kermit/index.html + 87. http://www.columbia.edu/kermit/ckccfg.html#top + 88. http://www.columbia.edu/kermit/ckccfg.html#contents + 89. http://www.columbia.edu/kermit/ckccfg.html#x8 + 90. http://www.columbia.edu/kermit/ckccfg.html#x6 + 91. ftp://kermit.columbia.edu/kermit/c-kermit/ckudia.c + 92. http://www.columbia.edu/kermit/ckermit.html + 93. http://www.columbia.edu/kermit/index.html + 94. http://www.columbia.edu/kermit/ckccfg.html#top + 95. http://www.columbia.edu/kermit/ckccfg.html#contents + 96. http://www.columbia.edu/kermit/ckccfg.html#x9 + 97. http://www.columbia.edu/kermit/ckccfg.html#x7 + 98. http://www.columbia.edu/kermit/ckccfg.html#x8.1 + 99. http://www.columbia.edu/kermit/ckccfg.html#x8.2 + 100. http://www.columbia.edu/kermit/ckccfg.html#x8.3 + 101. http://www.columbia.edu/kermit/ckccfg.html#x8.1.1 + 102. http://www.columbia.edu/kermit/ckccfg.html#x8.1.2 + 103. http://www.columbia.edu/kermit/ckccfg.html#x8.1.3 + 104. http://www.columbia.edu/kermit/ckccfg.html#x8.1.4 + 105. http://www.columbia.edu/kermit/ckccfg.html#x8.1.5 + 106. http://www.columbia.edu/kermit/ckccfg.html#x8.1.6 + 107. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.h + 108. ftp://kermit.columbia.edu/kermit/c-kermit/ckctel.c + 109. ftp://kermit.columbia.edu/kermit/c-kermit/ckctel.c + 110. ftp://kermit.columbia.edu/kermit/c-kermit/ckctel.h + 111. ftp://kermit.columbia.edu/kermit/c-kermit/ckcftp.c + 112. http://www.columbia.edu/kermit/ckermit.html + 113. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.c + 114. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.h + 115. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 116. http://www.columbia.edu/kermit/ckccfg.html#x11 + 117. mailto:kermit@columbia.edu + 118. http://www.columbia.edu/kermit/ckermit.html + 119. http://www.columbia.edu/kermit/index.html + 120. http://www.columbia.edu/kermit/ckccfg.html#top + 121. http://www.columbia.edu/kermit/ckccfg.html#contents + 122. http://www.columbia.edu/kermit/ckccfg.html#x10 + 123. http://www.columbia.edu/kermit/ckccfg.html#x8 + 124. http://www.columbia.edu/kermit/ckermit.html + 125. http://www.columbia.edu/kermit/index.html + 126. http://www.columbia.edu/kermit/ckccfg.html#top + 127. http://www.columbia.edu/kermit/ckccfg.html#contents + 128. http://www.columbia.edu/kermit/ckccfg.html#x11 + 129. http://www.columbia.edu/kermit/ckccfg.html#x9 + 130. http://www.columbia.edu/kermit/ckuins.html#x11 + 131. http://www.columbia.edu/kermit/ckuins.html + 132. http://www.columbia.edu/kermit/ckermit.html + 133. http://www.columbia.edu/kermit/index.html + 134. http://www.columbia.edu/kermit/ckccfg.html#top + 135. http://www.columbia.edu/kermit/ckccfg.html#contents + 136. http://www.columbia.edu/kermit/ckccfg.html#x12 + 137. http://www.columbia.edu/kermit/ckccfg.html#x10 + 138. ftp://kermit.columbia.edu/kermit/c-kermit/ckucns.c + 139. ftp://kermit.columbia.edu/kermit/c-kermit/ckucon.c + 140. http://www.columbia.edu/kermit/ckermit.html + 141. http://www.columbia.edu/kermit/index.html + 142. http://www.columbia.edu/kermit/ckccfg.html#top + 143. http://www.columbia.edu/kermit/ckccfg.html#contents + 144. http://www.columbia.edu/kermit/ckccfg.html#x13 + 145. http://www.columbia.edu/kermit/ckccfg.html#x11 + 146. http://www.columbia.edu/kermit/ckermit.html + 147. http://www.columbia.edu/kermit/index.html + 148. http://www.columbia.edu/kermit/ckccfg.html#top + 149. http://www.columbia.edu/kermit/ckccfg.html#contents + 150. http://www.columbia.edu/kermit/ckccfg.html#x14 + 151. http://www.columbia.edu/kermit/ckccfg.html#x12 + 152. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h + 153. http://www.columbia.edu/kermit/ckermit.html + 154. http://www.columbia.edu/kermit/index.html + 155. http://www.columbia.edu/kermit/ckccfg.html#top + 156. http://www.columbia.edu/kermit/ckccfg.html#contents + 157. http://www.columbia.edu/kermit/ckccfg.html#x13 + 158. http://www.columbia.edu/kermit/ckermit.html + 159. http://www.columbia.edu/kermit/index.html + 160. http://www.columbia.edu/kermit/ckccfg.html#top + 161. http://www.columbia.edu/kermit/ckccfg.html#contents + 162. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h + 163. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.h + 164. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c + 165. http://www.columbia.edu/kermit/ckccfg.html#top + 166. http://www.columbia.edu/kermit/ckccfg.html#contents + 167. http://www.columbia.edu/kermit/ckermit.html + 168. http://www.columbia.edu/kermit/index.html + 169. http://www.columbia.edu/kermit/index.html + 170. http://www.columbia.edu/ + 171. mailto:kermit@columbia.edu diff --git a/ckcplm.txt b/ckcplm.txt new file mode 100644 index 0000000..9c2f44f --- /dev/null +++ b/ckcplm.txt @@ -0,0 +1,3076 @@ + + C-Kermit Program Logic Manual + + Frank da Cruz + [1]The Kermit Project + [2]Columbia University + + As of: C-Kermit 8.0.211, 10 April 2004 + This page last updated: Sat Apr 10 16:45:30 2004 (New York USA Time) + + IF YOU ARE READING A PLAIN-TEXT version of this document, note that + this file is a plain-text dump of a Web page. You can visit the + original (and possibly more up-to-date) Web page here: + + [3]http://www.columbia.edu/kermit/ckcplm.html + + [ [4]C-Kermit Home ] [ [5]Kermit Home ] + ________________________________________________________________________ + + CONTENTS + + 1. [6]INTRODUCTION + 2. [7]FILES + 3. [8]SOURCE CODE PORTABILITY AND STYLE + 4. [9]MODULES + 4.A. [10]Group A: Library Routines + 4.B. [11]Group B: Kermit File Transfer + 4.C. [12]Group C: Character-Set Conversion + 4.D. [13]Group D: User Interface + 4.E. [14]Group E: Platform-Dependent I/O + 4.F. [15]Group F: Network Support + 4.G. [16]Group G: Formatted Screen Support + 4.H. [17]Group H: Pseudoterminal Support + 4.I. [18]Group I: Security + I. [19]APPENDIX I: FILE PERMISSIONS + ________________________________________________________________________ + + 1. INTRODUCTION + + The Kermit Protocol is specified in the book Kermit, A File Transfer + Protocol by Frank da Cruz, Digital Press / Butterworth Heinemann, + Newton, MA, USA (1987), 379 pages, ISBN 0-932376-88-6. It is assumed + the reader is familiar with the Kermit protocol specification. + + This file describes the relationship among the modules and functions + of C-Kermit 5A and later, and other programming considerations. + C-Kermit is designed to be portable to any kind of computer that has a + C compiler. The source code is broken into many files that are grouped + according to their function, as shown in the [20]Contents. + + C-Kermit has seen constant development since 1985. Throughout its + history, there has been a neverending tug-of-war among: + + a. Functionality: adding new features, fixing bugs, improving + performance. + b. Adding support for new platforms. + c. "Buzzword 1.0 compliance". + + The latter category is the most frustrating, since it generally + involves massive changes just to keep the software doing what it did + before in some new setting: e.g. the K&R-to-ANSIC conversion (which + had to be done, of course, without breaking K&R); Y2K (not a big deal + in our case); the many and varied UNIX and other API "standards"; + IPv6. + + [ [21]Contents ] [ [22]C-Kermit ] [ [23]Kermit Home ] + ________________________________________________________________________ + + 2. FILES + + C-Kermit source files begin with the two letters "ck", for example + ckutio.c. Filenames are kept short (6.3) for maximum portability and + (obviously I hope) do not contain spaces or more than one period. The + third character in the name denotes something about the function group + and the expected level of portability: + + a General descriptive material and documentation (text) + b BOO file encoders and decoders (obsolete) + c All platforms with C compilers (*) + d Data General AOS/VS + e Reserved for "ckermit" files, like ckermit.ini, ckermit2.txt + f (reserved) + g (reserved) + h (reserved) + i Commodore Amiga (Intuition) + j (unused) + k (unused) + l Stratus VOS + m Macintosh with Mac OS 1-9 + n Microsoft Windows NT/2000/XP + o OS/2 and/or Microsoft Windows 9x/ME/NT/2000/XP + p Plan 9 from Bell Labs + q (reserved) + r DEC PDP-11 with RSTS/E (never used, open for reassigment) + s Atari ST GEMDOS (last supported in version 5A(189)) + t DEC PDP-11 with RT-11 (never used, open for reassigment) + u Unix-based operating systems (*) + v VMS and OpenVMS + w Wart (Lex-like preprocessor, platform independent) + x (reserved) + y (reserved) + z (reserved) + 0-3 (reserved) + 4 IBM AS/400 + 5-8 (reserved) + 9 Microware OS-9 + _ Encryption modules + + (*) In fact there is little distinction between the ckc*.* and cku*.* + categories. It would make more sense for all cku*.* modules to be + ckc*.* ones, except ckufio.c, ckutio.c, ckucon.c, ckucns.c, and + ckupty.c, which truly are specific to Unix. The rest (ckuus*.c, + ckucmd.c, etc) are quite portable. + + One hint before proceeding: functions are scattered all over the + ckc*.c and cku*.c modules, where function size has begun to take + precedence over the desirability of grouping related functions + together, the aim being to keep any particular module from growing + disproportionately large. The easiest way (in UNIX) to find out in + what source file a given function is defined is like this (where the + desired function is foo()...): + + grep ^foo\( ck*.c + + This works because the coding convention has been to make function + names always start on the left margin with their contents indented, + for example: + +static char * +foo(x,y) int x, y; { + ... +} + + Also note the style for bracket placement. This allows + bracket-matching text editors (such as EMACS) to help you make sure + you know which opening bracket a closing bracket matches, particularly + when the opening bracket is above the visible screen, and it also + makes it easy to find the end of a function (search for '}' on the + left margin). + + Of course EMACS tags work nicely with this format too: + + $ cd kermit-source-directory + $ etags ck[cu]*.c + $ emacs + Esc-X Visit-Tags-Table + + (but remember that the source file for ckcpro.c is [24]ckcpro.w!) + + Also: + + * Tabs should be set every 8 spaces, as on a VT100. + * All lines must no more than 79 characters wide after tab + expansion. + * Note the distinction between physical tabs (ASCII 9) and the + indentation conventions, which are: 4 for block contents, 2 for + most other stuff (obviously this is not a portability issue, just + style). + + [ [25]Contents ] [ [26]C-Kermit ] [ [27]Kermit Home ] + ________________________________________________________________________ + + 3. SOURCE CODE PORTABILITY AND STYLE + + C-Kermit was designed in 1985 as a platform-independent replacement + for the earlier Unix Kermit. c-Kermit's design was expected to promote + portability, and judging from the number of platforms to which it has + been adapted since then, the model is effective, if not ideal + (obviously if we had it all to do over, we'd change a few things). To + answer the oft-repeated question: "Why are there so many #ifdefs?", + it's because: + + * Many of them are related to feature selection and program size, + and so need to be there anyway. + * Those that treat compiler, library, platform, header-file, and + similar differences have built up over time as hundreds of people + all over the world adapted C-Kermit to their particular + environments and sent back their changes. There might be more + politically-correct ways to achieve portability, but this one is + natural and proven. The basic idea is to introduce changes that + can be selected by defining a symbol, which, if not defined, + leaves the program exactly as it was before the changes. + * Although it might be possible to "clean up" the "#ifdef mess", + nobody has access to all the hundreds of platforms served by the + #ifdefs to check the results. + + And to answer the second-most-oft-repeated question: "Why don't you + just use GNU autoconfig / automake / autowhatever instead of + hard-coding all those #ifdefs?" Answers: + + * The GNU tools are not available on all the platforms where + C-Kermit must be built and I wouldn't necessarily trust them if + they were. + * Each platform is a moving target, so the tools themselves would + need to updated before Kermit could be updated. + * It would only add another layer of complexity to an already + complex process. + * Conversion at this point would not be practical unless there was a + way to test the results on all the hundreds of platforms where + C-Kermit is supposed to build. + + When writing code for the system-indendent C-Kermit modules, please + stick to the following coding conventions to ensure portability to the + widest possible variety of C preprocessors, compilers, and linkers, as + well as certain network and/or email transports. The same holds true + for many of the "system dependent" modules too; particularly the Unix + ones, since they must be buildable by a wide variety of compilers and + linkers, new and old. + + This list does not purport to be comprehensive, and although some + items on it might seem far-fetched, they would not be listed unless I + had encountered them somewhere, some time. I wish I had kept better + records so I could cite specific platforms and compilers. + + * Try to keep variable and function names unique within 6 + characters, especially if they are used across modules, since 6 is + the maximum for some old linkers (actually, this goes back to + TOPS-10 and -20 and other old DEC OS's where C-Kermit never ran + anyway; a more realistic maximum is probably somewhere between 8 + and 16). We know for certain that VAX C has a 31-character max + because it complains -- others might not complain, but just + silently truncate, thus folding two or more routines/variables + into one. + * Keep preprocessor symbols unique within 8 characters; that's the + max for some preprocessors (sorry, I can't give a specific + example, but in 1988 or thereabouts, I had to change character-set + symbols like TC_LATIN1 and TC_LATIN2 to TC_1LATIN and TC_2LATIN + because the digits were being truncated and ignored on a platform + where I actually had to build C-Kermit 5A; unfortunately I didn't + note which platform -- maybe some early Ultrix version?) + * Don't create preprocessor symbols, or variable or function names, + that start with underscore (_). These are usually reserved for + internal use by the compiler and header files. + * Don't put #include directives inside functions or { blocks }. + * Don't use the #if or #elif preprocessor constructions, only use + #ifdef, #ifndef, #define, #undef, and #endif. + * Put tokens after #endif in comment brackets, e.g. + #endif /* FOO */. + * Don't indent preprocessor statements - # must always be first char + on line. + * Don't put whitespace after # in preprocessor statements. + * Don't use #pragma, even within #ifdefs -- it makes some + preprocessors give up. + * Same goes for #module, #if, etc - #ifdefs do NOT protect them. + * Don't use logical operators in preprocessor constructions. + * Avoid #ifdefs inside argument list to function calls (I can't + remember why this one is here, but probably needn't be; we do this + all the time). + * Always cast strlen() in expressions to int: + if ((int)strlen(foo) < x)... + * Any variable whose value might exceed 16383 should be declared as + long, or if that is not possible, then as unsigned. + * Avoid typedefs; they might be portable but they are very confusing + and there's no way to test for their presence or absence at + compile time. Use preprocessor symbols instead if possible; at + least you can test their definitions. + * Unsigned long is not portable; use a preprocessor symbol (Kermit + uses ULONG for this). + * Long long is not portable. If you really need it, be creative. + * Similarly 1234LL is not portable, nor almost any other constant + modifier other than L. + * Unsigned char is not portable, use CHAR (a preprocessor symbol + defined in the Kermit header files) and always take precautions + against character signage (more about this [28]below). + * Don't use initializers with automatic arrays or structs: it's not + portable. + * Don't use big automatic arrays or structs in functions that might + be called recursively; some platforms have fixed-size stacks (e.g. + Windows 9x: 256K) and recursive functions crash with stack + overflow. Even when there is not a compiler limitation, this + causes memory to be consumed without bound, and can end up filling + swap space. + * Don't assume that struct assignment performs a copy, or that it + even exists. + * Don't use sizeof to get the size of an array; someone might come + along later and and change it from static to malloc'd. Always use + a symbol to refer to the array's size. + * Don't put prototypes for static functions into header files that + are used by modules that don't contain that function; the link + step can fail with unresolved references (e.g. on AOS/VS). + * Avoid the construction *++p (the order of evaluation varies; it + shouldn't but at least one compiler had a bug that made me include + this item). + * Don't use triple assignments, like a = b = c = 0; (or quadruple, + etc). Some compilers generate bad code for these, or crash, etc + (some version of DEC C as I recall). + * Some compilers don't allow structure members to have the same + names as other identifiers. Try to give structure members unique + names. + * Don't assume anything about order of evaluation in boolean + expressions, or that they will stop early if a required condition + is not true, e.g.: + if (i > 0 && p[i-1] == blah) + can still dump core if i == 0 (hopefully this is not true of any + modern compiler, but I would not have said this if it did not + actually happen somewhere). + * Don't have a switch() statement with no cases (e.g. because of + #ifdefs); this is a fatal error in some compilers. + * Don't put lots of code in a switch case; move it out to a separate + function; some compilers run out of memory when presented with a + huge switch() statement -- it's not the number of cases that + matters; it's the overall amount of code. + * Some compilers might also limit the number of switch() cases, e.g. + to 254. + * Don't put anything between "switch() {" and "case:" -- switch + blocks are not like other blocks. + * Don't jump into or out of switches. + * Don't make character-string constants longer than about 250 bytes. + Longer strings should be broken up into arrays of strings. + * Don't write into character-string constants (obviously). Even when + you know you are not writing past the end; the compiler or linker + might have put them into read-only and/or shared memory, and/or + coalesced multiple equal constants so if you change one you change + them all. + * Don't depend on '\r' being carriage return. + * Don't depend on '\n' being linefeed or for that matter any SINGLE + character. + * Don't depend on '\r' and '\n' being different (e.g. as separate + switch() cases). + * In other words, don't use \n or \r to stand for specific + characters; use \012 and \015 instead. + * Don't code for "buzzword 1.0 compliance", unless "buzzword" is K&R + and "1.0" is the first edition. + * Don't use or depend on anything_t (size_t, pid_t, etc), except + time_t, without #ifdef protection (time_t is the only one I've + found that is accepted everywhere). This is a tough one because + the same function might require (say) a size_t arg on one + platform, whereas size_t is unheard of on another; or worse, it + might require a totally different data type, like int or long or + some other typedef'd thing. It has often proved necessary to + define a symbol to stand for the type of a particular argument to + a particular library or system function to get around this + problem. + * Don't use or depend on internationalization ("i18n") features, + wchar_t, locales, etc, in portable code; they are not portable. + Anyway, locales are not the right model for Kermit's + multi-character-set support. Kermit does all character-set + conversion itself and does not use any external libraries or + functions. + * In particular, don't use any library functions that deal with wide + characters or Unicode in any form. These are not only nonportable, + but a constantly shifting target (e.g. the ones in glibc). + * Don't make any assumption about signal handler type. It can be + void, int, long, or anything else. Always declare signal handlers + as SIGTYP (see definition in ckcdeb.h and augment it if necessary) + and always use SIGRETURN at exit points from signal handlers. + * Signals should always be re-armed to be used again (this barely + scratches the surface -- the differences between BSD/V7 and System + V and POSIX signal handling are numerous, and some platforms do + not even support signals, alarms, or longjmps correctly or at all + -- avoid all of this if you can). + * On the other hand, don't assume that signals are disarmed after + being raised. In some platforms you have to re-arm them, in others + they stay armed. + * Don't call malloc() and friends from a signal handler; don't do + anything but setting integer global variables in a signal handler. + * malloc() does not initialize allocated memory -- it never said it + did. Don't expect it to be all 0's. + * Did You Know: malloc() can succeed and the program can still dump + core later when it attempts to use the malloc'd memory? (This + happens when allocation is deferred until use and swap space is + full.) + * memset(), memmove(), and memcpy() are not portable, don't use them + without protecting them in ifdefs (we have USE_MEMCPY for this). + bzero()/bcopy() too, except we're guaranteed to have + bzero()/bcopy() when using the sockets library (not really). See + examples in the source. + * Don't assume that strncpy() stops on the first null byte -- most + versions always copy the number of bytes given in arg 3, padding + out with 0's and overwriting whatever was there before. Use + C-Kermit ckstrncpy() if you want predictable non-padding behavior, + guaranteed NUL-termination, and a useful return code. + * DID YOU KNOW.. that some versions of inet_blah() routines return + IP addresses in network byte order, while others return them local + machine byte order? So passing them to ntohs() or whatever is not + always the right thing to do. + * Don't use ANSI-format function declarations without #ifdef + CK_ANSIC, and always provide an #else for the non-ANSI case. + * Use the Kermit _PROTOTYP() macro for declaring function + prototypes; it works in both the ANSI and non-ANSI cases. + * Don't depend on any other ANSI preprocessor features like + "pasting" -- they are often missing or nonoperational. + * Don't assume any C++ syntax or semantics. + * Don't use // as a comment introducer. C is not C++. + * Don't declare a string as "char foo[]" in one module and "extern + char * foo" in another, or vice-versa: this causes core dumps. + * With compiler makers falling all over themselves trying to outdo + each other in ANSI strictness, it has become increasingly + necessary to cast EVERYTHING. This is increasingly true for char + vs unsigned char. We need to use unsigned chars if we want to deal + with 8-bit character sets, but most character- and string-oriented + APIs want (signed) char arguments, so explicit casts are + necessary. It would be nice if every compiler had a + -funsigned-char option (as gcc does), but they don't. + * a[x], where x is an unsigned char, can produce a wild memory + reference if x, when promoted to an int, becomes negative. Cast it + to (unsigned), even though it ALREADY IS unsigned. + * Be careful how you declare functions that have char or long + arguments; for ANSI compilers you MUST use ANSI declarations to + avoid promotion problems, but you can't use ANSI declarations with + non-ANSI compilers. Thus declarations of such functions must be + hideously entwined in #ifdefs. Example: latter: + int /* Put character in server command buffer */ + #ifdef CK_ANSIC + putsrv(char c) + #else + putsrv(c) char c; + #endif /* CK_ANSIC */ + /* putsrv */ { + *srvptr++ = c; + *srvptr = '\0'; /* Make sure buffer is null-terminated */ + return(0); + } + * Be careful how you return characters from functions that return + int values -- "getc-like functions" -- in the ANSI world. Unless + you explicitly cast the return value to (unsigned), it is likely + to be "promoted" to an int and have its sign extended. + * At least one compiler (the one on DEC OSF/1 1.3) treats "/*" and + "*/" within string constants as comment begin and end. No amount + of #ifdefs will get around this one. You simply can't put these + sequences in a string constant, e.g. "/usr/local/doc/*.*". + * Avoid putting multiple macro references on a single line, e.g.: + putchar(BS); putchar(SP); putchar(BS) + + This overflows the CPP output buffer of more than a few C + preprocessors (this happened, for example, with SunOS 4.1 cc, which + evidently has a 1K macro expansion buffer). + + C-Kermit needs constant adjustment to new OS and compiler releases. + Every new OS release shuffles header files or their contents, or + prototypes, or data types, or levels of ANSI strictness, etc. Every + time you make an adjustment to remove a new compilation error, BE VERY + CAREFUL to #ifdef it on a symbol unique to the new configuration so + that the previous configuration (and all other configurations on all + other platforms) remain as before. + + Assume nothing. Don't assume header files are where they are supposed + to be, that they contain what you think they contain, that they define + specific symbols to have certain values -- or define them at all! + Don't assume system header files protect themselves against multiple + inclusion. Don't assume that particular system or library calls are + available, or that the arguments are what you think they are -- order, + data type, passed by reference vs value, etc. Be conservative when + attempting to write portable code. Avoid all advanced features. + + If you see something that does not make sense, don't assume it's a + mistake -- it might be there for a reason, and changing it or removing + is likely to cause compilation, linking, or runtime failures sometime, + somewhere. Some huge percentage of the code, especially in the + platform-dependent modules, is workarounds for compiler, linker, or + API bugs. + + But finally... feel free to violate any or all of these rules in + platform-specific modules for environments in which the rules are + certain not to apply. For example, in VMS-specific code, it is OK to + use #if, because VAX C, DEC C, and VMS GCC all support it. + + [ [29]Contents ] [ [30]C-Kermit ] [ [31]Kermit Home ] + ________________________________________________________________________ + + 3.1. Memory Leaks + + The C language and standard C library are notoriously inadequate and + unsafe. Strings are arrays of characters, usually referenced through + pointers. There is no native string datatype. Buffers are fixed size, + and C provides no runtime bounds checking, thus allowing overwriting + of other data or even program code. With the popularization of the + Internet, the "buffer exploit" has become a preferred method for + hackers to hijack privileged programs; long data strings are fed to a + program in hopes that it uses unsafe C library calls such as strcpy() + or sprintf() to copy strings into automatic arrays, thus overwriting + the call stack, and therefore the routine's return address. When such + a hole is discovered, a "string" can be constructed that contains + machine code to hijack the program's privileges and penetrate the + system. + + This problem is partially addressed by the strn...() routines, which + should always be used in preference to their str...() equivalents + (except when the copy operation has already been prechecked, or there + is a good reason for not using them, e.g. the sometimes undesirable + side effect of strncpy() zeroing the remainder of the buffer). The + most gaping whole, however, is sprintf(), which performs no length + checking on its destination buffer, and is not easy to replace. + Although snprintf() routines are starting to appear, they are not yet + widespread, and certainly not universal, nor are they especially + portable, or even full-featured. + + For these reasons, we have started to build up our own little library + of C Library replacements, ckclib.[ch]. These are safe and highly + portable primitives for memory management and string manipulation, + such as: + + ckstrncpy() + Like strncpy but returns a useful value, doesn't zero buffer. + + ckitoa() + Opposite of atoi() + + ckltoa() + Opposite of atol() + + ckctoa() + Returns character as string + + ckmakmsg() + Used with ck?to?() as a safe sprintf() replacement for up to 4 + items + + ckmakxmsg() + Like ckmakmsg() but accepts up to 12 items + + More about library functions in [32]Section 4.A. + + [ [33]Contents ] [ [34]C-Kermit ] [ [35]Kermit Home ] + ________________________________________________________________________ + + 3.2. The "char" vs "unsigned char" Dilemma + + This is one of the most aggravating and vexing characteristics of the + C language. By design, chars (and char *'s) are SIGNED. But in the + modern era, however, we need to process characters that can have (or + include) 8-bit values, as in the ISO Latin-1, IBM CP 850, or UTF-8 + character sets, so this data must be treated as unsigned. But some C + compilers (such as those based on the Bell UNIX V7 compiler) do not + support "unsigned char" as a data type. Therefore we have the macro or + typedef CHAR, which we use when we need chars to be unsigned, but + which, unfortunately, resolves itself to "char" on those compilers + that don't support "unsigned char". AND SO... We have to do a lot of + fiddling at runtime to avoid sign extension and so forth. + + Some modern compilers (e.g. IBM, DEC, Microsoft) have options that say + "make all chars be unsigned" (e.g. GCC "-funsigned-char") and we use + them when they are available. Other compilers don't have this option, + and at the same time, are becoming increasingly strict about type + mismatches, and spew out torrents of warnings when we use a CHAR where + a char is expected, or vice versa. We fix these one by one using + casts, and the code becomes increasingly ugly. But there remains a + serious problem, namely that certain library and kernel functions have + arguments that are declared as signed chars (or pointers to them), + whereas our character data is unsigned. Fine, we can can use casts + here too -- but who knows what happens inside these routines. + + [ [36]Contents ] [ [37]C-Kermit ] [ [38]Kermit Home ] + ________________________________________________________________________ + + 4. MODULES + + When C-Kermit is on the far end of a connection, it is said to be in + remote mode. When C-Kermit has made a connection to another computer, + it is in local mode. (If C-Kermit is "in the middle" of a multihop + connection, it is still in local mode.) + + On another axis, C-Kermit can be in any of several major states: + + Command State + Reading and writing from the job's controlling terminal or + "console". In this mode, all i/o is handled by the Group E + conxxx() (console i/o) routines. + + Protocol State + Reading and writing from the communicatons device. In this + mode, all i/o is handled by the Group E ttxxx() (terminal i/o) + routines. + + Terminal State + Reading from the keyboard with conxxx() routines and writing to + the communications device with ttxxx() routines AND vice-versa. + + When in local mode, the console and communications device are + distinct. During file transfer, Kermit may put up a file-transfer + display on the console and sample the console for interruption + signals. + + When in remote mode, the console and communications device are the + same, and therefore there can be no file-transfer display on the + console or interruptions from it (except for "in-band" interruptions + such as ^C^C^C). + + [ [39]Contents ] [ [40]C-Kermit ] [ [41]Kermit Home ] + ________________________________________________________________________ + + 4.A. Group A: Library Functions + + Library functions, strictly portable, can be used by all modules on + all platforms: [42]ckclib.h, [43]ckclib.c. + + (To be filled in... For now, see [44]Section 3.1 and the comments in + ckclib.c.) + + [ [45]Contents ] [ [46]C-Kermit ] [ [47]Kermit Home ] + ________________________________________________________________________ + + 4.B. Group B: Kermit File Transfer + + The Kermit protocol kernel. These files, whose names start with "ckc + are supposed to be totally portable C, and are expected to compile + correctly on any platform with any C compiler. "Portable" does not + mean the same as as "ANSI" -- these modules must compile on 10- and + 20-year old computers, with C preprocessors, compilers, and/or linkers + that have all sorts of restrictions. The Group B modules do not + include any header files other than those that come with Kermit + itself. They do not contain any library calls except from the standard + C library (e.g. printf()). They most certainly do not contain any + system calls. Files: + + [48]ckcsym.h + For use by C compilers that don't allow -D on the command line. + + [49]ckcasc.h + ASCII character symbol definitions. + + [50]ckcsig.h + System-independent signal-handling definitions and prototypes. + + [51]ckcdeb.h + Originally, debugging definitions. Now this file also contains + all definitions and prototypes that are shared by all modules + in all groups. + + [52]ckcker.h + Kermit protocol symbol definitions. + + [53]ckcxla.h + Character-set-related symbol definitions (see next section). + + [54]ckcmai.c + The main program. This module contains the declarations of all + the protocol-related global variables that are shared among the + other modules. + + [55]ckcpro.w + The protocol module itself, written in "wart", a lex-like + preprocessor that is distributed with Kermit under the name + CKWART.C. + + [56]ckcfns.c, [57]ckcfn2.c, [58]ckcfn3.c + The protocol support functions used by the protocol module. + + [59]Group B modules may call upon functions from [60]Group E, but not + from [61]Group D modules (with the single exception that the main + program invokes the user interface, which is in Group D). (This last + assertion is really only a conjecture.) + + [ [62]Contents ] [ [63]C-Kermit ] [ [64]Kermit Home ] + ________________________________________________________________________ + + 4.C. Group C: Character-Set Conversion + + Character set translation tables and functions. Used by the [65]Group + B, protocol modules, but may be specific to different computers. (So + far, all character character sets supported by C-Kermit are supported + in [66]ckuxla.c and [67]ckuxla.h, including Macintosh and IBM + character sets). These modules should be completely portable, and not + rely on any kind of system or library services. + + [68]ckcxla.h + Character-set definitions usable by all versions of C-Kermit. + + ck?xla.h + Character-set definitions for computer "?", e.g. [69]ckuxla.h + for UNIX, [70]ckmxla.h for Macintosh. + + [71]ck?xla + Character-set translation tables and functions for computer + "?", For example, CKUXLA.C for UNIX, CKMXLA.C for Macintosh. So + far, these are the only two such modules. The UNIX module is + used for all versions of C-Kermit except the Macintosh version. + + [72]ckcuni.h + Unicode definitions + + [73]ckcuni.c + Unicode module + + Here's how to add a new file character set in the original + (non-Unicode modules). Assuming it is based on the Roman (Latin) + alphabet. Let's call it "Barbarian". First, in ck?xla.h, add a + definition for FC_BARBA (8 chars maximum length) and increase + MAXFCSETS by 1. Then, in ck?xla.c: + + * Add a barbarian entry into the fcsinfo array. + * Add a "barbarian" entry to file character set keyword table, + fcstab. + * Add a "barbarian" entry to terminal character set keyword table, + ttcstab. + * Add a translation table from Latin-1 to barbarian: yl1ba[]. + * Add a translation table from barbarian to Latin-1: ybal1[]. + * Add a translation function from Barbarian to ASCII: xbaas(). + * Add a translation function from Barbarian to Latin-1: xbal1(). + * Add a translation function from Latin-1 to Barbarian: xl1ba(). + * etc etc for each transfer character set... + * Add translation function pointers to the xls and xlr tables. + + Other translations involving Barbarian (e.g. from Barbarian to + Latin-Cyrillic) are performed through these tables and functions. See + ckuxla.h and ckuxla.c for extensive examples. + + To add a new Transfer Character Set, e.g. Latin Alphabet 9 (for the + Euro symbol), again in the "old" character-set modules: + + In ckcxla.h: + + + Add a TC_xxxx definition and increase MAXTCSETS accordingly. + + In ck?xla.h (since any transfer charset is also a file charset): + + + Add an FC_xxxx definition and increase MAXFCSETS accordingly. + + In ck?xla.c: + + + Add a tcsinfo[] entry. + + Make a tcstab[] keyword table entry. + + Make an fcsinfo[] table entry. + + Make an fcstab[] keyword table entry. + + Make a tcstab[] keyword table entry. + + If necessary, make a langinfo[] table entry. + + Make entries in the function pointer arrays. + + Provide any needed functions. + + As of C-Kermit 7.0, character sets are also handled in parallel by the + new (and very large) Unicode module, ckcuni.[ch]. Eventually we should + phase out the old way, described just above, and operate entirely in + (and through) Unicode. The advantages are many. The disadvantages are + size and performance. To add a character to the Unicode modules: + + In ckcuni.h: + + + (To be filled in...) + + In ckcuni.c: + + + (To be filled in...) + + [ [74]Contents ] [ [75]C-Kermit ] [ [76]Kermit Home ] + ________________________________________________________________________ + + 4.D. Group D: User Interface + + This is the code that communicates with the user, gets her commands, + informs her of the results. It may be command-line oriented, + interactive prompting dialog, menus and arrow keys, windows and mice, + speech recognition, telepathy, etc. The one provided is command-and + prompt, with the ability to read commands from various sources: the + console keyboard, a file, or a macro definition. The user interface + has three major functions: + + 1. Sets the parameters for the file transfer and then starts it. This + is done by setting certain (many) global variables, such as the + protocol machine start state, the file specification, file type, + communication parameters, packet length, window size, character + set, etc. + 2. Displays messages on the user's screen during the file transfer, + using the screen() function, which is called by the group-1 + modules. + 3. Executes any commands directly that do not require Kermit + protocol, such as the CONNECT command, local file management + commands, parameter-setting commands, FTP client commands, etc. + + If you plan to imbed the [77]Group B, files into a program with a + different user interface, your interface must supply an appropriate + screen() function, plus a couple related ones like chkint() and + intmsg() for handling keyboard (or mouse, etc) interruptions during + file transfer. The best way to find out about this is to link all the + C-Kermit modules together except the ckuu*.o and ckucon.o modules, and + see which missing symbols turn up. + + C-Kermit's character-oriented user interface (as opposed to the + Macintosh version's graphical user interface) consists of the + following modules. C-Kermit can be built with an interactive command + parser, a command-line-option-only parser, a graphical user interface, + or any combination, and it can even be built with no user interface at + all (in which case it runs as a remote-mode Kermit server). + + [78]ckucmd.h + [79]ckucmd.c + The command parsing primitives used by the interactive command + parser to parse keywords, numbers, filenames, etc, and to give + help, complete fields, supply defaults, allow abbreviations and + editing, etc. This package is totally independent of Kermit, + but does depend on the [80]Group E functions. + + [81]ckuusr.h + Definitions of symbols used in Kermit's commands. + + ckuus*.c + Kermit's interactive command parser, including the script + programming language: [82]ckuusr.c (includes top-level keyword + tables); [83]ckuus2.c (HELP command text); [84]ckuus3.c (most + of the SET command); [85]ckuus4.c (includes variables and + functions); ckuus[567].c (miscellaneous); + + [86]ckuusy.c + The command-line-option parser. + + [87]ckuusx.c + User interface functions common to both the interactive and + command-line parsers. + + [88]ckuver.h + Version heralds for different implementations. + + [89]ckuscr.c + The (old, uucp-like) SCRIPT command + + [90]ckudia.c + The DIAL command. Includes specific knowledge of many types of + modems. + + Note that none of the above files is actually Unix-specific. Over time + they have proven to be portable among all platforms where C-Kermit is + built: Unix, VMS, AOS/VS, Amiga, OS-9, VOS, etc etc. Thus the third + letter should more properly be "c", but changing it would be too + confusing. + + ck?con.c, ckucns.c + The CONNECT command. Terminal connection, and in some cases + (Macintosh, Windows) also terminal emulation. NOTE: As of + C-Kermit 7.0, there are two different CONNECT modules for UNIX: + [91]ckucon.c -- the traditional, portable, fork()-based version + -- and [92]ckucns.c, a new version that uses select() rather + than forks so it can handle encryption. ckucns.c is the + preferred version for Unix; ckucon.c is not likely to keep pace + with it in terms of upgrades, etc. However, since select() is + not portable to every platform, ckucon.c will be kept + indefinitely for those platforms that can't use ckucns.c. NOTE: + SunLink X.25 support is available only in ckucon.c. + + ck_*.*, ckuat*.* + Modules having to do with authentication and encryption. Since + the relaxation of USA export laws, they are included with the + general source-code distribution. Secure C-Kermit binaries can + be built using special targets in the standard makefile. + However, secure prebuilt binaries may not be distributed. + + For other implementations, the files may, and probably do, have + different names. For example, the Macintosh graphical user interface + filenames start with "ckm". Kermit 95 uses the ckucmd and ckuus* + modules, but has its own CONNECT command modules. And so on. + + Here is a brief description of C-Kermit's "user interface interface", + from ckuusr.c. It is nowhere near complete; in particular, hundreds of + global variables are shared among the many modules. These should, some + day, be collected into classes or structures that can be passed around + as needed; not only for purity's sake, but also to allow for multiple + simultaneous communication sessions and or user interfaces. Our list + of things to do is endless, and reorganizing the source is almost + always at the bottom. + + The ckuus*.c modules (like many of the ckc*.c modules) depend on the + existence of C library features like fopen, fgets, feof, (f)printf, + argv/argc, etc. Other functions that are likely to vary among + operating systems -- like setting terminal modes or interrupts -- are + invoked via calls to functions that are defined in the [93]Group E + platform-dependent modules, ck?[ft]io.c. The command line parser + processes any arguments found on the command line, as passed to main() + via argv/argc. The interactive parser uses the facilities of the cmd + package (developed for this program, but, in theory, usable by any + program). Any command parser may be substituted for this one. The only + requirements for the Kermit command parser are these: + + 1. Set parameters via global variables like duplex, speed, ttname, + etc. See [94]ckcmai.c for the declarations and descriptions of + these variables. + 2. If a command can be executed without the use of Kermit protocol, + then execute the command directly and set the sstate (start state) + variable to 0. Examples include SET commands, local directory + listings, the CONNECT command. + 3. If a command requires the Kermit protocol, set the following + variables: + sstate string data + 'x' (enter server mode) (none) + 'r' (send a 'get' command) cmarg, cmarg2 + 'v' (enter receive mode) cmarg2 + 'g' (send a generic command) cmarg + 's' (send files) nfils, cmarg & cmarg2 OR cmlist + 'c' (send a remote host command) cmarg + + cmlist is an array of pointers to strings. + cmarg, cmarg2 are pointers to strings. + nfils is an integer (hmmm, probably should be an unsigned long). + + cmarg can be: + A filename string (possibly wild), or: + a pointer to a prefabricated generic command string, or: + a pointer to a host command string. + + cmarg2 is: + The name to send a single file under, or: + the name under which to store an incoming file; must not + be wild. + If it's the name for receiving, a null value means to + store the file under the name it arrives with. + + cmlist is: + A list of nonwild filenames, such as passed via argv. + + nfils is an integer, interpreted as follows: + -1: filespec (possibly wild) in cmarg, must be expanded + internally. + 0: send from stdin (standard input). + >0: number of files to send, from cmlist. + + The screen() function is used to update the screen during file + transfer. The tlog() function writes to a transaction log (if TLOG is + defined). The debug() function writes to a debugging log (if DEBUG is + defined). The intmsg() and chkint() functions provide the user i/o for + interrupting file transfers. + + [ [95]Contents ] [ [96]C-Kermit ] [ [97]Kermit Home ] + ________________________________________________________________________ + + 4.E. Group E: Platform-Dependent I/O + + Platform-dependent function definitions. All the Kermit modules, + including the command package, call upon these functions, which are + designed to provide system-independent primitives for controlling and + manipulating devices and files. For Unix, these functions are defined + in the files [98]ckufio.c (files), [99]ckutio.c (communications), and + [100]ckusig.c (signal handling). + + For VMS, the files are [101]ckvfio.c, ckvtio.c, and [102]ckusig.c (VMS + can use the same signal handling routines as Unix). It doesn't really + matter what the files are called, except for Kermit distribution + purposes (grouping related files together alphabetically), only that + each function is provided with the name indicated, observes the same + calling and return conventions, and has the same type. + + The Group E modules contain both functions and global variables that + are accessed by modules in the other groups. These are now described. + + (By the way, I got this list by linking all the C-Kermit modules + together except ckutio and ckufio. These are the symbols that ld + reported as undefined. But that was a long time ago, probably circa + Version 6.) + + 4.E.1. Global Variables + + char *DELCMD; + Pointer to string containing command for deleting files. + Example: char *DELCMD = "rm -f "; (UNIX) + Example: char *DELCMD = "delete "; (VMS) + Note trailing space. Filename is concatenated to end of this + string. NOTE: DELCMD is used only in versions that do not + provide their own built-in DELETE command. + + char *DIRCMD; + Pointer to string containing command for listing files when a + filespec is given. + Example: char *DIRCMD = "/bin/ls -l "; (UNIX) + Example: char *DIRCMD = "directory "; (VMS) + Note trailing space. Filename is concatenated to end of this + string. NOTE: DIRCMD is used only in versions that do not + provide their own built-in DIRECTORY command. + + char *DIRCM2; + Pointer to string containing command for listing files when a + filespec is not given. (currently not used, handled in another + way.) + Example: char *DIRCMD2 = "/bin/ls -ld *"; + NOTE: DIRCMD2 is used only in versions that do not provide + their own built-in DIRECTORY command. + + char *PWDCMD; + Pointer to string containing command to display current + directory. + Example: char *PWDCMD = "pwd "; + NOTE: PWDCMD is used only in versions that do not provide their + own built-in PWD command. + + char *SPACMD; + Pointer to command to display free disk space in current + device/directory. + Example: char *SPACMD = "df ."; + NOTE: SPACMD is used only in versions that do not provide their + own built-in SPACE command. + + char *SPACM2; + Pointer to command to display free disk space in another + device/directory. + Example: char *SPACM2 = "df "; + Note trailing space. Device or directory name is added to this + string. NOTE: SPACMD2 is used only in versions that do not + provide their own built-in SPACE command. + + char *TYPCMD; + Pointer to command for displaying the contents of a file. + Example: char *TYPCMD = "cat "; + Note trailing space. Device or directory name is added to this + string. NOTE: TYPCMD is used only in versions that do not + provide their own built-in TYPE command. + + char *WHOCMD; + Pointer to command for displaying logged-in users. + Example: char *WHOCMD = "who "; + Note trailing space. Specific user name may be added to this + string. + + int backgrd = 0; + Flag for whether program is running in foreground (0) or + background (nonzero). Background operation implies that screen + output should not be done and that all errors should be fatal. + + int ckxech; + Flag for who is to echo console typein: + 1: The program (system is not echoing). + 0: The OS, front end, terminal, etc (not this program). + + char *ckxsys; + Pointer to string that names the computer and operating system. + Example: char *ckxsys = " NeXT Mach 1.0"; + Tells what computer system ckxv applies to. In UNIX Kermit, + this variable is also used to print the program herald, and in + the SHOW VERSION command. + + char *ckxv; + Pointer to version/edit info of ck?tio.c module. + Example: char *ckxv = "UNIX Communications Support, 6.0.169, 6 + Sep 96"; + Used by SHOW VERSION command. + + char *ckzsys; + Like ckxsys, but briefer. + Example: char *ckzsys = " 4.3 BSD"; + Tells what platform ckzv applies to. Used by the SHOW VERSION + command. + + char *ckzv; + Pointer to version/edit info of ck?fio.c module. + Example: char *ckzv = "UNIX File support, 6.0.113, 6 Sep 96"; + Used by SHOW VERSION command. + + int dfflow; + Default flow control. 0 = none, 1 = Xon/Xoff, ... (see FLO_xxx + symbols in ckcdeb.h) + Set by Group E module. Used by [103]ckcmai.c to initialize flow + control variable. + + int dfloc; + Default location. 0 = remote, 1 = local. Set by Group E module. + Used by ckcmai.c to initialize local variable. Used in various + places in the user interface. + + int dfprty; + Default parity. 0 = none, 'e' = even, 'o' = odd, 'm' = mark, + 's' = space. Set by Group E module. Used by ckcmai.c to + initialize parity variable. + + char *dftty; + Default communication device. Set by Group E module. Used in + many places. This variable should be initialized the the symbol + CTTNAM, which is defined in ckcdeb.h, e.g. as "/dev/tty" for + UNIX, "TT:" for VMS, etc. Example: char *dftty = CTTNAM; + + char *mtchs[]; + Array of string pointers to filenames that matched the most + recent wildcard match, i.e. the most recent call to zxpand(). + Used (at least) by command parsing package for partial filename + completion. + + int tilde_expand; + Flag for whether to attempt to expand leading tildes in + directory names (used in UNIX only, and then only when the + symbol DTILDE is defined. + + int ttnproto; + The protocol being used to communicate over a network device. + Values are defined in ckcnet.h. Example: NP_TELNET is network + protocol "telnet". + + int maxnam; + The maximum length for a filename, exclusive of any device or + directory information, in the format of the host operating + system. + + int maxpath; + The maximum length for a fully specified filename, including + device designator, directory name, network node name, etc, in + the format of the host operating system, and including all + punctuation. + + int ttyfd; + File descriptor of the communication device. -1 if there is no + open or usable connection, including when C-Kermit is in remote + mode. Since this is not implemented everywhere, references to + it are in #ifdef CK_TTYFD..#endif. + + [ [104]Contents ] [ [105]C-Kermit ] [ [106]Kermit Home ] + ________________________________________________________________________ + + 4.E.2. Functions + + These are divided into three categories: file-related functions (B.1), + communication functions (B.2), and miscellaneous functions (B.3). + + 4.E.2.1. File-Related Functions + + In most implementations, these are collected together into a module + called ck?fio.c, where ? = "u" ([107]ckutio.c for Unix), "v" + ([108]ckvtio.c for VMS), [109]etc. To be totally platform-independent, + C-Kermit maintains its own file numbers, and provides the functions + described in this section to deal with the files associated with them. + The file numbers are referred to symbolically, and are defined as + follows in ckcker.h: + + #define ZCTERM 0 /* Console terminal */ + #define ZSTDIO 1 /* Standard input/output */ + #define ZIFILE 2 /* Current input file for SEND command */ + #define ZOFILE 3 /* Current output file for RECEIVE command */ + #define ZDFILE 4 /* Current debugging log file */ + #define ZTFILE 5 /* Current transaction log file */ + #define ZPFILE 6 /* Current packet log file */ + #define ZSFILE 7 /* Current session log file */ + #define ZSYSFN 8 /* Input from a system function (pipe) */ + #define ZRFILE 9 /* Local file for READ command */ (NEW) + #define ZWFILE 10 /* Local file for WRITE command */ (NEW) + #define ZMFILE 11 /* Auxilliary file for internal use */ (NEW) + #define ZNFILS 12 /* How many defined file numbers */ + + In the descriptions below, fn refers to a filename, and n refers to + one of these file numbers. Functions are of type int unless otherwise + noted, and are listed mostly alphabetically. + + int + chkfn(n) int n; + Checks the file number n. Returns: + -1: File number n is out of range + 0: n is in range, but file is not open + 1: n in range and file is open + + int + iswild(filspec) char *filespec; + Checks if the file specification is "wild", i.e. contains + metacharacters or other notations intended to match multiple + filenames. Returns: + 0: not wild + 1: wild. + + int + isdir(string) char *string; + Checks if the string is the name of an existing directory. The + idea is to check whether the string can be "cd'd" to, so in + some cases (e.g. DOS) it might also indicate any file + structured device, such as a disk drive (like A:). Other + nonzero returns indicate system-dependent information; e.g. in + VMS isdir("[.FOO]") returns 1 but isdir("FOO.DIR;1") returns 2 + to indicate the directory-file name is in a format that needs + conversion before it can be combined with a filename. Returns: + 0: not a directory (including any kind of error) + 1: it is an existing directory + + char * + zfcdat(name) char *name; + Returns modification (preferably, otherwise creation) date/time + of file whose name is given in the argument string. Return + value is a pointer to a string of the form yyyymmdd hh:mm:ss, + for example 19931231 23:59:59, which represents the local time + (no timezone or daylight savings time finagling required). + Returns the null string ("") on failure. The text pointed to by + the string pointer might be in a static buffer, and so should + be copied to a safe place by the caller before any subsequent + calls to this function. + + struct zfnfp * + zfnqfp(fn, buflen, buf) char * fn; int buflen; char * buf; + Given the filename fn, the corresponding fully qualified, + absolute filename is placed into the buffer buf, whose length + is buflen. On failure returns a NULL pointer. On success + returns a pointer to a struct zfnfp containing pointers to the + full pathname and to just the filename, and an int giving the + length of the full pathname. All references to this function in + mainline code must be protected by #ifdef ZFNQFP..#endif, + because it is not present in all of the ck*fio.c modules. So if + you implement this function in a version that did not have it + before, be sure to add #define ZFNQFP in the appropriate spot + in ckcdeb.h or in the build-procedure CFLAGS. + + int + zcmpfn(s1,s2) char * s2, * s2; + Compares two filenames to see if they refer to the same. + Internally, the arguments can be converted to fully qualified + pathnames, e.g. with zfnqfp(), realpath(), or somesuch. In Unix + or other systems where symbolic links exist, the link should be + resolved before making the comparison or looking at the inodes. + Returns: + 0: Files are not identical. + 1: Files are identical. + + int + zfseek(pos) long pos; + Positions the input pointer on the current input file to the + given position. The pos argument is 0-based, the offset + (distance in bytes) from beginning of the file. Needed for + RESEND, PSEND, and other recovery operations. This function is + not necessarily possible on all systems, e.g. record-oriented + systems. It should only be used on binary files (i.e. files we + are sending in binary mode) and stream-oriented file systems. + Returns: + -1: on failure. + 0: On success. + + int + zchdir(dirnam) char *dirnam; + Changes current or default directory to the one given in + dirnam. Returns: + 0: On failure. + 1: on success. + + long + zchki(fn) char *fn; + Check to see if file with name fn is a regular, readable, + existing file, suitable for Kermit to send -- not a directory, + not a symbolic link, etc. Returns: + -3: if file exists but is not accessible (e.g. + read-protected); + -2: if file exists but is not of a readable type (e.g. a + directory); + -1: on error (e.g. file does not exist, or fn is garbage); + >=0: (length of file) if file exists and is readable. + Also see isdir(), zgetfs(). + + int + zchkpid(pid) unsigned long pid; + Returns: + 1: If the given process ID (e.g. pid in UNIX) is valid and + active + 0: otherwise. + + long + zgetfs(fn) char *fn; + Gets the size of the given file, regardless of accessibility. + Used for directory listings. Unlike zchki(), should return the + size of any kind of file, even a directory. zgetfs() also + should serve as a mini "get file info" function that can be + used until we design a better one, by also setting some global + variables: + int zgfs_link = 1/0 = file is (not) a symbolic link. + int zgfs_dir = 1/0 = file is (not) a directory. + char linkname[] = if zgfs_link != 0, name of file link points + to. + Returns: + -1: on error (e.g. file does not exist, or fn is garbage); + >=0: (length of file) if file exists and is readable. + + int + zchko(fn) char *fn; + Checks to see if a file of the given name can be created. + Returns: + -1: if file cannot be created, or on any kind of error. + 0: if file can be created. + + int + zchkspa(fn,len) char *f; long len; + Checks to see if there is sufficient space to store the file + named fn, which is len bytes long. If you can't write a + function to do this, then just make a dummy that always returns + 1; higher level code will recover from disk-full errors. The + receiving Kermit uses this function to refuse an incoming file + based on its size, via the attribute mechanism. Returns: + -1: on error. + 0: if there is not enough space. + 1: if there is enough space. + + int + zchin(n,c) int n; int *c; + Gets a character from file number n, return it in c (call with + &c). Returns: + -1: on failure, including EOF. + 0: on success with character in c. + + int + zchout(n,c) int n; char c; + Writes the character c to file number n. Returns: + -1: on error. + 0: on success. + + int + zclose(n) int n; + Closes file number n. Returns: + -1: on error. + 1: on success. + + int + zdelet(fn) char *name; + Attempts to delete (remove, erase) the named file. Returns: + -1: on error. + 1: if file was deleted successfully. + + char * + zgperm(char * f) + Returns a pointer to the system-dependent numeric + permissions/protection string for file f, or NULL upon failure. + Used if CK_PERMS is defined. + + char * + ziperm(char * f) + Returns a pointer to the system-dependent symbolic + permissions/protection string for file f, or NULL upon failure. + Used if CK_PERMS is defined. Example: In UNIX zgperm(f) might + return "100770", but ziperm() might return "-rwxrwx---". In + VMS, zgperm() would return a hexadecimal string, but ziperm() + would return something like "(RWED,RWED,RE,)". + + char * + zgtdir() + Returns a pointer to the name of the current directory, folder, + etc, or a NULL pointer if the current directory cannot be + determined. If possible, the directory specification should be + (a) fully specified, e.g. as a complete pathname, and (b) be + suitable for appending a filename. Thus, for example, Unix + directory names should end with '/'. VMS directory names should + look like DEV:[NAME] (rather than, say, NAME.DIR;1). + + char * + zhome() + Returns a pointer to a string containing the user's home + directory, or NULL upon error. Should be formatted like + zgtdir() (q.v.). + + int + zinfill() + Fill buffer from input file. This function is used by the macro + zminchar(), which is defined in ckcker.h. zminchar() manages + its own buffer, and calls zinfill() to fill it whenever it + becomes empty. It is used only for sending files, and reads + characters only from file number ZIFILE. zinfill() returns -1 + upon end of file, -2 upon fatal error, and -3 upon timeout + (e.g. when reading from a pipe); otherwise it returns the first + character from the buffer it just read. + + int + zkself() + Kills the current job, session, process, etc, logs out, + disappears. Used by the Kermit server when it receives a BYE + command. On failure, returns -1. On success, does not return at + all! This function should not be called until all other steps + have been taken to close files, etc. + + VOID + zstrip(fn,&fn2) char *fn1, **fn2; + Strips device and directory, etc, from file specification fn, + leaving only the filename (including "extension" or "filetype" + -- the part after the dot). For example DUA0:[PROGRAMS]OOFA.C;3 + becomes OOFA.C, or /usr/fdc/oofa.c becomes oofa.c. Returns a + pointer to result in fn2. + + int + zsetperm(char * file, unsigned int code) + Set permissions of file to given system-dependent code. 0: On + failure. + 1: on success. + + int + zsetroot(char * dir) + Sets the root for the user's file access, like Unix chroot(), + but does not require privilege. In Unix, this must be + implemented entirely by Kermit's own file access routines. + Returns: + 1: Success + -1: Invalid argument + -2: + -3: Internal error + -4: Access to given directory denied + -5: New root not within old root + + int + zinroot(char * file) + If no root is set (zsetroot()), returns 1. + Otherwise, if given file is in the root, returns 1. + Otherwise, returns 0. + + VOID + zltor(fn,fn2) char *fn1, *fn2; + Local-To-Remote filename translation. OBSOLETE: replaced by + nzltor() (q.v.). Translates the local filename fn into a format + suitable for transmission to an arbitrary type of computer, and + copies the result into the buffer pointed to by fn2. + Translation may involve (a) stripping the device and/or + directory/path name, (b) converting lowercase to uppercase, (c) + removing spaces and strange characters, or converting them to + some innocuous alphabetic character like X, (d) discarding or + converting extra periods (there should not be more than one). + Does its best. Returns no value. name2 is a pointer to a + buffer, furnished by the caller, into which zltor() writes the + resulting name. No length checking is done. + + #ifdef NZLTOR + VOID + nzltor(fn,fn2,convert,pathnames,max) char *fn1,*fn2; int + convert,pathnames,max; + Replaces zltor(). This new version handles pathnames and checks + length. fn1 and fn2 are as in zltor(). This version is called + unconditionally for each file, rather than only when filename + conversion is enabled. Pathnames can have the following values: + + PATH_OFF: Pathname, if any, is to be stripped + PATH_REL: The relative pathname is to be included + PATH_ABS: The full pathname is to be included + + After handling pathnames, conversion is done to the result as + in the zltor() description if convert != 0; if relative or + absolute pathnames are included, they are converted to UNIX + format, i.e. with slash (/) as the directory separator. The max + parameter specifies the maximum size of fn2. If convert > 0, + the regular conversions are done; if convert < 0, minimal + conversions are done (we skip uppercasing the letters, we allow + more than one period, etc; this can be used when we know our + partner is UNIX or similar). + + #endif /* NZLTOR */ + + int + nzxpand(fn,flags) char *fn; int flags; + Replaces zxpand(), which is obsolete as of C-Kermit 7.0. + Call with: + fn = Pointer to filename or pattern. + flags = option bits: + flags & ZX_FILONLY Match regular files + flags & ZX_DIRONLY Match directories + flags & ZX_RECURSE Descend through directory tree + flags & ZX_MATCHDOT Match "dot files" + flags & ZX_NOBACKUP Don't match "backup files" + flags & ZX_NOLINKS Don't follow symlinks. + + Returns the number of files that match fn, with data structures + set up so the first file (if any) will be returned by the next + znext() call. If ZX_FILONLY and ZX_DIRONLY are both set, or + neither one is set, files and directories are matched. Notes: + + 1. It is essential that the number returned by nzxpand() reflect + the actual number of filenames that will be returned by + znext() calls. In other words: + for (n = nzxpand(string,flags); n > 0; n--) { + znext(buf); + printf("%s\n", buf); + } + should print all the file names; no more, no less. + 2. In UNIX, DOS, OS-9, etc, where directories contain entries + for themselves (.) and the superior directory (..), these + should NOT be included in the list under any circumstances, + including when ZX_MATCHDOT is set. + 3. Additional option bits might be added in the future, e.g. for + sorting (sort by date/name/size, reverse/ascending, etc). + Currently this is done only in higher level code (through a + hack in which the nzxpand() exports its filename array, which + is not portable because not all OS's can use this mechanism). + + int + zmail(addr,fn) char *addr, fn; + Send the local, existing file fn as e-mail to the address addr. + Returns: + 0: on success + 2: if mail delivered but temp file can't be deleted + -2: if mail can't be delivered + + int + zmkdir(path) char *path; + The path can be a file specification that might contain + directory information, in which the filename is expected to be + included, or an unambiguous directory specification (e.g. in + UNIX it must end with "/"). This routine attempts to create any + directories in the given path that don't already exist. Returns + 0 or greater success: no directories needed creation, or else + all directories that needed creation were created successfully; + the return code is the number of directories that were created. + Returns -1 on failure to create any of the needed directories. + + int + zrmdir(path) char *path; + Attempts to remove the given directory. Returns 0 on success, + -1 on failure. The detailed semantics are open -- should it + fail if the directory contains any files or subdirectories, + etc. It is probably best for this routine to behave in whatever + manner is customary on the underlying platform; e.g. in UNIX, + VMS, DOS, etc, where directories can not be removed unless they + are empty. + + VOID + znewn(fn,s) char *fn, **s; + Transforms the name fn into a filename that is guaranteed to be + unique. If the file fn does not exist, then the new name is the + same as fn; Otherwise, it's different. this function does its + best, returns no value. New name is created in caller's space. + Call like this: znewn(old,&new);. The second parameter is a + pointer to the new name. This pointer is set by znewn() to + point to a static string in its own space, so be sure to the + result to a safe place before calling this function again. + + int + znext(fn) char *fn; + Copies the next file name from a file list created by zxpand() + into the string pointed to by fn (see zxpand). If no more + files, then the null string is placed there. Returns 0 if there + are no more filenames, with 0th element the array pointed to by + fn set to NUL. If there is a filename, it is stored in the + array pointed to by fn and a positive number is returned. NOTE: + This is a change from earlier definitions of this function + (pre-1999), which returned the number of files remaining; thus + 0 was the return value when returning the final file. However, + no mainline code ever depended on the return value, so this + change should be safe. + + int + zopeni(n,fn) int n; char *fn; + Opens the file named fn for input as file number n. Returns: + 0: on failure. + 1: on success. + + int + zopeno(n,fn,zz,fcb) int n; char *name; struct zattr *zz; struct + filinfo *fcb; + Attempts to open the named file for output as file number n. zz + is a Kermit file attribute structure as defined in ckcdeb.h, + containing various information about the file, including its + size, creation date, and so forth. This function should attempt + to honor as many of these as possible. fcb is a "file control + block" in the traditional sense, defined in ckcdeb.h, + containing information relevant to complicated file systems + like VMS (RMS), IBM MVS, etc, like blocksize, record length, + organization, record format, carriage control, etc. Returns: + 0: on failure. + 1: on success. + + int + zoutdump() + Dumps a file output buffer. Used with the macro zmchout() + defined in ckcker.h. Used only with file number ZOFILE, i.e. + the file that is being received by Kermit during file transfer. + Returns: + -1: on failure. + 0: on success. + + int + zprint(p,fn) char *p, *f; + Prints the file with name fn on a local printer, with options + p. Returns: + 0: on success + 3: if file sent to printer but can't be deleted + -3: if file can't be printed + + int + zrename(fn,fn2) char *fn, *fn2; + Changes the name of file fn to fn2. If fn2 is the name of an + existing directory, or a file-structured device, then file fn + is moved to that directory or device, keeping its original + name. If fn2 lacks a directory separator when passed to this + function, an appropriate one is supplied. Returns: + -1: on failure. + 0: on success. + + int + zcopy(source,dest) char * source, * dest; + Copies the source file to the destination. One file only. No + wildcards. The destination string may be a filename or a + directory name. Returns: + 0: on success. + <0: on failure: + -2: source file is not a regular file. + -3: source file not found. + -4: permission denied. + -5: source and destination are the same file. + -6: i/o error. + -1: other error. + + char * + zlocaltime(char *) + Call with: "yyyymmdd hh:mm:ss" GMT/UTC date-time. Returns + pointer to local date-time string "yyyymmdd hh:mm:ss" on + success, NULL on failure. + + VOID + zrtol(fn,fn2) char *fn, *fn2; + Remote-To-Local filename translation. OBSOLETE: replaced by + nzrtol(). Translates a "standard" filename to a local filename. + For example, in Unix this function might convert an + all-uppercase name to lowercase, but leave lower- or mix-case + names alone. Does its best, returns no value. New name is in + string pointed to by fn2. No length checking is done. + + #ifdef NZLTOR + int + nzrtol(fn,fn2,convert,pathnames,max) char *fn1,*fn2; int + convert,pathnames,max; + Replaces zrtol. Like zrtol but handles pathnames and checks + length. See nzltor for detailed description of parameters. + + #endif /* NZLTOR */ + + int + zsattr(xx) struct zattr *xx; + Fills in a Kermit file attribute structure for the file which + is to be sent, namely the currently open ZIFILE. Note that this + is not a very good design, but we're stuck with it. Callers + must ensure that zsattr() is called only on real files, not on + pipes, internally generated file-like objects such as server + REMOTE command responses, etc. Returns: + -1: on failure. + 0: on success with the structure filled in. + If any string member is null, it should be ignored by the + caller. + If any numeric member is -1, it should be ignored by the + caller. + + int + zshcmd(s) char *s; + s contains to pointer to a command to be executed by the host + computer's shell, command parser, or operating system. If the + system allows the user to choose from a variety of command + processors (shells), then this function should employ the + user's preferred shell. If possible, the user's job + (environment, process, etc) should be set up to catch keyboard + interruption signals to allow the user to halt the system + command and return to Kermit. The command must run in ordinary, + unprivileged user mode. If possible, this function should + return -1 on failure to start the command, or else it should + return 1 if the command succeeded and 0 if it failed. + + int + pexitstatus + zshcmd() and zsyscmd() should set this to the command's actual + exit status code if possible. + + int + zsyscmd(s) char *s; + s contains to pointer to a command to be executed by the host + computer's shell, command parser, or operating system. If the + system allows the user to choose from a variety of command + processors (shells), then this function should employ the + system standard shell (e.g. /bin/sh for Unix), so that the + results will always be the same for everybody. If possible, the + user's job (environment, process, etc) should be set up to + catch keyboard interruption signals to allow the user to halt + the system command and return to Kermit. The command must run + in ordinary, unprivileged user mode. If possible, this function + should return -1 on failure to start the command, or else it + should return 1 if the command succeeded and 0 if it failed. + + VOID + z_exec(s,args) char * s; char * args[]; + This one executes the command s (which is searched for using + the system's normal searching mechanism, such as PATH in UNIX), + with the given argument vector, which follows the conventions + of UNIX argv[]: the name of the command pointed to by element + 0, the first arg by element 1, and so on. A null args[] pointer + indicates the end of the arugment list. All open files must + remain open so the exec'd process can use them. Returns only if + unsuccessful. + + int + zsinl(n,s,x) int n, x; char *s; + Reads a line from file number n. Writes the line into the + address s provided by the caller. Writing terminates when + newline is read, but with newline discarded. Writing also + terminates upon EOF or if length x is exhausted. Returns: + -1: on EOF or error. + 0: on success. + + int + zsout(n,s) int n; char *s; + Writes the string s out to file number n. Returns: + -1: on failure. + 0: on success. + + int + zsoutl(n,s) int n; char *s; + Writes the string s out to file number n and adds a line + (record) terminator (boundary) appropriate for the system and + the file format. Returns: + -1: on failure. + 0: on success. + + int + zsoutx(n,s,x) int n, x; char *s; + Writes exactly x characters from string s to file number n. If + s has fewer than x characters, then the entire string s is + written. Returns: + -1: on failure. + >= 0: on success, the number of characters actually written. + + int + zstime(fn,yy,x) char *fn; struct zattr *yy; int x; + Sets the creation date (and other attributes) of an existing + file, or compares a file's creation date with a given date. + Call with: + + fn: pointer to name of existing file. + yy: Pointer to a Kermit file attribute structure in which yy->date.val + is a date of the form yyyymmdd hh:mm:ss, e.g. 19900208 13:00:00, which + is to be used for setting or comparing the file date. Other attributes + in the struct can also be set, such as the protection/permission (See + [110]Appendix I), when it makes sense (e.g. "yy->lprotect.val" can be + set if the remote system ID matches the local one). + x: A function code: 0 means to set the file's creation date as given. + 1 means compare the date from the yy struct with the file's date. + + Returns: + -1: on any kind of error. + 0: if x is 0 and the file date was set successfully. + 0: if x is 1 and date from attribute structure > file + creation date. + 1: if x is 1 and date from attribute structure <= file + creation date. + + VOID + zstrip(name,name2) char *name, **name2; + Strips pathname from filename "name". Constructs the resulting + string in a static buffer in its own space and returns a + pointer to it in name2. Also strips device name, file version + numbers, and other "non-name" material. + + int + zxcmd(n,s) char *s; + Runs a system command so its output can be accessed as if it + were file n. The command is run in ordinary, unprivileged user + mode. + If n is ZSTDIO or ZCTERM, returns -1. + If n is ZIFILE or ZRFILE, then Kermit reads from the command, + otherwise Kermit writes to the command. + Returns 0 on error, 1 on success. + + int + zxpand(fn) char *fn; + OBSOLETE: Replaced by nzxpand(), q.v. + + #ifdef ZXREWIND + int + zxrewind() + Returns the number of files returned by the most recent + nzxpand() call, and resets the list to the beginning so the + next znext() call returns the first file. Returns -1 if zxpand + has not yet been called. If this function is available, + ZXREWIND should be defined; otherwise it should not be + referenced. + + #endif /* ZXREWIND */ + + int + xsystem(cmd) char *cmd; + Executes the system command without redirecting any of its i/o, + similar (well, identical) to system() in Unix. But before + passing the command to the system, xsystem() ensures that all + privileges are turned off, so that the system command executes + in ordinary unprivileged user mode. If possible, xsystem() + returns the return code of the command that was executed. + + 4.E.2.2. IKSD Variables and Functions + + These must be implemented in any C-Kermit version that is to be + installed as an Internet Kermit Service Daemon (IKSD). IKSD is + expected to be started by the Internet Daemon (e.g. inetd) with its + standard i/o redirected to the incoming connection. + + int ckxanon; + Nonzero if anonymous logins allowed. + + extern int inserver; + Nonzero if started in IKSD mode. + + extern int isguest; + Nonzero if IKSD and user logged in anonymously. + + extern char * homdir; + Pointer to user's home directory. + + extern char * anonroot; + Pointer to file-system root for anonymous users. + + Existing functions must make "if (inserver && isguest)" checks for + actions that would not be legal for guests: zdelete(), zrmdir(), + zprint(), zmail(), etc. + + int + zvuser(name) char * name; + Verifies that user "name" exists and is allowed to log in. If + the name is "ftp" or "anonymous" and ckxanon != 0, a guest + login is set up. Returns 0 if user not allowed to log in, + nonzero if user may log in. + + int + zvpass(string) char * string; + Verifies password of the user from the most recent zvuser() + call. Returns nonzero if password is valid for user, 0 if it + isn't. Makes any appropriate system log entries (IKSD logins, + failed login attempts, etc). If password is valid, logs the + user in as herself (if real user), or sets up restricted + anonymous access if user is guest (e.g. changes file-system + root to anonroot and sets isguest = 1). + + VOID + zsyslog() + Begins any desired system logging of an IKSD session. + + VOID + zvlogout() + Terminates an IKSD session. In most cases this is simply a + wrapper for exit() or doexit(), with some system logging added. + + 4.E.2.3. Privilege Functions + + These functions are used by C-Kermit to adapt itself to operating + systems where the program can be made to run in a "privileged" mode, + e.g. setuid or setgid in Unix. C-Kermit should NOT read and write + files or start subprocesses as a privileged program. This would + present a serious threat to system security. The security package has + been installed to prevent such security breaches by turning off the + program's special privileges at all times except when they are needed. + + In UNIX, the only need Kermit has for privileged status is access to + the UUCP lockfile directory, in order to read, create, and destroy + lockfiles, and to open communication devices that are normally + protected against the user (see the [111]Unix C-Kermit Installation + Instructions for discussion). Therefore, privileges should only be + enabled for these operations and disabled at all other times. This + relieves the programmer of the responsibility of putting expensive and + unreliable access checks around every file access and subprocess + creation. + + Strictly speaking, these functions are not required in all C-Kermit + implementations, because their use (so far, at least) is internal to + the Group E modules. However, they should be included in all C-Kermit + implementations for operating systems that support the notion of a + privileged program (UNIX, RSTS/E, what others?). + + int + priv_ini() + Determine whether the program is running in privileged status. + If so, turn off the privileges, in such a way that they can be + turned on again when needed. Called from sysinit() at program + startup time. Returns: + 0 on success + nonzero on failure, in which case the program should halt + immediately. + + int + priv_on() + If the program is not privileged, this function does nothing. + If the program is privileged, this function returns it to + privileged status. priv_ini() must have been called first. + Returns: + 0 on success + nonzero on failure + + int + priv_off() + Turns privileges off (if they are on) in such a way that they + can be turned back on again. Returns: + 0 on success + nonzero on failure + + int + priv_can() + Turns privileges off in such a way that they cannot be turned + back on. Returns: + 0 on success + nonzero on failure + + int + priv_chk() + Attempts to turns privileges off in such a way that they can be + turned on again later. Then checks to make sure that they were + really turned off. If they were not really turned off, then + they are cancelled permanently. Returns: + 0 on success + nonzero on failure + + 4.E.2.4. Console-Related Functions + + These relate to the program's "console", or controlling terminal, i.e. + the terminal that the user is logged in on and types commands at, or + on a PC or workstation, the actual keyboard and screen. + + int + conbin(esc) char esc; + Puts the console into "binary" mode, so that Kermit's command + parser can control echoing and other treatment of characters + that the user types. esc is the character that will be used to + get Kermit's attention during packet mode; puts this in a + global place. Sets the ckxech variable. Returns: + -1: on error. + 0: on success. + + int + concb(esc) char esc; + Put console in "cbreak" (single-character wakeup) mode. That + is, ensure that each console character is available to the + program immediately when the user types it. Otherwise just like + conbin(). Returns: + -1: on error. + 0: on success. + + int + conchk() + Returns a number, 0 or greater, the number of characters + waiting to be read from the console, i.e. the number of + characters that the user has typed that have not been read yet + by Kermit. + + long + congspd(); + Returns the speed ("baud rate") of the controlling terminal, if + known, otherwise -1L. + + int + congks(timo) int timo; + Get Keyboard Scancode. Reads a keyboard scan code from the + physical console keyboard. If the timo parameter is greater + than zero, then times out and returns -2 if no character + appears within the given number of seconds. Upon any other kind + of error, returns -1. Upon success returns a scan code, which + may be any positive integer. For situations where scan codes + cannot be read (for example, when an ASCII terminal is used as + the job's controlling terminal), this function is identical to + coninc(), i.e. it returns an 8-bit character value. congks() is + for use with workstations whose keyboards have Alternate, + Command, Option, and similar modifier keys, and Function keys + that generate codes greater than 255. + + int + congm() + Console get modes. Gets the current console terminal modes and + saves them so that conres() can restore them later. Returns 1 + if it got the modes OK, 0 if it did nothing (e.g. because + Kermit is not connected with any terminal), -1 on error. + + int + coninc(timo) int timo; + Console Input Character. Reads a character from the console. If + the timo parameter is greater than zero, then coninc() times + out and returns -2 if no character appears within the given + number of seconds. Upon any other kind of error, returns -1. + Upon success, returns the character itself, with a value in the + range 0-255 decimal. + + VOID + conint(f,s) SIGTYP (*f)(), (*s)(); + Sets the console to generate an interrupt if the user types a + keyboard interrupt character, and to transfer control the + signal-handling function f. For systems with job control, s is + the address of the function that suspends the job. Sets the + global variable "backgrd" to zero if Kermit is running in the + foreground, and to nonzero if Kermit is running in the + background. See ckcdeb.h for the definition of SIGTYP. No + return value. + + VOID + connoi() + Console no interrupts. Disable keyboard interrupts on the + console. No return value. + + int + conoc(c) char c; + Writes character c to the console terminal. Returns: + 0 on failure, 1 on success. + + int + conol(s) char *s; + Writes string s to the console. Returns -1 on error, 0 or + greater on success. + + int + conola(s) char *s[]; { + Writes an array of strings to the console. Returns -1 on error, + 0 or greater on success. + + int + conoll(s) char *s; + Writes string s to the console, followed by the necessary line + termination characters to put the console cursor at the + beginning of the next line. Returns -1 on error, 0 or greater + on success. + + int + conres() + Restores the console terminal to the modes obtained by congm(). + Returns: -1 on error, 0 on success. + + int + conxo(x,s) int x; char *s; + Write x characters from string s to the console. Returns 0 or + greater on success, -1 on error. + + char * + conkbg(); + Returns a pointer to the designator of the console keyboard + type. For example, on a PC, this function would return "88", + "101", etc. Upon failure, returns a pointer to the empty + string. + + 4.E.2.5. Communications Functions + + The communication device is the device used for terminal emulation and + file transfer. It may or may not be the same device as the console, + and it may or may not be a terminal (serial-port) device; it could + also be a network connection. For brevity, the communication device is + referred to here as the "tty". When the communication device is the + same as the console device, Kermit is said to be in remote mode. When + the two devices are different, Kermit is in local mode. + + int + ttchk() + Returns the number of characters that have arrived at the + communication device but have not yet been read by ttinc(), + ttinl(), and friends. If communication input is buffered (and + it should be), this is the sum of the number of unread + characters in Kermit's buffer PLUS the number of unread + characters in the operating system's internal buffer. The call + must be nondestructive and nonblocking, and as inexpensive as + possible. Returns: + 0: or greater on success, + 0: in case of internal error, + -1: or less when it determines the connection has been broken, + or there is no connection. + + That is, a negative return from ttchk() should reliably + indicate that there is no usable connection. Furthermore, + ttchk() should be callable at any time to see if the connection + is open. When the connection is open, every effort must be made + to ensure that ttchk returns an accurate number of characters + waiting to be read, rather than just 0 (no characters) or 1 (1 + or more characters), as would be the case when we use select(). + This aspect of ttchk's operation is critical to successful + operation of sliding windows and streaming, but "nondestructive + buffer peeking" is an obscure operating system feature, and so + when it is not available, we have to do it ourselves by + managing our own internal buffer at a level below ttinc(), + ttinl(), etc, as in the UNIX version (non-FIONREAD case). + + An external global variable, clsondisc, if nonzero, means that + if a serial connection drops (carrier on-to-off transition + detected by ttchk()), the device should be closed and released + automatically. + + int + ttclos() + Closes the communication device (tty or network). If there were + any kind of exclusive access locks connected with the tty, + these are released. If the tty has a modem connection, it is + hung up. For true tty devices, the original tty device modes + are restored. Returns: + -1: on failure. + 0: on success. + + int + ttflui() + Flush communications input buffer. If any characters have + arrived but have not yet been read, discard these characters. + If communications input is buffered by Kermit (and it should + be), this function flushes Kermit's buffer as well as the + operating system's internal input buffer. Returns: + -1: on failure. + 0: on success. + + int + ttfluo() + Flush tty output buffer. If any characters have been written + but not actually transmitted (e.g. because the system has been + flow-controlled), remove them from the system's output buffer. + (Note, this function is not actually used, but it is + recommended that all C-Kermit programmers add it for future + use, even if it is only a dummy function that returns 0 + always.) + + int + ttgmdm() + Looks for the modem signals CTS, DSR, and CTS, and returns + those that are on in as its return value, in a bit mask as + described for ttwmdm, in which a bit is on (1) or off (0) + according to whether the corresponding signal is on (asserted) + or off (not asserted). Return values: + -3: Not implemented + -2: if the line does not have modem control + -1: on error + >=0: on success, with bit mask containing the modem signals. + + long + ttgspd() + Returns the current tty speed in BITS (not CHARACTERS) per + second, or -1 if it is not known or if the tty is really a + network, or upon any kind of error. On success, the speed + returned is the actual number of bits per second, like 1200, + 9600, 19200, etc. + + int + ttgwsiz() + Get terminal window size. Returns -1 on error, 0 if the window + size can't be obtained, 1 if the window size has been + successfully obtained. Upon success, the external global + variables tt_rows and tt_cols are set to the number of screen + rows and number of screen columns, respectively. As this + function is not implemented in all ck*tio.c modules, calls to + it must be wrapped in #ifdef CK_TTGWSIZ..#endif. NOTE: This + function must be available to use the TELNET NAWS feature + (Negotiate About Window Size) as well as Rlogin. + + int + tthang() + Hang up the current tty device. For real tty devices, turn off + DTR for about 1/3-1/2 second (or other length of time, + depending on the system). If the tty is really a network + connection, close it. Returns: + -1: on failure. + 0: if it does not even try to hang up. + 1: if it believes it hung up successfully. + + VOID + ttimoff() + Turns off all pending timer interrupts. + + int + ttinc(timo) int timo; (function is old, return codes are new) + Reads one character from the communication device. If timo is + greater than zero, wait the given number of seconds and then + time out if no character arrives, otherwise wait forever for a + character. Returns: + -3: internal error (e.g. tty modes set wrong) + -2: communications disconnect + -1: timeout or other error + >=0: the character that was read. + It is HIGHLY RECOMMENDED that ttinc() be internally buffered so + that calls to it are relatively inexpensive. If it is possible + to to implement ttinc() as a macro, all the better, for example + something like: + + #define ttinc(t) ( (--txbufn >= 0) ? txbuf[ttbufp++] : txbufr(t) ) + + (see description of txbufr() below) + + int + ttinl(dest,max,timo,eol,start,turn) int max,timo,turn; CHAR + *dest, eol, start; + ttinl() is Kermit's packet reader. Reads a packet from the + communications device, or up to max characters, whichever + occurs first. A line is a string of characters starting with + the start character up to and including the character given in + eol or until the length is exhausted, or, if turn != 0, until + the line turnaround character (turn) is read. If turn is 0, + ttinl() *should* use the packet length field to detect the end, + to allow for the possibility that the eol character appears + unprefixed in the packet data. (The turnaround character is for + half-duplex linemode connections.) + + If timo is greater than zero, ttinl() times out if the eol + character is not encountered within the given number of seconds + and returns -1. + + The characters that were input are copied into "dest" with + their parity bits stripped if parity is not none. The first + character copied into dest should be the start character, and + the last should be the final character of the packet (the last + block check character). ttinl() should also absorb and discard + the eol and turn characters, and any other characters that are + waiting to be read, up until the next start character, so that + subsequent calls to ttchk() will not succeed simply because + there are some terminators still sitting in the buffer that + ttinl() didn't read. This operation, if performed, MUST NOT + BLOCK (so if it can't be performed in a guaranteed nonblocking + way, don't do it). + + On success, ttinl() returns the number of characters read. + Optionally, ttinl() can sense the parity of incoming packets. + If it does this, then it should set the global variable ttprty + accordingly. ttinl() should be coded to be as efficient as + possible, since it is at the "inner loop" of packet reception. + ttinl() returns: + -1: Timeout or other possibly correctable error. + -2: Interrupted from keyboard. + -3: Uncorrectable i/o error -- connection lost, configuration + problem, etc. + >=0: on success, the number of characters that were actually + read and placed in the dest buffer, not counting the trailing + null. + + int + ttoc(c) char c; + Outputs the character c to the communication line. If the + operation fails to complete within two seconds, this function + returns -1. Otherwise it returns the number of characters + actually written to the tty (0 or 1). This function should only + be used for interactive, character-mode operations, like + terminal connection, script execution, dialer i/o, where the + overhead of the signals and alarms does not create a + bottleneck. (THIS DESCRIPTION NEEDS IMPROVEMENT -- If the + operation fails within a "certain amount of time"... which + might be dependent on the communication method, speed, etc. In + particular, flow-control deadlocks must be accounted for and + broken out of to prevent the program from hanging indefinitely, + etc.) + + int + ttol(s,n) int n; char *s; + Kermit's packet writer. Writes the n characters of the string + pointed to to by s. NOTE: It is ttol's responsibility to write + ALL of the characters, not just some of them. Returns: + -1: on a possibly correctable error (so it can be retried). + -3: on a fatal error, e.g. connection lost. + >=0: on success, the actual number of characters written (the + specific number is not actually used for anything). + + int + ttopen(ttname,lcl,modem,timo) char *ttname; int *lcl, modem, + timo; + Opens a tty device, if it is not already open. ttopen must + check to make sure the SAME device is not already open; if it + is, ttopen returns successfully without doing anything. If a + DIFFERENT device is currently open, ttopen() must call ttclos() + to close it before opening the new one. + + Parameters: + + ttname: + character string - device name or network host + name. + + lcl: + If called with lcl < 0, sets value of lcl as + follows: + 0: the terminal named by ttname is the job's + controlling terminal. + 1: the terminal named by ttname is not the job's + controlling terminal. + If the device is already open, or if the requested + device can't be opened, then lcl remains (and is + returned as) -1. + + modem: + Less than zero: this is the negative of the network + type, and ttname is a network host name. Network + types (from [112]ckcnet.h: + + NET_TCPB 1 TCP/IP Berkeley (socket) (implemented in [113]ckutio.c) + NET_TCPA 2 TCP/IP AT&T (streams) (not yet implemented) + NET_DEC 3 DECnet (not yet implemented) + + Zero or greater: ttname is a terminal device name. + Zero means a direct connection (don't use modem + signals). Positive means use modem signals + depending on the current setting of ttcarr (see + ttscarr()). + + timo: + > 0: number of seconds to wait for open() to return + before timing out. + <=0: no timer, wait forever (e.g. for incoming + call). + For real tty devices, ttopen() attempts to gain + exclusive access to the tty device, for example in + UNIX by creating a "lockfile" (in other operating + systems, like VMS, exclusive access probably + requires no special action). + + Side effects: + Copies its arguments and the tty file descriptor to + global variables that are available to the other + tty-related functions, with the lcl value altered as + described above. Gets all parameters and settings + associated with the line and puts them in a global area, + so that they can be restored by ttres(), e.g. when the + device is closed. + + Returns: + 0: on success + -5: if device is in use + -4: if access to device is denied + -3: if access to lock mechanism denied + -2: upon timeout waiting for device to open + -1: on other error + + int + ttpkt(speed,flow,parity) long speed; int flow, parity; + Puts the currently open tty device into the appropriate modes + for transmitting and receiving Kermit packets. + + Arguments: + + speed: + if speed > -1, and the device is a true tty device, + and Kermit is in local mode, ttpkt also sets the + speed. + + flow: + if in the range 0-3, ttpkt selects the + corresponding type of flow control. Currently 0 is + defined as no flow control, 1 is Xon/Xoff, and no + other types are defined. If (and this is a horrible + hack, but it goes back many years and will be hard + to eradicate) flow is 4, then the appropriate tty + modes are set for modem dialing, a special case in + which we talk to a modem-controlled line without + requiring carrier. If flow is 5, then we require + carrier. + + parity: + This is simply copied into a global variable so + that other functions (like ttinl, ttinc, etc) can + use it. + + Side effects: + Copies its arguments to global variables, flushes the + terminal device input buffer. + + Returns: + -1: on error. + 0: on success. + + int + ttsetflow(int) + Enables the given type of flow control on the open serial + communications device immediately. Arguments are the FLO_xxx + values from ckcdeb.h, except FLO_DIAL, FLO_DIAX, or FLO_AUTO, + which are not actual flow-control types. Returns 0 on success, + -1 on failure. + + #ifdef TTSPDLIST + long * + ttspdlist() + Returns a pointer to an array of longs, or NULL on failure. On + success, element 0 of the array contains number, n, indicating + how many follow. Elements 1-n are serial speeds, expressed in + bits per second, that are legal on this platform. The user + interface may use this list to construct a menu, keyword table, + etc. + + #endif /* TTSPDLIST */ + + int + ttres() + Restores the tty device to the modes and settings that were in + effect at the time it was opened (see ttopen). Returns: + -1: on error. + 0: on success. + + int + ttruncmd(string) char * string; + Runs the given command on the local system, but redirects its + input and output to the communication (SET LINE, SET PORT, or + SET HOST) device. Returns: + 0: on failure. + 1: on success. + + int + ttscarr(carrier) int carrier; + Copies its argument to a variable that is global to the other + tty-related functions, and then returns it. The values for + carrier are defined in ckcdeb.h: CAR_ON, CAR_OFF, CAR_AUTO. + ttopen(), ttpkt(), and ttvt() use this variable when deciding + how to open the tty device and what modes to select. The + meanings are these: + + CAR_OFF: Ignore carrier at all times. + CAR_ON: Require carrier at all times, except when dialing. This means, + for example, that ttopen() could hang forever waiting for carrier if + it is not present. + CAR_AUTO: If the modem type is zero (i.e. the connection is direct), + this is the same as CAR_OFF. If the modem type is positive, then heed + carrier during CONNECT (ttvt mode), but ignore it at other times + (packet mode, during SET LINE, etc). Compatible with pre-5A versions + of C-Kermit. This should be the default carrier mode. + + Kermit's DIAL command ignores the carrier setting, but + ttopen(), ttvt(), and ttpkt() all honor the carrier option in + effect at the time they are called. None of this applies to + remote mode (the tty device is the job's controlling terminal) + or to network host connections (modem type is negative). + + int + ttsndb() + Sends a BREAK signal on the tty device. On a real tty device, + send a real BREAK lasting approximately 275 milliseconds. If + this is not possible, simulate a BREAK by (for example) + dropping down some very low baud rate, like 50, and sending a + bunch of null characters. On a network connection, do the + appropriate network protocol for BREAK. Returns: + -1: on error. + 0: on success. + + int + ttsndlb() + Like ttsndb(), but sends a "Long BREAK" (approx 1.5 seconds). + For network connections, it is identical to ttsndb(). + Currently, this function is used only if CK_LBRK is defined (as + it is for UNIX and VMS). + + int + ttsspd(cps) int cps; + For serial devices only, set the device transmission speed to + (note carefully) TEN TIMES the argument. The argument is in + characters per second, but transmission speeds are in bits per + second. cps are used rather than bps because high speeds like + 38400 are not expressible in a 16-bit int but longs cannot be + used because keyword-table values are ints and not longs. If + the argument is 7, then the bps is 75, not 70. If the argument + is 888, this is a special code for 75/1200 split-speed + operation (75 bps out, 1200 bps in). Returns: + -1: on error, meaning the requested speed is not valid or + available. + >=0: on success (don't try to use this value for anything). + + int + ttvt(speed,flow) long speed; int flow; + Puts the currently open tty device into the appropriate modes + for terminal emulation. The arguments are interpreted as in + ttpkt(). Side effects: ttvt() stores its arguments in global + variables, and sets a flag that it has been called so that + subsequent calls can be ignored so long as the arguments are + the same as in the last effective call. Other functions, such + as ttopen(), ttclose(), ttres(), ttvt(), etc, that change the + tty device in any way must unset this flag. In UNIX Kermit, + this flag is called tvtflg. + + int + ttwmdm(mdmsig,timo) int mdmsig, timo; + Waits up to timo seconds for all of the given modem signals to + appear. mdmsig is a bit mask, in which a bit is on (1) or off + (0) according to whether the corresponding signal is to be + waited for. These symbols are defined in ckcdeb.h: + BM_CTS (bit 0) means wait for Clear To Send + BM_DSR (bit 1) means wait for Data Set Ready + BM_DCD (bit 2) means wait for Carrier Detect + Returns: + -3: Not implemented. + -2: This line does not have modem control. + -1: Timeout: time limit exceeded before all signals were + detected. + 1: Success. + + int + ttxin(n,buf) int n; CHAR *buf; + Reads x characters from the tty device into the specified buf, + stripping parity if parity is not none. This call waits + forever, there is no timeout. This function is designed to be + called only when you know that at least x characters are + waiting to be read (as determined, for example, by ttchk()). + This function should use the same buffer as ttinc(). + + int + txbufr(timo) int timo; + Reads characters into the internal communications input buffer. + timo is a timeout interval, in seconds. 0 means no timeout, + wait forever. Called by ttinc() (and possibly ttxin() and + ttinl()) when the communications input buffer is empty. The + buffer should be called ttxbuf[], its length is defined by the + symbol TXBUFL. The global variable txbufn is the number of + characters available to be read from ttxbuf[], and txbufp is + the index of the next character to be read. Should not be + called if txbufn > 0, in which case the buffer does not need + refilling. This routine returns: + -2: Communications disconnect + -1: Timeout + >=0: A character (0 - 255) On success, the first character that + was read, with the variables txbufn and txbufp set + appropriately for any remaining characters. + NOTE: Currently this routine is used internally only by the + UNIX and VMS versions. The aim is to make it available to all + versions so there is one single coherent and efficient way of + reading from the communications device or network. + + 4.E.2.6. Miscellaneous system-dependent functions + + VOID + ztime(s) char **s; + Returns a pointer, s, to the current date-and-time string in s. + This string must be in the fixed-field format associated with + the C runtime asctime() function, like: "Sun Sep 16 13:23:45 + 1973\n" so that callers of this function can extract the + different fields. The pointer value is filled in by ztime, and + the data it points to is not safe, so should be copied to a + safe place before use. ztime() has no return value. As a side + effect, this routine can also fill in the following two + external variables (which must be defined in the + system-dependendent modules for each platform): + long ztusec: Fraction of seconds of clock time, microseconds. + long ztmsec: Fraction of seconds of clock time, milliseconds. + If these variables are not set by zstime(), they remain at + their initial value of -1L. + + int + gtimer() + Returns the current value of the elapsed time counter in + seconds (see rtimer), or 0 on any kind of error. + + #ifdef GFTIMER + CKFLOAT + gftimer() + Returns the current value of the elapsed time counter in + seconds, as a floating point number, capable of representing + not only whole seconds, but also the fractional part, to the + millisecond or microsecond level, whatever precision is + available. Requires a function to get times at subsecond + precision, as well as floating-point support. That's why it's + #ifdef'd. + + #endif /* GFTIMER */ + + int + msleep(m) int m; + Sleeps (pauses, does nothing) for m milliseconds (a millisecond + is one thousandth of a second). Returns: + -1: on failure. + 0: on success. + + VOID + rtimer() + Sets the elapsed time counter to zero. If you want to time how + long an operation takes, call rtimer() when it starts and + gtimer when it ends. rtimer() has no return value. + + #ifdef GFTIMER + VOID + rftimer() + Sets the elapsed time counter to zero. If you want to time how + long an operation takes, call rftimer() when it starts and + gftimer when it ends. rftimer() has no return value. Note: + rftimer() is to be used with gftimer() and rtimer() is to be + used with gtimer(). See the rftimer() description. + + #endif /* GFTIMER */ + + int + sysinit() + Does whatever needs doing upon program start. In particular, if + the program is running in any kind of privileged mode, turns + off the privileges (see priv_ini()). Returns: + -1: on error. + 0: on success. + + int + syscleanup() + Does whatever needs doing upon program exit. Returns: + -1: on error. + 0: on success. + + int + psuspend() + Suspends the Kermit process, puts it in the background so it + can be continued ("foregrounded") later. Returns: + -1: if this function is not supported. + 0: on success. + + [ [114]Contents ] [ [115]C-Kermit ] [ [116]Kermit Home ] + ________________________________________________________________________ + + 4.F. Group F: Network Support + + As of version 5A, C-Kermit includes support for several networks. + Originally, this was just worked into the ttopen(), ttclos(), ttinc(), + ttinl(), and similar routines in [117]ckutio.c. But this made it + impossible to share this code with non-UNIX versions, like VMS, + AOS/VS, OS/2, etc. So as of edit 168, network code has been separated + out into its own module and header file, ckcnet.c and ckcnet.h: + + [118]ckcnet.h: Network-related symbol definitions. + [119]ckcnet.c: Network i/o (TCP/IP, X.25, etc), shared by most + platforms. + [120]cklnet.c: Network i/o (TCP/IP, X.25, etc) specific to Stratus + VOS. + + The routines and variables in these modules fall into two categories: + + 1. Support for specific network packages like SunLink X.25 and TGV + MultiNet, and: + 2. support for specific network virtual terminal protocols like CCITT + X.3 and TCP/IP Telnet. + + Category (1) functions are analogs to the tt*() functions, and have + names like netopen, netclos, nettinc, etc. Group A-D modules do not + (and must not) know anything about these functions -- they continue to + call the old Group E functions (ttopen, ttinc, etc). Category (2) + functions are protocol specific and have names prefixed by a protocol + identifier, like tn for telnet x25 for X.25. + + ckcnet.h contains prototypes for all these functions, as well as + symbol definitions for network types, protocols, and network- and + protocol- specific symbols, as well as #includes for the header files + necessary for each network and protocol. + + The following functions are to be provided for networks that do not + use normal system i/o (open, read, write, close): + + int + netopen() + To be called from within ttopen() when a network connection is + requested. Calling conventions and purpose same as Group E + ttopen(). + + int + netclos() + To be called from within ttclos() when a network connection is + being closed. Calling conventions and purpose same as Group E + ttclos(). + + int + nettchk() + To be called from within ttchk(). Calling conventions and + purpose same as Group E ttchk(). + + int + netflui() + To be called from within ttflui(). Calling conventions and + purpose same as Group E ttflui(). + + int + netbreak() + To send a network break (attention) signal. Calling conventions + and purpose same as Group E ttsndbrk(). + + int + netinc() + To get a character from the network. Calling conventions same + as Group E ttsndbrk(). + + int + nettoc() + Send a "character" (byte) to the network. Calling conventions + same as Group E ttoc(). + + int + nettol() + Send a "line" (sequence of bytes) to the network. Calling + conventions same as Group E ttol(). + + Conceivably, some systems support network connections simply by + letting you open a device of a certain name and letting you do i/o to + it. Others (like the Berkeley sockets TCP/IP library on UNIX) require + you to open the connection in a special way, but then do normal i/o + (read, write). In such a case, you would use netopen(), but you would + not use nettinc, nettoc, etc. + + VMS TCP/IP products have their own set of functions for all network + operations, so in that case the full range of netxxx() functions is + used. + + The technique is to put a test in each corresponding ttxxx() function + to see if a network connection is active (or is being requested), test + for which kind of network it is, and if necessary route the call to + the corresponding netxxx() function. The netxxx() function must also + contain code to test for the network type, which is available via the + global variable ttnet. + + [ [121]Contents ] [ [122]C-Kermit ] [ [123]Kermit Home ] + ______________________________________________________________________ + + 4.F.1. Telnet Protocol + + (This section needs a great deal of updating...) + + As of edit 195, Telnet protocol is split out into its own files, since + it can be implemented in remote mode, which does not have a network + connection: + + [124]ckctel.h: Telnet protocol symbol definitions. + [125]ckctel.c: Telnet protocol. + + The Telnet protocol is supported by the following variables and + routines: + + int tn_init + Nonzero if telnet protocol initialized, zero otherwise. + + int + tn_init() + Initialize the telnet protocol (send initial options). + + int + tn_sopt() + Send a telnet option. + + int + tn_doop() + Receive and act on a telnet option from the remote. + + int + tn_sttyp() + Send terminal type using telnet protocol. + ______________________________________________________________________ + + 4.F.2. FTP Protocol + + (To be filled in...) + ______________________________________________________________________ + + 4.F.3. HTTP Protocol + + (To be filled in...) + ______________________________________________________________________ + + 4.F.4. X.25 Networks + + These routines were written SunLink X.25 and have since been adapted + to at least on one other: IBM AIXLink/X.25. + + int + x25diag() + Reads and prints X.25 diagnostics + + int + x25oobh() + X.25 out of band signal handler + + int + x25intr() + Sends X.25 interrupt packet + + int + x25reset() + Resets X.25 virtual circuit + + int + x25clear() + Clear X.25 virtual circuit + + int + x25stat() + X.25 status + + int + setqbit() + Sets X.25 Q-bit + + int + resetqbit() + Resets X.25 Q-bit + + int + x25xin() + Reads n characters from X.25 circuit. + + int + x25inl() + Read a Kermit packet from X.25 circuit. + + [ [126]Contents ] [ [127]C-Kermit ] [ [128]Kermit Home ] + ______________________________________________________________________ + + 4.F.5. Adding New Network Types + + Example: Adding support for IBM X.25 and Hewlett Packard X.25. First, + add new network type symbols for each one. There are already some + network types defined for other X.25 packages: + + NET_SX25 is the network-type ID for SunLink X.25. + NET_VX25 is the network-type ID for VOS X.25. + + So first you should new symbols for the new network types, giving them + the next numbers in the sequence, e.g.: + +#define NET_HX25 11 /* Hewlett-Packard X.25 */ +#define NET_IX25 12 /* IBM X.25 */ + + This is in ckcnet.h. + + Then we need symbols to say that we are actually compiling in the code + for these platforms. These would be defined on the cc command line: + + -DIBMX25 (for IBM) + -DHPX25 (for HP) + + So we can build C-Kermit versions for AIX and HP-UX both with and + without X.25 support (since not all AIX and IBM systems have the + needed libraries, and so an executable that was linked with them might + no load). + + Then in ckcnet.h: + +#ifdef IBMX25 +#define ANYX25 +#endif /* IBMX25 */ + +#ifdef HPX25 +#define ANYX25 +#endif /* HPX25 */ + + And then use ANYX25 for code that is common to all of them, and IBMX25 + or HPX25 for code specific to IBM or HP. + + It might also happen that some code can be shared between two or more + of these, but not the others. Suppose, for example, that you write + code that applies to both IBM and HP, but not Sun or VOS X.25. Then + you add the following definition to ckcnet.h: + +#ifndef HPORIBMX25 +#ifdef HPX25 +#define HPORIBMX25 +#else +#ifdef IBMX25 +#define HPORIBMX25 +#endif /* IBMX25 */ +#endif /* HPX25 */ +#endif /* HPORIBMX25 */ + + You can NOT use constructions like "#if defined (HPX25 || IBMX25)"; + they are not portable. + + [ [129]Contents ] [ [130]C-Kermit ] [ [131]Kermit Home ] + ________________________________________________________________________ + + 4.G. Group G: Formatted Screen Support + + So far, this is used only for the fullscreen local-mode file transfer + display. In the future, it might be extended to other uses. The + fullscreen display code is in and around the routine screenc() in + [132]ckuusx.c. + + In the UNIX version, we use the curses library, plus one call from the + termcap library. In other versions (OS/2, VMS, etc) we insert dummy + routines that have the same names as curses routines. So far, there + are two methods for simulating curses routines: + + 1. In VMS, we use the Screen Management Library (SMG), and insert + stubs to convert curses calls into SMG calls. + 2. In OS/2, we use the MYCURSES code, in which the stub routines + actually emit the appropriate escape sequences themselves. + + Here are the stub routines: + + int + tgetent(char *buf, char *term) + Arguments are ignored. Returns 1 if the user has a supported + terminal type, 0 otherwise. Sets a global variable (for + example, "isvt52" or "isdasher") to indicate the terminal type. + + VOID + move(int row, int col) + Sends the escape sequence to position the cursor at the + indicated row and column. The numbers are 0-based, e.g. the + home position is 0,0. + + int + clear() + Sends the escape sequence to clear the screen. + + int + clrtoeol() + Sends the escape sequence to clear from the current cursor + position to the end of the line. + + In the MYCURSES case, code must be added to each of the last three + routines to emit the appropriate escape sequences for a new terminal + type. + + clearok(curscr), wrefresh() + In real curses, these two calls are required to refresh the + screen, for example after it was fractured by a broadcast + message. These are useful only if the underlying screen + management service keeps a copy of the entire screen, as curses + and SMG do. C-Kermit does not do this itself. + + [ [133]Contents ] [ [134]C-Kermit ] [ [135]Kermit Home ] + ________________________________________________________________________ + + 4.H. Group H: Pseudoterminal Support + + (To be filled in...) + ________________________________________________________________________ + + 4.I. Group I: Security + + (To be filled in...) + + [ [136]Contents ] [ [137]C-Kermit ] [ [138]Kermit Home ] + ________________________________________________________________________ + + APPENDIX I. FILE PERMISSIONS + + I.1. Format of System-Dependent File Permissions in A-Packets + + The format of this field (the "," attribute) is interpreted according + to the System ID ("." Attribute). + + For UNIX (System ID = U1), it's the familiar 3-digit octal number, the + low-order 9 bits of the filemode: Owner, Group, World, e.g. 660 = + read/write access for owner and group, none for world, recorded as a + 3-digit octal string. High-order UNIX permission bits are not + transmitted. + + For VMS (System ID = D7), it's a 4-digit hex string, representing the + 16-bit file protection WGOS fields (World,Group,Owner,System), in that + order (which is the reverse of how they're shown in a directory + listing); in each field, Bit 0 = Read, 1 = Write, 2 = Execute, 3 = + Delete. A bit value of 0 means permission is granted, 1 means + permission is denied. Sample: + + r-01-00-^A/!FWERMIT.EXE'" + s-01-00-^AE!Y/amd/watsun/w/fdc/new/wermit.exe.DV + r-02-01-^A]"A."D7""B8#119980101 18:14:05!#8531&872960,$A20B-!7(#512@ #.Y + s-02-01-^A%"Y.5! + + A VMS directory listing shows the file's protection as (E,RWED,RED,RE) + which really means (S=E,O=RWED,G=RED,W=RE), which is reverse order + from the internal storage, so (RE,RED,RWED,E). Now translate each + letter to its corresponding bit: + + RE=0101, RED=1101, RWED=1111, E=0010 + + Now reverse the bits: + + RE=1010, RED=0010, RWED=0000, E=1101 + + This gives the 16-bit quantity: + + 1010001000001101 + + This is the internal representation of the VMS file permission; in + hex: + + A20B + + as shown in the sample packet above. + + The VMS format probably would also apply to RSX or any other FILES-11 + system. + + I.2. Handling of Generic Protection + + To be used when the two systems are different (and/or do not recognize + or understand each other's local protection codes). + + First of all, the book is wrong. This should not be the World + protection, but the Owner protection. The other fields should be set + according to system defaults (e.g. UNIX umask, VMS default protection, + etc), except that no non-Owner field should give more permissions than + the Owner field. + + [ [139]Top ] [ [140]Contents ] [ [141]C-Kermit Home ] [ [142]Kermit + Home ] + _________________________________________________________________ + + + C-Kermit Program Logic Manual / [143]The Kermit Project / + [144]Columbia University / [145]kermit@columbia.edu / 10 April 2004 + +References + + 1. http://www.columbia.edu/kermit/ + 2. http://www.columbia.edu/ + 3. http://www.columbia.edu/kermit/ckcplm.html + 4. http://www.columbia.edu/kermit/ckermit.html + 5. http://www.columbia.edu/kermit/index.html + 6. http://www.columbia.edu/kermit/ckcplm.html#x1 + 7. http://www.columbia.edu/kermit/ckcplm.html#x2 + 8. http://www.columbia.edu/kermit/ckcplm.html#x3 + 9. http://www.columbia.edu/kermit/ckcplm.html#x4 + 10. http://www.columbia.edu/kermit/ckcplm.html#x4.A + 11. http://www.columbia.edu/kermit/ckcplm.html#x4.B + 12. http://www.columbia.edu/kermit/ckcplm.html#x4.C + 13. http://www.columbia.edu/kermit/ckcplm.html#x4.D + 14. http://www.columbia.edu/kermit/ckcplm.html#x4.E + 15. http://www.columbia.edu/kermit/ckcplm.html#x4.F + 16. http://www.columbia.edu/kermit/ckcplm.html#x4.G + 17. http://www.columbia.edu/kermit/ckcplm.html#x4.H + 18. http://www.columbia.edu/kermit/ckcplm.html#x4.I + 19. http://www.columbia.edu/kermit/ckcplm.html#xa1 + 20. http://www.columbia.edu/kermit/ckcplm.html#contents + 21. http://www.columbia.edu/kermit/ckcplm.html#contents + 22. http://www.columbia.edu/kermit/ckermit.html + 23. http://www.columbia.edu/kermit/index.html + 24. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.w + 25. http://www.columbia.edu/kermit/ckcplm.html#contents + 26. http://www.columbia.edu/kermit/ckermit.html + 27. http://www.columbia.edu/kermit/index.html + 28. http://www.columbia.edu/kermit/ckcplm.html#x3.2 + 29. http://www.columbia.edu/kermit/ckcplm.html#contents + 30. http://www.columbia.edu/kermit/ckermit.html + 31. http://www.columbia.edu/kermit/index.html + 32. http://www.columbia.edu/kermit/ckcplm.html#x4.A + 33. http://www.columbia.edu/kermit/ckcplm.html#contents + 34. http://www.columbia.edu/kermit/ckermit.html + 35. http://www.columbia.edu/kermit/index.html + 36. http://www.columbia.edu/kermit/ckcplm.html#contents + 37. http://www.columbia.edu/kermit/ckermit.html + 38. http://www.columbia.edu/kermit/index.html + 39. http://www.columbia.edu/kermit/ckcplm.html#contents + 40. http://www.columbia.edu/kermit/ckermit.html + 41. http://www.columbia.edu/kermit/index.html + 42. ftp://kermit.columbia.edu/kermit/c-kermit/ckclib.h + 43. ftp://kermit.columbia.edu/kermit/c-kermit/ckclib.c + 44. http://www.columbia.edu/kermit/ckcplm.html#x3.1 + 45. http://www.columbia.edu/kermit/ckcplm.html#contents + 46. http://www.columbia.edu/kermit/ckermit.html + 47. http://www.columbia.edu/kermit/index.html + 48. ftp://kermit.columbia.edu/kermit/c-kermit/ckcsym.h + 49. ftp://kermit.columbia.edu/kermit/c-kermit/ckcasc.h + 50. ftp://kermit.columbia.edu/kermit/c-kermit/ckcsig.h + 51. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h + 52. ftp://kermit.columbia.edu/kermit/c-kermit/ckcker.h + 53. ftp://kermit.columbia.edu/kermit/c-kermit/ckcxla.h + 54. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c + 55. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.w + 56. ftp://kermit.columbia.edu/kermit/c-kermit/ckcfns.c + 57. ftp://kermit.columbia.edu/kermit/c-kermit/ckcfn2.c + 58. ftp://kermit.columbia.edu/kermit/c-kermit/ckcfn3.c + 59. http://www.columbia.edu/kermit/ckcplm.html#x4.B + 60. http://www.columbia.edu/kermit/ckcplm.html#x4.E + 61. http://www.columbia.edu/kermit/ckcplm.html#x4.D + 62. http://www.columbia.edu/kermit/ckcplm.html#contents + 63. http://www.columbia.edu/kermit/ckermit.html + 64. http://www.columbia.edu/kermit/index.html + 65. http://www.columbia.edu/kermit/ckcplm.html#x4.B + 66. ftp://kermit.columbia.edu/kermit/c-kermit/ckuxla.c + 67. ftp://kermit.columbia.edu/kermit/c-kermit/ckuxla.h + 68. ftp://kermit.columbia.edu/kermit/c-kermit/ckcxla.h + 69. ftp://kermit.columbia.edu/kermit/c-kermit/ckuxla.h + 70. ftp://kermit.columbia.edu/kermit/c-kermit/ckmxla.h + 71. ftp://kermit.columbia.edu/kermit/c-kermit/ck?xla + 72. ftp://kermit.columbia.edu/kermit/c-kermit/ckcuni.h + 73. ftp://kermit.columbia.edu/kermit/c-kermit/ckcuni.c + 74. http://www.columbia.edu/kermit/ckcplm.html#contents + 75. http://www.columbia.edu/kermit/ckermit.html + 76. http://www.columbia.edu/kermit/index.html + 77. http://www.columbia.edu/kermit/ckcplm.html#x4.B + 78. ftp://kermit.columbia.edu/kermit/c-kermit/ckucmd.h + 79. ftp://kermit.columbia.edu/kermit/c-kermit/ckucmd.c + 80. http://www.columbia.edu/kermit/ckcplm.html#x4.E + 81. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusr.h + 82. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusr.c + 83. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus2.c + 84. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus3.c + 85. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus4.c + 86. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusy.c + 87. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusx.c + 88. ftp://kermit.columbia.edu/kermit/c-kermit/ckuver.h + 89. ftp://kermit.columbia.edu/kermit/c-kermit/ckuscr.c + 90. ftp://kermit.columbia.edu/kermit/c-kermit/ckudia.c + 91. ftp://kermit.columbia.edu/kermit/c-kermit/ckucon.c + 92. ftp://kermit.columbia.edu/kermit/c-kermit/ckucns.c + 93. http://www.columbia.edu/kermit/ckcplm.html#x4.E + 94. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c + 95. http://www.columbia.edu/kermit/ckcplm.html#contents + 96. http://www.columbia.edu/kermit/ckermit.html + 97. http://www.columbia.edu/kermit/index.html + 98. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c + 99. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 100. ftp://kermit.columbia.edu/kermit/c-kermit/ckusig.c + 101. ftp://kermit.columbia.edu/kermit/c-kermit/ckvfio.c + 102. ftp://kermit.columbia.edu/kermit/c-kermit/ckusig.c + 103. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c + 104. http://www.columbia.edu/kermit/ckcplm.html#contents + 105. http://www.columbia.edu/kermit/ckermit.html + 106. http://www.columbia.edu/kermit/index.html + 107. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 108. ftp://kermit.columbia.edu/kermit/c-kermit/ckvtio.c + 109. http://www.columbia.edu/kermit/ckcplm.html#x2 + 110. http://www.columbia.edu/kermit/ckcplm.html#xa1 + 111. http://www.columbia.edu/kermit/ckuins.html + 112. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.h + 113. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 114. http://www.columbia.edu/kermit/ckcplm.html#contents + 115. http://www.columbia.edu/kermit/ckermit.html + 116. http://www.columbia.edu/kermit/index.html + 117. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 118. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.h + 119. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.c + 120. ftp://kermit.columbia.edu/kermit/c-kermit/cklnet.c + 121. http://www.columbia.edu/kermit/ckcplm.html#contents + 122. http://www.columbia.edu/kermit/ckermit.html + 123. http://www.columbia.edu/kermit/index.html + 124. ftp://kermit.columbia.edu/kermit/c-kermit/ckctel.h + 125. ftp://kermit.columbia.edu/kermit/c-kermit/ckctel.c + 126. http://www.columbia.edu/kermit/ckcplm.html#contents + 127. http://www.columbia.edu/kermit/ckermit.html + 128. http://www.columbia.edu/kermit/index.html + 129. http://www.columbia.edu/kermit/ckcplm.html#contents + 130. http://www.columbia.edu/kermit/ckermit.html + 131. http://www.columbia.edu/kermit/index.html + 132. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusx.c + 133. http://www.columbia.edu/kermit/ckcplm.html#contents + 134. http://www.columbia.edu/kermit/ckermit.html + 135. http://www.columbia.edu/kermit/index.html + 136. http://www.columbia.edu/kermit/ckcplm.html#contents + 137. http://www.columbia.edu/kermit/ckermit.html + 138. http://www.columbia.edu/kermit/index.html + 139. http://www.columbia.edu/kermit/ckcplm.html#top + 140. http://www.columbia.edu/kermit/ckcplm.html#contents + 141. http://www.columbia.edu/kermit/ckermit.html + 142. http://www.columbia.edu/kermit/index.html + 143. http://www.columbia.edu/kermit/index.html + 144. http://www.columbia.edu/ + 145. mailto:kermit@columbia.edu diff --git a/ckermit.ini b/ckermit.ini new file mode 100644 index 0000000..f007561 --- /dev/null +++ b/ckermit.ini @@ -0,0 +1,618 @@ +COMMENT - Standard C-Kermit initialization file +; +; For C-Kermit Version: 8.0 +; +; Filename: +; .kermrc (UNIX, OS-9, Aegis) +; CKERMIT.INI (OS/2, VMS, OpenVMS, AOS/VS, Atari ST, Commodore Amiga) +; ckermit.ini (Stratus VOS) +; K95.INI (Kermit 95 -- but this big version is not used there) +; K2.INI (Kermit/2 -- but ditto) +; +; Authors: +; Frank da Cruz, Christine M. Gianone, Jeffrey Altman +; Columbia University, New York, NY 10025-7799, USA +; +; This is the standard and recommended C-Kermit 8.0 initialization file. To +; override settings or definitions made in this file, to add new settings or +; definitions, or to make any other desired customizations, create a separate, +; personal customization file called: +; +; .mykermrc (UNIX, OS-9, Aegis, BeBox, Plan 9) +; CKERMOD.INI (OS/2, VMS, OpenVMS, AOS/VS, Atari ST, Commodore Amiga) +; ckermod.ini (VOS) +; +; You can also define the customization filename in an environment +; variable (logical name in VMS), CKERMOD, which takes precedence over +; the names shown above. +; +; WHAT THIS FILE DOES: +; +; . Defines your default dialing directory name: +; .kdd for UNIX, OS-9 and Aegis; CKERMIT.KDD for other operating systems. +; You can override this with the environment variable K_DIAL_DIRECTORY +; . Defines your default network directory name: +; .knd for UNIX, OS-9 and Aegis; CKERMIT.KND for other operating systems. +; You can override this with the environment variable K_NET_DIRECTORY +; . Defines your default services directory name: +; .ksd for UNIX, OS-9 and Aegis; CKERMIT.KSD for other operating systems. +; You can override this with environment variable K_SERVICE_DIRECTORY. +; . Defines your customization file name (name given above) +; . Performs system-dependent setups for UNIX, VMS, OS/2, etc. +; . Defines VTPRINT macros for use with K95, MS-DOS Kermit, etc. +; . If you have a services directory, all the macros needed to use it are +; defined. If you don't have a services directory, the macros are not +; defined and Kermit starts faster. +; . Executes your personal customization file, if you have one. +; NOTE: Your customization file is NOT executed by Kermit itself; it is +; executed by this file. +; +; In UNIX, with C-Kermit 7.0 and later, you can store this file with a name +; other than .kermrc, and it will not be executed automatically, but, if you +; give this file execute permission, you can execute directly because of the +; "kerbang line" at the top, whenever you want all of the above actions to +; occur. The kerbang line must reflect the actual full path of the Kermit +; 7.0-or-later executable. +; +; C-Kermit 6.0 is documented in the book "Using C-Kermit", 2nd Edition, +; by Frank da Cruz and Christine M. Gianone, 1997, Digital Press / +; Butterworth-Heinemann, ISBN 1-55558-164-1. New features of subsequent +; versions are documented at the Kermit website: +; http://www.columbia.edu/kermit/ +; +; Everything after this point depends on the script programming language. +; The CHECK command terminates this command file immediately if the script +; programming language (IF command) is not configured. +; +set take error on ; This makes CHECK quit if no script language. +check if ; Do we have an IF command? If not, quit now. +set take error off ; Back to normal. + +local _sd _servicedir _xp ; Declare local variables. + +COMMENT - C-Kermit version 6.0 or later required. +; + +asg _xp \v(xprogram) +if not def _xp asg _xp \v(program) +if not equal "\m(_xp)" "C-Kermit" - + stop 1 \v(cmdfile): This initialization file is only for C-Kermit. +echo Executing \v(cmdfile) for \v(system)... +if < \v(version) 60000 - + stop 1 \v(cmdfile): C-Kermit 6.0 or later required. + +forward \v(system) ; First do system-dependent items... + +:unknown ; Should not happen +Stop 1 Error: System type unknown! + +:Aegis ; Apollo Aegis and +:UNIX ; UNIX, all versions +asg _myinit - + \v(home).mykermrc ; Customization filename +if remote forward COMMON ; Skip local-mode items if "-R" +asg _dialdir - + \v(home).kdd ; C-Kermit dialing directory +asg _netdir - + \v(home).knd ; C-Kermit network directory +asg _servicedir - + \v(home).ksd ; C-Kermit services directory +forward COMMON ; End of UNIX section + +:OS9/68K ; OS-9 +asg _myinit - + \v(home).mykermrc ; Customization filename +if remote forward COMMON +asg _dialdir - + \v(home).kdd ; C-Kermit dialing directory +asg _netdir - + \v(home).knd ; C-Kermit network directory +asg _servicedir - + \v(home).ksd ; C-Kermit services directory +else set file display crt +forward COMMON ; End of OS-9 section + +:VMS ; VMS and OpenVMS +forward COMMON + +:OS/2 ; Kermit 95 +:WIN32 +echo This initialization file is not for use with K95. +forward COMMON ; End of OS/2 section + +:AOS/VS ; Data General AOS/VS +set window 1 ; Sliding windows don't work +set file char dg-international ; File character-set +set xfer char latin1 ; Transfer character-set +set file display crt ; File transfer fisplay +def cli push ; Escape to CLI +def reset - ; Macro to reset DG DASHER terminal + run write [!ascii 236 306 301] +forward COMMON ; End of AOS/VS section + +:Amiga ; Commodore Amiga +def cls echo \27[H\27[2J ; CLS command to clear the screen +set file char latin1 ; Use Latin Alphabet 1 for file transfer +set xfer char latin1 ; ... +forward COMMON ; End of Amiga section + +:Atari_ST ; Atari ST +def cls echo \27H\27J ; Clear screen a`la VT52 +set server display on ; Show file xfer display in server mode too +set server timeout 15 ; Nonzero required for ^C interruption! +forward COMMON ; End of Atari ST section + +:Macintosh ; Apple Macintosh +set server display on ; Show file xfer display in server mode too. +forward COMMON + +:Stratus_VOS ; Stratus VOS +asg _myinit \v(home)ckermod.ini +if remote forward COMMON +asg _dialdir \v(home)ckermit.kdd +asg _netdir \v(home)ckermit.knd +asg _servicedir \v(home)ckermit.ksd +forward COMMON ; End of Stratus VOS section + +:COMMON ; For all systems + +; Define macros that are useful when running C-Kermit in remote mode. +; These macros serve no purpose on local-mode-only versions such as +; OS/2, Macintosh, Amiga, and Atari ST Kermit, so we skip defining them +; for those systems. +; +if not = 0 \findex(\v(system),WIN32:OS/2:Macintosh:Amiga:Atari_ST) - + forward files + +; VTPRINT macro. Print a file on your PC's local printer. + +def VTPRINT echo \27[5i, type \%1, echo \27[4i +; or if your printer needs a formfeed to force the page out: +; def VTPRINT def echo \27[5i, type \%1, echo \12\27[4i + +; Macros for host-initiated file transfer using APC: +; NOT NEEDED ANY MORE because of autodownload/autoupload. +; Remove the following FORWARD command to reinstate these definitions: + +:FILES + +; Get customization and directory file names. Environment variables take +; precedence, so you do not have to edit this file to change these filenames. +; +if def \$(CKERMOD) assign _myinit \$(CKERMOD) +if not def _myinit assign _myinit \v(home)CKERMOD.INI + +if remote forward CUSTOM ; Skip all this if -R given on command line + +if def \$(K_NET_DIRECTORY) assign _netdir \$(K_NET_DIRECTORY) +if not def _netdir assign _netdir \v(home)CKERMIT.KND + +if def \$(K_DIAL_DIRECTORY) assign _dialdir \$(K_DIAL_DIRECTORY) +if not def _dialdir assign _dialdir \v(home)CKERMIT.KDD + +CHECK DIAL ; Is there a DIAL command? +xif fail { ; No. + echo DIAL disabled + forward CUSTOM +} + +CHECK NETWORK +xif success { + xif exist \m(_netdir) { + set net directory \m(_netdir) + echo { Network directory is \m(_netdir) } + } +} + +if eq "\v(name)" "telnet" forward CUSTOM + +xif exist \m(_dialdir) { + set dial directory \m(_dialdir) + echo { Dial directory is \m(_dialdir) } +} + +COMMENT - Services directory + +if def \$(K_SERVICE_DIRECTORY) assign _servicedir \$(K_SERVICE_DIRECTORY) +if not def _servicedir assign _servicedir \v(home)CKERMIT.KSD + +; If no services directory is found skip all the big macro definitions and +; go straight to the bottom, where we execute the customization file. + +if not exist \m(_servicedir) forward custom + +echo { Services directory is \m(_servicedir)} + +def MAX_SVCS 200 ; Adjust this if you have more entries +define _sd 0 ; Assume no services directory +open read \m(_servicedir) ; Try to open services directory file +xif success { + declare \&d[\m(MAX_SVCS)] ; It's open, declare directory array + for \%i 1 \m(MAX_SVCS) 1 { ; Read the lines into the array + read \&d[\%i] + if fail break + } + close read + xif > \%i \m(MAX_SVCS) { + echo Too many entries in services directory + echo { Maximum is \m(MAX_SVCS).} + echo { Change definition of MAX_SVCS in \v(cmdfile) to allow more. } + echo { Services directory disabled.} + } else { + asg \&d[0] \feval(\%i - 1) + define _sd 1 + } +} + +xif not \m(_sd) { + def access echo { Services directory not available.} + asg list \m(access) +} else { + def FIND { + set case off + for \%i 1 \&d[0] 1 { + if eq {\%1} {\fsubstr(\&d[\%i],1,\flen(\%1))} break + } + if not > \%i \&d[0] return \&d[\%i] + } + def LIST { + xif > \v(argc) 1 { + do find \%1 + if def \v(return) echo \v(return) + else echo \%1: Not found + } else { + echo \&d[0] items in services directory: + for \%i 1 \&d[0] 1 { echo \fcont(\&d[\%i]) } + } + } + def SPLIT { asg _word1 \%1, asg _word2 \%2 } + def DOACCESS { ; (Used internally by ACCESS macro) + do \%5 \%6 \%7 \%8 \%9 ; Do the connection macro + if fail end 1 + split \%3 ; Get words from \%3 + asg \%3 \m(_word1) + asg \%2 \m(_word2) + do \%3 \%4 {\%1} \%2 ; Login macro, userid, password, prompt + } + def ACCESS { + if not defined \%1 end 1 access what? ; Check service + do find \%1 ; Look it up + if success doaccess {\%2} \v(return) ; OK, try it + else end 1 "\%1" not in services directory ; Not found + if fail end 1 ; DOACCESS failed? + xif eq \v(cmdlevel) 1 { + echo + echo ACCESS: Login succeeded - CONNECTing... + show escape + output \13 + connect /quietly + } + } +} + +:CONNECTION ; Macros for making connections + +COMMENT - SERIAL macro. Arguments: +; \%1 = device name +; \%2 = speed +; +def SERIAL { + if < \v(argc) 3 ; All arguments given? + end 1 Usage: SERIAL device speed ; No. + set line \%1 ; OK, try to SET LINE. + if failure - ; If this failed, + end 1 Can't open device: \%1 ; print message and quit. + set speed \%2 ; Try to set the speed. + if fail end 1 Unsupported speed: \%2 ; Failed. + echo Connection successful. ; Succeeded. +} + +COMMENT - NET macro. Arguments: +; \%1 = network type +; \%2 = host name or address +; +def NET { + if < \v(argc) 3 end 1 Usage: NET network host + set network type \%1 + if fail end 1 unsupported network: \%1 + set login user ; Don't send user ID. + set host \%2 + if fail end 1 Can't reach host: \%2 + echo Connection successful. +} + +COMMENT - CALL macro. Arguments: +; +; \%1 = modem type +; \%2 = device name +; \%3 = speed +; \%4 = phone number +; +def CALL { + if < \v(argc) 5 - ; All arguments present? + end 1 Usage: CALL modem device speed number + xif not equal {\v(modem)} {\%1} { ; Set modem type + set modem \%1 + if fail end 1 unknown modem type: \%1 + } + xif not equal {\v(line)} {\%2} { ; Communication device + set line \%2 + if fail end 1 can't open device: \%2 + } + xif not equal {\v(speed)} {\%3} { ; Communication speed + set speed \%3 + if fail end 1 unsupported speed: \%3 + } + dial \%4 ; Dial the number + if fail end 1 Can't place call: \%4 + end 0 Connection successful. +} + +COMMENT - TCPCALL macro. Arguments: +; +; \%1 = server name:port +; \%2 = modem type +; \%3 = phone number +; +def TCPCALL { + if < \v(argc) 4 - ; All arguments present? + end 1 Usage: TCPCALL server[:port] modem number + set net type tcp/ip ; Which network to use + if fail end 1 unsupported network: tcp/ip + set host \%1 ; Access server and port + if fail end 1 can't access server \%1 + set modem \%2 ; Set modem type + if fail end 1 unknown modem type: \%2 + dial \%3 ; Dial the number + if fail end 1 Can't place call: \%3 + end 0 Connection successful. +} + +COMMENT - SPRINT macro. Arguments: +; \%1 = Service name or address +; +def SPRINT { + if < \v(argc) 2 end 1 Usage: \%0 service + set input timeout proceed + output @D\13 + input 10 TERMINAL= + if fail end 1 No terminal prompt + out D1\13 + inp 10 @ + if fail end 1 No atsign prompt + output c \%1\13 + input 10 CONNECTED + if fail end 1 Can't access \%1 from SprintNet +} + +COMMENT - ULOGIN macro. For logging into systems where user ID is required +; but there is no password. Arguments: +; \%1 = UNIX user ID +; +define ULOGIN { + if < \v(argc) 2 end 1 Usage: \%0 userid + set input timeout proceed ; Handle timeouts ourselves + set case on ; Case is important in UNIX + minput 5 login: Username: {User ID:} {User Name:} + out \%1\13 ; Send username, carriage return + end 0 +} + +COMMENT - VMSLOGIN macro. Arguments: +; \%1 = VMS user ID +; \%2 = Password. If password not supplied, it is prompted for. +; \%3 = System prompt. If omitted a default is supplied. +; +define VMSLOGIN { + if < \v(argc) 2 end 1 Usage: \%0 userid [ password [ prompt ] ] + while not defined \%2 { + askq \%2 { \%1's password: } + } + set parity none ; Set communication parameters + set duplex full + set handshake none + set input timeout proceed ; Handle timeouts ourselves + in 5 Username: ; Is prompt already there? + xif fail { ; No. + for \%i 1 3 1 { ; Try 3 times to get it. + out \13 ; Send carriage return + in 5 Username: ; Look for prompt + if success break ; Success, go log in + } + if > \%i 3 end 1 No Username prompt + } + out \%1\13 ; Send username, carriage return + inp 5 Password: ; Wait 5 sec for this prompt + if fail end 1 No password prompt + pause ; Wait a sec + out \%2\13 ; Send password + xif not emulation { ; No emulator built in? + set input echo off ; Protect terminal from this + minput 10 {\27Z} {\27[c} {\27[0c} ; Get terminal ID query + xif success { ; Got one + output \27[\?1c ; Send VT100 terminal ID + in 2 \27[6n ; Screen dimension query? + if succ out \27[\v(rows);\v(cols)R ; Send dimensions + } + set input echo on ; Echo input again + } + if not def \%3 - ; If we were not given a prompt + asg \%3 {\v(prompt)} ; use the SET LOGIN PROMPT value + if not def \%3 - ; If we still don't have a prompt + asg \%3 {\13$\32} ; use this one as the default + reinp 0 \%3 ; Did we INPUT the prompt already? + if fail inp 60 \%3 ; No, look now. + if fail end 1 +} + +COMMENT - UNIXLOGIN macro. Arguments: +; \%1 = UNIX user ID +; \%2 = Password. If password not supplied, it is prompted for. +; \%3 = System prompt. If omitted a default is supplied. +; +define UNIXLOGIN { + local \%m \%i + if < \v(argc) 2 - + end 1 Usage: \%0 userid [ password [ prompt ] ] + while not defined \%2 { + askq \%2 { \%1's password: } + } + set input echo on + set parity none ; Set communication parameters. + set duplex full + set handshake none + set input timeout proceed ; Handle timeouts ourselves + set case on ; Case is important in UNIX + def \%m 10 ; Waiting time for INPUT + for \%i 1 5 1 { + minput \%m login: {ssword:} {Password for \%1:} + if success break + output \B\13 + \%m ::= 6-\%1 + } + if > \%i 5 end 1 {No response from host} + xif = \v(minput) 1 { ; Have username prompt + output \%1\13 ; Send username + minput 5 {ssword:} {ssword for \%1:} ; Wait for password prompt + if fail end 1 {No password prompt} + } + pause ; Wait a sec + out \%2\13 ; Send password + if not def \%3 - ; If we were not given a prompt + asg \%3 {\v(prompt)} ; use the SET LOGIN PROMPT value + if not def \%3 - ; If we still don't have a prompt + asg \%3 {\10$ } ; use this one as the default + reinp 0 \%3 ; Did we INPUT the prompt already? + if fail inp 60 \%3 ; No, look now. + if fail end 1 +} + +COMMENT - VMLINELOGIN macro. Arguments: +; \%1 = User ID +; \%2 = Password +; +define VMLINELOGIN { + if < \v(argc) 2 - + end 1 Usage: \%0 userid [ password ] + while not defined \%2 { + askq \%2 { \%1's password: } + } + set parity mark ; Set communication parameters + set flow none + set handshake xon + set duplex half + set input timeout quit ; Don't bother with IF FAILURE + input 10 BREAK KEY ; Look for BREAK KEY prompt + pause 1 ; Wait a second + output \B ; Send BREAK + input 10 .\17, output logon \%1\13 ; Now log in + input 10 .\17, output \%2\13 ; Send password + input 10 .\17, output \13 ; Send carriage return + input 10 .\17, output \13 ; Send another one + end 0 +} + +COMMENT - VMFULLOGIN macro. Arguments: +; \%1 = User ID +; \%2 = Password +; +define VMFULLOGIN { + if < \v(argc) 2 - + end 1 Usage: \%0 userid [ password ] + while not defined \%2 { + askq \%2 { \%1's password: } + } + set input timeout quit ; Quit if INPUT fails + set parity even ; Set communication parameters + set duplex full + set handshake none + set flow xon/xoff + out \13 ; Send carriage return + inp 5 TERMINAL TYPE: ; Get terminal-type prompt + out vt-100\13 ; Just send "vt-100" + inp 20 RUNNING ; Get RUNNING message + pau 1 ; Wait one second + out \%1\9\%2\13 ; Send user ID, tab, password + out \13\13 ; Two more carriage returns + end 0 +} + +COMMENT - CISLOGIN macro. Arguments: +; \%1 = CompuServe User ID +; \%2 = Password +; \%3 = Prompt +; +define CISLOGIN { + if < \v(argc) 2 - + end 1 Usage: \%0 userid [ password [ prompt ] ] + while not defined \%2 { + askq \%2 { \%1's password: } + } + set terminal bytesize 7 ; No 8-bit characters + set input timeout quit ; Skip the IF FAILURE's + output \13 ; Send initial carriage return + input 5 Host Name: ; Look for Host Name prompt + output cis\13 ; Send "cis" and carriage return + input 5 User ID: ; Look for User ID prompt + output \%1\13 ; Send ID and carriage return + input Password: ; Look for Password prompt + output \%2\13 ; Send password and CR + if not def \%3 asg \%3 \v(prompt) + if not def \%3 asg \%3 {CompuServe Information Service} + input 30 \%3 + end 0 +} + +COMMENT - DOWLOGIN macro. Arguments: +; \%1 = Dow Jones Password +; +define DOWLOGIN { + while not defined \%1 { ; Get password + askq \%1 { Dow Jones password: } + } + set input timeout proceed + input 20 SERVICE PLEASE\?\?\?\? ; Look for Dow prompt + if fail end 1 No service prompt + out djnr\13 ; Select DJNR + input 10 @@@@@@@@ ; Get password prompt + if fail end 1 No password prompt + pause 1 ; Wait a second, then... + output \%1\13 ; send password and CR + input 30 ENTER QUERY ; Get DJNR query prompt + if fail end 1 No main query prompt + pause 1 +} + +COMMENT - DJNRSPRINT macro: Log in to Dow Jones via SprintNet. +; +def djnrsprint sprint dow, if success dowlogin + +COMMENT - NOLOGIN macro. Does nothing. Use when login not required. +; +def nologin comment + +:CUSTOM ; Customization file + +; In VMS and OpenVMS, allow for system-wide site customizations + +xif equal "\v(system)" "VMS" { + xif exist CKERMIT_INI:CKERMIT.SYS { + echo Executing CKERMIT_INI:CKERMIT.SYS + take CKERMIT_INI:CKERMIT.SYS + } +} + +; Execute user's personal customization file + +xif exist \m(_myinit) { ; If it exists, + echo Executing \m(_myinit)... ; print message, + take \m(_myinit) ; and TAKE the file. +} + +; Finish up with traditional greeting. + +if < \v(ntime) 43200 echo Good Morning! + else if < \v(ntime) 61200 echo Good Afternoon! + else echo Good Evening. + +End ; of C-Kermit 8.0 initialization file. diff --git a/ckermit70.txt b/ckermit70.txt new file mode 100644 index 0000000..8aca397 --- /dev/null +++ b/ckermit70.txt @@ -0,0 +1,17956 @@ + + [ [1]Contents ] [ [2]C-Kermit ] [ [3]Kermit Home ] + + Supplement to Using C-Kermit, Second Edition + +For C-Kermit 7.0 + +As of C-Kermit version: 7.0.196 +This file last updated: 8 February 2000 + +Authors: Frank da Cruz and Christine M. Gianone +Address: The Kermit Project + Columbia University + 612 West 115th Street + New York NY 10025-7799 + USA +Fax: +1 (212) 662-6442 +E-Mail: [4]kermit-support@columbia.edu +Web: [5]http://www.columbia.edu/kermit/ +Or: [6]http://www.kermit-project.org/ +Or: [7]http://www.columbia.nyc.ny.us/kermit/ + _________________________________________________________________ + + NOTICES + + This document: + Copyright © 1997, 2000, Frank da Cruz and Christine M. Gianone. + All rights reserved. + + Kermit 95: + Copyright © 1995, 2000, Trustees of Columbia University in the + City of New York. All rights reserved. + + C-Kermit: + Copyright © 1985, 2000, + Trustees of Columbia University in the City of New York. All + rights reserved. See the C-Kermit [8]COPYING.TXT file or the + copyright text in the [9]ckcmai.c module for disclaimer and + permissions. + + When Kerberos(TM) and/or SRP(TM) (Secure Remote Password) and/or SSL + protocol are included: + Portions Copyright © 1990, Massachusetts Institute of + Technology. + Portions Copyright © 1991, 1993 Regents of the University of + California. + Portions Copyright © 1991, 1992, 1993, 1994, 1995 by AT&T. + Portions Copyright © 1997, Stanford University. + Portions Copyright © 1995-1997, Eric Young + . + + For the full text of the third-party copyright notices, see + [10]Appendix V. + _________________________________________________________________ + + WHAT IS IN THIS FILE + + This file lists changes made to C-Kermit since the second edition of + the book [11]Using C-Kermit was published and C-Kermit 6.0 was + released in November 1996. Use this file as a supplement to the second + edition of Using C-Kermit until the third edition is published some + time in 2000. If the "most recent update" shown above is long ago, + contact Columbia University to see if there is a newer release. + + For further information, also see the [12]CKCBWR.TXT ("C-Kermit + beware") file for hints, tips, tricks, restrictions, frequently asked + questions, etc, plus the system-specific "beware file", e.g. + [13]CKUBWR.TXT for UNIX, [14]CKVBWR.TXT for VMS, etc, and also any + system-specific update files such as KERMIT95.HTM for Kermit 95 (in + the DOCS\MANUAL\ subdirectory of your K95 directory). + + This Web-based copy of the C-Kermit 7.0 update notes supersedes the + plain-text CKERMIT2.TXT file. All changes after 19 January 2000 + appear only here in the Web version. If you need an up-to-date + plain-text copy, use your Web browser to save this page as plain + text. + _________________________________________________________________ + + ABOUT FILENAMES + + In this document, filenames are generally shown in uppercase, but on + file systems with case-sensitive names such as UNIX, OS-9, and AOS/VS, + lowercase names are used: [15]ckubwr.txt, [16]ckermit70.txt, etc. + _________________________________________________________________ + + ADDITIONAL FILES + + Several other files accompany this new Kermit release: + + SECURITY.TXT + Discussion of Kermit's new authentication and encryption + features: + + + [17]Plain-text version + + [18]HTML (hypertext) version + + IKSD.TXT + How to install and manage an Internet Kermit Service Daemon. + + + [19]Plain-text version + + [20]HTML (hypertext) version + + Also see [21]cuiksd.htm for instructions for use. + + TELNET.TXT + A thorough presentation of Kermit's new advanced Telnet + features and controls. + + + [22]Plain-text version + + [23]HTML (hypertext) version + _________________________________________________________________ + + THE NEW C-KERMIT LICENSE + + The C-Kermit license was rewritten for version 7.0 to grant automatic + permission to packagers of free operating-system distributions to + include C-Kermit 7.0. Examples include Linux (GNU/Linux), FreeBSD, + NetBSD, etc. The new license is in the [24]COPYING.TXT file, and is + also displayed by C-Kermit itself when you give the VERSION or + COPYRIGHT command. The new C-Kermit license does not apply to + [25]Kermit 95. + _________________________________________________________________ + + ACKNOWLEDGMENTS + + Thanks to Jeff Altman, who joined the Kermit Project in 1995, for much + of what you see in C-Kermit 7.0, especially in the networking and + security areas, and his key role in designing and implementing the + Internet Kermit Service Daemon. And special thanks to Lucas Hart for + lots of help with the VMS version; to Peter Eichhorn for continuous + testing on the full range of HP-UX versions and for a consolidated set + of HP-UX makefile targets; and to Colin Allen, Mark Allen, Roger + Allen, Ric Anderson, William Bader, Mitch Baker, Mitchell Bass, Nelson + Beebe, Gerry Belanger, Jeff Bernsten, Mark Berryman, John Bigg, Volker + Borchert, Jonathan Boswell, Tim Boyer, Frederick Bruckman, Kenneth + Cochran, Jared Crapo, Bill Delaney, Igor Sobrado Delgado, Clarence + Dold, Joe Doupnik, John Dunlap, Max Evarts, Patrick French, Carl + Friedberg, Carl Friend, Hirofumi Fujii, Andrew Gabriel, Gabe Garza, + Boyd Gerber, David Gerber, George Gilmer, Hunter Goatley, DJ Hagberg, + Kevin Handy, Andy Harper, Randolph Herber, Sven Holström, Michal + Jaegermann, Graham Jenkins, Dick Jones, Terry Kennedy, Robert D Keys, + Nick Kisseberth, Igor Kovalenko, David Lane, Adam Laurie, Jeff + Liebermann, Eric Lonvick, Hoi Wan Louis, Arthur Marsh, Gregorie + Martin, Peter Mauzey, Dragan Milicic, Todd Miller, Christian Mondrup, + Daniel Morato, Dat Nguyen, Herb Peyerl, Jean-Pierre Radley, Steve + Rance, Stephen Riehm, Nigel Roles, Larry Rosenman, Jay S Rouman, David + Sanderson, John Santos, Michael Schmitz, Steven Schultz, Bob Shair, + Richard Shuford, Fred Smith, Michael Sokolov, Jim Spath, Peter Szell, + Ted T'so, Brian Tillman, Linus Torvalds, Patrick Volkerding, Martin + Vorländer, Steve Walton, Ken Weaverling, John Weekley, Martin + Whitaker, Jim Whitby, Matt Willman, Joellen Windsor, Farrell Woods, + and many others for binaries, hosting, reviews, suggestions, advice, + bug reports, and all the rest over the 3+ year C-Kermit 7.0 + development cycle. Thanks to Russ Nelson and the board of the Open + Software Initiative ([26]http://www.opensource.org) for their + cooperation in developing the new C-Kermit license and to the + proprietors of those free UNIX distributions that have incorporated + C-Kermit 7.0 for their cooperation and support, especially FreeBSD's + Jörg Wunsch. + _________________________________________________________________ + + NOTE TO KERMIT 95 USERS + + Kermit 95 and C-Kermit share the same command and scripting language, + the same Kermit file-transfer protocol implementation, and much else + besides. + + Like the book [27]Using C-Kermit, this file concentrates on the + aspects of C-Kermit that are common to all versions: UNIX, VMS, + Windows, OS/2, VOS, AOS/VS, etc. Please refer to your Kermit 95 + documentation for information that is specific to Kermit 95. + + C-Kermit 7.0 corresponds to Kermit 95 1.1.19. + _________________________________________________________________ + + C-KERMIT VERSIONS AND VERSION NUMBERS + + "C-Kermit" refers to all the many programs that are compiled in whole + or in part from common C-language source code, comprising: + + * A Kermit file transfer protocol module + * A command parser and script execution module + * A modem-dialing module + * A network support module + * A character-set translation module. + + and several others. These "system-independent" modules are combined + with system-dependent modules for each platform to provide the + required input/output functions, and also in some cases overlaid with + an alternative user interface, such as Macintosh Kermit's + point-and-click interface, and in some cases also a terminal emulator, + as Kermit 95. + + The C-Kermit version number started as 1.0, ... 3.0, 4.0, 4.1 and then + (because of confusion at the time with Berkeley UNIX 4.2), 4B, 4C, and + so on, with the specific edit number in parentheses, for example + 4E(072) or 5A(188). This scheme was used through 5A(191), but now we + have gone back to the traditional numbering scheme with decimal + points: major.minor.edit; for example 7.0.196. Internal version + numbers (the \v(version) variable), however, are compatible in + C-Kermit 5A upwards. + + Meanwhile, C-Kermit derivatives for some platforms (Windows, + Macintosh) might go through several releases while C-Kermit itself + remains the same. These versions have their own platform-specific + version numbers, such as Kermit 95 1.1.1, 1.1.2, and so on. + + C-Kermit Version History: + + 1.0 1981-1982 Command-line only, 4.2 BSD UNIX only + 2.0 (*) (who remembers...) + 3.0 May 1984 Command-line only, supports several platforms + 4.0-4.1 Feb-Apr 1985 (*) First interactive and modular version + 4C(050) May 1985 + 4D(060) April 1986 + 4E(066) August 1987 Long packets + 4E(068) January 1988 + 4E(072) January 1989 + 4F(095) August 1989 (*) Attribute packets + 5A(188) November 1992 Scripting, TCP/IP, sliding windows (1) + 5A(189) September 1993 Control-char unprefixing + 5A(190) October 1994 Recovery + 5A(191) April 1995 OS/2 only + 6.0.192 September 1996 Intelligent dialing, autodownload, lots more (2) + 6.1.193 1997-98 (*) Development only + 6.1.194 June 1998 K95 only - switches, directory recursion, more + 7.0.195 August 1999 IKSD + more (CU only as K95 1.1.18-CU) + 7.0.196 1 January 2000 Unicode, lots more + + (*) Never formally released (4.0 was a total rewrite) + (1) Using C-Kermit, 1st Edition + (2) Using C-Kermit, 2nd Edition + _________________________________________________________________ + +CONTENTS + + I. [28]C-KERMIT DOCUMENTATION + + II. [29]NEW FEATURES + + (0) [30]INCOMPATIBILITIES WITH PREVIOUS RELEASES + (1) [31]PROGRAM AND FILE MANAGEMENT AND COMMANDS + 1.0. [32]Bug fixes + 1.1. [33]Command Continuation + 1.2. [34]Editor Interface + 1.3. [35]Web Browser and FTP Interface + 1.4. [36]Command Editing + 1.5. [37]Command Switches + 1.5.1. [38]General Switch Syntax + 1.5.2. [39]Order and Effect of Switches + 1.5.3. [40]Distinguishing Switches from Other Fields + 1.5.4. [41]Standard File Selection Switches + 1.5.5. [42]Setting Preferences for Different Commands + 1.6. [43]Dates and Times + 1.7. [44]Partial Completion of Keywords + 1.8. [45]Command Recall + 1.9. [46]EXIT Messages + 1.10. [47]Managing Keyboard Interruptions + 1.11. [48]Taming the Wild Backslash -- Part Deux + 1.11.1. [49]Background + 1.11.2. [50]Kermit's Quoting Rules + 1.11.3. [51]Passing DOS Filenames from Kermit to Shell Commands + 1.11.4. [52]Using Variables to Hold DOS Filenames + 1.11.5. [53]Passing DOS Filenames as Parameters to Macros + 1.11.6. [54]Passing DOS File Names from Macro Parameters to the +DOS Shell + 1.11.7. [55]Passing DOS Filenames to Kermit from the Shell + 1.12. [56]Debugging + 1.13. [57]Logs + 1.14. [58]Automatic File-Transfer Packet Recognition at the Command Pr +ompt + 1.15. [59]The TYPE Command + 1.16. [60]The RESET Command + 1.17. [61]The COPY and RENAME Commands + 1.18. [62]The MANUAL Command + 1.19. [63]String and Filename Matching Patterns + 1.20. [64]Multiple Commands on One Line + 1.21. [65]What Do I Have? + 1.22. [66]Generalized File Input and Output + 1.22.1. [67]Why Another I/O System? + 1.22.2. [68]The FILE Command + 1.22.3. [69]FILE Command Examples + 1.22.4. [70]Channel Numbers + 1.22.5. [71]FILE Command Error Codes + 1.22.6. [72]File I/O Variables + 1.22.7. [73]File I/O Functions + 1.22.8. [74]File I/O Function Examples + 1.23. [75]The EXEC Command + 1.24. [76]Getting Keyword Lists with '?' + (2) [77]MAKING AND USING CONNECTIONS + 2.0. [78]SET LINE and SET HOST Command Switches + 2.1. [79]Dialing + 2.1.1. [80]The Dial Result Message + 2.1.2. [81]Long-Distance Dialing Changes + 2.1.3. [82]Forcing Long-Distance Dialing + 2.1.4. [83]Exchange-Specific Dialing Decisions + 2.1.5. [84]Cautions about Cheapest-First Dialing + 2.1.6. [85]Blind Dialing (Dialing with No Dialtone) + 2.1.7. [86]Trimming the Dialing Dialog + 2.1.8. [87]Controlling the Dialing Speed + 2.1.9. [88]Pretesting Phone Number Conversions + 2.1.10. [89]Greater Control over Partial Dialing + 2.1.11. [90]New DIAL-related Variables and Functions + 2.1.12. [91]Increased Flexibility of PBX Dialing + 2.1.13. [92]The DIAL macro - Last-Minute Phone Number Conversions + 2.1.14. [93]Automatic Tone/Pulse Dialing Selection + 2.1.15. [94]Dial-Modifier Variables + 2.1.16. [95]Giving Multiple Numbers to the DIAL Command + 2.2. [96]Modems + 2.2.1. [97]New Modem Types + 2.2.2. [98]New Modem Controls + 2.3. [99]TELNET and RLOGIN + 2.3.0. [100]Bug Fixes + 2.3.1. [101]Telnet Binary Mode Bug Adjustments + 2.3.2. [102]VMS UCX Telnet Port Bug Adjustment + 2.3.3. [103]Telnet New Environment Option + 2.3.4. [104]Telnet Location Option + 2.3.5. [105]Connecting to Raw TCP Sockets + 2.3.6. [106]Incoming TCP Connections + 2.4. [107]The EIGHTBIT Command + 2.5. [108]The Services Directory + 2.6. [109]Closing Connections + 2.7. [110]Using C-Kermit with External Communication Programs + 2.7.0. [111]C-Kermit over tn3270 and tn5250 + 2.7.1. [112]C-Kermit over Telnet + 2.7.2. [113]C-Kermit over Rlogin + 2.7.3. [114]C-Kermit over Serial Communication Programs + 2.7.4. [115]C-Kermit over Secure Network Clients + 2.7.4.1. [116]SSH + 2.7.4.2. [117]SSL + 2.7.4.3. [118]SRP + 2.7.4.4. [119]SOCKS + 2.7.4.5. [120]Kerberos and SRP + 2.8. [121]Scripting Local Programs + 2.9. [122]X.25 Networking + 2.9.1. [123]IBM AIXLink/X.25 Network Provider Interface for AIX + 2.9.2. [124]HP-UX X.25 + 2.10. [125]Additional Serial Port Controls + 2.11. [126]Getting Access to the Dialout Device + 2.12. [127]The Connection Log + 2.13. [128]Automatic Connection-Specific Flow Control Selection + 2.14. [129]Trapping Connection Establishment and Loss + 2.15. [130]Contacting Web Servers with the HTTP Command + (3) [131]TERMINAL CONNECTION + 3.1. [132]CONNECT Command Switches + 3.2. [133]Triggers + 3.3. [134]Transparent Printing + 3.4. [135]Binary and Text Session Logs + (4) [136]FILE TRANSFER AND MANAGEMENT + 4.0. [137]Bug Fixes, Minor Changes, and Clarifications + 4.1. [138]File-Transfer Filename Templates + 4.1.1. [139]Templates in the As-Name + 4.1.2. [140]Templates on the Command Line + 4.1.3. [141]Post-Transfer Renaming + 4.2. [142]File-Transfer Pipes and Filters + 4.2.1. [143]Introduction + 4.2.1.1. [144]Terminology + 4.2.1.2. [145]Notation + 4.2.1.3. [146]Security + 4.2.2. [147]Commands for Transferring from and to Pipes + 4.2.2.1. [148]Sending from a Command + 4.2.2.2. [149]Receiving to a Command + 4.2.3. [150]Using File-Transfer Filters + 4.2.3.1. [151]The SEND Filter + 4.2.3.2. [152]The RECEIVE Filter + 4.2.4. [153]Implicit Use of Pipes + 4.2.5. [154]Success and Failure of Piped Commands + 4.2.6. [155]Cautions about Using Pipes to Transfer Directory Trees + 4.2.7. [156]Pipes and Encryption + 4.2.8. [157]Commands and Functions Related to Pipes + 4.2.8.1. [158]The OPEN !READ and OPEN !WRITE Commands + 4.2.8.2. [159]The REDIRECT Command + 4.2.8.3. [160]Receiving Mail and Print Jobs + 4.2.8.4. [161]Pipe-Related Functions + 4.3. [162]Automatic Per-File Text/Binary Mode Switching + 4.3.1. [163]Exceptions + 4.3.2. [164]Overview + 4.3.3. [165]Commands + 4.3.4. [166]Examples + 4.4. [167]File Permissions + 4.4.1. [168]When ATTRIBUTES PROTECTION is OFF + 4.4.1.1. [169]Unix + 4.4.1.2. [170]VMS + 4.4.2. [171]When ATTRIBUTES PROTECTION is ON + 4.4.2.1. [172]System-Specific Permissions + 4.4.2.1.1. [173]UNIX + 4.4.2.1.2. [174]VMS + 4.4.2.2. [175]System-Independent Permissions + 4.5. [176]File Management Commands + 4.5.1. [177]The DIRECTORY Command + 4.5.2. [178]The CD and BACK Commands + 4.5.2.1. [179]Parsing Improvements + 4.5.2.2. [180]The CDPATH + 4.5.3. [181]Creating and Removing Directories + 4.5.4. [182]The DELETE and PURGE Commands + 4.6. [183]Starting the Remote Kermit Server Automatically + 4.7. [184]File-Transfer Command Switches + 4.7.1. [185]SEND Command Switches + 4.7.2. [186]GET Command Switches + 4.7.3. [187]RECEIVE Command Switches + 4.8. [188]Minor Kermit Protocol Improvements + 4.8.1. [189]Multiple Attribute Packets + 4.8.2. [190]Very Short Packets + 4.9. [191]Wildcard / File Group Expansion + 4.9.1. [192]In UNIX C-Kermit + 4.9.2. [193]In Kermit 95 + 4.9.3. [194]In VMS, AOS/VS, OS-9, VOS, etc. + 4.10. [195]Additional Pathname Controls + 4.11. [196]Recursive SEND and GET: Transferring Directory Trees + 4.11.1. [197]Command-Line Options + 4.11.2. [198]The SEND /RECURSIVE Command + 4.11.3. [199]The GET /RECURSIVE Command + 4.11.4. [200]New and Changed File Functions + 4.11.5. [201]Moving Directory Trees Between Like Systems + 4.11.6. [202]Moving Directory Trees Between Unlike Systems + 4.12. [203]Where Did My File Go? + 4.13. [204]File Output Buffer Control + 4.14. [205]Improved Responsiveness + 4.15. [206]Doubling and Ignoring Characters for Transparency + 4.16. [207]New File-Transfer Display Formats + 4.17. [208]New Transaction Log Formats + 4.17.1. [209]The BRIEF Format + 4.17.2. [210]The FTP Format + 4.18. [211]Unprefixing NUL + 4.19. [212]Clear-Channel Protocol + 4.20. [213]Streaming Protocol + 4.20.1. [214]Commands for Streaming + 4.20.2. [215]Examples of Streaming + 4.20.2.1. [216]Streaming on Socket-to-Socket Connections + 4.20.2.2. [217]Streaming on Telnet Connections + 4.20.2.3. [218]Streaming with Limited Packet Length + 4.20.2.4. [219]Streaming on Dialup Connections + 4.20.2.5. [220]Streaming on X.25 Connections + 4.20.3. [221]Streaming - Preliminary Conclusions + 4.21. [222]The TRANSMIT Command + 4.22. [223]Coping with Faulty Kermit Implementations + 4.22.1. [224]Failure to Accept Modern Negotiation Strings + 4.22.2. [225]Failure to Negotiate 8th-bit Prefixing + 4.22.3. [226]Corrupt Files + 4.22.4. [227]Spurious Cancellations + 4.22.5. [228]Spurious Refusals + 4.22.6. [229]Failures during the Data Transfer Phase + 4.22.7. [230]Fractured Filenames + 4.22.8. [231]Bad File Dates + 4.23. [232]File Transfer Recovery + 4.24. [233]FILE COLLISION UPDATE Clarification + 4.25. [234]Autodownload Improvements + (5) [235]CLIENT/SERVER + 5.0. [236]Hints + 5.1. [237]New Command-Line Options + 5.2. [238]New Client Commands + 5.3. [239]New Server Capabilities + 5.3.1. [240]Creating and Removing Directories + 5.3.2. [241]Directory Listings + 5.4. [242]Syntax for Remote Filenames with Embedded Spaces + 5.5. [243]Automatic Orientation Messages upon Directory Change + 5.6. [244]New Server Controls + 5.7. [245]Timeouts during REMOTE HOST Command Execution + (6) [246]INTERNATIONAL CHARACTER SETS + 6.0. [247]ISO 8859-15 Latin Alphabet 9 + 6.1. [248]The HP-Roman8 Character Set + 6.2. [249]Greek Character Sets + 6.3. [250]Additional Latin-2 Character Sets + 6.4. [251]Additional Cyrillic Character Sets + 6.5. [252]Automatic Character-Set Switching + 6.6. [253]Unicode + 6.6.1. [254]Overview of Unicode + 6.6.2. [255]UCS Byte Order + 6.6.2. [256]UCS Transformation Formats + 6.6.3. [257]Conformance Levels + 6.6.4. [258]Relationship of Unicode with Kermit's Other Character Sets + 6.6.5. [259]Kermit's Unicode Features + 6.6.5.1. [260]File Transfer + 6.6.5.2. [261]The TRANSLATE Command + 6.6.5.3. [262]Terminal Connection + 6.6.5.4. [263]The TRANSMIT Command + 6.6.5.5. [264]Summary of Kermit Unicode Commands + 6.7. [265]Client/Server Character-Set Switching + (7) [266]SCRIPT PROGRAMMING + 7.0. [267]Bug Fixes + 7.1. [268]The INPUT Command + 7.1.1. [269]INPUT Timeouts + 7.1.2. [270]New INPUT Controls + 7.1.3. [271]INPUT with Pattern Matching + 7.1.4. [272]The INPUT Match Result + 7.2. [273]New or Improved Built-In Variables + 7.3. [274]New or Improved Built-In Functions + 7.4. [275]New IF Conditions + 7.5. [276]Using More than Ten Macro Arguments + 7.6. [277]Clarification of Function Call Syntax + 7.7. [278]Autodownload during INPUT Command Execution + 7.8. [279]Built-in Help for Functions. + 7.9. [280]Variable Assignments + 7.9.1. [281]Assignment Operators + 7.9.2. [282]New Assignment Commands + 7.10. [283]Arrays + 7.10.1. [284]Array Initializers + 7.10.2. [285]Turning a String into an Array of Words + 7.10.3. [286]Arrays of Filenames + 7.10.4. [287]Automatic Arrays + 7.10.5. [288]Sorting Arrays + 7.10.6. [289]Displaying Arrays + 7.10.7. [290]Other Array Operations + 7.10.8. [291]Hints for Using Arrays + 7.10.9. [292]Do-It-Yourself Arrays + 7.10.10. [293]Associative Arrays + 7.11. [294]OUTPUT Command Improvements + 7.12. [295]Function and Variable Diagnostics + 7.13. [296]Return Value of Macros + 7.14. [297]The ASSERT, FAIL, and SUCCEED Commands. + 7.15. [298]Using Alarms + 7.16. [299]Passing Arguments to Command Files + 7.17. [300]Dialogs with Timed Responses + 7.18. [301]Increased Flexibility of SWITCH Case Labels + 7.19. "[302]Kerbang" Scripts + 7.20. [303]IF and XIF Statement Syntax + 7.20.1. [304]The IF/XIF Distinction + 7.20.2. [305]Boolean Expressions (The IF/WHILE Condition) + 7.21. [306]Screen Formatting and Cursor Control + 7.22. [307]Evaluating Arithmetic Expressions + 7.23. [308]Floating-Point Arithmetic + 7.24. [309]Tracing Script Execution + 7.25. [310]Compact Substring Notation + 7.26. [311]New WAIT Command Options + 7.26.1. [312]Waiting for Modem Signals + 7.26.2. [313]Waiting for File Events + 7.27. [314]Relaxed FOR and SWITCH Syntax + (8) [315]USING OTHER FILE TRANSFER PROTOCOLS + (9) [316]COMMAND-LINE OPTIONS + 9.0. [317]Extended-Format Command-Line Options + 9.1. [318]Command Line Personalities + 9.2. [319]Built-in Help for Command Line Options + 9.3. [320]New Command-Line Options + (10) [321]C-KERMIT AND G-KERMIT + +III. [322]APPENDICES + +III.1. [323]Character Set Tables +III.1.1. [324]The Hewlett Packard Roman8 Character Set +III.1.2. [325]Greek Character Sets +III.1.2.1. [326]The ISO 8859-7 Latin / Greek Alphabet +III.1.2.2. [327]The ELOT 927 Character Set +III.1.2.3. [328]PC Code Page 869 +III.2. [329]Updated Country Codes + +IV. [330]ERRATA & CORRIGENDA: Corrections to "Using C-Kermit" 2nd Edition. +V. [331]ADDITIONAL COPYRIGHT NOTICES + _________________________________________________________________ + +I. C-KERMIT DOCUMENTATION + + The user manual for C-Kermit is: + + Frank da Cruz and Christine M. Gianone, [332]Using C-Kermit, Second + Edition, Digital Press / Butterworth-Heinemann, Woburn, MA, 1997, + 622 pages, ISBN 1-55558-164-1. + + [333]CLICK HERE for reviews. + + The present document is a supplement to Using C-Kermit 2nd Ed, not a + replacement for it. + + US single-copy price: $52.95; quantity discounts available. Available + in bookstores or directly from Columbia University: + + The Kermit Project + Columbia University + 612 West 115th Street + New York NY 10025-7799 + USA + Telephone: +1 (212) 854-3703 + Fax: +1 (212) 662-6442 + + Domestic and overseas orders accepted. Price: US $44.95 (US, Canada, + and Mexico). Shipping: $4.00 within the USA; $15.00 to all other + countries. Orders may be paid by MasterCard or Visa, or prepaid by + check in US dollars. Add $65 bank fee for checks not drawn on a US + bank. Do not include sales tax. Inquire about quantity discounts. + + You can also order by phone from the publisher, Digital Press / + [334]Butterworth-Heinemann, with MasterCard, Visa, or American + Express: + + +1 800 366-2665 (Woburn, Massachusetts office for USA & Canada) + +44 1865 314627 (Oxford, England distribution centre for UK & Europe) + +61 03 9245 7111 (Melbourne, Vic, office for Australia & NZ) + +65 356-1968 (Singapore office for Asia) + +27 (31) 2683111 (Durban office for South Africa) + + A [335]German-language edition of the First Edition is also available: + + Frank da Cruz and Christine M. Gianone, C-Kermit - Einführung und + Referenz, Verlag Heinz Heise, Hannover, Germany (1994). ISBN + 3-88229-023-4. Deutsch von Gisbert W. Selke. Price: DM 88,00. + Verlag Heinz Heise GmbH & Co. KG, Helstorfer Strasse 7, D-30625 + Hannover. Tel. +49 (05 11) 53 52-0, Fax. +49 (05 11) 53 52-1 29. + + The [336]Kermit file transfer protocol is specified in: + + Frank da Cruz, Kermit, A File Transfer Protocol, Digital Press, + Bedford, MA, 1987, 379 pages, ISBN 0-932376-88-6. US single-copy + price: $39.95. Availability as above. + + News and articles about Kermit software and protocol are published + periodically in the journal, [337]Kermit News. Subscriptions are free; + contact Columbia University at the address above. + + Online news about Kermit is published in the + [338]comp.protocols.kermit.announce and + [339]comp.protocols.kermit.misc newsgroups. + _________________________________________________________________ + +II. NEW FEATURES + + Support for the Bell Labs Plan 9 operating system was added to version + 6.0 too late to be mentioned in the book (although it does appear on + the cover). + + Specific changes and additions are grouped together by major topic, + roughly corresponding to the chapters of [340]Using C-Kermit. + _________________________________________________________________ + + 0. INCOMPATIBILITIES WITH PREVIOUS RELEASES + + 1. C-Kermit 7.0 uses FAST Kermit protocol settings by default. This + includes "unprefixing" of certain control characters. Because of + this, file transfers that worked with previous releases might not + work in the new release (but it is more likely that they will + work, and much faster). If a transfer fails, you'll get a + context-sensitive hint suggesting possible causes and cures. + Usually SET PREFIXING ALL does the trick. + 2. C-Kermit 7.0 transfers files in BINARY mode by default. To restore + the previous behavior, put SET FILE TYPE TEXT in your C-Kermit + initialization file. + 3. No matter whether FILE TYPE is BINARY or TEXT by default, C-Kermit + 7.0 now switches between text and binary mode automatically on a + per-file basis according to various criteria, including (a) which + kind of platform is on the other end of the connection (if known), + (b) the version of Kermit on the other end, and (c) the file's + name (see [341]Section 4, especially [342]4.3). To disable this + automatic switching and restore the earlier behavior, put SET + TRANSFER MODE MANUAL in your C-Kermit initialization file. To + disable automatic switching for a particular transfer, include a + /TEXT or /BINARY switch with your SEND or GET command. + 4. The RESEND and REGET commands automatically switch to binary mode; + previously if RESEND or REGET were attempted when FILE TYPE was + TEXT, these commands would fail immediately, with a message + telling you they work only when the FILE TYPE is BINARY. Now they + simply do this for you. See [343]Section 4.23 for additional + (important) information. + 5. SET PREFIXING CAUTIOUS and MINIMAL now both prefix linefeed (10 + and 138) in case rlogin, ssh, or cu are "in the middle", since + otherwise ~ might appear in Kermit packets, and this would + cause rlogin, ssh, or cu to disconnect, suspend,escape back, or + otherwise wreck the file transfer. Xon and Xoff are now always + prefixed too, even when Xon/Xoff flow control is not in effect, + since unprefixing them has proven dangerous on TCP/IP connections. + 6. In UNIX, VMS, Windows, and OS/2, the DIRECTORY command is built + into C-Kermit itself rather than implemented by running an + external command or program. The built-in command might not behave + the way the platform-specific external one did, but many options + are available for customization. Of course the underlying + platform-specific command can still be accessed with "!", "@", or + "RUN" wherever the installation does not forbid. In UNIX, the "ls" + command can be accessed directly as "ls" in C-Kermit. See + [344]Section 4.5.1 for details. + 7. SEND ? prints a list of switches rather than a list of filenames. + If you want to see a list of filenames, use a (system-dependent) + construction such as SEND ./? (for UNIX, Windows, or OS/2), SEND + []? (VMS), etc. See [345]Sections 1.5 and [346]4.7.1. + 8. In UNIX, OS-9, and Kermit 95, the wildcard characters in previous + versions were * and ?. In C-Kermit 7.0 they are *, ?, [, ], {, and + }, with dash used inside []'s to denote ranges and comma used + inside {} to separate list elements. If you need to include any of + these characters literally in a filename, precede each one with + backslash (\). See [347]Section 4.9. + 9. SET QUIET { ON, OFF } is now on the command stack, just like SET + INPUT CASE, SET COUNT, SET MACRO ERROR, etc, as described on p.458 + of [348]Using C-Kermit, 2nd Edition. This allows any macro or + command file to SET QUIET ON or OFF without worrying about saving + and restoring the global QUIET value. For example, this lets you + write a script that tries SET LINE on lots of devices until it + finds one free without spewing out loads of error messages, and + also without disturbing the global QUIET setting, whatever it was. + 10. Because of the new "." operator (which introduces assignments), + macros whose names begin with "." can not be invoked "by name". + However, they still can be invoked with DO. + 11. The syntax of the EVALUATE command has changed. See [349]Section + 7.9.2. To restore the previous syntax, use SET EVALUATE OLD. + 12. The \v(directory) variable now includes the trailing directory + separator; in previous releases it did not. This is to allow + constructions such as: + cd \v(dir)data.tmp + to work across platforms that might have different directory + notation, such as UNIX, Windows, and VMS. + 13. Prior to C-Kermit 7.0, the FLOW-CONTROL setting was global and + sticky. In C-Kermit 7.0, there is an array of default flow-control + values for each kind of connection, that are applied automatically + at SET LINE/PORT/HOST time. Thus a SET FLOW command given before + SET LINE/PORT/HOST is likely to be undone. Therefore SET FLOW can + be guaranteed to have the desired effect only if given after the + SET LINE/PORT/HOST command. + 14. Character-set translation works differently in the TRANSMIT + command when (a) the file character-set is not the same as the + local end of the terminal character-set, or (b) when the terminal + character-set is TRANSPARENT. + _________________________________________________________________ + + 1. PROGRAM AND FILE MANAGEMENT AND COMMANDS + + 1.0. Bug Fixes + + The following patches were issued to correct bugs in C-Kermit 6.0. + These are described in detail in the 6.0 PATCHES file. All of these + fixes have been incorporated in C-Kermit 6.1 (never released except as + K95 1.1.16-17) and 7.0. + + 0001 All UNIX C-Kermit mishandles timestamps on files before 1970 + 0002 Solaris 2.5++ Compilation error on Solaris 2.5 with Pro C + 0003 All VMS CKERMIT.INI Fix for VMS + 0004 VMS/VAX/UCX 2.0 C-Kermit 6.0 can't TELNET on VAX/VMS with UCX 2.0 + 0005 All C-Kermit Might Send Packets Outside Window + 0006 All MOVE from SEND-LIST does not delete original files + 0007 Solaris 2.5++ Higher serial speeds on Solaris 2.5 + 0008 All C-Kermit application file name can't contain spaces + 0009 AT&T 7300 UNIXPC setuid and hardware flow-control problems + 0010 Linux on Alpha Patch to make ckutio.c compile on Linux/Alpha + 0011 OS-9/68000 2.4 Patch to make ck9con.c compile on OS-9/68000 2.4 + 0012 MW Coherent 4.2 Patches for successful build on Coherent 4.2 + 0013 SINIX-Y 5.43 "delay" variable conflicts with + 0014 VMS/VAX/CMU-IP Subject: Patches for VAX/VMS 5.x + CMU-IP + 0015 All XECHO doesn't flush its output + 0016 VMS CD and other directory operations might not work + 0017 Linux 1.2.x++ Use standard POSIX interface for high serial speeds + 0018 UNIX SET WILDCARD-EXPANSION SHELL dumps core + 0019 All Hayes V.34 modem init string problem + 0020 All READ command does not fail if file not open + 0021 All Problems with long function arguments + 0022 All Certain \function()s can misbehave + 0023 All X MOD 0 crashes program + 0024 All Internal bulletproofing for lower() function + 0025 OpenBSD Real OpenBSD support for C-Kermit 6.0 + 0026 All Incorrect checks for macro/command-file nesting depth + 0027 All ANSWER doesn't automatically CONNECT + 0028 All Overzealous EXIT warning + 0029 All OUTPUT doesn't echo when DUPLEX is HALF + 0030 All Minor problems with REMOTE DIRECTORY/DELETE/etc + 0031 All CHECK command broken + 0032 All Problem with SET TRANSMIT ECHO + 0033 UNIX, VMS, etc HELP SET SERVER says too much + 0034 All READ and !READ too picky about line terminators + 0035 All END from inside SWITCH doesn't work + 0036 All Problem telnetting to multihomed hosts + 0037 All Redirection failures in REMOTE xxx > file + + REDIRECT was missing in many UNIX C-Kermit implementations; in version + 7.0, it should be available in all of them. + _________________________________________________________________ + + 1.1. Command Continuation + + Comments that start with ";" or "#" can no longer be continued. In: + + ; this is a comment - + echo blah + + the ECHO command will execute, rather than being taken as a + continuation of the preceding comment line. This allows easy + "commenting out" of commands from macro definitions. + + However, the text of the COMMENT command can still be continued onto + subsequent lines: + + comment this is a comment - + echo blah + + As of version 6.0, backslash is no longer a valid continuation + character. Only hyphen should be used for command continuation. This + is to make it possible to issue commands like "cd a:\" on DOS-like + systems. + + As of version 7.0: + + * You can quote a final dash to prevent it from being a continuation + character: + echo foo\- + This prints "foo-". The command is not continued. + * You can enter commands such as: + echo foo - ; this is a comment + interactively and they are properly treated as continued commands. + Previously this worked only in command files. + _________________________________________________________________ + + 1.2. Editor Interface + + SET EDITOR name [ options ] + Lets you specify a text-editing program. The name can be a + fully specified pathname like /usr/local/bin/emacs19/emacs, or + it can be the name of any program in your PATH, e.g. "set + editor emacs". In VMS, it must be a DCL command like "edit", + "edit/tpu", "emacs", etc. If an environment variable EDITOR is + defined when Kermit starts, its value is the default editor. + You can also specify options to be included on the editor + command line. Returns to Kermit when the editor exits. + + EDIT [ filename ] + If the EDIT command is given without a filename, then if a + previous filename had been given to an EDIT command, it is + used; if not, the editor is started without a file. If a + filename is given, the editor is started on that file, and the + filename is remembered for subsequent EDIT commands. + + SHOW EDITOR + Displays the full pathname of your text editor, if any, along + with any command line options, and the file most recently + edited (and therefore the default filename for your next EDIT + command). + + Related variables: \v(editor), \v(editopts), \v(editfile). + _________________________________________________________________ + + 1.3. Web Browser and FTP Interface + + C-Kermit includes an FTP command, which simply runs the FTP program; + C-Kermit does not include any built-in support for Internet File + Transfer Protocol, nor any method for interacting directly with an FTP + server. In version 7.0, however, C-Kermit lets you specify your FTP + client: + + SET FTP-CLIENT [ name [ options ] ] + The name is the name of the FTP executable. In UNIX, Windows, + or OS/2, it can be the filename of any executable program in + your PATH (e.g. "ftp.exe" in Windows, "ftp" in UNIX); elsewhere + (or if you do not have a PATH definition), it must be the fully + specified pathname of the FTP program. If the name contains any + spaces, enclose it braces. Include any options after the + filename; these depend the particular ftp client. + + The Web browser interface is covered in the following subsections. + _________________________________________________________________ + + 1.3.1. Invoking your Browser from C-Kermit + + BROWSE [ url ] + Starts your preferred Web browser on the URL, if one is given, + otherwise on the most recently given URL, if any. Returns to + Kermit when the browser exits. + + SET BROWSER [ name [ options ] ] + Use this command to specify the name of your Web browser + program, for example: "set browser lynx". The name must be in + your PATH, or else it must be a fully specified filename; in + VMS it must be a DCL command. + + SHOW BROWSER + Displays the current browser, options, and most recent URL. + + Related variables: \v(browser), \v(browsopts), \v(browsurl). + + Also see [350]Section 2.15: Contacting Web Servers with the HTTP + Command. + _________________________________________________________________ + + 1.3.2. Invoking C-Kermit from your Browser + + The method for doing this depends, of course, on your browser. Here + are some examples: + + Netscape on UNIX (X-based) + In the Options->Applications section, set your Telnet + application to: + + xterm -e /usr/local/bin/kermit/kermit -J %h %p + + (replace "/usr/local/bin/kermit/kermit" by C-Kermit's actual + pathname). -J is C-Kermit's command-line option to "be like + Telnet"; %h and %p are Netscape placeholders for hostname and + port. + + Lynx on UNIX + As far as we know, this can be done only at compile time. Add + the following line to the Lynx userdefs.h file before building + the Lynx binary: + + #define TELNET_COMMAND "/opt/bin/kermit -J" + + And then add lines like the following to the Lynx.cfg file: + + DOWNLOADER:Kermit binary download:/opt/bin/kermit -i -V -s %s -a %s:TRUE + DOWNLOADER:Kermit text download:/opt/bin/kermit -s %s -a %s:TRUE + + UPLOADER:Kermit binary upload:/opt/bin/kermit -i -r -a %s:TRUE + UPLOADER:Kermit text upload:/opt/bin/kermit -r -a %s:TRUE + UPLOADER:Kermit text get:/opt/bin/kermit -g %s:TRUE + UPLOADER:Kermit binary get:/opt/bin/kermit -ig %s:TRUE + + But none of the above is necessary if you make C-Kermit your default + Telnet client, which you can do by making a symlink called 'telnet' to + the C-Kermit 7.0 binary. See [351]Section 9.1 for details. + _________________________________________________________________ + + 1.4. Command Editing + + Ctrl-W ("Word delete") was changed in 7.0 to delete back to the + previous non-alphanumeric, rather than all the way back to the + previous space. + _________________________________________________________________ + + 1.5. Command Switches + + As of version 7.0, C-Kermit's command parser supports a new type of + field, called a "switch". This is an optional command modifier. + + 1.5.1. General Switch Syntax + + A switch is a keyword beginning with a slash (/). If it takes a value, + then the value is appended to it (with no intervening spaces), + separated by a colon (:) or equal sign (=). Depending on the switch, + the value may be a number, a keyword, a filename, a date/time, etc. + Examples: + + send oofa.txt ; No switches + send /binary oofa.zip ; A switch without a value + send /protocol:zmodem oofa.zip ; A switch with a value (:) + send /protocol=zmodem oofa.zip ; A switch with a value (=) + send /text /delete /as-name:x.x oofa.txt ; Several switches + + Like other command fields, switches are separated from other fields, + and from each other, by whitespace, as shown in the examples just + above. You can not put them together like so: + + send/text/delete/as-name:x.x oofa.txt + + (as you might do in VMS or DOS, or as we might once have done in + TOPS-10 or TOPS0-20, or PIP). This is primarily due to ambiguity + between "/" as switch introducer versus "/" as UNIX directory + separator; e.g. in: + + send /delete/as-name:foo/text oofa.txt + + Does "foo/text" mean the filename is "foo" and the transfer is to be + in text mode, or does it mean the filename is "foo/text"? Therefore we + require whitespace between switches to resolve the ambiguity. (That's + only one of several possible ambiguities -- it is also conceivable + that a file called "text" exists in the path "/delete/as-name:foo/"). + + In general, if a switch can take a value, but you omit it, then either + a reasonable default value is supplied, or an error message is + printed: + + send /print:-Plaserwriter oofa.txt ; Value included = print options + send /print oofa.txt ; Value omitted, OK + send /mail:kermit@columbia.edu oofa.txt ; Value included = address + send /mail oofa.txt ; Not OK - address required + ?Address required + + Context-sensitive help (?) and completion (Esc or Tab) are available + in the normal manner: + + C-Kermit> send /pr? Switch, one of the following: + /print /protocol + C-Kermit> send /protocol:? File-transfer protocol, + one of the following: + kermit xmodem ymodem ymodem-g zmodem + C-Kermit> send /protocol:kermit + + If a switch takes a value and you use completion on it, a colon (:) is + printed at the end of its name to indicate this. If it does not take a + value, a space is printed. + + Also, if you type ? in a switch field, switches that take values are + shown with a trailing colon; those that don't take values are shown + without one. + _________________________________________________________________ + + 1.5.2. Order and Effect of Switches + + The order of switches should not matter, except that they are + evaluated from left to right, so if you give two switches with + opposite effects, the rightmost one is used: + + send /text /binary oofa.zip ; Sends oofa.zip in binary mode. + + Like other command fields, switches have no effect whatsoever until + the command is entered (by pressing the Return or Enter key). Even + then, switches affect only the command with which they are included; + they do not have global effect or side effects. + _________________________________________________________________ + + 1.5.3. Distinguishing Switches from Other Fields + + All switches are optional. A command that uses switches lets you give + any number of them, including none at all. Example: + + send /binary oofa.zip + send /bin /delete oofa.zip + send /bin /as-name:mupeen.zip oofa.zip + send oofa.zip + + But how does Kermit know when the first "non-switch" is given? It has + been told to look for both a switch and for something else, the data + type of the next field (filename, number, etc). In most cases, this + works well. But conflicts are not impossible. Suppose, for example, in + UNIX there was a file named "text" in the top-level directory. The + command to send it would be: + + send /text + + But C-Kermit would think this was the "/text" switch. To resolve the + conflict, use braces: + + send {/text} + + or other circumlocutions such as "send //text", "send /./text", etc. + + The opposite problem can occur if you give an illegal switch that + happens to match a directory name. For example: + + send /f oofa.txt + + There is no "/f" switch (there are several switches that begin with + "/f", so "/f" is ambiguous). Now suppose there is an "f" directory in + the root directory; then this command would be interpreted as: + + Send all the files in the "/f" directory, giving each one an + as-name of "oofa.txt". + + This could be a mistake, or it could be exactly what you intended; + C-Kermit has no way of telling the difference. To avoid situations + like this, spell switches out in full until you are comfortable enough + with them to know the minimum abbreviation for each one. Hint: use ? + and completion while typing switches to obtain the necessary feedback. + _________________________________________________________________ + + 1.5.4. Standard File Selection Switches + + The following switches are used on different file-oriented commands + (such as SEND, DIRECTORY, DELETE, PURGE) to refine the selection of + files that match the given specification. + + /AFTER:date-time + Select only those files having a date-time later than the one + given. See [352]Section 1.6 for date-time formats. Synonym: + /SINCE. + + /NOT-AFTER:date-time + Select only those files having a date-time not later than (i.e. + earlier or equal to) the one given. Synonym: /NOT-SINCE. + + /BEFORE:date-time + Select only those files having a date-time earlier than the one + given. + + /NOT-BEFORE:date-time + Select only those files having a date-time not earlier than + (i.e. later or equal to) the one given. + + /DOTFILES + UNIX and OS-9 only: The filespec is allowed to match files + whose names start with (dot) period. Normally these files are + not shown. + + /NODOTFILES + (UNIX and OS-9 only) Don't show files whose names start with + dot (period). This is the opposite of /DOTFILES, and is the + default. Note that when a directory name starts with a period, + the directory and (in recursive operations) all its + subdirectories are skipped. + + /LARGER-THAN:number + Only select files larger than the given number of bytes. + + /SMALLER-THAN:number + Only select files smaller than the given number of bytes. + + /EXCEPT:pattern + Specifies that any files whose names match the pattern, which + can be a regular filename, or may contain "*" and/or "?" + metacharacters (wildcards), are not to be selected. Example: + + send /except:*.log *.* + + sends all files in the current directory except those with a + filetype of ".log". Another: + + send /except:*.~*~ *.* + + sends all files except the ones that look like Kermit or EMACS + backup files (such as "oofa.txt.~17~") (of course you can also + use the /NOBACKUP switch for this). + + The pattern matcher is the same one used by IF MATCH string + pattern ([353]Section 7.4), so you can test your patterns using + IF MATCH. If you need to match a literal * or ? (etc), precede + it by a backslash (\). If the pattern contains any spaces, it + must be enclosed in braces: + + send /except:{Foo bar} *.* + + The pattern can also be a list of up to 8 patterns. In this + case, the entire pattern must be enclosed in braces, and each + sub-pattern must also be enclosed in braces; this eliminates + the need for designating a separator character, which is likely + to also be a legal filename character on some platform or + other, and therefore a source of confusion. You may include + spaces between the subpatterns but they are not necessary. The + following two commands are equivalent: + + send /except:{{ck*.o} {ck*.c}} ck*.? + send /except:{{ck*.o}{ck*.c}} ck*.? + + If a pattern is to include a literal brace character, precede + it with "\". Also note the apparent conflict of this list + format and the string-list format described in [354]Section + 4.9.1. In case you want to include a wildcard string-list with + braces on its outer ends as an /EXCEPT: argument, do it like + this: + + send /except:{{{ckuusr.c,ckuus2.c,ckuus6.c}}} ckuus*.c + _________________________________________________________________ + + 1.5.5. Setting Preferences for Different Commands + + Certain oft-used commands offer lots of switches because different + people have different requirements or preferences. For example, some + people want to be able to delete files without having to watch a list + of the deleted files scroll past, while others want to be prompted for + permission to delete each file. Different people prefer different + directory-listing styles. And so on. Such commands can be tailored + with the SET OPTIONS command: + + SET OPTIONS command [ switch [ switch [ ... ] ] ] + Sets each switch as the default for the given command, + replacing the "factory default". Of course you can also + override any defaults established by the SET OPTIONS command by + including the relevant switches in the affected command any + time you issue it. + + SHOW OPTIONS + Lists the commands that allows option-setting, and the options + currently in effect, if any, for each. Switches that have + synonyms are shown under their primary name; for example. /LOG + and /VERBOSE are shown as /LIST. + + Commands for which options may be set include DIRECTORY, DELETE, + PURGE, and TYPE. Examples: + + SET OPTIONS DIRECTORY /PAGE /NOBACKUP /HEADING /SORT:DATE /REVERSE + SET OPTIONS DELETE /LIST /NOHEADING /NOPAGE /NOASK /NODOTFILES + SET OPTIONS TYPE /PAGE + + Not necessarily all of a command's switches can be set as options. For + example, file selection switches, since these would normally be + different for each command. + + Put the desired SET OPTIONS commands in your C-Kermit customization + file for each command whose default switches you want to change every + time you run C-Kermit. + _________________________________________________________________ + + 1.6. Dates and Times + + Some commands and switches take date-time values, such as: + + send /after:{8-Feb-2000 10:28:01} + + Various date-time formats are acceptable. The rules for the date are: + + * The year must have 4 digits. + * If the year comes first, the second field is the month. + * The day, month, and year may be separated by spaces, /, -, or + underscore. + * The month may be numeric (1 = January) or spelled out or + abbreviated in English. + + If the date-time string contains any spaces, it must be enclosed in + braces. Examples of legal dates: + + Interpretation: + 2000-Feb-8 8 February 2000 + {2000 Feb 8} 8 February 2000 + 2000/Feb/8 8 February 2000 + 2000_Feb_8 8 February 2000 + 2000-2-8 8 February 2000 + 2000-02-08 8 February 2000 + 8-Feb-2000 8 February 2000 + 08-Feb-2000 8 February 2000 + 12/25/2000 25 December 2000 + 25/12/2000 25 December 2000 + + The last two examples show that when the year comes last, and the + month is given numerically, the order of the day and month doesn't + matter as long as the day is 13 or greater (mm/dd/yyyy is commonly + used in the USA, whereas dd/mm/yyyy is the norm in Europe). However: + + 08/02/2000 Is ambiguous and therefore not accepted. + + If a date is given, the time is optional and defaults to 00:00:00. If + the time is given with a date, it must follow the date, separated by + space, /, -, or underscore, and with hours, minutes, and seconds + separated by colon (:). Example: + + 2000-Feb-8 10:28:01 Represents 8 February 2000, 10:28:01am + + If a date is not given, the current date is used and a time is + required. + + Time format is hh:mm:ss or hh:mm or hh in 24-hour format, or followed + by "am" or "pm" (or "AM" or "PM") to indicate morning or afternoon. + Examples of times that are acceptable: + + Interpretation: + 3:23:56 3:23:56am + 3:23:56am 3:23:56am + 3:23:56pm 3:23:56pm = 15:23:56 + 15:23:56 3:23:56pm = 15:23:56 + 3:23pm 3:23:00pm = 15:23:00 + 3:23PM 3:23:00pm = 15:23:00 + 3pm 3:00:00pm = 15:00:00 + + Examples of legal date-times: + + send /after:{8 Feb 2000 10:28:01} + send /after:8_Feb_2000_10:28:01 + send /after:8-Feb-2000/10:28:01 + send /after:2000/02/08/10:28:01 + send /after:2000/02/08_10:28:01 + send /after:2000/02/08_10:28:01am + send /after:2000/02/08_10:28:01pm + send /after:2000/02/08_10:28pm + send /after:2000/02/08_10pm + send /after:10:00:00pm + send /after:10:00pm + send /after:10pm + send /after:22 + + Finally, there is a special all-numeric format you can use: + + yyyymmdd hh:mm:ss + + For example: + + 20000208 10:28:01 + + This is Kermit's standard date-time format (based on ISO 8601), and is + accepted (among other formats) by any command or switch that requires + a date-time, and is output by any function whose result is a calendar + date-time. + + There are no optional parts to this format and it must be exactly 17 + characters long, punctuated as shown (except you can substitute + underscore for space in contexts where a single "word" is required). + The time is in 24-hour format (23:00:00 is 11:00pm). This is the + format returned by \fdate(filename), so you can also use constructions + like this: + + send /after:\fdate(oofa.txt) + + which means "all files newer than oofa.txt". + + Besides explicit dates, you can also use the any of the following + shortcuts: + + TODAY + Stands for the current date at 00:00:00. + + TODAY 12:34:56 + Stands for the current date at the given time. + + YESTERDAY + Stands for yesterday's date at 00:00:00. A time may also be + given. + + TOMORROW + Stands for tomorrow's date at 00:00:00. A time may also be + given. + + + number { DAYS, WEEKS, MONTHS, YEARS } [ time ] + Is replaced by the future date indicated, relative to the + current date. If the time is omitted, 00:00:00 is used. + Examples: +3days, +2weeks, +1year, +37months. + + - number { DAYS, WEEKS, MONTHS, YEARS } [ time ] + + Is replaced by the past date indicated, relative to the current + date. If the time is omitted, 00:00:00 is used. + + The time can be separated from the date shortcut by any of the same + separators that are allowed for explicit date-times: space, hyphen, + slash, period, or underscore. In switches and other space-delimited + fields, use non-spaces to separate date/time fields, or enclose the + date-time in braces, e.g.: + + purge /before:-4days_12:00:00 + purge /before:{- 4 days 12:00:00} + + Of course you can also use variables: + + define \%n 43 + purge /before:-\%ndays_12:00:00 + + Shortcut names can be abbreviated to any length that still + distinguishes them from any other name that can appear in the same + context, e.g. "TOD" for today, "Y" for yesterday. Also, the special + abbreviation "wks" is accepted for WEEKS, and "yrs" for "YEARS". + + (To see how to specify dates relative to a specific date, rather than + the current one, see the [355]\fmjd() function description below.) + + You can check date formats with the DATE command. DATE by itself + prints the current date and time in standard format: yyyymmdd + hh:mm:ss. DATE followed by a date and/or time (including shortcuts) + converts it to standard format if it can understand it, otherwise it + prints an error message. + + The following variables and functions deal with dates and times; any + function argument designated as "date-time" can be in any of the + formats described above. + + \v(day) + The first three letters of the English word for the current day + of the week, e.g. "Wed". + + \fday(date-time) + The first three letters of the English word for day of the week + of the given date. If a time is included, it is ignored. + Example: \fday(8 Feb 1988) = "Mon". + + \v(nday) + The numeric day of the week: 0 = Sunday, 1 = Monday, ..., 6 = + Saturday. + + \fnday(date-time) + The numeric day of the week for the given date. If a time is + included, it is ignored. Example: \fnday(8 Feb 1988) = "1". + + \v(date) + The current date as dd mmm yyyy, e.g. "08 Feb 2000" (as in this + example, a leading zero is supplied for day-of-month less than + 10). + + \v(ndate) + The current date in numeric format: yyyymmdd, e.g. "20000208". + + \v(time) + The current time as hh:mm:ss, e.g. "15:27:14". + + \ftime(time) + The given free-format date and/or time (e.g. "3pm") returns the + time (without the date) converted to hh:mm:ss 24-hour format, + e.g. "15:00:00" (the date, if given, is ignored). + + \v(ntime) + The current time as seconds since midnight, e.g. "55634". + + \v(tftime) + The elapsed time of the most recent file-transfer operation in + seconds. + + \v(intime) + The elapsed time for the most recent INPUT command to complete, + in milliseconds. + + \fntime(time) + The given free-format date and/or time is converted to seconds + since midnight (the date, if given, is ignored). This function + replaces \ftod2secs(), which is now a synonym for \fntime(). + Unlike \ftod2secs(), \fntime() allows a date to be included, + and it allows the time to be in free format (like 3pm), and it + allows the amount of time to be more than 24 hours. E.g. + \fntime(48:00:00) = 172800. Example of use: + + set alarm \fntime(48:00:00) ; set alarm 48 hours from now. + + \fn2time(seconds) + The given number of seconds is converted to hh:mm:ss format. + + \fdate(filename) + Returns the modification date-time of the given file in + standard format: yyyymmdd hh:mm:ss. + + \fcvtdate(date-time) + Converts a free-format date and/or time to Kermit standard + format: yyyymmdd hh:mm:ss. If no argument is given, returns the + current date-time in standard format. If a date is given but no + time, the converted date is returned without a time. If a time + is given with no date, the current date is supplied. Examples: + + \fcvtdate(4 Jul 2000 2:21:17pm) = 20000704 14:21:17 + \fcvtdate() = 20000704 14:21:17 (on 4 Jul 2000 at 2:21:17pm). + \fcvtd(4 Jul 2000) = 20000704 + \fcvtd(6pm) = 20000704 18:00:00 (on 4 Jul 2000 at 6:00pm). + + \fdayofyear(date-time) + \fdoy(date-time) + Converts a free-format date and/or time to yyyyddd, where ddd + is the 3-digit day of the year, and 1 January is Day 1. If a + time is included with the date, it is returned in standard + format. If a date is included but no time, the date is returned + without a time. If a time is given with no date, the time is + converted and the current date is supplied. If no argument is + given, the current date-time is returned. Synonym: \fdoy(). + Examples: + + \fddayofyear(4 Jul 2000 2:21:17pm) = 2000185 14:21:17 + \fdoy() = 2000185 14:21:17 (on 4 Jul 2000 at 2:21:17pm). + \fdoy(4 Jul 2000) = 2000185 + \fdoy(6pm) = 2000185 18:00:00 (on 4 Jul 2000 at 6:00pm). + + Note: The yyyyddd day-of-year format is often erroneously referred to + as a Julian date. However, a true Julian date is a simple counting + number, the number of days since a certain fixed day in the past. + [356]See \fmjd() below. + + \fdoy2date(date-time) + Converts a date or date-time in day-of-year format to a + standard format date. A yyyyddd-format date must be supplied; + time is optional. The given date is converted to yyyymmdd + format. If a time is given, it is converted to 24-hour format. + Examples: + + \fdoy2date(2000185) = 20000704 + \fdoy2(2000185 3pm) = 20000704 15:00:00 + + \fmjd(date-time) + Converts free-format date and/or time to a Modified Julian Date + (MJD), the number of days since 17 Nov 1858 00:00:00. If a time + is given, it is ignored. Examples: + + \fmjd(4 Jul 2000) = 50998 + \fmjd(17 Nov 1858) = 0 + \fmjd(16 Nov 1858) = -1 + + \fmjd2date(mjd) + Converts an MJD (integer) to standard date format, yyyymmdd: + + \fmjd2(50998) = 4 Jul 1998 + \fmjd2(0) = 17 Nov 1858 + \fmjd2(-1) = 16 Nov 1858 + \fmjd2(-365) = 17 Nov 1857 + + MJDs are normal integers and, unlike DOYs, may be added, subtracted, + etc, with each other or with other integers, to obtain meaningful + results. For example, to find out the date 212 days ago: + + echo \fmjd2date(\fmjd()-212) + + Constructions such as this can be used in any command where a + date-time is required, e.g.: + + send /after:\fmjd2date(\fmjd()-212) + + to send all files that are not older than 212 days (this is equivalent + to "send /after:-212days"). + + MJDs also have other regularities not exhibited by other date formats. + For example, \fmodulus(\fmjd(any-date),7) gives the day of the week + for any date (where 4=Sun, 5=Mon, ..., 3=Sat). (However, it is easier + to use \fnday() for this purpose, and it gives the more conventional + result of 0=Sun, 1=Mon, ..., 6=Sat). + + Note that if MJDs are to be compared, they must be compared + numerically (IF <, =, >) and not lexically (IF LLT, EQUAL, LGT), + whereas DOYs must be compared lexically if they include a time (which + contains ":" characters); however, if DOYs do not include a time, they + may also be compared numerically. + + In any case, lexical comparison of DOYs always produces the + appropriate result, as does numeric comparison of MJDs. + + The same comments apply to sorting. Also note that DOYs are fixed + length, but MJDs can vary in length. However, all MJDs between 3 April + 1886 and 30 Aug 2132 are 5 decimal digits long. (MJDs become 6 digits + long on 31 Aug 2132, and 7 digits long on 13 Oct 4596). + _________________________________________________________________ + + 1.7. Partial Completion of Keywords + + Partial completion of keywords was added in C-Kermit 7.0. In prior + versions, if completion was attempted (by pressing the Esc or Tab key) + on a string that matched different keywords, you'd just get a beep. + Now Kermit completes up to the first character where the possibly + matching keywords differ and then beeps. For example: + + C-Kermit> send /n + + which matches /NOT-BEFORE and /NOT-AFTER, now completes up to the + dash: + + C-Kermit> send /not- + + Partial completion works for filenames too (as it has for some years). + _________________________________________________________________ + + 1.8. Command Recall + + C-Kermit has had a command history buffer for some time, which could + be scrolled interactively using control characters or (in Kermit 95 + only) arrow keys. Version 7.0 adds a REDO command that allows the most + recent command matching a given pattern to be re-executed: + + { REDO, RR, ^ } [ pattern ] + Search the command history list for the most recent command + that matches the given pattern, and if one is found, execute it + again. + + The pattern can be a simple string (like "send"), in which case the + last SEND command is re-executed. Or it can contain wildcard + characters "*" and/or "?", which match any string and any single + character, respectively (note that "?" must be preceded by backslash + to override its normal function of giving help), and in most C-Kermit + versions may also include [] character lists and {} string lists (see + [357]Section 4.9). + + The match works by appending "*" to the end of the given pattern (if + you didn't put one there yourself). Thus "redo *oofa" becomes "redo + *oofa*" and therefore matches the most recent command that contains + "oofa" anywhere within the command. If you want to inhibit the + application of the trailing "*", e.g. to force matching a string at + the end of a command, enclose the pattern in braces: + + redo {*oofa} + + matches the most recent command that ends with "oofa". + + REDO commands themselves are not entered into the command history + list. If no pattern is given, the previous (non-REDO) command is + re-executed. The REDOne command is reinserted at the end of the + command history buffer, so the command scrollback character (Ctrl-P, + Ctrl-B, or Uparrow) can retrieve it. + + Examples: + + C-Kermit> echo foo + foo + C-Kermit> show alarm + (no alarm set) + C-Kermit> echo blah + blah + C-Kermit> redo ; Most recent command + blah + C-Kermit> redo s ; Most recent command starting with "s" + (no alarm set) + C-Kermit> redo echo f ; Most recent command starting with "echo f" + foo + C-Kermit> redo *foo ; Most recent command that has "foo" in it + foo + C-Kermit> ; Scroll back + C-Kermit> echo foo ; The REDOne command is there + C-Kermit> redo {*foo} ; Most recent command that ends with "foo" + foo + C-Kermit> + + Since REDO, REDIAL, and REDIRECT all start the same way, and RED is + the designated non-unique abbreviation for REDIAL, REDO must be + spelled out in full. For convenience, RR is included as an invisible + easy-to-type synonym for REDO. You can also use the "^" character for + this: + + C-Kermit> ^ ; Most recent command + C-Kermit> ^ s ; Most recent command starting with "s" + C-Kermit> ^s ; Ditto (space not required after "^"). + C-Kermit> ^*foo ; Most recent command that has "foo" in it. + C-Kermit> ^{*foo} ; Most recent command ends with "foo". + + Unlike the manual command-history-scrolling keys, the REDO command can + be used in a script, but it's not recommended (since the command to be + REDOne might not be found, so if the REDO command fails, you can't + tell whether it was because REDO failed to find the requested command, + or because the command was found but it failed). + _________________________________________________________________ + + 1.9. EXIT Messages + + The EXIT and QUIT commands now accept an optional message to be + printed. This makes the syntax of EXIT and QUIT just like END and + STOP: + + { EXIT, QUIT, END, STOP } [ status-code [ message ] ] + + where status-code is a number (0 indicating success, nonzero + indicating failure). This is handy in scripts that are never supposed + to enter interactive mode: + + dial 7654321 + if fail exit 1 Can't make connection - try again later. + + Previously this could only be done in two steps: + + dial 7654321 + xif fail { echo Can't make connection - try again later, exit 1 } + + A status code must be included in order to specify a message. In the + case of EXIT and QUIT, the default status code is contained in the + variable \v(exitstatus), and is set automatically by various events + (file transfer failures, etc; it can also be set explicitly with the + SET EXIT STATUS command). If you want to give an EXIT or QUIT command + with a message, but without changing the exit status from what it + normally would have been, use the \v(exitstatus) variable, e.g.: + + exit \v(existatus) Goodbye from \v(cmdfile). + + The EXIT status is returned to the system shell or whatever other + process invoked C-Kermit, e.g. in UNIX: + + C-Kermit> exit 97 bye bye + bye bye + $ echo $? + 97 + $ + _________________________________________________________________ + + 1.10. Managing Keyboard Interruptions + + When C-Kermit is in command or file-transfer mode (as opposed to + CONNECT mode), it can be interrupted with Ctrl-C. Version 7.0 adds the + ability to disarm the Ctrl-C interrupt: + + SET COMMAND INTERRUPT { ON, OFF } + COMMAND INTERRUPT is ON by default, meaning the Ctrl-C can be + used to interrupt a command or a file transfer in progress. Use + OFF to disable these interruptions, and use it with great + caution for obvious reasons. + + SET TRANSFER INTERRUPT { ON, OFF } + This can be used to disable keyboard interruption of file + transfer when C-Kermit is in local mode, or to re-enable it + after it has been disabled. This applies to the X, Z, E, and + similar keys as well as to the system interrupt character, + usually Ctrl-C. This is distinct from SET TRANSFER + CANCELLATION, which tells whether packet mode can be exited by + sending a special sequence of characters. + + Several other commands can be interrupted by pressing any key while + they are active. Version 7.0 adds the ability to disable this form of + interruption also: + + SET INPUT CANCELLATION { ON, OFF } + Whether an INPUT command in progress can be interrupted by + pressing a key. Normally ON. Setting INPUT CANCELLATION OFF + makes INPUT commands uninterruptible except by Ctrl-C (unless + COMMAND INTERRUPTION is also OFF). + + SET SLEEP CANCELLATION { ON, OFF } + Whether a SLEEP, PAUSE, or WAIT command in progress can be + interrupted by pressing a key. Normally ON. Setting SLEEP + CANCELLATION OFF makes these commands uninterruptible except by + Ctrl-C (unless COMMAND INTERRUPTION is also OFF). Synonyms: SET + PAUSE CANCELLATION, SET WAIT CANCELLATION. + + So to make certain a script is not interruptible by the user, include + these commands: + + SET TRANSFER INTERRUPT OFF + SET SLEEP CANCELLATION OFF + SET INPUT CANCELLATION OFF + SET COMMAND INTERRUPTION OFF + + Make sure to turn them back on afterwards if interruption is to be + re-enabled. + + When a PAUSE, SLEEP, WAIT, or INPUT command is interrupted from the + keyboard, the new variable \v(kbchar) contains a copy of the (first) + character that was typed and caused the interruption, provided it was + not the command interrupt character (usually Ctrl-C). If these + commands complete successfully or time out without a keyboard + interruption, the \v(kbchar) variable is empty. + + The \v(kbchar) variable (like any other variable) can be tested with: + + if defined \v(kbchar) command + + The command is executed if the variable is not empty. + + The \v(kbchar) variable can be reset with WAIT 0 (PAUSE 0, SLEEP 0, + etc). + _________________________________________________________________ + + 1.11. Taming The Wild Backslash -- Part Deux + + [358]Using C-Kermit, 2nd Edition, contains a brief section, "Taming + the Wild Backslash", on page 48, which subsequent experience has shown + to be inadequate for Kermit users intent on writing scripts that deal + with Windows, DOS, and OS/2 filenames, in which backslash (\) is used + as the directory separator. This section fills in the blanks. + + 1.11.1. Background + + The Kermit command language shares a certain unavoidable but annoying + characteristic with most other command languages that are capable of + string replacement, namely the necessity to "quote" certain characters + when you want them to be taken literally. This is a consequence of the + facts that: + + 1. One or more characters must be set aside to denote replacement, + rather than acting as literal text. + 2. We have only 96 printable characters to work with in ASCII, which + is still the only universally portable character set. + 3. There is no single printable character that is unused everywhere. + 4. Variables are not restricted to certain contexts, as they are in + formal programming languages like C and Fortran, but can appear + anywhere at all within a command, and therefore require special + syntax. + + Thus there can be conflicts. To illustrate, the standard UNIX shell + uses dollar sign ($) to introduce variables. So the shell command: + + echo $TERM + + displays the value of the TERM variable, e.g. vt320. But suppose you + want to display a real dollar sign: + + echo The price is $10.20 + + This causes the shell to evaluate the variable "$1", which might or + might not exist, and substitute its value, e.g.: + + The price is 0.20 + + (in this case the $1 variable had no value.) This is probably not what + you wanted. To force the dollar sign to be taken literally, you must + apply a "quoting rule", such as "precede a character by backslash (\) + to force the shell to take the character literally": + + echo The price is \$10.20 + The price is $10.20 + + But now suppose you want the backslash AND the dollar sign to be taken + literally: + + echo The price is \\$10.20 + + This doesn't work, since the first backslash quotes the second one, + thereby leaving the dollar sign unquoted again: + + The price is \0.20 + + Quoting the dollar sign requires addition of a third backslash: + + echo The price is \\\$10.20 + The price is \$10.20 + + The first backslash quotes the second one, and the third backslash + quotes the dollar sign. + + Every command language -- all UNIX shells, VMS DCL, DOS Batch, AOS/VS + CLI, etc etc -- has similar rules. UNIX shell rules are probably the + most complicated, since many printable characters -- not just one -- + are special there: dollar sign, single quote, double quote, backslash, + asterisk, accent grave, number sign, ampersand, question mark, + parentheses, brackets, braces, etc -- practically every + non-alphanumeric character needs some form of quoting if it is to be + taken literally. And to add to the confusion, the UNIX shell offers + many forms of quoting, and many alternative UNIX shells are available, + each using slightly different syntax. + _________________________________________________________________ + + 1.11.2. Kermit's Quoting Rules + + Kermit's basic quoting rules are simple by comparison (there are, of + course, additional syntax requirements for macro definitions, command + blocks, function calls, etc, but they are not relevant here). + + The following characters are special in Kermit commands: + + Backslash (\) + Introduces a variable, or the numeric representation of a + special character, or a function, or other item for + substitution. If the backslash is followed by a digit or by any + of the following characters: + + x, o, d, m, s, f, v, $, %, &, :, { + + this indicates a special substitution item; otherwise the + following character is to be taken literally (exceptions: \ at + end of line is taken literally; \n, \b, and \n are special + items in the OUTPUT command only). + + Semicolon (;) + (Only when at the beginning of a line or preceded by at least + one space or tab) Introduces a comment. + + Number sign (#) + (Only when at the beginning of a line or preceded by at least + one space or tab) Just like semicolon; introduces a comment. + + Question mark (?) + (Only at the command prompt - not in command files or macros) + Requests context-sensitive help. + + To force Kermit to take any of these characters literally, simply + precede it by a backslash (\). + + Sounds easy! And it is, except when backslash also has a special + meaning to the underlying operating system, as it does in DOS, + Windows, and OS/2, where it serves as the directory separator in + filenames such as: + + D:\K95\KEYMAPS\READ.ME + + Using our rule, we would need to refer to this file in Kermit commands + as follows: + + D:\\K95\\KEYMAPS\\READ.ME + + But this would not be obvious to new users of Kermit software on DOS, + Windows, or OS/2, and it would be annoying to seasoned ones. Thus + MS-DOS Kermit and Kermit 95 go to rather extreme lengths to allow the + more natural notation, as in: + + send d:\k95\keymaps\read.me + + The reason this is tricky is that we also need to allow for variables + and other expressions introduced by backslash in the same command. For + example, suppose \%a is a variable whose value is "oofa" (without the + quotes). What does the following command do? + + send d:\%a + + Does it send the file named "oofa" in the current directory of the D: + disk, or does it send a file named "%a" in the root directory of the + D: disk? This is the kind of trouble we get into when we attempt to + bend the rules in the interest of user friendliness. (The answer is: + if the variable \%a has definition that is the name of an existing + file, that file is sent; if a file d:\%a exists, it is sent; otherwise + if both conditions are true, the variable takes precedence, and the + literal filename can be forced by quoting: \\%a.) + + In Kermit 95 (but not MS-DOS Kermit), we also bend the rules another + way by allowing you to use forward slash (/) rather than backslash (\) + as the directory separator: + + send d:/k95/keymaps/read.me + + This looks more natural to UNIX users, and in fact is perfectly + acceptable to the Windows 95/98/NT and OS/2 operating systems on the + API level. BUT (there is always a "but") the Microsoft shell, + COMMAND.COM, for Windows 95/98 and NT does not allow this notation, + and therefore it can not be used in any Kermit command -- such as RUN + -- that invokes the Windows command shell AND your command shell is + COMMAND.COM or any other shell that does not allow forward slash as + directory separator (some alternative shells do allow this). + + NOTE: There exists a wide variety of alternative shells from third + parties that do not have this restriction. If you are using a shell + that accepts forward slash as a directory separator, you can stop + reading right now -- UNLESS (there is always an "unless") you want + your scripts to be portable to systems that have other shells. Also + note that some Windows shells might actually REQUIRE forward + slashes (instead of backslashes) as directory separators; we do not + treat this situation below, but the treatment is obvious -- use + slash rather backslash as the directory separator. + _________________________________________________________________ + + 1.11.3. Passing DOS Filenames from Kermit to Shell Commands + + The following Kermit commands invoke the system command shell: + + RUN (and its synonyms ! and @) + REDIRECT + PIPE + + Each of these commands takes a shell command as an operand. These + shell commands are not, and can not be, parsed by Kermit since Kermit + does not know the syntax of shell commands, and so can't tell the + difference between a keyword, a filename, a variable, a switch, or + other item. Therefore the rules can not be bent since Kermit doesn't + know where or how to bend them. To illustrate (using the regular + Windows shell): + + run c:\\windows\\command\\chkdsk.exe + + works OK, but: + + run c:/windows/command/chkdsk.exe + + is not accepted by COMMAND.COM. But: + + run c:\windows\command\chkdsk.exe + + results in Kermit applying its quoting rules before sending the text + to the shell. Since "w" and "c" are not in the list of backslash-item + codes, the backslash means "take the following character literally". + Thus, by the time this filename gets to the Windows shell, it has + become: + + c:windowscommandchkdsk.exe + + which is probably not what you wanted. (If "w" and "c" were in the + list, the results could be even stranger.) Even more confusing is the + case where a directory or filename starts with one or more digits: + + run c:\123\lotus.exe + + in which "\123" is the Kermit notation for ASCII character 123, which + happens to be left brace ({), resulting in "c:{lotus.exe". + + So when passing filenames to a Windows shell, always use double + backslashes as directory separators, to ensure that the shell gets + single backslashes: + + run c:\\windows\\command\\chkdsk.exe + run c:\\123\\lotus.exe + + Similar problems might occur with the built-in EDIT, BROWSE, and FTP + commands. These commands result in Kermit building a shell command + internally to invoke the associated helper program; the form of this + command might conflict with the form demanded by certain alternative + shells. + _________________________________________________________________ + + 1.11.4. Using Variables to Hold DOS Filenames + + Now to the next level. Suppose you want to write a script in which + filenames are parameters, and therefore are stored in variables. + Example: + + define \%f c:\windows\command\chkdsk.exe + ... + run \%f + + Obviously this won't work for the reasons just noted; the RUN command + requires directory separators be coded as double backslashes: + + define \%f c:\\windows\\command\\chkdsk.exe + ... + run \%f + + This will work; no surprises here. However, if you had used ASSIGN + rather than DEFINE, you might have been surprised after all; review + pages 348-349 of [359]Using C-Kermit (2nd Ed) for the difference + between DEFINE and ASSIGN. + + We have said that any Kermit 95 or MS-DOS Kermit command that parses + filenames itself -- SEND, for example -- does not require double + backslashes since it knows it is parsing a filename. So since the + following works: + + send c:\windows\command\chkdsk.exe + + Should the following also work? + + define \%f c:\windows\command\chkdsk.exe + ... + send \%f + + Answer: No. Why? Because \%f is evaluated "recursively", to allow for + the possibility that its definition contains further variable + references. This is true of all "backslash-percent-letter" (or -digit) + variables, and also for array references. So \%f becomes + c:\windows\command\chkdsk.exe, which becomes + c:windowscommandchkdsk.exe. + + The trick here is to use the "other" kind of variable, that is + evaluated only "one level deep" rather than recursively: + + define filename c:\windows\command\chkdsk.exe + ... + send \m(filename) + + Similarly if you want to prompt the user for a filename: + + ask filename { Please type a filename: } + Please type a filename: c:\windows\command\chkdsk.exe + send \m(filename) + _________________________________________________________________ + + 1.11.5. Passing DOS Filenames as Parameters to Macros + + Suppose you want to pass a DOS filename containing backslashes as a + parameter to a Kermit macro. This raises two issues: + + 1. Parameters to macros are "just text" and so are fully evaluated + before they are passed to the macro. + 2. Once inside the macro, the formal parameters \%1, \%2, ... \%9 are + the type of variable that is evaluated recursively. + + Thus a DOS filename is ruined once in the act of parsing the macro + invocation, and again when referring to it from within the macro. To + illustrate, suppose "test" is a macro. Then in the invocation: + + test c:\mydir\blah.txt + + "c:mydirblah.txt" is assigned to \%1. However, if we double the + backslashes: + + test c:\\mydir\\blah.txt + + "c:\mydir\blah.txt" is assigned to \%1. But then when you refer to \%1 + in the macro, it is evaluated recursively, resulting in + "c:mydirblah.txt". To illustrate: + + define test echo \%1 + test c:\mydir\blah.txt + c:mydirblah.txt + test c:\\mydir\\blah.txt + c:mydirblah.txt + test c:\\\\mydir\\\\blah.txt + c:\mydir\blah.txt + + Let's address each part of the problem separately. First, inside the + macro. You can use the \fcontents() function to force a + backslash-percent variable (such as a macro argument) to be evaluated + one level deep instead of recursively, for example: + + define test echo { The filename is "\fcontents(\%1)"} + + test c:\mydir\blah.txt ; We don't expect this to work + The filename is "c:mydirblah.txt" ; and it doesn't. + test c:\\mydir\\blah.txt ; But this does... + The filename is "c:\mydir\blah.txt" + + Thus if the filename arrives inside the macro with single backslashes, + the backslashes are preserved if you always refer to the parameter + through the \fcontents() function. + + Now how to ensure that backslashes are not stripped or misinterpreted + when passing a filename to a macro? This brings us back to what we + learned in earlier sections: + + 1. If it is a literal filename, either double the backslashes, or (if + the filename is to be used only within Kermit itself and not + passed to a DOS shell, or it is to be passed to an alternative + shell that accepts forward slash as a directory separator), use + forward slash instead of backslash as the directory separator. + 2. If it is a variable that contains a filename, make sure you use a + macro-style variable name, rather than a + backslash-percent-character name. + + Examples: + + define test echo \fcontents(\%1) + define filename c:\mydir\blah.txt + + test c:\\mydir\\blah.txt ; Literal filename with double backslashes + c:\mydir\blah.txt + + test c:/mydir/blah.txt ; Literal filename with forward slashes + c:/mydir/blah.txt + + test \m(filename) ; Variable + c:\mydir\blah.txt + + But what if you don't like these rules and you still want to pass a + literal filename containing single backslashes to a macro? This is + possible too, but a bit tricky: turn command quoting off before + invoking the macro, and then turn it back on inside the macro. + Example: + + define test set command quoting on, echo \fcontents(\%1) + + set command quoting off + test c:\mydir\blah.txt + c:\mydir\blah.txt + + Upon return from the macro, command quoting is back on (since the + macro turned it on). + + Obviously this trick can not be used if the filename is stored in a + variable, since it prevents the variable from being evaluated. + _________________________________________________________________ + + 1.11.6. Passing DOS File Names from Macro Parameters to the DOS Shell + + Now suppose you need to pass a DOS filename to a macro, and the macro + needs to pass it, in turn, to the Windows shell via (say) Kermit's RUN + command. This works too: + + define xrun run \fcontents(\%1) + xrun c:\\windows\\command\\chkdsk.exe + + (or you can use the SET COMMAND QUOTING OFF / ON technique described + above to avoid the double backslashes.) But.. + + xrun c:/windows/command/chkdsk.exe + + does not work if the Windows shell does not recognize "/" as a + directory separator. If there is a chance that a filename might be + passed to the macro in this form, the macro will need to convert it to + a form acceptable to the shell: + + define xrun run \freplace(\fcontents(\%1),/,\\) + + Here we replace all occurrences (if any) of "/" in the argument with + "\" prior to issuing the RUN command. Of course, in order to specify + "\" as a literal character in the \freplace() argument list, we have + to double it. + _________________________________________________________________ + + 1.11.7. Passing DOS Filenames to Kermit from the Shell + + As noted in the manual, the \&@[] array contains Kermit's command-line + arguments. Suppose one of these arguments, say \&@[3], is a DOS + filename such as C:\FOO\BAR\BAZ\OOFA.TXT. (Note: In C-Kermit 7.0 and + K95 1.1.18 and later, command-line arguments after "=" or "--" are + also available in the top-level \%1..9 variables; see [360]Section + 7.5.) + + Of course you can eliminate any problems by using forward slashes + rather than backslashes in the filename, but sometimes this is not + possible, as when the Kermit command line is being generated by + another program than can only generate "native" format DOS filenames. + + As noted in the manual, "\%x" variables and \&x[] arrays are always + evaluated "all the way" (recursively). If the contents of one of these + variables contains backslashes, this causes another level of + evaluation. + + There is another kind of variable, which is evaluated only "one level + deep". You can use this to prevent interpretation of the backslashes + in the filenames. Example: + + assign filename \fcontents(\&@[3]) ; Transfer contents + ... + send \m(filename) + + Or, more simply: + + send \fcontents(\&@[3]) + _________________________________________________________________ + + 1.12. Debugging + + The debug log is produced when you give a "log debug" command. This is + normally done at the request of the Kermit help desk, for forwarding + to the Kermit developers for analysis as a last resort in + troubleshooting problems. (Last resort because it can grow quite huge + in a very short time.) In cases where timing information is critical + to understanding a problem, you can tell C-Kermit to put a timestamp + on each debug log line by giving the command: + + SET DEBUG TIMESTAMP ON + + At any time before or after activating the debug log (SET DEBUG + TIMESTAMP OFF turns off timestamping). Timestamps can be turned off + and on as desired while logging. Obviously, they increase the size and + growth rate of the log significantly, and so should be used sparingly. + Timestamps are of the form hh:mm:ss.xxx, where .xxx is thousands of a + second (but is included only on platforms that include this feature). + _________________________________________________________________ + + 1.13. Logs + + In UNIX C-Kermit and in K-95, you can now direct any log to a pipe. + This not only lets you send your logs to places other than disk files, + but also lets you customize them to any desired degree. + + LOG { DEBUG, PACKETS, SESSION, TRANSACTION, CONNECTION } { file, pipe + } ... + A "pipe" is the name of a command, preceded by a vertical bar. + If the pipe contains any spaces, it must be enclosed in braces. + + Here are some examples for UNIX (always remember the importance of + getting the UNIX shell quoting rules right): + + LOG TRANSACTIONS |lpr + This sends the transaction log to the default UNIX printer, + rather than to a file (use "lp" rather than "lpr" if + necessary). + + LOG TRANSACTIONS {| myfilter > t.log} + For those who don't like the format of the transaction log, or + want to extract certain information from it; write your own + output filter. + + LOG SESSION {| lpr -Plaserwriter} + This sends the session log to a specific UNIX printer, rather + than to a file. Note the braces around the pipeline. These are + required because it contains spaces. + + LOG DEBUG {| tail -100 > debug.log} + This causes the debug log file to contain only the final 100 + lines. Suppose C-Kermit crashes under some unpredictable + circumstances, and you need a debug log to catch it in the act. + But the debug log can grow to huge proportions very quickly, + possibly filling up the disk. Piping the debug log through + "tail" results in keeping only the last 100 lines (or other + number of your choice). + + LOG DEBUG {| grep "^TELNET" > debug.log} + This one shows how to log only Telnet negotiations. Piping the + debug log through grep or egrep lets you log only specific + information, rather than everything. "man grep" for further + info. + + LOG DEBUG {| gzip -c > debug.log.gz} + Creates a full debug log, but compressed by gzip to save space. + + LOG PACKETS {| tr "\\01" "X" | cut -c9- > packet.log} + This one writes the regular packet log, but translates the + Ctrl-A that starts each packet to the letter "X" and removes + the s-nn-nn- notation from the beginning of each line. Note the + double backslash (normal Kermit quoting rules). "man tr" and + "man cut" for further info. + + See [361]Section 2.12 for information about the new connection log. + _________________________________________________________________ + + 1.14. Automatic File-Transfer Packet Recognition at the Command Prompt + + Beginning in version 7.0, C-Kermit can recognize Kermit (and in some + cases also Zmodem) file-transfer packets while at its command prompt. + This is convenient (for example), if you escaped back from a remote + Kermit program and told the local Kermit program to send a file, but + forgot to tell the remote Kermit program to receive it (and the local + Kermit did not have the "send a Kermit receive command" feature + available). This feature is controlled by the following command: + + SET COMMAND AUTODOWNLOAD { ON, OFF } + When ON, which is the default, the command parser recognizes + Kermit packets when Kermit is in remote mode. An S packet makes + it go into receive mode, an I packet makes it go into server + mode. When OFF, packet recognition is disabled and the behavior + when a packet is received at the command prompt is as it was in + C-Kermit 6.1 and earlier (namely to print an error message). + + COMMAND AUTODOWNLOAD is the command-mode equivalent of TERMINAL + AUTODOWNLOAD, which is effective during CONNECT mode. + _________________________________________________________________ + + 1.15. The TYPE Command + + The TYPE command now accepts a selection of optional switches + ([362]Section 1.5), and also sets several variables. + + Syntax: TYPE [ switches... ] filename + + Variables: + + \v(ty_ln) + Line number of current line (during TYPE command; see /PREFIX) + + \v(ty_lc) + Line count of file most recently TYPEd. + + \v(ty_mc) + Match count of file most recently TYPEd (see /MATCH). + + Switches: + + /PAGE + If /PAGE is included, Kermit pauses at the end of each + screenful and issues a "more?" prompt. You may press the space + bar to view the next page (screenful), or press "q" or "n" to + return to the C-Kermit prompt. If this switch is given, it + overrides the COMMAND MORE-PROMPTING setting for this command + only. If it is not given, paging is according to COMMAND + MORE-PROMPTING. + + /NOPAGE + Do not pause at the end of each screenful; show the whole file + (or all selected lines) at once. If this switch is given, it + overrides the COMMAND MORE-PROMPTING setting for this command + only. If it is not given, paging is according to COMMAND + MORE-PROMPTING. + + /HEAD[:n] + Only show the first n lines of the file (where n is a number). + If n is omitted, 10 is used. + + /TAIL[:n] + Only show the last n lines of the file (where n is a number). + If nis omitted, 10 is used. Note: /HEAD and /TAIL can't be + combined; if you give both switches, only the most recent one + is used. + + /MATCH:pattern + Only type lines from the file that match the given pattern (see + [363]Section 4.9.1 for pattern notation). UNIX users familiar + with grep should note a significant difference: there is no + implied "*" at the beginning and end of the pattern. Thus: + + TYPE /MATCH:foo Lists lines whose entire contents are "foo". + TYPE /MATCH:foo* Lists lines that start with "foo". + TYPE /MATCH:*foo Lists lines that end with "foo". + TYPE /MATCH:*foo* Lists lines that have "foo" anywhere in them. + + /HEAD and /TAIL apply after /MATCH, so "type /tail:20 + /match:x*" shows the last 20 lines in the file that start with + "x". + + /PREFIX:string + Print the given string at the beginning of each line. The + string may be a constant, a variable, or a quoted variable. If + it's an unquoted variable, its value at the time the TYPE + command was given is used as a constant. If it is a quoted + variable, it is re-evaluated for each line; a useful variable + for this context is \v(ty_ln) (the line number of the current + line being typed). If the prefix is to include spaces, it must + be enclosed in braces. Examples: + + type /prefix:{oofa.txt: } /match:*thing* oofa.txt + Prints all lines in oofa.txt that contain "thing" with + the filename itself as the prefix (similar to UNIX grep). + + type /prefix:{\v(time). } oofa.txt + Prefixes each line of oofa.txt with the time at which the + TYPE command was given (one backslash) + + type /prefix:{\\v(time). } oofa.txt + Prefixes each line of oofa.txt with the time at which + that line is being typed (two backslashes). + + type /prefix:{\\v(ty_ln). } oofa.txt + Prefixes each line of oofa.txt with its line number. + + type /prefix:{\\flpad(\\v(ty_ln),4). } oofa.txt + Same as the previous example, except the line number is + right-adjusted in a 4-column field. + + /WIDTH[:n] + Truncates each line at column n (which must be a number) prior + to printing it. This option can be used for long lines when you + don't want them to wrap. If nis omitted, your current screen + width is used. + + /COUNT + Counts lines and -- if /MATCH was included, matches -- but does + not print any lines from the file. The line and match count is + shown at the end, and the variables \v(ty_lc) and \v(ty_lm) are + set accordingly. + + SET OPTIONS TYPE { /PAGE, /NOPAGE, /WIDTH:n } + Sets the paging default for TYPE commands, which can be + overridden in any particular TYPE command by including the + desired switch. + + If a TYPE command is given with no switch, and no SET OPTIONS TYPE + selection is in effect, paging is according to your COMMAND + MORE-PROMPTING setting (SHOW COMMAND). + _________________________________________________________________ + + 1.16. The RESET Command + + The RESET command, added in 7.0, closes all open files and logs, but + does not affect the open connection (if any). + _________________________________________________________________ + + 1.17. The COPY and RENAME Commands + + As of C-Kermit 7.0, in the UNIX version only, the COPY and RENAME + commands are built in and do not call the underlying platform's COPY + or RENAME command. This allows them to work in "NOPUSH" versions and + other circumstances where it can't access system commands, and it + allows file copying and renaming to be done portably in scripts. The + characteristics of the built-in COPY or RENAME include: + * It fails if the source file is a directory or is wild or lacks + read access. + * It fails if the source file is the destination file. + * It allows the destination file to be a directory, in which case + the source file is copied (or renamed) into it with the same name. + * It overwrites an existing destination file if its permission + allows. + * It sets the new file's permission according to umask but also + carries forward the source file's execute permission bits if the + destination file did not already exist. + * It fails if interrupted by Ctrl-C. + * Upon error, it prints an appropriate message. + * It returns standardized error codes that can be tested by IF + SUCCESS / FAIL. + + These commands now also accept the following switches: + + /LIST (/LOG, /VERBOSE) = Print "file1 => file2 (OK)" (or error message). + /NOLIST (/NOLOG, /QUIET) = Don't print anything (except error messages). + + /NOLIST is the default. + + The same built-in code is used by the UNIX C-Kermit server to execute + REMOTE COPY commands (except in this case no switches are available). + + The COPY command also accepts the following additional switches. When + any of these are given (and they can be used in any combination except + /SWAP and /APPEND), some of the checks listed above are relaxed, and + thus it might be possible to get into trouble in certain cases, e.g. + when the source and target files are the same file: + + /APPEND = Append source file to destination file. + /SWAP-BYTES = Swap bytes (see [364]Section 6.6.5). + /FROMB64 = Decode the source file from Base64 encoding. + /TOB64 = Encode the target file in Base64. + + Base64 is the encoding commonly used for enclosures in Internet email. + _________________________________________________________________ + + 1.18. The MANUAL Command + + The MANUAL command can be used to access the appropriate Kermit manual + or other manual. The general syntax is: + + MANUAL [ string ] + If the string is omitted, C-Kermit asks the underlying system + to access the C-Kermit manual using whatever method is + appropriate for the system. + + The specific action depends on the system. In UNIX, a "man" command is + issued; "kermit" is the default argument but other manual topics may + be specified. If the "man" command allows index or string searching, + the appropriate syntax may be included. + + In Kermit 95, the MANUAL command brings up the HTML online K95 manual. + + In VMS and elsewhere, "man" is simply translated to "help", with a + default argument of "kermit"; other and/or additional arguments may be + included according to the definition of the system's "help" command. + + Correct operation of the "man" command in C-Kermit depends on the + appropriate man page or help topic having been installed in the right + place with the right permissions and format. + _________________________________________________________________ + + 1.19. String and Filename Matching Patterns + + A pattern is a string that includes special notation for matching + classes or sequences of characters. C-Kermit 7.0 / K95 1.1.19 supports + patterns in several places: + + * Filenames ([365]Section 4.9) + * SWITCH case labels ([366]Section 7.18) + * The new IF MATCH statement ([367]Section 7.4) + * TYPE /MATCH ([368]Section 1.15) + * SET FILE TEXT-PATTERNS and BINARY-PATTERNS ([369]Section 4.3) + * The \fsearch() and \farraylook() functions ([370]Sections 7.3 and + [371]7.10.7) + * The \fpattern() function used with [M,RE]INPUT ([372]Section 7.1) + + Patterns are also called wildcards, especially when used for filename + matching. C-Kermit's pattern syntax is explained in [373]Section + 4.9.1, and also by the HELP WILDCARDS command. + _________________________________________________________________ + + 1.20. Multiple Commands on One Line + + As of C-Kermit 7.0, commands can be grouped together on one line by + separating the commands with commas and enclosing the list in braces. + For example: + + C-Kermit> { echo One, echo Two, echo Three } + C-Kermit> do { echo One, echo Two, echo Three } + + Command lists can be nested: + + [ do ] { echo One, echo Two, if true { echo A, echo B}, echo Three } + + and the END command works as it does in macros: + + [ do ] { echo One, echo Two, if true end, echo Three } + + The "one line" stricture is, of course, pliant to line-continuation + conventions, namely that lines ending in hyphen (-) or left brace ({) + are to be continued. Thus the first example can also be rendered: + + [ do ] { + echo One + echo Two + echo Three + } + + (the "do" is optional). + _________________________________________________________________ + + 1.21. What Do I Have? + + C-Kermit can be built for hundreds of different platforms with + practically countless configuration options. Certain commands might + not be available in certain configurations, etc. Even on the same + platform, different builds are possible: "maximum functionality", + "minimum size", "maximum performance", and so on. You can find out a + lot about the configuration of your C-Kermit program with the SHOW + FEATURES command. Of course, a lot of what it says, especially in the + bottom part, might seem like gibberish, but can be deciphered with a + Rosetta Stone (such as the C-Kermit source or the [374]ckccfg.txt + file). In any case, the output from SHOW FEATURES might easily explain + why some expected feature is missing, or some buffer is smaller than + expected. Here's a sample of the bottom section for the SunOS version: + +C-Kermit 7.0.196, 1 Jan 2000 + +Major optional features included: + Network support (type SHOW NET for further info) + Telnet Kermit Option + Hardware flow control + External XYZMODEM protocol support + Latin-1 (West European) character-set translation + Latin-2 (East European) character-set translation + Cyrillic (Russian, Ukrainian, etc) character-set translation + Greek character-set translation + Hebrew character-set translation + Japanese character-set translation + Unicode character-set translation + Pseudoterminal control + REDIRECT command + RESEND command + Fullscreen file transfer display + Control-character unprefixing + Streaming + Autodownload + +Major optional features not included: + No Kerberos(TM) authentication + No SRP(TM) (Secure Remote Password) protocol + No Secure Sockets Layer (SSL) protocol + No Transport Layer Security (TLS) protocol + No encryption + No X Windows forwarding + +Host info: + Machine: sun4m + Model: (unknown) + OS: SunOS + OS Release: 4.1.3_U1 + OS Version: 4 + +Target: sunos41gsc +GCC version: 2.7.2 +Compiled Dec 31 1999 10:38:54, options: + __GNUC__ __STDC__ _POSIX_JOB_CONTROL _SC_JOB_CONTROL ARRAYREFLEN=1024 BIGBUFOK + BROWSER BSD4 CK_ANSIC CK_APC CK_AUTODL CK_CURSES CK_DNS_SRV CK_ENVIRONMENT + CK_FAST CK_LOGIN CK_MKDIR CK_NAWS CK_PCT_BAR CK_PERMS CK_RECALL CK_RTSCTS + CK_SPEED CK_TIMERS CK_TMPDIR CK_TTGWSIZ CK_TTYFD CK_WREFRESH CKEXEC + CKFLOAT=double CKGHNLHOST ckmaxfiles=64 CKMAXOPEN=64 CKMAXPATH=1023 CKREALPATH + CKREGEX CKSYSLOG CKTUNING CMDBL=32763 CMDDEP=64 CONGSPD DCMDBUF DIRENT DYNAMIC + FNFLOAT FORDEPTH=32 GFTIMER HADDRLIST HDBUUCP IFDEBUG IKS_OPTION IKSDB + IKSDCONF INBUFSIZE=32768 INPBUFSIZ=4096 MAC_MAX=16384 MACLEVEL=128 MAXDDIR=32 + MAXDNUMS=4095 MAXGETPATH=128 MAXTAKE=54 MAXWLD=102400 MSENDMAX=1024 NETCMD + NETCONN NETPTY NOKVERBS NOSETBUF OBUFSIZE=32768 PARSENSE PATTERNS PIPESEND + RENAME RLOGCODE SAVEDUID SELECT SIG_V SOL_SOCKET sparc STREAMING sun SUNOS4 + SYSTIMEH TCPSOCKET TIMEH TLOG TNCODE TTLEBUF TTSPDLIST UIDBUFLEN=256 UNIX + UNPREFIXZERO USE_LSTAT USE_MEMCPY VNAML=4096 WHATAMI XFRCAN Z_MAXCHAN=46 + z_maxchan=46 ZXREWIND + + byte order: big endian + + sizeofs: int=4 long=4 short=2 char=1 char*=4 float=4 double=8 + + floating-point: precision=16 rounding=1 + + Without going into detail about what all the notation means, notice a + couple things: + + * The Options section shows symbols ("macros") in effect during + compilation, together with their values (for those that have + values). The options are listed in alphabetical order to make any + particular option easier to find. + * MAXWLD is the maximum number of files that a wildcard can expand + to. + * Anything starting with "NO" is a feature (or something other than + a feature) that has been deliberately "compiled out", or omitted. + * Important items for script writers include: CMDBL=32763 (the size + of the command buffer and therefore the maximum length for a macro + or variable definition; CMDDEP=64 (the limit on recursion depth); + FORDEPTH=32 (the nesting limit on FOR loops); INBUFSIZE=32768 (the + size of the INPUT command circular buffer); MAC_MAX=16384 (the + maximum number of macros), etc. + + See the [375]ckccfg.txt file for details. + _________________________________________________________________ + + 1.22. Generalized File Input and Output + + C-Kermit 7.0 adds a new generalized I/O system for stream files, + augmenting (and to some extent, overlapping with) the older OPEN, + READ, WRITE, and CLOSE commands. In the new file i/o system, which can + be used simultaneously with the old one, all commands are grouped + together under the new FILE keyword, and some related functions and + variables are added. + + 1.22.1. Why Another I/O System? + + The well-known LOG, OPEN, READ, WRITE, and CLOSE commands have the + following restrictions: + + 1. Only one READ file and one WRITE file can be open at a time. + 2. The READ and WRITE commands are strictly line oriented. + 3. These commands can not be used with binary files. + 4. They do not support read/write access or random access. + 5. The syntax is a bit counterintuitive for programmers. + + The new file i/o system allows multiple files to be open at once, in + any desired combination of modes (read/write/append) supported by the + operating system, for line, block (record), or character i/o, for + sequential or random access, using consistent syntax and conventions. + + The new system, however, does not replace the old one, since the old + system still must be used for: + + 1. The session, packet, debug, transaction, and connection logs. + 2. Reading and writing commands rather than files. + 3. Existing scripts. + + The new system works only with regular files, not with commands or + pipes or mailboxes or pseudoterminals. No special provisions are made + in the FILE commands for handling devices or network connections, nor + for preventing you from trying to open them; if the underlying + operating system treats them like regular stream disk files, the FILE + commands (except, of course SEEK, REWIND, and COUNT) might work with + them. (In C programming terms, the FILE commands are, at present, + nothing more than a front end to fopen() / fread() / fwrite() / + fclose() and friends, which are a portable API to sequential files, + but this might change in the future for platforms like VMS and VOS + that have more complicated file systems.) + + Definitions: + + Channel + A number assigned to a file when it is opened, by which it must + be referred to in all input/output operations. + + Read/Write Pointer + The current position in an open file, expressed as the 0-based + byte count from the beginning. + _________________________________________________________________ + + 1.22.2. The FILE Command + + FILE keyword [ switches ] channel [ data ] + The keyword specifies the function: FILE OPEN, FILE READ, FILE + WRITE, FILE CLOSE, etc. For convenience (and for familiarity to + C programmers), the two-word FILE commands can be shortened to + the single words FOPEN, FREAD, FWRITE, FCLOSE, and so on. + Switches are optional, and modify or amplify the requested file + function. + + As in C, Fortran, and other programming languages, open files are + referred to by "channels", integers such as 0, 1, 2, 3, and so on. A + channel number is assigned when you open a file. The number of + available channels depends on the underlying operating system, and can + be seen in the variable: + + \v(f_max) + + or by giving the FILE LIST (FLIST) command. Channels are discussed in + greater detail in [376]Section 1.22.4. + + FILE command errors can be caught with IF FAIL after the FILE command. + In addition, the \v(f_error) variable is set to the completion code of + the command: 0 if no error, or a negative number if there was an + error. The error codes are listed in [377]Section 1.22.5. + + The command to open a file is: + + FILE OPEN [ switches ] variable filename + Opens a file for the type of access specified by the switches, + or for read-only access if no switches are given. Upon success, + a channel number is assigned to this file and stored in the + given variable so you can refer to the open file in subsequent + i/o commands. If the file can not be opened, the FILE OPEN + command fails. Synonym: FOPEN. + + The FILE OPEN switches are: + + /READ + Open the file for read access. If no switches are given, /READ + is assumed. If the file does not exist or can't be opened for + read access, the FILE OPEN command fails. + + /WRITE + Allow writing. If a file of the same name already exists, it is + overwritten unless /READ or /APPEND is also included. If a file + of the given name does not exist, it is created. + + /APPEND + Equivalent to /WRITE, except that if the file exists, it is not + destroyed. The read/write pointer is set to the end of the + file, so unless you change it with FILE SEEK or REWIND (see + below), the first FILE WRITE command adds to the end of the + file, preserving what was there already. If /WRITE is also + given, it is ignored. + + /BINARY + Open the file in "binary" mode, rather than text mode. This + switch is meaningless (but still can be used) in UNIX. In VMS, + Windows, and OS/2, it inhibits end-of-line processing and + conversion, and so should be used for binary files and/or files + that are to be accessed in record or character mode rather than + line by line. + + The variable for the channel number can be any kind of variable: the + \%x kind, a macro name, or an array element. But it must be a + variable, not a number -- C-Kermit assigns the channel number; you + can't tell it what number to use. + + Example: + + FILE OPEN \%c oofa.txt ; Open oofa.txt for reading. + IF FAIL exit 1 Can't open oofa.txt ; Always check to see if it worked. + ECHO oofa.txt: channel = \%c + + If the file oofa.txt is opened successfully, a channel number is + assigned to the variable \%c. Here's another example using a macro + name for the channel number: + + FILE OPEN channel oofa.txt ; Open oofa.txt for reading. + IF SUCCESS ECHO oofa.txt: channel = \m(channel) + + Switches can be combined when it makes sense and the underlying + operating system allows it. For example, to open a file in binary mode + for reading and writing (sometimes called "update"): + + FILE OPEN /READ /WRITE /BINARY \%c budget.db + + Some combinations might be allowed, others not. For example /READ + /APPEND will usually not be allowed. /WRITE /APPEND is treated as + /APPEND. + + A major advantage of the new system over the older one is that you can + have multiple files open at once. Suppose, for example, that you want + to open all the files in a certain directory at once: + + .\%n := \ffiles(/usr/olga*,&f) ; Get file list into array. + if ( > \%n \v(f_max) ) { ; Make sure there aren't too many. + exit 1 {\v(dir): \%n = Too many files} + } + declare \&c[\%n] ; Make array for channel numbers. + for \%i 1 \%n 1 { ; Loop to open every file... + file open \&c[\%i] \&f[\%i] ; Try to open this one + if fail exit 1 Open error: \&f[\%i] ; Check for failure + } + + If this loop completes successfully, the \&c[] array will contain \%n + channel numbers of open files in elements 1 through \%n. + + Any file that you open with FILE OPEN stays open until Kermit exits, + or you close it explicitly. The command to close a file is: + + FILE CLOSE { ALL, channel } + If a channel number is given and the channel refers to an open + file, the file is closed and the channel is freed for reuse; if + the channel does not refer to an open file, an error message is + printed and the command fails. If ALL is specified instead of a + specific channel, all files opened with FILE OPEN are closed + and if all open files were closed successfully (even if no + files were open), the command succeeds; if any open file could + not be closed, the command fails; however, all open files that + could be closed are still closed. Synonym: FCLOSE. + + FILE CLOSE might fail because, for example, the disk filled up or a + quota was exceeded. Example: + + fopen /write \%c new.txt ; Open new.txt for writing. + if fail exit 1 ; Check for error. + fclose \%c ; Close the file we just opened. + + This creates a 0-length file called new.txt. + + Note that FILE OPEN /WRITE (without /READ or /APPEND) always creates a + new file, and therefore destroys any file with the same name that + might already exist (assuming you have permission to delete it). To + avoid overwriting existing files, simply check first: + + if exist new.txt exit 1 {Fatal - new.txt already exists} + fopen /write \%c new.txt + if fail ... + + The next two commands give information about open files: + + FILE STATUS channel + Tells the name of the file, if any, open on the given channel + and the switches it was opened with. The read/write pointer is + also shown; this is where the next read or write will occur; + "[EOF]" is shown if the current position in the open file is + the end -- i.e. the next read will fail if the file was opened + in /READ mode; the next write will add material to the end. The + current line number (0-based) is also shown if known. The FILE + STATUS command succeeds if the channel is open, and fails if + there is no open file on the given channel, or if the channel + number is invalid or out of range. Synonym: FSTATUS. + + FILE LIST + Lists the channel number and name of each open file, along with + its OPEN modes (R, W, A, B, RW, etc) and its current read/write + pointer or "[EOF]" if it is at the end. Also tells the number + of files currently opened with FILE OPEN, plus the maximum + number of open files allowed by the system and the maximum + number allowed for FILE OPEN. Synonym: FLIST. + + Next come the commands for reading and writing files: + + FILE READ [ switches ] channel [ variable ] + Reads data from the file on the given channel number into the + variable, if one was given; if no variable was given, the + result is printed on the screen. IMPORTANT: The variable should + normally be a macro name rather than a \%x or \&x[] variable if + you want backslash characters in the file to be taken literally + (see pp.408-412 of [378]Using C-Kermit for an explanation; you + can also read into a \%x or \&x[] variable, but then you must + remember to protect future references to by \fcontents() if you + don't want C-Kermit to process any backslashes it might + contain). The desired amount of data (according to the + switches) is read from the file at the current read/write + pointer, and upon completion the read/write position is updated + to first byte after the data that was read, no matter what + switches were given. Synonym: FREAD. + + FILE WRITE [ switches ] channel text + Writes the given text to the file on the given channel number. + The text, of course, can be literal text or a variable, or any + combination. If the text might contain leading or trailing + spaces, it must be enclosed in braces if you want to preserve + them. Synonym: FWRITE. + + Before proceeding, a caution about the NUL character. C-Kermit is so + named because it is a Kermit program written in the C language. In C, + character strings are represented as a sequence of non-NUL bytes + terminated by a NUL byte (a byte in which all bits are 0). Thus a C + string can not contain NUL bytes; it always ends with the first NUL + byte. C-Kermit variables are implemented as C strings and therefore + can't contain NUL bytes either, so the FILE READ and FILE WRITE + commands do not handle files or strings that contain NUL bytes, except + when the /CHARACTER switch is included with the FILE READ or WRITE + command, or when /LPAD:0 or /RPAD:0 is given with the FILE WRITE + command; these switches are explained below. + + Also note that Kermit can not be used read or write binary numbers in + the machine's internal format (integer or floating-point); in general, + numbers can be processed only when represented as numeric or + floating-point strings. + + FILE READ switches are: + + /LINE + Specifies that a line of text is to be read. A line is defined + according to the underlying operating system's text-file + format. For example, in UNIX a line is a sequence of characters + up to and including a linefeed, or the end of the file, which + ever comes first. The line terminator (if any) is removed + before assigning the text to the variable. If no switches are + included with the FILE READ command, /LINE is assumed. Normally + this switch should not be used with files opened in /BINARY + mode (but nothing prevents it either). + + /SIZE:number + Specifies that the given number of bytes (characters) is to be + read. The actual number of bytes returned will be less if the + end of file is reached (or a NUL byte is encountered). For + example, if a file is 514 bytes long, FILE READ /SIZE:512 + returns 512 bytes the first time and 2 bytes the second time. + FILE READ /SIZE provides a kind of "record i/o" for files that + do not necessarily contain lines. The resulting block of + characters is assigned to the variable without any editing. + Synonym: /BLOCK. + + /CHARACTER + Equivalent to /SIZE:1. If FILE READ /CHAR succeeds but the + variable is empty, this indicates a NUL byte was read. Synonym: + BYTE. + + FILE WRITE switches are: + + /LINE + Specifies that an appropriate line terminator is to be added to + the end of the text. If no switches are included, /LINE is + assumed. + + /SIZE:number + Specifies that the given number of bytes (characters) is to be + written. If the given text is longer than the requested size, + it is truncated; if is shorter, it is padded according /LPAD + and /RPAD switches. Synonym: /BLOCK. + + /LPAD[:value] + If /SIZE was given, but the text is shorter than the requested + size, the text is padded on the left with sufficient copies of + the character whose ASCII value is given to write the given + length. If no value is specified, 32 (the code for Space) is + used. The value can also be 0 to write the indicated number of + NUL bytes. If /SIZE was not given, this switch is ignored. + + /RPAD[:value] + Like LPAD, but pads on the right. + + /CHARACTER + Specifies that one character should be written. If the text is + empty or not given, a NUL character is written; otherwise the + first character of text is given. Synonym: /BYTE. + + /STRING + Specifies that the text is to be written as-is, with no + terminator added. + + Here's an example in which we copy a text file line by line: + + file open /read \%c oofa.txt ; Open input file + if fail exit 1 Can't open input file ; Check that it's open + file open /write \%d new.txt ; Open output file + if fail exit 1 Can't open output file ; Check + while true { ; Loop to copy lines + file read /line \%c line ; Read a line + if fail break ; Assume failure = end of file + file write /line \%d {\m(line)} ; Write the line to output file + if fail exit 1 Write failure ; Failure here is fatal + } + file close \%c ; Close the two files + file close \%d + + Note that since /LINE is the default for both FILE READ and FILE + WRITE, it can be omitted as in the following example, where we also + use the short names for the FILE commands. + + fopen /read \%c oofa.txt ; Open input file + if fail exit 1 Can't open input file ; Check that it's open + fopen /write \%d new.txt ; Open output file + if fail exit 1 Can't open output file ; Check + while true { ; Loop to copy lines + fread \%c line ; Read a line + if fail break ; Assume failure = end of file + fwrite \%d {\m(line)} ; Write the line to output file + if fail exit 1 Write failure ; Failure here is fatal + } + fclose \%c ; Close the two files + fclose \%d + + Here's the same example using "record i/o" (the open and close + sequences are are omitted since they are the same as above). The + result is the same, but execution is much faster: + + while true { ; Loop to copy blocks + fread /size:512 \%c block ; Read a block into \%a + if fail break ; Assume failure = end of file + fwrite /string \%d {\m(block)} ; Write the block to output file + if fail exit 1 Write failure ; Failure here is fatal + } + + Although record i/o is faster, it should not be used in line-oriented + applications, since it returns arbitrary chunks of the file to your + script, rather than lines. In this example, FWRITE /STRING is used + rather than FWRITE /SIZE:512 to avoid the last output block being + padded beyond the original file's length. + + A file can also be copied character by character, but this is much + slower than line i/o and VERY much slower than block i/o: + + while true { ; Loop to copy blocks + fread /char \%c c ; Read a character into c + if fail break ; Assume failure = end of file + fwrite /char \%d {\m(c)} ; Write character to output file + if fail exit 1 Write failure ; Failure is fatal + } + + Although character i/o is slow, it is the only way to process files + that contain NUL characters (i.e. bytes composed of only zero bits). + In the example above, when "fread /char \%c c" returns a NUL, the c + variable is empty. But since the FREAD /CHAR command did not fail, we + know the result was really a NUL. FWRITE /CHAR, when given an empty + variable (or no variable at all) writes a NUL. Thus the loop above + will copy any file at all (very slowly). In non-copying applications, + NULs are detected like this: + + fread /char \%c c + if fail (do something) + if not def c (a NUL byte was read) + + Finally some advanced file operations: + + FILE FLUSH channel + For output files only: commits all previous writes to disk, in + case the computer was buffering them. Synonym: FFLUSH. + + FILE COUNT [ { /BYTES, /LINES, /LIST, /NOLIST } ] channel + By default, or if the /BYTES switch is given, counts the bytes + in the file, if any, open on the given channel. If the /LINES + switch is given, counts lines in the file. If the /LIST switch + is given, the result is printed. If the /NOLIST switch is + given, the result is not printed. /QUIET is a synonym for + /NOLIST. If neither /LIST nor /NOLIST is given, the result is + printed if the command is given at top level, i.e. not from a + command file or macro. In all cases, the result of the most + recent FILE COUNT command is stored in the variable + \v(f_count). Note that FILE COUNT /LINE works (and can only + work) by reading the entire file; expect it to take some time + if the file is large. Synonym: FCOUNT. + + FILE REWIND channel + Moves the read/write pointer to the beginning of the file. + Equivalent to FILE SEEK channel 0. Synonym: FREWIND. + + FILE SEEK [ switches ] channel { [{+,-}]number, LAST, EOF } + Moves the read/write pointer for the file on this channel to + the given position, which may be a byte (character) number or a + line number, expressed in either absolute or relative terms. + Switches: + + /BYTE + The number given is a byte number. Synonym: /CHARACTER. + + /LINE + The number given is a line number. + + /ABSOLUTE + The number given is absolute. + + /RELATIVE + The number given is relative to the current position. + + By default, or if the /BYTE switch is given, the number is a + byte number (0 = first byte). If /LINE is given, the number is + a line number (0 = first line). EOF means to move to the end of + the file. LAST means to move to the last line or character of + the file, depending on whether it's a line or character seek. + + If neither the /RELATIVE nor the /ABSOLUTE switch is given, + then if a signed number is given, the motion is relative to the + current position. An expression that evaluates to a negative + number is not considered signed for this purpose; that is, a + sign (+ or -) must be included as the first character of the + number in the command itself to force a relative seek (in the + absence of /RELATIVE or /ABSOLUTE). + + If the number has no sign, or if the /ABSOLUTE switch is given, + the number represents an absolute position (relative to the + beginning of the file). Subsequent FILE READs or WRITEs will + take place at the new position. + + If the read/write pointer is placed after the end of the file, + a subsequent FILE READ will fail, but a FILE WRITE will succeed + (possibly creating a file with "holes"). If a FILE SEEK /BYTE + command is given, the current line becomes unknown (unless the + position is 0) and subsequent FILE SEEK /RELATIVE /LINE + commands will fail until the next non-relative FILE SEEK /LINE + command is given. Synonym: FSEEK. + + An absolute FILE SEEK to a negative position fails silently, as does a + relative seek to a position before the beginning of the file. + + A caution about relative SEEKs: remember that the number is relative + to the current position. Whenever you read or write, this changes the + position. In each of the following examples, assume the file open on + channel \%c is positioned at line n (the FREAD target variable is + omitted for lack of space): + + { FREAD \%c, FSEEK /LINE \%c -1, FREAD \%c } <-- Reads line n twice + { FREAD \%c, FSEEK /LINE \%c +0, FREAD \%c } <-- Reads lines n and n+1 + { FREAD \%c, FSEEK /LINE \%c +1, FREAD \%c } <-- Reads lines n and n+2 + { FREAD \%c, FSEEK /LINE \%c -2, FREAD \%c } <-- Reads lines n and n-1 + { FREAD \%c, FSEEK /LINE \%c -3, FREAD \%c } <-- Reads lines n and n-2 + + Another caution: Using FSEEK and FREAD /SIZE to repeatedly read the + same disk block (e.g. when sampling a database record that is + frequently updated) might not give you updated disk blocks due to the + internal buffering and caching of the C library (this probably varies + from one platform/compiler combination to another). If necessary you + can force a fresh disk read with a close/open sequence: + + FCLOS \%c + FOPEN \%c samefilename + FSEEK \%c samespot + FREAD /SIZE:howmanybytes \%c variable + _________________________________________________________________ + + 1.22.3. FILE Command Examples + + To read the last 10 lines of a text file into an array: + + fopen /read \%c oofa.txt ; Open the file + if fail exit 1 Can't open oofa.txt ; Always check for failure + dcl \&a[10] ; Declare a 10-element array + fcount /line \%c ; Count lines in the file + fseek /line \%c \v(f_count)-10 ; Seek to 10 lines from the end + if fail exit 1 Can't seek ; Check for failure + for \%i 1 10 1 { fread \%c \&a[\%i] } ; Read the last 10 lines + fclose \%c ; Close the file + + Note that blank lines show up as empty (undefined) array elements, for + example if you give a "show array a" command at this point. This is + normal. You can still use these elements; e.g.: + + for \%i 1 10 1 { echo \%i. \&a[\%i] } ; Display the 10 lines + + Here is how to read the last line of a file (already open on channel + \%c): + + fseek /line \%c last ; Seek directly to last line + + Alternatively: + + fseek /line \%c eof ; Seek to end of file + fseek /line \%c -1 ; Seek to beginning of last line + + Alternatively: + + fcount /line \%c ; Count the file's lines + fseek /line \%c \v(f_count)-1 ; Seek to last line + fread \%c ; Read it + + To read every other line from the file (using relative SEEK), skipping + the first line: + + fopen /read \%c oofa.txt ; Open the file + while ( success ) { ; Loop through lines + fseek /line \%c +1 ; Skip a line + if success fread \%c ; Read & display a line + } + fclose \%c ; Close the file + + Here is how to read the lines of a file in reverse order: + + fopen /read \%c oofa.txt ; Open + if fail exit 1 ; Check + fseek /line \%c last ; Seek to last line + while success { ; Loop + fread \%c ; Read line + fseek /line \%c -2 ; Seek backwards two lines + } + fclose \%c ; Close the file + + The loop works because a relative SEEK outside the file fails. + + It is also possible to use block i/o to manage random-access files + with fixed-length records (as long as they don't contain NUL + characters). Suppose, for example, you have a file of "card image" + records with fixed-field information about customers, such as: + + Name: Columns 1-32 (column numbers are 1-based) + Address: Columns 33-72 + Balance: Columns 73-80 + + The records are indexed by customer number, starting with 0. There are + no line terminators separating them. Therefore the record for customer + number n starts at position nx 80 (\%n*80). + + Now suppose we received a payment from customer number 173 and want to + update the balance: + + .\%n = 173 ; Customer (record) number + .\%a = 12.72 ; Amount + fopen /read /write \%c customer.db ; Open the file + if fail stop 1 OPEN FAILED: \f_errmsg() ; Check + fseek /byte \%c 80*\%n ; Seek to record + fread /size:80 \%c r ; Read the record + if fail stop 1 READ FAILED: \f_errmsg() ; Check (IMPORTANT) + .\%b := \fright(\m(r),8) ; Extract the balance + .\%b := \ffpadd(\%b,\%a,2) ; Add the new payment + if fail stop 1 ARITHMETIC ERROR: \%b/\%a ; Catch bad records + .r := {\fleft(\m(r),72)\flpad(\%b,8)} ; Update the record + fseek /byte \%c 80*\%n ; Reposition to same spot + fwrite /size:80 \%c {\m(r)} ; Replace the record + if fail stop 1 WRITE FAILED: \f_errmsg() ; Check + fclose \%c ; Close the file + + REMEMBER: Using FILE SEEK to move beyond the end of file can result in + a file with holes when writing; when reading, an end-of-file error + will occur -- be sure to check for it. + _________________________________________________________________ + + 1.22.4. Channel Numbers + + C-Kermit's channel numbers are integers from 0 to some + platform-dependent limit, such as 46 or 1985 (the value of \v(f_max)). + This is the limit placed by the operating system on the number of + files that may be opened by one process or user or job, minus the + standard input, output, and error files, and minus the number of files + reserved by C-Kermit for logs, OPEN READ and WRITE, and file transfer + (and maybe some command files -- the \v(f_max) number can't be exact). + + Although you must include a variable in the FILE OPEN command, to + which the channel number is assigned, you don't have to use a variable + in the other FILE commands if you know what the number is -- you can + just put the number. This saves you a few keystrokes when typing + commands at the prompt: + + fopen \%c oofa.txt + flist + 0. /usr/olga.oofa.txt (R) 0 + + This tells the channel number is 0 (the number on the left is the + channel file's channel number). Of course you can also find it by + echoing the variable: + + echo \%c + 0 + + Or with "fstatus \%c". Now you can type commands like: + + fread 0 + + to read a line from the file. Obviously, however, using digits rather + than a variable for the channel number would be poor practice in a + script. + + If in commands like: + + fread \%c \%a + + you have trouble remembering which variable is which, note that the + channel number is, indeed, a number. Anywhere C-Kermit accepts a + number it can also accept an expression, so you can put parentheses + around the channel number to remind you it's the channel number and + not the variable into which data is to be read: + + fread (\%c) \%a + + Normally channel numbers are assigned sequentially as 0, 1, 2, ... up + to the limit. However, once you start closing files, there can be + holes in the sequence. New channels are assigned to fill in the holes. + Thus you can't depend on channel numbers being in any particular + sequence. + _________________________________________________________________ + + 1.22.5. FILE Command Errors + + Each FILE command sets the variable \v(f_error) to one of the + following values: + + 0 = No error + -1 = System error + -2 = Attempt to read after end of file + -3 = Channel not open + -4 = Channel number out of range (negative or too large) + -5 = Numeric argument (size, ...) out of range + -6 = File not found + -7 = Bad or missing filename + -8 = Too many files are already open (FILE OPEN only) + -9 = Forbidden operation (e.g. write to a read-only file) + -10 = Access denied + -11 = Illegal combination of OPEN modes (FILE OPEN only) + -12 = Buffer overflow + -13 = Current line number unknown (for relative line seeks) + -14 through -98: Reserved. + -99 = Requested operation not implemented in this version of C-Kermit + -999 = Unknown error + + When \v(f_error) is -1, this means the FILE command failed because + because of a system error, in which case you can examine the following + variables: + + \v(errno) = System error number. + \v(errstring) = Error message corresponding to \v(errno). + + A special function is available for translating the \v(f_error) code + to an error message string: + +\f_errmsg([code]) + If the code is -1, returns error message of the most recent system + error; otherwise if the code is a valid \v(f_error) value, the associated + message is returned. If the code is omitted, the status message + corresponding to the current \v(f_error) value is returned. + + A FILE command that fails prints the appropriate error message + automatically, except when the command is READ or SEEK and the error + is -2 (end of file); in that case, the command still fails, but does + not print a message. This allows constructions such as: + + fopen \%c oofa.txt + while success { fread \%c } + fclose \%c + + to work as expected, i.e. without an annoying message when the end of + file is reached. + _________________________________________________________________ + + 1.22.6. File I/O Variables + + The variables associated with the file i/o package are: + + \v(f_count) + Result of the most recent FILE COUNT (FCOUNT) command. + + \v(f_error) + Numeric error code of most recent FILE command (0 = no error). + + \v(f_max) + Maximum number of files open simultaneously. + _________________________________________________________________ + + 1.22.7. File I/O Functions + + Some of the FILE commands can also be issued as function calls, which + makes script writing a bit more convenient, especially for C + programmers. Also, several functions are provided that do not have + command equivalents. Each of these functions takes a channel number as + the first argument. These functions do not work for OPEN { READ, + !READ, WRITE, !WRITE, and APPEND } files. + + \f_status(channel) + Returns 0 if the channel is not open, otherwise a number + between 1 and 15 which is the sum of the OPEN modes: + + 1 = /READ + 2 = /WRITE + 4 = /APPEND + 8 = /BINARY + + The remaining functions work only for open channels. Each of these + functions can fail for the applicable reasons listed in [379]Section + 1.22.5. For instructions on handling function errors, see [380]Section + 7.12. + + \f_pos(channel) + Returns the file's current read/write pointer (0-based). There + is no FILE command equivalent. + + \f_line(channel) + Returns the file's current line number (0-based), if known, + otherwise -1. There is no FILE command equivalent. The line + number is known as long as no character or block i/o has been + done on the channel. + + \f_handle(channel) + Returns the "file handle" of the file. That is, it translates + the portable C-Kermit channel number into a system-specific + file handle or number that can be passed to other programs on + the same platform. In UNIX this is a file descriptor. There is + no FILE command equivalent. + + \f_eof(channel) + Returns 1 if the read/write pointer of the file on the given + channel is at the end of the file, 0 otherwise. Convenient in + WHILE statements, e.g.: + + while not \f_eof(\%c) { fread \%c } + + \f_getchar(channel) + Equivalent to FREAD /CHAR. Returns the character actually read. + If \f_getchar() does not fail but the return value is empty, + this means a NULL character was read. + + \f_getline(channel) + Equivalent to FREAD /LINE. Returns the line actually read, but + with the line terminator stripped. If \f_getline() does not + fail but the return value is empty, this normally means an + empty line was read. + + \f_getblock(channel,n) + Equivalent to FREAD /SIZE:n. Returns the block of characters + actually read. If the returned block is smaller than n, it + indicates either that the end of file was reached or a NUL + character is in the block. + + \f_putchar(channel,c) + Equivalent to FWRITE /CHARACTER. Writes the character c. If c + contains more than one character, only the first is written. If + c is empty a NUL is written. Returns the number of characters + written on success, or a negative error code upon failure. + + \f_putline(channel,string) + Equivalent to FWRITE /LINE. Writes the string and adds the + appropriate line termination character or sequence. If the + string is empty or omitted, an empty line is written. Returns + the number of characters written on success, or a negative + error code upon failure. + + \f_putblock(channel,string) + Equivalent to FWRITE /STRING. Writes the string as given. If + the string is empty or omitted, nothing is written. Returns the + number of characters written on success, or a negative error + code upon failure. + _________________________________________________________________ + + 1.22.8. File I/O Function Examples + + fopen /read \%c oofa.txt ; Open our favorite file for reading + if failure exit 1 ; Check that it's open + while not \f_eof(\%c) { ; Loop until EOF + .line := \f_getline(\%c) ; Get a line + if success echo {\m(line)} ; Echo it + } + if not \f_eof(\%c) { ; Check reason for loop exit + exit 1 File Error: \f_errmsg() ; If not EOF say so. + } + + frewind \%c ; Rewind the file + while not \f_eof(\%c) { ; Same thing but with block i/o + .block := \f_getblock(\%c,256) ; (much faster than line i/o) + if success xecho {\m(block)} + } + + frewind \%c ; Rewind again + while not \f_eof(\%c) { ; Same deal but with character i/o + .c := \f_getchar(\%c) ; (much slower than line i/o) + if success xecho {\m(c)} + } + close \%c + + To close all open files (equivalent to FCLOSE ALL): + + for \%i 0 \v(f_max)-1 1 { + if \f_status(\%i) fclose \%i + } + _________________________________________________________________ + + 1.23. The EXEC Command + + The EXEC command is available only in UNIX. + + EXEC [ /REDIRECT ] command [ arg1 [ arg2 [ ... ] ] + Runs the given command with the arguments in such a way that + the command replaces C-Kermit in memory, and C-Kermit ceases to + execute. EXEC is like RUN, except instead of returning to + C-Kermit when finished, the command returns to whatever process + invoked Kermit. + + In the normal case, no files are closed, so the EXEC'd command + inherits the open files, read/write pointers, working directory, + process ID, user ID (unless command is SUID), group ID (unless command + is SGID), groups, etc. (In UNIX, the EXEC command is simply a front + end for execvp().) + + If the /REDIRECT switch is included, then if a connection is open (SET + LINE or SET HOST), it becomes the standard input and output of the + EXEC'd program. If no connection is open, the /REDIRECT switch has no + effect. For example to use C-Kermit for PPP dialing in Linux: + + set modem type usr ; Specify the kind of modem you have + set line /dev/ttyS1 ; Specify the device it's connected to + set speed 57600 ; and the speed + set flow rts/cts ; and flow control. + set dial retries 100 ; Try the dial sequence up to 100 times. + dial {{9-212-555-1212}{9-212-555-1213}{9-212-555-1214}{9-212-555-1215}} + if fail exit 1 + for \%i 1 16 1 { ; Try up to 16 times to get login prompt + input 10 Login: ; Wait 10 sec for it to appear + if success break ; Got it - proceed... + output \13 ; Send a carriage return and try again + } + if ( > \%i 16 ) stop 1 NO LOGIN PROMPT + lineout \(myuserid) ; Send user ID + input 30 assword: ; Wait for Password prompt + if fail stop 1 NO PASSWORD PROMPT + lineout \m(mypassword) ; Send the password. + exec /redirect pppd ; Replace ourselves with pppd. + + In this example we assume that the script has already set up the + myuserid and mypassword variables -- normally the password should be + prompted for, rather than stored on disk. Notice the advantages over + the well-known "chat script": + * You don't have to control the modem itself with AT commands; + Kermit's DIAL command does this for you. + * You can have Kermit automatically redial as many times as you want + until it gets a connection (if this is legal in your country). + * You can have Kermit fetch the number or numbers from a dialing + directory. + * You can have Kermit cycle through a list of phone numbers (this is + new in C-Kermit 7.0; see [381]Section 2.1.16) without having to + enter the numbers in a dialing directory. + * Dialing is location-independent; you can use the same script to + dial from different areas or countries. + * Once the connection is made, the full power of Kermit's script + language is available to manage the dialog with the terminal + server or other device that answers the phone call. + + NOTE: PPP and SLIP dialing are not available in Windows 95/98/NT/2000, + whose APIs do not provide a method for an application to hand over a + connection to the PPP or SLIP driver. + _________________________________________________________________ + + 1.24. Getting Keyword Lists with '?' + + Suppose you type "te" at the C-Kermit> 6.0 prompt and then Esc or Tab + to request keyword completion. Kermit beeps, indicating that more than + one command starts with "te". But if you type '?' to see what they + are, Kermit shows only "telnet". So why the beep? Because of invisible + keywords like "telopt", "terminal", and "text". Lots of keywords are + invisible because they are either synonyms for other keywords or else + esoteric options to be used only in special circumstances, so we don't + want them cluttering up the menus. + + But then there is no way for you to discover them. So in C-Kermit 7.0, + if you type '?' AFTER the beginning of a keyword field, then invisible + keywords are shown too: + + C-Kermit> te + C-Kermit> te? Command, one of the following: + telnet telopt terminal text + C-Kermit>te + + But if '?' is typed at the beginning of a field, only visible keywords + are shown, as before (so, in this example, if '?' is typed at the + C-Kermit> prompt, "telnet" is the only command shown that starts with + "te"). + _________________________________________________________________ + + 2. MAKING AND USING CONNECTIONS The SET LINE, SET HOST, and SET PORT (a + synonym for SET LINE) commands have new synonyms, in which the word SET is + replaced by the word OPEN: OPEN LINE, etc. There is no new functionality + here, but OPEN is a better verb, since SET generally takes no action, whereas + these commands actually try to open a connection. Furthermore, there is the + symmetry with CLOSE. + ________________________________________________________________________ + + 2.0. SET LINE and SET HOST Command SwitchesThe SET LINE (SET PORT) and SET + HOST commands now allow switches before the device or host name, in most + cases, and under certain circumstances, also at the end. The new syntax is + backwards compatible with the previous syntax; thus SET LINE, SET PORT, and + SET HOST commands in command files written for C-Kermit 6.0 or earlier still + work. The expanded syntax is: + + { OPEN, SET } { LINE, PORT, HOST } [ switches ] device-or-address [ switches + ] + + The first group of switches is: + + /NETWORK-TYPE:{TCP/IP,X.25,PIPE,PTY...} + When more than one network type is available, this lets you + specify the type of network to use for this connection without + affecting your global SET NETWORK TYPE. See [382]Section 2.7 + about pipes and ptys. + + /USERID:[string] + This switch is equivalent to SET LOGIN USERID. If a string is + given, it sent to host during Telnet negotiations; if this + switch is given but the string is omitted, no user ID is sent + to the host. If this switch is not given, your current LOGIN + USERID (\v(userid) value), if any, is sent. Unlike most other + switches, this one is "sticky", since the value must persist + throughout the session in case the server requests the ID + string at a later time. + + /CONNECT + Enter CONNECT mode immediately and automatically after the + device or connection is open. On serial devices, however, when + CARRIER-WATCH is not OFF, wait up to 1 second for the Carrier + Detect signal to appear before trying to connect, to give the + device time to react DTR, which might have been off prior to + opening the device. + + /SERVER + Enter server mode immediately and automatically after the + device or connection is open. Treatment of carrier is the same + as for /CONNECT. + + /WAIT + /NOWAIT + For Telnet connections only: Like SET TELNET WAIT { ON, OFF }, + but applies only to this connection, and in fact applies only + when OPENing this connection (which is usually the only place + it matters). Typically you would use TELNET /NOWAIT to make a + connection to a misbehaving Telnet server that does not reply + to negotiations as required by the Telnet protocol definition. + + Note: /CONNECT and /SERVER switches are not available in the RLOGIN + and TELNET commands, since these commands already include an implicit + /CONNECT and preclude automatic entry into server mode. + + The /CONNECT and /SERVER switches are especially useful with "set host + *" connections. For example, suppose you want to start a Kermit server + on socket 3000 of your TCP host. Normally you would have to give the + command: + + set host * 3000 + + and then wait for a connection to come in, and only then could you + give the SERVER command (or else define a macro to do this, and then + execute the macro). Now you can do it in one step: + + set host /server * 3000 + + This tells C-Kermit to wait for the connection and then enter server + mode once it comes in, no matter how long it takes. Similarly, "set + host /conn *" can be used to wait for a "chat" connection to come in. + + Another set of switches is available in VMS only, for use only with + SET LINE: + + /SHARE + Allows the SET LINE device to be opened in shared mode. + Normally it makes no sense to open a serial device in shared + mode, but it's necessary when C-Kermit is running in an + environment such as DECIntact, that opens your job's + controlling terminal in such a way that C-Kermit can't open it + too, unless it enables SHARE privilege. Note: SHARE privilege + is required. + + /NOSHARE + Requires that the SET LINE device not be in use by any other + process in order for it to be successfully opened by C-Kermit. + If neither /SHARE nor /NOSHARE is specified, /NOSHARE is used. + + The second group of switches is: + + /NO-TELNET-INIT + Do not send initial Telnet negotiations even if this is a + Telnet port. + + /RAW-SOCKET + This is a connection to a raw TCP socket ([383]Section 2.3.5). + + /RLOGIN + Use Rlogin protocol even if this is not an Rlogin port. + + /TELNET + Send initial Telnet negotiations even if this is not a Telnet + port. + + As of C-Kermit 7.0 and K95 1.1.19, the TELNET command includes an + implicit /TELNET switch. So if you TELNET to a non-TELNET port, Kermit + sends initial Telnet negotiations. This makes sense, since that's what + "telnet" means. + + If you want to make a connection to a non-Telnet port without sending + initial Telnet negotiations, use: + + set host [ /connect ] name-or-address port + + or: + + telnet name-or-address port /no-telnet-init + + Additional switches might be added in the future; type "set host ?" or + "set line ?" to see a current list. + _________________________________________________________________ + + 2.1. Dialing + + Automatic redialing is illegal or restricted in many countries, so + until C-Kermit 7.0, it was disabled by default, i.e. until a SET DIAL + RETRIES command was given. In C-Kermit 7.0, if no SET DIAL RETRIES + command has been given, a default is picked dynamically at DIAL time + based on the calling country code, if known. At this writing, the only + country code known to have no restrictions on automatic redialing is + 1. So in this case a limit of 10 is chosen; otherwise 1. If you have + not given an explicit SET DIAL RETRIES command, SHOW DIAL shows the + value as "(auto)", and then the value actually used is shown when you + give the DIAL command. + + As of C-Kermit 7.0, automatic redialing is automatically canceled if + the call could not be placed because no dialtone was detected. + _________________________________________________________________ + + 2.1.1. The Dial Result Message + + If DIAL DISPLAY is not ON, the "Call complete" message now shows the + modem's call result message, for example: + + Dialing: ... + Call complete: "CONNECT 31200/ARQ/V32/LAPM/V42BIS" + + The exact format and contents of this message, of course, depends on + the make, model, and configuration of your modem, so use your modem + manual to interpret it. The call result message is also available in + C-Kermit's \v(dialresult) variable. + + C-Kermit> echo \v(dialresult) + CONNECT 31200/ARQ/V32/LAPM/V42BIS + C-Kermit> echo Speed = \fword(\v(dialresult),2) + Speed = 31200 + C-Kermit> + + Suppose your modem reports the modulation speed as shown above and you + want to ensure your call is completed at (say) 24000 bps or more. You + can use a little macro to do the job: + +define HSDIAL { ; High Speed DIAL + local \%s + if < \v(argc) 1 if not def \v(dialnumber) end 1 Usage: \%0 number + set dial retries 100 + set dial interval 1 + while true { + dial \%* + if fail end 1 DIAL failed. + asg \%s \fword(\v(dialresult),2) + if def \%s if numeric \%s if not < \%s 24000 break + } +} + + (See [384]Section 7.5 about the \%* variable.) + _________________________________________________________________ + + 2.1.2. Long-Distance Dialing Changes + + Due to the glut of cell phones, pagers, fax machines, ISPs, etc, area + codes and dialing rules are changing all the time. In the North + American Numbering Plan (NANP) countries (USA, Canada, etc), area + codes are split or overlayed with increasing frequency, and 10- and + 11-digit dialing is gradually becoming the norm for local calls. + Changes are occurring In Europe, too, partly for these reasons and + partly because of some new EC rules. + + In France, effective 18 October 1996, all calls, even local ones, must + be dialed with an area code. French area codes are presently 1-digit + numbers, 1-6, and the long-distance dialing prefix is 0. All calls + within France are considered long distance and begin with 01, 02, ..., + 06. + + Effective 1 May 1997, all calls within the US state of Maryland, even + local ones, must be dialed with an area code but without the + long-distance prefix -- this is the now widely-known North American + phenomenon of "ten digit dialing". The same is happening elsewhere -- + many cities in Florida adopted 10-digit dialing in 1998. + + In Italy beginning 19 June 1998, all calls to fixed (as opposed to + mobile) numbers must be prefixed by 0. When calling into Italy from + outside, the 0 must follow the country code (39). Calls to cell + phones, however, must be placed without the 0. Then on 29 December + 2000, the 0 will become a 4 (for calling fixed numbers) and a prefix + of 3 must used for calling mobile phones. More info at: + http://www.telecomitalia.it/npnn/. + + In Spain, effective 4 April 1998, with hard cutover on 18 July 1998, + all calls within the country must be dialed with 9 digits, and all + calls from outside Spain must also be dialed with 9 digits (after the + country code, 34). The new 9-digit numbers all begin with "9". More + info at: [385]http://www.telefonica.es/cambiodenumeracion/ + + Several new dialing features and commands have been added in version + 6.1 and 7.0 to address these changes. + + C-Kermit 6.0 and Kermit 95 1.1.11 and earlier handle the French + situation via a reasonable subterfuge (setting the local area code to + a nonexistent one), but did not handle "ten-digit dialing" well at + all; the recommended technique was to change the long-distance dialing + prefix to nothing, but this defeated Kermit's "list numbers for one + name" feature when the numbers were in different locations. For + example: + + set dial ld-prefix + dial onlineservice + + where "onlineservice" is a dialing directory entry name corresponding + to entries that are in (say) Maryland as well as other states, would + not correctly dial the numbers not in Maryland. + + A new command lets you specify a list of area codes to be considered + local, except that the area code must be dialed: + + SET DIAL LC-AREA-CODES [ areacode [ areacode [ areacode [ ... ] ] ] ] + The list may include up to 32 area codes. If a number is called + whose area code is in this list, it is dialed WITHOUT the + long-distance prefix, but WITH the area code. + + So in Maryland, which (last time we looked) has two area codes, 410 + and 301, the setup would be: + + SET DIAL LC-AREA-CODES 410 301 + + Example: + + SET DIAL LD-PREFIX 1 + SET DIAL AREA-CODE 301 + SET DIAL LC-AREA-CODES 410 301 <-- Area codes in 10-digit dialing region + DIAL +1 (301) 765-4321 <-- Dials 3017654321 (local with area code) + DIAL +1 (410) 765-4321 <-- Dials 4107654321 (local with area code) + DIAL +1 (212) 765-4321 <-- Dials 12127654321 (long distance) + + The SET DIAL LC-AREA-CODES command does not replace the SET DIAL + AREA-CODE command. The latter specifies the area code you are dialing + from. If the called number is in the same area code, then the area + code is dialed if it is also in the LC-AREA-CODES list, and it is not + dialed otherwise. So if "301" had not appeared in the LC-AREA-CODES + list in the previous example: + + SET DIAL LD-PREFIX 1 + SET DIAL AREA-CODE 301 + SET DIAL LC-AREA-CODES 410 <-- Area codes in 10-digit dialing region + DIAL +1 (301) 765-4321 <-- Dials 7654321 (local) + DIAL +1 (410) 765-4321 <-- Dials 4107654321 (local with area code) + DIAL +1 (212) 765-4321 <-- Dials 12127654321 (long distance) + + The new Kermit versions also add a Local Call Prefix and Local Call + Suffix, in case you have any need for it. These are added to the + beginning and of local phone numbers (i.e. numbers that are not + long-distance or international). Examples: + + SET DIAL LD-PREFIX 1 + SET DIAL LC-PREFIX 9 + SET DIAL LC-SUFFIX * + SET DIAL LC-AREA-CODES 410 <-- Area codes in 10-digit dialing region + SET DIAL AREA-CODE 301 + DIAL +1 (301) 765-4321 <-- Dials 97654321* (local) + DIAL +1 (410) 765-4321 <-- Dials 94107654321* (local with area code) + DIAL +1 (212) 765-4321 <-- Dials 12127654321 (long distance) + _________________________________________________________________ + + 2.1.3. Forcing Long-Distance Dialing + + Suppose a number is in your country and area, but for some reason you + need to dial it long-distance anyway (as is always the case in + France). There have always been various ways to handle this: + + 1. Temporarily set your area code to a different (or nonexistent or + impossible) one (but this required knowledge of which area codes + were nonexistent or impossible in each country). + 2. Dial the number literally instead of using the portable format, + but this defeats the purpose of the portable dialing directory. + + Now there is also a new command that, very simply, can force + long-distance dialing: + + SET DIAL FORCE-LONG-DISTANCE { ON, OFF } + If a call is placed to a portable phone number within the same + country code as the calling number, it is dialed with the + long-distance prefix and the area code if FORCE-LONG-DISTANCE + is ON. If OFF, the regular rules and procedures apply. + + Example (France): + + SET DIAL COUNTRY-CODE 33 + SET DIAL AREA-CODE 6 + SET DIAL FORCE-LONG-DISTANCE ON + + (In fact, SET DIAL COUNTRY-CODE 33 automatically sets DIAL + FORCE-LONG-DISTANCE ON...) + + Example (USA, for a certain type of reverse-charge calling in which + the called number must always be fully specified): + + SET DIAL PREFIX 18002666328$ ; 1-800-COLLECT + SET DIAL COUNTRY-CODE 1 + SET DIAL AREA-CODE 212 + SET DIAL FORCE-LONG-DISTANCE ON + + Example (Toronto, where calls to exchange 976 within area code 416 + must be dialed as long distance, even when you are dialing from area + code 416): + + SET DIAL COUNTRY-CODE 1 + SET DIAL AREA-CODE 416 + SET DIAL FORCE-LONG-DISTANCE ON + DIAL +1 (416) 976-xxxx + + If dialing methods were consistent and sensible, of course it would be + possible to always dial every domestic call as if it were long + distance. But in many locations this doesn't work or if it does, it + costs extra. The following macro can be used for dialing any given + number with forced long-distance format: + + define LDIAL { + local \%x + set dial force-long-distance on + dial \%* + asg \%x \v(success) + set dial force-long-distance off + end \%x + } + + (See [386]Section 7.5 about the \%* variable.) + _________________________________________________________________ + + 2.1.4. Exchange-Specific Dialing Decisions + + This applies mainly to the North American Numbering Plan (NANP). Refer + to the section "Alternative notations" in [387]Using C-Kermit 2nd + Edition, pages 106-107, and the story about Toronto on page 110. Using + the new LC-AREA-CODES list, we can address the problem by treating the + exchange as part of the area code: + + SET DIAL LD-PREFIX 1 + SET DIAL AREA-CODE 416 + SET DIAL LC-AREA-CODES 905276 + DIAL +1 416 765 4321 <-- 7654321 (local) + DIAL +1 905 276 4321 <-- 9052764321 (local with area code) + DIAL +1 905 528 4321 <-- 19055284321 (long distance) + + The same technique can be used in Massachusetts (story at top of page + 111) and in any other place where dialing to some exchanges within a + particular area code is local, but to others in the same area code is + long distance. + _________________________________________________________________ + + 2.1.5. Cautions about Cheapest-First Dialing + + Kermit does not maintain a knowledge base of telephony information; it + only provides the tools to let you enter a phone number in a standard + format and dial it correctly from any location in most cases. + + In particular, Kermit does not differentiate the charging method from + the dialing method. If a call that is DIALED as long-distance (e.g. + from 212 to 718 in country code 1) is not CHARGED as long distance, we + have no way of knowing that without keeping a matrix of charging + information for every area-code combination within every country, and + any such matrix would be obsolete five minutes after it was + constructed. Thus, "cheapest-first" sorting is only as reliable as our + assumption that the charging method follows the dialing method. A good + illustration would be certain online services that have toll-free + dialup numbers which they charge you a premium (in your online service + bill) for using. + _________________________________________________________________ + + 2.1.6. Blind Dialing (Dialing with No Dialtone) + + C-Kermit's init string for Hayes-like modems generally includes an X4 + command to enable as many result codes as possible, so that Kermit can + react appropriately to different failure reasons. One of the result + codes that X4 enables is "NO DIALTONE". A perhaps not obvious side + effect of enabling this result code that the modem must hear dialtone + before it will dial. + + It is becoming increasingly necessary to force a modem to dial even + though it does not hear a dialtone on the phone line; for example, + with PBXs that have strange dialtones, or with phone systems in + different countries, or with ISDN phones, etc. This is called "blind + dialing". + + C-Kermit 7.0 has two new commands to cope with this situation: + + SET DIAL IGNORE-DIALTONE { ON, OFF } + OFF (the default) means to tell the modem to wait for dialtone + before dialing. ON means to enable "blind dialing", i.e. tell + the modem NOT to wait for dialtone before dialing. Generally + this is accomplished by sending ATX3 to the modem just prior to + dialing. SET MODEM TYPE xxx and then SHOW MODEM displays + Kermit's built-in "ignore dialtone" command. + + SET DIAL COMMAND IGNORE-DIALTONE text + This lets you change the built-in ignore-dialtone command (such + as ATX3) to whatever you choose, in case the built-in one does + not work, or another command works better. + + Notes: + 1. The ignore-dialtone command is not sent unless SET DIAL + IGNORE-DIALTONE is ON. + 2. The ATX3 command generally disables not only NO DIALTONE, but also + BUSY. So this will prevent Kermit from detecting when the line is + busy. This is a property of the modem, not of Kermit. + _________________________________________________________________ + + 2.1.7. Trimming the Dialing Dialog + + The command: + + SET MODEM COMMAND action [ command ] + + is used to override Kermit's built-in modem commands for each action, + for each kind of modem in its internal database. If you include a + command, this is used instead of the built-in one. If you omit the + command, this restores the original built-in command. + + If you want to omit the command altogether, so Kermit doesn't send the + command at all, or wait for a response, use: + + SET MODEM COMMAND action {} + + That is, specify a pair of empty braces as the command, for example: + + SET MODEM COMMAND ERROR-CORRECTION ON {} + _________________________________________________________________ + + 2.1.8. Controlling the Dialing Speed + + The rate at which characters are sent to the modem during dialing is + normally controlled by the built-in modem database. You might want to + override this if Kermit seems to be dialing too slowly, or it is + sending characters to the modem faster than the modem handle them. A + new command was added for this in C-Kermit 7.0: + + SET DIAL PACING number + Specifies the number of milliseconds (thousandths of seconds) + to pause between each character when sending commands to the + modem during DIAL or ANSWER command execution. 0 means no pause + at all, -1 (the default) or any other negative number means to + use the value from the database. Any number greater than 0 is + the number of milliseconds to pause. + + HINT: You might also need to control the rate at which the modem + generates Touch Tones during dialing, for example when sending a + numeric page. There are two ways to do this. One way is to insert + pause characters into the dialing string. For modems that use the AT + command set, the pause character is comma (,) and causes a 2-second + pause. On most modems, you can use the S8 register to change the pause + interval caused by comma in the dialing string. The other way is to + set your modem's tone generation interval, if it has a command for + that. Most AT-command-set modems use S11 for this; the value is in + milliseconds. For example on USR modems: + + ATS11=200 + + selects an interval of 200 milliseconds to separate each dialing tone. + + Hint: To add S-Register settings or other commands to your dialing + procedure, use the new SET MODEM COMMAND PREDIAL-INIT command + ([388]Section 2.2.2). + _________________________________________________________________ + + 2.1.9. Pretesting Phone Number Conversions + + The LOOKUP command now accepts telephone numbers as well as + directory-entry names, for example: + + LOOKUP +1 (212) 7654321 + + When given a phone number, LOOKUP prints the result of converting the + phone number for dialing under the current dialing rules. For example, + if my country code is 1 and my area code is 212, and I am dialing out + from a PBX whose outside-line prefix is "93,": + + C-Kermit> lookup +1 (212) 7654321 + +1 (212) 7654321 => 93,7654321 + C-Kermit> + + You can also use the \fdialconvert(phone-number) function + ([389]Section 2.1.11) to do this programmatically: + + C-Kermit> echo "\fdialconvert(+1 (212) 7654321)" + "93,7654321" + C-Kermit> + + So the new LOOKUP behaves as follows: + + LOOKUP portable-format-phone-number + Displays how the number would actually be dialed Sets FAILURE + if there was a conversion error, otherwise SUCCESS. + + LOOKUP literal-format-phone-number + Displays the same literal-format-phone-number Always sets + SUCCESS. + + LOOKUP dialing-directory-name + Displays all matching entries and converts portable phone + numbers. Sets SUCCESS if at least one entry was found, + otherwise FAILURE. + + LOOKUP =anything + Displays "=anything" and sets SUCCESS. + + There is, at present, no programmatic way to fetch numbers from the + dialing directory. This will be considered for a future release. + _________________________________________________________________ + + 2.1.10. Greater Control over Partial Dialing + + The following rules now apply to partial dialing: + + * Phone number transformations based on country and area code, + application of prefixes, etc, are performed only on the first + PDIAL. + * Each PDIAL argument is looked up in the dialing directory, so it + is possible have directory entries for pieces of phone numbers or + other information. + * Suffixes are not applied automatically, since there is no way for + C-Kermit to know in which PDIAL segment you want them to be + applied. + + However, the suffix that *would* have been applied, based on the + dialing rules that were invoked when processing the first PDIAL + command, is stored in the variable: + + \v(dialsuffix) + + which you can include in any subsequent PDIAL or DIAL commands. + + Example: + + pdial {\m(my_long_distance_pager_number_part_1)} + pdial {\m(my_long_distance_pager_number_part_2)} + pdial {\v(dialsuffix)} + pdial {\m(my_long_distance_pager_number_part_3)} + pdial {@\m(numeric_pager_code)#} + _________________________________________________________________ + + 2.1.11. New DIAL-related Variables and Functions + + \fdialconvert(s) + s is a phone number in either literal or portable format (not a + dialing directory entry name). The function returns the dial + string that would actually be used by the DIAL command when + dialing from the current location, after processing country + code, area code, and other SET DIAL values, and should be the + same as the result of LOOKUP when given a telephone number. + + \v(dialsuffix) + Contains the suffix, if any, that was applied in the most + recent DIAL command, or the suffix that would have been applied + in the most recent PDIAL command. Use this variable to send the + dial suffix at any desired point in a PDIAL sequence. + + \v(dialtype) + A number indicating the type of call that was most recently + placed. Can be used after a normal DIAL command, or after the + first PDIAL command in a PDIAL sequence. Values are: + + -2: Unknown because TAPI handled the phone number translation. + -1: Unknown because some kind of error occured. + 0: Internal within PBX. + 1: Toll-free. + 2: Local within calling area. + 3: Unknown (e.g. because a literal-format phone number was given). + 4: Long distance within country. + 5: International + + \v(dialcount) + The current value of the DIAL retry counter, for use in a DIAL + macro ([390]Section 2.1.13). + + \v(d$px) + PBX Exchange (see [391]Section 2.1.12). + + Other dial-related variables, already documented in [392]Using + C-Kermit (or other sections of this document, e.g. [393]Section + 2.1.1), include \v(dialnumber), \v(dialstatus), etc. A convenient way + to display all of them is: + + show variable dial ; hint: abbreviate "sho var dial" + + This shows the values of all the variables whose names start with + "dial". Also "show variable d$" (to show the \v(d$...) variables). + _________________________________________________________________ + + 2.1.12. Increased Flexibility of PBX Dialing + + Refer to [394]Using C-Kermit, 2nd Edition, pages 107-108. Recall that + three commands are needed to configure C-Kermit for dialing from a + PBX: + + SET DIAL PBX-EXCHANGE number + SET DIAL PBX-INSIDE-PREFIX number + SET DIAL PBX-OUTSIDE-PREFIX number + + Unfortunately, this model does not accommodate PBXs that have more + than one exchange. For example our PBX at Columbia University (which + must handle more than 10,000 phones) has 853-xxxx and 854-xxxx + exchanges. + + Beginning in C-Kermit 7.0, the SET DIAL PBX-EXCHANGE command accepts a + list of exchanges, e.g.: + + SET DIAL PBX-EXCHANGE 853 854 + + (multiple exchanges are separated by spaces, not commas). + + So now when dialing a portable-format number that has the same country + and area codes as those of your dialing location, C-Kermit compares + the exchange of the dialed number with each number in the PBX Exchange + list (rather than with a single PBX Exchange number, as it did + formerly) to determine whether this is an internal PBX number or an + external call. If it is an external call, then the PBX Outside Prefix + is applied, and then the normal dialing rules for local or + long-distance calls. + + If it is an inside call, the exchange is replaced by the PBX Inside + Prefix. But if the PBX has more than one exchange, a single fixed PBX + Inside Prefix is probably not sufficient. For example, at Columbia + University, we must dial 3-xxxx for an internal call to 853-xxxx, but + 4-xxxx for a call to 854-xxxx. That is, the inside prefix is the final + digit of the exchange we are dialing. For this reason, C-Kermit 7.0 + provides a method to determine the inside prefix dynamically at + dialing time, consisting of a new variable and new syntax for the SET + DIAL PBX-INSIDE-PREFIX command: + + \v(d$px) + This variable contains the exchange that was matched when a PBX + internal call was detected. For example, if the PBX exchange + list is "853 854" and a call is placed to +1 (212) 854-9999, + \v(d$px) is set to 854. + + SET DIAL PBX-INSIDE-PREFIX \fxxx(...) + If the PBX Inside Prefix is defined to be a function, its + evaluation is deferred until dialing time. Normally, this would + be a string function having \v(d$px) as an operand. Of course, + you can still specify a constant string, as before. + + So given the following setup: + + SET DIAL COUNTRY-CODE 1 + SET DIAL AREA-CODE 212 + SET DIAL PBX-OUTSIDE-PREFIX 93, + SET DIAL PBX-EXCHANGE 853 854 + SET DIAL PBX-INSIDE-PREFIX \fright(\v(d$px),1) + + The following numbers give the results indicated: + + Number Result + +1 (212) 854-9876 4-9876 + +1 (212) 853-1234 3-1234 + +1 (212) 765-4321 93,765-4321 + +1 (333) 765-4321 93,1333765-4321 + + Furthermore, the K_PBX_XCH environment variable may now be set to a + list of exchanges to automatically initialize C-Kermit's PBX exchange + list, for example (in UNIX ksh or bash): + + export K_PBX_XCH="853 854" + + (Quotes required because of the space.) Of course, this variable can + also be set to a single exchange, as before: + + export K_PBX_XCH=853 + _________________________________________________________________ + + 2.1.13. The DIAL macro - Last-Minute Phone Number Conversions + + After a DIAL or LOOKUP command is given, a list of phone numbers is + assembled from the dialing directory (if any), with all + location-dependent conversion rules applied as described in Chapter 5 + of [395]Using C-Kermit. + + However, additional conversions might still be required at the last + minute based on local or ephemeral conditions. So that you can have + the final word on the exact format of the dial string, C-Kermit 7.0 + lets you pass the converted string through a macro of your own design + for final processing before dialing. The relevant command is: + + SET DIAL MACRO [ name ] + Specifies the name of a macro to be run on each phone number + after all built-in conversions have been applied, just before + the number is dialed. If no name is given, no macro is run. The + phone number, as it would have been dialed if there were no + dial macro, is passed to the macro. + + The dial macro can do anything at all (except start a file transfer). + However, the normal use for the macro would be to modify the phone + number. For this reason the phone number is passed to the macro as + argument number 1 (\%1). To cause a modified number to be dialed, the + macro should terminate with a RETURN statement specifying a return + value. To leave the number alone, the macro should simply end. + Example: + + define xxx return 10108889999$\%1 + set dial macro xxx + dial xyzcorp + + This defines a DIAL MACRO called xxx, which puts an access code on the + front of the number. Another example might be: + + def xxx if equal "\v(modem)" "hayes-1200" return \freplace(\%1,$,{,,,,,}) + set dial macro xxx + dial xyzcorp + + which replaces any dollar-sign in the dial string by a series of five + commas, e.g. because this particular modem does not support the "wait + for bong" feature (remember that commas that are to be included + literally in function arguments must be enclosed in braces to + distinguish them from the commas that separate the arguments) and when + the IF condition is not satisfied, the macro does not return a value, + and so the number is not modified. Then when a DIAL command is given + referencing a dialing directory entry, "xyzcorp". The macro is + automatically applied to each matching number. + + Numerous dial-, modem-, communications-, and time-related variables + are available for decision making your dial macro. Type SHOW VARIABLES + for a list. Of particular interest is the \v(dialcount) variable, + which tells how many times the DIAL command gone through its retry + loop: 1 on the first try, 2 on the second, 3 on the third, and so on, + and the \v(dialresult) and \v(dialstatus) variables. + + Here are some other applications for the DIAL MACRO (from users): + + * Phone numbers in the dialing directory are formatted with '-' for + readability, but some modems don't like the hyphens, so the DIAL + macro is used to remove them before dialing; e.g + 0090-123-456-78-99 becomes 00901234567899: "def xxx return + \freplace(\%1,-)". + * To set some specific modem (or other) options depending on the + called customer or telephone number. + * Choosing the most appropriate provider based on (e.g.) time of + day, or cycling through a list of providers in case some providers + might be busy. + + To illustrate the final item, suppose you have a choice among many + phone service providers; the provider is chosen by dialing an access + code before the number. Different providers might be better (e.g. + cheaper) for certain times of day or days of the week, or for dialing + certain locations; you can use the DIAL macro to add the access for + the most desirable provider. + + Similarly, when the same number might be reached through multiple + providers, it's possible that one provider might not be able to + complete the call, but another one can. In that case, you can use the + DIAL macro to switch providers each time through the DIAL loop -- + that's where the \v(dialcount) variable comes in handy. + + The following command can be used to debug the DIAL macro: + + SET DIAL TEST { ON, OFF } + Normally OFF, so the DIAL command actually dials. When ON, the + DIAL command performs all lookups and number conversions, and + then goes through the number list and retry loop, but instead + of actually dialing, lists the numbers it would have called if + none of the DIAL attempts succeeded (or more precisely, every + number was always busy). + _________________________________________________________________ + + 2.1.14. Automatic Tone/Pulse Dialing Selection + + SET DIAL METHOD { AUTO, DEFAULT, PULSE, TONE } + Chooses the dialing method for subsequent calls. + + Prior to version 7.0, C-Kermit's DIAL METHOD was DEFAULT by default, + meaning it does not specify a dialing method to the modem, but relies + on the modem to have an appropriate default dialing method set. So, + for example, when using Hayes compatible modems, the dial string would + be something like ATD7654321, rather than ATDT7654321 or ATDP7654321. + + In C-Kermit 7.0 and K95 1.1.19, the dial method can be set from the + environment variable: + + K_DIAL_METHOD + + when Kermit starts. The values can be TONE, PULSE, or DEFAULT, e.g. + (UNIX): + + set K_DIAL_METHOD=TONE; export K_DIAL_METHOD + + In the absence of a K_DIAL_METHOD definition, the new default SET DIAL + METHOD is AUTO rather than DEFAULT. When DIAL METHOD is AUTO and the + local country code is known, then if tone dialing is universally + available in the corresponding area, tone dialing is used; if dialing + from a location where pulse dialing is mandatory, pulse dialing is + used. + + The "tone country" and "pulse country" lists are preloaded according + to our knowledge at the time of release. You can see their contents in + the SHOW DIAL listing. You can change the lists with: + + SET DIAL TONE-COUNTRIES [ cc [ cc [ ... ] ] ] + Replaces the current TONE-COUNTRIES list with the one given. + Each cc is a country code; separate them with spaces (not + commas). Example: + + set dial tone-countries 1 358 44 46 49 + + If no country codes are given, the current list, if any, is + removed, in which case SET DIAL METHOD AUTO is equivalent to + SET DIAL METHOD DEFAULT. + + SET DIAL PULSE-COUNTRIES [ cc [ cc [ ... ] ] ] + Replaces the current PULSE-COUNTRIES list with the one give. + Syntax and operation is like SET DIAL TONE-COUNTRIES. + + If the same country code appears in both lists, Pulse takes + precedence. + + The SET DIAL TONE- and PULSE-COUNTRIES commands perform no + verification whatsoever on the cc's, since almost any syntax might be + legal in some settings. Furthermore, there is no facility to edit the + lists; you can only replace the whole list. However, since the only + purpose of these lists is to establish a basis for picking tone or + pulse dialing automatically, all you need to override the effect of + the list is to set a specific dialing method with SET DIAL METHOD TONE + or SET DIAL METHOD PULSE. + _________________________________________________________________ + + 2.1.15. Dial-Modifier Variables + + As of C-Kermit 7.0, dial modifiers are available in the following + variables: + + \v(dm_lp) Long pause + \v(dm_sp) Short pause + \v(dm_pd) Pulse dial + \v(dm_td) Tone dial + \v(dm_wa) Wait for answer + \v(dm_wd) Wait for dialtone + \v(dm_rc) Return to command mode + + You can use these in your dial strings in place of hardwired modifiers + like "@", ",", etc, for increased portability of scripts. Example: + + C-Kermit>set modem type usrobotics + C-Kermit>sho variables dm + \v(dm_lp) = , + \v(dm_sp) = / + \v(dm_pd) = P + \v(dm_td) = T + \v(dm_wa) = @ + \v(dm_wd) = W + \v(dm_rc) = ; + C-Kermit>exit + _________________________________________________________________ + + 2.1.16. Giving Multiple Numbers to the DIAL Command + + Prior to C-Kermit 7.0, the only way to give a DIAL command a list of + phone numbers to try until one answers was to create a dialing + directory that had multiple entries under the same name, and then use + that entry name in the DIAL command. Now a list of numbers can be + given to the DIAL command directly in the following format: + + dial {{number1}{number2}{number3}...} + + This is the same list format used by SEND /EXCEPT: and other commands + that allow a list where normally a single item is given. Restrictions + on this form of the DIAL command are: + + * The first two braces must be adjacent; spacing is optional + thereafter. + * Each number must be an actual number to dial, not a dialing + directory entry. + * Dialing directory entries may not contain number lists in this + format. + + In all other respects, the numbers are treated as if they had been + fetched from the dialing directory; they can be in literal or portable + format, etc. Example: + + dial {{7654321} {+1 (212) 5551212} { 1-212-5556789 }} + + The list can be any length at all, within reason. + + This feature is especially handy for use with the K95 Dialer, allowing + a list of phone numbers to be specified in the Telephone Number box + without having to set up or reference a separate dialing directory. + + You can also use it to add commonly-dialed sequences as variables in + your C-Kermit customization file, e.g.: + + define work {{7654321}{7654322}{7654323}} + + and then: + + dial {\m(work)} + + (the variable name must be enclosed in braces). + + Or more simply: + + define work dial {{7654321}{7654322}{7654323}} + + and then: + + work + _________________________________________________________________ + + 2.2. Modems + + 2.2.1. New Modem Types + + Since C-Kermit 6.0: + + atlas-newcom-33600ifxC Atlas/Newcom 33600 + att-keepintouch AT&T KeepinTouch PCMCIA V.32bis Card Modem + att-1900-stu-iii AT&T Secure Data STU-III Model 1900 + att-1910-stu-iii AT&T Secure Data STU-III Model 1910 + bestdata Best Data + cardinal Cardinal V.34 MVP288X series. + compaq Compaq Data+Fax (e.g. in Presario) + fujitsu Fujitsu Fax/Modem Adapter + generic-high-speed Any modern error-correcting data-compressing modem + itu-t-v25ter/v250 ITU-T (CCITT) V.25ter (V.250) standard command set + megahertz-att-v34 Megahertz AT&T V.34 + megahertz-xjack Megahertz X-Jack + motorola-codex Motorola Codex 326X Series + motorola-montana Motorola Montana + mt5634zpx Multitech MT5634ZPX + rockwell-v90 Rockwell V.90 56K + rolm-244pc Siemens/Rolm 244PC (AT command set) + rolm-600-series Siemens/Rolm 600 Series (AT command set) + spirit-ii QuickComm Spirit II + suprasonic SupraSonic V288+ + supra-express-v90 Supra Express V.90 + + One of the new types, "generic-high-speed" needs a bit of explanation. + This type was added to easily handle other types that are not + explicitly covered, without going through the bother of adding a + complete user-defined modem type. This one works for modern modems + that use the AT command set, on the assumption that all the default + ("factory") settings of the modem (a) are appropriate for Kermit, (b) + include error correction, data compression, and speed buffering; and + (c) are recallable with the command AT&F. + + If the command to recall your modem's profile is not AT&F, use the SET + MODEM COMMAND INIT-STRING command to specify the appropriate modem + command. The default init-string is AT&F\13 (that is, AT, ampersand, + F, and then carriage return); a survey of about 20 modern modem types + shows they all support this, but they might mean different things by + it. For example, the USR Sportster or Courier needs AT&F1 (not AT&F, + which is equivalent to AT&F0, which recalls an inappropriate profile), + so for USR modems: + + set modem type generic-high-speed + set modem command init AT&F1\13 + + Of course, USR modems already have their own built-in modem type. But + if you use this one instead, it will dial faster because it has fewer + commands to give to the modem; in that sense "&F1" is like a macro + that bundles numerous commands into a single one. See your modem + manual for details about factory profiles and commands to recall them. + + WARNING: Do not use the generic-high-speed modem type in operating + systems like VMS where hardware flow control is not available, at + least not unless you change the init string from AT&F\13 to something + else that enables local Xon/Xoff or other appropriate type of flow + control. + + Also see [396]Section 2.1.7 for additional hints about making dialing + go faster. + _________________________________________________________________ + + 2.2.2. New Modem Controls + + SET MODEM CAPABILITIES list + In C-Kermit 7.0, this command automatically turns MODEM + SPEED-MATCHING OFF if SB (Speed Buffering) is in the list, and + turns it ON if SB is absent. + + SET MODEM COMMAND PREDIAL-INIT [ text ] + Commands to be sent to the modem just prior to dialing. + Normally none. + + SET MODEM SPEAKER { ON, OFF } + Determines whether modem speaker is on or off while call is + being placed. ON by default. Note: This command does not + provide fine-grained control over when the speaker is on or + off. Normally, ON means while the call is being placed, until + the point at which carrier is successfully established. If your + modem has a different speaker option that you want to choose, + then use the SET MODEM COMMAND SPEAKER ON text command to + specify this option. + + SET MODEM COMMAND SPEAKER { ON, OFF } [ text ] + Specify or override the commands to turn your modem's speaker + on and off. + + SET MODEM VOLUME { LOW, MEDIUM, HIGH } + When MODEM SPEAKER is on, select volume. Note: In some modems, + especially internal ones, these commands have no effect; this + is a limitation of the particular modem, not of Kermit. + + SET MODEM COMMAND VOLUME { LOW, MEDIUM, HIGH } [ text ] + Specify or override the commands to set your modem's speaker + volume. + + SET MODEM COMMAND IGNORE-DIALTONE [ text ] + The command to enable blind dialing ([397]Section 2.1.6). + + SET MODEM ESCAPE-CHARACTER code + Has been augmented to allow codes of 0 or less: < 0 means the + escape mechanism is disabled. = 0 means to use (restore) the + default value from the modem database. > 0 and < 128 is a + literal value to be used instead of the default one. > 127 + means the escape mechanism is disabled. This affects "modem + hangup". When the escape mechanism is disabled, but SET MODEM + HANGUP-METHOD is MODEM-COMMAND, it sends the hangup command + immediately, without the +++ business first. This + is useful (for example) when sending lots of numeric pages, a + process in which never we go online, and so never need to + escape back. Eliminating the unnecessary pauses and escape + sequence allows a lot more pages to be sent per unit time. + + Recall that C-Kermit can dial modems to which it is connected via + TCP/IP (Telnet or Rlogin) as described on page 126 of [398]Using + C-Kermit, 2nd Ed. In this case the MODEM HANGUP-METHOD should be + MODEM-COMMAND, since RS-232 signals don't work over TCP/IP + connections. As noted in the manual, such connections are set up by + the following sequence: + + set host host [ port ] + set modem type name + dial number + + But this can cause complications when you use Kermit to switch between + serial and TCP/IP connections. In the following sequence: + + set host name + set modem type name + set port name + + the first two commands obey the rules for dialing out over Telnet. + However, the SET PORT command requires that Kermit close its current + (Telnet) connection before it can open the serial port (since Kermit + can only have one connection open at a time). But since a modem type + was set after the "set host" command was given, Kermit assumes it is a + Telnet dialout connection and so sends the modem's hangup sequence is + sent to the Telnet host. To avoid this, close the network connection + explicitly before opening the serial one: + + set host name + close + set modem type name + set port name + _________________________________________________________________ + + 2.3. TELNET and RLOGIN + + For additional background, please also read the [399]TELNET.TXT file, + also available on the Web in [400]HTML format. + + Cautions: + + * If making a Telnet connection with C-Kermit takes a very long + time, like over a minute, whereas the system Telnet program makes + the same connection immediately, try including the /NOWAIT switch: + C-Kermit> telnet /nowait hostname + See [401]TELNET.TXT or [402]TELNET.HTM for details. If it also + takes a very long time to make a Telnet connection with system + Telnet, then the delay is most likely caused by reverse DNS + lookups when your host is not properly registered in DNS. + * When supplying numeric IP addresses to C-Kermit or to any other + application (regular Telnet, Rlogin, etc), do not include leading + 0's in any fields unless you intend for those fields to be + interpreted as octal (or hex) numbers. The description of the + Internet address interpreter (the sockets library inet_addr() + routine) includes these words: + + All numbers supplied as "parts" in a "." notation may be decimal, + octal, or hexadecimal, as specified in the C language (that is, a + leading 0x or 0X implies hexadecimal; otherwise, a leading 0 + implies octal; otherwise, the number is interpreted as decimal). + To illustrate, 128.59.39.2 and 128.059.039.002 are not the same + host! Even though most of the fields contain non-octal digits. + Using system Telnet (not Kermit): + $ telnet 128.059.039.002 + Trying 128.49.33.2 ... + Of course the same thing happens with Kermit because it uses (as + it must) the same system service for resolving network addresses + that Telnet, FTP, and all other TCP/IP applications use. + * The RLOGIN section on page 123 does not make it clear that you can + use the SET TELNET TERMINAL-TYPE command to govern the terminal + type that is reported by C-Kermit to the RLOGIN server. + * Note that the SET TCP commands described on pages 122-123 might be + absent; some platforms that support TCP/IP do not support these + particular controls. + + New commands: + + TELOPT { AO, AYT, BREAK, CANCEL, EC, EL, EOF, EOR, GA, IP, DMARK, + DO, DONT, NOP, SB, SE, SUSP, WILL, WONT } + This command was available previously, but supported only DO, + DONT, WILL, and WONT. Now it lets you send all the Telnet + protocol commands. Note that certain commands do not require a + response, and therefore can be used as nondestructive "probes" + to see if the Telnet session is still open; e.g.: + + set host xyzcorp.com + ... + telopt nop + if fail stop 1 Connection lost + + SET TCP ADDRESS [ ip-address ] + Specifies the IP address of the computer that C-Kermit is + running on. Normally this is not necessary. The exception would + be if your machine has multiple network adapters (physical or + virtual) with a different address for each adapter AND you want + C-Kermit to use a specific address when making outgoing + connections or accepting incoming connections. + + SET TCP DNS-SERVICE-RECORDS { ON, OFF } + Tells C-Kermit whether to try to use DNS SRV records to + determine the host and port number upon which to find an + advertised service. For example, if a host wants regular Telnet + connections redirected to some port other than 23, this feature + allows C-Kermit to ask the host which port it should use. Since + not all domain servers are set up to answer such requests, this + feature is OFF by default. + + SET TCP REVERSE-DNS-LOOKUP { ON, OFF, AUTO } + Tells Kermit whether to perform a reverse DNS lookup on TCP/IP + connections. This allows Kermit to determine the actual + hostname of the host it is connected to, which is useful for + connections to host pools, and is required for Kerberos + connections to host pools and for incoming connections. If the + other host does not have a DNS entry, the reverse lookup could + take a long time (minutes) to fail, but the connection will + still be made. Turn this option OFF for speedier connections if + you do not need to know exactly which host you are connected to + and you are not using Kerberos. AUTO, the default, means the + lookup is done on hostnames, but not on numeric IP addresses. + + SET TELNET WAIT-FOR-NEGOTIATIONS { ON, OFF } + Each Telnet option must be fully negotiated either On or Off + before the session can continue. This is especially true with + options that require sub-negotiations such as Authentication, + Encryption, and Kermit; for proper support of these options + Kermit must wait for the negotiations to complete. Of course, + Kermit has no way of knowing whether a reply is delayed or not + coming at all, and so will wait a minute or more for required + replies before continuing the session. If you know that + Kermit's Telnet partner will not be sending the required + replies, you can set this option of OFF to avoid the long + timeouts. Or you can instruct Kermit to REFUSE specific options + with the SET TELOPT command. + + SET TELOPT [ { /CLIENT, /SERVER } ] option + { ACCEPTED, REFUSED, REQUESTED, REQUIRED } + [ { ACCEPTED, REFUSED, REQUESTED, REQUIRED } ] + SET TELOPT lets you specify policy requirements for Kermit's + handling of Telnet option negotiations. Setting an option is + REQUIRED causes Kermit to offer the option to the peer and + disconnect if the option is refused. REQUESTED causes Kermit to + offer an option to the peer. ACCEPTED results in no offer but + Kermit will attempt to negotiate the option if it is requested. + REFUSED instructs Kermit to refuse the option if it is + requested by the peer. + + Some options are negotiated in two directions and accept + separate policies for each direction; the first keyword applies + to Kermit itself, the second applies to Kermit's Telnet + partner; if the second keyword is omitted, an appropriate + (option-specific) default is applied. You can also include a + /CLIENT or /SERVER switch to indicate whether the given + policies apply when Kermit is the Telnet client or the Telnet + server; if no switch is given, the command applies to the + client. + + Note that some of Kermit's Telnet partners fail to refuse + options that they do not recognize and instead do not respond + at all. In this case it is possible to use SET TELOPT to + instruct Kermit to REFUSE the option before connecting to the + problem host, thus skipping the problematic negotiation. + + Use SHOW TELOPT to view current Telnet Option negotiation + settings. SHOW TELNET displays current Telnet settings. + _________________________________________________________________ + + 2.3.0. Bug Fixes + + If "set host nonexistent-host" was given (and it properly failed), + followed by certain commands like SEND, the original line and modem + type were not restored and C-Kermit thought that it still had a + network hostname; fixed in 7.0. + + 2.3.1. Telnet Binary Mode Bug Adjustments + + SET TELNET BUG BINARY-ME-MEANS-U-TOO { ON, OFF } was added to edit 192 + after the book was printed. Also SET TELNET BUG BINARY-U-MEANS-ME-TOO. + The default for both is OFF. ON should be used when communicating with + a Telnet partner (client or server) that mistakenly believes that + telling C-Kermit to enter Telnet binary mode also means that it, too, + is in binary mode, contrary to the Telnet specification, which says + that binary mode must be negotiated in each direction separately. + + 2.3.2. VMS UCX Telnet Port Bug Adjustment + + A new command, SET TCP UCX-PORT-BUG, was added for VMS versions with + UCX (DEC TCP/IP), applying only to early versions of UCX, like 2.2 or + earlier. If you try to use VMS C-Kermit to make a Telnet connection + using a port name (like "telnet", which is used by default), the + underlying UCX getservbyname() function might return the service + number with its bytes swapped and the connection will fail. If "telnet + hostname 23" works, then your version of UCX has this bug and you can + put "set tcp ucx-port-bug on" in your CKERMIT.INI file to get around + it. + + 2.3.3. Telnet New Environment Option + + The TELNET NEW-ENVIRONMENT option ([403]RFC 1572) is supported as 7.0. + This option allows the C-Kermit Telnet client to send certain + well-known variables to the Telnet server, including USER, PRINTER, + DISPLAY, and several others. This feature is enabled by default in + Windows and OS/2, disabled by default elsewhere. The command to enable + and disable it is: + + SET TELNET ENVIRONMENT { ON, OFF } + + When ON, and you Telnet to another computer, you might (or might not) + notice that the "login:" or "Username:" prompt does not appear -- + that's because your username was sent ahead, in which case the remote + system might prompt you only for your password (similar to Rlogin). + Use "set telnet environment off" to defeat this feature, particularly + in scripts where the dialog must be predictable. You can also use this + command to specify or override specific well-known environment + variable values: + + SET TELNET ENVIRONMENT { ACCT,DISPLAY,JOB,PRINTER,SYSTEMTYPE,USER } [ text ] + + 2.3.4. Telnet Location Option + + The TELNET LOCATION option ([404]RFC 779) is supported in 7.0. This + option allows the C-Kermit Telnet client to send a location string to + the server if the server indicates its willingness to accept one. If + an environment variable named LOCATION exists at the time C-Kermit + starts, its value is used as the location string. If you want to + change it, use: + + SET TELNET LOCATION text + + If you omit the text from this command, the Telnet location feature is + disabled. + + SET TELNET ENVIRONMENT DISPLAY is used to set the DISPLAY variable + that is sent to the host, as well as the the XDISPLAY location. + + 2.3.5. Connecting to Raw TCP Sockets + + The SET HOST and TELNET commands now accept an optional switch, + /RAW-SOCKET, at the end, only if you first give a host and a port. + Example: + + set host xyzcorp.com 23 /raw-socket + set host 128.49.39.2:2000 /raw-socket + telnet xyzcorp.com 3000 /raw + + Without this switch, C-Kermit behaves as a Telnet client when (a) the + port is 23 or 1649, or (b) the port is not 513 and the server sent + what appeared to be Telnet negotiations -- that is, messages starting + with 0xFF (IAC). With this switch, Kermit should treat all incoming + bytes as raw data, and will not engage in any Telnet negotiations or + NVT CRLF manipulations. This allows transparent operation through + (e.g.) raw TCP ports on Cisco terminal servers, through the 'modemd' + modem server, etc. + + 2.3.6. Incoming TCP Connections + + Accomplished via SET HOST * port, were introduced in C-Kermit 6.0, but + for UNIX only. In Version 7.0, they are also available for VMS. + _________________________________________________________________ + + 2.4. The EIGHTBIT Command + + EIGHTBIT is simply a shorthand for: SET PARITY NONE, SET TERMINAL + BYTESIZE 8, SET COMMAND BYTESIZE 8; that is, a way to set up an 8-bit + clean connection in a single command. + _________________________________________________________________ + + 2.5. The Services Directory + + Chapter 7 of [405]Using C-Kermit does not mention the ULOGIN macro, + which is used by our sample services directory, CKERMIT.KND. Unlike + UNIXLOGIN, VMSLOGIN, etc, this one is for use with systems that + require a user ID but no password. Therefore it doesn't prompt for a + password or wait for a password prompt from the remote service. + + In version 7.0, the CALL macro was changed to not execute a SET MODEM + TYPE command if the given modem type was the same as the current one; + otherwise the new SET MODEM TYPE command would overwrite any + customizations that the user had made to the modem settings. Ditto for + SET LINE / SET PORT and SET SPEED. + _________________________________________________________________ + + 2.6. Closing Connections + + Until version 7.0, there was never an obvious and general way to close + a connection. If a serial connection was open, it could be closed by + "set line" or "set port" (giving no device name); if a network + connection was open, it could be closed by "set host" (no host name). + + In version 7.0, a new command closes the connection in an obvious and + straightforward way, no matter what the connection type: + + CLOSE [ CONNECTION ] + + The CLOSE command was already present, and required an operand such as + DEBUG-LOG, WRITE-FILE, etc, and so could never be given by itself. The + new CONNECTION operand is now the default operand for CLOSE, so CLOSE + by itself closes the connection, if one is open, just as you would + expect, especially if you are a Telnet or Ftp user. + + Also see the description of the new SET CLOSE-ON-DISCONNECT command in + [406]Section 2.10. + _________________________________________________________________ + + 2.7. Using C-Kermit with External Communication Programs + + C-Kermit 7.0 includes a new ability to create and conduct sessions + through other communications programs. Two methods are available: + + 1. Pty (pseudoterminal): The external program is run on a + "pseudoterminal", which is controlled by Kermit. This method works + with practically any external program, but it is not portable. At + this writing, it works only on some (not all) UNIX versions, and + not on any non-UNIX platforms. + 2. Pipe: The external program's standard input and output are + redirected through a "pipe" controlled by Kermit. This method is + relatively portable -- it should work across all UNIX versions, + and it also works in Windows and OS/2 -- but it is effective only + when the external program actually uses standard i/o (and many + don't). + + The two methods are started differently but are used the same way + thereafter. + + The purpose of this feature is to let you use C-Kermit services like + file transfer, character-set translation, scripting, automatic + dialing, etc, on connections that Kermit can't otherwise make itself. + + This feature is the opposite of the REDIRECT feature, in which + C-Kermit makes the connection, and redirects an external (local) + command or program over this connection. In a pty or pipe connection, + C-Kermit runs and controls a local command or program, which makes the + connection. (The same method can be used to simply to control a local + program without making a connection; see [407]Section 2.8.) + + To find out if your version of Kermit includes PTY support, type "show + features" and look for NETPTY in the alphabetical list of options. For + pipes, look for NETCMD. + + The commands are: + + SET NETWORK TYPE PTY or SET NETWORK TYPE PIPE + SET HOST command + where command is any interactive command. If the command does + not use standard i/o, you must use SET NETWORK TYPE PTY. + + Notes: + + * COMMAND is an invisible synonym for PIPE. + * The command and its arguments are case-sensitive in UNIX. + + The SET NETWORK TYPE, SET HOST sequence sets the given network type + for all subsequent SET HOST commands until another SET NETWORK TYPE + command is given to change it. + + You can also use the new /NETWORK-TYPE:PTY or /NETWORK-TYPE:PIPE (or + simply /PIPE or /PTY) switches on the SET HOST command itself: + + SET HOST /NETWORK-TYPE:PIPE command ; These two are the same + SET HOST /PIPE command + + SET HOST /NETWORK-TYPE:PTY command ; Ditto + SET HOST /PTY command + + These are like SET NETWORK TYPE followed by SET HOST, except they + apply only to the connection being made and do not change the global + network type setting (see [408]Section 1.5 about the difference + between switches and SET commands). + + Include any command-line options with the command that might be + needed, as in this example where C-Kermit uses another copy of itself + as the communications program: + + SET HOST /PIPE /CONNECT kermit -YQJ xyzcorp.com + + As usual, if you include the /CONNECT switch, SET HOST enters CONNECT + mode immediately upon successful execution of the given command. + Therefore new commands are available as a shorthand for SET HOST + /CONNECT /PTY and /PIPE: + + PTY [ command ] + PIPE [ command ] + The PTY and PIPE commands work like the TELNET and RLOGIN + commands: they set up the connection (in this case, using the + given command) and then enter CONNECT mode automatically (if + the PIPE or PTY command is given without a command, it + continues the current session if one is active; otherwise it + gives an error message). + + The PIPE command is named after the mechanism by which C-Kermit + communicates with the command: UNIX pipes. C-Kermit's i/o is "piped" + through the given command. Here is a typical example: + + PIPE rlogin -8 xyzcorp.com + + This is equivalent to: + + SET HOST /PIPE rlogin -8 xyzcorp.com + CONNECT + + and to: + + SET HOST /PIPE /CONNECT rlogin -8 xyzcorp.com + + IMPORTANT: + If you are writing a script, do not use the PIPE, PTY, TELNET, + or RLOGIN command unless you really want C-Kermit to enter + CONNECT mode at that point. Normally SET HOST is used in + scripts to allow the login and other dialogs to be controlled + by the script itself, rather than by an actively participating + human at the keyboard. + + Throughput of pty and pipe connections is limited by the performance + of the chosen command or program and by the interprocess communication + (IPC) method used and/or buffering capacity of the pipe or pty, which + in turn depends on the underlying operating system. + + In one trial (on SunOS 4.1.3), we observed file transfer rates over an + rlogin connection proceeding at 200Kcps for downloads, but only 10Kcps + for uploads on the same connection with the same settings (similar + disparities were noted in HP-UX). Examination of the logs revealed + that a write to the pipe could take as long as 5 seconds, whereas + reads were practically instantaneous. On the other hand, using Telnet + as the external program rather than rlogin, downloads and uploads were + better matched at about 177K each. + + Most external communication programs, like C-Kermit itself, have + escape characters or sequences. Normally these begin with (or consist + entirely of) a control character. You must be sure that this control + character is not "unprefixed" when uploading files, otherwise the + external program will "escape back" to its prompt, or close the + connection, or take some other unwanted action. When in CONNECT mode, + observe the program's normal interaction rules. Of course C-Kermit's + own escape character (normally Ctrl-\) is active too, unless you have + taken some action to disable it. + + On PTY connections, the underlying PTY driver is not guaranteed to be + transparent to control characters -- for example, it might expand + tabs, translate carriage returns, generate signals if it sees an + interrupt character, and so on. Similar things might happen on a PIPE + connection. For this reason, if you plan to transfer files over a PTY + or PIPE connection, tell the file sender to: + + SET PREFIXING ALL + This causes all control characters to be prefixed and + transmitted as printable ASCII characters. + + If the external connection program is not 8-bit clean, you should + also: + + SET PARITY SPACE + This causes 8-bit data to be encoded in 7 bits using single + and/or locking shifts. + + And if it does not make a reliable connection (such as those made by + Telnet, Rlogin, Ssh, etc), you should: + + SET STREAMING OFF + This forces C-Kermit to treat the connection as unreliable and + to engage in its normal ACK/NAK protocol for error detection + and correction, rather than "streaming" its packets, as it + normally does on a network connection ([409]Section 4.20). + + In some cases, buffer sizes might be restricted, so you might also + need to reduce the Kermit packet length to fit; this is a + trial-and-error affair. For example, if transfers always fail with + 4000-byte packets, try 2000. If that fails too, try 1000, and so on. + The commands are: + + SET RECEIVE PACKET-LENGTH number + This tells the file receiver to tell the file sender the + longest packet length it can accept. + + SET SEND PACKET-LENGTH number + This tells the file sender not to send packets longer than the + given length, even if the receiver says longer ones are OK. Of + course, if the receiver's length is shorter, the shorter length + is used. + + If none of this seems to help, try falling back to the bare minimum, + lowest-common-denominator protocol settings: + + ROBUST + No sliding windows, no streaming, no control-character + unprefixing, packet length 90. + + And then work your way back up by trial and error to get greater + throughput. + + Note that when starting a PIPE connection, and the connection program + (such as telnet or rlogin) prints some greeting or information + messages before starting the connection, these are quite likely to be + printed with a stairstep effect (linefeed without carriage return). + This is because the program is not connected with the UNIX terminal + driver; there's not much Kermit can do about it. Once the connection + is made, everything should go back to normal. This shouldn't happen on + a PTY connection because a PTY is, indeed, a terminal. + + On a similar note, some connection programs (like Solaris 2.5 rlogin) + might print lots of error messages like "ioctl TIOCGETP: invalid + argument" when used through a pipe. They are annoying but usually + harmless. If you want to avoid these messages, and your shell allows + redirection of stderr, you can redirect stderr in your pipe command, + as in this example where the user's shell is bash: + + PIPE rlogin xyzcorp.com 2> /dev/null + + Or use PTY rather than PIPE, since PTY is available on Solaris. + _________________________________________________________________ + + 2.7.0. C-Kermit over tn3270 and tn5250 + + Now you can make a connection from C-Kermit "directly" to an IBM + mainframe and transfer files with it, assuming it has Kermit-370 + installed. Because tn3270 is neither 8-bit clean nor transparent to + control characters, you must give these commands: + + SET PREFIXING ALL ; Prefix all control characters + SET PARITY SPACE ; Telnet connections are usually not 8-bit clean + + and then: + + SET HOST /PTY /CONNECT tn3270 abccorp.com + + or simply: + + pty tn3270 abccorp.com + + SET HOST /PIPE does not work in this case, at least not for file + transfer. File transfer does work, however, with SET HOST /PTY, + provided you use the default packet length of 90 bytes; anything + longer seems to kill the session. + + You can also make connections to IBM AS/400 computers if you have a + tn5250 program installed: + + pty tn5250 hostname + + In this case, however, file transfer is probably not in the cards + since nobody has ever succeeded in writing a Kermit program for the + AS/400. Hint: + + define tn3270 { + check pty + if fail end 1 Sorry - no PTY support... + pty tn3270 \%* + } + + Similarly for tn5250. Note that CHECK PTY and CHECK PIPE can be used + in macros and scripts to test whether PTY or PIPE support is + available. + _________________________________________________________________ + + 2.7.1. C-Kermit over Telnet + + Although C-Kermit includes its own Telnet implementation, you might + need to use an external Telnet program to make certain connections; + perhaps because it has access or security features not available in + C-Kermit itself. As noted above, the only precautions necessary are + usually: + + SET PREFIXING ALL ; Prefix all control characters + SET PARITY SPACE ; Telnet connections might not be 8-bit clean + + and then: + + SET HOST /PTY (or /PIPE) /CONNECT telnet abccorp.com + + or, equivalently: + + PTY (or PIPE) telnet abccorp.com + _________________________________________________________________ + + 2.7.2. C-Kermit over Rlogin + + C-Kermit includes its own Rlogin client, but this can normally be used + only if you are root, since the rlogin TCP port is privileged. But + ptys and pipes let you make rlogin connections with C-Kermit through + your computer's external rlogin program, which is normally installed + as a privileged program: + + SET PREFIXING ALL + + and then: + + SET HOST /PTY (or /PIPE) /CONNECT rlogin -8 abccorp.com + + or, equivalently: + + PTY (or PIPE) rlogin -8 abccorp.com + + The "-8" option to rlogin enables transmission of 8-bit data. If this + is not available, then include SET PARITY SPACE if you intend to + transfer files. + + Note that the normal escape sequence for rlogin is Carriage Return + followed by Tilde (~), but only when the tilde is followed by certain + other characters; the exact behavior depends on your rlogin client, so + read its documentation. + _________________________________________________________________ + + 2.7.3. C-Kermit over Serial Communication Programs + + Ptys and pipes also let you use programs that make serial connections, + such as cu or tip. For example, C-Kermit can be used through cu to + make connections that otherwise might not be allowed, e.g. because + C-Kermit is not installed with the required write permissions to the + dialout device and the UUCP lockfile directory. + + Suppose your UUCP Devices file contains an entry for a serial device + tty04 to be used for direct connections, but this device is protected + against you (and Kermit when you run it). In this case you can: + + SET CONTROL PREFIX ALL + PTY (or PIPE) cu -l tty04 + + (Similarly for dialout devices, except then you also need to include + the phone number in the "cu" command.) + + As with other communication programs, watch out for cu's escape + sequence, which is the same as the rlogin program's: Carriage Return + followed by Tilde (followed by another character to specify an action, + like "." for closing the connection and exiting from cu). + _________________________________________________________________ + + 2.7.4. C-Kermit over Secure Network Clients + + DISCLAIMER: There are laws in the USA and other countries regarding + use, import, and/or export of encryption and/or decryption or other + forms of security software, algorithms, technology, and + intellectual property. The Kermit Project attempts to follow all + known statutes, and neither intends nor suggests that Kermit + software can or should be used in any way, in any location, that + circumvents any regulations, laws, treaties, covenants, or other + legitimate canons or instruments of law, international relations, + trade, ethics, or propriety. + + For secure connections or connections through firewalls, C-Kermit 7.0 + can be a Kerberos, SRP, and/or SOCKS client when built with the + appropriate options and libraries. But other application-level + security acronyms and methods -- SSH, SSL, SRP, TLS -- pop up at an + alarming rate and are (a) impossible to keep up with, (b) usually + mutually incompatible, and (c) have restrictions on export or + redistribution and so cannot be included in C-Kermit itself. + + However, if you have a secure text-based Telnet (or other) client that + employs one of these security methods, you can use C-Kermit "through" + it via a pty or pipe. + _________________________________________________________________ + + 2.7.4.1. SSH + + C-Kermit does not and can not incorporate SSH due to licensing, + patent, and USA export law restrictions. + + The UNIX SSH client does not use standard input/output, and therefore + can be used only by Kermit's PTY interface, if one is present. The + cautions about file transfer, etc, are the same as for Rlogin. + Example: + + SET PREFIXING ALL + PTY ssh XYZCORP.COM + + Or, for a scripted session: + + SET PREFIXING ALL + SET HOST /PTY ssh XYZCORP.COM + + Hint: + + define ssh { + check pty + if fail end 1 Sorry - no PTY support... + pty ssh \%* + } + _________________________________________________________________ + + 2.7.4.2. SSL + + Secure Sockets Layer (SSL) is another TCP/IP security overlay, this + one designed by and for Netscape. An SSL Telnet client is available + for UNIX from the University of Queensland. More info at: + + [410]http://www.psy.uq.oz.au/~ftp/Crypto/ + + Interoperability with C-Kermit is unknown. C-Kermit also includes its + own built-in SSL/TLS support, but it is not exportable; [411]CLICK + HERE file for details. + _________________________________________________________________ + + 2.7.4.3. SRP + + SRP(TM) is Stanford University's Secure Remote Password protocol. An + SRP Telnet client is available from Stanford: + + [412]http://srp.stanford.edu/srp/ + + Stanford's SRP Telnet client for UNIX has been tested on SunOS and + works fine with C-Kermit, as described in [413]Section 2.7.1, e.g. + + SET PREFIX ALL + PTY (or PIPE) srp-telnet xenon.stanford.edu + + C-Kermit itself can be built as an SRP Telnet client on systems that + have libsrp.a installed; the C-Kermit support code, however, may not + be exported outside the USA or Canada. + _________________________________________________________________ + + 2.7.4.4. SOCKS + + C-Kermit can be built as a SOCKS-aware client on systems that have a + SOCKS library. See section 8.1.1 of the [414]ckccfg.txt file. + + C-Kermit 7.0 can also be run over SOCKSified Telnet or rlogin clients + with SET NETWORK TYPE COMMAND. Suppose the Telnet program on your + system is SOCKS enabled but C-Kermit is not. Make Kermit connections + like this: + + SET PREFIX ALL + PTY (or PIPE) telnet zzz.com + _________________________________________________________________ + + 2.7.4.5. Kerberos + + UNIX C-Kermit can be built with MIT Kerberos IV or V authentication + and encryption. Instructions are available in a [415]separate + document. Additional modules are required that can not be exported + from the USA to any country except Canada, by US law. + + If you have Kerberos installed but you don't have a Kerberized version + of C-Kermit, you can use ktelnet as C-Kermit's external communications + program to make secure connections without giving up C-Kermit's + services: + + SET PREFIX ALL + PTY (or PIPE) ktelnet cia.gov + _________________________________________________________________ + + 2.8. Scripting Local Programs + + If your version of Kermit has PTY support built in, then any + text-based program can be invoked with SET HOST /PTY or equivalent + command and controlled using the normal sequence of OUTPUT, INPUT, IF + SUCCESS commands (this is the same service that is provided by the + 'expect' program, but controlled by the Kermit script language rather + than Tcl). + + When PTY service is not available, then any program that uses standard + input and output can be invoked with SET HOST /PIPE. + + Here's an example in which we start an external Kermit program, wait + for its prompt, give it a VERSION command, and then extract the + numeric version number from its response: + + set host /pty kermit -Y + if fail stop 1 {Can't start external command} + input 10 C-Kermit> + if fail stop 1 {No C-Kermit> prompt} + output version\13 + input 10 {Numeric: } + if fail stop 1 {No match for "Numeric:"} + clear input + input 10 \10 + echo VERSION = "\fsubstr(\v(input),1,6)" + output exit\13 + + This technique could be used to control any other interactive program, + even those that do screen formatting (like Emacs or Vi), if you can + figure out the sequence of events. If your Kermit program doesn't have + PTY support, then the commands are restricted to those using standard + i/o, including certain shells, interactive text-mode "hardcopy" + editors like ex, and so on. + + If you are using the PTY interface, you should be aware that it runs + the given program or command directly on the pty, without any + intervening shell to interpret metacharacters, redirectors, etc. If + you need this sort of thing, include the appropriate shell invocation + as part of your command; for example: + + pty echo * + + just echoes "*"; whereas: + + pty ksh -c "echo *" + + echoes all the filenames that ksh finds matching "*". + + Similarly for redirection: + + set host /pty ksh -c "cat > foo" ; Note: use shell quoting rules here + set transmit eof \4 + transmit bar + + And for that matter, for built-in shell commands: + + set host /pty ksh -c "for i in *; do echo $i; done" + + The PIPE interface, on the other hand, invokes the shell + automatically, so: + + pipe echo * + + prints filenames, not "*". + _________________________________________________________________ + + 2.9. X.25 Networking + + X.25 networking is documented in [416]Using C-Kermit, 2nd Edition. + When the book was published, X.25 was available only in SunOS, + Solaris, and Stratus VOS. Unlike TCP/IP, X.25 APIs are not + standardized; each vendor's X.25 libraries and services (if they have + them at all) are unique. + + This section describes new additions. + _________________________________________________________________ + + 2.9.1. IBM AIXLink/X.25 Network Provider Interface for AIX + + Support for X.25 was added via IBM's Network Provider Interface (NPI), + AIXLink/X.25 1.1, to the AIX 4.x version of C-Kermit 7.0. + Unfortunately, AIXLink/X.25 is a rather bare-bones facility, lacking + in particular any form of PAD support (X.3, X.28, X.29). Thus, the AIX + version of C-Kermit, when built to include X.25 networking, has + neither a PAD command, nor a SET PAD command. The same is true for the + underlying AIX system: no PAD support. Thus it is not possible to have + an interactive shell session over an X.25 connection into an AIX + system (as far as we know), even from X.25-capable Kermit versions + (such as Solaris or VOS) that do include PAD support. + + Thus the X.25 capabilities in AIX C-Kermit are limited to peer-to-peer + connections, e.g. from a C-Kermit client to a C-Kermit server. Unlike + the Solaris, SunOS, and VOS versions, the AIX version can accept + incoming X.25 connections: + + set network type x.25 + if fail stop 1 Sorry - no X.25 support + ; Put any desired DISABLE or ENABLE or SET commands here. + set host /server * + if fail stop 1 X.25 "set host *" failed + + And then access it from the client as follows: + + set network type x.25 + if fail stop 1 Sorry - no X.25 support + set host xxxxxxx ; Specify the X.25/X.121 address + if fail stop 1 Can't open connection + + And at this point the client can use the full range of client + commands: SEND, GET, REMOTE xxx, FINISH, BYE. + + The AIX version also adds two new variables: + + \v(x25local_nua) + The local X.25 address. + + \v(x25remote_nua) + The X.25 address of the host on the other end of the + connection. + + C-Kermit's AIX X.25 client has not been tested against anything other + than a C-Kermit X.25 server on AIX. It is not known if it will + interoperate with C-Kermit servers on Solaris, SunOS, or VOS. + + To make an X.25 connection from AIX C-Kermit, you must: + + set x25 call-user-data xxxx + + where xxxx can be any even-length string of hexadecimal digits, e.g. + 123ABC. + _________________________________________________________________ + + 2.9.2. HP-UX X.25 + + Although C-Kermit presently does not include built-in support for + HP-UX X.25, it can still be used to make X.25 connections as follows: + start Kermit and tell it to: + + set prefixing all + set parity space + pty padem address + + This should work in HP-UX 9.00 and later (see [417]Section 2.7). If + you have an earlier HP-UX version, or the PTY interface doesn't work + or isn't available, try: + + set prefixing all + set parity space + pipe padem address + + Failing that, use Kermit to telnet to localhost and then after logging + back in, start padem as you would normally do to connect over X.25. + _________________________________________________________________ + + 2.10. Additional Serial Port Controls + + C-Kermit 7.0 adds the following commands for greater control over + serial ports. These commands are available only in C-Kermit versions + whose underlying operating systems provide the corresponding services + (such as POSIX and UNIX System V), and even then their successful + operation depends on the capabilities of the specific device and + driver. + + SET DISCONNECT { ON, OFF } + On a SET LINE or SET PORT connection with SET CARRIER ON or + AUTO, if the carrier signal drops during the connection, + indicating that the connection has been lost, and C-Kermit + notices it, this setting governs what happens next. With SET + DISCONNECT OFF, which is consistent with previous behavior, and + therefore the default, C-Kermit continues to keep the device + open and allocated. With SET DISCONNECT ON, C-Kermit + automatically closes and releases the device when it senses a + carrier on-to-off transition, thus allowing others to use it. + However, it remains the default device for i/o (DIAL, REDIAL, + INPUT, SEND, CONNECT, etc), so if a subsequent i/o command is + given, the device is reopened if it is still available. When it + has been automatically closed in this manner, SHOW + COMMUNICATIONS puts "(closed)" after its name, and in UNIX, the + lockfile disappears -- both from SHOW COMM and from the + lockfile directory itself. Synonym: SET CLOSE-ON-DISCONNECT. + + SET EXIT ON-DISCONNECT { ON, OFF } + Like DISCONNECT, but makes the program exit if a connection + drops. + + Note that SET CLOSE-ON-DISCONNECT and SET EXIT ON-DISCONNECT apply + only to connections that drop; they do not apply to connections that + can't be made in the first place. For example, they have no effect + when a SET LINE, SET HOST, TELNET, or DIAL command fails. + + HANGUP + If [CLOSE-ON-]DISCONNECT is ON, and the HANGUP command is given + on a serial device, and the carrier signal is no longer present + after the HANGUP command, the device is closed and released. + + SET PARITY HARDWARE { EVEN, ODD } + Unlike SET PARITY { EVEN, ODD, MARK, SPACE }, which selects 7 + data bits plus the indicated kind of parity (to be done in + software by Kermit itself), SET PARITY HARDWARE selects 8 data + bits plus even or odd parity, to be done by the underlying + hardware, operating system, or device driver. This command is + effective only with a SET LINE or SET PORT device. That is, it + has no effect in remote mode, nor on network connections. There + is presently no method for selecting 8 data bits plus mark or + space parity. If hardware parity is in effect, the variable + \v(hwparity) is set to "even" or "odd". Note: some platforms + might also support settings of SPACE, MARK, or NONE. + + SET STOP-BITS { 1, 2 } + This tells the number of 1-bits to insert after an outbound + character's data and parity bits, to separate it from the next + character. Normally 1. Choosing 2 stop bits should do no harm, + but will slow down serial transmission by approximately 10 + percent. Historically, 2 stop bits were used with Teletypes (at + 110 bps or below) for print-head recovery time. There is + presently no method for choosing any number of stop bits + besides 1 and 2. + + SET SERIAL [ dps ] + dps stands for Data-bits, Parity, Stop-bits. This is the + notation familiar to many people for serial port configuration: + 7E1, 8N1, 7O2, etc. The data bits number also becomes the + TERMINAL BYTESIZE setting. The second character is E for Even, + O for Odd, M for Mark, S for Space, or N for None. The list of + available options depends on the capabilities of the specific + platform. If dps is omitted, 8N1 is used. Type "set serial ?" + for a list of available choices. Examples: + + SET SERIAL 7E1 + Equivalent to SET PARITY EVEN, SET STOP-BITS 1, SET TERM + BYTE 7. + + SET SERIAL 8N1 + Equivalent to SET PARITY NONE, SET STOP-BITS 1, SET TERM + BYTE 8. + + SET SERIAL 7E2 + Equivalent to SET PARITY EVEN and SET STOP-BITS 2, SET + TERM BYTE 7. + + SET SERIAL 8E2 + Same as SET PARITY HARDWARE EVEN, SET STOP-BITS 2, SET + TERM BYTE 8. + + SET SERIAL + Same as SET PARITY NONE and SET STOP-BITS 1, SET TERM + BYTE 8. + + Notes: + + * The SET SERIAL xx2 options are available only in Kermit versions + where the SET PARITY HARDWARE command is also available. (SHOW + FEATURES includes "HWPARITY" in its options list.) + * The SET SERIAL 7xx and 8N1 options affect the software parity + setting, even for network connections. + * As noted in the manual, selecting 8 data bits does not give you + 8-bit terminal sessions in CONNECT mode unless you also SET + TERMINAL BYTESIZE 8. The default terminal bytesize remains 7, to + protect against the situation where the remote host is generating + parity but you don't know about it. If the terminal bytesize was 8 + by default and you CONNECTed to such a host, you would see only + garbage on your screen. + * If you do not give a SET STOP-BITS or SET SET SERIAL command, + C-Kermit does not attempt to set the device's stop bits; instead, + it uses whatever setting the device uses when not given explicit + instructions about stop bits. + + SHOW COMMUNICATIONS displays the current settings. Stop bits and + hardware parity are shown only for SET PORT / SET LINE (serial) + devices, since they do not apply to network connections or to remote + mode. STOP-BITS is shown as "(default)" if you have not given an + explicit SET STOP-BITS or SET SERIAL command. + + The \v(serial) variable shows the SET SERIAL setting (8N1, 7E1, etc). + _________________________________________________________________ + + 2.11. Getting Access to the Dialout Device + + This section is for UNIX only; note the special words about QNX at + the end. Also see [418]Section 2.0 for SET LINE switches, + particularly the /SHARE switch for VMS only. + + C-Kermit does its best to obey the UUCP lockfile conventions of each + platform (machine, operating system, OS version) where it runs, if + that platform uses UUCP. + + But simply obeying the conventions is often not good enough, due to + the increasing likelihood that a particular serial device might have + more than one name (e.g. /dev/tty00 and /dev/term/00 are the same + device in Unixware 7; /dev/cua and /dev/cufa are the same device in + NeXTSTEP), plus the increasingly widespread use of symlinks for device + names, such as /dev/modem. + + C-Kermit 7.0 goes to greater lengths than previous versions to + successfully interlock with other communications program (and other + instances of Kermit itself); for example, by: + + * Creation of dual lockfiles whenever a symlink is used; one for the + link name and one for the real name. + * Creation of dual lockfiles in HP-UX according to HP rules. + * Creation of dual uppercase/lowercase lockfile names in SCO + UNIX/ODT/OSR5. + * The use of ttylock() in versions of AIX where it works. + * The use, wherever possible, of lockfile names based on + inode/major/minor device number rather than device name. + + See the [419]ckuins.txt and [420]ckubwr.txt files for details. + + QNX is almost unique among UNIX varieties in having no UUCP programs + nor UUCP-oriented dialout-device locking conventions. QNX does, + however, allow a program to get the device open count. This can not be + a reliable form of locking unless all applications do it (and they + don't), so by default, Kermit uses this information only for printing + a warning message such as: + + C-Kermit>set line /dev/ser1 + WARNING - "/dev/ser1" looks busy... + + However, if you want to use it as a lock, you can do so with: + + SET QNX-PORT-LOCK { ON, OFF } + + QNX-PORT-LOCK is OFF by default; if you set in ON, C-Kermit fails to + open any dialout device when its open count indicates that another + process has it open. SHOW COMM (in QNX only) displays the setting, and + if you have a port open, it also shows the current open count (with + C-Kermit's own access always counting as 1). + _________________________________________________________________ + + 2.12. The Connection Log + + C-Kermit 7.0 adds the ability to log connections, so you can see where + you've been and have a record of calls you've made. A connection is + defined as any communications session that is begun by SET LINE, SET + PORT, DIAL, SET HOST, TELNET, or RLOGIN. Connections are not logged + unless you request it; the command is: + + LOG CX [ filename [ { NEW, APPEND } ] ] + Enables logging of connections in the given file. If the + trailing { NEW, APPEND } keyword is omitted, the file is opened + for appending; i.e. new records are written to the end. If NEW + is specified, a new file is created; if a file of the same name + already existed, it is overwritten. If the filename is omitted, + CX.LOG in your home (login) directory is used (note: + uppercase). To accept all defaults, just use "log connections" + (or "l c" for short). Synonym: LOG CONNECTIONS. + + CLOSE CX-LOG + This closes the connection log if it was open. (Note, the CLOSE + CONNECTION command closes the connection itself). + + SHOW CX + This shows your current connection, if any, including the + elapsed time (since you opened it). Synonym: SHOW CONNECTION. + + \v(cx_time) + This variable shows the elapsed time of your current + connection, or if there is no current connection, of your most + recent connection, of if there have been no connections, 0. + + The connection contains one line per connection, of the form: + + yyyymmdd hh:mm:ss username pid p=v [ p=v [ ... ] ] + + where the timestamp (in columns 1-18) shows when the connection was + made; username is the login identity of the person who made the + connection; pid is Kermit's process ID when it made the connection. + The p's are parameters that depend on the type of connection, and the + v's are their values: + + T = Connection Type (TCP, SERIAL, DIAL, DECNET, etc). + H = The name of the Host from which the connection was made. + N = Destination phone Number or Network host name or address. + D = Serial connections only: Device name. + O = Dialed calls only: Originating country code & area code if known. + E = Elapsed time in hh:mm:ss format (or hhh:mm:ss, etc). + + If you always want to keep a connection log, simply add: + + log connections + + to your C-Kermit customization file. Note, however, that if you make a + lot of connections, your CX.LOG will grow and grow. You can handle + this by adding a "logrotate" procedure like the following to your + customization file, before the "log connections" command: + + define LOGROTATE { ; Define LOGROTATE macro + local \%i \%m \%d \%n \%f MAX + def MAX 4 ; How many months to keep + if not def \%1 - ; No argument given + end 1 \%0: No filename given + if not = 1 \ffiles(\%1) - ; Exactly 1 file must match + end 1 \%0: \%1 - File not found + .\%d := \fsubstr(\fdate(\%1),1,6) ; Arg OK - get file year & month + if = \%d - ; Compare file year & month + \fsubstr(\v(ndate),1,6) - ; with current year & month + end 0 ; Same year & month - done + rename \%1 \%1.\%d ; Different - rename file + .\%n := \ffiles(\%1.*) ; How many old files + if < \%n \m(MAX) end 0 ; Not enough to rotate + .\%m := \%1.999999 ; Initial compare string + for \%i 1 \%n 1 { ; Loop thru old logs + .\%f := \fnextfile() ; Get next file name + if llt \%f \%m .\%m := \%f ; If this one older remember it + } + delete \%m ; Delete the oldest one + } + log connections ; Now open the (possibly new) log + logrotate \v(home)CX.LOG ; Run the LOGROTATE macro + + As you can see, this compares the yyyymm portion of the modification + date (\fdate()) of the given file (\%1) with the current yyyymm. If + they differ, the current file has the yyyymm suffix (from its most + recent modification date) appended to its name. Then we search through + all other such files, find the oldest one, and delete it. Thus the + current log, plus the logs from the most recent four months, are kept. + This is all done automatically every time you start C-Kermit. + + On multiuser systems, it is possible to keep a single, shared, + system-wide connection log, but this is not recommended since (a) it + requires you keep a publicly write-accessible logfile (a glaring + target for mischief), and (b) it would require each user to log to + that file and not disable logging. A better method for logging + connections, in UNIX at least, is syslogging (see [421]ckuins.txt + Section 15 and [422]Section 4.2 of the [423]IKSD Administration Guide + for details). + _________________________________________________________________ + + 2.13. Automatic Connection-Specific Flow Control Selection + + Beginning in C-Kermit 7.0, the appropriate flow-control method for + each connection type is kept in a table, for example: + + Remote: NONE + Modem: RTS/CTS + Direct-Serial: NONE + TCPIP: NONE + + The size of the table and values for each connection type can vary + from platform to platform. Type "set flow ?" for a list of available + flow-control types. + + The table is used to automatically select the appropriate kind of flow + control whenever you make a connection. You can display the table + with: + + SHOW FLOW-CONTROL + + The defaults are as follows: + + Remote: + NONE or XON/XOFF. This is because C-Kermit is not allowed to + find out what type of connection the incoming user has (*). No + kind of flow control will work on every kind of connection, + including (unexpectedly) KEEP, which we would have liked to + use, but not turning off flow control at the remote end during + file transfer on TCP/IP connections is fatal to the transfer + (except in VMS and HP-UX, where it must be set to Xon/Xoff!) + Therefore if you are dialing in to a serial port on a server + (UNIX or VMS) where C-Kermit is running, you will need to tell + C-Kermit to "set flow keep" before transferring files (assuming + the modem and port are configured correctly by the system + administrator; otherwise you'll need to give a specific kind of + flow control, e.g. "set flow xon/xoff"), so in this case + C-Kermit will not disable flow control, as it must do when you + are coming via Telnet (directly or through a terminal server, + except on VMS and HP-UX). + + Modem: + This applies when you dial out with a modem. In this case, the + MODEM FLOW-CONTROL setting takes affect after the SET FLOW + setting, so it can pick the most appropriate flow control for + the combination of the particular modem and the + computer/port/driver that is dialing. + + Direct-Serial: + The default here is NONE because C-Kermit has no way of knowing + what kind of flow control, if any, is or can be done by the + device at the other end of the connection. RTS/CTS would be a + bad choice here, because if the CTS signal is not asserted, the + connection will hang. And since direct connections are often + made with 3-wire cables, there is a good chance the CTS signal + will not be received. + + TCPIP: + NONE, since TCP and IP provide their own flow control + transparently to the application, except in VMS, where Xon/Xoff + is the default due to the requirements of the VMS TCP/IP + products. + + Other networks: + NONE, since networks should provide their flow control + transparently to the application. + + (*) This is possibly the worst feature of UNIX, VMS, and other + platforms where C-Kermit runs. If C-Kermit was able to ask the + operating system what kind of connection it had to the user, it could + set up many things for you automatically. + + You can modify the default-flow-control table with: + + SET FLOW-CONTROL /xxx { NONE, KEEP, RTS/CTS, XON/XOFF, ... } + + where "xxx" is the connection type, e.g. + + SET FLOW /REMOTE NONE + SET FLOW /DIRECT RTS/CTS + + If you leave out the switch, SET FLOW works as before, choosing the + flow control method to be used on the current connection: + + SET FLOW XON/XOFF + + Thus, whenever you make a connection with SET PORT, SET LINE, DIAL, + SET HOST, TELNET, RLOGIN, etc, an appropriate form of flow control is + selected automatically. You can override the automatic selection with + a subsequent SET FLOW command, such as SET FLOW NONE (no switch + included). + + The flow control is changed automatically too when you give a SET + MODEM TYPE command. For example, suppose your operating system (say + Linux) supports hardware flow control (RTS/CTS). Now suppose you give + the following commands: + + set line /dev/ttyS2 ; Automatically sets flow to NONE + set modem type usr ; Automatically sets flow to RTS/CTS + set modem type rolm ; Doesn't support RTS/CTS so now flow is XON/XOFF + + IMPORTANT: This new feature tends to make the order of SET LINE/HOST + and SET FLOW commands matter, where it didn't before. For example, in + VMS: + + SET FLOW KEEP + SET LINE TTA0: + + the SET LINE undoes the SET FLOW KEEP command; the sequence now must + be: + + SET FLOW /DIRECT KEEP + SET LINE TTA0: + + or: + + SET LINE TTA0: + SET FLOW KEEP + _________________________________________________________________ + + 2.14. Trapping Connection Establishment and Loss + + If you define a macro called ON_OPEN, it is executed any time that a + SET LINE, SET PORT, SET HOST, TELNET, RLOGIN or similar command + succeeds in opening a connection. The argument is the host or device + name (as shown by SHOW COMMUNICATIONS, and the same as \v(line)). This + macro can be used for all sorts of things, like automatically setting + connection- or host-specific parameters when the connection is opened. + Example: + + def ON_OPEN { + switch \%1 { + :abccorp.com, set reliable off, break + :xyzcorp.com, set receive packet-length 1000, break + etc etc... + } + } + + If you define a macro called ON_CLOSE, it will be executed any time + that a SET LINE, SET PORT, SET HOST, TELNET, RLOGIN or any other kind + of connection that C-Kermit has made is closed, either by the remote + or by a local CLOSE, HANGUP, or EXIT command or other local action, + such as when a new connection is opened before an old one was + explicitly closed. + + As soon as C-Kermit notices the connection has been closed, the + ON_CLOSE macro is invoked at (a) the top of the command parsing loop, + or (b) when a connection is closed implicitly by a command such as SET + LINE that closes any open connection prior to making a new connection, + or (c) when C-Kermit closes an open connection in the act of exiting. + + The ON_CLOSE macro was inspired by the neverending quest to unite + Kermit and SSH. In this case using the "tunnel" mechanism: + + def TUNNEL { ; \%1 = host to tunnel to + local \%p + if not def \%1 stop 1 + assign tunnelhost \%1 ; Make global copy + undef on_close + set macro error off + close connection ; Ignore any error + open !read tunnel start \%1 + read \%p ; Get port number + if fail stop 1 Tunnel failure: \%1 + close read + if fail stop 1 Tunnel failure: \%1 ; See [424]Section 4.2.8.1 + assign on_close { ; Set up close handler + echo Closing tunnel: \m(tunnelhost) + !tunnel stop \m(tunnelhost) + undef on_close + } + set host localhost:\%p /telnet + if success end 0 + undef on_close + stop 1 Connection failure: \%1 + } + + In this case, when the connection stops, we also need to shut down the + tunnel, even if it is at a later time after TUNNEL has finished + executing. This way we can escape back, reconnect, transfer files, and + so on until the connection is broken by logging out from the remote, + or by explicitly closing it, or by EXITing from C-Kermit, at which + time the tunnel is shut down. + + When the connection is closed, no matter how, the ON_CLOSE macro + executes and then undefines (destroys) itself, since we don't want to + be closing tunnels in the future when we close subsequent connections. + + Other such tricks can be imagined, including ending ON_CLOSE with a + STOP command to force the command stack to be peeled all the way back + to the top, for example in a deeply nested script that depends on the + connection being open: + + def on_close { stop 1 CONNECTION LOST } + + When C-Kermit invokes the ON_CLOSE macro, it supplies one argument + (\%1): the reason the connection was closed as a number, one of the + following: + + 2 - Fatal failure to negotiate a required item on a network connection. + 1 - Closed by C-Kermit command. + 0 - All others (normally closed by remote). + + which may be used for any purpose; for example, to add a comment to + the connection log: + + def on_close { + local \%m + if not open cx end 0 + switch \%1 { + :0, .\%m = Closed by remote, break + :1, .\%m = Closed by me, break + :2, .\%m = Network protocol negotiation failure, break + } + if def \%m writeln cx {# \%m} + } + _________________________________________________________________ + + 2.15. Contacting Web Servers with the HTTP Command + + C-Kermit 7.0 (at this writing, the UNIX version only) supports direct + contact and interaction with Web servers via HTTP 1.0 protocol. To + make a connection, use Kermit's normal method for making a TCP/IP + connection, but specify the HTTP port: + + SET HOST host http [ switches ] + + where host is the IP hostname or address, and http is the name of the + TCP port for the Web server. Relevant switches include: + + /RAW + Treat the connection as a transparent binary pipe. This switch + may be required if a port other than 'http' is used. + + /SSL + Make an secure private connection with SSL (only if SSL support + is included in your version of Kermit). In this case the port + name might need to be https rather than http, e.g. "set host + secureserver.xyxcorp.com https /ssl". + + /TLS + Make an secure private connection with TLS (only if TLS support + is included in your version of Kermit). In this case the port + name would be https rather than http. + + Then you can issue an HTTP command. In most cases, the server closes + the connection when the command is complete. Example: + + SET HOST www.columbia.edu http + IF FAIL EXIT 1 Can't contact server + HTTP GET kermit/index.html + + At this point the connection is closed, since that's how HTTP 1.0 + works. If you want to perform additional operations, you must + establish a new connection with another SET HOST command. + + The HTTP command acts as a client to the Web server, except instead of + displaying the results like a Web browser would, it stores them. Any + HTTP command can (but need not) include any or all of the following + switches: + + /AGENT:user-agent + Identifies the client to the server; "C-Kermit" or "Kermit-95" + by default. + + /HEADER:header-line + Used for specifying any optional headers. A list of headers is + provided using braces for grouping: + + /HEADER:{{tag:value}{tag:value}...} + + For a listing of valid tag value and value formats see [425]RFC + 1945: Hypertext Transfer Protocol -- HTTP/1.0. A maximum of + eight headers may be specified. + + /USER:name + In case a page requires a username for access. + + /PASSWORD:password + In case a page requires a password for access. + + /ARRAY:arrayname + Tells Kermit to store the response headers in the given array, + one line per element. The array need not be declared in + advance. Example: + + C-Kermit? http /array:c get kermit/index.html + C-Kermit? show array c + Dimension = 9 + 1. Date: Fri, 26 Nov 1999 23:12:22 GMT + 2. Server: Apache/1.3.4 (Unix) + 3. Last-Modified: Mon, 06 Sep 1999 22:35:58 GMT + 4. ETag: "bc049-f72-37d441ce" + 5. Accept-Ranges: bytes + 6. Content-Length: 3954 + 7. Connection: close + 8. Content-Type: text/html + + As you can see, the header lines are like MIME e-mail header lines: + identifier, colon, value. The /ARRAY switch is the only method + available to a script to process the server responses for a POST or + PUT command. + + The HTTP commands are: + + HTTP [ switches ] GET remote-filename [ local-filename ] + Retrieves the named file. If a local-filename is given, the + file is stored locally under that name; otherwise it is stored + with its own name. + + HTTP [ switches ] HEAD remote-filename local-filename + Like GET except without actually getting the file; instead it + gets only the headers, storing them into the given file, whose + name must be given, one line per header item, as shown above in + the /ARRAY: switch description. + + HTTP [ switches ] INDEX remote-directory [ local-filename ] + Retrieves the file listing for the given server directory. + NOTE: This command is not supported by most Web servers. + + HTTP [ switches ] POST [ /MIME-TYPE:type ] local-file remote-file + Used to send a response as if it were sent from a form. The + data to be posted must be read from a file. + + HTTP [ switches ] PUT [ /MIME-TYPE:type ] local-file remote-file + Uploads a local file to a server file. + + HTTP [ switches ] DELETE remote-filename + Instructs the server to delete the specified filename. + _________________________________________________________________ + + 3. TERMINAL CONNECTION + + 3.1. CONNECT Command Switches + + The following switches (see [426]Section 1.5) were added to the + CONNECT command in 7.0: + + /QUIETLY + Don't print the "Connecting to..." or "Back at..." messages. CQ + is an invisible command synonym for CONNECT /QUIETLY. + + /TRIGGER:string + Specify a trigger or triggers ([427]Section 3.2) effective for + this CONNECT command only, temporarily overriding any current + SET TERMINAL TRIGGER values ([428]Section 3.2). + + Note: Other switches might also be available; type "connect ?" for a + list, "help connect" for a description of each. + _________________________________________________________________ + + 3.2. Triggers + + Triggers were added for UNIX, VMS, AOS/VS, and K95 in C-Kermit 7.0. + + SET TERMINAL TRIGGER string + Tells C-Kermit to look for the given string during all + subsequent CONNECT sessions, and if seen, to return to command + mode automatically, as if you had escaped back manually. If the + string includes any spaces, you must enclose it in braces. + Example: + + set terminal trigger {NO CARRIER} + + Comparisons are made after character-set translation. + + If a string is to include a literal brace character, precede it with a + backslash: + + ; My modem always makes this noise when the connection is lost: + set terminal trigger |||ppp\{\{\{\{UUUUUUU + + If you want Kermit to look for more than one string simultaneously, + use the following syntax: + + set terminal trigger {{string1}{string2}...{stringn}} + + In this case, C-Kermit will return to command mode automatically if + any of the given strings is encountered. Up to 8 strings may be + specified. + + If the most recent return to command mode was caused by a trigger, the + new variable, \v(trigger), shows the trigger value; otherwise + \v(trigger) is empty. + + The SHOW TRIGGER command displays the SET TERMINAL TRIGGER values as + well as the \v(trigger) value. + _________________________________________________________________ + + 3.3. Transparent Printing + + As noted in the manual, C-Kermit's CONNECT command on UNIX is not a + terminal emulator, but rather a "semitransparent pipe" between the + terminal or emulator you are using to access C-Kermit, and the remote + host to which C-Kermit is connected. The "semitransparent" qualifier + is because of character-set translation as well as several actions + taken by the emulator in response to the characters or strings that + pass through it, such as APCs, Kermit packets (autodownload), + triggers, etc. + + The UNIX version of C-Kermit 7.0 adds another such action: Transparent + printing, also called Controller printing (as distinct from Autoprint + or line or screen print). It is intended mainly for use on UNIX + workstation consoles (as opposed to remote logins), but with some care + can also be used when accessing C-Kermit remotely. + + Transparent printing is related to APC by sharing C-Kermit's built-in + ANSI escape-sequence parser to detect "printer on" and "printer off" + sequences from the host. When the printer-on sequence is received, all + subsequent arriving characters -- including NUL, control characters, + and escape sequences -- are sent to the SET PRINTER device instead of + to your screen until the printer-off sequence is received, or you + escape back, whichever happens first. These bytes are not translated + or modified or filtered in any way by Kermit (except for possibly + stripping of the 8th bit, as noted below), but if filtering or + translation is desired, this can be accomplished by your SET PRINTER + selection (e.g. by choosing a pipeline of filters). + + By default, your SET PRINTER device is your default UNIX printer, but + it can also be a file, a command, or the null device (which causes all + printer material to be discarded). See [429]Using C-Kermit, 2nd Ed., + p.41 for details. + + Transparent printing is controlled by the command: + + SET TERMINAL PRINT { ON, OFF } + When ON, transparent-print sequences are obeyed, and printing + occurs on the system where C-Kermit is running. When OFF, + transparent print sequences are ignored and passed through to + your actual terminal or emulator, along with the data they + enclose. OFF is the default, for compatibility with earlier + C-Kermit releases. As noted in the manual, when the current SET + PRINTER device is a file, transparent-print material is + appended to it; the file is not overwritten. + + SET TERMINAL BYTESIZE { 7, 8 } + SET PARITY { EVEN, ODD, MARK, SPACE, NONE } + If the terminal bytesize is 7, or PARITY is not NONE, the 8th + bit of each byte is stripped prior to printing. + + The transparent-print escape sequences are: + + [5i + Printer On. Send all subsequent incoming bytes to the printer + without any kind of filtering, translation, or alteration. + Note: stands for ASCII character number 27 (decimal), + Escape. + + [4i + Printer Off. Resume displaying incoming bytes on the screen. + + These are the same sequences used by DEC VT100 and higher terminals + and other ANSI X3.64 and ISO 6429 compatible terminals. There is no + provision for selecting other printer-control sequences. + + Restrictions: + + 1. You must SET TERM TRANSPARENT-PRINT ON before you can use this + feature. + 2. Only the 7-bit forms of the escape sequences are supported. The + 8-bit CSI C1 control is not recognized. + 3. Autoprint is not supported, since this requires a full-fledged + terminal emulator with direct access to the screen. + 4. The start-print and stop-print sequences pass through to the + screen (there is no way to avoid this without causing unacceptable + delays or deadlocks in CONNECT mode). Thus if your terminal or + emulator also supports transparent printing via these same + sequences, an empty file will be sent to its printer. Normally + this has no effect. + + Point (4) is similar to the situation with autodownload and APC -- + when you have several Kermit clients in a chain, you should take care + that these features are enabled in only one of them. + + Example 1: + + set printer {|lpr -Plaser} ; Specify the printer (if not default). + set term print on ; Enable transparent printing. + set term byte 8 ; Enable 8-bit characters. + connect ; Enter CONNECT mode. + + Example 2: + + set printer /home/users/olga/printer.log ; Send printer material to a file. + + Example 3: + + set printer {| grep -v ^Received | lpr} ; Filter out some lines + + Then use "pcprint" or "vtprint" commands on the host to initiate + transparent print operations. See [430]Using C-Kermit, 2nd Ed., p.406 + for details. + + Here is a sample "pcprint" shell script for UNIX: + + #!/bin/sh + echo -n '[5i' + if [ $# -eq 0 ]; then + cat + else + cat $* + fi + echo -n '[4i' + # (end) + + (Replace "" by the actual ASCII Escape character and "" by + the ASCII Formfeed character). + + If you always want transparent printing enabled, put "set term print + on" in your C-Kermit customization file (~/.mykermrc in UNIX). The + "set term bytesize" selection, however, is a property of each separate + connection. + _________________________________________________________________ + + 3.4. Binary and Text Session Logs + + C-Kermit 7.0 corrects an oversight in earlier releases, in which + binary session logs (SET SESSION-LOG BINARY) translated character sets + and performed various formatting transformations (e.g. "newline mode") + before writing characters to the session log. In C-Kermit 7.0, + binary-mode session logging writes characters as they come in, before + anything (other that parity-bit stripping) is done to them. Text-mode + session logging records the characters after processing. + _________________________________________________________________ + + 4. FILE TRANSFER + + Every file is transferred either in text mode (which implies + record-format and character-set translation) or binary mode (in which + each byte is sent literally without any kind of conversion). The mode + in which a file is transferred is controlled by (a) the default mode, + in the absence of any other indications; (b) the SET FILE TYPE + command; (c) various automatic mechanisms based on client/server + negotiations, directory information or filename patterns, etc. + + The default FILE TYPE was changed from TEXT to BINARY in C-Kermit 7.0 + because: + + * Transferring a text file in binary mode does less damage than + transferring a binary file in text mode. + * Only binary-mode transfers can be recovered from the point of + failure. + * The automatic transfer-mode mechanisms switch to text mode on a + per-file basis anyway, so only those files that are not covered by + the automatic mechanisms are affected. + * All file transfers on the Web are done in binary mode, so people + are accustomed to it and expect it. + _________________________________________________________________ + + 4.0. BUG FIXES, MINOR CHANGES, AND CLARIFICATIONS + + 4.0.0. Filenames with Spaces + + Filenames that contain spaces are a major nuisance to a program like + Kermit, whose command language is line- and word-oriented, in which + words are separated by spaces and a filename is assumed to be a + "word". In general (unless noted otherwise in the description of a + particular command), there is only one way to refer to such files in + Kermit commands, and that is to enclose the name in braces: + + send {this file} + + Tells Kermit to send the file whose name is "this file" (two words, no + quotes). Of course, various circumlocutions are also possible, such + as: + + define \%a this file + send \%a + + BUT, perhaps contrary to expectation, you can't use "\32" to represent + the space: + + send this\32file + + does not work. Why? Because the Kermit parser, which must work on many + operating systems including Windows, has no way of knowing what you + mean by "this\32file". Do you mean a file whose name is "this file" in + the current directory? Or do you mean a file whose name is "32file" in + the "this" subdirectory of the current directory? Guessing won't do + here; Kermit must behave consistently and deterministically in all + cases on all platforms. + + Note that you can't use Esc or Tab within {...} for filename + completion, or question mark to get a filename list. However, you can + include wildcards; for example: + + send {* *} + + sends all files whose name contains a space. + + All things considered, it is best to avoid spaces in file and + directory names if you can. Also see [431]Section 5.4 on this topic. + _________________________________________________________________ + + 4.0.1. Packet out of Window + + C-Kermit 6.0 could send packets "out of window" if the window size was + greater than 1 and ACKs had arrived out of order. Fixed in 6.1. + _________________________________________________________________ + + 4.0.2. MOVE after ADD SEND-LIST + + ADD SEND-LIST followed by MOVE did not delete original files; fixed in + 6.1. Carrier loss was not detected during transfer; in 7.0 C-Kermit + checks for this (but results can not be guaranteed). In any case, the + protocol will eventually time out if the connection is lost. + _________________________________________________________________ + + 4.0.3. GET and RECEIVE As-Names + + In 5A(190) through 6.0.192, the GET and RECEIVE as-name did not + properly override the RECEIVE PATHNAMES setting. In 7.0 it does. + _________________________________________________________________ + + 4.0.4. New Brief Statistics Listing + + Version 7.0 adds a /BRIEF switch to the STATISTICS command, to display + a short file-transfer statistics report. /BRIEF is now the default. + Use /VERBOSE to see the full display, which is about 25 lines long. + _________________________________________________________________ + + 4.0.5. Improved FAST Command + + The preinstalled definition of the FAST macro did not take enough + factors into account. Now it sets packet lengths and window sizes + appropriate to the configuration. Furthermore, in IRIX only, it might + restrict the SEND packet length to 4000, to work around a bug in the + IRIX Telnet server, depending on the IRIX version (see + [432]ckubwr.txt, IRIX section). To see the built-in definition of the + FAST macro, type "show macro fast". To change it, simply define it to + be whatever you want -- it's just a macro, like any other. + _________________________________________________________________ + + 4.0.6. The SET SEND BACKUP Command + + Version 7.0 adds SET SEND BACKUP { ON, OFF }. This tells whether + backup files should be sent. Backup files are the ones created by + Kermit (and EMACS, and possibly other applications) to preserve old + copies of files when creating new ones with the same name. Kermit does + this when receiving a file and its FILE COLLISION setting is BACKUP + (or RENAME, in which case it the new file gets the backup name). On + most platforms, the backup name is formed by adding: + + .~n~ + + to the end of the filename, where "n" is a number. For example, if the + original file is oofa.txt, a backup file might be called: + + oofa.txt.~1~ + + (or oofa.txt.~2~, etc). If you SET SEND BACKUP OFF, this tells Kermit + not to send files that have backup names. Normally, SET SEND BACKUP is + ON (as shown by SHOW PROTOCOL), and backup files are sent if their + names match the SEND file specification. + + Also see PURGE, SET FILE COLLISION, SEND /NOBACKUP, DIRECTORY + /[NO]BACKUP. + _________________________________________________________________ + + 4.0.7. The SET { SEND, RECEIVE } VERSION-NUMBERS Command + + VMS Only. Normally when sending files, VMS C-Kermit strips the version + number. For example, if the file is FOO.BAR;34, the name is sent as + FOO.BAR (without the ";34"). If you want to keep version numbers on + when sending files, use SET SEND VERSION-NUMBERS ON. The effect + depends on the receiver. + + Normally when receiving files, and an incoming filename includes a + VMS-style version number (such as FOO.BAR;34) VMS C-Kermit strips it + before trying to create the new file; this way the new file receives + the next highest version number in the customary manner for VMS. If + you want version numbers on incoming filenames to be used in creating + the new files, use SET RECEIVE VERSION-NUMBERS ON. + + Normally these commands would be effective only when VMS C-Kermit is + exchanging files with a non-VMS Kermit program, since VMS-to-VMS + transfers use labeled mode unless you have gone out of your way to + defeat it. + + Example: You want to send all versions of all files in the current + directory from a VMS C-Kermit client to a UNIX C-Kermit server. Use: + + set send version-numbers on + send *.*;* + + The resulting Unix files will have VMS-style version numbers as part + of their name, for example "foo.bar;1", "foo.bar;2", etc. + + Now suppose you want to send these files from Unix to another VMS + system and preserve the version numbers. Again we have a Unix C-Kermit + server and VMS C-Kermit client. Give these commands to the client: + + set receive version-numbers on + get * + _________________________________________________________________ + + 4.0.8. The SET { SEND, RECEIVE } { MOVE-TO, RENAME-TO } Commands + + These commands are persistent global versions of the /MOVE-TO: and + /RENAME-TO: switches of the SEND, GET, and RECEIVE commands. They + should normally be used only when setting up a dedicated + transaction-processing application, in which each file is to be moved + or renamed immediately after, and only if, it is transferred + successfully, so that (for example) an independent, concurrent process + can notice when new files appear and process them immediately without + having to guess whether they are complete. + _________________________________________________________________ + + 4.0.9. SET FILE INCOMPLETE AUTO + + SET FILE INCOMPLETE { KEEP, DISCARD }, which tells whether to keep or + discard incompletely received files, has a new option, AUTO, which is + also the default. It means KEEP the incomplete file if the transfer is + in binary mode, otherwise DISCARD it. This reduces the chances that a + subsequent recovery operation (RESEND, REGET, etc) could produce a + corrupt file, since recovery works only for binary-mode transfers. + _________________________________________________________________ + + 4.1. FILE-TRANSFER FILENAME TEMPLATES + + File-transfer filename templates allow files to be renamed + automatically by the file sender, the receiver, or both, during + transfer of groups of files. + + 4.1.1. Templates in the As-Name + + Prior to C-Kermit 6.1 and Kermit 95 1.1.12 the only options that could + be used to affect the names of files being transferred were SET + FILENAMES { LITERAL, CONVERTED } and SET { SEND, RECEIVE } PATHNAMES { + ON, OFF }, plus the "as-name" feature of the SEND (MOVE, etc) and + RECEIVE commands. + + Previously, the as-name could be used only for a single file. For + example: + + SEND FOO BAR + + would send the file FOO under the name BAR, but: + + SEND *.TXT anything + + was not allowed, since it would give the same name to each file that + was sent. When receiving: + + RECEIVE FOO + + would rename the first incoming file to FOO before storing it on the + disk, but subsequent files would not be renamed to FOO, since this + would result in overwriting the same file repeatedly. Instead, they + were stored under the names they arrived with. + + Beginning in C-Kermit 6.1 and Kermit 95 1.1.12, it is possible to + specify as-names in SEND, RECEIVE, and related commands even for file + groups. This is accomplished by using replacement variables in the + as-name, along with optional material such character-string functions + and/or constant strings. An as-name containing replacement variables + is called a filename template. + + The key to filename templates is the new variable: + + \v(filename) + + During file transfer it is replaced by the name of each file currently + being transferred (after transfer, it is the name of the last file + transferred). + + So, for example: + + send *.txt \v(filename).new + + sends each file with its own name, but with ".new" appended to it. Of + course if the name already contains periods, this could confuse the + file receiver, so you can also achieve fancier effects with + constructions like: + + send *.txt \freplace(\v(filename),.,_).new + + which replaces all periods in the original filename by underscores, + and then appends ".new" to the result. So, for example, oofa.txt would + be sent as oofa_txt.new. + + Another new variable that is useful in this regard is \v(filenumber), + which is the ordinal number of the current file in the file group, so + you can also: + + send *.txt FILE\flpad(\v(filenum),2,0) + + resulting in a series of files called FILE00, FILE01, FILE02, etc. (At + the end of the transfer, \v(filenum) tells the number of files that + were transferred). + + If you specify a constant as-name when sending a file group: + + send *.txt thisnameonly + + Kermit complains and asks you to include replacement variables in the + as-name. You should generally use \v(filename) or \v(filenumber) for + this purpose, since other variables (with the possible exception of + date/time related variables) do not change from one file to the next. + But Kermit accepts any as-name at all that contains any kind of + variables for file group, even if the variable will not change. So: + + send *.txt \%a + + is accepted, but all files are sent with the same name (the value of + \%a, if it has one and it is constant). If the variable has no value + at all, the files are sent under their own names. + + Of course, the value of \%a in the previous example need not be + constant: + + define \%a FILE\flpad(\v(filenum),2,0)_at_\v(time) + send *.txt \%a + + The RECEIVE command, when given without an as-name, behaves as always, + storing all incoming files under the names they arrive with, subject + to SET FILE NAME and SET RECEIVE PATHNAMES modifications ([433]Section + 4.10). + + However, when an as-name is given in the RECEIVE command, it is + applied to all incoming files rather than to just the first. If it + does not contain replacement variables, then the current FILE + COLLISION setting governs the result. For example: + + receive foo + + will result in incoming files named foo, foo.~1~, foo.~2~, and so on, + with the default FILE COLLISION setting of BACKUP. If it does contain + replacement variables, of course they are used. + + When receiving files, the \v(filename) variable refers to the name + that was received in the incoming file-header packet, BEFORE any + processing by SET FILE NAMES or SET RECEIVE PATHNAMES. Since the + filenames in file-header packets are usually in uppercase, you would + need to convert them explicitly if you want them in lowercase, e.g.: + + receive \flower(\v(filename)).new + _________________________________________________________________ + + 4.1.2. Templates on the Command Line + + On the command-line, use templates as shown above as the -a option + argument, bearing in mind the propensity of UNIX and perhaps other + shells to treat backslash as a shell escape character. So in UNIX (for + example): + + kermit -s oofa.* -a x.\\v(filenum) + + By the way, this represents a change from 6.0 and earlier releases in + which the as-name (-a argument or otherwise) was not evaluated by the + command parser. Thus, for example, in VMS (where the shell does not + care about backslashes), it was possible to: + + kermit -s oofa.txt -a c:\tmp\oofa.txt + + Now backslashes in the as-name must be quoted not only for the shell + (if necessary) but also for Kermit itself: + + kermit -s oofa.txt -a c:\\tmp\\oofa.txt ; Kermit only + kermit -s oofa.txt -a c:\\\\tmp\\\\oofa.txt ; Shell and Kermit + + You can also use the \fliteral() function for this: + + kermit -s oofa.txt -a \fliteral(c:\tmp\oofa.txt) ; Kermit only + kermit -s oofa.txt -a \\fliteral(c:\\tmp\\oofa.txt) ; Shell and Kermit + _________________________________________________________________ + + 4.1.3. Post-Transfer Renaming + + Filename templates are now also useful in SET { SEND, RECEIVE } + RENAME-TO and in the /RENAME-TO: switch, that can be given to the + SEND, GET, or RECEIVE commands; this is similar to an as-name, but is + effective on a per-file basis if and only if the file was transferred + successfully. + + MOVE-TO and RENAME-TO address a requirement commonly stated for + transaction processing and similar systems. Suppose, for example, a + central system "X" accepts connections from multiple clients + simultaneously; a process on X waits for a file to appear and then + processes the file. This process must have a way of knowing when the + file has been completely and successfully transferred before it starts + to process it. This can be accomplished easily using C-Kermit's SET { + SEND, RECEIVE } { MOVE-TO, RENAME-TO } command or /MOVE-TO: or + /RENAME-TO: switches, described in [434]Sections 4.7.1 through + [435]4.7.3. + + Here's an example for the client side, in which files to be sent are + placed in a certain directory (/usr/olga/tosend in this example) by + another process when they are ready to go. This might be in a hospital + or big doctor's office, where medical insurance claims are entered at + a number of workstations, and then deposited in the "tosend" + directory, from which they are sent to a claims clearinghouse. We + assume the connection is already made and a Kermit server is on the + other end. + + local srcdir findir ; Declare local (automatic) variables + assign srcdir /usr/olga/tosend ; Local source directory (files to send) + assign findir /usr/olga/sent ; Where to move files after they are sent + log transactions ; Keep a log of transfers + cd \m(srcdir) ; Change to the source directory + while true { ; Loop forever... + send /move-to:\m(findir) * ; Send all files + sleep 60 ; Sleep a minute + } ; Go back and do it again + + Note how simple this is. Once each file is sent, it is moved so it + won't be sent again (you could also use SEND /RENAME-TO: or even SEND + /DELETE). If a transfer fails, the file is not moved and so we try + again to send it next time around. If there are no files to send, the + SEND command does nothing but a message is printed; you can avoid the + message by checking first to see if any files are in the directory: + + while true { ; Loop forever... + if > \ffiles(*) 0 - ; If there are any files + send /move-to:\m(findir) * ; send them. + sleep 60 ; Sleep a minute. + } ; Go back and do it again. + + It's even simpler on the server side (here again we assume the + connection is already in place): + + local rcvdir findir ; Declare local (automatic) variables + assign rcvdir /usr/ivan/tmp ; Temporary receiving directory + assign findir /usr/ivan/new ; Where to move files after reception + log transactions ; Keep a log of transfers + cd \m(rcvdir) ; Change to the source directory + set receive move-to \m(findir) ; Declare move-to directory. + server ; Enter server mode. + + A separate process (e.g. the medical claim-form decoder) can look for + files appearing in the /usr/ivan/new directory and process them with + every confidence that they have been completely received. + + Note that the use of MOVE-TO can result in moved files overwriting one + another (the application would normally avoid this by assigning each + transaction a unique, e.g. based on customer number and claim number). + But if filename collisions are a possibility in your application, + RENAME-TO might be a better choice; you can use any variables you like + in the template to ensure uniqueness of the RENAME-TO filename; for + example: + + SET RECEIVE RENAME-TO \v(filename)_\v(ndate)_\v(ntime)_\v(userid)_\v(pid) + _________________________________________________________________ + + 4.2. FILE-TRANSFER PIPES AND FILTERS + + 4.2.1. INTRODUCTION + + Beginning in C-Kermit 6.1 and Kermit 95 1.1.12, it is possible to send + from a command, or "pipe", as well as from a file, and to receive to a + pipe or command. In a typical example, we might want to transfer an + entire directory tree from one UNIX system to another (but without + using the methods described in [436]Sections 4.3 , [437]4.10, + [438]4.11, and [439]4.15). We could do this in multiple steps as + follows: + + 1. Create a tar archive of the desired directory tree + 2. Compress the tar archive + 3. Transfer it in binary mode to the other computer + 4. Decompress it + 5. Extract the directory tree from the tar archive + + But this is inconvenient and it requires a temporary file, which might + be larger than we have room for. + + The new pipe-transfer feature lets you do such things in a single + step, and without intermediate files. + + Additional new features, also discussed here, let you specify pre- and + post- processing filters for outbound and incoming files, and give you + a way to insert the output from shell or system commands into C-Kermit + commands. + + The file-transfer related features are available only with Kermit + protocol, not with any external protocols, nor with K95's built-in + XYZMODEM protocols (because XYZMODEM recovers from transmission errors + by rewinding the source file, and you can't rewind a pipe). + + This section begins by discussing the simple and straightforward use + of these features in UNIX, in which pipes and input/output redirection + are a fundamental component and therefore "just work", and then goes + on to discuss their operation in Windows and OS/2, where matters are + much more complicated. + _________________________________________________________________ + + 4.2.1.1. TERMINOLOGY + + Standard Input + This is a precise technical term denoting the normal source of + input for a command or program, which is the keyboard of your + terminal by default, but which can be redirected to a file or + pipe. + + Stdin + Abbreviation for Standard Input. + + Standard Output + A precise technical term denoting the normal destination for + output from a command or program, which is your terminal screen + by default, but which can be redirected to a file. + + Stdout + Abbreviation for Standard Output. + + Stdio + Abbreviation for Standard Input / Standard Output. + + I/O + Abbreviation for Input / Output. + + Shell + Text-based system command processor, such as the UNIX shell, + DOS COMMAND.COM, etc. + + Pipe + A mechanism by which the standard output of one program is sent + to the standard input of another. + + Pipeline + A series of programs connected by pipes. + _________________________________________________________________ + + 4.2.1.2. NOTATION + + In command descriptions, "command" is replaced by a shell or system + command or pipeline. The command names specified in these commands are + interpreted by your shell, just as if you were typing them at the + shell prompt, and so if they are in your PATH, they will be found in + the expected manner. Therefore you don't have to specify complete + pathnames for commands that are programs (but it shouldn't hurt if you + do). + + The normal notation for I/O redirection is as follows: + + < Read Stdin from the given file. + > Send Stdout to the given file. + | Send Stdout from the command on the left to the command on the right. + + Examples: + + sort < foo > bar + Sorts the lines in file "foo" and writes the results to file + "bar" + + grep -c "some text" *.txt | grep -v ":0" | sort | pr -3 | lpr + This is a command pipeline composed of 5 commands: + + grep -c "some text" *.txt + Looks in all files whose names end with ".txt" for the string + "some text" and writes to Stdout the names of each file + followed by a colon and the number of occurrences in each. + + grep -v ":0" + Prints to Stdout the lines from Stdin that do NOT contain the + string ":0", in this case, it removes the names of files that + do not contain "some text". + + sort + Sorts the lines from Stdin alphabetically to Stdout. + + pr -3 + Arranges the lines from Stdin in three columns. + + lpr + Prints its Stdin on the default printer. + + Note that the Kermit features described here work only with commands + that use Stdio. If you attempt to use them with commands whose input + and output can not be redirected, Kermit will most likely get stuck. + Kermit has no way of telling how an external command works, nor what + the syntax of the shell is, so it's up to you to make sure you use + these features only with redirectable commands. + + The quoting rules of your shell apply to the command. Thus in UNIX, + where C-Kermit tries to use your preferred shell for running commands, + shell "metacharacters" within commands must be escaped if they are to + be taken literally, using the methods normal for your shell. For + example, the UNIX tr (translate) command must have its arguments in + quotes: + + tr "[a-z]" "[A-Z]" + + otherwise the shell is likely to replace them by all filenames that + match, which is probably not what you want. This is also true when + using your shell directly, and has nothing to do with Kermit. + _________________________________________________________________ + + 4.2.1.3. SECURITY + + Some sites might not wish to allow access to system commands or + external programs from within Kermit. Such access, including all the + features described here, can be disabled in various ways: + + 1. When building from source code, include -DNOPUSH among the CFLAGS. + 2. At runtime, give the NOPUSH command. + 3. For server mode, give the DISABLE HOST command. + 4. Implicit use of pipes can be disabled as described in [440]Section + 4.2.4. + + Note: 3 and 4 are not necessary if you have done 1 or 2. + _________________________________________________________________ + + 4.2.2. Commands for Transferring from and to Pipes + + SEND /COMMAND sends data from a command or command pipeline, and + RECEIVE /COMMENT writes data to a command or pipeline. The GET + /COMMAND command asks a server to send material, and then writes the + incoming material to a command or pipeline. These features, along with + switches (like "/COMMAND", described in [441]Section 4.7) are new to + C-Kermit 6.1. The following synonyms are also provided: + + CSEND = SEND /COMMAND + CRECEIVE = RECEIVE /COMMAND + CGET = GET /COMMAND + + None of these commands can be used if a SEND or RECEIVE FILTER + (respectively, [442]Section 4.2.3) is in effect, or if a NOPUSH + command ([443]Section 4.2.1.3) has been given, or if the current + protocol is not Kermit. + _________________________________________________________________ + + 4.2.2.1. Sending from a Command + + SEND /COMMAND command [ as-name ] + SEND /AS-NAME:as-name /COMMAND command + CSEND command [ as-name ] + These three forms are the same. They work like the SEND + command, but instead of sending a file, it sends the standard + output of the given command, either under the command's own + name, or else with the given as-name. If the command contains + spaces, it must be enclosed in braces. Braces should also be + used for the as-name if it contains spaces. If braces are + included around either the command or the as-name, they are + removed after parsing but before use. As with SEND, the + transfer is in text or binary mode according the current FILE + TYPE setting, unless you override the global transfer mode by + including a /TEXT or /BINARY switch. The command must require + no input. + + When sending from a command or pipeline, C-Kermit has no way of + knowing in advance how much data will be sent, and so it can not send + the size to the other Kermit in the Attribute packet, and so the + receiving Kermit has no way of displaying "percent done" or a progress + bar (thermometer). + + Examples that make sense in text mode (illustrated by common UNIX + commands): + + SEND /COMMAND finger + CSEND finger + sends the current "finger" listing (who's logged in) under the + name "finger". The two forms "send /command" and "csend" are + equivalent; we won't bother showing them both in the rest of + the examples. + + SEND /COMMAND:{finger} + CSEND {finger} + Same as previous example (braces are removed from "{finger}"). + + SEND /COMMAND:{ finger } + CSEND { finger } + Same as previous example, but note that the spaces are kept. + This does not prevent the shell from running the "finger" + program, but its output is sent under the name " finger " (with + a leading and trailing space). + + SEND /COMMAND:finger /AS-NAME:userlist + CSEND finger userlist + sends the current finger listing under the name "userlist". + + SEND /COMMAND:{finger | sort -r} /AS-NAME:userlist + CSEND {finger | sort -r} userlist + sends the current finger listing, sorted in reverse order, + under the name "userlist". The braces are needed to distinguish + the command from the as-name. + + SEND /COMMAND:{finger | sort -r} /AS-NAME:{userlist} + CSEND {finger | sort -r} {userlist} + Same as previous example (braces are removed from + "{userlist}"). + + SEND /COMMAND:{finger | sort -r} + /AS-NAME:{\freplace(\v(filename),\32,_)} + + CSEND {finger | sort -r} {\freplace(\v(filename),\32,_)} + Like the previous example, but sends the output of the command + under the name of the command, but with all spaces (\32) + replaced by underscores, so the as-name is "finger_|_sort_-r". + + Examples that make sense in binary mode (three equivalent forms are + shown): + + SEND /COMMAND /BINARY {tar cf - . | gzip -c} mydir.tar.gz + SEND /COMMAND /BINARY /AS-NAME:mydir.tar.gz {tar cf - . | gzip -c} + CSEND /BINARY {tar cf - . | gzip -c} mydir.tar.gz + Makes a tar archive of the current directory, compresses it + with the GNU gzip program, and sends it as "mydir.tar.gz". The + other Kermit can, of course, just store it as a file, or it can + use CRECEIVE to uncompress and dearchive it as part of the + transfer process. + + When using a "pipeline" of commands in the command field, obviously, + the first command must not require any input, and the last command + should produce some output, and all intermediate commands should get + some input and produce some output. + _________________________________________________________________ + + 4.2.2.2. Receiving to a Command + + RECEIVE /COMMAND command + CRECEIVE command + This is like RECEIVE, except incoming material is written to + the standard input of the given command, in text or binary mode + according to the normal rules for file reception. Be sure to + include a redirector to a file (if the command normally writes + to standard output), or the output of the command won't go + anywhere. The command may contain spaces; braces are not + needed, but they are removed if used. + + WARNING: C-Kermit has no way of knowing anything about the command, or + even whether it is a command. Thus this command will always cause + C-Kermit to enter protocol mode, as long as some text is specified in + the command field. However, if the text does not correspond to a + command, the transfer will eventually fail with a message such as + "Error writing data" or "Failure to close file". + + Examples for text mode (in UNIX): + + RECEIVE /COMMAND sort -r > reverse.txt + CRECEIVE sort -r > reverse.txt + The text that is received is sorted in reverse order and stored + in the file "reverse.txt". The two forms shown are equivalent. + + RECEIVE /COMMAND {sort -r > reverse.txt} + CRECEIVE {sort -r > reverse.txt} + The same as the previous example; if braces are included, they + are simply removed. + + RECEIVE /COMMAND {sort -r > \flower(\v(filename)).reverse} + CRECEIVE {sort -r > \flower(\v(filename)).reverse} + Same but stores result under the incoming filename, lowercased, + and with ".reverse" appended to it. + + RECEIVE /COMMAND sort + CRECEIVE sort + Does nothing useful, since the output of sort has nowhere to + go. + + RECEIVE /COMMAND sort -r | pr -3 | lpr -Plaserjet + CRECEIVE sort -r | pr -3 | lpr -Plaserjet + The text that is received is sorted in reverse order, arranged + into three columns, and sent to the "laserjet" printer. + + Examples for binary mode: + + RECEIVE /COMMAND:{gunzip -c | tar xf -} + CRECEIVE {gunzip -c | tar xf -} + Assuming the data that is received is a compressed tar archive, + uncompresses the archive and passes it to tar for extraction. + In this case the braces are needed because otherwise the final + "-" would be taken as a command continuation character (see + [444]Using C-Kermit, 2nd Edition, p.33). + + GET /COMMAND remote-file command + GET /COMMAND /AS-NAME:command remote-file + CGET remote-file command + This command tells the Kermit client to send a GET request for + the given remote file to a Kermit server. Unlike GET, however, + the incoming material is written to a command, rather than to a + file. If the remote-file or the command contain spaces, they + must be enclosed in braces. The same cautions about the command + apply as for CRECEIVE. + + Examples (for UNIX): + + GET /COMMAND oofa.txt sort -r > oofa.new + GET /COMMAND {oofa.txt} {sort -r > oofa.new} + CGET oofa.txt sort -r > oofa.new + CGET {oofa.txt} {sort -r > oofa.new} + These four are equivalent. Each of them requests the server to + send its "oofa.txt" file, and as it arrives, it is sorted in + reverse order and written to "oofa.new". + + GET /COMMAND {profile exec a} lpr + GET /COMMAND {profile exec a} {lpr} + GET /COMMAND /AS-NAME:lpr {profile exec a} + GET /COMMAND /AS-NAME:{lpr} {profile exec a} + GET /COMMAND /AS:lpr {profile exec a} + CGET {profile exec a} lpr + CGET {profile exec a} {lpr} + Here the remote filename contains spaces so it MUST be enclosed + in braces. As it arrives it is sent to the lpr program for + printing. Braces are optional around "lpr" since it contains no + spaces. + + GET /COMMAND *.txt {cat >> new.txt} + GET /AS-NAME:{cat >> new.txt} /COMMAND *.txt + CGET *.txt {cat >> new.txt} + This gets all the ".txt" files from the server and concatenates + them all into a single "new.txt" file on the client. + + GET /COMMAND *.txt {echo \v(filename)>>new.txt;cat>>new.txt} + CGET *.txt {echo \v(filename)>>new.txt;cat>>new.txt} + As above, but inserts each file's name before its contents. + _________________________________________________________________ + + 4.2.3. Using File-Transfer Filters + + The commands described in [445]Section 4.2.2 let you send the output + of a command, or receive data into a command. But what if you want to + specify preprocessing for files that you send, or postprocessing of + files that you receive, even when multiple files are involved? For + this you need a way to specify send and receive filters. The commands + are SET SEND FILTER and SET RECEIVE FILTER; SHOW PROTOCOL displays the + current settings. + + 4.2.3.1. The SEND Filter + + SET SEND FILTER [ command ] + This command specifies a command to be run on any file that you + SEND (or MOVE, MSEND, etc). It also applies to files sent when + in server mode, in response to GET commands, but not to the + results of REMOTE commands like REMOTE DIRECTORY, REMOTE TYPE, + REMOTE HOST, etc. The command may be, but need not be, enclosed + in braces; if it is, the braces are stripped before use. The + output of this command is sent, rather than the file itself. + The current FILE TYPE setting (TEXT or BINARY) applies to the + output of the command. The command must contain at least one + instance of \v(filename), for which the name of the actual file + is substituted. If the command is omitted, the send filter is + removed and files are sent in the normal manner. + + The SET SEND FILTER sets up a "global" filter -- that is, one that + applies to all subsequent file-sending commands until you change or + remove it. You can also specify a "local" filter to be used in a + specific file-sending command by using the /FILTER switch (see + [446]Section 1.5); for example: + + SEND /FILTER:command [ other-switches ] filename + + Besides \v(filename), you can include any other script programming + notation in the send filter: variable names, array references, calls + to built-in string or other functions, and so on. These are evaluated + during file transfer, NOT during parsing, and they are evaluated + separately for each file. + + When the SEND or MOVE (SEND /DELETE) command is used with a send + filter, the output from the filter is sent under the file's original + name unless you specify an "as-name" or template. The Attribute packet + (if any) contains the original file's attributes (size, creation date, + etc). So (for example) if the filter changes the file's size, the + progress thermometer might be wrong. (We can't send the size of the + output from the filter, because it is not known until the transfer is + finished.) If you prefer that the size not be sent, use "set + attributes size off". + + You can not use send filters with RESEND (SEND /RECOVER) or PSEND + (SEND /START). + + Examples for text mode: + + SET SEND FILTER sort -r \v(filename) ; Braces may be omitted + SET SEND FILTER {sort -r \v(filename)} ; Braces may be included + SEND *.txt + This sends every file in the current directory whose name ends + with ".txt" under its own name, but with its lines sorted in + reverse order. + + SEND /FILTER:{sort -r \v(filename)} *.txt + Same as above, but the filter applies only to this SEND + command. Braces are required in this case. + + SET SEND FILTER {sort -r \v(filename)} + SEND oofa.txt reverse.txt + Sends the oofa.txt file with its lines sorted in reverse order + under the name "reverse.txt". + + SET SEND FILTER {sort -r \v(filename)} + SEND oofa.* \v(filename).reverse + Sends all the oofa.* files with their lines sorted in reverse + order; each file is sent under its own name but with ".reverse" + appended to it. + + SET SEND FILTER {tr "[a-z]" "[A-Z]" < \v(filename)} + SEND *.txt + Sends all ".txt" files under their own names, but uppercasing + their contents. + + Note that the SEND FILTER applies not only to files that are sent with + SEND, MOVE, MSEND, etc, but also to files sent by the C-Kermit server + in response to GET requests. + + Examples for binary mode: + + SET SEND FILTER {gzip -c \v(filename)} + SEND /BINARY oofa.txt oofa.txt.gz + Sends the oofa.txt file, compressed by gzip, as oofa.txt.gz. + + SEND /BINARY /FILTER:{gzip -c \v(filename)} oofa.txt oofa.txt.gz + As above, but the filter applies only to this SEND command. + + SET SEND FILTER {gzip -c \v(filename)} + SEND /BINARY oofa.* \fupper(\replace(\v(filename),.,_)).GZ + Sends all the oofa.* files, compressed by gzip, each under its + own name, but with the name uppercased, all periods within the + name converted to underscores, and ".GZ" appended to it. So, + for example, "oofa.txt" is sent as "OOFA_TXT.GZ". + + In the gzip examples, note that the amount of data that is sent is + normally less than the original file size because gzip compresses the + file. But Kermit sends the original file size ahead in the attribute + packet anyway (unless you tell it not too). Thus the transfer will + probably appear to terminate early, e.g. when the receiver's + file-transfer display thermometer is only at 40%. If this annoys you, + tell Kermit to "set attribute length off". On the other hand, you can + use the final position of the thermometer as a measure of the + effectiveness of compression. + _________________________________________________________________ + + 4.2.3.2. The RECEIVE Filter + + SET RECEIVE FILTER [ command ] + This command specifies that the given command will be run on + any file that is received before it is written to disk. The + command may be, but need not be, enclosed in braces; if it is + the braces are stripped before use. The following two commands + are equivalent: + + SET RECEIVE FILTER sort -r > \v(filename) + SET RECEIVE FILTER {sort -r > \v(filename)} + + The RECEIVE filter command may contain a "\v(filename)" sequence to be + replaced by the incoming filename from the file header packet, but it + is not required. However you must use it whenever your filter would + normally write to Stdout, otherwise its output will be lost. + + The RECEIVE filter command may contain one or more "\v(filename)" + sequence to be replaced by the incoming filename from the file header + packet, but it is not required. However you must use it whenever your + filter would normally write to Stdout, otherwise its output will be + lost. + + RECEIVE /FILTER:command and GET /FILTER:command can also be used to + specify a filter to be used for only one file-transfer operation. + + UNIX examples for text mode: + + SET RECEIVE FILTER lpr + RECEIVE + All the files that are received are sent to the default UNIX + print spooler. + + RECEIVE /FILTER:lpr + Same as above, except the lpr filter is used only with this + RECEIVE command. + + RECEIVE lpr + This is probably not what you want; it creates a file called + lpr. + + SET RECEIVE FILTER {sort -r > \v(filename)} + RECEIVE + Stores each incoming file with its lines sorted in reverse + order, under its own name. + + RECEIVE /FILTER:{sort -r > \v(filename)} + As above, but the filter is used only for this RECEIVE command. + + SET RECEIVE FILTER sort -r > \v(filename) + RECEIVE reverse.txt + Stores each incoming file with its lines sorted in reverse + order, under the name "reverse.txt". The actual result depends + on the FILE COLLISION setting. If it is OVERWRITE and multiple + files arrive, then each incoming file destroys the previous + one. If it is BACKUP (the default), filename conflicts are + resolve by adding "version numbers" to the filenames: + reverse.txt, reverse.txt.~1~, reverse.txt.~2~, etc. + + SET RECEIVE FILTER sort -r > \v(filename) + RECEIVE \v(filename).reverse + Stores each incoming file with its lines sorted in reverse + order, under the name it arrived with, but with ".reverse" + appended to it. + + SET RECEIVE FILTER sort -r > \v(filename) + RECEIVE \flower(\v(filename)).reverse + Like the previous example, but ensures that the filename is + lowercase. + + Examples for binary mode: + + SET RECEIVE FILTER gunzip -c > \v(filename) + RECEIVE + This receives one or more presumably compressed file and + uncompresses each one into a file having the same name it was + sent with. For example, if the file is sent with the name + OOFA.TXT.GZ, it is stored with that name, even after + decompression. + + SET RECEIVE FILTER gunzip -c > \v(filename) + RECEIVE \flower(\fsubstring(\v(filename),1,\flength(\v(filename))-3)) + Like the previous example, but the resulting filename has its + rightmost three characters removed from it and the remainder is + lowercased. So if the incoming filename is OOFA.TXT.GZ, it is + stored as oofa.txt after decompression. + + Of course you don't want to type such long hideous commands, so we + have also introduced several new functions: + + \fstripx(string[,character]) + This function removes the rightmost segment of the string that + starts with the given character. If no character is given, + period (.) is used. Thus it is most conveniently used for + stripping the extension from a filename (or the decimal portion + from a floating-point number written in US/UK style). Examples: + + \fstripx(OOFA.TXT.GZ) => OOFA.TXT + \fstripx(OOFA.TXT.GZ,.) => OOFA.TXT + \fstripx(OOFA.TXT.GZ,X) => OOFA.T + \fstripx(\fstripx(OOFA.TXT.GZ)) => OOFA + \fstripx($100.00) => $100 + + \fstripn(string,number) + Removes the rightmost number characters from the string. + Examples: + + \fstripn(OOFA.TXT.GZ) => OOFA.TXT.GZ + \fstripn(OOFA.TXT.GZ,3) => OOFA.TXT + \fstripn(OOFA.TXT.GZ,7) => OOFA + + \fstripb(string[,c1[,c2]]) + Strips enclosing matching braces, brackets, parentheses, or + quotes from the string. The second argument, c1, specifies + which kind of enclosure to look for; if not specified, any + enclosing (), [], <>, {}, "", '', or `' are removed. If c1 is + specified and c2 is not, then if c1 is an opening brace, + bracket, or parenthesis, the matching closing one is supplied + automatically as c2. If both c1 and c2 are specified, then to + be stripped the string must begin with c1 and end with c2. If + the string is not enclosed in the indicated manner, the result + is the original string. Examples: + + \fstripb("abc") => abc + \fstripb([abc]) => abc + \fstripb([abc) => [abc + \fstripb() => abc + \fstripb(,[) => + \fstripb((abc)) => abc + \fstripb((abc),[) => (abc) + \fstripb((abc),{(}) => abc + \fstripb(+abc+) => +abc+ + \fstripb(+abc+,+) => abc + \fstripb(+abc+,+,^) => +abc+ + \fstripb(+abc^,+,^) => abc + \fstripb('abc') => abc + \fstripb(`abc') => abc + \fstripb(``abc'') => `abc' + \fstripb(\fstripb(``abc'')) => abc + + Notice the special syntax required for including a literal + parenthesis in the argument list. As the last two examples + illustrate, \fstripb() strips only one level at at a time; + nesting can be used to strip a small fixed number of levels; + loops can be used to strip larger or indeterminate numbers of + levels. + + \flop(string[,char]) + Removes the leftmost segment of the string that ends with the + given character. If no character is given, period (.) is used. + Examples: + + \flop(OOFA.TXT.GZ) => TXT.GZ + \flop(OOFA.TXT.GZ,.) => TXT.GZ + \flop(OOFA.TXT.GZ,X) => T.GZ + + To remove the leftmost number characters, just use + \fsubstring(s,number+1). To return the rightmost number + characters, use \fright(s,number). + + So the hideous example: + + receive \flower(\fsubstring(\v(filename),1,\flength(\v(filename))-3)) + + can now be written as: + + receive \flower(\fstripx(\v(filename))) + + That is, the filename stripped of its extension and then lowercased. + This is not only shorter and less hideous, but also does not depend on + the length of the extension being 3. + + Note that when a receive filter is in effect, this overrides your FILE + COLLISION setting, since Kermit has no way of knowing what the final + destination filename will be (because it does not know, and can not be + expected to know, the syntax of every version of every command shell + on every platform on the planet). + _________________________________________________________________ + + 4.2.4. Implicit Use of Pipes + + If you wish, C-Kermit can also examine incoming filenames to see if + they start with "!", and if so, the subsequent text is treated as a + command to read from or write to. For example, if a Kermit client is + given the following command: + + get {!finger | sort} + + the server on the other end, if it supports this feature, will run the + "finger" program, pipe its standard output to the "sort" program, and + send sort's standard output back to you. Similarly, if you: + + send oofa.txt !sort -r > oofa.new + + or, equivalently: + + send oofa.txt {!sort -r > oofa.new} + + or: + + send /as-name:{!sort -r > oofa.new} oofa.txt + + this has the receiver send the contents of the incoming oofa.txt file + to the sort program, which sorts the text in reverse order and stores + the result in oofa.new. + + This use of the exclamation mark should be familiar to UNIX users as + the "bang" feature that lets you run an external application or + command from within another application. + + Kermit's "bang" feature is disabled by default, since it is not + unheard for filenames to actually begin with "!". So if you want to + use this feature, you must enable it with the following command: + + SET TRANSFER PIPES { ON, OFF } + ON enables the recognition of "!" notation in incoming + filenames during file transfer as an indicator that the + remaining text is the name of a command. OFF, the default, + disables this feature and uses the text as a filename in the + normal fashion. This command does NOT affect SEND /COMMAND, GET + /COMMAND, CSEND, etc. + + So using a combination of CSEND (SEND /COMMAND) and the "bang" + feature, you can transfer a directory tree all in one command + (assuming the remote Kermit supports pipe transfers and has them + enabled): + + CSEND {tar cf - . | gzip -c} {!gunzip -c | tar xf -} + + or: + + SEND /COMMAND:{tar cf - . | gzip -c} /as:{!gunzip -c | tar xf -} + + Pay close attention to the syntax. Braces are needed around the + command because it contains spaces; braces are needed around the + as-name because it ends with "-". The as-name must begin with "!" or + receiving Kermit will not recognize it as a command. The CSEND command + must NOT begin with "!" unless you are running a command whose name + really does start that character. + + Similarly, you have a Kermit server send a directory tree to be + unpacked on the client end: + + CGET {!tar cf - . | gzip -c} {gunzip -c | tar xf -} + + or: + + GET /COMMAND {!tar cf - . | gzip -c} /as:{gunzip -c | tar xf -} + + Notice how, in this case, the bang is required in the remote command, + to distinguish it from a filename, but not in the local command, since + by definition of CGET (or GET /COMMAND), it is known to be a command. + + SEND and RECEIVE FILTERs supersede the bang feature. For example, if a + file arrives under the name "!gunzip -c | tar xf -", but the receiving + Kermit also has been given a command like: + + set receive filter sort -r > \v(filename) + + then the incoming data will be sorted rather than gunzipped. + + Finally, if SET TRANSFER PIPES is ON (and in this case, this must be + done in your C-Kermit initialization file), you can send from a pipe + on the C-Kermit command line: + + kermit -s "!finger | sort -r" -a userlist + + In this case the "filename" contains spaces and so must be quoting + using your shell's quoting rules. + _________________________________________________________________ + + 4.2.5. Success and Failure of Piped Commands + + Commands or programs started by Kermit as a result of CSEND or + CRECEIVE commands, CGET, SEND /COMMAND, REDIRECT commands (see + [447]Section 4.2.8.2), implicit use of pipes, RUN commands, and so + forth, should return their exit status codes to the Kermit command + that caused them to be run, and therefore IF SUCCESS and IF FAILURE + tests after these commands should work as expected. For example: + + CSEND blah < filename + + should fail if there is no command called "blah" or if there is no + file called "filename". However, this is not foolproof and sometimes + C-Kermit might think a command succeeded when it failed, or vice + versa. This is most likely to happen when the highly system-dependent + methods that Kermit must use to determine a command's exit status code + do not supply the right information. + + It can also happen because some commands might define success and + failure differently from what you expect, or because you are using a + pipeline composed of many commands, and one of them fails to pass + failing exit status codes up the chain. The most likely culprit is the + shell itself, which in most cases must be interposed between Kermit + and any external program to be run. + + In any case, you can examine the following variable to find out the + exit status code returned to Kermit by the process most recently run + by any command that runs external commands or programs, including + CSEND, CRECEIVE, REDIRECT, RUN, etc: + + \v(pexitstat) + + In UNIX, Windows and OS/2, the value should be -2 if no command has + been run yet, 0 if the most recent command succeeded, -1, -3, or -4 if + there was an internal error, and a positive number returned by the + command itself if the command failed. If the number is in the range + 1-127, this is the program's exit status code. If it is 128 or + greater, this is supposed to indicate that the command or program was + interrupted or terminated from outside itself. + + In Windows 95 and 98, the return values of the default shell are + unreliable; various third-party shells can be used to work around this + deficiency. + + In VMS, it is the actual exit status code of the command that was run. + This is an odd number if the command succeeded, and an even number if + it failed. You can see the associated message as follows: + + run write sys$output f$message(\v(pexitstat)) + + Or, more conveniently, use the new Kermit function: + + echo \ferrstring(\v(pexitstat)) + + which converts a system error code (number) to the corresponding + message. + _________________________________________________________________ + + 4.2.6. Cautions about Using Pipes to Transfer Directory Trees + + Although utilities such as tar and zip/unzip might be available on + different platforms (such as UNIX and Windows), this does not + necessarily mean you can use them successfully to transfer directory + trees between unlike platforms. For example: + + CSEND {tar cf - . | gzip -c} {!gunzip -c | tar xf -} + + when used from UNIX to Windows will have satisfactory results for + binary files, but not for text files. UNIX text files have lines + ending with Linefeed (LF) only, whereas Windows text files have lines + ending in Carriage Return and Linefeed (CRLF). Thus any text files + that were in the archive formed by the first tar command will be + unpacked by the second tar command in their original form, and will + display and print incorrectly in Windows (except in applications that + have been explicitly coded to handle UNIX-format text files). On the + other hand if you told gzip to use "text mode" to do record format + conversion (assuming there was a way to tell it, as there is with most + "zip" programs), this would destroy any binary files in the archive. + + Furthermore, if the archive contains text files that are written in + languages other than English, the "special" (accented and/or + non-Roman) characters are NOT translated, and are therefore likely + show up as gibberish on the target system. For example, West European + languages are usually encoded in ISO Latin Alphabet 1 in UNIX, but in + PC code page 850 on the PC. Capital A with acute accent is code point + 193 (decimal) Latin-1, but 181 in CP850. So A-acute in the UNIX file + becomes Middle Box Bottom on the PC, and similarly for all the other + special characters, and for all other languages -- Greek, Russian, + Hebrew, Japanese, etc. + + So when transferring text files between unlike platforms, you should + use direct Kermit file transfers so Kermit can apply the needed + record-format and character-set transformations. Use pipelines + containing archivers like tar or zip only if all the files are binary + or the two systems use the same record format and character set for + text files. + + Also see [448]Sections 4.3, [449]4.10, [450]4.11, and [451]4.15 for + how to transfer directory trees between both like and unlike systems + directly with Kermit. + _________________________________________________________________ + + 4.2.7. Pipes and Encryption + + Of course pipelines could be used for encrypted file transfers, + assuming proper precautions could be taken concerning the transmission + of the key. But there is rarely a good way to do this. To illustrate + using UNIX crypt: + + csend {crypt key < filename} {!crypt key > filename} + + Or, more ambitiously: + + csend {tar cf - . | gzip -c | crypt key} {!crypt key | gunzip -c | tar xf -} + + transmits the key in the file header packet as part of the + (clear-text) remote command, defeating the entire purpose of + encrypting the file data. + + But if you are connected in terminal mode to the remote computer and + type: + + creceive {crypt key > filename} + + at the remote Kermit prompt, you have also transmitted the key in + clear text over the communications link. + + At present, the only secure way to use CSEND and CRECEIVE with an + encryption filter is to have a human operator at both ends, so the key + does not have to be transmitted. + + Theoretically it would be possible to use PGP software (Pretty Good + Privacy, by Phil Zimmerman, Phil's Pretty Good Software) to avoid key + transmission (since PGP uses separate public and private key and "lets + you communicate securely with people you've never met, with no secure + channels needed for prior exchange of keys"), but the specific method + has yet to be worked out. + + HINT: See the PGP User's Guide, e.g. at: + [452]http://www.telstra.com.au/docs/PGP/ + Especially the topic "Using PGP as a UNIX-Style Filter": + [453]http://www.telstra.com.au/docs/PGP/pgpdoc2/pgpdoc2_17.html + + In any case, better and more convenient security options are now + available: Kerberos authentication and encryption ([454]CLICK HERE for + details) and the new ability to run C-Kermit "though" other + communication programs, described in [455]Section 2.7. + _________________________________________________________________ + + 4.2.8. Commands and Functions Related to Pipes + + 4.2.8.1. The OPEN !READ and OPEN !WRITE Commands + + These are described in [456]Using C-Kermit, and are generally useful + with reading output from commands that produce more than one line on + their standard output, or writing multiple lines into commands that + accept them on their standard input. + + In C-Kermit 7.0 CLOSE !READ is accepted as a synonym for CLOSE READ, + and CLOSE !WRITE for CLOSE WRITE. + + Testing the success and failure of these commands, however, can be a + bit tricky. Consider: + + open !read lalaskjfsldkfjsldkfj + + (where "lalaskjfsldkfjsldkfj" is neither a valid command nor the name + of a program or script that can be run). OPEN !READ, in UNIX at least, + translates this into execl(shellpath,shellname,"-c",command). This + means it starts your preferred shell (e.g. from the SHELL environment + variable) and asks it to execute the given command. It must be this + way, because your command can be a either an internal shell command + (which only your shell can execute) or an external command, which only + your shell knows how to find (it knows your PATH and interprets, etc). + Therefore unless OPEN !READ can't start your shell, it always + succeeds. + + Continuing with the nonexistent-command example: + + C-Kermit> open !read lalaskjfsldkfjsldkfj + C-Kermit> status + SUCCESS + C-Kermit> read line + C-Kermit> status + SUCCESS + C-Kermit> echo "\m(line)" + "bash: lalaskjfsldkfjsldkfj: command not found" + C-Kermit> close read + C-Kermit> status + FAILURE + C-Kermit> + + In other words, the failure can not be detected on OPEN, since the + OPEN command succeeds if it can start your shell. It can't be detected + on READ, since all this does is read output from the shell, which in + this case happens to be an error message. However, failure IS detected + upon close, since this is the occasion upon which the shell gives + Kermit its exit status code. + + For an illustration of this situation, see [457]Section 2.14. + _________________________________________________________________ + + 4.2.8.2. The REDIRECT Command + + A second method of I/O redirection is offered by the REDIRECT command. + This is a rather advanced and tricky feature that is presently + supported only in UNIX C-Kermit, in OS-9 C-Kermit, and in Kermit 95. + Syntax: + + REDIRECT command + Runs the given command, sending its standard output to the + current communications channel (SET LINE, SET PORT, or SET HOST + connection), and reading its standard input from the same + connection. Works only in local mode -- i.e. a connection is + required -- and then only if the given command uses Standard + I/O. + + Example: + + redirect finger + + runs the local "finger" command and sends its output over the + connection as plain text, where presumably there is a process set up + to read it. Another example: + + redirect finger | sort -r + + shows the use of a pipeline. + + Note: REDIRECT differs from CSEND/CRECEIVE in two important ways: (1) + it does not use the Kermit protocol, and (2) it uses a bidirectional + pipe rather than a one-way pipe. + + The primary use of the REDIRECT command is to run external protocols, + such as sz/rz in UNIX for ZMODEM, when they work over Standard I/O(*). + Example: + + set host xyzcorp.com + (login, etc) + redirect sz oofa.zip + + lets you make a Telnet connection with C-Kermit and then do a ZMODEM + transfer over it. ZMODEM protocol messages go both ways over the same + connection simultaneously. + + It is possible to use C-Kermit on UNIX as your PPP dialer and then to + REDIRECT the connection to the PPP software, but C-Kermit 7.0 offers a + better approach to PPP dialing in its new EXEC command ([458]Section + 1.23). + + In theory, you can also redirect an interactive process. For example, + suppose you tell Kermit 95 to wait for an incoming TCP/IP connection: + + set host * 3000 + + and then tell C-Kermit on UNIX to: + + set host kermit95hostname 3000 + redirect ksh + + and then tell Kermit 95 to CONNECT: now you are talking to the UNIX + K-shell; you can give commands (pwd, ls, etc) and see the results. In + practice, the K-shell's terminal modes are messed up because (a) it is + not going through the Unix terminal driver, and (b) it is "smart" and + knows it is being redirected, and so acts in a decidedly inhospitable + manner (other applications like EMACS, vi, etc, simply refuse to run + if their standard i/o has been redirected). + + (*) The publicly-distributed sz/rz programs do not work as clients. + However, Omen Technology does offer an up-to-date redirectable + client XYZMODEM program called crzsz. + _________________________________________________________________ + + 4.2.8.3. Receiving Mail and Print Jobs + + As of 7.0, and in UNIX only, files that are sent to C-Kermit as mail + (when the other Kermit uses a MAIL or SEND /MAIL command) or to be + printed (via REMOTE PRINT or SEND /PRINT) are now piped directly to + the mail or print program, rather than written to temporary files and + then mailed or printed and then deleted. This has the advantages of + (a) not requiring a temporary file, and (b) allowing mail to have a + proper subject in place of the filename. Temporary files were bad not + only because they required (a) space, and (b) writeability of the + current directory, but also because using them could result in wiping + out an existing file. See [459]Section 4.7 for more about SEND /MAIL + and SEND /PRINT. + _________________________________________________________________ + + 4.2.8.4. Pipe-Related Functions + + The \fcommand(command) function runs the given shell or system command + and returns the command's standard output as its value (with any + newline characters stripped from the end), unless the result is too + long, in which case it returns the empty string. The maximum length + for the result is at least 1022 bytes, and it might be longer on some + platforms. Examples (UNIX): + + C-Kermit> echo "\fcommand(date)" + "Fri Apr 18 13:31:42 1997" + C-Kermit> echo "\fcommand(finger | wc -l)" ; how many users logged in? + " 83" + C-Kermit> evaluate \fcommand(finger | wc -l) * 2 + 166 + C-Kermit> echo Welcome to \fcommand(tty) on \fcommand(date) + Welcome to /dev/ttyre on Fri Apr 18 13:31:42 1997 + C-Kermit> echo "\fcommand(ls oofa.*)" + "oofa.c + oofa.h + oofa.o" + C-Kermit> cd /directory-with-thousands-of-files + C-Kermit> echo "\fcommand(ls -l)" ; This would be too long + "" + C-Kermit> + + If a command's output would be too long, you can use the other, more + laborious method of reading from a command: OPEN !READ command, READ + each line, CLOSE !READ. + + The \frawcommand(command) function is identical to \fcommand(command), + except it does not remove trailing newline characters: + + C-Kermit> echo "\frawcommand(date)" + "Fri Apr 18 13:31:42 1997 + " + C-Kermit> echo "\frawcommand(ls oofa.*)" + "oofa.c + oofa.h + oofa.o + " + C-Kermit> + + Use \frawcommand() if you want to retain the final line terminators, + or if the command's output is "binary". But remember that if the + result of this (or any other) function contains any NUL (ASCII code 0) + characters, the first NUL will terminate the result string because + this is how C strings work (it's "C-Kermit", remember?). + + These functions are useful not only locally, but also in the + client/server arena. If you need to get the results from a system + command on the server end into a variable on the client end, just do: + + [ remote ] query kermit command(date) + + The result is in the local \v(query) variable; see [460]Using + C-Kermit, 2nd Ed., pp.359-360 for details. + _________________________________________________________________ + + 4.3. Automatic Per-File Text/Binary Mode Switching + + When transferring files between like systems (e.g. UNIX-to-UNIX), + binary mode can be used for all files unless character-set translation + is needed, and in fact Kermit programs of recent vintage recognize + each others' platforms and switch to binary mode automatically when it + is appropriate (e.g. DOS to OS/2, or UNIX to UNIX). (Exception: + LABELED mode is chosen for VMS-to-VMS and OS/2-to-OS/2 transfers so + complex file formats can be preserved.) + + On a client/server connection between like systems, the transfer mode + is currently determined by the file sender, rather than always by the + client. If the client is sending, it controls the transfer mode. If a + GET command is sent to the server, the server sends all files in + binary mode if its TRANSFER CHARACTER-SET is TRANSPARENT; otherwise it + uses text mode for text files (according to its text-pattern list) and + binary mode for binary files. Of course, the client can control the + server's transfer character-set with the REMOTE SET TRANSFER + CHARACTER-SET command. + + When transferring files between unlike systems, however, (e.g. + UNIX-to-DOS), some files (such as executable program images) must be + transferred in binary mode but others (such as plain-text files) must + be transferred in text mode so their record format and character sets + can be appropriately converted. If a binary file is transferred in + text mode, it is ruined. If a text file is transferred in binary mode, + then at the very least, its format can be incorrect; at worst it is + also corrupted because its character set was not converted (in extreme + cases the corruption is total, e.g. because one system is ASCII-based + and the other EBCDIC). + _________________________________________________________________ + + 4.3.1. Exceptions + + VMS C-Kermit, when sending files to a non-VMS system, switches to text + or binary mode automatically for each file, based on the record format + in the file's directory entry; thus the mechanisms described in this + section do not apply to VMS C-Kermit, yet the effect is the same: + automatic text/binary mode switching when VMS C-Kermit is sending + files. See the VMS Appendix of [461]Using C-Kermit for details. + + Kermit versions that support LABELED or IMAGE transfer mode are + likewise not affected by this feature when one of those modes is + selected (normally used only when transferring between like systems). + + Kermit versions that support file-transfer pipes and filters are not + affected by this feature when pipes or filters are used, since the + output of a pipe or filter (such as gzip) is likely to require + transfer in a different mode than the original file. + + Finally, SEND /TEXT or SEND /BINARY will force files to be sent in the + indicated mode, overriding all automatic transfer-mode-choosing + mechanisms. + _________________________________________________________________ + + 4.3.2. Overview + + Suppose you give C-Kermit a command like: + + SEND *.* + + And suppose the pattern *.* matches a mixture of text files (such as + program source code) and binary files (such os object modules or + executable programs). + + C-Kermit 6.0 and earlier (except on VMS) send all files in the same + mode: whatever you said in your most recent SET FILE TYPE command, or + else whatever mode was chosen automatically according to the rules on + page 236 of Using C-Kermit, 2nd Ed. + + But when text and binary files are mixed in the same group, and the + files are being transferred to an unlike system (e.g. UNIX to IBM + Mainframe), this results in corruption of either all the text files or + all the binary files. + + Stream-oriented file systems such as in UNIX and DOS do not record any + information about the file to tell us whether the file should be + transferred in binary or text mode, making it impossible to select the + transfer mode for each file in a group automatically with any + certainty. + + However, we can use some fairly-well established file naming + conventions for this purpose. C-Kermit 7.0 lets you provide lists of + filename patterns that are used to separately determine the file type + for each individual file being transfered. A pattern is a string, + possibly containing the special characters "*" (asterisk, which + matches any string of zero of more characters) and/or "?" (question + mark, which matches any single character). For example "a*b" matches + all files whose names start with "a" and end with "b", such as "ab", + "arb", "ababababab", etc, but not "abba". And "a?b" matches any file + whose name starts with "a", ends with "b", and is exactly 3 characters + long. + + NOTE: When typing commands at the C-Kermit prompt, you must prefix + "?" with \ to override its normal function of giving help. + + (Also see [462]Section 4.9 for additional pattern-matching notations + that might be available in your version of C-Kermit.) + + When you have specified filename recognition patterns, C-Kermit can + transfer the ones whose names match any of the binary-mode patterns in + binary mode, and those with names that match any of the text-mode + patterns in text mode, and those whose names match neither in the + prevailing mode you have chosen, or that was chosen automatically via + peer recognition. + _________________________________________________________________ + + 4.3.3. Commands + + SET FILE PATTERNS { ON, OFF, AUTO } + This tells Kermit whether to do per-file filename + pattern-matching to determine text or binary mode. The normal + and default setting is AUTO, which means to use pattern lists + to switch transfer mode only when it is certain that the other + Kermit program supports automatic notification of transfer mode + (via Attribute packets) on a per-file basis (this information + is obtained automatically during protocol startup negotiation). + ON means to always determine the transfer mode from the + filename and pattern list when sending files. Use OFF to + disable this feature (without resetting your pattern lists). + Also note that if you have selected LABELED file transfer (SET + FILE TYPE LABELED), this takes precedence over + filename-matching patterns and all files are sent in labeled + mode. + + SET TRANSFER MODE MANUAL + Disables the use of filename patterns, no matter what the FILE + PATTERNS setting. + + REMOTE SET TRANSFER MODE MANUAL + Client command to disable automatic transfer mode, and + therefore also filename patterns, in the server. Synonym: + REMOTE SET XFER MODE MANUAL. + + { GET, SEND, etc } { /BINARY, /TEXT } + Including a /BINARY or /TEXT (or, where supported, /IMAGE or + /LABELED) switch with a file-transfer command changes the + transfer mode to manual for that command only, and therefore + disables patterns that that command. + + SET FILE BINARY-PATTERNS [ pattern [ pattern [ pattern ... ] ] ] + A list of zero or more patterns, separated by spaces (not + commas). Letters in a pattern are case-sensitive if the + underlying filenames are case sensitive (as in UNIX), and + case-insensitive otherwise (as in Windows). If a file's name is + matched by any pattern in the list and SET FILE PATTERNS is ON, + the file is sent in binary mode. Examples: + + SET FILE BINARY-PATTERNS *.gz *.Z *.tar *.zip *.o *.so *.a *.out ; UNIX + SET FILE BINARY-PATTERNS *.EXE *.ZIP *.OBJ *.COM ; DOS or OS/2 or Windows + + If a pattern contains spaces, enclose it in braces. + + SET FILE TEXT-PATTERNS [ pattern [ pattern [ pattern ... ] ] ] + Like SET FILE BINARY-PATTERNS, but the patterns choose text + files rather than binary ones. Examples: + + SET FILE TEXT-PATTERNS *.TXT *.KSC *.HTM* *.BAT ; DOS, Windows, OS/2 + + ADD BINARY-PATTERNS [ pattern [ pattern [ pattern ... ] ] ] + Adds one or more patterns to the BINARY-PATTERN list. + + ADD TEXT-PATTERNS [ pattern [ pattern [ pattern ... ] ] ] + Adds one or more patterns to the TEXT-PATTERN list. + + REMOVE BINARY-PATTERNS [ pattern [ pattern [ pattern ... ] ] ] + Removes one or more patterns from the BINARY-PATTERN list. The + given patterns are matched with the ones in the BINARY-PATTERNS + list with case sensitivity if the underlying file system has + case-sensitive names (as do UNIX and OS-9), otherwise with case + independence. + + REMOVE TEXT-PATTERNS [ pattern [ pattern [ pattern ... ] ] ] + Removes one or more patterns from the TEXT-PATTERN list. + + SHOW PATTERNS + Displays the current pattern selections. + + Whenever you give a SET FILE BINARY-PATTERNS or SET FILE TEXT-PATTERNS + command, the previous list is replaced. If you give one of these + commands without a pattern list, the previous list is removed. + + When patterns are active and files are being sent, text patterns (if + any) are applied first (but only if not RESENDing and not sending in + LABELED mode), then binary patterns, so if the same pattern appears in + both lists, binary mode is chosen. + _________________________________________________________________ + + 4.3.4. Examples + + Here's an example that might be used when sending files from UNIX: + + set file type binary + set file text-patterns *.c *.h *.w *.txt makefile + set file binary-patterns *.o + msend makefile wermit wart ck*.[cwho] ck*.txt + + Note that "wermit" and "wart" do not match any patterns so they are + sent in the prevailing mode, which is binary. Also note the use of + "makefile" as a pattern that does not contain any wildcard characters + (there is no other convention to distinguish among "wermit" and + "wart", which are binary executables, and "makefile", which is a text + file, purely by their names). + + Most C-Kermit implementations have a default pattern list built in, + which includes patterns that are almost certain to succeed in picking + the right transfer mode. Others are omitted due to ambiguity. For + example ".hlp", and ".ini" are generally binary types in Windows but + text types everywhere else. + + NOTE: ".doc", used for decades to denote plain-text documentation + files, now more often than not denotes a Microsoft Word Document, + so ".doc" is now considered a binary type since it does less harm + to transfer a plain-text document in binary mode than it does to + transfer an MS Word file in text mode (except when IBM mainframes + are involved!) + + ANOTHER NOTE: ".com" files are binary in DOS-like operating + systems, but they are text (DCL command procedures) in VMS. VMS + C-Kermit sends .COM files in text mode; K95 sends them in binary + mode. If you download a .COM file from VMS to DOS or Windows, and + then upload it to another VMS system, be sure to use SEND /TEXT to + preserve its textness. + + You can see the default pattern list by starting C-Kermit without its + initialization file (e.g. "kermit -Y") and using the SHOW PATTERNS + command. If you will be depending on this feature, be sure to examine + the list carefully in conjunction with the applications that you use. + + The default pattern list does not take "backup files" into account + because (a) people usually don't want to transfer them; and (b) it + would make the pattern lists more than twice as long. For example, we + would need to include both *.txt and *.txt.~[0-9]*~ for ".txt" files, + and similarly for all the others. Instead, you can use SEND /NOBACKUP + (or SET SEND BACKUP OFF) to skip over all backup files. + + Put your most commonly-used safe pattern declarations in your C-Kermit + customization file (ckermod.ini, .mykermrc, k95custom.ini, etc). + + As noted, SET FILE PATTERNS is ON by default. Sometimes, however, it + is desirable, or necessary, to force files to be sent in a particular + mode, and often this must be done from the command line (e.g. when + using Kermit as a download helper in a Web browser like Lynx). The -V + command-line options is equivalent to SET FILE PATTERNS OFF and SET + TRANSFER MODE MANUAL. Example: + + kermit -Vis oofa.txt + + forces oofa.txt to be sent in binary mode, even though ".txt" might + match a text pattern. + _________________________________________________________________ + + 4.4. File Permissions + + "Permissions" refers to a code associated with a file that specifies + who is allowed to access it, and in what manner. For example, the + owner, the members of one or more groups, the system administrator, + and everybody else, might be allowed various combinations of Read, + Write, Append, Execute, or Listing access. + + The permission code goes by different names on different platforms. In + UNIX, it might be called the filemode. In VMS, it is called the file + protection (or protection mask). + + The comments in this section presently apply only to the UNIX and VMS + versions of C-Kermit, to which these features were added in version + 7.0; the DOS, Windows, and OS/2 file systems embody no notions of + protection, and so MS-DOS Kermit and Kermit 95 do not send file + permissions, and ignore them when received. + + The permissions for a received file are determined by a combination of + the file transfer mode (VMS-to-VMS transfers only), whether a file of + the same name exists already, whether permissions of the file are + received in the file attribute packet, and the setting of ATTRIBUTES + PROTECTION. + + The default for ATTRIBUTES PROTECTION is ON. If no attributes are + received, the effect is the same as if attributes PROTECTION were OFF. + + For VMS-to-VMS transfers, the default LABELED mode simply copies the + protection code from source to destination. + _________________________________________________________________ + + 4.4.1. When ATTRIBUTES PROTECTION is OFF + + If no file of the same name exists, system defaults determine the + permissions of the new file. Otherwise, the actions taken depend on + the current FILE COLLISION setting: BACKUP, OVERWRITE, RENAME, etc, as + documented in [463]Using C-Kermit. But now the new file (if it is + created at all) automatically inherits the permissions (mode bits) of + the existing file in a way that is appropriate for the platform. + + 4.4.1.1. Unix + + All mode bits are inherited except the directory bit, since the + incoming file can not possibly be a directory. (In any case, it is not + possible to receive a file that has the same name as an existing + directory unless FILE COLLISION is set to RENAME). + + 4.4.1.2. VMS + + Files with the same name as an existing file, transferred in modes + other than LABELED between VMS systems, inherit the protection of the + prior version. + _________________________________________________________________ + + 4.4.2 When ATTRIBUTES PROTECTION is ON + + File permissions can be conveyed as part of the file transfer process, + in accordance with the Kermit protocol definition. If the file sender + puts system-dependent and/or system-independent versions of the file + protection (permissions) into the Attribute (A) packet, the file + receiver can set the new file's permissions from them. Otherwise, the + permissions are set the same as for ATTRIBUTES PROTECTION OFF. + + When the incoming A packet contains system-dependent permissions, the + file receiver checks to see if the sender has the same system ID (e.g. + both the sending and receiving systems are UNIX, or both are VMS); if + so, it decodes and uses the system-dependent permissions; otherwise it + uses the generic ones (if any) and applies them to the owner field, + setting the other fields appropriately as described in the following + sections. + + Setting the incoming file's protection from the A packet is controlled + by SET ATTRIBUTES PROTECTION (or PERMISSION), which is ON by default, + and its status is displayed by SHOW ATTRIBUTES. + + The main benefit of this feature is to not have to "chmod +x" an + executable file after transfer from UNIX to UNIX. Its cross-platform + benefits are less evident, perhaps to retain the status of the Unix + 'x' bit on a VMS system, for subsequent transfer back to a Unix + system. + _________________________________________________________________ + + 4.4.2.1. System-Specific Permissions + + System-specific file permissions are used when the two Kermit programs + recognize each other as running on the same type of system. For + example, both are running under some form of UNIX (it doesn't matter + which UNIX variation -- HP-UX, Solaris, AIX, etc -- all use the same + scheme for file permissions); or both are running under VMS (even if + one is on an Alpha and the other on a VAX, and/or one is old and the + other is new). + + 4.4.2.1.1. UNIX + + UNIX supports three categories of users, File Owner, Group, and World, + and three types of file access permission: Read, Write, and Execute. + Thus, a UNIX file's permissions are expressed in 9 bits. + + The system-dependent permission string for UNIX is a 3-digit octal + string, the low-order 9 bits of the st_mode member of the stat struct; + we deliberately chop off the "file format" bits because they are not + permissions, nor do we convey the setuid/setgid bits, lock bit, sticky + bit, etc. + + 4.4.2.1.2. VMS + + VMS supports four categories of users, System, File Owner, Group, and + World, and four types of file access permission: Read, Write, Execute, + and Delete. Thus, a VMS file's permissions are expressed in 16 bits. + + The system-dependent protection string for VMS is a 4-digit + hexadecimal string, corresponding to the internal-format protection + word of the file (RWED for each of World,Group,Owner,System). A new + file normally gets all 16 protection bits from the original file of + the same name. + + Note: VMS-to-VMS transfers take place in LABELED mode when the two + C-Kermits recognize each other's platform as VMS (unless you have + disabled LABELED-mode transfers). In this case, all of a file's + attributes are preserved in the transfer and the protection mask (and + other information) is taken from the file's internal information, and + this takes precedence over any information in the Attribute packets. + You can defeat the automatic switching into LABELED mode (if you want + to) with SET TRANSFER MODE MANUAL. + _________________________________________________________________ + + 4.4.2.2. System-Independent Permissions + + The system-independent ("generic") protection is used when the system + IDs of the two Kermit programs do not agree (e.g. one is UNIX, the + other is VMS). The generic protection attribute includes the following + permissions (not all are applicable to every file system): Read, + Write, Append, Execute, Delete, Search. The generic permissions are + derived from the owner permissions of the source file, thus, a Unix + 'w' permission becomes VMS Write,Delete. + + The Owner field of the new file's permissions is set from the incoming + generic protection attribute. + + In UNIX, the Group and World permissions are set according to your + umask, except that execute permission is NOT set in these fields if it + was not also set in the generic protection (and consequently, is set + in the Owner field). + + In VMS, the System, Group, and World permissions are set according to + the process default file permission (as shown in VMS by SHOW + PROTECTION), except that no permissions are allowed in these fields + that are not included in the generic permissions. + + Note that the VMS and UNIX interpretations of Execute permission are + not identical. In UNIX, a file (binary executable, shell script, etc) + may not be executed unless it has Execute permission, and normally + files that are not intended for execution do not have Execute + permission. In VMS, Read permission implicitly supplies Execute + capability. Generally files that have Read permission also have + explicit Execute permission, but files (binary executables, DCL + command procedures) that have Read permission and not Execute + permission can still be executed. + _________________________________________________________________ + + 4.5. File Management Commands + + 4.5.1. The DIRECTORY Command + + Prior to C-Kermit 7.0, the DIRECTORY command always ran an external + system command (such as "ls" on UNIX) or program to product the + directory listing. This had certain advantages, mostly that you could + include system-dependent options for customized listings, e.g. on + UNIX: + + dir -lt c* | more + + or in VMS: + + directory /size/date/protection/except=*.obj oofa.*;0 + + This approach, however, carries some disadvantages: C-Kermit can't + return SUCCESS or FAILURE status for (e.g.) "dir foo" according to + whether the file "foo" exists; and it runs an inferior process, which + might be a problem in some environments for resource and/or security + reasons, and won't work at all in a "nopush" environment (e.g. one in + which C-Kermit is configured to forbid access to exterior commands and + programs, e.g. in a VMS "captive account"). + + In C-Kermit 7.0 on VMS and UNIX, and in K95 1.1.19 and later, the + DIRECTORY command is internal to Kermit. It can be run in a "nopush" + environment and returns SUCCESS or FAILURE status appropriately. In + UNIX it prints all dates and times in a consistent way (unlike ls). In + VMS it prints precise file sizes, rather than "blocks". It offers + several formatting and other options, but it is not necessarily more + flexible than the corresponding external commands or programs (the + UNIX "ls" program, the VMS "directory" command). The syntax is: + + DIRECTORY [ switch [ switch [ ... ] ] ] [ filespec ] + + If no filespec is given, all files in the current directory are + listed. + + Optional switches include all the standard file-selection switches + presented in [464]Section 1.5.4, plus: + + /ALL + Show both regular files and directories; this is the default. + + /ARRAY:x + Instead of displaying a directory listing, put the files that + would have been shown (based on the filespec and other + selection switches) in the given array. The array need not (and + should not) be predeclared; if the array already exists, it is + destroyed and reused. The array name can be a single letter, + like "a", or any fuller form, such as "&a", "\&a", "\&a[]", + etc. If the /ARRAY switch is included, the following other + switches are ignored: /BRIEF, /VERBOSE, /HEADING, /PAGE, + /ENGLISHDATE, /ISODATE, /XFERMODE, /MESSAGE, /SORT, /REVERSE, + /ASCENDING. In other words, only file selection switches are + meaningful with /ARRAY: /FILES, /DIRECTORIES, /ALL, /DOTFILES, + /NOBACKUP, /RECURSIVE, /SMALLER, /LARGER, /AFTER, /BEFORE, + /EXCEPT, etc. The resulting array has the number of files (n) + as its 0th element, and the filenames in elements 1 through n + Example: + + dir /array:&a /files /nobackup /after:19990101 /larger:10000 [ab]* + show array &a + + /FILES + Only show regular files. + + /DIRECTORIES + Only show directories. + + /BACKUP + In UNIX, OS-9, K-95, and other versions that support SET FILE + COLLISION BACKUP and create backup files by appending .~n~ to + the filename (where "n" is a number), /BACKUP means to include + these files in directory listings. This is the default. + + /NOBACKUP + This is the opposite of /BACKUP: that is, do not include backup + files in the listing. + + /BRIEF + List filenames only; use a compact format, as many filenames as + will fit across the screen (based on the longest name). A brief + listing is always sorted alphabetically. + + /VERBOSE + List one file per line, and include date, size, and (in UNIX + only) permissions of each file. This is the opposite of /BRIEF, + and is the default. + + /PAGE + Pause at the end of each screenful and give a "more?" prompt, + even if SET COMMAND MORE-PROMPTING is OFF. + + /NOPAGE + Don't pause at the end of each screenful and give a "more?" + prompt, even if SET COMMAND MORE-PROMPTING is ON. If neither + /PAGE or /NOPAGE is given, paging is according to the + prevailing COMMAND MORE-PROMPTING setting (which can be + displayed with SHOW COMMAND). + + /ENGLISHDATE + Show dates in dd-mmm-yyyy format; mmm is the first three + letters of the English month name. + + /ISODATE + Show dates in yyyy-mm-dd format; mm is the month number, 1-12. + This is the opposite of /ENGLISHDATE, and is the default. + + /HEADINGS + Print a heading before the listing and a summary at the end. + + /NOHEADINGS + Don't print a heading before the listing or a summary at the + end. This is the opposite of /HEADINGS, and is the default. + + /XFERMODE + Only in Kermit programs that support SET FILE PATTERNS. If this + switch is included, and the filename matches any FILE + BINARY-PATTERN ([465]Section 4.3), "(B)" is printed after the + filename; otherwise, if it matches a FILE TEXT-PATTERN, "(T)" + is printed. + + /NOXFERMODE + Don't display transfer-mode indicators. This is the opposite of + /XFERMODE and is the default. + + /RECURSIVE + Show files not only in the given directory, but also in its + subdirectories (if any), their subdirectories, etc. + + /NORECURSIVE + Don't show files in subdirectories. This is the opposite of + /RECURSIVE, and is the default. + + /MESSAGE:text + This lets you specify a short text string to be appended to the + end of each directory listing line (a space is supplied + automatically). If the text contains any spaces, enclose it in + braces, e.g. /MESSAGE:{two words}. + + /NOMESSAGE + Don't append any message to the end of each directory listing + line (default). + + /SORT:[{NAME,SIZE,DATE}] + Sort the listing by name, size, or date. If the /SORT switch is + given but the "sort-by" keyword is omitted, the listing is + sorted by name. /SORT:NAME /ASCENDING (alphabetic sort by name) + is the default. + + /NOSORT + Don't sort the listing. Files are listed in whatever order they + are supplied by the operating system, e.g. inode order in UNIX. + + /REVERSE + If the /SORT switch is given, reverse the order of the sort. + Synonym: /DESCENDING. + + /ASCENDING + If the /SORT switch is given, sort the listing in normal order. + This is the opposite of /REVERSE and is the default. + + Note that most of the DIRECTORY-specific switches come in pairs, in + which one member of a pair (e.g. /NOHEADINGS) is the opposite of the + other (e.g. /HEADINGS). + + If you always want to use certain options, you can set them with the + SET OPTIONS DIRECTORY command ([466]Section 1.5.5). Use SHOW OPTIONS + to list the options currently in effect. To make the desired options + apply every time you run C-Kermit, put a SET OPTIONS DIRECTORY command + in your C-Kermit customization file, specifying the desired options. + Options set in this manner apply to every subsequent DIRECTORY + command. Of course, if you include switches in a DIRECTORY command, + these override any defaults, built-in or custom. Example: + + DIRECTORY ; Use "factory defaults" + SET OPTIONS DIRECTORY /SORT:SIZE /REVERSE /HEADINGS ; Customize defaults + DIRECTORY ; Use customized defaults + DIR /SORT:NAME ; Override customized default SORT key + SET OPT DIR /RECURS ; Add /RECURSIVE to customized defaults + DIR /ASCEND ; Override customized default SORT order + + Notes: + + * Only a single sort key is supported; there is presently no way to + have multiple sort keys. + * If the /BRIEF switch is given, all other switches (except + /[NO]RECURSIVE, /[NO]DOTFILES, /DIRECTORIES, /FILES, and /ALL) are + ignored. + * /SORT:anything gives incorrect results if any files have lengths + greater than 10 digits (i.e. that are more than 9999999999 bytes + long, i.e. if they are 10GB or more in size) because the overlong + length field causes the date and name fields to be misaligned. + * /SORT:NAME is redundant in VMS since VMS returns filenames in + alphabetic order anyway. + * /SORT:NAME ignores alphabetic case on platforms where case does + not matter in filenames, but this works only for unaccented Roman + letters A-Z. + * /SORT:NAME is currently based on code values, and so works fine + for ASCII, but will probably produce unexpected results for files + with non-ASCII or 8-bit characters in their names. (Locale-based + sorting raises rather significant issues of portability, size, + performance, etc.) + * /SORT:DATE works right only for ISO-format dates, not English + ones. + * /SORT:SIZE sorts the size field lexically. On some platforms (e.g. + Windows), the size of a directory file is listed as "" rather + than as a number; in this case, the "" files are gathered at + the end (or beginning, depending on the sort order) of the + listing. + * /RECURSIVE is accepted but ignored in AOS/VS. Use the normal + system-specific filespec notation, e.g. "dir #.txt". + * /RECURSIVE has no affect when a full, absolute pathname is given; + e.g. "dir /recursive /tmp/foo" (where "foo" is a regular file) + only shows the "/tmp/foo" file. If you want to see all "foo" files + in the /tmp tree, do "cd /tmp" and then "dir /recursive foo". + * If a file size of -1 is shown, or date-time of 0000-00-00 + 00:00:00, this means the file was located, but access to + information about the file was denied to C-Kermit. + * In VMS, if FOO.DIR;1 is a directory within your current directory, + "directory foo" and "directory [.foo]" list the files in the + [.FOO] subdirectory, but "directory foo.dir" lists the directory + file itself; similarly for "*.dir" versus "[.*]", etc. + * In UNIX, if "foo" is a directory within your current directory, + "directory foo" lists the files in the foo directory. If you want + to list the foo directory file itself, put an asterisk at the end: + "dir foo*". + + Hint: How to find the biggest files in a directory tree: + + cd xxx ; (root of tree) + directory /sort:size /recursive /reverse /dotfiles /page + + Another hint: If you often use several different directory-listing + formats, define macro shortcuts for them: + + DEFINE WD DIRECTORY /SORT:DATE /REVERSE \%* ; Reverse chronological order + DEFINE SD DIRECTORY /SORT:SIZE /REVERSE \%* ; Reverse order of size + DEFINE ND DIRECTORY /SORT:NAME /ASCEND \%* ; Alphabetical by name + DEFINE DL DIR /DIR /SORT:NAME /ASCEND \%* ; Alphabetical directory list + + Put these definitions in your C-Kermit customization file. Note that + "\%*" ([467]Section 7.5) in these definitions lets you include other + switches in your macro invocations, e.g.: + + wd /headings *.txt + + Of course you can still access your external directory listing program + by using RUN or "!", e.g. in VMS: + + run directory /size/date/protection/except=*.obj oofa.*;0 + + or: + + !dir /size/date/prot/exc=*.obj oofa.*;0 + + In UNIX, use "!ls" or just "ls" (which is a special synonym for + "!ls"). + _________________________________________________________________ + + 4.5.2. The CD and BACK Commands + + In C-Kermit 7.0, the CD command has a new friend, the BACK command. + BACK means "CD to my previous current directory". A second BACK brings + you back to where you were before the first one; thus successive BACK + commands switch back and forth between two directories. + + 4.5.2.1. Parsing Improvements + + The CD command, as well as other commands that parse a directory name, + were changed in 7.0 to provide all the expected functions: completion + on Tab or Esc, directory-name lists on ?, etc. Other affected commands + include SET SERVER GET-PATH, SET TEMP-DIRECTORY, SET FILE + DOWNLOAD-DIRECTORY, and SPACE. CD and REMOTE CD also now work with + logical names. + + In VMS, the situation is a bit complicated since a directory name can + look like "DEV:", "[FOO.BAR]", "DEV:[FOO.BAR]", "[FOO]BAR.DIR;1", etc. + Completion and ?-help might not always work, but they do in many + cases. Examples: + + cd ? Lists all subdirectories of the current directory + cd []? Ditto + cd k? Ditto, but only those starting with K + cd [foo]? Lists all subdirectories of the [FOO] directory + cd [-]? Lists all subdirectories of the superior directory + cd [--]? Lists all subdirectories of the directory 2 levels up + cd [...]? Lists all directories below the current one + cd [foo.? Does not work. + + C-Kermit allows all of the following in VMS: + + cd bar CD to subdirectory BAR of the current directory + cd .bar Ditto + cd [.bar] Ditto + cd bar.dir etc... + cd bar.dir; + cd bar.dir;1 + cd [foo.bar] + cd bar.baz This can go more than 1 level deep... + cd dir: (where logical name DIR is defined as [FOO.BAR]) + + As well as the following: + + cd .. Go up one level as in UNIX + cd . The current directory + cd My login directory + + Note that "cd -" (go up one level) does not work as expected, because + "-" is Kermit's command continuation character. However, "cd [-]", and + " + cd {-}" have the desired effect (and so does "cd ..", which is easier + to type). + _________________________________________________________________ + + 4.5.2.2. The CDPATH + + The CD command in the UNIX, Windows, OS/2, and VMS versions of + C-Kermit, as of version 6.1 / 1.1.12, searches the CDPATH for the + given directory, if it is not absolute and if a CDPATH environment + variable is defined. Example (in UNIX ksh or bash): + + $ export CDPATH=$HOME:$HOME/kermit:/tmp + + Now if you give a "cd xxx" command, no matter what your current + directory is, if the "xxx" directory is not a subdirectory of your + current directory, then the xxx subdirectory of your home directory is + used or if that does not exist, then the xxx subdirectory of the + kermit subdirectory of your home directory is used or if that does not + exist, then /tmp/xxx is used. This is how the ksh "cd" command works, + and now the C-Kermit CD command works the same way. + + In VMS, you can define CDPATH to be a list of directories that contain + actual directory delimiters, and/or logical names representing + directories, using commas to separate them, e.g.: + + $ define cdpath [HOME],[SOMEOTHERDIR],[HOME.MISC] + $ define cdpath SYS$LOGIN:,DISK1:[HOME],DISK2:[SCRATCH.IVAN] + + Example: + + $ define cdpath SYS$LOGIN:,[IVAN],[OLAF],[OLGA.MISC] + $ kermit + DISK1:[OLGA] C-Kermit> cd blah + + tries the BLAH subdirectory of the user's login directory, then + [OLGA.BLAH], [IVAN.BLAH], [OLAF.BLAH], and [OLGA.MISC.BLAH], in that + order, using the first one it finds, failing if it finds none. + + In C-Kermit 7.0, you may also set the CDPATH from the Kermit prompt: + + SET CD PATH path + Allows the CD PATH to be set from within C-Kermit. + + SHOW CD shows the CD path and all other information relevant to the CD + command. + _________________________________________________________________ + + 4.5.2.3. CD Messages + + Whenever you change directory, you can have C-Kermit display a "Read + Me" file from the new directory automatically. The commands are: + + SET CD MESSAGE { ON, OFF, FILE list } + ON enables this feature; OFF (the default) disables it. File + lets you specify the name of the "Read Me" file. A list of + names to look for can be given in the following format: + + {{name1}{name2}{name3}{...}} + + e.g.: + + SET SERVER CD-MESSAGE FILE {{./.readme}{README.TXT}{READ.ME}} + + The default list of CD-message files is system dependent. + + SHOW CD shows your current directory, previous directory, CD path, and + CD message info. + _________________________________________________________________ + + 4.5.3. Creating and Removing Directories + + The MKDIR command now allows you to create multiple directories at + once: + + C-Kermit> mkdir a/b/c/d + + creates the directory a in the current directory (if it doesn't exist + already), and then creates subdirectory b in the a directory (if it + didn't exist already), and so on. + + If you use MKDIR to try to create a directory that already exists, + C-Kermit will print a warning ("?Directory already exists"), but the + MKDIR command will still succeed. If you want to avoid the warning + message, use IF DIRECTORY first to check if the directory already + exists. + + The RMDIR command, however, will not remove more than one directory, + nor will it remove a directory that contains any files. (There is, as + yet, no RMDIR /RECURSIVE command, although one might be added later.) + + In VMS, these commands (like CD) are more forgiving of your syntax + than is the DCL command shell; "mkdir oofa" is equivalent to "mkdir + [.oofa]" and so on. Also in VMS, you'll find that C-Kermit's RMDIR + command is easier than deleting a directory in DCL, since it + automatically first gives it owner delete permission if you are the + owner. + _________________________________________________________________ + + 4.5.4. The DELETE and PURGE Commands + + The DELETE command now offers a selection of switches, and has a new + companion, the PURGE command. First, DELETE: + + DELETE [ switches... ] filespec + Deletes the file or files that match the filespec, which may + contain wildcards ([468]Section 4.9). + + Optional switches include the standard file-selection switches + presented in [469]Section 1.5.4, plus: + + /ASK + Before deleting each file, ask permission interactively. + Answers are Yes or OK (delete the file), No (don't delete it), + or Quit (stop executing the DELETE command). + + /NOASK + Don't ask permission to delete each file. + + /LIST + List each file and show whether it was deleted. Synonyms: /LOG, + /VERBOSE. + + /NOLIST + Don't list files while deleting them. Synonyms: /NOLOG, /QUIET. + + /HEADING + Print a heading and summary line. + + /NOHEADING + Don't print a heading and summary line. + + /PAGE + When listing, pause at the end of each screenful and give the + "More?" prompt. If you reply "n" (no), the DELETE command + terminates. + + /SIMULATE + Do everything implied by the given switches and filespec, + except do not actually delete any files. This lets you preview + which files would be deleted; implies /LIST. + + Now the PURGE command: + + PURGE [ switches... ] [ filespec ] + (VMS only) Runs the DCL PURGE command. Switches and filespec, + if any, are passed directly to DCL without parsing or + verification. Deletes excess versions of the given (or all) + files. The rest of this section does not apply to VMS. + + PURGE [ switches... ] [ filespec ] + (UNIX only) Deletes "backup files" that match the filespec, + which may contain wildcards ([470]Section 4.9). If no filespec + is given, all backup files in the current directory are + selected (subject to modification by any switches). Do not + include backup notation in the filespec. + + Explanation: + + To avoid destroying preexisting files when a new file arrives that has + the same name, C-Kermit backs up the old file by appending a "backup + number" to its name. In UNIX, the backup suffix consists of a period, + a tilde, a number, and another tilde. For example, if a file called + oofa.txt exists and a new oofa.txt file arrives, the original is + renamed to oofa.txt.~1~. If another oofa.txt file arrives, the + existing one is renamed to oofa.txt.~2~. And so on. This system is + compatible with the one used by EMACS. Thus over time, if you receive + a lot of files with C-Kermit or edit them with EMACS, backup files can + build up. The new PURGE command lets you clean out accumulated backup + files: + + Optional switches include the standard file-selection switches + presented in [471]Section 1.5.4, plus all the switches listed above + for the DELETE command, plus: + + /KEEP:n + Retains the n most recent (highest-numbered) backup files for + each file. For example, if oofa.txt, oofa.txt.~1~, + oofa.txt.~2~, oofa.txt.~10~, oofa.txt.~12~, and oofa.txt.~100~ + exist, "purge /keep:2 oofa.txt" deletes oofa.txt.~1~, + oofa.txt.~2~, and oofa.txt.~10~, and keeps oofa.txt, + oofa.txt.~12~, and oofa.txt.~100~. If /KEEP is given without a + number, one (the highest numbered) backup file is kept. + + CAUTION: The PURGE command should be used only when *.~*~ files truly + are backup files. This is the case for EMACS, and it is the DEFAULT + for C-Kermit. However, if C-Kermit's FILE COLLISION has been set to + RENAME, newly received files will look like backup files. In that + case, don't use the PURGE command or you'll be removing new files + rather than old ones. (Use SHOW FILE to find the FILE COLLISION + setting.) + + The PURGE command is presently available only in UNIX. The command + succeeds if it deleted any files, or if it deleted no files but there + were no errors. It fails if it deleted no files and there were errors + (i.e. deletion was attempted but failed). In VMS, backup file versions + are handled automatically by the OS, and a PURGE command can be used + at the VMS prompt to clean them up. + + If you want certain switches to be supplied automatically with each + DELETE or PURGE command, you can set them with SET OPTIONS + ([472]Section 1.5.5) and you can display any such settings with SHOW + OPTIONS. Of course you can override them on a per-command basis by + including switches in your PURGE or DELETE command. + + Also see SET FILE COLLISION, SHOW FILE, SEND /NOBACKUP, SET SEND + BACKUP, and DIRECTORY /[NO]BACKUP. + _________________________________________________________________ + + 4.6. Starting the Remote Kermit Server Automatically + + As noted on pages 275-276 of [473]Using C-Kermit 2nd edition, you can + have Kermit send "kermit receive" commands automatically when it is in + local mode and you give a SEND or similar command, to start the remote + Kermit receiver in case it is not already started. The "kermit + receive" commands are specified by: + + SET PROTOCOL KERMIT binary-receive-command text-receive-command + + As of version 7.0, a Kermit protocol option has been added to send a + string to the host in advance of any Kermit packets when you give a + GET-class or REMOTE command. This will switch the remote C-Kermit into + the appropriate mode or, if the remote system is at a system command + (shell) prompt, execute the string on the remote system. The new + syntax of the SET PROTOCOL KERMIT command is: + + SET PROTOCOL KERMIT [ s1 [ s2 [ s3 ] ] ] + + where: + + Default Meaning + s1 {kermit -ir} Remote "kermit receive in binary mode" command. + s2 {kermit -r} Remote "kermit receive in text mode" command. + s3 {kermit -x} Remote "start kermit server" command. + + NOTE: If the remote Kermit is 6.0, the following are recommended for + fast startup and high-performance file transfer (see Appendix I in + [474]Using C-Kermit, second Edition, for command-line options): + + s1 kermit -YQir (Kermit receive binary, skip init file, fast.) + s2 kermit -YQTr (Kermit receive text, skip init file, fast.) + s3 kermit -YQx (Kermit server, skip init file, fast.) + + If the remote is C-Kermit 7.0 or later, change the -x option (enter + server mode) to -O (uppercase letter O), which means "enter server + mode for One transaction only); this way, it is not stuck in server + after the transfer. Also note that the Q is redundant in version 7.0, + since fast Kermit protocol settings are now the default. + + Note that in case the C-Kermit executable is called "wermit" or + "ckermit" you can change "kermit" in the strings above to "wermit" or + "ckermit" and C-Kermit 7.0 or later will recognize these as synonyms + for "kermit", in case it is at its command prompt when one of these + strings is sent to it. + _________________________________________________________________ + + 4.7. File-Transfer Command Switches + + Over the years, various new methods of transferring a file have + accumulated, until we had, in addition to the SEND command, also MOVE + (send and then delete), MAIL (send as email), REMOTE PRINT (send to be + printed), CSEND (send the output of a command), PSEND (send a part of + a file), BSEND (send in binary mode), RESEND (resume an interrupted + SEND), etc etc. Similarly: GET, REGET, CGET, RETRIEVE, and so on. + + Not only is it confusing to have different names for these commands, + many of which are not real words, but this also does not allow all + combinations, like "send a file as mail, then delete it". + + In C-Kermit 7.0, the SEND, GET, and RECEIVE commands were restructured + to accept modifier switches (switches are explained in [475]Section + 1.5). + _________________________________________________________________ + + 4.7.1. SEND Command Switches + + Without switches, the SEND command still works exactly as before: + + send oofa.txt ; send a single file + send oofa.* ; send multiple files + send oofa.txt x.x ; send oofa.txt as x.x (tell receiver its name is x.x) + send ; send from SEND-LIST + + But now the following modifier switches may be included between "send" + and the filename. Zero, one, two, or more switches may be included in + any combination that makes sense. Switch names (such as /BINARY) can + be abbreviated, just like any other keywords. Most of these switches + work only when using Kermit protocol (/TEXT and /BINARY are the + exceptions). + + /AFTER:date-time + Specifies that only those files modified (or, in VMS, created) + after the given date-time (see [476]Section 1.6) are to be + sent. Examples: + + send /text /after:{2-Feb-1997 10:28:30} *.txt + send /text /after:\fdate(oofa.txt) *.txt + + Synonym: /SINCE. + + /ARRAY:arrayname + Specifies that instead of sending a file, C-Kermit is to send + the contents of the given array. Since an array does not have a + filename, you should include an /AS-NAME switch to specify the + name under which the array is to be sent (if you do not, the + name "_array_x_" is used, where 'x' is replaced by the array + designator). See [477]section 7.10 for array-name syntax. As + noted in that section, you can also include a range to have a + segment of the array sent, rather than the whole thing; for + example: "send /array:&a[100:199]". It is strongly recommended + that you accompany the /ARRAY switch with a /TEXT or /BINARY + switch to force the desired transfer mode, since otherwise the + various automatic mechanisms might switch to binary mode when + you really wanted text, or vice versa. In text mode a line + terminator is added to the end of each array element, but not + in binary mode. For details and examples see [478]Section + 7.10.11. + + /AS-NAME:text + Specifies "text" as the name to send the file under. You can + also still specify the as-name as the second filename on the + SEND command line. The following two commands are equivalent: + + send oofa.txt oofa.new + send /as:oofa.new oofa.txt + + /BEFORE:date-time + Specifies that only those files modified (or, in VMS, created) + before the given date-time ([479]Section 1.6) are to be sent. + + /BINARY + Performs this transfer in binary mode without affecting the + global transfer mode, overriding not only the FILE TYPE and + TRANSFER MODE settings, but also the FILE PATTERN setting, but + for this SEND command only. In other words, SEND /BINARY means + what it says: send the file in binary mode, regardless of any + other settings. Example: + + set file type text ; Set global transfer mode to text + send /binary oofa.zip ; Send a file in binary + send oofa.txt ; This one is sent in text mode + + /COMMAND + SEND /COMMAND is equivalent to CSEND ([480]Section 4.2.2) -- it + says to send the output from a command, rather than the + contents of a file. The first "filename" on the SEND command + line is interpreted as the name of a command; the second (if + any) is the as-name. Examples: + + send /command {grep Sunday oofa.txt} sunday.txt + send /as-name:sunday.txt /command {grep Sunday oofa.txt} + send /bin /command {tar cf - . | gzip -c} {!gunzip -c | tar xf -} + + /DELETE + Deletes the file (or each file in the group) after it has been + sent successfully (but does not delete it if it was not sent + successfully). SEND /DELETE is equivalent to MOVE. Has no + effect when used with /COMMAND. Example: + + send /delete *.log + + /DOTFILES + (UNIX and OS-9 only) Normally files whose names begin with "." + are skipped when matching wildcards that do not also beging + with ".". Include /DOTFILES to force these files to be included + too. + + /RECURSIVE + Descend the through the directory tree when locating files to + send. Automatically sets /PATHNAMES:RELATIVE. Explained in + [481]Section 4.11 . + + /EXCEPT:pattern + See [482]Section 1.5.4. + + /NOBACKUP + This means to skip backup files when sending, even if they + match the SEND file specification. This is equivalent to using + SEND /EXCEPT and including *.~[0-9]*~ in the exception list (or + *.~*~ if Kermit was built without pattern-matching support; see + [483]Section 4.9.1). Including this switch is equivalent to + giving SET SEND BACKUP OFF ([484]Section 4.0.6) prior to SEND, + except its effect is local to the SEND command with which it + was given. + + /NODOTFILES + The opposite of /DOTFILES (q.v.) + + /FILENAMES:{CONVERTED,LITERAL} + Use this switch to override the current global SET FILE NAMES + setting for this transfer only. + + /FILTER:command + This specifies a filter to pass the file through before sending + it. See the [485]section on file-transfer pipes and filters. + The /FILTER switch applies only to the file-transfer command it + is given with; it does not affect the global SEND FILTER + setting, if any. + + /IMAGE + VMS: Sends in image mode. Non-VMS: same as /BINARY. + + /LABELED + VMS and OS/2 only: Sends in labeled mode. + + /LARGER-THAN:number + Specifies that only those files that are longer than the given + number of bytes are to be sent. + + /LISTFILE:filename + Specifies that the files to be sent are listed in a file with + the given filename. The file contains one filename per line. + These filenames are not checked in any way; each filename is + taken and does not use or depend on any Kermit-specific syntax. + In particular, backslashes are not treated specially, leading + and trailing spaces are not stripped, etc. However, if a + filename contains wildcards, they are expanded. Example: If a + file named files.txt contains the following lines: + + blah.txt + oofa* + x.x + + (but without leading or trailing spaces), then the C-Kermit + command "send /listfile:files.txt" will send the files + blah.txt, x.x, and all files whose names start with "oofa", + assuming the files exist and are readable. The /LISTFILE + switch, can, of course, be used with other switches when it + makes sense, for example, /EXCEPT, /BINARY, /AFTER, /SMALLER, + /MOVE-TO, /DELETE, /AS-NAME with a template, etc. + + /MAIL:address + Sends the file as e-mail to the given address or addresses. + "send /mail:address filename" is equivalent to "mail filename + address". You can include multiple addresses separated by + commas. Examples: + + send /mail:kermit-support@columbia.edu packet.log + send /mail:cmg,fdc,jrd oofa.txt + + As with any switch argument, if the address or address list + contains any spaces, you must enclose it in braces. The format + of the addresses must agree with that understood by the + mail-sending program on the receiver's computer. + + /MOVE-TO:directory-name + Specifies that after each (or the only) source file is sent + successfully, and ONLY if it is sent successfully, it should be + moved to the named directory. If the directory name contains + spaces, enclose it in braces. If the directory does not exist, + it is created if possible; if it can't be created, the command + fails and an error message is printed. Example: + + send /text /move-to:/users/olga/backup/ *.txt + + /NOT-AFTER:date-time + Specifies that only those files modified at or before the given + date and time are to be sent. + + /NOT-BEFORE:date-time + Specifies that only those files modified at or after the given + date and time are to be sent. + + /PATHNAMES:{OFF,ABSOLUTE,RELATIVE} + Use this switch to override the current global SET SEND + PATHNAMES setting for this transfer only. /PATHNAMES:ABSOLUTE + or RELATIVE also sets /FILENAMES:LITERAL (also for this + transfer only) since pathnames are not sent otherwise. + + /RENAME-TO:text + Specifies that after the (or each) source file is sent + successfully, and ONLY if it is sent successfully, it should be + renamed to the name given. If the name contains spaces, enclose + it in braces. If a file group is being sent, then the "text" + must contain a variable reference such as \v(filename) (see + [486]Section 4.1). Example: + + send /rename-to:ok_\v(filename) *.* + + This sends each file in the current directory and if it was + sent successfully, changes its name to begin with "ok_". + + /SMALLER-THAN:number + Specifies that only those files that are smaller than the given + number of bytes are to be sent. + + /SUBJECT:text + Subject for email. Actually, this is just a synonym for + /AS-NAME. If the text includes spaces, you must enclose it in + braces. If you don't specify a subject (or as-name), the name + of the file is used as the subject. Example: + + send /mail:kermit-support@columbia.edu /subj:{As requested} packet.log + + /PRINT:options + Sends the file to be printed, optionally specifying options for + the printer. Equivalent to REMOTE PRINT filename options. + Examples: + + send /print oofa.txt ; No options. + send /print:/copies=3 oofa.txt ; "/copies=3" is a VMS PRINT switch. + send /print:-#3 oofa.txt ; "-#3" is a UNIX lpr switch. + + /PROTOCOL:name + Uses the given protocol to send the file (Kermit, Zmodem, etc) + for this transfer without changing global protocol. Only + available in Kermit 95, UNIX, and OS-9. Example: + + set protocol kermit ; Set global protocol + send /proto:zmodem /bin oofa.zip ; Send just this file with Zmodem + send oofa.txt ; This file is sent with Kermit + + /QUIET + When sending in local mode, this suppresses the file-transfer + display. + + /RECOVER + Used to recover from a previously interrupted transfer; SEND + /RECOVER is equivalent to RESEND. Recovery only works in binary + mode; SEND /RECOVER and RESEND include an implied /BINARY + switch. Even then, recovery will successful only if (a) the + original (interrupted) transfer was also in binary mode, or (b) + if it was in text mode, the two Kermit programs run on + platforms where text-mode transfers are not length-changing. + + /STARTING:number + Starts sending the file from the given byte position. SEND + /STARTING:n filename is equivalent to PSEND filename n. + + /TEXT + Performs this transfer in text mode without affecting the + global transfer mode, overriding not only the FILE TYPE and + TRANSFER MODE settings, but also the FILE PATTERN setting, for + this SEND command only. In other words, SEND /TEXT really send + the file in text mode, regardless of any other settings or + negotiations. + + About mail... Refer to [487]Section 4.7.1. The same rules apply as for + file transfer. If you are mailing multiple files, you can't use an + as-name (in this case, a subject) unless it contains replacement + variables like \v(filenum). For example, if you: + + send /mail:somebody@xyz.com *.txt + + Then each file will arrive as a separate email message with its name + as the subject. But if you: + + send /mail:somebody@xyz.com /subject:{Here is a file} *.txt + + Then each file message will have the same subject, which is probably + not what you want. You can get around this with constructions like: + + send /mail:somebody@xyz.com /subject:{Here is \v(filename)} *.txt + + which embed the filename in the subject. + + The MOVE, CSEND, MAIL, and RESEND commands now also accept the same + switches. And the switches are also operative when sending from a + SEND-LIST (see [488]Using C-Kermit, 2nd Ed, pp.191-192), so, for + example, it is now possible to SEND /PRINT or SEND /MAIL from a + SEND-LIST. + + The MSEND and MMOVE commands also take switches, but not all of them. + With these commands, which take an arbitrary list of filespecs, you + can use /BINARY, /DELETE, /MAIL, /PRINT, /PROTOCOL, /QUIET, /RECOVER, + and /TEXT (and /IMAGE or /LABELED, depending on the platform). MMOVE + is equivalent to MSEND /DELETE. (If you want to send a group of files, + but in mixed transfer modes with per-file as-names, use ADD SEND-LIST + and then SEND.) + + The MSEND/MMOVE switches come before the filenames, and apply to all + of them: + + msend /print /text *.log oofa.txt /etc/motd + + If you type any of these commands (SEND, CSEND, MSEND, etc) followed + by a question mark (?), you will see a list of the switches you can + use. If you want to see a list of filenames, you'll need to type + something like "send ./?" (UNIX, OS/2, Windows, etc), or "send []?" + (VMS), etc. Of course, you can also type pieces of a filename + (anything that does not start with "/") and then "?" to get a list of + filenames that start that way; e.g. "send x.?" still works as before. + + In UNIX, where "/" is also the directory separator, there is usually + no ambiguity between a fully-specified pathname and a switch, except + when a file in the root directory has the same name as a switch (as + noted in [489]Section 1.5): + + send /etc/motd ; Works as expected + send /command ; ??? + + The second example interprets "/command" as a switch, not a filename. + To send a file actually called "command" in the root directory, use: + + send {/command} + + or other system-dependent forms such as //command, /./command, + c:/command, etc, or cd to / and then "send command". + _________________________________________________________________ + + 4.7.2. GET Command Switches + + Without switches, the GET command still works about the same as + before: + + get oofa.txt ; GET a single file + get oofa.* ; GET multiple files + + However, the mechanism for including an "as-name" has changed. + Previously, in order to include an as-name, you were required to use + the "multiline" form of GET: + + get + remote-filespec + local-name + + This was because the remote filespec might contain spaces, and so + there would be no good way of telling where it ended and where the + local name began, e.g: + + get profile exec a foo + + But now since we can use {braces} for grouping, we don't need the + multiline GET form any more, and in fact, support for it has been + removed. If you give a GET command by itself on a line, it fails and + an error message is printed. The new form is: + + GET [ switches... ] remote-name [ local-name ] + Ask the server to send the file whose name is remote-name. If + the optional local-name is given, store it locally under this + name. If the remote-name or local-name contains spaces, they + must be enclosed in braces: + + get {profile exec a} foo + get oofa.txt {~/My Files/Oofa text} + + If you want to give a list of remote file specifications, use the MGET + command: + + MGET [ switches... ] remote-name [ remote-name [ remote-name ... ] ] + Ask the server to send the files whose names are given. + + Now you can also include modifier switches between GET or MGET and the + remote-name; most of the same switches as SEND: + + /AS-NAME:text + Specifies "text" as the name to store the incoming file under. + (This switch is not available for MGET.) You can also still + specify the as-name as the second filename on the GET command + line. The following two commands are equivalent: + + get oofa.txt oofa.new + get /as:oofa.new oofa.txt + + /BINARY + Tells the server to send the given file(s) in binary mode + without affecting the global transfer mode. Example: + + set file type text ; Set global transfer mode to text + get /binary oofa.zip ; get a file in binary mode + get oofa.txt ; This one is transferred in text mode + + Or, perhaps more to the point: + + get /binary foo.txt ; where "*.txt" is a text-pattern + + This has the expected effect only if the server is C-Kermit 7.0 + or later or K95 1.1.19 or later. + + /COMMAND + GET /COMMAND is equivalent to CGET ([490]Section 4.2.2) -- it + says to receive the file into the standard input of a command, + rather than saving it on disk. The /AS-NAME or the second + "filename" on the GET command line is interpreted as the name + of a command. Examples: + + get /command sunday.txt {grep Sunday oofa.txt} + get /command /as-name:{grep Sunday oofa.txt} sunday.txt + get /bin /command {!gunzip -c | tar xf -} {tar cf - . | gzip -c} + + /DELETE + Asks the Kermit server to delete the file (or each file in the + group) after it has been transferred successfully (but not to + delete it if it was not sent successfully). GET /DELETE is + equivalent to RETRIEVE. Example: + + get /delete *.log + + /EXCEPT:pattern + Specifies that any files whose names match the pattern, which + can be a regular filename, or may contain "*" and/or "?" + metacharacters, are to be refused upon arrival. To specify + multiple patterns (up to 8), use outer braces around the group, + and inner braces around each pattern: + + /EXCEPT:{{pattern1}{pattern2}...} + + See the description of SEND /EXCEPT in [491]Section 4.7.1 for + examples, etc. Refusal is accomplished using the Attribute + Rejection mechanism (reason "name"), which works only when + Attribute packets have been successfully negotiated. + + /FILENAMES:{CONVERTED,LITERAL} + Use this switch to override the current global SET FILE NAMES + setting for this transfer only. + + /FILTER:command + This specifies a filter to pass the incoming file through + before writing to disk. See the [492]section on file-transfer + pipes and filters. The /FILTER switch applies only to the + file-transfer command it is given with; it does not affect the + global RECEIVE FILTER setting, if any. + + /IMAGE + VMS: Transfer in image mode. Non-VMS: same as /BINARY. + + /LABELED + VMS and OS/2 only: Specifies labeled transfer mode. + + /MOVE-TO:directory + This tells C-Kermit to move each file that is successfully + received to the given directory. Files that are not + successfully received are not moved. By default, files are not + moved. + + /PATHNAMES:{OFF,ABSOLUTE,RELATIVE,AUTO} + Use this switch to override the current global SET RECEIVE + PATHNAMES setting for this transfer only. /PATHNAMES:ABSOLUTE + or RELATIVE also sets /FILENAMES:LITERAL (also for this + transfer only) since incoming pathnames would not be treated as + pathnames otherwise. See [493]Section 4.10. + + /QUIET + When sending in local mode, this suppresses the file-transfer + display. + + /RECOVER + Used to recover from a previously interrupted transfer; GET + /RECOVER is equivalent to REGET. Recovery only works in binary + mode; SEND /RECOVER and RESEND include an implied /BINARY + switch. Even then, recovery will successful only if (a) the + original (interrupted) transfer was also in binary mode, or (b) + if it was in text mode, the two Kermit programs run on + platforms where text-mode transfers are not length-changing. + + /RECURSIVE + Tells the server that the GET file specification applies + recursively. This switch also automatically sets + /PATHNAMES:RELATIVE in both the server AND the client. When + used in conjunction with /DELETE, this "moves" a directory tree + from the server's computer to the client's computer (except + that only regular files are deleted from the server's computer, + not directories; thus the original directories will be left, + but will contain no files). Note that all servers that support + /RECURSIVE do not necessarily do so in combination with other + switches, such as /RECOVER. (Servers that do include C-Kermit + 7.0 and later, K95 1.1.19 and later.) + + /RENAME-TO:string + This tells C-Kermit to rename each file that is successfully + received to the given string. Files that are not successfully + received are not renamed. By default, files are not renamed. + The string can be a literal string, which is appropriate when + only one file is being received, or it can contain one or more + variables that are to be evaluated at the time each file is + received, such as \v(filename), \v(filenumber), \v(ntime), + \v(pid), \v(user), etc. WARNING: if you give a literal string + and more than one file arrives, each incoming file will be + given the same name (but SET FILE COLLISION BACKUP or RENAME + can be used to keep the incoming files from overwriting each + other). + + /TEXT + Tells the server to perform this transfer in text mode without + affecting its global transfer mode. See /BINARY for additional + info. + + The /MAIL and /PRINT options are not available (as they are for SEND), + but you can use /COMMAND to achieve the same effect, as in these UNIX + examples: + + get /command oofa.txt {mail kermit@columbia.edu} + get /command oofa.txt lpr + + In OS/2 or Windows, you can GET and print like this: + + get oofa.txt prn + + The CGET, REGET, RETRIEVE commands also accept the same switches as + GET. CGET automatically sets /COMMAND; REGET automatically sets + /RECOVER and /BINARY, and RETRIEVE automatically sets /DELETE. + _________________________________________________________________ + + 4.7.3. RECEIVE Command Switches + + Without switches, the RECEIVE command still works as before: + + receive ; Receives files under their own names + receive /tmp ; Ditto, but into the /tmp directory + r ; Same as "receive" + receive foo.txt ; Receives a file and renames to foo.txt + + Now you can also include modifier switches may be included between + "receive" and the as-name; most of the same switches as GET: + + /AS-NAME:text + Specifies "text" as the name to store the incoming file under. + You can also still specify the as-name as a filename on the + command line. The following two commands are equivalent: + + r oofa.new + r /as:oofa.new + + /BINARY + Performs this transfer in binary mode without affecting the + global transfer mode. NOTE: This does not override the incoming + filetype (as it does with GET), so this switch is useful only + if ATTRIBUTE TYPE is OFF, or if the other Kermit does not send + a TYPE (text or binary) attribute. In any case, it has no + affect whatsoever on the file sender. + + /COMMAND + RECEIVE /COMMAND is equivalent to CRECEIVE ([494]Section 4.2.2) + -- it says to receive the file into the standard input of a + command, rather than saving it on disk. The /AS-NAME or the + "filename" on the RECEIVE command line is interpreted as the + name of a command. + + r /command {grep Sunday oofa.txt} + r /command /as-name:{grep Sunday oofa.txt} + r /bin /command {tar cf - . | gzip -c} + + /EXCEPT:pattern + Specifies that any files whose names match the pattern, which + can be a regular filename, or may contain "*" and/or "?" + metacharacters, are to be refused upon arrival. To specify + multiple patterns (up to 8), use outer braces around the group, + and inner braces around each pattern: + + /EXCEPT:{{pattern1}{pattern2}...} + + See the description of SEND /EXCEPT in [495]Section 4.7.1 for + examples, etc. Refusal is accomplished using the Attribute + Rejection mechanism (reason "name"), which works only when + Attribute packets have been successfully negotiated. + + /FILENAMES:{CONVERTED,LITERAL} + Use this switch to override the current global SET FILE NAMES + setting for this transfer only. + + /FILTER:command + This specifies a filter to pass the incoming file through + before writing to disk. See the [496]section on file-transfer + pipes and filters. The /FILTER switch applies only to the + file-transfer command it is given with; it does not affect the + global RECEIVE FILTER setting, if any. + + /IMAGE + VMS: Transfer in image mode. Non-VMS: same as /BINARY. See + comments under RECEIVE /BINARY. + + /LABELED + VMS and OS/2 only: Specifies labeled transfer mode. See + comments under RECEIVE /BINARY. + + /MOVE-TO:directory + This tells C-Kermit to move each file that is successfully + received to the given directory. Files that are not + successfully received are not moved. By default, files are not + moved. + + /PATHNAMES:{ABSOLUTE,RELATIVE,OFF,AUTO} + Use this switch to override the current global SET RECEIVE + PATHNAMES setting for this transfer only. See [497]Section + 4.10. + + /RECURSIVE + When used with the RECEIVE command, /RECURSIVE is simply a + synonym for /PATHNAMES:RELATIVE. + + /RENAME-TO:string + This tells C-Kermit to rename each file that is successfully + received to the given string. Files that are not successfully + received are not renamed. By default, files are not renamed. + The string can be a literal string, which is appropriate when + only one file is being received, or it can contain one or more + variables that are to be evaluated at the time each file is + received, such as \v(filename), \v(filenumber), \v(ntime), + \v(pid), \v(user), etc. WARNING: if you give a literal string + and more than one file arrives, each incoming file will be + given the same name (but SET FILE COLLISION BACKUP or RENAME + can be used to keep the incoming files from overwriting each + other). + + /QUIET + When receiving in local mode, this suppresses the file-transfer + display. + + /TEXT + Receives in text mode without affecting the global transfer + mode. See comments under RECEIVE /BINARY. + + The /MAIL and /PRINT options are not available, but you can use + /COMMAND to achieve the same effect, as in these UNIX examples: + + r /command {mail kermit@columbia.edu} + r /command lpr + + In OS/2 or Windows, you can RECEIVE and print like this: + + receive prn + + The CRECEIVE command now also accepts the same switches. + _________________________________________________________________ + + 4.8. Minor Kermit Protocol Improvements + + 4.8.1. Multiple Attribute Packets + + C-Kermit 7.0 now sends more than one Attribute packet if a file's + attributes do not fit into a single packet of the negotiated length. + If a particular attribute (such as file creation date-time) does not + fit within the negotiated length (which will only happen when the + negotiated length is around 20 or less), that attribute is not sent at + all. + + 4.8.2. Very Short Packets + + There are certain situations where extremely short packets must be + used; 20 or 30 bytes at most. This can happen when one or more devices + along the communication path have very small buffers and lack an + effective means of flow control. Examples are sometimes cited + involving radio modems. + + When the maximum packet length is shorter than certain packets that + would be sent, those packets are either truncated or else broken up + into multiple packets. Specifically: + + 1. Parameter negotiation packets (I, S, and their ACKs) are truncated + to the negotiated length. Any parameters that do not fit are reset + to their default values. There is no provision in the Kermit + protocol for fragmentation and reassembly of parameter strings. + 2. File header packets (containing the filename) are simply + truncated. There is no provision in the Kermit protocol for + fragmentation and reassembly of filenames. + 3. Attribute packets are fragmented and reassembled as described in + 4.8.1 without loss of data, except in case a field will not fit at + all in the negotiated length (the longest attribute is usually the + date and time of file creation/modification) because of the rule + that attributes may not be broken across packets. + 4. Data packets and other packets are unaffected -- they can be as + short as they need to be, within reason. + _________________________________________________________________ + + 4.9. Wildcard / File Group Expansion + + "Wildcard" refers to the notation used in filenames to specify a group + of files by pattern matching. + + 4.9.1. In UNIX C-Kermit + + Prior to C-Kermit 7.0, C-Kermit was capable of expanding wildcard + strings containing only the "metacharacters" '*' and '?': + + * + Matches any sequence of zero or more characters. For example: + "ck*.c" matches all files whose names start with "ck" and end + with ".c", including "ck.c". + + ? + Matches any single character. For example, "ck?.c" matches all + files whose names are exactly 5 characters long and start with + "ck" and end with ".c". When typing commands at the prompt, you + must precede any question mark to be used for matching by a + backslash (\) to override the normal function of question mark, + which is providing menus and file lists. + + C-Kermit 7.0 adds the additional features that users of ksh, csh, and + bash are accustomed to: + + [abc] + Square brackets enclosing a list of characters matches any + single character in the list. Example: ckuusr.[ch] matches + ckuusr.c and ckuusr.h. + + [a-z] + Square brackets enclosing a range of characters; the hyphen + separates the low and high elements of the range. For example, + [a-z] matches any character from a to z. + + [acdm-z] + Lists and ranges may be combined. This example matches a, c, d, + or m through z. + + {string1,string2,...} + Braces enclose a list of strings to be matched. For example: + ck{ufio,vcon,cmai}.c matches ckufio.c, ckvcon.c, or ckcmai.c. + The strings may themselves contain metacharacters, bracket + lists, or indeed, other lists of strings, but (when matching + filenames) they may not contain directory separators. + + Thus, the metacharacters in filenames (and in any other field + that can be a pattern, such as the IF MATCH pattern, SEND or + GET exception lists, etc) are: + + * ? [ { + + And within braces only, comma (,) is a metacharacter. + + To include a metacharacter in a pattern literally, precede it with a + backslash '\' (or two if you are passing the pattern to a macro). + Examples: + + send a*b ; Send all files whose names start with 'a' and end with 'b'. + send a?b ; Ditto, but the name must be exactly three characters long. + send a[a-z]b ; Ditto, but the second character must be a lowercase letter. + send a[x\-z]b ; Ditto, except the second character must be 'x', '-', or 'y'. + send a[ghi]b ; Ditto, except the second character must be 'g', 'h', or 'i'. + send a[?*]b ; Ditto, except the second character must be '?' or '*'. + send a[\?\*]b ; Same as previous. + send *?[a-z]* ; All files with names containing at least one character + ; that is followed by a lowercase letter. + + Or, more practically: + + send ck[cuw]*.[cwh] ; Send the UNIX C-Kermit source files. + + To refer to the C-Kermit sources files and makefile all in one + filespec: + + {{makefile,ck[cuw]*.[cwh]}} + + (NOTE: if the entire pattern is a {stringlist}, you must enclose it it + TWO pairs of braces, since the SEND command strips the outer brace + pair, because of the "enclose in braces if the filename contains + spaces" rule). + + If the makefile is called ckuker.mak: + + ck[cuw]*.{[cwh],mak} + + (NOTE: double braces are not needed here since the pattern does not + both begin and end with a brace.) + + To add in all the C-Kermit text files: + + ck[cuw]*.{[cwh],mak,txt} + + All of these features can be used anywhere you would type a filename + that is allowed to contain wildcards. + + When you are typing at the command prompt, an extra level of quoting + is required for the '?' character to defeat its regular function of + producing a list of files that match what you have typed so far, for + example: + + send ck[cu]? + + lists all the files whose names start with ckc and cku. If you quote + the question mark, it is used as a pattern-matching character, for + example: + + send ck\?[ft]io.c + + sends all the file and communications i/o modules for all the + platforms: ckufio.c, ckutio.c, ckvfio.c, ckvtio.c, etc. + + If, however, a filename actually contains a question mark and you need + to refer to it on the command line, you must use three (3) + backslashes. For example, if the file is actually called ck?fio.c, you + would use: + + send ck\\\?fio.c + + Further notes on quoting: + + * A single backslash is sufficient for quoting a special character + at the command prompt or in a command file. However, when passing + patterns to macros you'll need double backslashes, and when + referring to these patterns within the macro, you'll need to use + \fcontents(\%1) (see [498]Section 1.11.5). You should enclose + macro argument references in braces in case grouped arguments were + passed. Example: + define ismatch { + if match {\fcont(\%1)} {\fcont(\%2)} { + end 0 MATCH + } else { + end 1 NO MATCH + } + } + ismatch ab*yz a*\\**z ; Backslash must be doubled + ismatch {abc def xyz} *b*e*y* ; Braces must be used for grouping + * Watch out for possible conflicts between {} in filename patterns + and {} used for grouping multiple words into a single field, when + the pattern has outer braces. For example, in: + if match {abc xyz} {a* *z} echo THEY MATCH + braces must be used to group "abc xyz" into a single string. + Kermit strips off the braces before comparing the string with the + pattern. Therefore: + if match makefile {makefile,Makefile} echo THEY MATCH + does not work, but: + if match makefile {{makefile,Makefile}} echo THEY MATCH + does. + * If you use a pattern that has outer braces, like {*.txt,*.doc}, in + a field that accepts a pattern list (like SEND /EXCEPT:xxx), + you'll need to add two extra sets of outer braces: + send /except:{{{*.txt,*.doc}}} *.* + + C-Kermit's new pattern matching capabilities are also used when + C-Kermit is in server mode, so now you can send requests such as: + + get ck[cuw]*.[cwh] + + to a C-Kermit server without having to tell it to SET WILD SHELL + first. Previously this would have required: + + mget ckc*.c ckc*.w ckc*.h cku*.c cku*.w cku*.h ckw*.c ckw*.w ckw*.h + + The new pattern matching features make SET WILD SHELL redundant, and + barring any objections, it will eventually be phased out. (One + possible reason for retaining it would be as an escape mechanism when + Kermit does not understand the underlying file system.) + + By the way, patterns such as these are sometimes referred to as + "regular expressions", but they are not quite the same. In a true + regular expression (for example), "*" means "zero or more repetitions + of the previous item", so (for example), "([0-9]*)" would match zero + or more digits in parentheses. In Kermit (and in most shells), this + matches one digit followed by zero or more characters, within + parentheses. Here are some hints: + + * Although you can't match any sequence of digits (or letters, etc), + you can match (say) 1, 2, or 3 of them in row. For example, the + following pattern matches Kermit backup files (with backup numbers + from 1 to 999): + *.~{[1-9],[1-9][0-9],[1-9][0-9][0-9]}~ + * There is presently no NOT operator, so no way to match any + character or string EXCEPT the one(s) shown. + + In other wildcarding news... + + * You may now "send xxx" where "xxx" is a directory name, and this + will send all the files from the directory xxx, as if you had + typed "send xxx/*". You can also use the special shorthand "send + ." to send all the files from the current directory. + * To easily skip over backup files (the ones whose names end like + .~22~) when sending, you can use SEND /NOBACKUP (see [499]Section + 4.0.6 for details). + * When choosing Kermit to expand wildcards, rather than the shell, + you can choose whether "dot files" -- files whose names begin with + ".", which are normally "invisible" -- should be matched: + SET WILD KERMIT /NO-MATCH-DOT-FILES (this is the default) + SET WILD KERMIT /MATCH-DOT-FILES (this allows matching of "." files) + or include the /DOTFILES or /NODOTFILES switch on the command you + are using, such as SEND or DIRECTORY. + * Commands such as DIRECTORY and SEND allow recursive directory + traversal. There are also new functions for this to use in + scripts. See [500]Section 4.11 for details. + + When building file lists in UNIX, C-Kermit follows symbolic links. + Because of this, you might encounter any or all of the following + phenomena: + + * Multiple copies of the same file; e.g. one from its real directory + and others from links to its real directory, if both the real + directory and the links to it are in the wildcard expansion list. + * A command might unexpectedly "hang" for a long time because an NFS + link might not be responding, or the directory you are looking at + contains a link to a huge directory tree (example: "directory + /recursive /etc" when /etc/spool is a symlink to /var/spool, which + is a large organization's incoming email directory, containing + tens of thousands of subdirectories). + + The size of the file list that Kermit can build is limited in most + C-Kermit implementations. The limit, if any, depends on the + implementation. Use the SHOW FEATURES command and look in the + alphabetized options list for MAXWLD to see the value. + + 4.9.2. In Kermit 95 + + Kermit 95 1.1.19 and later uses the same pattern matching syntax as in + UNIX, but (as always) you will encounter numerous difficulties if you + use backslash (\) as the directory separator. In any command where K95 + parses filenames itself (that is, practically any file-oriented + command except RUN), you can use forward slash (/) as the directory + separator to avoid all the nasty conflicts. + + 4.9.3. In VMS, AOS/VS, OS-9, VOS, etc. + + Platforms other than UNIX, Windows 95/98/NT, and OS/2 have their own + filename matching capabilities that are, in general, different from + Kermit's built-in ones and in any case might conflict with them. For + example, [] encloses directory names in VMS. + + Nevertheless you can still use all the pattern-matching capabilities + described in [501]Section 4.9.1 by loading a file list into an array + (e.g. with \ffiles(*,&a), see [502]Section 4.11.3) and then using IF + MATCH on the members. + _________________________________________________________________ + + 4.10. Additional Pathname Controls + + In version 6.0 and earlier, C-Kermit's SET { SEND, RECEIVE } PATHNAMES + command had only ON and OFF as options. In version 7.0, there are more + choices: + + SET SEND PATHNAMES OFF + When sending a file, strip all disk/directory information from + the name. Example: "send /usr/olga/letters/oofa.txt" sends the + file as "oofa.txt". This applies to actual filenames, not to + any as-name you might specify. + + SET SEND PATHNAMES RELATIVE + When sending a file, leave the pathname on as given. For + example, if your current directory is /usr/olga, "send + letters/oofa.txt" sends the file as "letters/oofa.txt", not + "/usr/olga/letters/oofa.txt" or "letters.txt". + + SET SEND PATHNAMES ABSOLUTE + When sending a file, convert its name to the full, absolute + local pathname. For example, if your current directory is + /usr/olga, "send letters/oofa.txt" sends the file as + "/usr/olga/letters/oofa.txt". NOTE: Even with this setting, + device and/or node names are not included. For example, in VMS, + any node or device name is stripped; in Windows or OS/2, any + disk letter is stripped. + + SET RECEIVE PATHNAMES OFF + When receiving a file, strip all disk/directory information + from the name before attempting to store it. This applies to + incoming filename, not to any as-name you might specify. + Example: If a file arrives under the name + "/usr/olga/letters/oofa.txt" it is stored simply as "oofa.txt" + in your download directory or, if no download directory has + been specified, in your current directory. + + SET RECEIVE PATHNAMES RELATIVE + When receiving a file, leave the pathname on as it appears in + the incoming name, but if the incoming name appears to be + absolute, make it relative to your current or download + directory. Examples: + + + "oofa.txt" is stored as "oofa.txt". + + "letters/oofa.txt" is stored as "letters/oofa.txt"; the + "letters" subdirectory is created if it does not already + exist. + + "/usr/olga/letters/oofa.txt" is stored as + "usr/olga/letters/oofa.txt" in your current or download + directory, and the "usr", "usr/olga", etc, directories are + created if they do not exist. + + SET RECEIVE PATHNAMES ABSOLUTE + The incoming filename is used as given. Thus it cannot be + stored unless the given path (if any) already exists or can be + created. In this case, node, device, or disk designations are + NOT stripped, since they most likely were given explicitly by + the user as an as-name, meant to be used as given. + + SET RECEIVE PATHNAMES AUTO + This is the default, and means RELATIVE if the sender tells me + it is a recursive transfer, OFF otherwise. + + Set FILE NAMES CONVERTED now also affects pathnames too. When + PATHNAMES are RELATIVE or ABSOLUTE and FILE NAMES are CONVERTED, the + file sender converts its native directory-name format to UNIX format, + and the file receiver converts from UNIX format to its native one; + thus UNIX format is the common intermediate representation for + directory hierarchies, as it is in the ZIP/UNZIP programs (which is + why ZIP archives are transportable among, UNIX, DOS, and VMS). + + Here's an example in which a file is sent from Windows to UNIX with + relative pathnames and FILE NAMES CONVERTED: + + Source name Intermediate name Destination Name + C:\K95\TMP\OOFA.TXT K95/TMP/OOFA.TXT k95/tmp/oofa.txt + + In a more complicated example, we send the same file from Windows to + VMS: + + Source name Intermediate name Destination Name + C:\K95\TMP\OOFA.TXT K95/TMP/OOFA.TXT [.K95.TMP]OOFA.TXT + + (Note that disk letters and device designations are always stripped + when pathnames are relative). + + As you can imagine, as more and more directory formats are considered, + this approach keeps matters simple: on each platform, Kermit must know + only its own local format and the common intermediate one. In most + cases, the receiver can detect which format is used automatically. + _________________________________________________________________ + + 4.11. Recursive SEND and GET: Transferring Directory Trees + + C-Kermit 7.0 in selected versions (UNIX, VMS, VOS, AOS/VS, Windows, + and OS/2 at this writing) now permits the SEND command to traverse + directories "recursively" if you ask it to; that is, to send files + from the current or specified directory and all of its subdirectories + too, and their subdirectories, etc. (Some other commands can do this + too, including DIRECTORY.) + + This feature is new to UNIX, Windows, VOS, and OS/2. VMS and AOS/VS + have always included "wildcard" or "template" characters that allow + this, and in this case, recursive directory traversal could happen + behind Kermit's back, i.e. Kermit does not have to do it itself (in + VMS, the notation is "[...]" or "[directory...]"; in AOS/VS is "#"). + In C-Kermit 7.0, however, SEND /RECURSIVE is supported by C-Kermit + itself for VMS. + _________________________________________________________________ + + 4.11.1. Command-Line Options + + To descend a directory tree when sending files, use the -L + command-line option to indicate that the send operation is to be + recursive, and include a name or pattern to be sent. When giving a + pattern, you should enclose it in quotes to prevent the shell from + expanding it. Examples: + + $ kermit -Ls "/usr/olga/*" # send all of Olga's files in all her directories + $ kermit -Ls foo.txt # send all foo.txt files in this directory tree + $ kermit -Ls "*.txt" # send all .txt files in this directory tree + $ kermit -Ls "letters/*" # send all files in the letters directory tree + $ kermit -Ls letters # send all files in the letters directory tree + $ kermit -Ls "*" # send all files in this directory tree + $ kermit -Ls . # UNIX only: send all files in this directory tree + $ kermit -s . # UNIX only: a filename of . implies -L + + If you let the shell expand wildcards, Kermit only sends files whose + names match files in the current or given directory, because the shell + replaces an unquoted wildcard expression with the list of matching + files -- and the shell does not build recursive lists. Note that the + "." notation for the tree rooted at the current directory is allowed + only in UNIX, since in Windows and OS/2, it means "*.*" + (nonrecursive). + _________________________________________________________________ + + 4.11.2. The SEND /RECURSIVE Command + + If you include the /RECURSIVE switch in a SEND (or MOVE, or similar) + command, it means to descend the current or specified directory tree + searching for files whose names match the given name or pattern. Since + this is not terribly useful unless you also include pathnames with the + outbound files, the /RECURSIVE switch also includes an implicit + /PATHNAMES:RELATIVE switch (which you can undo by including an + explicit /PATHNAMES switch after the /RECURSIVE switch). + + Examples: + + SEND /RECURSIVE * + Sends all of the files in the current directory and all the + files in all of its subdirectories, and all of their + subdirectories, etc, including their relative pathnames. Empty + directories are not sent. + + SEND /RECURSIVE /PATHNAMES:ABSOLUTE * + Sends all of the files in the current directory and all the + files in all of its subdirectories, and all of their + subdirectories, etc, including their absolute pathnames. + + SEND /RECURSIVE /PATHNAMES:OFF * + Sends all of the files in the current directory and all the + files in all of its subdirectories, and all of their + subdirectories, etc, without pathnames. + + SEND /RECURSIVE /usr/olga/* + Sends all of the files in the /usr/olga directory and all the + files in all of its subdirectories, and all of their + subdirectories, etc. + + SEND /RECURSIVE /usr/olga (or /usr/olga/) + Same as above. If the name is a directory name (with or without + a trailing slash), its files are sent, and those of its + subdirectories, and their subdirectories, etc (see [503]Section + 4.9). + + SEND /RECURSIVE /TEXT /usr/olga/*.txt + As above, but only files whose names end with ".txt" are sent, + and they are sent in text mode (as they would be by default + anyway if SET FILE PATTERNS is ON or AUTO). + + SEND . + UNIX only: Send all the files in the current directory. + + SEND /RECURSIVE . + UNIX only: Sends all of the files in the current directory and + all of its subdirectories, etc ([504]Section 4.9). + + The /RECURSIVE switch is different from most other switches in that + its effect is immediate (but still local to the command in which it is + given), because it determines how filenames are to be parsed. For + example, "send *.txt" fails with a parse error ("No files match") if + there are no *.txt files in the current directory, but "send + /recursive *.txt" succeeds if there are ".txt" files anywhere in the + tree rooted at the current directory. + + The /RECURSIVE switch also affects the file lists displayed if you + type "?" in a filename field. "send ./?" lists the regular files in + the current directory, but "send /recursive ./?" lists the entire + directory tree rooted at the current directory. + _________________________________________________________________ + + 4.11.3. The GET /RECURSIVE Command + + In a client/server setting, the client can also request a recursive + transfer with: + + GET /RECURSIVE [ other switches ] remote-filespec [ local-spec ] + + In which remote file specification can be a directory name, a + filename, a wildcard, or any combination. If the local-spec is not + given (and PATHNAMES are RELATIVE), incoming files and directories go + into the current local directory. If local-spec is given and is a + directory, it becomes the root of the tree into which the incoming + files and directories are placed. If local-spec has the syntax of a + directory name (e.g. in UNIX it ends with /), C-Kermit creates the + directory and then places the incoming files into it. If local-spec is + a filename (not recommended), then all incoming files are stored with + that name with collisions handled according to the FILE COLLISION + setting. + + Again, the normal method for transferring directory trees uses + relative pathnames, and this is the default when the sender has been + given the /RECURSIVE switch. The action at the receiver depends on its + RECEIVE PATHNAMES setting. The default is AUTO, meaning that if the + sender tells it to expect a recursive transfer, then it should + automatically switch to relative pathnames for this transfer only; + otherwise it obeys the RECEIVE PATHNAMES setting of OFF, ABSOLUTE, or + RELATIVE. + + What happens if a file arrives that has an absolute pathname, when the + receiver has been told to use only relative pathnames? As a security + precaution, in this case the receiver treats the name as if it was + relative. For example, if a file arrives as: + + /usr/olga/oofa.txt + + The receiver creates a "usr" subdirectory in its current directory, + and then an "olga" subdirectory under the "usr" subdirectory in which + to store the incoming file. + + Suppose, however there is a sequence of directories: + + /usr/olga/a/b/c/d/ + + in which "a" contains nothing but a subdirectory "b", which in turn + contains nothing but a subdirectory "c", which in turn contains + nothing but a subdirectory "d", which contains nothing at all. Thus + there are no files in the "/usr/olga/a/" tree, and so it is not sent, + and therefore it is not reproduced on the target computer. + _________________________________________________________________ + + 4.11.4. New and Changed File Functions + + C-Kermit 7.0 adds the following functions: + + \ffiles(pattern[,&a]) + This function has been changed to match only regular files in + the current or given directory, and to take an optional array + name as a second argument (explained below). + + \fdirectories(pattern[,&a]) + Returns the number of directories that match the given pattern. + If the pattern does not include a directory, then the search is + performed in the current directory. + + \frfiles(pattern[,&a]) + Returns the number of files in the current or given directory + and all of its subdirectories, and their subdirectories, etc, + that match the given pattern. Warning -- this one can take + quite some time if performed at the root of a large directory + tree. + + \frdirectories(pattern[,&a]) + Returns the number of directories in the current or given + directory and all of its subdirectories, and their + subdirectories, etc, that match the given pattern. + + Each of these functions builds up a list of files to be returned by + the \fnextfile() function, just as \ffiles() always has done. (This + can also be done with the /ARRAY switch of the DIRECTORY command; see + [505]Sections 4.5.1 and [506]7.10). + + Each of these functions can be given an array name as an optional + second argument. If an array name is supplied, the array will contain + the number of files as its 0th element, and the filenames in elements + 1 through last. If the array already existed, its previous contents + are lost. For example, if the current directory contains two files, + oofa.txt and foo.bar, then "\ffiles(*,&a)" creates an array \&a[] with + a dimension of 2, containing the following elements: + + \&a[0] = 2 + \&a[1] = oofa.txt + \&a[2] = foo.bar + + If no files match the specification given in the first argument, the + array gets a dimension of 0, which is the same as undeclaring the + array. + + Note that the order in which the array is filled (and in which + \fnextfile() returns filenames) is indeterminate (but see [507]Section + 7.10.5). + + Here's an example that builds and prints a list of all the file whose + names end in .txt in the current directory and all its descendents: + + asg \%n \frfiles(*.txt) + declare \&a[\%n] + for \%i 1 \%n 1 { + asg \&a[\%i] \fnextfile() + echo \flpad(\%i,4). "\&a[\%i]" + } + + Alternatively, using the array method, and then printing the filenames + in alphabetic order (see [508]Section 7.10.3 and [509]7.10.5): + + asg \%n \frfiles(*.txt,&a) + sort &a + for \%i 1 \%n 1 { + echo \flpad(\%i,4). "\&a[\%i]" + } + + Or even more simply: + + asg \%n \frfiles(*.txt,&a) + sort &a + show array &a + + As noted elsewhere, the file lists built by \ffiles(), \frfiles(), + etc, are now "safe" in the sense that SEND and other file-related + commands can reference \fnextfile() without resetting the list: + + set send pathnames relative + for \%i 1 \frfiles(*.txt) 1 { + asg \%a \fnextfile() + echo Sending \%a... + send \%a + if fail break + } + + Copying to an array (as shown on p.398 of [510]Using C-Kermit 2nd Ed) + is no longer necessary. + _________________________________________________________________ + + 4.11.5. Moving Directory Trees Between Like Systems + + 4.11.5.1. UNIX to UNIX + + Transferring a directory tree from one computer to another replicates + the file sender's arrangement of files and directories on the file + receiver's computer. Normally this is done using relative pathnames, + since the user IDs might not be identical on the two computers. Let's + say both computers are UNIX based, running C-Kermit 7.0 or later. On + the sending computer (leaving out the connection details, etc): + + C-Kermit> cd /usr/olga + C-Kermit> send /recursive . + + The /RECURSIVE switch tells C-Kermit to descend through the directory + tree and to include relative pathnames on outbound filenames. + + On the receiving computer: + + C-Kermit> mkdir olgas-files ; Make a new directory. + C-Kermit> cd olgas-files ; CD to it. + C-Kermit> receive /recursive ; = /PATHNAMES:RELATIVE + + Each Kermit program recognizes that the other is running under UNIX + and switches to binary mode and literal filenames automatically. + Directories are automatically created on the receiving system as + needed. File dates and permissions are automatically reproduced from + source to destination. + + 4.11.5.2. VMS to VMS + + To send recursively from VMS, simply include the /RECURSIVE switch, + for example at the sender: + + $ kermit + C-Kermit> cd [olga] + C-Kermit> send /recursive *.*;0 + + And at the receiver: + + C-Kermit> cd [.olga] + C-Kermit> receive /recursive + + The notation "..." within directory brackets in VMS means "this + directory and all directories below it"; the /RECURSIVE switch, when + given to the sender, implies the use of "..." in the file + specification so you don't have to include "..."; but it makes no + difference if you do: + + $ kermit + C-Kermit> send /recursive [olga...]*.*;0 + + And at the receiver: + + C-Kermit> cd [.olga] + C-Kermit> receive /recursive + + In either case, since both systems recognize each other as VMS, they + switch into LABELED transfer mode automatically. + _________________________________________________________________ + + 4.11.6. Moving Directory Trees Between Unlike Systems + + There are several difficulties with recursive transfers between unlike + systems: + + * File formats can be different, especially text files character + sets and record formats. This can now be handled by using SET FILE + PATTERN, SET FILE TEXT-PATTERNS, and SET FILE BINARY-PATTERNS + ([511]Section 4.3). + * File naming conventions are different. For example, one system + might allow (and use) longer filenames than the other. You can + tell Kermit how to handle file names with the normal "set file + names" and "set file collision" mechanisms. Most modern Kermits + are fairly tolerant of illegal filenames and should not fail + simply because of an incoming filename; rather, it will do its + best to convert it to a recognizable and unique legal filename. + * Directory notations can be different, e.g. backslashes instead of + slashes, brackets, parentheses, spaces, etc. But this is now + handled by converting pathnames to a standard format during + transfer ([512]Section 4.10). + + So now, for the first time, it is possible to send directory trees + among any combination of UNIX, DOS, Windows, OS/2, VMS, AOS/VS, etc. + Here's an example sending files from an HP-UX system (where text files + are encoded in the HP Roman8 character set) to a PC with K95 (where + text files are encoded in CP850): + + Sender: + cd xxx ; CD to root of source tree + set file type binary ; Default transfer mode + set file character-set hp-roman8 ; Local character set for text files + set xfer character-set latin1 ; Transfer character set + set file patterns on ; Enable automatic file-type switching... + set file binary-patterns *.Z *.gz *.o ; based on these patterns... + set file text-patterns *.txt *.c *.h ; for binary and text files. + send /recursive * ; Send all the file in this directory tree + + Receiver: + cd yyy ; CD to root of destination tree + set file character-set cp850 ; Local character set for text files + receive /pathnames:relative ; Receive with pathnames + + Notes: + * Replace "xxx" and "yyy" with the desired directories. + * Replace the file character sets appropriately. + * Change the patterns as needed (or just use the built-in default + lists). + * SEND /RECURSIVE also implies /PATHNAMES:RELATIVE. + * The file sender tells the file receiver the transfer mode of each + file. + * The file sender tells the file receiver the transfer character + set. + * By default, destination file dates will be the same as on the + source. + * Many of the settings shown might already be set by default. + * See [513]Sections 4.3, [514]4.10, and [515]4.15 for additional + explanation. + + If you are refreshing an existing directory on the destination + computer, use "set file collision update" or other appropriate file + collision option to handle filename collisions. + _________________________________________________________________ + + 4.12. Where Did My File Go? + + Now that Kermit can be started by clicking on desktop icons (thus + obscuring the concept of "current directory"), and can have a download + directory, and can create directories for incoming files on the fly, + etc, sometimes it is easy to lose a file after transfer. Of course, if + you keep a transaction log: + + LOG TRANSACTIONS + + it will record the fate and final resting place of each file. But in + case you did not keep a log, the new command: + + WHERE + + added in C-Kermit 7.0, gives you as much information as it has about + the location of the last files transferred, including the pathname + reported by the receiving Kermit, if any, when C-Kermit is the sender. + This information was also added to SHOW FILE in somewhat less detail. + _________________________________________________________________ + + 4.13. File Output Buffer Control + + (UNIX only). The new command SET FILE OUTPUT lets you control how + incoming files are written to disk: + + SET FILE OUTPUT BUFFERED [ size ] + Chooses buffered file output; this is the default. UNIX does + its normal sort of disk buffering. The optional size specifies + Kermit's own file output buffer size, and therefore the + frequency of disk accesses (write() system calls) -- the bigger + the size, the fewer the disk accesses. + + SET FILE OUTPUT UNBUFFERED [ size ] + This forces each file output write() call to actually commit + the data to disk immediately. Choosing this option will usually + slow file reception down. + + SET FILE OUTPUT BLOCKING + Write() calls should not return until they are complete. This + is the normal setting, and it lets Kermit detect disk-write + errors immediately. + + SET FILE OUTPUT NONBLOCKING + Write() calls should return immediately. This can speed up file + reception, but also delay the detection of disk-write errors. + + Experimentation with these parameters should be harmless, and might + (or might not) have a perceptible, even dramatic, effect on + performance. + _________________________________________________________________ + + 4.14. Improved Responsiveness + + In version 7.0, C-Kermit's file-transfer protocol engine has been + tuned for additional speed and responsiveness. + + * Binary-mode transfers over 8-bit connections, a very common case, + are now handled in a special way that minimizes overhead. + * SET TRANSFER CRC-CALCULATION is now OFF by default, rather than + ON. (This affects only the overall per-transfer CRC, \v(crc16), + not the per-packet CRCs) + * Connection loss during file transfer is now detected immediately + in most cases on Internet connections and on serial connections + when CARRIER-WATCH is not set to OFF. + _________________________________________________________________ + + 4.15. Doubling and Ignoring Characters for Transparency + + The following commands were added in 7.0, primarily to allow + successful file transfer through ARPAnet TACs and with Honeywell DPS6 + systems, but can be used in any setting where they might be needed: + + SET SEND DOUBLE-CHAR { [ char [ char [ ... ] ] ], NONE } + Tells C-Kermit to double the specified characters (use decimal + notation) in packets that it sends. For example, if you are + sending files through a device that uses @ as an escape + character, but allows you to send a single copy of @ through by + doubling it, use "set send double 64". + + SET RECEIVE IGNORE-CHAR [ char [ char [ ... ] ] ] + Tells C-Kermit to ignore the specified character(s) in incoming + packets. Use this, for example, when something between the + sender and receiver is inserting linefeeds for wrapping, NULs + for padding, etc. + _________________________________________________________________ + + 4.16. New File-Transfer Display Formats + + SET TRANSFER DISPLAY { BRIEF, CRT, FULLSCREEN, NONE, SERIAL } + Selects the file-transfer display format. + + BRIEF is the new one. This writes one line to the screen per file, + showing the file's name, transfer mode, size, the status of the + transfer, and when the transfer is successful, the effective data rate + in characters per second (CPS). Example: + + SEND ckcfn3.o (binary) (59216 bytes): OK (0.104 sec, 570206 cps) + SEND ckcfns.o (binary) (114436 bytes): OK (0.148 sec, 772006 cps) + SEND ckcmai.c (text) (79147 bytes): OK (0.180 sec, 438543 cps) + SEND ckcmai.o (binary) (35396 bytes): OK (0.060 sec, 587494 cps) + SEND ckcnet.o (binary) (62772 bytes): REFUSED + SEND ckcpro.o (binary) (121448 bytes): OK (0.173 sec, 703928 cps) + SEND ckcpro.w (text) (63687 bytes): OK (0.141 sec, 453059 cps) + SEND makefile (text) (186636 bytes): OK (0.444 sec, 420471 cps) + SEND wermit (binary) (1064960 bytes): OK (2.207 sec, 482477 cps) + + Note that transfer times are now obtained in fractional seconds, + rather than whole seconds, so the CPS figures are more accurate (the + display shows 3 decimal places, but internally the figure is generally + precise to the microsecond). + _________________________________________________________________ + + 4.17. New Transaction Log Formats + + The new command: + + SET TRANSACTION-LOG { VERBOSE, FTP, BRIEF [ separator ] } + + lets you choose the format of the transaction log. VERBOSE (the + default) indicates the traditional format described in the book. BRIEF + and FTP are new. This command must be given prior to the LOG + TRANSACTION command if a non-VERBOSE type is desired. + + 4.17.1. The BRIEF Format + + BRIEF chooses a one-line per file format suitable for direct + importation into databases like Informix, Oracle, or Sybase, in which: + + * Each record has 8 fields. + * Fields are separated by a non-alphanumeric separator character. + * The default separator character is comma (,). + * Any field containing the separator character is enclosed in + doublequotes. + * The final field is enclosed in doublequotes. + + The fields are: + + 1. Date in yyyymmdd format + 2. Time in hh:mm:ss format + 3. Action: SEND or RECV + 4. The local filename + 5. The size of the file + 6. The transfer mode (text, binary, image, labeled) + 7. The status of the transfer: OK or FAILED + 8. Additional status-dependent info, in doublequotes. + + Examples: + + 20000208,12:08:52,RECV,/u/olga/oofa.txt,5246,text,OK,"0.284sec 18443cps" + 20000208,12:09:31,SEND,/u/olga/oofa.exe,32768,binary,OK,"1.243sec 26362cps" + 20000208,12:10:02,SEND,"/u/olga/a,b",10130,text,FAILED,"Refused: date" + + Note how the filename is enclosed in doublequotes in the final + example, because it contains a comma. + + To obtain BRIEF format, you must give the SET TRANSACTION-LOG BRIEF + command before the LOG TRANSACTIONS command. (If you give them in the + opposite order, a heading is written to the log by the LOG command.) + _________________________________________________________________ + + 4.17.2. The FTP Format + + SET TRANSACTION-LOG FTP (available only in UNIX) chooses a format that + is compatible with the WU-FTPD (Washington University FTP daemon) log, + and so can be processed by any software that processes the WU-FTPD + log. It logs only transfers in and out, both successful and failed + (but success or failure is not indicated, due to lack of a field in + the WU-FTPD log format for this purpose). Non-transfer events are not + recorded. + + Unlike other logs, the FTP-format transaction log is opened in append + mode by default. This allows you to easily keep a record of all your + kermit transfers, and it also allows the same log to be shared by + multiple simultaneous Kermit processes or (permissions permitting) + users. You can, of course, force creation of a new logfile by + specifying the NEW keyword after the filename, e.g. + + log transactions oofa.log new + + All records in the FTP-style log are in a consistent format. The first + field is fixed-length and contains spaces; subsequent fields are + variable length, contain no spaces, and are separated by one or more + spaces. The fields are: + + Timestamp + This is an asctime-style timestamp, example: "Wed Sep 16 + 20:19:05 1999" It is always exactly 24 characters long, and the + subfields are always in fixed positions. + + Elapsed time + The whole number of seconds required to transfer the file, as a + string of decimal digits, e.g. "24". + + Connection + The name of the network host to which C-Kermit is connected, or + the name of the serial device through which it has dialed (or + has a direct connection), or "/dev/tty" for transfers in remote + mode. + + Bytes transferred + The number of bytes transferred, decimal digits, e.g. + "1537904". + + Filename + The name of the file that was transferred, e.g. + "/pub/ftp/kermit/a/README.TXT". If the filename contains any + spaces or control characters, each such character is replaced + by an underscore ('_') character. + + Mode + The letter 'b' if the file was transferred in binary mode, or + 'a' if it was transferred in text (ASCII) mode. + + Options + This field always contains an underscore ('_') character. + + Direction + The letter 'o' if the file was transferred Out, and 'i' if the + file was transferred In. + + User class + The letter 'r' indicates the file was transferred by a Real + user. + + User identification + The ID of the user who transferred the file. + + Server identification + The string "kermit". This distinguishes a Kermit transfer log + record from a WU-FTPD record, which contains "ftp" in this + field. + + Authentication class + The digit '1' if we know the user's ID on the client system, + otherwise '0'. Currently, always '0'. + + Authenticated user + If the authentication class is '1', this is the user's ID on + the client system. Otherwise it is an asterisk ('*'). Currently + it is always an asterisk. + + Examples: + + Thu Oct 22 17:42:48 1998 0 * 94 /usr/olga/new.x a _ i r olga kermit 0 * + Thu Oct 22 17:51:29 1998 1 * 147899 /usr/olga/test.c a _ o r olga kermit 0 * + Thu Oct 22 17:51:44 1998 1 * 235 /usr/olga/test.o b _ i r olga kermit 0 * + Fri Oct 23 12:10:25 1998 0 * 235 /usr/olga/x.ksc a _ o r olga kermit 0 * + + Note that an ftp-format transaction log can also be selected on the + Kermit command line as follows: + + kermit --xferfile:filespec + + This is equivalent to: + + SET TRANSACTION-LOG FTP + LOG TRANSACTIONS filespec APPEND + + Conceivably it could be possible to have a system-wide shared Kermit + log, except that UNIX lacks any notion of an append-only file; thus + any user who could append to the log could also delete it (or alter + it). This problem could be worked around using setuid/setgid tricks, + but these would most likely interfere with the other setuid/setgid + tricks C-Kermit must use for getting at dialout devices and UUCP + logfiles. + _________________________________________________________________ + + 4.18. Unprefixing NUL + + As of 6.1.193 Alpha.10, C-Kermit can finally send and receive + file-transfer packets in which NUL (ASCII 0) is unprefixed (no more + NUL-terminated packets!). NUL is, of course, extremely prevalent in + binary files such as executables, and this has been a significant + source of packet overhead. For example, when transferring itself (the + SunOS C-Kermit executable) with minimal prefixing and 9000-byte + packets, we see: + + File size: 1064960 + Packet chars with 0 prefixed: 1199629 overhead = 12.65% + Packet chars with 0 unprefixed: 1062393 overhead = -0.03% + + Transfer rates go up accordingly, not only because of the reduced + amount of i/o, but also because less computation is required on each + end. + _________________________________________________________________ + + 4.19. Clear-Channel Protocol + + Now that C-Kermit itself is capable of sending and receiving any byte + at all on a clear channel ([516]Section 4.18), it is, for the first + time, in a position to negotiate a clear channel with the other + Kermit, giving it permission (but not requiring it) to unprefix any + and all characters that it knows are safe. In general this means all + but the Kermit start-of-packet character (normally Ctrl-A), Carriage + Return (not only Kermit's end-of-packet character, but also treated + specially on Telnet NVT links), and IAC (255, also special to Telnet). + + By default, C-Kermit will say it has a clear channel only if it has + opened a TCP socket. Since the Kermit program on the far end of a + TCP/IP connection generally does not know it has a TCP/IP connection, + it will not announce a clear channel unless it has been told to do so. + The command is: + + SET CLEAR-CHANNEL { ON, OFF, AUTO } + + AUTO is the default, meaning that the clear-channel status is + determined automatically from the type of connection. ON means to + announce a clear channel, OFF means not to announce it. Use SHOW + STREAMING ([517]Section 4.20) to see the current CLEAR-CHANNEL status. + Synonym: SET CLEARCHANNEL. + + CLEAR-CHANNEL is also set if you start C-Kermit with the -I switch + (see [518]Section 4.20). + + Whenever a clear channel is negotiated, the resulting + control-character unprefixing is "sticky"; that is, it remains in + effect after the transfer so you can use SHOW CONTROL to see what was + negotiated. + + You can also see whether a clear channel was negotiated in the + STATISTICS /VERBOSE Display. + + The advantage of the clear channel feature is that it can make file + transfers go faster automatically. The disadvantage would be + file-transfer failures if the channel is not truly clear, for example + if C-Kermit made a Telnet connection to a terminal server, and then + dialed out from there; or if C-Kermit made an Rlogin connection to + host and then made a Telnet connection from there to another host. If + a file transfer fails on a TCP/IP connection, use SHOW CONTROL to + check whether control characters became unprefixed as a result of + protocol negotiations, and/or SHOW STREAMING ([519]Section 4.20) to + see if "clear-channel" was negotiated. If this happened, use SET + CLEAR-CHANNEL OFF and SET PREFIXING CAUTIOUS (or whatever) to prevent + it from happening again. + _________________________________________________________________ + + 4.20. Streaming Protocol + + A new Kermit protocol option called "streaming" was added in C-Kermit + 7.0. The idea is that if the two Kermit partners have a reliable + transport (such as TCP/IP or X.25) between them, then there is no need + to send ACKs for Data packets, or NAKs, since a reliable transport + will, by definition, deliver all packets in order and undamaged. On + such a connection, streaming cuts down not only on Kermit program + overhead (switching back and forth between reading and sending + packets), but also tends to make the underlying transport use itself + more efficiently (e.g. by defeating the Nagle algorithm and/or Delayed + ACK stratagem of the TCP layer). Furthermore, it allows transfers to + work smoothly on extremely slow network congestions that would + otherwise cause timeouts and retransmissions, and even failure when + the retry limit was exceeded. + + The trick is knowing when we can stream: + + 1. If C-Kermit has opened a TCP socket or X.25 connection, it offers + stream. + 2. If C-Kermit has been started with the -I (uppercase) option, or if + it has been told to SET RELIABLE ON, it offers to stream. + 3. If C-Kermit is in remote mode, and has been told to SET RELIABLE + AUTO (or ON), it always offers to stream, and also always agrees + to stream, if the other Kermit offers. Unless you take explicit + actions to override the defaults, this allows the local Kermit + (the one that made the connection, and so knows whether it's + reliable) to control streaming. + + (Note that an offer to stream also results in a Clear-Channel + announcement if CLEAR-CHANNEL is set to AUTO; see [520]Section 4.19.) + + When BOTH Kermits offer to stream, then they stream; otherwise they + don't. Thus streaming-capable Kermit programs interoperate + automatically and transparently with nonstreaming ones. If the two + Kermits do agree to stream, you'll see the word "STREAMING" on the + fullscreen file-transfer display in the Window Slots field. You can + also find out afterwards with the STATISTICS or SHOW STREAMING + commands. + + WARNING: Automatic choice of streaming is based on the assumption + of a "direct" end-to-end network connection; for example, a Telnet + or Rlogin connection from host A to host B, and transferring files + between A and B. However, if your connection has additional + components -- something "in the middle" (B) that you have made a + network connection to, which makes a separate connection to the + destination host (C), then you don't really have a reliable + connection, but C-Kermit has no way of knowing this; transferring + files between A and C will probably fail. In such cases, you'll + need to tell the *local* C-Kermit to "set reliable off" before + transferring files (it does no good to give this command to the + remote Kermit since the local one controls the RELIABLE setting). + + Streaming is like using an infinite window size, with no timeouts and + no tolerance for transmission errors (since there shouldn't be any). + It relies on the underlying transport for flow control, error + correction, timeouts, and retransmission. Thus it is very suitable for + use on TCP/IP connections, especially slow or bursty ones, since + Kermit's packet timeouts won't interfere with the transfer -- each + packet takes as long to reach its destination as it takes TCP to + deliver it. If TCP can't deliver the packet within its own timeout + period (over which Kermit has no control), it signals a fatal error. + Just like FTP. + + Streaming goes much faster than non-streaming when a relatively small + packet length is used, and it tends to go faster than non-streaming + with even the longest packet lengths. The Kermit window size is + irrelevant to streaming protocol, but still might affect performance + in small ways since it can result in different paths through the code. + + The definition of "reliable transport" does not necessarily demand + 8-bit and control-character transparency. Streaming can work with + parity and/or control-character prefixing just as well (but not as + fast) as without them; in such cases you can leave RELIABLE set to ON, + but set CLEARCHANNEL and/or PARITY appropriately. + + Maximum performance -- comparable to and often exceeding FTP -- is + achieved on socket-to-socket connections (in which the considerable + overhead of the terminal driver and Telnet or Rlogin server is + eliminated) with long packets and the new "brief" file-transfer + display ([521]Section 4.16). + _________________________________________________________________ + + 4.20.1. Commands for Streaming + + SET RELIABLE { ON, OFF, AUTO } + SET RELIABLE ON tells Kermit that it has a reliable transport. + SET RELIABLE OFF tells Kermit the transport is not reliable. + SET RELIABLE AUTO tells Kermit that it should SET RELIABLE ON + whenever it makes a reliable connection (e.g. TELNET or SET + HOST on a TCP/IP or X.25 network), and when in remote mode it + should believe the transport is reliable if the other Kermit + says it is during Kermit protocol negotiation. + + AUTO is the default; the Kermit program that makes the connection + knows whether it is reliable, and tells the remote Kermit. + + The RELIABLE setting has several effects, including: + + * It can affect the timeouts used during normal ACK/NAK protocol. + * It can affect the clear-channel announcement. + * It can affect streaming. + + If you TELNET or SET HOST somewhere, this includes an implicit SET + RELIABLE ON command. The -I command-line option is equivalent to SET + RELIABLE ON. + + Since SET RELIABLE ON (and -I) also implies SET CLEAR CHANNEL ON, you + might find that in certain cases you need to tell Kermit that even + though the connection is reliable, it doesn't have a clear channel + after all: + + SET CLEAR-CHANNEL OFF + SET PREFIXING CAUTIOUS ; or whatever... + + You can control streaming without affecting the other items with: + + SET STREAMING { ON, OFF, AUTO } + + AUTO is the default, meaning streaming will occur if Kermit has made a + TCP/IP connection or if RELIABLE is ON (or it was started with the -I + command line option). OFF means don't stream; ON means offer to stream + no matter what. + _________________________________________________________________ + + 4.20.2. Examples of Streaming + + Here we look at the use and behavior of streaming on several different + kinds of connections, and compare its performance with non-streaming + transfers. + + 4.20.2.1. Streaming on Socket-to-Socket Connections + + Here we get streaming automatically when both Kermit programs are + capable of it, since they both make socket connections. For example, + on the far end: + + C-Kermit> set host * 3000 + C-Kermit> server + + and on the near end: + + C-Kermit> set host foo.bar.xyz.com 3000 + (now give SEND and GET command) + + All subsequent file transfers use streaming automatically. + + Here are the results from 84 trials, run on a production network, + disk-to-disk, in which a 1-MB binary file (the SunOS C-Kermit Sparc + executable) was sent from a Sun Sparc-10 with SunOS 4.1.3 to an IBM + Power Server 850 with AIX 4.1, socket-to-socket, over a 10Mbps 10BaseT + Ethernet, using minimal control-character unprefixing, window sizes + from 10 to 32, and packet sizes from 1450 to 9010: + + Streaming Nonstreaming + Max CPS 748955 683354 + Min CPS 221522 172491 + Mean CPS 646134 558680 + Median CPS 678043 595874 + Std Dev 101424 111493 + + Correlations: + + CPS and window size: -0.036 + CPS and packet length: 0.254 + CPS and streaming: 0.382 + + Note that the relationship between streaming and throughput is + significantly stronger than that between CPS and window size or packet + length. + + Also note that this and all other performance measurements in this + section are snapshots in time; the results could be much different at + other times when the load on the systems and/or the network is higher + or lower. + + In a similar socket-to-socket trial, but this time over a wide-area + TCP/IP connection (from New York City to Logan, Utah, about 2000 + miles), the following results were obtained: + + Streaming Nonstreaming + Max CPS 338226 318203 + Min CPS 191659 132314 + Mean CPS 293744 259240 + Median CPS 300845 273271 + Std Dev 41914 52351 + + Correlations: + + CPS and window size: 0.164 + CPS and packet length: 0.123 + CPS and streaming: 0.346 + _________________________________________________________________ + + 4.20.2.2. Streaming on Telnet Connections + + In this case the local copy of Kermit is told to TELNET or SET HOST, + and so it knows it has a reliable connection and -- unless it has been + told not to -- will offer to stream, and the other Kermit program, + since it has STREAMING set to AUTO, agrees. + + Since we have a reliable connection, we'll also get control-character + unprefixing automatically because of the new clear-channel protocol + ([522]Section 4.19). + + Any errors that occur during streaming are fatal to the transfer. The + message is "Transmission error on reliable link". Should this happen: + + 1. Check the remote Kermit's flow control setting (SHOW + COMMUNICATIONS). If it is NONE, change it to XON/XOFF, or vice + versa. If it is XON/XOFF (or you just changed it to XOFF/XOFF), + make sure the file sender is prefixing the XON and XOFF + characters. In the most drastic case, use "set prefix all" to + force prefixing of all control characters. + 2. The remote Telnet server might chop off the 8th bit. In that case, + tell C-Kermit to "set parity space". Or, you might be able to + force the Telnet to allow eight-bit data by telling C-Kermit to + "set telopt binary request accept" -- that is, request the Telnet + server to enter binary mode, and accept binary-mode bids from the + server. + 3. The remote Telnet server might have a buffering limitation. If a + and b don't cure the problem, tell the file receiver to "set + receive packet-length 1000" (or other number -- use the largest + one that works). This too, is no different from the non-streaming + case (more about this in [523]Section 4.20.2.3). + + And remember you can continue interrupted binary-mode transfers where + they left off with the RESEND (= SEND /RECOVER) command. + + Here are the figures for the same 84 trials between the same Sun and + IBM hosts as in 4.20.2.1, on the same network, but over a Telnet + connection rather than socket-to-socket: + + Streaming Nonstreaming + Max CPS 350088 322523 + Min CPS 95547 173152 + Mean CPS 321372 281830 + Median CPS 342604 291469 + Std Dev 40503 29948 + + Correlations: + + CPS and window size: 0.001 + CPS and packet length: 0.152 + CPS and streaming: 0.128 + + Here the effect is not as emphatic as in the socket-to-socket case, + yet on the whole streaming tends to be beneficial. + + Additional measurements on HP-UX using C-Kermit 7.0 Beta.06: + + Windowing Streaming + HP-UX 8->8 not tested 14Kcps + HP-UX 8->9 not tested 76Kcps + HP-UX 8->10 36Kcps 66Kcps + HP-UX 9->9 not tested 190Kcps + HP-UX 9->10 160Kcps 378Kcps + _________________________________________________________________ + + 4.20.2.3. Streaming with Limited Packet Length + + The IRIX telnet server (at least the ones observed in IRIX 5.3 and + 6.2) does not allow Kermit to send packets longer than 4096 bytes. + Thus when sending from IRIX C-Kermit when it is on the remote end of a + Telnet connection, the packet length must be 4K or less. Trials in + this case (in which packet lengths range from 1450 to 4000) show a + strong advantage for streaming, which would be evident in any other + case where the packet length is restricted, and stronger the shorter + the maximum packet length. + + Streaming Nonstreaming + Max CPS 426187 366870 + Min CPS 407500 276517 + Mean CPS 415226 339168 + Median CPS 414139 343803 + Std Dev 6094 25851 + + Correlations: + + CPS and window size: 0.116 + CPS and packet length: 0.241 + CPS and streaming: 0.901 + _________________________________________________________________ + + 4.20.2.4. Streaming on Dialup Connections + + Here "dialup" refers to a "direct" dialup connection, not a SLIP or + PPP connection, which is only a particular kind of TCP/IP connection. + + Attempt this at your own risk, and then only if (a) you have + error-correcting modems, and (b) the connections between the modems + and computers are also error-free, perfectly flow-controlled, and free + of interrupt conflicts. Streaming can be used effectively and to + fairly good advantage on such connections, but remember that the + transfer is fatal if even one error is detected (also remember that + should a binary-mode transfer fail, it can be recovered from the point + of failure with RESEND). + + To use streaming on an unreliable connection, you must tell both + Kermits that the connection is reliable: + + kermit -I + + or: + + C-Kermit> set reliable on + + In this case, it will probably be necessary to prefix some control + characters, for example if your connection is through a terminal + server that has an escape character. Most Cisco terminal servers, for + example, require Ctrl-^ (30, as well as its high-bit equivalent, 158) + to be prefixed. To unprefix these, you'll need to defeat the "clear + channel" feature: + + C-Kermit> set reliable on + C-Kermit> set clear-channel off + C-Kermit> set prefixing none + C-Kermit> set control prefix 1 13 30 158 ; and whatever else is necessary + + Dialup trials were done using fixed large window and packet sizes. + They compare uploading and downloading of two common types of files, + with and without streaming. Configuration: + + HP-9000/715/33 -- 57600bps, RTS/CTS -- USR Courier V.34 -- + V.34+V.42, 31200bps -- USR V.34+ Rackmount -- 57600bps, RTS/CTS -- + Cisco terminal server -- Solaris 2.5.1. Packet size = 8000, Window + Size = 30, Control Character Unprefixing Minimal (but including the + Cisco escape character). + + Since this is not a truly reliable connection, a few trials failed + when a bad packet was received (most likely due to UART overruns); the + failure was graceful and immediate, and the message was informative. + The results of ten successful trials uploading and downloading the two + files with and without streaming are: + + Streaming.. + Off On + Upload 5194 5565 txt (= C source code, 78K) + 3135 3406 gz (= gzip file, compressed, 85K) + Download 5194 5565 txt + 3041 3406 gz + + Each CPS figure is the mean of 10 results. + + A brief test was also performed on a LAT-based dialout connection from + a VAX 3100 with VMS 5.5 to a USR Courier V.34 connected to a DECserver + 700 at 19200 bps. The 1-MB Sparc executable downloaded from a Sun to + the VAX at 1100cps without streaming and 1900cps with streaming, using + 8000-byte packets, 30 window slots, and minimal prefixing in both + cases. + _________________________________________________________________ + + 4.20.2.5. Streaming on X.25 Connections + + We have only limited access to X.25 networks. One trial was performed + in which the 1MB Solaris 2.4 Sparc executable was transferred over a + SunLink X.25 connection; nothing is known about the actual physical + connection. With a packet length of 8000 and a window size of 30, the + file transferred at 6400 cps (using a maximum of 6 window slots). With + the same packet length, but with streaming, it transferred without + mishap at 6710 cps, about 5% faster. + _________________________________________________________________ + + 4.20.3. Streaming - Preliminary Conclusions + + The results vary with the particular connection, but are good overall. + Although numerous lower-level tricks can be used to improve + performance on specific platforms or connection methods, streaming + occurs at a high, system-independent level of the Kermit protocol and + therefore can apply to all types of platforms and (reliable) + connections transparently. + _________________________________________________________________ + + 4.21. The TRANSMIT Command + + Prior to C-Kermit 7.0, the TRANSMIT command transmitted in text or + binary mode according to SET FILE TYPE { TEXT, BINARY }. But now that + binary mode is likely to be the default for protocol transfers, it is + evident that this not also an appropriate default for TRANSMIT, since + binary-mode TRANSMIT is a rather specialized and tricky operation. + Therefore, TRANSMIT defaults to text mode always, regardless of the + FILE TYPE setting. + + C-Kermit 7.0 expands the capabilities of the TRANSMIT command by + adding the following switches (see [524]Section 1.5). The new syntax + is: + + TRANSMIT [ switches... ] filename + + Zero or more switches may be included: + + /PIPE + When /PIPE is included, "filename" is interpreted as a system + command or program whose output is to be sent. Synonym: + /COMMAND. Example: + + transmit /pipe finger + + You may enclose the command in braces, but you don't have to: + + xmit /pipe {ls -l | sort -r +0.22 -0.32 | head} + + /BINARY + Transmits the file (or pipe output) in binary mode. + + /TEXT + Transmits the file (or pipe output) in line-oriented text mode. + Current FILE CHARACTER-SET and TERMINAL CHARACTER-SET + selections govern translation. Default. + + /TRANSPARENT + Specifies text mode without character-set translation, no + matter what the FILE and TERMINAL CHARACTER-SET selections are. + + /NOWAIT + This is equivalent to SET TRANSMIT PROMPT 0, but for this + TRANSMIT command only. Applies only to text mode; it means to + not wait for any kind of echo or turnaround character after + sending a line before sending the next line. (Normally Kermit + waits for a linefeed.) + + When TRANSMIT ECHO is ON, C-Kermit tries to read back the echo of each + character that is sent. Prior to C-Kermit 7.0, 1 second was allowed + for each echo to appear; if it didn't show up in a second, the + TRANSMIT command would fail. Similarly for the TRANSMIT PROMPT + character. However, with today's congested Internet connections, etc, + more time is often needed: + + SET TRANSMIT TIMEOUT number + Specifies the number of seconds to wait for an echo or the prompt + character when TRANSMIT PROMPT is nonzero; the default wait is 1 + second. If you specify 0, the wait is indefinite. When a timeout + interval of 0 is specified, and a desired echo or prompt does not show + up, the TRANSMIT command will not terminate until or unless you + interrupt it with Ctrl-C; use SET TRANSMIT TIMEOUT 0 with caution. + + Note: to blast a file out the communications connection without any + kind of synchronization or timeouts or other manner of checking, use: + + SET TRANSMIT ECHO OFF + SET TRANSMIT PROMPT 0 (or include the /NOWAIT switch) + SET TRANSMIT PAUSE 0 + TRANSMIT [ switches ] filename + + In this case, text-file transmission is not-line oriented and large + blocks can be sent, resulting in a significant performance improvement + over line-at-at-time transmission. Successful operation depends (even + more than usual for the TRANSMIT command!) on a clean connection with + effective flow control. + + For details on TRANSMIT and character sets, see [525]Section 6.6.5.4. + _________________________________________________________________ + + 4.22. Coping with Faulty Kermit Implementations + + Kermit protocol has been implemented in quite a few third-party + commercial, shareware, and freeware software packages, with varying + degrees of success. In most cases operation is satisfactory but slow + -- only the bare minimum subset of the protocol is available -- short + packets, no sliding windows, no attributes, etc. In other cases, the + implementation is incorrect, resulting in failures at the initial + negotiation stage or corrupted files. + + C-Kermit 7.0 and Kermit 95 1.1.19 include some new defense mechanisms + to help cope with the most common situations. However, bear in mind + there is only so much we can do in such cases -- the responsibility + for fixing the problem lies with the maker of the faulty software. + _________________________________________________________________ + + 4.22.1. Failure to Accept Modern Negotiation Strings + + The published Kermit protocol specification states that new fields can + be added to the parameter negotiation string. These are to be ignored + by any Kermit implementation that does not understand them; this is + what makes the Kermit protocol extensible. Unfortunately, some Kermit + implementations become confused (or worse) when receiving a + negotiation string longer than the one they expect. You can try + working around such problems by telling Kermit to shorten its + negotiation string (and thus disable the corresponding new features): + + SET SEND NEGOTIATION-STRING-MAX-LENGTH number + + Try a number like 10. If that doesn't work, try 9, 8, 7, 6, and so on. + _________________________________________________________________ + + 4.22.2. Failure to Negotiate 8th-bit Prefixing + + The published Kermit protocol specification states that 8th-bit + prefixing (which allows transfer of 8-bit data over a 7-bit + connection) occurs if the file sender puts a valid prefix character + (normally "&") in the 8th-bit-prefix field of the negotiation string, + and the receiver puts either a letter "Y" or the same prefix + character. At least one faulty Kermit implementation exists that does + not accept the letter "Y". To force C-Kermit / K-95 to reply with the + other Kermit's prefix character rather than a "Y", give the following + (invisible) command: + + SET Q8FLAG ON + + Use SET Q8FLAG OFF to restore the normal behavior. + _________________________________________________________________ + + 4.22.3. Corrupt Files + + Refer to [526]Section 4.22.2. Some Kermit implementations mistakenly + interpret the "Y" as a prefix character. Then, whenever a letter Y + appears in the data, the Y and the character that follows it are + replaced by a garbage character. At this writing, we are not sure if + there is any solution, but try "set send negotiation-string-max-length + 6" and/or "set q8flag on". + + File corruption can also occur when control characters within the file + data are sent without prefixing, as at least some are by default in + C-Kermit 7.0 and K-95. Some Kermit implementations do not handle + incoming "bare" control characters. To work around, "set prefixing + all". + _________________________________________________________________ + + 4.22.4. Spurious Cancellations + + The Kermit protocol specification states that if an ACK to a Data + packet contains X in its data field, the transfer of the current file + is canceled, and if it contains a Z, the entire transfer is canceled. + At least one overzealous Kermit implementation applies this rule to + non-Data packets as well, the typical symptom being that any attempt + to transfer a file whose name begins with X or Z results in + cancellation. This is because the file receiver typically sends back + the name under which it stored the file (which might not be the same + as the name it was sent with) in the ACK to the File Header packet. + This is information only and should not cause cancellation. To work + around the problem, use: + + SET F-ACK-BUG { ON, OFF } + + ON tells Kermit not to send back the filename in the ACK to the file + header packet as it normally would do (OFF puts Kermit back to normal + after using ON). + + A variation on the this bug occurs in an obscure Kermit program for + MUMPS: When this Kermit program sends a file called (say) FOO.BAR, it + requires that the ACK to its F packet contain exactly the same name, + FOO.BAR. However, C-Kermit likes to send back the full pathname, + causing the MUMPS Kermit to fail. SET F-ACK-BUG ON doesn't help here. + So a separate command has been added to handle this situation: + + SET F-ACK-PATH { ON, OFF } + + Normally it is ON (regardless of the SET SEND PATHNAMES setting). Use + SET F-ACK-PATH OFF to instruct Kermit to send back only the filename + without the path in the ACK to the F packet. + _________________________________________________________________ + + 4.22.5. Spurious Refusals + + Some Kermit implementations, notably PDP-11 Kermit 3.60 and earlier, + have bugs in their handling of Attribute packets that can cause + unwarranted refusal of incoming files, e.g. based on date or size. + This can be worked around by telling one or both of the Kermit + partners to: + + SET ATTRIBUTES OFF + _________________________________________________________________ + + 4.22.6. Failures during the Data Transfer Phase + + This can be caused by control-character unprefixing ([527]Section + 4.22.3 ), and fixed by: + + SET PREFIXING ALL + + It can also have numerous other causes, explained in Chapter 10 of + [528]Using C-Kermit: the connection is not 8-bit transparent (so use + "set parity space" or somesuch), inadequate flow control, etc. Consult + the manual. + _________________________________________________________________ + + 4.22.7. Fractured Filenames + + At least one well-known PC-based communications package negotiates + data compression, which (according to the protocol specification) + applies to both the filename and the file data, but then fails to + decompress the filename. Example: C-Kermit sends a file called + R000101.DAT (where 000101 might be non-Y2K-wise YYMMDD notation), and + the package in question stores the files as R~#0101.DAT. Workaround: + Tell C-Kermit to SET REPEAT COUNTS OFF. + _________________________________________________________________ + + 4.22.8. Bad File Dates + + At least one well-known PC-based communications package negotiates the + passing of file timestamps from sender to receiver, but when it is + sending files, it always gives them a timestamp of 1 February 1970. + Workaround: tell C-Kermit to SET ATTRIBUTE DATE OFF. You don't get the + file's real date, but you also don't get 1 Feb 1970; instead the file + gets the current date and time. + _________________________________________________________________ + + 4.23. File Transfer Recovery + + Prior to C-Kermit 7.0, RESEND (SEND /RECOVER) and REGET (GET /RECOVER) + refused to work if FILE TYPE was not BINARY or the /BINARY switch was + not included. Now these commands include an implied /BINARY switch, + meaning they set the file type to binary for the duration of the + command automatically. + + In the client/server arrangement, this also forces the server into + binary mode (if it is C-Kermit 7.0 or greater, or K95 1.1.19 or + greater) so the recovery operation proceeds, just as you asked and + expected. + + BUT... Just as before, the results are correct only under the + following conditions: + + * If the prior interrupted transfer was also in binary mode; or: + * If the prior transfer was in text mode and the other computer was + a "like platform" (e.g. UNIX-to-UNIX, Windows-to-Windows, + DOS-to-Windows) AND there was no character-set translation (i.e. + TRANSFER CHARACTER-SET was TRANSPARENT). + + Note that these circumstances are more likely to obtain in C-Kermit + 7.0, in which: + + * The default FILE TYPE in C-Kermit 7.0 is BINARY. + * The default FILE INCOMPLETE setting is AUTO, which means KEEP if + the transfer is in binary mode, DISCARD otherwise. + * C-Kermit 7.0, Kermit 95 1.1.17, and MS-DOS Kermit 3.15 and later + can recognize "like platforms" and switch into binary mode + automatically. Transfers between like platforms are always binary + unless character-set translation has been requested, and then is + still binary for all files whose names match a binary pattern, + unless the automatic mechanisms have been disabled (with a /TEXT + switch, or with SET TRANSFER MODE MANUAL). + * SEND /BINARY and GET /BINARY always force binary-mode transfers, + even when FILE TYPE is TEXT, even when TRANSFER MODE is AUTOMATIC, + even when PATTERNS are ON and the file's name matches a text + pattern. + + But also note that the automatic client/server transfer-mode + adjustments do not work with versions of C-Kermit prior to 7.0 or K95 + prior to 1.1.16. + + If the prior transfer was in text mode: + + * If text-mode transfers between the two platforms are + "length-changing" (as they are between UNIX -- which terminates + text lines with LF -- and DOS or Windows -- which terminates text + lines with CRLF), the recovered file will be corrupt. + * If text-mode transfers between the two platforms are not + length-changing, but character-set translation was active in the + prior transfer, the result will be a file in which the first part + has translated characters and the second part does not. + + But in C-Kermit 7.0 and K95 1.1.19 and later, incompletely transferred + text files are not kept unless you change the default. But if you have + done this, and you have an incompletely transferred text file, you'll + need to: + + * Transfer the whole file again in text mode, or: + * Use SEND /STARTING-AT: to recover the transfer at the correct + point; but you have to find out what that point is, as described + in the manual. + + Kermit has no way of knowing whether the previous transfer was in text + or binary mode so it is your responsibility to choose the appropriate + recovery method. + + If you use C-Kermit to maintain parallel directories on different + computers, using SET FILE COLLISION to transfer only those files that + changed since last time, and the files are big enough (or the + connection slow enough) to require SEND /RECOVER to resume interrupted + transfers, you should remember that SEND /RECOVER (RESEND) overrides + all FILE COLLISION settings. Therefore you should use SEND /RECOVER + (RESEND) only on the file that was interrupted, not the file group. + For example, if the original transfer was initiated with: + + SEND * + + and was interrupted, then after reestablishing your connection and + starting the Kermit receiver with SET FILE COLLISION UPDATE on the + remote end, use the following sequence at the sender to resume the + transfer: + + SEND /RECOVER name-of-interrupted-file + + and then: + + SEND * + + (In C-Kermit 7.0 and later, \v(filename) contains the name of the file + most recently transferred, as long you have not EXITed from Kermit or + changed directory, etc. + _________________________________________________________________ + + 4.24. FILE COLLISION UPDATE Clarification + + In UNIX, file modification dates are used when comparing the file date + with the date in the attribute packet. In VMS, however, the file + creation date is used. These two policies reflect the preferences of + the two user communities. + + Also, remember that the file date/time given in the attribute packet + is the local time at the file sender. At present, no timezone + conversions are defined in or performed by the Kermit protocol. This + is primarily because this feature was designed at a time when many of + the systems where Kermit runs had no concept of timezone, and + therefore would be unable to convert (say, to/from GMT or UTC or Zulu + time). + + As a consequence, some unexpected results might occur when + transferring files across timezones; e.g. commands on the target + system that are sensitive to file dates might work (UNIX "make", + backups, etc). + + Timezone handling is deferred for a future release. + _________________________________________________________________ + + 4.25. Autodownload Improvements + + Refer to pages 164-165 of [529]Using C-Kermit about the hazards of + autodownload when C-Kermit is "in the middle". As of C-Kermit 7.0, no + more hazards. If C-Kermit has TERMINAL AUTODOWNLOAD ON and it detects + a packet of the current protocol type (Kermit or Zmodem), it "erases" + the visual aspect of the packet that would be seen by the terminal + (or, more to the point, the emulator, such as K95). This way, only + C-Kermit goes into RECEIVE mode, and not also the terminal emulator + through which C-Kermit is accessed. And therefore, it is no longer + necessary to SET TERMINAL AUTODOWNLOAD OFF to prevent multiple Kermits + from going into receive mode at once, but of course it is still + necessary to ensure that, when you have multiple Kermits in a chain, + that the desired one receives the autodownload. + + The defaults have not been changed; Kermit 95 still has autodownload + ON by default, and C-Kermit has it OFF by default. + _________________________________________________________________ + + 5. CLIENT/SERVER + + 5.0. Hints + + If you use SET SERVER GET-PATH to set up your server, and the GET-PATH + does not include the server's current directory, clients can become + quite confused. For example, "remote dir oofa.txt" shows a file named + oofa.txt, but "get oofa.txt" fails. In this situation, you should + either DISABLE DIR or make your GET-PATH include the current + directory. + _________________________________________________________________ + + 5.1. New Command-Line Options + + The -G command-line option is like -g (GET), except the incoming file + is sent to standard output rather than written to disk. + + The -I option ("Internet") is used to tell a remote C-Kermit program + that you are coming in via Internet Telnet or Rlogin and therefore + have a reliable connection. The -I option is equivalent to SET + RELIABLE ON and SET FLOW NONE. + + The -O option ("Only One") tells C-Kermit to enter server mode but + then exit after the first client operation. + + See [530]Section 9.3 for details. + _________________________________________________________________ + + 5.2. New Client Commands + + BYE and FINISH no longer try to do anything if a connection is not + active. Thus a sequence like "hangup" followed by "bye" or "finish" + will no longer get stuck in a long timeout-and-retransmission cycle, + nor will it try to open a new connection. + + REMOTE EXIT + Similar to FINISH, except it ensures that the Kermit server + program exits back to the operating system or shell prompt. + (FINISH would return it to its interactive prompt if it was + started in interactive mode, and would cause it to exit if it + entered server mode via command-line option.) When C-Kermit is + to be the server, you can use { ENABLE, DISABLE } EXIT to + control the client's access to this feature. + + REMOTE MKDIR directory-name + Tells the client to ask the server to create a directory with + the given name, which can be absolute or relative. The syntax + of the directory name depends on the Kermit server (see + [531]next section); in all cases, it can be in the syntax of + the system where the server is running (UNIX, VMS, DOS, etc) + but newer servers also accept UNIX syntax, no matter what the + underlying platform. The server will not execute this command + if (a) it does not understand it, (b) a DISABLE MKDIR command + has been given, or (c) a DISABLE CWD command has been given; + otherwise, the command is executed, but will fail if the + directory can not be created, in which cases most servers will + attempt to return a message giving the reason for failure. The + REMOTE MKDIR command succeeds if the remote directory is + created, or if it already exists and therefore does not need to + be created, and fails otherwise. + + REMOTE RMDIR directory-name + Tells the client to ask the server to remove (delete) a + directory with the given name. The same considerations apply as + for REMOTE MKDIR. + + REMOTE SET FILE INCOMPLETE { DISCARD, KEEP, AUTO } + Previously this was only available in its earlier form, REMOTE + SET INCOMPLETE (no FILE). The earlier form is still available, + but invisible. Also, AUTO was added, meaning KEEP if in binary + mode, DISCARD otherwise. + + REMOTE SET TRANSFER MODE { AUTOMATIC, MANUAL } + Tells the client to ask the server to set the given + file-transfer mode. Automatic means (roughly): if the client + and the server are running on the same kind of computer (e.g. + both are on UNIX), then use binary mode automatically; if the + system types are different, use some other method to + automatically determine text or binary mode, such as filename + pattern matching. MANUAL means, in this context, obey the + client's FILE TYPE setting (TEXT or BINARY). Synonym: REMOTE + SET XFER MODE. + + [ REMOTE ] QUERY KERMIT function(args...) + Prior to C-Kermit 7.0, the arguments were not evaluated + locally. Thus it was not possible to have the server run the + function with client-side variables as arguments. Now: + + define \%a oofa.* + remote query kermit files(\%a) ; Client's \%a + remote query kermit files(\\%a) ; Server's \%a + + [ REMOTE ] LOGIN [ user [ password ] ] + LOGIN is now a synonym for REMOTE LOGIN. + + LOGOUT + This command, when given in local mode, is equivalent to REMOTE + LOGOUT. When given at the IKSD prompt, it logs out the IKSD. + When given at the C-Kermit prompt when it has no connection, it + does nothing. + + Note that in C-Kermit 7.0, the REMOTE (or R) prefix is not required + for QUERY, since there is no local QUERY command. The new top-level + QUERY command does exactly what REMOTE QUERY (RQUERY) does. + + All REMOTE commands now have single-word shortcuts: + + Shortcut Full Form + RASG REMOTE ASSIGN + RCD REMOTE CD + RCOPY REMOTE COPY + RDEL REMOTE DELETE + RDIR REMOTE DIRECTORY + REXIT REMOTE EXIT + RHELP REMOTE HELP + RHOST REMOTE HOST + RPWD REMOTE PWD + RSET REMOTE SET + etc. + + The R prefix is not applied to LOGIN because there is already an + RLOGIN command with a different meaning. It is not applied to LOGOUT + either, since LOGOUT knows what to do in each case, and for symmetry + with LOGIN. + _________________________________________________________________ + + 5.2.1. Remote Procedure Definitions and Calls + + This is nothing new, but it might not be obvious... REMOTE ASSIGN and + REMOTE QUERY may be used to achieve remote procedure execution. The + remote procedure can be defined locally or remotely. + + A remote procedure call is accomplished as noted in the previous + section: + + [ remote ] query kermit function-name(args...) + + This invokes any function that is built in to the Kermit server, e.g.: + + [ remote ] query kermit size(foo.bar) + + returns the size of the remote file, foo.bar. + + Now note that C-Kermit includes an \fexecute() function, allowing it + to execute any macro as if it were a built-in function. So suppose + MYMACRO is the name of a macro defined in the server. You can execute + it from the client as follows (the redundant "remote" prefix is + omitted in the remaining examples): + + query kermit execute(mymacro arg1 arg2...) + + The return value, if any, is the value of the RETURN command that + terminated execution of the macro, for example: + + define addtwonumbers return \feval(\%1+\%2) + + The client invocation would be: + + query kermit execute(addtwonumbers 3 4) + 7 + + The result ("7" in this case) is also assigned to the client's + \v(query) variable. + + To execute a remote system command or command procedure (shell script, + etc) use: + + query kermit command(name args...) + + Finally, suppose you want the client to send a macro to the server to + be executed on the server end. This is done as follows: + + remote assign macroname definition + query kermit execute(macroname arg1 arg2...) + + Quoting is required if the definition contains formal parameters. + _________________________________________________________________ + + 5.3. New Server Capabilities + + 5.3.1. Creating and Removing Directories + + The C-Kermit 7.0 server responds to REMOTE MKDIR and REMOTE RMDIR + commands. The directory name may be in either the native format of the + server's computer, or in UNIX format. For example, a server running on + VMS with a current directory of [IVAN] can accept commands from the + client like: + + remote mkdir olga ; Makes [IVAN.OLGA] (nonspecific format) + remote mkdir .olga ; Makes [IVAN.OLGA] (VMS format without brackets) + remote mkdir olga/ ; Makes [IVAN.OLGA] (UNIX relative format) + remote mkdir /ivan/olga ; Makes [IVAN.OLGA] (UNIX absolute format) + remote mkdir [ivan.olga] ; Makes [IVAN.OLGA] (VMS absolute format) + remote mkdir [.olga] ; Makes [IVAN.OLGA] (VMS relative format) + + 5.3.1.1. Creating Directories + + If a directory name is given that contains more than one segment that + does not exist, the server attempts to create all the segments. For + example, if the client says: + + REMOTE MKDIR letters/angry + + a "letters" subdirectory is created in the server's current directory + if it does not already exist, and then an "angry" subdirectory is + created beneath it, if it does not already have one. This can repeated + to any reasonable depth: + + REMOTE MKDIR a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/z/y/z + + 5.3.1.2. Removing Directories + + When attempting to execute a REMOTE RMDIR, the server can remove only + a single directory, not an entire sequence or tree. The system service + that is called to remove the directory generally requires not only + that the server process has write delete access, but also that the + directory contain no files. + + In the future, a REMOTE RMDIR /RECURSIVE command (and the accompanying + protocol) might be added. For now, use the equivalent REMOTE HOST + command(s), if any. + _________________________________________________________________ + + 5.3.2. Directory Listings + + Directory listings are generated by C-Kermit itself, rather than by + running the underlying system's directory command. Some control over + the listing format can be obtained with the SET OPTIONS DIRECTORY + command ([532]Section 4.5.1). The following options affect listings + sent by the server: /[NO]HEADING, /[NO]DOTFILES, and /[NO]BACKUP. In + UNIX and VMS, the listing is always sorted by filename. There is, at + present, no protocol defined for the client to request listing options + of the server; this might be added in the future. + + The server's directory listings are in the following format: + + Protection or permissions: + In UNIX and OS-9, this is a 10-character field, left adjusted. + In VMS it is a 22-character field, left-adjusted. In each case, + the protection / permission codes are shown in the server + platform's native format. In other operating systems, this + field is not shown. + + Size in bytes: + This is always a 10-character field. The file's size is shown + as a decimal number, right adjusted in the field. If the file + is a directory and its size can not be obtained, the size is + shown as "". Two blanks follow this field. + + Date: + Always in yyyy-mm-dd hh:mm:ss numeric format, and therefore 19 + characters long. If the file's date/time can't be obtained, + zeros (0) are shown for all the digits. This field is followed + by two blanks. + + Filename: + This field extends to the end of the line. Filenames are shown + relative to the server's current directory. In UNIX, symbolic + links are shown as they are in an "ls -l" listing as "linkname + -> filename". + + In UNIX and VMS, listings are returned by the server in alphabetical + order of filename. There are presently no other sort or selection + options. + + However, since these are fixed-field listings, all fields can be used + as sort keys by external sort programs. Note, in particular, that the + format used for the date allows a normal lexical on that field to + achieve the date ordering. For example, let's assume we have a UNIX + client and a UNIX server. In this case, the server's listing has the + date in columns 22-40, and thus could be sorted by the UNIX sort + program using "sort +0.22 -0.40" or in reverse order by "sort +0.22 + -0.40r". + + Since the UNIX client can pipe responses to REMOTE commands through + filters, any desired sorting can be accomplished this way, for + example: + +C-Kermit> remote directory | sort +0.22 -0.40 + + You can also sort by size: + + C-Kermit> remote directory | sort +0.11 -0.19 + + You can use sort options to select reverse or ascending order. "man + sort" (in UNIX) for more information. And of course, you can pipe + these listings through any other filter of your choice, such as grep + to skip unwanted lines. + _________________________________________________________________ + + 5.4. Syntax for Remote Filenames with Embedded Spaces + + C-Kermit and K95, when in server mode, assume that any spaces in the + file specification in an incoming GET command are filename separators. + Thus if the client gives a command like: + + get {oofa.txt oofa.bin} + + or, equivalently: + + mget oofa.txt oofa.bin + + the server tries to send the two files, oofa.txt and oofa.bin. But + what if you want the server to send you a file named, say: + + D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL + + How does the server know this is supposed to be one file and not + seven? In this case, you need to the send file name to the server + enclosed in either curly braces: + + {D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL} + + or ASCII doublequotes: + + "D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL" + + The method for doing this depends on your client. If your client is + C-Kermit 7.0, any recent version of Kermit 95, or MS-DOS Kermit 3.16, + then you have to enclose the name in braces just so the client can + parse it, so to send braces or doublequotes to the server, you must + put them inside the first, outside pair of braces. And you also need + to double the backslashes to prevent them from being interpreted: + + get {{D:\\HP OfficeJet 500\\Images\\My Pretty Picture Dot PCL}} + get {"D:\\HP OfficeJet 500\\Images\\My Pretty Picture Dot PCL"} + + To get around the requirement to double backslashes in literal + filenames, of course you can also use: + + set command quoting off + get {{D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL}} + get {"D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL"} + set command quoting on + + If you are giving a "kermit" command to the UNIX shell, you have to + observe the shell's quoting rules, something like this: + + kermit -ig "{D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL}" + + Here, the quotes go on the outside so UNIX will pass the entire + filename, spaces, braces, and all, as a single argument to Kermit, and + the backslashes are not doubled because (a) the UNIX shell ignores + them since they are in a quoted string, and (b) Kermit ignores them + since the interactive command parser is not activated in this case. + _________________________________________________________________ + + 5.5. Automatic Orientation Messages upon Directory Change + + C-Kermit 7.0, when acting as a server, can send an orientation message + to the client whenever the server directory changes. For example, when + the client gives a REMOTE CD command, the server sends the contents of + the new directory's "Read Me" file to the client's screen. The + following commands govern this feature: + + SET SERVER CD-MESSAGE FILE name + Given to the servr, allows the message-file name to be + specified at runtime. A list of names to look for can be given + in the following format: + + {{name1}{name2}{name3}{...}} + + e.g. SET SERVER CD-MESSAGE FILE + {{./.readme}{README.TXT}{READ.ME}} + + REMOTE SET SERVER CD-MESSAGE { ON, OFF } + Given to the client, lets the client control whether the server + sends automatic CD messages. + + SHOW SERVER + Given to server, includes CD-Message status. + + The default CD message file name is system dependent. SHOW CD or SHOW + SERVER displays the list. Also see [533]Section 4.5.2. + _________________________________________________________________ + + 5.6. New Server Controls + + DISABLE ENABLE + Allows the server to configured such that DISABLEd features can + not be re-enabled by any means -- e.g. if the client is somehow + able to get the server into command mode. Once DISABLEd, ENABLE + can not be re-ENABLEd. + + SET SERVER IDLE-TIMEOUT seconds + This was available previously in Kermit 95 only. Now it can be + used in C-Kermit also to specify a maximum number of seconds + the server is allowed to be idle before exiting server mode. 0 + seconds means no idle timeout. In C-Kermit (but not K-95), SET + SERVER TIMEOUT and SET SERVER IDLE-TIMEOUT are mutually + exclusive -- you can have one or the other (or neither), but + not both. (Server timeouts are for the benefit of primitive + Kermit clients that are not capable of timing out on their own; + to our knowledge, no such clients are still in circulation.) + + SET SERVER KEEPALIVE { ON, OFF } + (See next section). + _________________________________________________________________ + + 5.7. Timeouts during REMOTE HOST Command Execution + + Prior to C-Kermit 7.0, the C-Kermit server would block waiting for + output from a system command invoked via REMOTE HOST from the client. + If the system command took a long time to execute, the client would + time out and send NAK packets. If the command took too long, the + client would reach its retry limit and give up. Even if it didn't, the + NAKs would cause unnecessary retransmissions. + + In version 7.0, the C-Kermit server (VMS and select()-capable UNIX + versions only), sends "keepalive packets" (empty data packets) once + per second while waiting for the system command to complete. This + procedure should be entirely transparent to the Kermit client, and + should prevent the unwanted timeouts and NAKs. When C-Kermit 7.0 + itself (or K95 1.1.19) is the client, it prints dots to show the + keepalive packets. + + The keepalive feature can be turned off and on with: + + SET SERVER KEEPALIVE { ON, OFF } + + Normally it should be on. Turn it off it if causes trouble with the + client, or if it seems to slow down the server (as it might on some + platforms under certain circumstances). + _________________________________________________________________ + + 6. INTERNATIONAL CHARACTER SETS + + Support for several new single-byte character sets was added in + C-Kermit 7.0. Unicode / ISO 10646 is not yet supported, but is a high + priority for forthcoming releases. + + 6.0. ISO 8859-15 Latin Alphabet 9 + + To accommodate the Euro currency symbol, and to correct several other + longstanding problems with ISO Latin Alphabet 1, ISO 8859-15 Latin + Alphabet 9 was issued in May 1998. It is supported by C-Kermit 7.0 as + a transfer character set, a file character set, and a terminal + character set. Translations that preserve the new characters are + available between Latin-9 and several other sets including: + + PC Code Page 858 (Western European languages, similar to CP850) + Windows Code Page 1252 (Western European languages, similar to Latin-1) + Windows Code Page 1250 (Eastern European languages, similar to Latin-2) + + The Latin-9 transfer character set also allows for the OE digraph + character, used primarily in French, to be preserved in transfers + involving the DEC MCS or NeXT character sets. + + The Euro character is also present in the Universal Character Set, + described in [534]Section 6.6. + + 6.1. The HP-Roman8 Character Set + + The HP-Roman8 character set is supported in C-Kermit 6.0 and later but + was omitted from Table VII-4 in the 2nd Edition of Using C-Kermit due + to lack of space. It is listed in [535]Appendix III. + + 6.2. Greek Character Sets + + Greek character sets were added in 6.1: + + SET FILE CHARACTER-SET { CP869, ELOT927, GREEK-ISO } + SET TRANSFER CHARACTER-SET { GREEK-ISO } + + GREEK-ISO is ISO 8859-7, which the same as ELOT 928. + + The new Greek character sets are listed in [536]Appendix III. + + 6.3. Additional Latin-2 Character Sets + + The following have been added as FILE and TERMINAL CHARACTER-SETs: + + MAZOVIA-PC + A PC code page used in Poland, equivalent to CP437, but with 18 + substitutions needed for Polish. + + CP1250 + The Windows Latin 2 Code Page. Equivalent to ISO 8859-2, but + with different encoding. + + 6.4. Additional Cyrillic Character Sets + + The following have been added as FILE and TERMINAL CHARACTER-SETs: + + BULGARIA-PC + This is the Cyrillic PC code page used in Bulgaria, where it is + called Code Page 856. It is attributed to a company called + DATEC, Inc, but CP856 is not a proper designation, since it + refers to a Hebrew Code Page (see the IBM Registry). + + CP855 + This PC Code Page contains all the Cyrillic letters that are + also in ISO 8859-5, and is therefore useful for non-Russian + Cyrillic text (Ukrainian, Belorussian, etc), unlike CP866, + which has a smaller repertoire of Cyrillic letters. + + CP1251 + The Windows Cyrillic Code Page. Equivalent to CP855, but with + different encoding. + + KOI8R + An extension to "Old KOI-8" that adds upper and lower case + Cyrillic letter Io (looks like Roman E with diaeresis) plus a + selection of box-drawing characters to columns 8 through 11, + which are vacant in original Old KOI-8. KOI8-R is used for the + Russian language. It is specified in [537]RFC 1489. + + KOI8U + A similar extension of Old KOI-8, but for Ukrainian. It is + specified in [538]RFC 2319. + _________________________________________________________________ + + 6.5. Automatic Character-Set Switching + + Prior to version 7.0, C-Kermit's file character-set always had to be + set explicitly. In 7.0 and later, it is set automatically when: + + 1. This feature is enabled (as it is unless you disable it). + 2. An incoming text-mode transfer includes a transfer-character-set + announcer and you have not previously given a SET FILE + CHARACTER-SET command. In this case, C-Kermit switches to an + appropriate file character set. For example, on an HP-UX + workstation, an incoming Latin-1 file automatically selects + HP-Roman8 for the local copy of the file; in Data General AOS/VS, + it would select DG International. + 3. You give a SET TRANSFER CHARACTER-SET command without having + previously specified a FILE CHARACTER-SET. An appropriate file + character-set is chosen automatically. + + In addition, when you give a SET FILE CHARACTER-SET command, the + appropriate transfer character-set is automatically chosen, to be used + when you are sending files (but this does not override the one + announced by the sender when you are receiving files). + + You might not agree about what is "appropriate", so of course you can + disable or change all of the above actions. + + You can disable (or re-enable) the new automatic character-set + switching feature in each direction separately: + + SET RECEIVE CHARACTER-SET-SELECTION { AUTOMATIC, MANUAL } + AUTOMATIC is the default, causing the behavior described above + when an incoming file arrives. Choose MANUAL to defeat this + behavior and force your current FILE CHARACTER-SET setting to + be used, no matter what it is. Note that SET RECEIVE + CHARACTER-SET MANUAL does not disable recognition of the + incoming transfer character-set announcer, and translation from + the corresponding character-set to your current file + character-set. To disable that, use SET ATTRIBUTE CHARACTER-SET + OFF. + + SET SEND CHARACTER-SET-SELECTION { AUTOMATIC, MANUAL } + Again AUTOMATIC is the default, causing the behavior described + above when you give a SET { FILE, TRANSFER } CHARACTER-SET + command. Use MANUAL to allow you to specify the transfer and + file character-sets independently. + + SHOW CHARACTER-SETS + Tells settings of { SEND, RECEIVE } CHARACTER-SET-SELECTION. + + Normally, however, it is more convenient to leave automatic switching + active, and change any associations that are not appropriate for your + application, area, or country. The commands are: + + SHOW ASSOCIATIONS + This command lists all the associations in each direction: for + each possible transfer character-set, it lists the associated + file character-set, and vice versa. These are two separate and + independent lists. + + ASSOCIATE TRANSFER-CHARACTER-SET name1 [ name2 ] + Changes the association for the transfer character-set name1 to + be the file character-set name2. If name2 is omitted, automatic + switching is disabled for this transfer character-set only. + + ASSOCIATE FILE-CHARACTER-SET name1 [ name2 ] + Changes the association for the file character-set name1 to be + the transfer character-set name2. If name2 is omitted, + automatic switching is disabled for this file character-set + only. + _________________________________________________________________ + + 6.6. UNICODE + + C-Kermit 7.0 adds support for Unicode, the Universal Character Set, + for: + + * File Transfer (SEND, RECEIVE, GET, etc) + * Terminal connection (CONNECT) + * Unguarded file capture (LOG SESSION) + * Unguarded file transmission (TRANSMIT) + * Local file character-set conversion (TRANSLATE) + + C-Kermit is not, however, a "Unicode application" in the sense that + its commands, messages, or user interface are Unicode. Rather, it is + "Unicode aware" in its ability to handle and convert Unicode text in + the course of file transfer and terminal connection, and you can also + use Kermit to convert local files between Unicode and other character + sets. TLA's: + + BMP - Base Multilingual Plane + BOM - Byte Order Mark + CJK - Chinese, Japanese, and Korean + ISO - International Standards Organization + TLA - Three-Letter Acronym + UCS - Universal Character Set + UTF - UCS Transformation Format + + Unicode and ISO 10646 are the coordinated and compatible corporate and + international standards for the Universal Character Set (UCS). Unlike + single-byte and even most multibyte character sets, the UCS can + represent all characters in every existing writing system. A flat + plain-text file encoded in some form of UCS can contain any mixture of + English, Spanish, Italian, German, Hebrew, Arabic, Greek, Russian, + Armenian, Georgian, Japanese, Chinese, Korean, Vietnamese, Tibetan, + Hindi, Bengali, Tamil, Thai, Ethiopic, and so on, plus scientific and + mathematical notation, as well as texts in Runes, Ogham, Glagolitic, + and other historic scripts. + + The UCS already covers these scripts and many more, but it's an + evolving standard with efforts underway to accommodate even more + languages and writing systems. Support is growing for native UCS use + on many platforms and in many applications. The goal of the framers of + the UCS is for it to replace ASCII, the ISO Latin Alphabets, ISCII, + VISCII, the Chinese, Japanese, and Korean (CJK) multibyte sets, etc, + as well as the many private character sets in use today, in other + words to become *the* Universal Character Set. + + Until that time, however, conversions between existing sets and the + UCS will be necessary when moving text between platforms and + applications. Now Kermit can help. + _________________________________________________________________ + + 6.6.1. Overview of Unicode + + For a more complete picture, please visit: + + [539]http://www.unicode.org/ + + and access the various online introductions, FAQs, technical reports, + and other information. For greater depth, order the latest version of + the published Unicode Standard. The following overview contains a + great many oversimplifications and perhaps an opinion or two. + + At present, the UCS is a 16-bit (2-byte) character set, but with + provisions to grow to a 4-byte set. UCS-2 refers to the two-byte set, + also called the Base Multilingual Plane (BMP), in which each character + has 16 bits, and therefore there are 2^16 = 65536 possible characters. + The first 128 characters are the same as US ASCII (C0 control + characters and DEL included), the next 32 are the C1 control + characters of ISO 6429, and the next 96 are the Right Half of ISO + 8859-1 Latin Alphabet 1. The remaining tens of thousands of characters + are arranged newly for the UCS, usually (but not always) in sections + corresponding to existing standards, such as ISO Latin/Cyrillic, often + plus additional characters not appearing in the existing standards due + to lack of space (or other reasons). + + ISO 10646 allows for additional planes, e.g. for Egyptian + hieroglyphics or ancient (or other esoteric) CJK characters, but these + planes are not yet defined and so we will say nothing more about them + here, except that their use will require the 4-byte form of UCS, + called UCS-4, in some form (more about "forms" in [540]Section 6.6.2). + + Unicode and ISO 10646 are constantly under revision, mainly to add new + characters. The Unicode revision is denoted by a version number, such + as 1.0, 1.1, 2.0, 3.0. The ISO 10646 standard revision is identified + by Edition (such as ISO 10646-1 1993), plus reference to any + amendments. The first versions of these standards included encodings + for Korean Hangul syllables (Jamos); these encodings were changed in + version 1.1 of Unicode and by Amendment 5 to ISO 10646-1. The Unicode + Technical Committee and the ISO acknowledge that this was a bad thing + to do, and promise never change encodings or character names again, + since this poses serious problems for conformance and data + interchange. + + A UCS-2 value is customarily written like this: + + U+xxxx + + where "xxxx" represents four hexadecimal digits, 0-9 and A-F. For + example, U+0041 is "A", U+00C1 is A-acute, U+042F is uppercase + Cyrillic "Ya", U+FB4F is Hebrew Ligature Alef Lamed, and U+FFFD is the + special character that means "not a character". + + Most characters from widely-used alphabetic writing systems such as + the West European ones, Cyrillic, Greek, Hebrew, Vietnamese, etc, are + available in "precomposed" form; for example Uppercase Latin Letter A + with Acute Accent is a single character (as it is in Latin-1). + However, the UCS also permits composition of a base character with one + or more nonspacing diacritics. This means the same character can be + represented in more than one way, which can present problems in many + application areas, including transfer and character-set conversion of + text. + + Conversion from ASCII or Latin-1 to UCS-2 text is "trivial": simply + insert a NUL (0) byte before each ASCII or Latin-1 byte. Converting in + the reverse direction (provided the UCS-2 file contains only U+0000 to + U+00FF) is equally simple (if we ignore the issue of composition): + remove every second (NUL) byte. Conversion of other character sets to + and from UCS, however, requires tables or algorithms specific to each + set. Nevertheless, the relatively transparent upwards compatibility + from ASCII and Latin-1, in which a very large share of the world's + textual data is encoded, gives the UCS an entree onto existing + platforms. + + But the 2-byte format and the preponderance of NUL and other control + bytes in UCS-2 text pose problems for current applications and + transmission methods. And to make matters worse, different hardware + platforms store UCS-2 characters in different byte order. Thus a UCS-2 + file transferred by FTP (or accessed via NFS, etc) between two + computers with different architecture might have its bytes in the + wrong order (or worse; see [541]Section 6.6.5.1 ). + _________________________________________________________________ + + 6.6.2. UCS Byte Order + + Consider the number 1. In an 8-bit byte, this would be represented by + the following series of 0- and 1-bits: + + +-----------------+ + | 0 0 0 0 0 0 0 1 | + +-----------------+ + + Therefore in a 16-bit "word" the representation might be: + + +-----------------+-----------------+ + | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 | + +-----------------+-----------------+ + + Now consider the number 256, which is 2 to the 8th power. The binary + representation is 100000000 (1 followed by 8 zeros). 256 would go into + a 16-bit word like this: + + +-----------------+-----------------+ + | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 | + +-----------------+-----------------+ + + When a computer works this way, it is said to be Big Endian, meaning + it puts the most significant (biggest) byte first (on the "left") in a + 16-bit word, and the least significant byte second (on the right). + + However, some other computers have the opposite arrangement, called + Little Endian, in which 1 is: + + +-----------------+-----------------+ + | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 | + +-----------------+-----------------+ + + and 256 is: + + +-----------------+-----------------+ + | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 | + +-----------------+-----------------+ + + Computers such as Sparc, MIPS, PA-RISC, and PowerPC are Big Endian, + whereas the PC and the Alpha are Little Endian. Endianness has never + been an issue with 7- or 8-bit characters, but it is with UCS + characters. It can be a tricky business to share or transfer a UCS-2 + file between two different kinds of computers. + + To alleviate (but not entirely solve) the problem, UCS-2 files are + supposed to begin with the Unicode character U+FEFF, Zero-Width + No-Break Space (ZWNBS). This is a kind of "no-op" (note: any such + assertion must normally be qualified with many "but ifs" and "excepts" + which are omitted here in the interest of brevity). If the bytes are + reversed the ZWNBS becomes U+FFFE, which is not (and never will be) a + defined UCS character. U+FEFF at the beginning of a UCS file is + therefore called a Byte Order Mark, or BOM. + + Any application that creates a UCS-2 (or UTF-16, or UCS-4) file should + include a BOM, and any application that reads one should test for a + BOM, and if one is found, infer the byte order from it. This is a + convention, however -- not a standard or a requirement -- and + applications vary in their ability to handle BOMs and "backwards" + UCS-2 files. + + Note that a BOM is useful only at the beginning of a file. If you + append one UCS-2 file to another, and both have BOMs, the internal BOM + is no longer a BOM. And if the byte orders of the two files differ, + then either the first part or the second will be backwards. (Various + other undesirable effects might also occur, not discussed here.) + _________________________________________________________________ + + 6.6.2. UCS Transformation Formats + + UCS textual data can be modified in various ways for transmission or + storage. Any officially sanctioned method of doing this is called a + UCS Transformation Format, or UTF. One such method, called UTF-16, is + essentially identical with UCS-2 except that it designates certain + code values as "escape sequences" (called surrogate pairs) to access + characters in other planes without having to use full UCS-4. We won't + discuss UTF-16 further here, since at the moment there are no other + planes. Several other UTF's (such as UTF-1, UTF-2, and UTF-7) have + fallen into disuse and are not discussed here. The most important + transformation format today is UTF-8. + + UTF-8, so called because it "serializes" UCS-2 data into a stream of + 8-bit bytes, is designed to allow the UCS to work with present-day + communications gear, computers, and software. The most important + properties of UTF-8 are that byte order is constant (no byte swapping) + and all (7-bit) ASCII characters represent themselves. Therefore + conversion between ASCII and UTF-8 is no conversion at all, and + applications or platforms (such as Plan 9 from Bell Labs) that use + UTF-8 "for everything" can still run traditional ASCII-only + applications and be accessed from them. In particular, unlike UCS-2, + ASCII characters are not padded with NUL bytes. But also unlike UCS-2, + there is no transparency for Latin-1 or any other non-ASCII character + set. Every non-ASCII UCS-2 character is represented by a sequence of 2 + or 3 UTF-8 bytes. Thus UTF-8 is more compact than UCS-2 for text + containing a preponderance of ABC's (or other ASCII characters), about + the same as UCS-2 for other alphabetic scripts (Cyrillic, Roman, + Greek, etc), and larger than UCS-2 for Chinese, Japanese, and Korean. + + The UTF-8 uncoding of the UCS has been adopted by the Internet as the + preferred character set for new applications, and is gradually being + retrofitted into traditional applications like FTP ([542]RFC 2640). + _________________________________________________________________ + + 6.6.3. Conformance Levels + + Although the Unicode and ISO 10646 standards both describe the same + character set, these standards differ in many ways, including their + stated requirements for conformance and their classification of + conformance levels. + + Kermit has always abided by ISO character-set standards, including ISO + character-set designation and invocation methods. In adapting Unicode, + therefore, we had to choose from among the available ISO designations + which, in turn, correspond with ISO 10646 conformance levels. At + present, Kermit claims the lowest conformance level, 1, meaning + (roughly) that it does not handle combining forms and it does not + handle Korean Hangul Jamos (just as, at present, it does not handle + Korean in general). Note that ISO 10646 Conformance Levels 1 and 2 + sidestep the issue of the code changes for Korean Hangul by announcing + non-support for Hangul regardless of encoding. + + ISO 10646 Conformance Level 1 is approximately equivalent to Unicode + Normalization Form C (described in Unicode Technical Report 15, + incorporated into Unicode 3.0). + + As noted in [543]Section 6.6.2, Kermit does not claim to support + UTF-16 at the present time, hence the UCS-2 nomenclature. Kermit + treats surrogates just as if they were any other UCS-2 characters, + rather than as escapes to other planes, which means that (except when + converting between UCS-2 and UTF-8) they are translated to "error" + characters, since (a) no other planes are defined yet (and if they + were, no other character sets supported by Kermit would encode their + characters), and (b) no valid surrogate character corresponds to any + other UCS-2 character. + + A minor yet significant aspect of Unicode 3.0 and some recent + perturbation of ISO 10646-1 (probably Amendment 18, "Symbols and Other + Characters") is the addition of the Euro Sign at U+20AC. As noted in + [544]Section 6.0, Kermit's "Euro compliance" includes conversion + between Latin Alphabet 9 and various PC code pages. Text can also be + converted between UCS-2 or UTF-8 and any other Euro-compliant + character set (Latin-9, CP858, CP1250, CP1252) without loss of the + Euro Sign. + _________________________________________________________________ + + 6.6.4. Relationship of Unicode with Kermit's Other Character Sets + + Kermit's character sets are divided into two groups: single-byte sets + (such as Roman, Hebrew, Cyrillic, Greek) and multibyte (various + Japanese sets). The two groups are distinct since one normally would + not expect to convert Kanji ideograms to Roman (or other) letters, or + vice versa. + + Unicode character-set conversion works with both groups, but obviously + the result depends on the repertoires of the source and destination + character-sets both including the characters in the file. For example, + you can translate a Hungarian text file between Latin-2 and Unicode, + but not between (say) Unicode and Latin/Greek. By the same token you + can convert Japanese text from Shift-JIS or EUC or JIS-7 to Unicode + and back, but you can't convert the same file to (say) Latin-1 if it + contains Japanese characters. + + JIS-7 is equivalent to DEC Kanji and ISO-2022-JP except that the + latter two do not support halfwidth Katakana. Kermit treats all + three of these sets the same way, i.e. as JIS-7. + + As noted, Kermit presently does not handle combining diacritics, and + so will not correctly convert UCS files that use them into a + single-byte character set. For example, if a UCS file contains Latin + Capital Letter A (U+0041) followed by Combining Acute Accent (U+0301), + the result will be a two-character sequence, A followed by another + character. This is what is meant by Conformance Level 1. (The + situation grows worse with multiple diacritics, since they can occur + in any order.) + + A higher level of conformance is possible, in which "canonical + equivalences" are handled via algorithms and databases, at some + (perhaps considerable) cost in performance, since a fair amount of + additional code must be executed for every character during data + transfer (database lookup, sorting of combining sequences into + canonical order, etc). This can be added in future releases if there + is a need (but in many cases, pre- and postpostprocessing might be a + better option). + + Within these constraints, Kermit converts between the UCS and its + other character sets. For example, a mixture of Russian and English + (and/or Dutch, or Latin) text can bet converted between the UCS and + ISO Latin/Cyrillic or KOI-8. But since Kermit does not presently + support Arabic character-set conversion, the new availability of UCS + conversion does not mean that Kermit can convert from Arabic UCS text + to some other character set, because Kermit does not support any other + character set that includes Arabic. Ditto for Thai, Armenian, + Georgian, Tibetan, Chinese, Korean, etc. However, Kermit CAN convert + Arabic (or any other script) between UCS-2 and UTF-8. + + Considering Cyrillic more carefully, note that the UCS also contains + numerous Cyrillic characters not found in any of the Cyrillic sets + (ISO Latin/Cyrillic, KOI8, CP866, etc) that Kermit supports; + characters needed for Abkhasian, Yakut, Tatar, Bashkir, Altaic, Old + Church Slavonic, etc; UCS text containing any of these historic or + "extended" Cyrillic characters can not be converted to any of Kermit's + current single-byte Cyrillic sets without loss. The situation is + similar for Greek, Hebrew, etc, and even worse for Japanese since + Unicode contains thousands of Kanjis that are lacking from the + Japanese character sets based on JIS X 0208, such as EUC-JP, JIS-7, + and Shift-JIS. + + In general, when converting from UCS to a single-byte set, there is + always the possibility of data loss, just as there is when converting + from any larger set to a smaller one. For example, if a UCS file + contains Devanagari characters, these characters will be lost when + converting to (say) Latin-1, just as Roman vowels with acute accents + are lost when converting from Latin-1 (an 8-bit set) to German ISO 646 + (a 7-bit set). + _________________________________________________________________ + + 6.6.5. Kermit's Unicode Features + + C-Kermit can convert between UCS-2 or UTF-8 and any of its other + character sets, and also between UCS-2 and UTF-8. When converting + between UCS-2 or UTF-8 and a non-Unicode character set (such as + Latin-1), the UCS Line Separator (LS, U+2028) and Paragraph Separator + (PS, U+2029) characters are converted to the appropriate line + terminator (CR, LF, or CRLF). When converting from a non-Unicode set + to UCS-2 or UTF-8, however, line terminators are not converted to LS + or PS. This is in accordance with the recommendations of Unicode + Technical Report #13. + + When C-Kermit starts, it tests the native byte order of the computer. + You can see the result in the SHOW FEATURES or SHOW FILE display. It's + also available in the variable \v(byteorder): 0 means Big Endian, 1 + means Little Endian. + + When UCS-2 is involved in file transfer or translation, the following + commands tell C-Kermit what to do about byte order: + + SET FILE UCS BYTE-ORDER { BIG-ENDIAN, LITTLE-ENDIAN } + This is for reading UCS-2 files that don't have a BOM, and also + for writing UCS-2 files. If this command is not given, the + machine's native byte order is used when writing UCS-2 files, + and also when reading UCS-2 files that don't have a BOM. + + SET FILE UCS BOM { ON, OFF } + This setting is used when creating UCS-2 files. A BOM is added + at the beginning by default. Use OFF to not add the BOM. This + command has no affect when writing files. + + COPY /SWAP-BYTES sourcefile destinationfile + Use this for fixing a UCS-2 file whose bytes are in the wrong + order. + + Use SHOW FILE to display the FILE UCS settings. + + Please note, again, that C-Kermit's user interface, including its + script language, is not internationalized in any way. String + comparisons, case conversion, and so on, work only for US ASCII + (comparisons for equality work with other sets, but not + lexically-greater-or-less-than or caseless comparisons; even + comparisons for equality can fail when composed characters or byte + order are involved). String functions such as \findex() and + \fsubstring() that reference byte positions do just that; they won't + work with UTF-8 text that contains any non-ASCII characters, and they + will not work with UCS-2 text at all since they use C strings + internally, which are NUL-terminated. These are just a few examples to + illustrate that neither Unicode nor any other character-set beyond + ASCII is supported at the user-interface, command, or scripting level + in this version of C-Kermit. + _________________________________________________________________ + + 6.6.5.1. File Transfer + + Kermit supports both UCS-2 and UTF-8 as file and transfer character + sets in text-mode file transfer. + + To select UCS-2 or UTF-8 as a file character-set, use: + + SET FILE CHARACTER-SET { UCS2, UTF8 } + + If you want to send a UCS-2 text file (or save an incoming file in + UCS-2 format), tell Kermit to: + + SET FILE CHARACTER-SET UCS2 + + and if you want to send a UTF-8 text file (or store an incoming file + in UTF-8 format), tell Kermit to: + + SET FILE CHARACTER-SET UTF8 + + When sending UCS-2 files, Kermit determines the byte order from the + BOM, if there is one (and if there is a BOM, it is stripped, i.e. not + sent). If there is no BOM, the byte order is the one specified in the + most recent SET FILE UCS BYTE-ORDER command, if any, otherwise the + computer's native byte order is assumed. When storing incoming files + as UCS-2, the byte order is according SET FILE UCS BYTE-ORDER, if + given, otherwise the native one; a BOM is written according to SET + FILE UCS BOM. + + A transfer character-set should be chosen that includes all of the + characters in the source file. So, for example, if you are sending a + UCS-2 file containing only German-language text, your transfer + character-set can be Latin-1, Latin-2, Latin-9, UCS-2, or UTF-8. But + if you are sending a file that contains a combination of Hebrew and + Greek, your transfer character-set must be UCS-2 or UTF-8 if you don't + want to lose one script or the other. Furthermore, the transfer + character-set must be one that is supported by the receiving Kermit + program. Since UCS support is new, it is possible that the other + Kermit program (if it supports character sets at all) does not support + it, but does support single-byte sets such as Latin-1, Latin/Cyrillic, + etc. + + To select UCS-2 or UTF-8 as a transfer character-set, use: + + SET TRANSFER CHARACTER-SET { UCS2, UTF8 } + + It is up to the receiving Kermit program to convert the transfer + format to its own local format, if necessary. If it does not + understand the UTF-8 or UCS-2 transfer character-set, and your file + can not be adequately represented by any single-byte transfer + character-set (such as Latin-1 or Latin/Cyrillic) then, if UTF-8 + format is acceptable on the receiving computer, use UTF-8 as the + transfer character-set, with the receiver told to "set unknown-char + keep", or with the sender told to "set attribute char off". If you + want the file to be stored in UCS-2 format at the receiver, send it it + binary mode if the source file is also UCS-2, or else use the + TRANSLATE command (next section) to convert it to UCS-2 first, then + send it in binary mode. You should not use UCS-2 as a transfer + character-set in text-mode transfers to Kermit programs that don't + support it, because they are likely to corrupt the result the same way + FTP would (see the final paragraph of this section). + + When UCS-2 is the transfer character set, it always goes into Kermit + packets in Big Endian format, with no BOM. As always, the transfer + character-set is announced by the sender to the receiver. The + announcement for UCS-2 is "I162" (ISO Registration 162 = UCS-2 Level + 1) and by definition it is Big Endian (the standards say that when + UCS-2 is serialized into bytes, the order must be Big Endian). The + announcement for UTF-8 is "I190" (UTF-8 Level 1). + + When receiving a file whose transfer character-set is UCS-2 or UTF-8, + you must choose the appropriate file character set for the result. + There is no way Kermit can do this for you automatically, since UCS + data can be in any script at all, or any combination. + + In general, UTF-8 or UCS-2 should be chosen as a transfer + character-set if the source file is also encoded in some form of UCS + and it contains more than one script. But there are other situations + where where UTF-8 or UCS-2 offer advantages. For example, suppose the + source file is on a NeXTstation and the destination file is on VMS. + Both the NeXT and the DEC Multinational character sets include the + French OE digraph, but Latin-1 does not. Therefore French words + containing this character might not arrive intact when Latin-1 is the + transfer character-set, but will with UTF-8 or UCS-2, since the UCS + includes the OE digraph (but so does Latin-9). + + UCS-2 should be chosen as a transfer character-set only for Japanese + text files that contain a large preponderance of Kanji, since in this + case (and only this case) UCS-2 (two bytes per Kanji) is more + efficient than UTF-8 (three bytes per Kanji). The same will be true + for Chinese and Korean when they are supported by Kermit. UCS-2 should + never be used as a transfer character-set with a transfer partner that + does not support UCS-2 since this can cause file corruption (see last + paragraph in this section). + + Note that Kermit's repeat-count compression is 100% ineffective for + UCS-2, and is also ineffective for multibyte characters in UTF-8 and + EUC-JP; this is because repeat-compression is a transport-level + mechanism that operates on a per-byte basis; it has no knowledge of + the distinction between a byte and a character. + + When C-Kermit starts, it sets up associations ([545]Section 6.5) for + incoming files whose transfer character sets are UCS-2 or UTF-8 + appropriately for the platform so that the file character-set for the + incoming file is UCS-2 in Windows and UTF-8 elsewhere. Otherwise, + C-Kermit does not make any default associations for UCS-2 or UTF-8, + but of course you may add or change associations to suit your needs + and preferences by including the appropriate ASSOCIATE commands in + your Kermit startup file. For example, if you are a PC user and deal + only with text written in Greek and English, you can: + + ASSOCIATE TRANSFER-CHARACTER-SET UTF8 CP869 + ASSOCIATE TRANSFER-CHARACTER-SET UCS2 CP869 + ASSOCIATE FILE-CHARACTER-SET CP869 UTF8 + + Note that when file transfer involves conversion between a single-byte + character set and UCS-2 or UTF-8, the file-transfer thermometer and + estimated time left might be inaccurate, since they are based on the + source file size, not the transfer encoding. This is purely a cosmetic + issue and does not effect the final result. (And is not, strictly + speaking, a bug; Kermit protocol presently includes no method for the + sender to furnish an "estimated transfer size" to the receiver, and in + any case any such guess could be as far off as the file size, given + the many other factors that come into play, such as compression and + prefixing). + + A caution about FTP and UCS-2. As noted previously, if you transfer a + UCS-2 file with FTP in binary mode between two computers with opposite + Endianness, the result will have its bytes in the wrong order. + However, if you use FTP to transfer a UCS-2 file in "ascii" (text) + mode to ANY computer, even if it is identical to yours, the result + will be corrupted because FTP's line-terminator conversions do not + account for UCS-2. The same holds when sending from a UCS-aware Kermit + program to an older Kermit program in text mode with a transfer + character-set of UCS-2. So use UCS-2 as a transfer character-set ONLY + with a UCS-2-aware Kermit partner. + _________________________________________________________________ + + 6.6.5.2. The TRANSLATE Command + + In Kermit versions that have Unicode support included, TRANSLATE now + always goes through Unicode; that is, the source set is converted to + UCS-2 and thence to the target set. This is a major improvement, since + in prior releases, C-Kermit had to pick the "most appropriate" + transfer character-set as the intermediate set, and this would result + in the loss of any characters that the source and target sets had in + common but were lacking from the intermediate set (for example the OE + digraph when translating from NeXT to DEC MCS through Latin-1). This + never happens when Unicode is the intermediate set because Unicode is + a superset of all other character sets supported by Kermit. A more + dramatic example would be translation between Cyrillic PC code page + 866 and KOI8-R ([546]Section 6.4); formerly all the line- and + box-drawing characters would be lost (since ISO 8859-5 does not have + any); now the ones that these two sets have in common are preserved. + + UCS-2 and UTF-8 are now both supported as source-file and + destination-file character sets by C-Kermit's TRANSLATE command, for + example: + + translate oofa.txt ucs2 latin1 oofa-l1.txt + + translates oofa.txt from UCS-2 to Latin-1, storing the result as + oofa-l1.txt. Similarly: + + translate oofa.txt utf8 latin1 oofa-l1.txt + translate oofa.txt latin1 ucs2 oofa-ucs2.txt + translate oofa.txt latin1 utf8 oofa-utf8.txt + translate oofa.txt ucs2 utf8 oofa-utf8.txt + translate oofa.txt utf8 ucs2 oofa-ucs2.txt + + Treatment of the UCS-2 BOM is exactly the same as for file transfer. + Note that if a UCS-2 source file is in the "wrong" byte order and + lacks a BOM, and you don't tell Kermit about it with SET FILE UCS + BYTE-ORDER, the result of the translation is total gibberish. Recall + that you can use COPY /SWAP-BYTES to switch the byte order of an + errant UCS-2 file (or any other file for that matter, if you can think + of a reason to). Also note that: + + translate oofa.txt ucs2 ucs2 new.txt + + Produces a result in the native (or SET FILE UCS) byte-order as long + as oofa.txt has a BOM. + + As a side benefit of the Unicode work, the TRANSLATE command now works + for the first time also for all Japanese character sets that Kermit + supports. In other words, if you have a Japanese text file in any of + the following encodings: + + EUC-JP + Shift-JIS + JIS-7 + UCS-2 + UTF-8 + + You can use the TRANSLATE command to convert to any other encoding + from the same list. + _________________________________________________________________ + + 6.6.5.3. Terminal Connection + + The CONNECT command now allows UTF-8 as a local or remote terminal + character-set: + + SET TERMINAL CHARACTER-SET { ..., UTF8 } { ..., UTF8 } + SET TERMINAL REMOTE-CHARACTER-SET { ..., UTF8 } + SET TERMINAL LOCAL-CHARACTER-SET { ..., UTF8 } + + (Recall that Kermit's terminal character-set has two "ends" -- the set + used on the host to which Kermit is connected, and the set used on the + local keyboard and screen.) + + UCS-2 is not supported as a terminal character-set (either end) since + (a) it is not used that way anywhere to our knowledge, and (b) the + problems of Endianness and the high likelihood of loss of + synchronization make it impractical. (Telecommunications is + byte-oriented; if one byte, or any odd number of bytes, is lost + because of buffer overruns, circuit resets, etc (or likewise if a + burst of noise appears that takes the guise of an odd number of + bytes), the byte order of the subsequent data stream will be + backwards; unlike UTF-8 and traditional byte-based character sets, + UCS-2 is not "self synchronizing".) + + UTF-8 does not have byte-order or synchronization problems and is + growing in popularity as a terminal character set as well as in other + application areas. It allows a single terminal session to use multiple + scripts (Roman, Cyrillic, Greek, etc) without ISO 2022 character-set + switching (which terminal emulators like Kermit 95 can handle but few + host applications understand or use), and meshes nicely with the + Unicode screen fonts that are beginning to appear. + + UTF-8 was first used in Plan 9 and soon will be available in Linux. It + will probably spread from there (Unicode in some form is, of course, + also used in Windows NT, but only internally -- not for access from + outside). + + To use UTF-8 or any other character set that uses 8-bit bytes in your + terminal session, be sure to tell C-Kermit to: + + SET TERMINAL BYTESIZE 8 + SET COMMAND BYTESIZE 8 + SET PARITY NONE + + (or use the shortcut command, EIGHTBIT, which does all three at once). + + In a setup where your local Kermit program uses a single-byte + character set such as PC Code Page 850 and the remote host uses UTF-8: + + SET TERM CHAR UTF8 CP850 + + or: + + SET TERM REMOTE CHAR UTF8 + SET TERM LOCAL CHAR CP850 + + all works as expected. UTF-8 text on the remote displays correctly on + your screen, and when you type CP850 characters, they are translated + to UTF-8 sequences for transmission, and the echo from the host is + translated from UTF-8 back to CP850. Telnet negotiations and + autodownload take place before any character-set translation and work + as before. The session log (if text mode was selected for it) contains + only the local terminal character-set. And so on. + + Kermit merely supplies translations from UTF-8 to your local terminal + character-set (this includes treating UTF-8 Line Separator and + Paragraph separator as CRLF). However, Kermit does does not, at + present, perform "canonicalization" of composed sequences, nor does it + automatically execute bidirectionality algorithms for display of + mixed-direction text (e.g. Hebrew and English). Such presentation + issues, like all others in the terminal-host regime, are left to the + host. + + By the way, C-Kermit also allows UTF-8 to be the local end of the + terminal character-set, but so far this code is not tested, since we + don't have a UTF-8 console or terminal to work with. However, it can + be stated without doubt that C-Kermit's key mapping will not work for + UTF-8 values, since (a) the key map is indexed by 8-bit byte values + and (b) C-Kermit reads keystrokes a byte at a time (these comments do + not apply to K95, which has direct access to the keyboard and can read + "wide" keycodes and uses them to index a "wide" keymap). + + Restrictions: As noted, the CONNECT command does not support UCS-2 as + a REMOTE TERMINAL character-set. Neither does it support the Japanese + sets EUC-JP, JIS-7, and Shift-JIS. Support for the Japanese sets (and + possibly Chinese and Korean too) might be added in a future release. + Since the TRANSMIT command (next section) uses the same REMOTE + TERMINAL character-sets as the CONNECT command, it has the same + restrictions. + _________________________________________________________________ + + 6.6.5.4. The TRANSMIT Command + + As described in Chapter 15 of [547]Using C-Kermit and [548]Section + 4.21 of this document, the TRANSMIT command can be used to upload a + file without protocol, more or less as if you were typing it on your + keyboard while connected to the host. When TRANSMITting in text mode, + the file's character set is converted to the host's unless you have + SET TERMINAL CHARACTER-SET TRANSPARENT, or you include the new + TRANSMIT switch, /TRANSPARENT. + + Before C-Kermit 7.0, the file character-set was assumed to be the same + as the local end of the terminal character-set, and the TRANSMIT + command used the same translations as the CONNECT command, ignoring + the file character-set. + + In C-Kermit 7.0, that assumption (a poor one to begin with) can no + longer be made, since UCS-2 can be a file character-set but not a + terminal character-set. So now the file's character-set is given by + your most recent SET FILE CHARACTER-SET command. The host's character + set is the remote end of your most recent SET TERMINAL CHARACTER-SET + command: + + SET TERMINAL CHARACTER-SET remote-set [ local-set ] + + or: + + SET TERMINAL REMOTE-CHARACTER-SET remote-set + + The TRANSMIT command converts each source-file character from the FILE + character-set to the REMOTE TERMINAL character-set, and then transmits + the translated characters according to your SET TRANSMIT preferences + (Chapter 15). + + If you have SET TRANSMIT ECHO ON, and the host is echoing the + transmitted characters, the echos are converted from the remote + terminal character-set to the local terminal character-set. + + [ A picture would help... ] + + Confused? Let's work through an example. Suppose your local computer + is a NeXTstation, on which text files are encoded in the NeXT + character set, and that the remote computer is a Data General AViiON, + which uses the Data General International character set. Further + suppose that you are logged in to the NeXT from a VT220 terminal which + uses the DEC Multinational character set. + + You need to convert the file from NeXT encoding to DG encoding and + convert the echoes from DG encoding to DEC encoding. So on the NeXT, + tell C-Kermit to: + + eightbit + set file character-set next + set term character-set dg-international dec-mcs + transmit /text nextdata.txt + + (This assumes you have some sort of collection process already set up + on the Data General, such as a text editor or the venerable "cat > + foo". The EIGHTBIT command is equivalent to SET TERMINAL BYTESIZE 8, + SET COMMAND BYTESIZE 8, SET PARITY NONE.) + + To further complicate matters, suppose your local terminal character + set is the same as the remote one, so you don't need terminal + character-set translation, but you need to TRANSMIT a file that is in + a different character set and you want it translated to the host set. + In this case, use SET TERM CHARACTER-SET to actually specify the + character set used on each end, rather than specifying TRANSPARENT: + + eightbit + set file character-set ucs2 + set term character-set latin1 latin1 + transmit /text ucs2data.txt + + The distinction between: + + SET TERMINAL CHARACTER-SET xxx yyy + + (where xxx and yyy are the same set) and: + + SET TERMINAL CHARACTER-SET TRANSPARENT + + is new to C-Kermit 7.0, but affects only the TRANSMIT command. + + The TRANSMIT command currently does nothing special with UCS-2/UTF-8 + Line and Paragraph Separator characters; more experience is required + to find out how these behave in a genuine Unicode terminal-host + setting. + + Restrictions: As noted, the TRANSMIT command translates from the FILE + character-set to the REMOTE TERMINAL character-set. This rules out + translations to any character set that is not supported as a REMOTE + TERMINAL character-set, such as UCS-2, EUC-JP, JIS-7, and Shift-JIS. + _________________________________________________________________ + + 6.6.5.5. Summary of Kermit Unicode Commands + + Specifying file character-set and byte order: + SET FILE CHARACTER-SET { ..., UCS2, UTF8 } + REMOTE SET FILE CHARACTER-SET { ..., UCS2, UTF8 } (See next + section) + SET FILE UCS BOM { ON, OFF } + SET FILE UCS BYTE-ORDER { BIG-ENDIAN, LITTLE-ENDIAN } + + Specifying the transfer character-set: + SET TRANSFER CHARACTER-SET { ..., UCS-2, UTF-8 } + REMOTE SET TRANSFER CHARACTER-SET { ..., UCS-2, UTF-8 } + + Specifying the terminal character-set: + SET TERMINAL CHARACTER-SET { ..., UTF8 } { ..., UTF8 } + SET TERMINAL REMOTE-CHARACTER-SET { ..., UTF8 } + SET TERMINAL LOCAL-CHARACTER-SET { ..., UTF8 } + + Displaying settings: + SHOW FILE + SHOW TRANSFER + SHOW TERMINAL + SHOW CHARACTER-SETS + + Commands that use these settings include: + SEND, RECEIVE, GET, etc. + CONNECT + TRANSMIT + LOG SESSION + + Converting files: + TRANSLATE infile { ..., UCS-2, UTF-8 } { ..., UCS-2, UTF-8 } + outfile + COPY /SWAP-BYTES infile outfile + _________________________________________________________________ + + 6.7. Client/Server Character-Set Switching + + A simple mechanism has been added to allow the client to change the + server's FILE CHARACTER-SET: + + REMOTE SET FILE CHARACTER-SET name + The client asks the server to change its file character-set to + the one given. The name must match one of the server's file + character-set names. For convenience, C-Kermit uses its own + file character-set keyword list for parsing this command so you + can use ? for help and Tab or Esc for completion. However, + since the server might have a different repertoire (or even use + different names for the same sets), C-Kermit accepts any string + you supply and sends it to the server. The server, if it + supports this command (C-Kermit 7.0 and K95 1.1.19 do), sets + its file character-set as requested, and also disables + automatic character-set switching ([549]Section 6.5). If the + server does not support this command or if it does not support + the given character set, the REMOTE SET FILE CHARACTER-SET + command fails. + + Here's an example that sends a Japanese text file encoded in Shift-JIS + to a server using every combination of Kermit's Japanese-capable file + and transfer character sets: + + dcl \&x[] = euc ucs2 utf8 ; transfer character-sets + dcl \&y[] = eu uc ut ; 2-letter abbreviations for them + dcl \&f[] = shift euc jis7 ucs2 utf8 ; file character-sets + dcl \&g[] = sj eu j7 uc ut ; 2-letter abbreviations + + set file char shift-jis ; local file character-set is Shift-JIS + for \%i 1 \fdim(&x) 1 { ; for each transfer character-set... + set xfer char \&x[\%i] ; set it + for \%j 1 \fdim(&f) 1 { ; for each remote file character-set... + remote set file char \&f[\%j] ; set it + if fail exit 1 SERVER REJECTED CHARSET + send /text meibo-sj.html meibo-sj-\&y[\%i]-\&g[\%j].txt ; send the fi +le + if fail exit 1 TRANSFER FAILED + } + } + + The Kermit-370 server does not support REMOTE SET FILE CHARACTER-SET, + but since it supports REMOTE KERMIT commands, you can get the same + effect with REMOTE KERMIT SET FILE CHARACTER-SET name. + _________________________________________________________________ + + 7. SCRIPT PROGRAMMING + + (Also see [550]Section 2.8, Scripting Local Programs.) + + 7.0. Bug Fixes + + The following script programming bugs were fixed in C-Kermit 7.0: + + * IF EXIST and IF DIRECTORY were fixed to properly strip braces from + around their arguments, so "if directory {C:\Program Files}", etc, + would work as expected. However, this means that if the file or + directory name is actually enclosed in braces, the braces must be + doubled. + * The READ command did not fail if the READ file wasn't open; now it + does. + * The READ command refused to read the last or only line of a file + if it did not end with a proper line terminator; now it does. + * The END command, when given from within a SWITCH statement, did + not exit from the current macro or command file; instead it just + terminated the SWITCH. + _________________________________________________________________ + + 7.1. The INPUT Command + + 7.1.1. INPUT Timeouts + + The description of the INPUT command on page 422 fails to mention the + following two points about the timeout (which apply to C-Kermit 6.0 + and later): + + 1. "INPUT -1 text" (or "INPUT \%x text", where \%x is any variable + whose value is -1 or less) means "wait forever". This form of the + INPUT command fails only if it is interrupted, since it will never + time out. + 2. INPUT 0 performs a nonblocking read of material that has already + arrived but has not yet been read, and succeeds immediately if the + target string is found, or fails immediately if it is not found. + + The same points apply to MINPUT. REINPUT ignores its timeout + parameter. + _________________________________________________________________ + + 7.1.2. New INPUT Controls + + The following new INPUT controls were added in version 7.0: + + SET INPUT AUTODOWNLOAD { ON, OFF } + Explained in [551]Section 7.7. + + SET INPUT CANCELLATION { ON, OFF } + This governs whether an INPUT command can be canceled by + "pressing any key" on the keyboard. Normally it can be, in + which case the INPUT command fails immediately and \v(instatus) + is set to 2, indicating interruption. SET INPUT CANCELLATION + OFF disables keyboard cancellations; thus if the search text is + not encountered, the INPUT command will run for its entire + timeout interval. SET INPUT CANCELLATION OFF does not disable + interruption by Ctrl-C, however; every command needs an + emergency exit. (If you really want to disable interruption by + Ctrl-C, use SET COMMAND INTERRUPTION OFF.) + + Also see [552]Section 7.2 for any new variables related to INPUT. + _________________________________________________________________ + + 7.1.3. INPUT with Pattern Matching + + C-Kermit 7.0 allows INPUT, MINPUT, and REINPUT targets to be a pattern + (explained in [553]Sections 1.19 and [554]4.9). This solves a + long-standing problem illustrated by the following scenario: a certain + company has a bank of TCP/IP modem servers, with hostnames server1, + server2, server3, and so on. Each server's prompt is its name, + followed by a colon (:), for example "Server72:". Without INPUT + patterns, it would be rather difficult to wait for the prompt. The + brute force approach: + + minput 20 Server1: Server2: Server3: ... (enumerating each one) + + is subject to failure whenever a new server is added. A more subtle + approach: + + input 20 Server + if fail ... + input 2 : + + is liable to false positives, e.g. "Welcome to the XYZ Corp Modem + Server. Please read the following message:"... + + With patterns, you can match the prompt with "Server*:" (which doesn't + solve the "false positives" problem, but certainly is more compact + than the brute force method), or with more specific patterns such as + "Server[1-9]:" and "Server[1-9][0-9]:", or equivalently: + + Server{[1-9],[1-9][0-9]}: + + meaning the word "Server" followed by a single digit (1-9) or by two + digits representing a number from 1 to 99, followed by a colon. + + INPUT pattern matching has been added in a way that does not interfere + with existing scripts. No new commands or switches are used. The + simple rule is: if an INPUT search target is the argument of the (new) + \fpattern() function, it is a pattern. Otherwise it is taken + literally, as before. For example: + + input 5 a*b + + searches for an 'a' followed by an asterisk ('*'), followed by a 'b'. + But: + + input 5 \fpattern(a*b) + + searches for an 'a' followed by anything at all up to and including + the first 'b'. This means that any search target to INPUT, MINPUT, or + REINPUT can be a pattern or a literal string, and in particular that + MINPUT can accommodate any mixture of patterns and literal strings. + + In selecting patterns, note that: + + * A leading '*' is always implied so there is no need to include + one. + * A trailing '*' is meaningless and ignored. + * A '*' by itself matches the first character that arrives. + + A syntax note: If your pattern is a selection list, meaning a list of + alternatives separated by commas and enclosed in braces, then the + outer braces will be stripped by various levels of parsers, so you + must include three of each: + + input 10 \fpattern({{{abc,mno,xyz}}}) + + Note that this is equivalent to: + + minput 10 abc mno xyz + + except for the setting of the \v(minput) variable. + + And a caution: INPUT pattern matching has a limitation that you + probably never noticed with literal-string matching, namely that there + is a limit on the size of the match. For example, if the pattern is + "a*b", the match will succeed if the 'a' and 'b' are not separated by + more than (say) 8K bytes, but will fail if they are farther apart than + that. In such cases, it better to use two INPUTs (e.g. "input 10 a" + and then "input 100 b"). + _________________________________________________________________ + + 7.1.4. The INPUT Match Result + + The result of any INPUT, MINPUT, or REINPUT command, no matter whether + the search targets are patterns or literal strings, is available in + the new \v(inmatch) variable. For example: + + minput 10 cat \fpattern([dh]og) + if success echo MINPUT matched "\v(inmatch)" + + This is especially useful when a pattern was matched, since it makes + the string that matched the pattern available to Kermit; there would + be no way to get it otherwise. + + After an INPUT command, you can view all the INPUT-related variables + by typing "show variables in" (abbreviate as "sho var in"), which + shows the values of all built-in variables whose names start with + "in". + _________________________________________________________________ + + 7.2. New or Improved Built-In Variables + + \v(blockcheck) + Current BLOCK-CHECK setting, 1, 2, 3, or 4. 4 is the code for + BLANK-FREE-2. + + \v(byteorder) + The machine's byte order: 0 = Big Endian, 1 = Little Endian. + + \v(cmdbufsize) + The length of the command buffer, which is the maximum size for + a macro, a command, a variable, or anything else in C-Kermit's + script language. + + \v(ctty) + The device name of C-Kermit's controlling (login) terminal. + + \v(filename) + Described in [555]Sections 4.1 and [556]4.2. + + \v(filenumber) + Described in [557]Sections 4.1 and [558]4.2. + + \v(filespec) + As of C-Kermit 7.0, contains fully qualified filenames rather + than (usually) relative ones. + + \v(return) + Now holds the END n value of the macro that most recently + returned, in case END was used rather than RETURN. + + \v(editor) + Pathname of preferred text editor + + \v(editopts) + Command-line options for editor + + \v(editfile) + File most recently edited + + \v(browser) + Pathname of preferred Web browser + + \v(browsopts) + Command-line options for Web browser + + \v(browsurl) + URL most recently given to Web browser + + \v(dialtype) + Type of call most recently placed (see [559]Section 2.1.11). + + \v(kbchar) + The character, if any, that was typed at the keyboard to to + interrupt the most recent PAUSE, SLEEP, WAIT, MSLEEP, or INPUT + command; empty if the most recent such command was not + interrupted from the keyboard. + + \v(lockdir) + UNIX only - The name of the UUCP lockfile directory, if known, + otherwise "(unknown)". + + \v(lockpid) + UNIX only - PID of process that owns the communication port + that you tried to open with a SET LINE command that failed + because the port was in use, otherwise empty. This variable is + set with every SET LINE command. + + \v(cx_time) + If no connection (SET HOST, SET LINE, DIAL, TELNET, etc) is + active, this is 0. If a connection is active, this is the + number of seconds since the connection was made. + + \v(hwparity) + If hardware parity is in effect, this variable gives its value, + such as "even" or "odd" (in which case, the \v(parity) variable + will be "none"). Otherwise this variable is empty. + + \v(serial) + Current serial port settings in 8N1 format ([560]Section 2.10). + + \v(errno) + In UNIX, the current value of the C runtime errno variable, + which is quite volatile (meaning that often an "interesting" + error code can be overwritten by some other library call or + system service that sets errno before you have a chance to look + at it). In VMS, the error code returned by the system or + library call that most recently failed (success codes are not + saved). Not available in other operating systems. + + \v(errstring) + The UNIX or VMS system error message that corresponds to + \v(errno). Not available in all OS's. Also see + [561]\ferrstring(). + + \v(setlinemsg) + The error message, if any, from the most recent SET LINE, SET + PORT, SET HOST, TELNET, or other connection-making command. + This is not necessarily the same as \v(errstring) since these + commands might fail without generating a system error code, for + example (in UNIX) because a lockfile existed indicating the + device was assigned by another user. + + \v(exitstatus) + The exit status C-Kermit would return if it exited now. + + \v(pexitstat) + The exit status of the inferior process most recently invoked + by C-Kermit (by RUN, !, REDIRECT, SEND /COMMAND, etc). In VMS, + this code can be given to \ferrstring() to get the + corresponding error message (in UNIX, program/command return + codes are not the same as system error codes). Not available in + operating systems other than UNIX and VMS. See [562]Section + 4.2.5 for details. + + \v(inmatch) + The incoming string of characters, if any, that matched the + most recent INPUT, REINPUT, or MINPUT command. + + \v(intime) + The number of milliseconds (thousandths of seconds) it took for + the most recent INPUT command to find its match, or -1 if no + INPUT command has been given yet. If the INPUT command timed + out, the value is approximately equal to 1000 times the INPUT + timeout. If INPUT failed for some other reason, the value is + undefined (\v(instatus) gives INPUT completion status). If your + version of C-Kermit is built without high-precision + floating-point timers, this number will always be a multiple of + 1000. + + \v(inwait) + The number of seconds specified as the timeout in the most + recent INPUT command. + + \v(dialsuffix) + Dialing suffix for use during PDIAL sequence; see [563]Section + 2.1.10. + + \v(pid) + UNIX, VMS, and K95 only. C-Kermit's primary process ID, + numeric, decimal. If you want to show it in hex, use + \fn2hex(\v(pid)) If you want to show it in octal, use + \fn2octal(\v(pid)). + + \v(printer) + Current printer name or SET PRINTER value. + + \v(p_ctl) + Control prefix char \v(p_8bit) 8-bit prefix char (if parity not + none) + + \v(p_rpt) + Repeat prefix char (if repeat compression enabled) + + \v(herald) + Kermit's version herald + + \v(test) + Kermit's test version, if any, or 0 if this is not a test + version. Typical values for test versions are "Alpha.03" or + "Beta.14". + + \v(sendlist) + The number of entries in the SEND-LIST, 0 if none. Note: + entries do not necessarily correspond to files, since an entry + might contain wildcards. Also note that the value does not go + back to 0 after the files in the list are sent. To reset this + variable, use CLEAR SEND-LIST. The purpose of this variable is + to determine if a SEND command, when given without any + filenames, will be legal. Example: + + xif \v(sendlist) { send } else { send oofa.txt } + + \v(trigger) + If the most recent CONNECT session was terminated automatically + by a trigger, this variable contains the trigger value. + + \v(ty_ln) + TYPE line number (during TYPE) + + \v(ty_lc) + TYPE line count (after TYPE) + + \v(ty_mc) + TYPE match count (after TYPE) + + \v(xferstat) + Status of most recent file transfer: + +-1: No transfer yet + 0: Succeeded + 1: Failed + + \v(xfermsg) + If the most recent file transfer failed, this is the reason. If + it succeeded, \v(xfermsg) is an empty string. + + \v(tftime) + Total elapsed time of most recent file transfer operation, in + seconds. + + \v(textdir) + Directory that holds (or is supposed to hold) Kermit text files + such as installation instructions, release notes, update notes, + read-me files, "beware" files, etc. + + \v(name) + The name with which the Kermit program was invoked, e.g. + "kermit", "wermit", "k95", "k2", etc (see [564]Section 9.1). + + \v(osname) + Name of operating system on computer where C-Kermit is running, + obtained at runtime (from uname or equivalent). + + \v(osversion) + Version of operating system on computer where C-Kermit is + running, obtained at runtime (from uname or equivalent). + + \v(osrelease) + Release of operating system on computer where C-Kermit is + running, obtained at runtime (from uname or equivalent). + + \v(model) + The specific hardware model of the computer where C-Kermit is + running, if known. + + \v(math_pi) + The value of Pi (see [565]Section 7.23) + + \v(math_e) + The value of e (see [566]Section 7.23) + + \v(math_precision) + How many significant digits in a floating-point number. + + \v(f_count) + Result of the most recent FILE COUNT (FCOUNT) command. + + \v(f_error) + Numeric error code of most recent FILE command. + + \v(f_max) + Maximum number of files open simultaneously. + + The math constants are given in the precision of underlying computer's + floating-point arithmetic. + + Note the distinction between \v(osname), \v(osversion), and + \v(platform); the latter refers to the platform for which and/or upon + which C-Kermit was built, as opposed to the one on which it is + actually running. Also note that each operating system can, and + probably will, interpret and fill in the os* variables differently, or + not at all. + + The SHOW VARIABLES command now accepts a variable name, prefix, or + pattern: + + show variables Shows all variables. + show variables t Shows all variables that start with "t". + show variables *ver* Shows all variables whose names contain "ver". + show variables *ver Ditto (an implied "*" is appended). + _________________________________________________________________ + + 7.3. New or Improved Built-In Functions + + The following new file-i/o functions are explained in [567]Section + 1.22. + + \f_status(channel) Status of file open on channel + \f_pos(channel) Read/write (byte) pointer of given file + \f_line(channel) Current line of file + \f_handle(channel) Handle of file + \f_eof(channel) Whether given file is at EOF + \f_getchar(channel) Read a char from given file + \f_getline(channel) Read a line from given file + \f_getblock(channel,n) Read a block from given file + \f_putchar(channel,c) Write a char to given file + \f_putline(channel,string) Write a line to given file + \f_putblock(channel,string) Write a block to given file + + The following new date-time-related functions are explained in + [568]Section 1.6: + + \fday() Returns day of week of given date + \fnday() Returns numeric day of week of given date + \ftime() Returns time portion of given date-time + \fntime() Converts time to seconds since midnight + \fn2time() Converts seconds since midnight to hh:mm:ss + \fcvtdate(date-time) Converts free-format date to yyyymmdd hh:mm:ss + \fdayofyear(date-time) Converts date to yyyyddd (day-of-year) format + \fdoy(date-time) Synonym for \fdayofyear() + \fdoy2date(dayofyear) Converts yyyyddd to yyyymmdd + \fmjd(date-time) Converts free-format date to Modified Julian Date + \fmjd2date(mjd) Converts modified Julian date to yyyymmdd + + The new floating-point arithmetic functions are explained in + [569]Section 7.23. f1 and f2 are floating-point (real) numbers; d is + the number of decimal places to show: + + \ffpabsolute(f1,d) Absolute value of f1 + \ffpadd(f1,f2,d) f1 + f1 + \ffpcosine(f1,d) Cosine of f1 + \ffpdivide(f1,f2,d) f1 divided by f2 + \ffpexp(f1,d) e to the f1 power + \ffpint(f1) Integer part of f1 + \ffplog10(f1,d) Log base 10 of f1 + \ffplogn(f1,d) Natural log of f1 + \ffpmaximum(f1,f2,d) Maximum of f1 and f2 + \ffpminimum(f1,f2,d) Minimum of f1 and f2 + \ffpmodulus(f1,f2,d) Modulus of f1 and f2 + \ffpmultiply(f1,f2,d) Product of f1 and f2 + \ffpraise(f1,f2,d) Raise f1 to power f2 + \ffpround(f1,d) Round f1 to d places + \ffpsine(f1,d) Sine of f1 + \ffpsqrt(f1,d) Square root of f1 + \ffpsubtract(f1,f2,d) f2 - f1 + \ffptangent(f1,d) Tangent of f1 + + Integer number functions: + + \fabsolute(n) + Absolute value of integer n. + + \frandom(n) + Returns a random integer between 0 and n-1. + + \fradix(s,n1,n2) + If the string s is an integer in radix n1, the result is the + same number expressed in radix n2, where n1 and n2 may be any + number from 2 through 36, expressed as decimal numbers, or + variables (etc) that evaluate to decimal numbers. For the + source and result, the digits of any radix, r, are the first r + characters in the sequence 0-9,a-z (case doesn't matter for the + letters). The string s may have a sign, + or -; if it starts + with a minus (-) sign, the result also has a minus sign. + + The \fradix() function does not work with floating-point numbers. It + does not reveal the internal storage format of a number; for example, + \fradix(-1,10,16) is -1, not something like FFFFFFFFFF. If all three + arguments are not given, or if n1 or n2 are not numbers between 2 and + 36 inclusive, or s is not a number in radix n1, an error occurs and + the empty string is returned. \fradix() also does not offer + extended-precision arithmetic; number values are limited to those + expressed as a long integer in the architecture of the underlying + computer, usually 32 or 64 bits. If you give it an argument whose + absolute value is larger than can be held in an unsigned long, the + result is -1. + + The next four are shorthand functions for decimal/hexadecimal and + decimal/octal number conversion: + + \fn2hex(n) + Returns the hexadecimal (base 16) representation of the integer + n. This is different from \fhexify(s), which treats its + argument as a string rather than a number. The result is always + left-padded with 0's to make its length even. Examples: + + \n2hex(0) = "00" \fhexify(0) = "30" + \n2hex(255) = "ff" \fhexify(255) = "323535" + \n2hex(256) = "0100" \fhexify(256) = "323536" + + \fhex2n(x) + Converts hexadecimal number x to decimal equivalent decimal + number. This is the inverse of \fn2hex(). Equivalent to + \fradix(s,16,10). + + \fn2octal(n) + Returns the octal (base 8) representation of the number n. + Examples: + + \n2octal(0) = "0" + \n2oct(255) = "377" + \n2oct(256) = "400" + Equivalent to \fradix(n,10,8). + + \foct2n(n) + Returns the decimal representation of the given octal number, + n. The inverse of \fn2octal(). Equivalent to \fradix(n,8,10). + + String functions: + + \s(name[n:m]) + Equivalent to \fsubstring(\m(name),n,m) ([570]Section 7.24). + + \:(name[n:m]) + Equivalent to \fsubstring(name,n,m) (where "name" is any + \-quantity) ([571]Section 7.24). + + \fleft(s,n) + The leftmost ncharacters of string s; equivalent to + \fsubstring(s,1,n). + + \fstripx(string,char) + Returns the part of the string up to the rightmost occurrence, + if any, of the given character. The default character is period + (.) Examples: + + \fstripx(foo/bar,/) = "foo" + \fstripx(foo/bar/baz,/) = "foo/bar" + \fstripx(autoexec.bat,.) = "autoexec" + \fstripx(autoexec.bat) = "autoexec" + \fstripx(fstripx(foo/bar/baz,/),/) = "foo" + + \flop(string,character) + Returns the portion of the string starting after the first + occurrence of the given character. The default character is + period (.) Examples: + + \flop(autoexec.bat) = "bat" + \flop(baz.foo/bar) = "foo/bar" + \flop(baz.foo/bar,/) = "bar + + \fstripn(string,n) + Returns the string with ncharacters removed from the end. + Example: + + \fstripn(12345678,3) = "12345" + + (For more discussion of \fstripx(), \fstripn(), and \flop() see + [572]Section 4.2.3). + + \fb64encode(s) + Returns the Base-64 encoding of the string s. + + \fb64decode(s) + Returns the decoding of the Base-64 string s. Fails if s is not + a Base-64 string, or if its length is not a multiple of 4. Note + that if any of the result bytes are null (0), the result string + stops there. There is no way to represent strings that contain + null bytes in C-Kermit (the same is true for \funhexify()). + + \fword(s1,n,s2,s3) + Extracts word number nfrom string s1. By default, a "word" is + any sequence of ASCII letters or digits; nis 1-based. If nis + omitted, "1" is used. Examples: + + \fword(one two three) = "one" + \fword(one two three,1) = "one" + \fword(one two three,2) = "two" + \fword(one two three,3) = "three" + + and: + + \fword(\v(dialresult),2) = "31200" + + is "31200" if \v(dialresult) is (e.g.) "CONNECT + 31200/ARQ/V32/LAPM/V42BIS". + + If you include s2, this replaces the default break set. For + example, suppose you have a string \%a whose value is: + + $150.00 $300.00 $39.95 + + and you want each dollar amount to be a word; use: + + \fword(\%a,\%n,{ }) + + This returns dollar amount number \%n, e.g. "$300.00" for \%n = + 2. "{ }" denotes a space (you must enclose it in braces, + otherwise it is squeezed out). Note that ASCII control + characters are always included in the break set; you don't have + to specify them (and you can't not specify them). + + The optional s3 argument lists characters (even control + characters) that normally would be considered separators that + you want included in words. So the dollars-and-cents example + could also be handled this way: + + \fword(\%a,\%n,,$.) + + in other words, use the default separator list, but remove "$" + and "." from it so they will be considered part of a word. + + \fsplit(s1,&a,s2,s3) + This is like \fword(), except instead of extracting and + returning a particular word from string s1, it counts the words + and optionally assigns them to the array whose identifying + letter, a-z, is given after the "&" in the second argument, + with the first word going into element 1, the second into + element 2, and so on. The rules regarding break and include + lists (s2 and s3) are exactly the same as for \fword(). + \fsplit() returns the number of words that were assigned, which + is either the number of words in the string, or the dimension + of the array, whichever is less. If the array is not declared, + \fsplit() creates it and returns a number which is both the + number of words in s1 and the dimension of the new array. + Examples: + + declare \&w[20] ; (Optional.) + ... + read \%s ; \%s is "This is a sentence with seven words." + ... + echo "\fsplit(\%s)" ; This would print "7". + echo "\fsplit(\%s,&w)" ; Ditto, and also assigns them to array \&w[]. + + echo "\&w[7]" ; This would print "words". + + If the line contained fields that were delimited by colon (:), + you would use \fsplit(\%s,&w,:). If the fields were delimited + by comma, then you would use \fsplit(\%s,&w,{,}); in this case + the literal comma must be enclosed in braces to distinguish it + from the comma that separates function arguments. To get a word + count without loading an array, but still specify break and/or + include lists, leave the array argument empty: + + echo "\fsplit(\%s,,:)" ; Use colon as the separator. + + WARNINGS: + + 1. If you use the same array repeatedly, \fsplit() leaves any + trailing members undisturbed. For example: + dcl \&w[10] + \fsplit(1 2 3 4 5,&w) ; Sets \&w[1] thru \&w[5]. + \fsplit(a b c,&w) ; Sets \&w[1]-[3] leaving [4]-[5] as they were. + 2. If you allow \fsplit to create the array (by not declaring it + first), it is dimensioned to the number of elements it was + created with: + \fsplit(1 2 3,&x) ; Creates an array \&x[] with 3 elements. + \fsplit(a b c d e,&x) ; This overflows the array. + + Thus if you want to use \fsplit() repeatedly on the same array, + either dimension it in advance to the maximum expected size + (and then some -- more efficient), or else destroy it after + each use (to allow for unexpectedly large arguments). Example + using a dynamic array: + + fopen /read \%c some-file + if fail ... + set function error on ; See [573]Section 7.12 + while true { + dcl \&w[] ; Destroy \&[w] each time thru the loop + fread /line \%c \%a + if fail break + asg \%x \fsplit(\%a,&w) + if fail ... + ; (do what you want with \&w[] here...) + } + fclose \%c + + \frindex(s1,s2,n) + The "n" argument to \frindex() now works consistently (in + mirror image) with the corresponding \findex() argument. In + each case, the (n-1)-most characters of s2 are ignored in the + search; for findex, this means the starting position of the + search is n (the default nis 1, and 0 is treated like 1). For + \frindex() it means the default starting point is: + + length(s2) - length(s1) - n (with the same defaults for n). + + \fsearch(pattern,string[,position]) + Exactly like \findex(), except with a pattern (see [574]Section + 7.9) rather than a literal string. + + \frsearch(pattern,string[,position]) + Exactly like \frindex(), except with a pattern rather than a + literal string. + + File Functions: + + \ffiles(), \fnextfile() + It is no longer necessary to copy the file list to an array + before use, as shown on p.398 of [575]Using C-Kermit 2nd + Edition. \ffiles() and friends now make their own safe copies + of the file list. Thus constructions like the following are now + possible: + + for \%i 1 \ffiles(*.txt) 1 { send \fnextfile() } + + The same is true for the new function \frfiles(), + \fdirectories(), and \frdirectories(), described in + [576]Section 4.11.3. + + But note that each reference to \fnextfile() still gets you the + next file. So "if newer \fnextfile() foo.txt send \fnextfile()" + compares one file's age with that of foo.txt, and then sends an + entirely different file. If you're going to refer to the same + file more than once, assign it to a variable: + + asg \%f \fnextfile() + if newer \%f foo.txt send \%f + + (note: assign, not define). + + Also note that \ffiles(), \frfiles(), \fdirectories(), and + \frdirectories() all now accept on optional 2nd argument: the + name of an array to load with the resulting file or directory + list, explained in [577]Section 4.11.3. So you can also load an + array with the filelist when you need to refer to the same file + more than once: + + for \%i 1 \ffiles(*,&a) 1 { if newer \&a[\%i] foo.txt send \&a[\%i] } + + \fpermissions(file) + Returns the platform-specific permissions string for the file, + such as "-rw-rw-r--" in UNIX or "(RWE,RWE,RE,E)" in VMS. + + \fdirname(f) + Given a file specification f, this function returns the + complete pathname of directory the file is in. + + Array Functions: + + \fdimension(&a) + Returns the dimension declared for the array whose identifying + letter, a-z, or special character "_" or "@", is given after + the "&" in the argument. If the array is not declared, 0 is + returned. Note that when used with the macro argument vector + array, \&_[] (see [578]Section 7.5), the value of this function + is one less than \v(argc), and when used with the C-Kermit + command-line argument vector array, \&@[], it is equal to the + \v(args) variable. Examples: + + echo \fdimension(&a) ; Not declared. + 0 + declare \&a[12] ; Now it's declared. + echo \fdim(&a) + 12 + + \farraylook(pattern,arrayname) + Looks in the given array for the pattern and returns the index + of the first element that matches, if any, or -1 if none match. + The arrayname can include a range specifier to restrict to + search to a segment of the array, e.g. + \farraylook(*xyz*,&a[32:63]). For greater detail see + [579]Section 7.10.7. + + \ftablelook(keyword,arrayname[,delimiter]) + Looks in the given "table", which must be sorted, for the given + keyword. Returns the index of the table element that uniquely + matches the given keyword, or -1 if none match, or -2 if more + than 1 match. For greater detail see [580]Section 7.10.7. + + Other new functions: + + \fip2hex(s) + Converts a dotted decimal IP address to an 8-digit hexadecimal + number. \fip2hex(128.59.39.2) = 803b2702. + + \fhex2ip(x) + Converts an 8-digit hexadecimal IP address to dotted decimal + form, e.g. \fhex2ip(803b2702) = 128.59.39.2. The inverse of + \fip2hex(). + + \fcommand() + \frawcommand() + These run an external command and return its output; see + [581]Section 4.2.8.4. + + \fdialconvert(s) + s is a phone number in either literal or portable format (not a + dialing directory entry name). The function returns the dial + string that would actually be used when dialing from the + current location (after processing country code, area code, and + other SET DIAL values). + + \ferrstring(n) + Returns the system error message associated with the (numeric) + error code n. UNIX and VMS only. Use in conjunction with + \v(errno) or \v(pexitstat). See [582]Section 4.2.5 for a usage + example. Note: This function doesn't work in Windows because + there is not a consistent error-code-to-message mapping; error + code "x" means something completely different depending on + whether it comes from the C runtime library, Winsock, a + Windows-32 API, TAPI, etc, + + \fpattern(s) + Used in INPUT, REINPUT, and MINPUT commands to denote search + strings that are to be treated as patterns rather than + literally. + + Also see [583]Section 7.8 on built-in help for functions. + _________________________________________________________________ + + 7.4. New IF Conditions + + IF AVAILABLE feature command + Executes the command if the given feature is available. + Presently used only to determine if specific authentication and + encryption options are available. Type "if available ?" to see + which features may be tested. + + IF FLOAT f1 command + Executes command if f1 is a legal floating point number (which + includes integers). Use this to preverify arguments for the + \ffp...() floating-point arithmetic functions, e.g. "if float + \%1 echo \ffpint(\%1)". + + IF == n1 n2 command + Synonym for "if =" (numeric equality). Note that as of C-Kermit + 7.0, this and all other numeric comparison operators also work + for floating-point numbers. + + IF != n1 n2 command + Executes the command if n1 and n2 are both numbers or variables + containing numbers and the value of n1 is not equal to the + value of n2. This is equivalent to "if not = n1 n2". + + IF <= n1 n2 command + Executes the command if n1 and n2 are both numbers or variables + containing numbers and the value of n1 is less than or equal to + the value of n2. This is equivalent to "if not > n1 n2". + + IF >= n1 n2 command + Executes the command if n1 and n2 are both numbers or variables + containing numbers and the value of n1 is greater than or equal + to the value of n2. Equivalent to "if not < n1 n2". + + IF COMMAND word command + Executes the command if word is a built-in C-Kermit command. + Example: + + if not command copy define { copy run copy \%1 \%2 }". + + This defines a COPY macro that runs an external COPY command if + COPY is not already a built-in command. + + IF LOCAL command + Executes the command if Kermit is in local mode, i.e. if it has + a SET LINE, SET PORT, or SET HOST (TELNET, RLOGIN, etc) device + or connection open. Does not execute the command if in remote + mode. + + IF MATCH string pattern command + Executes the command if the string matches the pattern. For a + description of the syntax for the pattern, see [584]Section + 4.9.1. If you want to test if the string contains pattern, use + IF \fsearch(pattern,string). + + IF OPEN { DEBUG-LOG, SESSION-LOG, TRANSACTION-LOG, ... } command + Executes the command if the given file is open, fails if it is + not open. Type IF OPEN ? for a complete list of files that can + be checked (all the files that can be opened with the OPEN or + LOG commands). + + IF QUIET command + Executes the command if SET QUIET is ON, and does not execute + it if SET QUIET is OFF. Example: IF NOT QUIET ECHO { This is a + message.}. + + IF READABLE name + Succeeds if name is the name of an existing file or directory + that is readable. + + IF WRITEABLE name + Succeeds if name is the name of an existing file or directory + that is writeable, e.g.: + + if not writeable \v(lockdir) echo Please read installation instructions! + + IF FLAG command + This tests a user-settable condition, which can mean anything + you like. SET FLAG ON causes subsequent IF FLAG commands to + succeed; SET FLAG OFF causes them to fail. One way to use it + would be for debugging your scripts; precede any debugging + statements with IF FLAG. Then SET FLAG on to debug your script, + SET FLAG OFF to run it without debugging. Another common use is + for causing an inner loop to cause an outer loop to exit. + + IF C-KERMIT command + C-Kermit, but not Kermit 95 or MS-DOS Kermit, executes the + command. + + IF K-95 command + Kermit 95, but not C-Kermit or MS-DOS Kermit, executes the + command. + + IF MS-KERMIT command + MS-DOS Kermit, but not C-Kermit or Kermit 95, executes the + command. + _________________________________________________________________ + + 7.5. Using More than Ten Macro Arguments + + The \v(argc) variable now gives the actual number of arguments, even + if the number is greater than 9: + + C-Kermit> define xx echo \v(argc) + C-Kermit> xx a b c d e f g h i j k l m n o p q r s t u v w x y z + 27 + + Remember that \v(argc) includes the name of the macro itself, so it is + always at least 1, and is always 1 greater than the actual number of + arguments. As in versions 6.0 and earlier, if more than 9 arguments + are given, only the first nine are assigned to the variables \%1..\%9. + + The \&_[] array, discussed on page 353 of [585]Using C-Kermit, 2nd ed, + now holds all the arguments, up to some implementation-dependent limit + (64 or greater), rather than only the first 9. To illustrate: the + following macro tells the number of arguments it was called with and + then prints them: + + define show_all_args { + local \%i + echo \&_[0] - Number of arguments: \feval(\v(argc)-1) + for \%i 1 \v(argc)-1 1 { echo \flpad(\%i,3). "\&_[\%i]" } + } + + Within a macro \&_[0], like \%0, contains the name of the macro. + + At top level, the \&_[] array is filled as follows: + + * If the first argument on the C-Kermit command line was a filename, + or C-Kermit was invoked from a "Kerbang" script ([586]Section + 7.19), element 0 contains the filename, and elements 1 through + \v(argc)-1 hold the remaining command-line arguments. + * Otherwise the program name goes in element 0, and elements 1 + through \v(argc)-1 hold any arguments that were included after + "--" or "=" + + The new \%* variable, when used within a macro, is replaced by the + text that followed the macro name in the macro invocation. If no + arguments were given, \%* is replaced by the empty string. Examples: + + C-Kermit> define xx echo [\%*] + C-Kermit> define \%a oofa + C-Kermit> xx + [] + C-Kermit> xx \%a + [oofa] + C-Kermit> xx a + [a] + C-Kermit> xx a b + [a b] + C-Kermit> xx a b c + [a b c] + C-Kermit> xx a b c d e f g h i j k l m n o p q r s t u v w x y z + [a b c d e f g h i j k l m n o p q r s t u v w x y z] + + Note that \%* can not be used at top level, since Kermit does not have + access to the raw command line (only to its elements separately, after + they have been processed by the shell and the C library). + + C-Kermit 7.0 also adds a SHIFT command: + + SHIFT [ number ] + Shifts the macro arguments (except argument 0) the given number + of places to the left and adjusts \v(argc) accordingly. The + default number is 1. + + To illustrate, suppose macro XXX is invoked as follows: + + xxx arg1 arg2 arg3 + + Then inside XXX, \%1 is "arg1", \%2 is "arg2", and \%3 is "arg3". + After a SHIFT command is given inside XXX, then \%1 is "arg2", \%2 is + "arg3", and \%3 is empty. \%0 (the name of the macro) remains + unchanged. + + If more than 9 arguments were given, then arguments are shifted into + the \%1..9 variables from the argument vector array. + + At top level, the SHIFT command operates on the \&_[] array and \%1..9 + variables; the \&@[] array is not affected. See [587]Section 7.16 for + details. + + The \%* variable is not affected by the SHIFT command. + _________________________________________________________________ + + 7.6. Clarification of Function Call Syntax + + Spaces are normally stripped from the front and back of each function + argument; to prevent this enclose the argument in braces: + + \fsplit(\%a,&a,{ }) + + However, function calls that contain spaces can make trouble when the + function is to be used in a "word" field, since space separates words. + For example: + + for \%i 1 \fsplit(\%a,&a,{ }) 1 { + echo \%i. "\&a[\%i]" + } + + In most cases, the trouble can be averted by enclosing the function + reference in braces: + + for \%i 1 {\fsplit(\%a,&a,{ })} 1 { + echo \%i. "\&a[\%i]" + } + + or by replacing spaces with \32 (the ASCII code for space): + + for \%i 1 \fsplit(\%a,&a,\32) 1 { + echo \%i. "\&a[\%i]" + } + + Braces are also used in function calls to indicate grouping. For + example: + + \fsubstring(abcd,2,2) = "bc" + + But suppose "abcd" needed to contain a comma: + + \fsubstring(ab,cd,2,2) + + This would cause an error, since "cd" appears to be the second + argument, when really you want the first "2" to be the second + argument. Braces to the rescue: + + \fsubstring({ab,cd},2,2) = "b," + + Similarly, leading and trailing spaces are stripped from each + argument, so: + + \fsubstring( abcd ,2,2) = "bc" + + but braces preserve them: + + \fsubstring({ abcd },2,2) = "ab" + + Given these special uses for braces, there is no way to pass literal + braces to the function itself. For example: + + \fsubstring(ab{cd,2,2) + + causes an error. + + So if you need a function to include braces, define a variable + containing the string that has braces. Example: + + define \%a ab{cd + \fsubstring(\%a,2,2) = "b{" + + If the string is to start with a leading brace and end with a closing + brace, then double braces must appear around the string (which itself + is enclosed in braces): + + define \%a {{{foo}}} + \fsubstring(\%a) = "{foo}" + + This also works for any other kind of string: + + define \%a {{ab{cd}} + echo \fsubstring(\%a) = "ab{cd" + _________________________________________________________________ + + 7.7. Autodownload during INPUT Command Execution + + As of 6.1 / 1.1.12, C-Kermit can be told to look for incoming Kermit + (or Zmodem) packets during execution of an INPUT command. By default + (for consistency with earlier releases), this is not done. You can + enable this feature with: + + SET INPUT AUTODOWNLOAD ON + + (and disable it again with OFF.) + + One possible use for this feature is as a server mode with a time + limit: + + INPUT 3600 secret-string-to-end-the-INPUT-command + + In this example, any GET, SEND, or REMOTE commands received within one + hour (3600 seconds) of when the INPUT command was issued will be + executed. Here's another example, in which we want to stay open until + 11:30pm, or until interrupted by seven consecutive Ctrl-C (\3) + characters: + + INPUT 23:30:00 \3\3\3\3\3\3\3 + + The INPUT AUTODOWNLOAD setting is displayed by SHOW SCRIPTS or SHOW + INPUT. + _________________________________________________________________ + + 7.8. Built-in Help for Functions. + + Beginning in C-Kermit 7.0, you may obtain a description of the calling + conventions and return values of any built-in function, such as + \fsubstring(), with the new HELP FUNCTION command; give the function's + name without the leading "\f", e.g. "help func substring". You can use + ?, completion, and abbreviation in the normal manner. + _________________________________________________________________ + + 7.9. Variable Assignments + + 7.9.1. Assignment Operators + + Programmers accustomed to languages such as C or Fortran might find + Kermit's method of assigning values to variables unnatural or awkward. + Beginning in C-Kermit 7.0, you can use the following alternative + notation: + + .name = value is equivalent to DEFINE name value + .name := value is equivalent to ASSIGN name value + .name ::= value is equivalent to ASSIGN name \feval(value) + + When the command begins with a period (.), this indicates an + assignment. The name can be a macro name, a \%{digit,letter} variable, + or an array element. There can be space(s) between "." and the name. + Examples: + + .\%a = This is a string ; Same as "define \%a This is a string" + echo \%a + This is a string + + .xxx = \%a ; Same as "define xxx \%a" + echo \m(xxx) + \%a + + .xxx := \%a ; Same as "assign xxx \%a" + echo \m(xxx) + This is a string + + declare \&a[2] ; Use with arrays... + define \%i 2 + .\&a[1] = first + .\&a[\%i] = second + + The following sequence illustrates the differences among three levels + of evaluation: + + .\%x = 2 ; Define a variable to have a numeric value + .\%y = (3 + \%x) ; Define another variable as an arithmetic expression + + .xxx = 4 * \%y ; "=" simply copies the right-hand side. + echo \m(xxx) + 4 * \%y + + .xxx := 4 * \%y ; ":=" evaluates the variables first, then copies. + echo \m(xxx) + 4 * (3 + 2) + + .xxx ::= 4 * \%y ; "::=" evaluates the expression, then copies. + echo \m(xxx) + 20 + + You can also use this syntax to clear (undefine) a variable: + + .\%a = oofa ; Define the variable + echo "\%a" + "oofa" + .\%a ; Clear the variable + echo "\%a" + "" + + Extra credit: Can you guess what happens below when the file "abc" + does not exist? + + fopen /read \%c abc + if fail ... + _________________________________________________________________ + + 7.9.2. New Assignment Commands + + Recall the DEFINE and ASSIGN commands, and their hidden counterparts, + _DEFINE and _ASSIGN. The former take the variable name literally, the + latter evaluate the variable-name field to form the variable name + dynamically. Examples: + + DEFINE \%x foo ; Sets the value of the variable \%x to "foo". + DEFINE \%a \%x ; Sets the value of the variable \%a to "\%x". + _DEFINE x_\%a \%x ; Sets the value of the variable x_foo to "\%x". + ASSIGN \%a \%x ; Sets the value of the variable \%a to the "foo". + _ASSIGN x_\%a \%x ; Sets the value of the variable x_foo to "foo". + + This concept has been carried over to the remaining + variable-assignment commands: EVALUATE, INCREMENT, and DECREMENT: + + EVALUATE variablename expression + Evaluates the arithmetic expression and assigns its value to + the variable whose name is given. Example: "eval \%a 1+1" + assigns "2" to \%a. + + _EVALUATE metaname expression + Evaluates the arithmetic expression and assigns its value to + the variable whose name is computed from the given metaname. + Example: "eval foo<\%a>::\%1 \%2 * (\%3 + \%4)" assigns the + value of "\%2 * (\%3 + \%4)" to the variable whose name is + computed from "foo<\%a>::\%1". + + INCREMENT variablename [ expression ] + Evaluates the arithmetic expression and adds its value to the + value of the variable whose name is given. Example: "increment + \%a". + + _INCREMENT metaname [ expression ] + Evaluates the arithmetic expression and adds its value to the + value of the variable whose name is computed from the given + metaname. Example: "_increment Words::\%1.count[\%2]". + + DECREMENT variablename [ expression ] + Evaluates the arithmetic expression and subtracts its value + from the value of the variable whose name is given. + + _DECREMENT metaname [ expression ] + Evaluates the arithmetic expression and subtracts its value + from the value of the variable whose name is computed from the + given metaname. + + WARNING: The syntax of the EVALUATE command has changed since C-Kermit + 6.0 and K95 1.1.17. Previously, it did not include a variable name, + only an expression. To restore the old behavior, use SET EVALUATE OLD. + To return to the new behavior after restoring the old behavior, use + SET EVALUATE NEW. + + NOTE: There are no analogs to the "_" commands for the operators + described in [588]Section 7.9.1; those operators can not be used to + assign values to variables whose names must be computed. + _________________________________________________________________ + + 7.10. Arrays + + C-Kermit 7.0 adds lots of new array-related features, and groups them + together under the NEW ARRAY command: + + ARRAY { CLEAR, COPY, DECLARE, DESTROY, RESIZE, SHOW, SORT } + + In each of the ARRAY commands, wherever an array name is expected, + "short forms" may be used. For example, all of the following are + acceptable: + + array show \&a[] (or SHOW ARRAY...) + array show &a[] + array show a[] + array show &a + array show a + + In addition, ranges are accepted in the ARRAY COPY, ARRAY CLEAR, ARRAY + SET, ARRAY SHOW, and ARRAY SORT commands: + + array clear \&a[16] ; Clears 16 thru end + array clear &a[16] ; Ditto + array clear a[16] ; Ditto + + array clear \&a[16:32] ; Clears 16 thru 32 + array clear &a[16:32] ; Ditto + array clear a[16:32] ; Ditto + + When using array names as function arguments, you must omit the "\" + and you must include the "&". You may optionally include empty + brackets. Examples: + + \fsplit(\%a,a) ; Bad + \fsplit(\%a,\&a) ; Bad + \fsplit(\%a,&a[3]) ; Bad + + \fsplit(\%a,&a) ; Good + \fsplit(\%a,&a[]) ; Good + _________________________________________________________________ + + 7.10.1. Array Initializers + + Beginning in C-Kermit 7.0, you may initialize an array -- in whole or + in part -- in its declaration: + + [ ARRAY ] DECLARE array-name[size] [ = ] [ value1 [ value2 [...] ] ] + + For compatibility with versions 5A and 6.0, the ARRAY keyword is + optional. DECLARE can also be spelled DCL. + + Initializers are (a) optional, (b) start with element 1, (c) must be + enclosed in braces if they contain spaces, and (d) are evaluated + according to normal rules by the DECLARE command prior to assignment. + Thus the assignments made here are the same as those made by the + ASSIGN command. This allows you to initialize array elements from the + values of other variables. If you actually want to initialize an array + element to variable's name, as opposed to its value, use double + backslashes (as in "\\&a", "\\v(time)", etc). + + The size (dimension) of the array is optional. If the size is omitted, + as in "\&a[]", then the array sizes itself to the number of + initializers; if there are no initializers the array is not declared + or, if it was declared previously, it is destroyed. If a size is + given, any extra elements in the initialization list are discarded and + ignored. + + NOTE: Unlike in C, the list of initializers is NOT enclosed in braces. + Instead, braces are used to group multiple words together. So: + + ARRAY DECLARE \&a[] = { one two three } + + would create an array with two elements (0 and 1), with element 1 + having the value " one two three ". + + Examples: + + ARRAY DECLARE \&a[16] + Declares the array \&a with 17 elements (0 through 16), in + which all elements are initially empty. If the array \&a[] + existed before, the earlier copy is destroyed. + + ARRAY DECLARE &a[16] + ARRAY DECLARE a[16] + ARRAY DCL \&a[16] + ARRAY DCL &a[16] + ARRAY DCL a[16] + DECLARE \&a[16] + DECLARE &a[16] + DECLARE a[16] + DCL \&a[16] + DCL &a[16] + DCL a[16] + All of the above are the same as the first example. + + ARRAY DECLARE \&a[16] = alpha beta {gamma delta} + Declares the array \&a with 17 elements (0 through 16), + initializing \&a[1] to "alpha", \&a[2] to "beta", and \&a[3] to + "gamma delta". The remaining elements are empty. + + ARRAY DECLARE \&a[] = alpha beta {gamma delta} + Same as the previous example, but the array is automatically + dimensioned to 3. + + ARRAY DECLARE \&a[3] = alpha beta {gamma delta} epsilon zeta + Too many initializers; only the first three are kept. + + ARRAY DECLARE \&a[0] + ARRAY DECLARE \&a[] + ARRAY DECLARE &a[] + ARRAY DECLARE &a + ARRAY DECLARE a + DECLARE \&[0] + DECLARE a + DCL a + All of these are equivalent. Each destroys \&a[] if it exists. + Declaring an array with a dimension of 0 is the same as ARRAY + DESTROY arrayname. + + ARRAY DECLARE \&a[] = \%1 \%2 \%3 + Declares the array \&a with 3 elements (0 through 3), + initializing \&a[1] to the value of \%1, \&a[2] to the value of + \%2, and \&a[3] to the value of \%3. In this case, any + reference to one of these array elements is replaced by the + value of the corresponding \%n variable at the time the + declaration was executed (immediate evaluation; the array + element's value does not change if the initializer variable's + value changes). + + ARRAY DECLARE \&a[] = \\%1 \\%2 \\%3 + Declares the array \&a with 3 elements (0 through 3), + initializing \&a[1] to the string "\%1", \&a[2] to "\%2", and + \&a[3] to "\%3". In this case any reference to one of these + array elements is replaced by the CURRENT value of the + corresponding \%n variable (deferred evaluation -- the array + element's value follows the value of the initializer variable). + + The equal sign (=) preceding the initializer list is optional, but is + recommended for clarity. If you need to initialize element 1 to a + literal equal sign, use two of them, separated by a space, as in this + example: + + ARRAY DECLARE \&a[] = = + - * / + + Remember, element 0 is not initialized by the DECLARE command. To + initialize element 0, use a regular DEFINE or ASSIGN command: + + ARRAY DECLARE \&a[] one two three four five six seven eight nine + DEFINE \&a[0] zero + + Finally, remember that every command level has its own local array, + \&_[], containing all the macro arguments (\%0, \%1, ...) for that + level. See [589]Section 7.5 for details. + _________________________________________________________________ + + 7.10.2. Turning a String into an Array of Words + + The \fsplit(s1,&a,s2,s3) function assigns the words of string s1 to + successive elements of the array (beginning with element 1) whose + identifying letter, a-z, is given after the "&" in the second + argument, using break and include characters given in s2 and s3. See + [590]Section 7.3 for details. + _________________________________________________________________ + + 7.10.3. Arrays of Filenames + + See [591]Section 4.11.3 for news about how \ffiles() and related + functions can assign a list of filenames to an array. To recapitulate + briefly here: + + \ffiles(*,&a) + + assigns all files that match the first argument to the array denoted + by the second argument. If the array has not been declared, it is + declared automatically, with exactly the number of elements needed to + hold the file list; if it was previously declared, it is destroyed and + reused. The filenames are assigned starting at array element 1. + Element 0 holds the number of files in the list. + + The DIRECTORY command ([592]Section 4.5.1) can also create filename + arrays if you give it the /ARRAY: switch; this allows selection + criteria beyond whether the filename matches the given pattern. + + All functions and commands that create filename arrays store the + number of filenames, n, as element 0 of the array, and the filenames + as elements 1 through n. + _________________________________________________________________ + + 7.10.4. Automatic Arrays + + In a command file or macro, you can now have local (automatic) arrays. + Just give the name followed by empty subscript brackets (no spaces + inside the brackets please) in a LOCAL command, and then declare the + array: + + LOCAL \%a \&a[] oofa + ARRAY DECLARE \&a[32] = value1 value2 value3 ... + + This declares the scalar variable \%a, the array \&a[], and the macro + name "oofa" to be local, and then declares the new local copy of \&a[] + with 32 elements, perhaps assigning some initial values. When C-Kermit + exits from the command file or macro containing these command, the + previous \&a[] array is restored (and if there was no \&a[] at any + higher level, this will still be true). The process can be repeated to + any level. Thus it is now safe to write scripts or macros containing + arrays without danger of interfering with global arrays of the same + name. + + Just as scalars are inherited by lower command levels, so are arrays. + So, for example, if \&a[] is declared at top level, all lower levels + will see it unless they include a "local \&a[]" statement, in which + case all levels at and beneath the level where the LOCAL statement was + executed will see the local copy. This too can be repeated to any + level. + + On the other hand, if you DECLARE an array at a lower command level + without also making it LOCAL, this replaces the copy that was declared + at the lowest command level above this one. + _________________________________________________________________ + + 7.10.5. Sorting Arrays + + Although arrays can be sorted using FOR loops as shown on page 383 of + Using C-Kermit, 2nd Ed., this involves quite a bit of repetitive + interpretation by the command parser, and so can be slow for large + arrays. For this reason, C-Kermit 7.0 adds a built-in SORT command: + + ARRAY SORT [ switches ] array [ array2 ] + Sorts the given array in place. Sorting is strictly lexical + (string based). The array name can be given fully, e.g. + "\&a[]", or the "\" and/or "&" and/or brackets can be omitted, + e.g. "array sort \&a[]", "sort &a", "sort a". Also, a range can + be indicated in the brackets as noted in [593]Section 7.10, to + restrict the sort to a range of elements (equivalent to the + /RANGE switch, described just below), e.g. "array sort + &a[20:30]". + + A second array may be specified. If it is, and if it is at least as + big as the first array, it is sorted according to the first array. For + a sample application, see [594]Section 7.10.10. + + See [595]Section 1.5 for an explanation of switches. The optional + switches are: + + /CASE:{ON,OFF} + /CASE:ON means that alphabetic case is significant in + comparisons; uppercase letters are sorted before lowercase + ones. /CASE:OFF means case is ignored, e.g. "A" is the same as + "a". If this switch is not given, sorting is according the + current SET CASE setting. + + /KEY:n + Comparison begins at position n(1-based) in each string. If no + key is given, the entire strings are compared. Only one key can + be given. If an array element is shorter than the key value, n, + that element is considered empty for comparison purposes, and + therefore lexically less than any element at least ncharacters + long. + + /NUMERIC + If this switch is included, it means sorting should be numeric, + rather than lexical. The sort key is the string starting at the + key position, skipping any leading blanks or tabs, and then as + much of the string from that point on that fits the definition + of "numeric", terminating at the first character that does not + qualify. A numeric string has an optional sign (+ or -) + followed by one or more digits, and (if your version of Kermit + was built with floating-point support; see [596]Section 7.23 ) + zero or one decimal point (period). If both /CASE and /NUMERIC + are given, /NUMERIC takes precedence. + + /RANGE:n[:m] + Sort elements nthrough m of the array. By default, the entire + array from element 1 to its dimensioned size is sorted, which + might produce surprising results if the array is not full; see + example in [597]Section 7.10.7. If ":m" is omitted from the + range, the dimensioned size is used. Thus, to sort an entire + array, \&a[], including its 0th element, use "sort /range:0 + &a". You can also sort any desired section of an array, e.g. + "sort /range:10:20 &a" or "sort /range:\%i:\%j-1 &b". As noted + above, you can also specify a range in the array-name brackets. + If you specify a range in the array-name brackets AND with a + /RANGE switch, the ones in the brackets take precedence. + + /REVERSE + Sort in reverse order. If this switch is not given, the array + is sorted in ascending order. + + Remember that numeric switch arguments can be numbers, arithmetic + expressions, or variables whose values are numbers or expressions, as + illustrated in the /RANGE examples above. + + A typical sorting application might be to list students' test scores + in descending order. Suppose you had the following records: + + olaf 65 + olga 98 + ivan 83 + xena 100 + + (and so on) stored in array \&s[] (e.g. by reading them from a file as + illustrated in [598]section 7.10.7). In these records, the student's + name is in columns 1-9 and the score in 10-12. So to rearrange the + list in descending order of score: + + sort /key:10 /reverse &s + + Then to list your top five students: + + for \%i 1 5 1 { echo \&s[\%i] } + + Or more simply (see next section): + + show array a[1:5] + + To illustrate the difference between a lexical and a numeric sort, + suppose you have the following records (the lines that are numbered, + starting at column 1) in array \&a[]: + + Column 1 2 + 12345678901234567890 + + 1. Ivan 10.0 2. Olaf 9.95 3. Olga 101.5 + + ARRAY SORT /KEY:10 &a[] would order them 3,1,2, but ARRAY SORT /KEY:10 + /NUMERIC &a[] would order them 2,1,3. + _________________________________________________________________ + + 7.10.6. Displaying Arrays + + The SHOW ARRAY command (or ARRAY SHOW) now accepts an optional + array-name argument: + + SHOW ARRAY \&a[] + + (you can leave off the \, the \&, and/or the []'s if you like; "show + array a" is equivalent to "show array \&a[]"). When an array is + specified, its dimension is shown and all defined (non-empty) elements + are listed. + + Example: + + assign \%n \ffiles(*,&a) ; Fill an array with filenames ([599]Section 4.11.3 +) + show array \&a[] ; Show the array we just read + array show \&a[] ; Same as previous + array sort \&a[] ; Sort the array + array show \&a[] ; Show it after sorting + array show \&a ; Show it again + array show &a ; Show it again + array show a ; Show it again + + (The final four commands demonstrate the alternative forms that are + accepted for the array name.) + + If you SHOW ARRAY without giving an array name, all defined arrays are + listed by name and dimension, but their contents are not shown. + + You can also show a piece of an array by including a subscript or + range within the array brackets: + + array show \&a[5] ; Shows \&a[5] + array show &a[3:8] ; Shows \&a[3] through \&a[8] + array show a[:\%n-1] ; Shows \&a[0] through \&a[\%n-1] + _________________________________________________________________ + + 7.10.7. Other Array Operations + + ARRAY DESTROY arrayname + Destroys and undeclares the named array. Subscripts or ranges + are not accepted in this command. + + ARRAY COPY array1 array2 + Copies the first array to the second array. If the target array + has not been declared, it is created automatically with the + same size as the first. If it has been declared, it will be + used as declared; if the source array is larger, only as much + of it as will fit is copied to the target array. Syntax for + array1 and array2 is as in ARRAY SHOW (SHOW ARRAY). Example: + + .\%n := \ffiles(*,&a) ; Create and load array A with a file list. + array copy &a &b ; Copy array A to array B. + + The ARRAY COPY command also lets you copy pieces of arrays by + including range specifiers, as in these examples: + + ARRAY COPY \&a[4:27] \&b + This copies \&a[] elements 4-27 to \&b[] elements 1-23, + creating \&b[] if necessary or, if \&b[] is already + declared, stopping early if its size is less than 23. + + ARRAY COPY \&a[4:27] \&b[12] + This copies \&a[] elements 4-27 to \&b[] elements 12-35, + creating \&b[] if necessary or, if \&b[] is already + declared, stopping early if its size is less than 35. + + ARRAY COPY \&a[4:27] \&b[12:14] + This copies \&a[] elements 4-6 to \&b[] elements 12-14, + creating \&b[] if necessary or, if \&b[] is already + declared, stopping early if its size is less than 14. + + ARRAY COPY \&a[17] \&b + This copies all the elements of \&a[] starting with 17 + until the last to \&b[], creating \&b[] if necessary or, + if \&b[] is already declared, stopping early if \&b[] is + not big enough. + + ARRAY CLEAR arrayname + Sets all the elements of the array to the empty value. You may + also include a range specifier to clear only a selected portion + of the array; for example "array clear \&a[37:214]". If the + range is out of bounds, only the part of the array that is in + bounds is cleared. + + ARRAY SET arrayname [ value ] + Sets all the elements of the array to the given value. If no + value is given, the array is cleared. You may also include a + range specifier to set only a selected portion of the array; + for example "array set \&a[1:9] -1". If the range is out of + bounds, only the part of the array that is in bounds is set. + + ARRAY RESIZE arrayname size + Resizes the given array. If the size is greater than the + array's current dimension, new empty elements are added to the + end. If the size is less than the current dimension, the extra + elements are discarded. Note: If you have stored the array size + in element 0, ARRAY RESIZE does not change this value. + Alternative notation: ARRAY RESIZE arrayname[size]. For a + practical example, see [600]Section 7.10.11. + + \farraylook(pattern,arrayname) + This function returns the index of the first element of the + given array that matches the given pattern (for details about + pattern syntax, see [601]section 4.9). The array name can + include a range specification to restrict the search to a given + segment of the array. If no elements match the pattern, -1 is + returned. + + \ftablelook(keyword,arrayname[,delimiter]) + Looks in the given "table", which must be sorted, for the given + keyword. The keyword need not be spelled out in full. + Pattern-matching characters should not be included as part of + the keyword. The function returns the index of the table + element that uniquely matches the given keyword, or -1 if none + match, or -2 if more than 1 match. + + A "table" is an array that is sorted in lexical order; each of its + elements may contain multiple fields, delimited by the given delimiter + character or, if no delimiter is specified, a colon (:). + + The \farraylook() function does exactly what you tell it. If you give + it a pattern that does not include wildcard characters (such as *, ?, + etc), it requires an exact match. For example: + + \farraylook(oofa,&a) + + searches for the first element of \&a[] whose value is "oofa". But: + + \farraylook(oofa*,&a) + + finds the first element whose value starts with "oofa", and; + + \farraylook(*oofa,&a) + + finds the first element whose value ends with "oofa", and; + + \farraylook(*oofa*,&a) + + finds the first element whose value contains "oofa". + + Here's a simple demonstration of looking up patterns in arrays: + + local \&a[] \%x \%n + declare \&a[] = zero one two three four five six seven eight nine ten + while true { + .\%x = 1 + .\%n = 0 + ask \%a { Pattern? } + if not def \%a exit 0 Done. + while <= \%x \fdim(&a) { + .\%x := \farraylook(\%a,&a[\%x]) + if ( < \%x 0 ) break + echo \flpad(\%x,3). \&a[\%x] + increment \%x + increment \%n + } + if ( < \%n 1 ) echo Pattern not found - "\%a" + } + + The array need not be sorted. When a pattern is given, a search is + performed; if there is a match, the matching element's index and the + element itself are printed, and the search begins again at the next + element. Thus each matching element is printed. If none match, the + "Pattern not found" message is printed. The process repeats for as + many patterns as the user wants to type, and terminates when the user + types an empty pattern. + + Now let's build a little command parser, consisting of a keyword + table, and a loop to look up the user's commands in it with + \ftablelook(). In this case the array elements have "fields" separated + by colon (:) -- a keyword and a value. Keyword tables must be sorted + if \tablelook() is to work right, so after declaring and initializing + the table array, we sort it. + + local \&k[] \%a \%i \%n + + array declare \&k[] = drive:9 do:8 discuss:7 live:6 spend:5 help:4 quit:0 + + array sort &k ; Make sure array is sorted + echo Type "help" for help. ; Print greeting & instructions + + while true { ; Loop to get commands + undefine \%a + while not defined \%a { ; Get a command + ask \%a { Command? } + } + .\%n := \ftablelook(\%a,&k) ; Look up the command + switch \%n { ; Handle errors + :-1, echo Not found - "\%a" ; Doesn't match + continue + :-2, echo Ambiguous - "\%a" ; Matches too many + continue + } + switch \fword(\&k[\%n],2) { ; Dispatch according to value + :9, echo Driving..., break + :8, echo Doing..., break + :7, echo Discussing..., break + :6, echo Living..., break + :5, echo Spending..., break + :4, echo { Commands (may be abbreviated):} + for \%i 1 \fdim(&k) 1 { + echo { \%i. \fword(\&k[\%i],1) } + } + break + :0, exit 0 Bye! + :default, stop 1 Internal error + } + } + + In this example, keywords are "drive", "do", "discuss", etc, and their + values are unique numbers (values need not be numbers, and there need + not be only one value -- there can be 0, 1, 2, or more of them). The + user types a command, which can be the whole word (like "help") or any + abbreviation (like "hel", "he", or just "h"). If this does not match + any keywords, \ftablelook() returns -1; if it matches more than one + (as would "d"), it returns -2. Otherwise the array index is returned, + 1 or higher. + + Given the array index \%n, we can get the table values as follows: + + \fword(\&k[\%n],1) is the keyword (first field) + \fword(\&k[\%n],2) is the value (second field, in this case a number) + + In our example, we use the value (number) as the SWITCH variable. As + noted, \fablelook() expects the array elements to contain multiple + fields separated by colon (:) (or other character that you specify, + e.g. \ftablelook(\%a,&a,^)) and when matching the keyword, ignores the + first delimiter and everything after it. + _________________________________________________________________ + + 7.10.8. Hints for Using Arrays + + C programmers are accustomed to out-of-bounds array references causing + core dumps or worse. In C-Kermit: + + * A reference to an an out-of-bounds array element returns the empty + string. + * An attempt to set the value of an array element that is out of + bounds or that has not been declared simply fails. + + C programmers expect an array of size nto have elements 0 through n-1. + Fortran programmers expect the same array to have elements 1 through + n. C-Kermit accommodates both styles; when you declare an array of + size n, it has n=1 elements, 0 through n, and you can use the array in + your accustomed manner, 0-based or 1-based. + + However, note that C-Kermit has certain biases towards 1-based arrays: + + * Assignment of file lists starts with element 1 ([602]Section + 7.10.3). + * Assignment by \fsplit() starts with element 1 ([603]Section 7.3). + * Array initialization skips the 0th element. To initialize a + 0-based array, use something like this: + declare \&a[3] = one two three + .\&a[0] = zero + * The ARRAY SORT command skips the 0th element unless you include + /RANGE:0 + * The SHIFT command ignores element 0 of the \&_[] array. + + The distinction between an array's dimensioned size and the number of + elements in the array is important when sorting. To illustrate: + + declare \&a[100] ; Declare array &a with 100 elements + fopen /read \%c oofa.txt ; Open a file + if fail... + for \%i 1 \fdim(&a) 1 { ; Read the file into the array + fread \%c \&a[\%i] + if fail break + } + fclose \%c + if > \%i \fdim(&a) end 1 File has too many lines for array. + .\%n ::= \%i - 1 + echo File has \%n line(s). + + Let's say the file had 95 lines. This leaves elements 96-100 of the + array empty. Now suppose you sort the array and write out the result: + + sort &a ; Sort the whole array + fopen /write \%o oofa.txt.sorted ; Open an output file + if fail ... + for \%i 1 \%n 1 { ; Write out 95 records + fwrite /line \%o \&a[\%i] + if fail end 1 Write error + } + close write + + You might be surprised at the contents of "oofa.txt.sorted" -- five + empty elements, 96-100, floated to the top of the array in the sort, + and since your write loop only had 95 iterations, the final 5 lines of + the sorted file are lost. + + Therefore, when dealing with partially filled arrays -- especially + when sorting them -- remember to specify the number of elements. A + handy way of recording an array's "true" size is to put it in the 0th + element. That way, it "travels with the array". To illustrate + (continuing the previous example at the "close read" statement): + + close read + if > \%i \fdim(&a) end 1 File has too many lines for array. + .\&a[0] ::= \%i - 1 ; Assign number of lines to \&a[0]. + echo File has \&a[0] line(s). + sort /range:1:\&a[0] &a + open write oofa.txt.sorted + if fail ... + for \%i 1 \&a[0] 1 { + writeln file \&a[\%j] + if fail end 1 Write error + } + close write + + Note the SORT switch, /RANGE:1:\&a[0]. This keeps the sort 1-based, + and uses element 0 of the array as its size indicator. + + Finally, note that even though some commands or functions might put a + size in array element 0, no built-in functions or commands depend on a + size actually being there. Thus you are perfectly free to replace the + size with something else and treat the array as 0-based. + _________________________________________________________________ + + 7.10.9. Do-It-Yourself Arrays + + Kermit's \&x[] arrays are nice because of the accompanying built-in + functionality -- ARRAY commands, built-in functions that load and + search arrays, automatic evaluation of arithmetic expressions within + the subscript brackets, and so on. Yet they also have certain + limitations: + + 1. Except when created by dynamic loading (e.g. by \ffiles()) they + must be declared and dimensioned in advance. + 2. Indices must be numeric, positive, and in range. + 3. There can be only one dimension. Matrices or other + higher-dimensioned arrays are not available. + + But none of this is to say you can't invent any kind of data structure + you like. In [604]Section 7.9.2 you can see some examples. Here's + another (courtesy of Dat Thuc Nguyen), in which a pair of matrices is + created and then added: no dimensioning necessary. + + .row = 4 + .col = 9 + + ; MACRO TO PRINT A MATRIX + define PMATRIX { + echo Matrix \%1: + for \%r 1 \m(row) 1 { + for \%c 1 \m(col) 1 { + xecho \flpad(\m(\%1[\%r][\%c]),4) + } + echo + } + echo + } + ; CREATE MATRICES A AND B + for \%r 1 \m(row) 1 { + for \%c 1 \m(col) 1 { + _eval A[\%r][\%c] \%r + \%c + _eval B[\%r][\%c] \%r * \%c + } + } + ; CREATE MATRIX C = SUM OF MATRIX A AND MATRIX B + for \%r 1 \m(row) 1 { + for \%c 1 \m(col) 1 { + _eval C[\%r][\%c] \m(A[\%r][\%c]) + \m(B[\%r][\%c]) + } + } + pmatrix A ; Print Matrix A + pmatrix B ; Print Matrix B + pmatrix C ; Print Matrix C + + In the example, we use matrix-like notation to create macros with + names like "A[1][1]", "B[3][7]", and so on. + _________________________________________________________________ + + 7.10.10. Associative Arrays + + An associative array is a special kind of Do-It-Yourself array. It + differs from a regular array in that its indices need not be numbers + -- they can be anything at all -- words, filenames, names of months, + any character string at all, and that it doesn't have to be (and in + fact can't be) declared. An associative array element is simply a + macro whose name ends with an index enclosed in angle brackets, for + example: + + file + + More formally: + + basename + + An associative array is a collection of all associative array elements + that have the same basename. Any number of associative arrays, each + with any number of elements, can exist at the same time. + + An associative array element can be assigned a value, such as "1", + just like any other macro: + + define file 1 ; Give "file" the value "1". + + or: + + assign file \%a ; Give it the value of the variable \%a. + + However, since an associative array element is a macro, it may not + have an empty (null) value, since assigning an empty value to a macro + undefines the macro. + + You can refer to the value of an associative array element using the + familiar notation for macro values: + + echo \m(file) ; Echo the value of "file". + + Associative arrays are most useful, however, when the value of the + index is a variable. In that case, you must use the "hidden" forms of + the DEFINE or ASSIGN commands that evaluate the macro name before + making the assignment (see [605]Using C-Kermit, page 457). Example: + + define \%f oofa.txt + _define file<\%f> 1 + echo file<\%f> = \m(file<\%f>) + + prints: + + file = 1 + + and then: + + _increment file<\%f> + echo file<\%f> = \m(file<\%f>) + + prints: + + file = 2 + + What are associative arrays good for? The classic example is "word + counts": finding the number of times each word is used in a text + without knowing in advance what the words are. Without associative + arrays, your program would have to build a table of some kind, and + every time a word was encountered, look it up in the table to find its + position and counter, or add it to the table if it wasn't found -- a + time-consuming and laborious process. Associative arrays, however, let + you use the word itself as the table index and therefore sidestep all + the table building and lookups. + + Let's work through a practical example. Suppose you have a + file-transfer log in which each line is composed of a number of + blank-separated fields, and the 9th field is a filename (which happens + to be the format of certain FTP server logs, as well as of C-Kermit's + new FTP-format transaction log, described in [606]Section 4.17.2), for + example: + + Wed Jul 14 09:35:31 1999 22 xx.mit.edu 13412 /pub/ftp/mm/intro.txt .... + + and you want to find out how many times each file was transferred. The + following code builds an associative array, file<>, containing the + counts for each file: + + local name line max \%c \%n ; Declare local variables + fopen /read \%c /var/log/ftpd.log ; Open the log file ([607]Section 1.22) + if fail exit 1 Can't open log ; Check + while true { ; Loop for each record + fread /line \%c line ; Read a line + if fail break ; Check for end of file + .name := \fword(\m(line),9,{ }) ; Get 9th field = filename (Sec 7.3) + _increment file<\m(name)> ; Increment its counter (Sec 7.9.2) + } + fclose \%c ; Close file when done. + + Note that _INCREMENT (and INCREMENT, and [_]DECREMENT) treat an empty + (i.e. nonexistent) variable as having a value of 0, and therefore + creates the variable with a value of 1. + + At this point, if you told Kermit to "show macro file<", it would list + the associative array. But since you don't necessarily know the names + of the files in the array, or even how many elements are in the array, + how can you use it in a script program? + + The idea of creating macro names that include character-string indices + enclosed in angle brackets is perfectly arbitrary and doesn't depend + on any Kermit features that weren't already there -- we could just as + easily have used some other notation, such as "file[index]", + "file:index", or "file.index", and the code above would have worked + just as well (with the corresponding syntax adjustments). But to be + able to use an associative array in a program after the array is + built, we need a method of accessing all its elements without knowing + in advance what they are. That's where the chosen notation comes in. + + First of all, any macro name that ends with "" (where "xxx" is + any string) is case sensitive, unlike all other macro names, which are + case independent. To illustrate, "file" and "file" + are two distinct macros, whereas "OOFA", "Oofa", and "oofa", when used + as macro names, are all the same. + + Second, the new \faaconvert() function converts an associative array + (that is, all macros with names of the form "base" that have + the same "base" part) into a pair of regular arrays and returns the + number of elements: + + \faaconvert(name,&a[,&b]) + + "name" is the name of the associative array, without the angle + brackets or index ("file" in our example). + + The second argument is the name of a regular array in which to store + the indices of the associative array (filenames in our example); if an + array of this name already exists, it is destroyed unless the array is + LOCAL. The third argument is the name of another regular array in + which to store the values (the counts in our example), with the same + rules about array name collisions. If you care only about the indices + and not the values, you can omit the third argument to \faaconvert(). + In any case, the associative array is converted, not copied: its + elements are moved to the specified regular arrays, so after + conversion the original associative array is gone. + + As with other array-loading functions, \faaconvert() sets element 0 of + each array to the number of elements in the array. + + To continue our example: + + .max := 0 ; Maximum count + .\%n := \faaconvert(file,&a,&b) ; Convert + for \%i 1 \%n 1 { ; Loop through values + echo \flpad(\%i,3). \&a[\%i]: \&b[\%i] ; Echo this pair + if ( > \&b[\%i] \m(max) ) { ; Check for new maximum + .name := \&a[\%i] + .max := \&b[\%i] + } + } + echo Most popular file: \m(name), accesses: \m(max) + + This lists the files and counts and then announces which file has the + highest count. + + Now suppose you want to sort the array pair created from an + associative array. In our example, \&a[] contains filenames, and \&b[] + contains the associated counts. Here we take advantage of the ARRAY + SORT command's ability to sort a second array according to the first + one: + + array sort /reverse /numeric &b &a ; Descending sort by count + + Now to see the top five files and their counts: + + echo The top 5 files are: + for \%i 1 5 1 { ; Loop through top 5 values + echo \flpad(\%i,3). \&a[\%i]: \&b[\%i] ; Echo this pair + } + _________________________________________________________________ + + 7.10.11. Transferring Array Contents to Other Computers + + The SEND /ARRAY:arrayname command ([608]Section 4.7.1) allows you to + send the contents of any array, or any contiguous segment of it, in + either text or binary mode to another computer, using Kermit protocol. + When used in conjunction with C-Kermit's other features (the array + features described in this section; the file i/o package from + [609]Section 1.22; its decision-making, pattern-matching, and string + manipulation capabilities, and so on) the possibilities are endless: + extracts of large files, remote database queries, ..., all without + recourse to system-dependent mechanisms such UNIX pipes and filters, + thus ensuring cross-platform portability of scripts that use these + features. + + When sending an array in text mode, Kermit appends a line terminator + to each array element, even empty ones, and it also converts the + character set from your current FILE character-set to your current + TRANSFER character-set, if any. No conversions are made or line + terminations added in binary mode. For example, the following array: + + dcl \&a[] = One Two Three Four Five Six + + is sent as six lines, one word per line, in text mode, and as the bare + unterminated string "OneTwoThreeFourFiveSix" in binary mode. + + You should always include a /TEXT or /BINARY switch in any SEND /ARRAY + command to force the desired transfer mode, otherwise you're likely to + be surprised by the effects described in [610]Section 4.3. + + Here are some examples: + + send /text /array:\&a[] + Sends the entire contents of the array \&a[] in text mode. + Since an as-name is not included, the receiver is told the + filename is _array_a_. + + send /text /array:&a[] + send /text /array:a[] + send /text /array:&a + send /text /array:a + These are all equivalent to the previous example. + + send /text /array:&a /as-name:foo.bar + As above, but the array is sent under the name foo.bar. + + send /text /array:&a[100:199] /as:foo.bar + As above, but only the elements from 100 through 199 are sent. + + In text-mode transfers, character sets are translated according to + your current settings, just as for text files. In binary mode, of + course, there is no character-set translation or other conversion of + any kind. But remember that array elements can not contain the NUL + (ASCII 0) character, since they are implemented as NUL-terminated + strings. + + Here's an example that shows how to send all the lines (up to 1000 of + them) from a file animals.txt that contain the words "cat", "dog", or + "hog" (see [611]Section 4.9 about pattern matching): + + declare \&a[1000] + fopen /read \%c animals.txt + if fail exit 1 + .\%i = 0 + while true { + fread \%c line + if fail break + if match {\m(line)} {*{cat,[dh]og}*} { + increment \%i + if ( > \%i \fdim(&a) ) break + .\&a[\%i] := \m(line) + } + } + fclose \%c + send /array:a[1:\%i] /text + + Note that we are careful to send only the part of the array that was + filled, not the entire array, because there are likely to be lots of + unused elements at the end, and these would be sent as blank lines + otherwise. + + This example raises an interesting question: what if we want to send + ALL the matching lines, even if there are more than 1000 of them, but + we don't know the number in advance? Clearly the problem is limited by + Kermit's (and the computer's) memory. If there are a thousand trillion + matching lines, they most likely will not fit in memory, and in this + case the only solution is to write them first to a temporary file on + mass storage and then send the temporary file and delete it + afterwards. + + However, when the selection is likely to fit in memory, the + once-familiar technique of initial allocation with extents can be + used: + + if match {\m(line)} {*{cat,[dh]og}*} { + increment \%i + if ( > \%i \fdim(&a) ) { + array resize a \fdim(&a)+100 + if fail stop 1 MEMORY FULL + echo NEW DIMENSION: \fdim(&a) + } + .\&a[\%i] := \m(line) + } + + This grows the array in chunks of 100 as needed. + _________________________________________________________________ + + 7.11. OUTPUT Command Improvements + + LINEOUT [ text ] + This command is exactly like OUTPUT, except it supplies a + carriage return at the end of the text. "lineout exit" is + exactly the same as "output exit\13". + + SET OUTPUT SPECIAL-ESCAPES { ON, OFF } + This command lets you tell C-Kermit whether to process \N, \L, + and \B specially in an OUTPUT command, as distinct from other \ + sequences (such as \%a, \13, \v(time), etc). Normally the + special escapes are handled. Use SET OUTPUT SPECIAL-ESCAPES OFF + to disable them. + + Disabling special escapes is necessary in situations when you need to + transmit lines of data and you have no control over what is in the + lines. For example, a file oofa.txt that contains: + + This is a file + It has \%a variables in it + And it has \B in it. + And it has \L in it. + And it has \N in it. + And this is the last line. + + can be sent like this: + + local line + set output special-escapes off + fopen /read \%c oofa.txt + if fail stop 1 Can't open oofa.txt + while success { + fread \%c line + if fail break + ; Add filtering or processing commands here... + output \m(line)\13 + } + _________________________________________________________________ + + 7.12. Function and Variable Diagnostics + + In C-Kermit 6.0 and earlier, the only diagnostic returned by a failing + function call was an empty value, which (a) could not be distinguished + from an empty value returned by a successful function call; (b) did + not give any indication of the cause of failure; and (c) did not cause + the enclosing statement to fail. C-Kermit 7.0 corrects these + deficiencies. + + SET FUNCTION DIAGNOSTICS { ON, OFF } + when ON, allows built-in functions to return diagnostic + messages when improperly referenced, instead of an empty + string. FUNCTION DIAGNOSTICS are ON by default. When OFF, + improperly referenced functions continue to return an empty + string. This command also affects built-in variables; in this + case, an error message is returned only if the variable does + not exist. When FUNCTION DIAGNOSTICS are ON, the error message + is also printed. + + For variables, the only message is: + + + + where "name" is the name of the nonexistent variable. + + For functions, the diagnostic message is: + + + + where "message" is replaced by a message, and "name" is replaced by + the function name, e.g. . Messages + include: + + ARG_BAD_ARRAY An argument contains a malformed array reference. + ARG_BAD_DATE An argument contains a malformed date and/or time. + ARG_BAD_PHONENUM An argument contains a malformed telephone number. + ARG_BAD_VARIABLE An argument contains a malformed \%x variable. + ARG_INCOMPLETE An argument is incomplete (e.g. a broken Base64 string). + ARG_EVAL_FAILURE An argument could not be evaluated (internal error). + ARG_NOT_ARRAY An argument references an array that is not declared. + ARG_NOT_NUMERIC An argument that must be integer contains non-digits. + ARG_NOT_FLOAT An argument has bad floating-point number format. + ARG_NOT_VARIABLE An argument that must be a variable is not a variable. + ARG_OUT_OF_RANGE An argument's numeric value is too big or too small, + or an argument contains illegal characters (e.g. a hex + or Base-64 string). + ARG_TOO_LONG An argument's value is too long. + ARRAY_FAILURE Failure to create an array. + DIVIDE_BY_ZERO Execution of the function would cause division by zero. + FLOATING_POINT_OP Execution error in a floating-point operation. + FILE_NOT_FOUND Filename argument names a file that can't be found. + FILE_NOT_READABLE Filename argument is not a regular file. + FILE_NOT_ACCESSIBLE Filename argument names a file that is read-protected. + FILE_ERROR Other error with filename argument. + FILE_NOT_OPEN A file function was given a channel that is not open. + FILE_ERROR_-n A file function got error -n ([612]Section 1.22). + LOOKUP_FAILURE Error looking up function (shouldn't happen). + MALLOC_FAILURE Failure to allocate needed memory (shouldn't happen). + NAME_AMBIGUOUS The function is not uniquely identified. + MISSING_ARG A required argument is missing. + NO_SUCH_FUNCTION An argument references a function that is not defined. + NO_SUCH_MACRO An argument references a macro that is not defined. + RESULT_TOO_LONG The result of a function is too long. + UNKNOWN_FUNCTION Internal error locating function (shouldn't happen). + + Examples: + + assign \%m \fmod() + ? + echo "\fcontents(\%m)" + "" + echo \fmod(3,x) + ? + echo \fmod(3,4-2*2) + ? + + Notice the use of \fcontents() in echoing the value of a variable that + contains a returned error message. That's because the error message + includes the name of the variable or function that failed, so you must + use \fcontents() to prevent it from being evaluated again -- otherwise + the same error will occur. + + The handling of function and variable errors is controlled by: + + SET FUNCTION ERROR { ON, OFF } + Tells whether invalid function calls or variable references + should cause command errors. FUNCTION ERROR is ON by default. + When ON, and an error is diagnosed in a built-in function or + variable, the command that includes the function call or + variable reference fails. The failing command can be handled in + the normal way with IF FAILURE / IF SUCCESS, SET TAKE ERROR, or + SET MACRO ERROR. + + When FUNCTION DIAGNOSTICS is OFF, there is no error message. + + SHOW SCRIPTS displays the current FUNCTION DIAGNOSTICS and ERROR + settings. + _________________________________________________________________ + + 7.13. Return Value of Macros + + In C-Kermit 5A and 6.0, there are two ways to return one level from a + macro: RETURN value and END number text. When RETURN is used, the + value, which can be a number or a text string, is assigned to + \v(return). When END was used, however, \v(return) was not set. + SUCCESS/FAILURE was set according to whether the number was zero, and + the text was printed, but the actual value of the number was lost. + + In C-Kermit 7.0, the END number is available in the \v(return) + variable. + _________________________________________________________________ + + 7.14. The ASSERT, FAIL, and SUCCEED Commands. + + The ASSERT command is just like the IF command, but without a command + to execute. It simply succeeds or fails, and this can be tested by a + subsequent IF SUCCESS or IF FAILURE command. Example: + + ASSERT = 1 1 + IF SUCCESS echo 1 = 1. + + The FAIL command does nothing, but always fails. The SUCCEED command + does nothing, but always succeeds. + + These commands are handy in debugging scripts when you want to induce + a failure (or success) that normally would not occur, e.g. for testing + blocks of code that normally are not executed. + _________________________________________________________________ + + 7.15. Using Alarms + + Alarms may be set in two ways: + + SET ALARM number + Sets an alarm for the given number of seconds "from now", i.e. + in the future, relative to when the SET ALARM command was + given. Examples: + + set alarm 60 ; 60 seconds from now + set alarm +60 ; The same as "60" + set alarm -60 ; Not legal - you can't set an alarm in the past. + set alarm 60*60 ; 60 minutes from now. + set alarm \%a+10 ; You can use variables, etc. + + SET ALARM hh:mm:ss + Sets an alarm for the specified time. If the given time is + earlier than the current time, the alarm is set for the given + time in the next day. You may give the time in various formats: + + set alarm 15:00:00 ; 3:00:00pm + set alarm 3:00:00pm ; 3:00:00pm + set alarm 3:00pm ; 3:00:00pm + set alarm 3pm ; 3:00:00pm + + SHOW ALARM + Displays the current alarm, if any, in standard date-time + format (see [613]Section 1.6): yyyymmdd hh:mm:ss. + + IF ALARM command + Executes the command if an alarm has been set and the alarm + time has passed. + + IF ALARM { command-list } [ ELSE { command-list } ] + Executes the command-list if an alarm has been set and the + alarm time has passed. Otherwise, if an ELSE part is given, its + command-list is executed. + + CLEAR ALARM + Clears the alarm. + + Only one alarm may be set at a time. + + Example: Suppose you have a script that is always running, and that + transfers files periodically, and that keeps a transaction log. + Suppose you want to start a new transaction log each day: + + log transactions \v(date).log + set alarm 00:00:00 ; Set an alarm for midnight + while true { ; Main script loop + xif alarm { ; If the alarm time is past... + close transactions ; Close current log + log transactions \v(date).log ; Start new one + pause 1 ; To make sure 00:00:00 is past + set alarm 00:00:00 ; Set a new alarm + } + ; put the rest of the script here... + } + + Note that IF ALARM -- no matter whether it succeeds or fails -- does + NOT clear an expired alarm. Thus, once an alarm has expired, every IF + ALARM will succeed until the alarm is cleared (with the CLEAR ALARM + command) or reset with a new SET ALARM command. + _________________________________________________________________ + + 7.16. Passing Arguments to Command Files + + Beginning in version 7.0, C-Kermit accepts arguments on the TAKE + command line, for example: + + C-Kermit> take oofa.ksc one two {this is three} four + + This automatically sets the variables \%1 through \%9 to the + arguments, and \%0 to the name of the file, in this case: + + \%0 = /usr/olga/oofa.ksc + \%1 = one + \%2 = two + \%3 = this is three + \%4 = four + + and \%5..\%9 are undefined (empty). Arguments past the ninth are + available in the \&_[] argument-vector array ( [614]Section 7.5). + + The variables are those at the current macro level. Thus, if the TAKE + command is executed from within a macro, the macro's arguments are + replaced by those given on the TAKE command line (but only if at least + one argument is given). The command shown above is exactly equivalent + to: + + assign \%0 /usr/olga/oofa.ksc + assign \%1 one + assign \%2 two + assign \%3 this is three + assign \%4 four + assign \%5 + assign \%6 + assign \%7 + assign \%8 + assign \%9 + take oofa.ksc + + Remember, the variables \%0..\%9 are on the macro call stack, and + command files are independent of the macro stack. Thus, if a command + file TAKEs another command file and passes arguments to it, the + variables are changed from that point on for both files, and so forth + for all levels of nested command files without intervening macro + invocations. + + It would have been possible to change C-Kermit to use the overall + command stack, rather than the macro stack, for arguments -- this + would have made TAKE work exactly like DO, which is "nicer", but it + would also have broken countless existing scripts. However, the new + SHIFT command ([615]Section 7.5) makes it possible to create an + alternative TAKE command that does indeed save and restore the + argument variables at its own level around execution of a command + file: + + define mtake { + local \%f + assign \%f \fcontents(\%1) + shift + take \%f + } + + C-Kermit 7.0 also supports a new, easier way to pass arguments to + scripts from the system command line: + + kermit filename arg1 arg2 arg3 ... + + in which arg1, arg2, arg3 (etc) are arguments for the script (whose + filename is given), and are assigned to \%1, \%2, ... \%9. The + filename is assigned to \%0. This applies equally to "Kerbang" scripts + in UNIX ([616]Section 7.19). For example, suppose you have a file + called "showargs" containing the following lines: + + #!/usr/local/bin/kermit + + echo Hello from \%0 + show args + exit + + (except not indented, since the "#!" line must be on the left margin). + If you give this file execute permission: + + chmod +x showargs + + then you can run it exactly as you would run a UNIX shell script, + e.g.: + + $ showargs one two three + Hello from /usr/olga/showargs + Top-level arguments (\v(argc) = 4): + \&_[0] = /usr/olga/showargs + \&_[1] = one + \&_[2] = two + \&_[3] = three + + Furthermore, the \&_[] array now contains the filename, if one was + given as the first command line argument, or it is a "Kerbang" script, + in element 0. + + Otherwise element 0 is program name, and elements 1 through \v(argc)-1 + contain the command-line arguments, if any, that appear after "--" or + "=", if any. This array is saved and restored around macro calls; + recall that inside macros it contains the macro argument vector + (allowing you to access arguments programmatically, and to have more + than 9 of them). + + At top level, notice the difference between the \&@[] and \&_[] + arrays. The former includes C-Kermit options; the latter omits them. + _________________________________________________________________ + + 7.17. Dialogs with Timed Responses + + The ASK, ASKQ, GETOK, and GETC commands (let's call them the + "ASK-class commands") let you write scripts that carry on dialogs with + the user, asking them for text, a Yes/No answer, or a character, + respectively. Prior to C-Kermit 7.0, these questions would always wait + forever for an answer. In C-Kermit 7.0, you may specify a time limit + for them with the new command: + + SET ASK-TIMER number + Sets a time-limit on ASK-CLASS commands to the given number of + seconds. If the number is 0 or less, there is no time limit and + these commands wait forever for a response. Any timer that is + established by this command remains in effect for all future + ASK-class commands until another SET ASK-TIMER command is given + (e.g. with a value of 0 to disable ASK timeouts). + + IF ASKTIMEOUT command + An ASK-class command that times out returns a failure status. + You can test explicitly for a timeout with: + _________________________________________________________________ + + 7.18. Increased Flexibility of SWITCH Case Labels + + Prior to C-Kermit 7.0 / K95 1.1.19, the case labels in SWITCH + statements were string constants. + + Now case labels can be variables, function calls, or any mixture of + these with each other and/or with regular characters. + + Furthermore, after the case label is evaluated, it is treated not as a + string constant, but as a pattern against which the SWITCH variable is + matched ([617]Section 4.9.1). + + This introduces a possible incompatibility with previous releases, + since the following characters in case labels are no longer taken + literally: + + \ * ? [ { + + Any scripts that previously included any of these characters in case + labels must now quote them with backslash (\). + _________________________________________________________________ + + 7.19. "Kerbang" Scripts + + In UNIX only, Kermit scripts can be stored in files and run + "directly", without starting Kermit first (as noted on page 467 of the + manual), just as a shell script can be "run" as if it were a program. + This section amplifies on that idea a bit, and presents some new + aspects of version 7.0 that make it easier to write and run Kermit + scripts directly. + + NOTE: On non-UNIX platforms, such as VMS or Windows, Kerbang + scripts can be run as "kermit + scriptfilename arg1 arg2 arg3 ...". + Windows 95/98/NT file associations do not allow for the passing of + parameters. In VMS, however, you can achieve the Kerbang effect by + defining a symbol, as in this example: + + $ autotelnet :== "$SYS$TOOLS:KERMIT.EXE + AUTOTELNET.KSC" + + and then running the script like any other command: + + $ autotelnet xyzcorp.com myuserid + + See [618]Section 9.3 for an explanation of the "+" symbol. + + UNIX shell scripts can specify which shell should run them by + including a "shebang" line at the top, e.g.: + + #!/bin/sh + + (but not indented; the shebang line must be on the left margin). The + term "shebang" is a contraction of "shell" and "bang". "Bang" is a + slang word for the exclamation mark ("!"); "shebang" itself is an + American slang word used in in the phrase "the whole shebang". + + We can run Kermit scripts directly too, by including a "shebang" line + that names Kermit as the "shell"; thus we call these "Kerbang" + scripts. This mechanism has been considerably simplified in C-Kermit + 7.0 to facilitate C-Kermit's use a scripting tool just like any of the + UNIX shells or scripting languages. The rules are the same as for + shell scripts: + + 1. The first line of the Kermit script must begin with "#!" + immediately followed by the full pathname of the program that will + execute the script (in this case, C-Kermit rather than a UNIX + shell), followed by any Kermit command-line options. To suppress + execution of the C-Kermit initialization file and to make command + line arguments available to the script, the final option should be + "+": + #!/usr/local/bin/kermit + + Some users have reported that in some circumstances a space might + be necessary after the plus sign; this depends on your shell -- it + has nothing to do with Kermit. In most cases, no space is needed. + 2. The file must have execute permission (granted via "chmod +x + filename"). + + When C-Kermit is invoked from a Kerbang script (or from the system + prompt with a "+" command-line argument, which amounts to the same + thing), the following special rules apply: + + 1. The C-Kermit initialization file is NOT executed automatically. If + you want it to be executed, include a TAKE command for it in the + script, e.g. "take \v(home).kermrc". (In previous releases, the + initialization file was always executed, with no way to prevent it + except for the user to include Kermit-specific command line + options which had nothing to do with the script). Many scripts + have no need for the standard Kermit initialization file, which is + quite lengthy and not only delays startup of the script, but also + spews forth numerous messages that are most likely unrelated to + the script. + 2. If the initialization file is not executed, neither is your + customization file, since the initialization file is the command + file from which the customization file is TAKEn. Again, you can + include a TAKE command for the initialization file if desired, or + for the customization file by itself, or for any other file. + 3. C-Kermit does not process command-line arguments at all. Instead, + it passes all words on the command line after the "+" to the + script as \%0 (the script name), \%1..\%9 (the first nine + arguments), as well as in the argument vector array \&_[]. The + variable \v(argc) is set to the total number of "words" (as passed + by the shell to Kermit) including the script name. Quoting and + grouping rules are those of the shell. + 4. At any point where the script terminates, it must include an EXIT + command if you want it to exit back to the shell; otherwise + C-Kermit enters interactive prompting mode when the script + terminates. The EXIT command can include a numeric status to be + returned to the shell (0, 1, etc), plus an optional message. + + Here is a simple Kerbang script that prints its arguments: + + #/usr/local/bin/kermit + + echo Hello from \%0 + for \%i 0 \v(argc)-1 1 { + echo \%i. "\&_[\%i]" + } + exit 0 + + Save this file as (say) "showargs", then give it execute permission + and run it (the \&_[] array is the same as \%0..\%9, but allows you to + refer to argument variables programmatically; see [619]Section 7.5). + (Yes, you could substitute SHOW ARGUMENTS for the loop.) + + $ chmod +x showargs + $ ./showargs one "this is two" three + + The script displays its arguments: + + Hello from /usr/olga/showargs + 0. "/usr/olga/showargs" + 1. "one" + 2. "this is two" + 3. "three" + $ + + Notice that no banners or greetings are printed and that startup is + instantaneous, just like a shell script. Also notice that grouping of + arguments is determined by *shell* quoting rules, not Kermit ones, + since the command line is parsed by the shell before Kermit ever sees + it. + + Of course you can put any commands at all into a Kerbang script. It + can read and write files, make connections, transfer files, anything + that Kermit can do -- because it *is* Kermit. And of course, Kerbang + scripts can also be executed from the Kermit prompt (or from another + script) with a TAKE command; the Kerbang line is ignored since it + starts with "#", which is a comment introducer to Kermit just as it is + to the UNIX shell. In VMS and other non-UNIX platforms, the Kerbang + line has no effect and can be omitted. + + It might be desireable for a script to know whether it has been + invoked directly from the shell (as a Kerbang script) or by a TAKE + command given to the Kermit prompt or in a Kermit command file or + macro. This can be done as in this example: + + #!/usr/local/bin/kermit + + assign \%m \fbasename(\%0) + define usage { exit 1 {usage: \%m phonenumber message} } + define apage { (definition of APAGE...) } ; (See [620]book pp.454-456) + xif equal "\%0" "\v(cmdfil)" { + if not def \%1 usage + if not def \%2 usage + apage {\%1} {\%2} + exit \v(status) + } + + In a Kerbang script, \%0 and \v(cmdfile) are the same; both of them + are the name of the script. When a script is invoked by a Kermit TAKE + command, \%0 is the name of the Kermit program, but \v(cmdfile) is the + name of the script. In the example above, a macro called APAGE is + defined. If the script was invoked directly, the APAGE macro is also + executed. Otherwise, it is available for subsequent and perhaps + repeated use later in the Kermit session. + + An especially handy use for Kerbang scripts is to have the + initialization file itself be one. Since the standard initialization + file is rather long and time-consuming to execute, it is often + overkill if you want to start Kermit just to transfer a file. Of + course there are command-line switches to suppress initialization-file + execution, etc, but another approach is to "run" the initialization + file when you want its features (notably the services directory), and + run C-Kermit directly when you don't. A setup like this requires that + (a) the C-Kermit initialization file is configured as a Kerbang script + (has #!/path.../kermit as first line), has execute permission, and is + in your PATH; and (b) that you don't have a .kermrc file in your login + directory. + _________________________________________________________________ + + 7.20. IF and XIF Statement Syntax + + The IF command has been improved in two significant ways in C-Kermit + 7.0, described in the following subsections. All changes are backwards + compatible. + + 7.20.1. The IF/XIF Distinction + + The distinction between IF and XIF is no longer important as of + C-Kermit 7.0. You should be able to use IF in all cases (and of + course, also XIF for backwards compatibility). In the past, IF was + used for single-command THEN parts, followed optionally by a separate + ELSE command: + + IF condition command1 ; THEN part + ELSE command2 ; ELSE part + + whereas XIF was required if either part had multiple commands: + + XIF condition { command, command, ... } ELSE { command, command, ... } + + The syntactic differences were primarily that IF / ELSE was two + commands on two separate lines, whereas XIF was one command on one + line, and that XIF allowed (and in fact required) braces around its + command lists, whereas IF did not allow them. + + Furthermore, the chaining or nesting of parts and conditions was + inconsistent. For example, the IF command could be used like this: + + IF condition command + ELSE IF condition command + ELSE IF condition command + ELSE IF condition command + ... + + but XIF could not. C-Kermit 7.0 accepts the old syntax and executes it + the same as previous versions, but also accepts a new unified and more + convenient syntax: + + IF condition command-list [ ELSE command-list ] + + or: + +IF condition command-list +ELSE command-list + + in which the ELSE part is optional, and where command-list can be a + single command (with or without braces around it) or a list of + commands enclosed in braces. Examples: + + Example 1: + + IF condition { command1, command2 } ELSE { command3, command4 } + + Example 2 (same as Example 1): + + IF condition { + command1 + command2 + } ELSE { + command3 + command4 + } + + Example 3 (same as 1 and 2): + + IF condition { + command1 + command2 + } + ELSE { command3, command4 } + + Example 4 (same as 1-3): + + IF condition { + command1 + command2 + } + ELSE { + command3 + command4 + } + + Example 5 (ELSE can be followed by another command): + + IF condition { + command1 + command2 + } ELSE IF condition { + command3 + command4 + } ELSE { + command5 + command6 + } + + Example 5 suggests other possibilities: + + IF condition { + command1 + command2 + } ELSE FOR variable initial final increment { + command3 + command4 + } + + And this too is possible, except for some non-obvious quoting + considerations: + + dcl \&a[6] = one two three four five six + + IF < \%n 3 { + echo \\%n is too small: \%n + } ELSE FOR \\%i 1 \\%n 1 { + echo \\%i. \\&a[\\%i] + } + + (The loop variable must be quoted in this context to prevent premature + evaluation.) + _________________________________________________________________ + + 7.20.2. Boolean Expressions (The IF/WHILE Condition) + + Prior to C-Kermit 7.0, the IF and WHILE commands accepted only a + single Boolean ("true or false") assertion, e.g. "if > \%m 0 command" + or "if exist filename command". There was no way to form Boolean + expressions and, in particular, nothing that approached a Boolean OR + function (AND could be simulated by concatenating IF statements: "if + condition1 if condition2.."). + + C-Kermit 7.0 (and K95 1.1.19) allow grouping of Boolean assertions + using parentheses and combining them using AND (or &&) and OR (or ||). + Each of these operators -- including the parentheses -- is a field and + must be set off by spaces. AND has higher precedence than OR, NOT has + higher precedence than AND, but parentheses can be used to force any + desired order of evaluation. The old syntax is still accepted. + + Here are some examples: + + define \%z 0 ; Define some variables + define \%n 1 ; for use in the examples. + + if > \%n \%z echo \%n is greater. ; Original format - still accepted. + if ( > \%n \%z ) echo \%n is greater. ; Parentheses may be used in 7.0. + if ( > \%n \%z && not = \%z 0 ) ... ; Two assertions combined with AND. + if ( > \%n \%z and not = \%z 0 ) ... ; Same as previous ("and" = "&&"). + if ( > \%n \%z || not = \%z 0 ) ... ; Two assertions combined with OR. + if ( > \%n \%z or not = \%z 0 ) ... ; Same as previous ("or" = "||"). + if ( > \%n \%z || != \%z 0 ) ... ; Ditto ("!=" = "not ="). + while ( 1 ) { ... } ; Just like C. + + Notice the spaces around all operators including the parentheses -- + these are required. The following examples show how parentheses can be + used to alter the precedence of the AND and OR operators: + + if ( false || false && false || true ) ,.. ; True + if ( false || ( false && false ) || true ) ... ; Same as previous + if ( ( false || false ) && ( false || true ) ) ... ; False + + Similarly for NOT: + + if ( not true && false ) ... ; False (NOT binds to TRUE only) + if ( ( not true ) && false ) ... ; Same as previous + if ( not ( true && false ) ) ... ; True (NOT binds to (TRUE && FALSE)) + + Notes: + + 1. The syntax of the Boolean expression itself has not changed; each + expression begins with a keyword or token such as "EXIST", ">", or + "=", etc; operators such as "<", "=", and ">" do not go between + their operands but precede them as before; this might be called + "reverse reverse Polish notation"; it allows deterministic + on-the-fly parsing of these expressions at the C-Kermit> prompt as + well as in scripts, and allows ?-help to be given for each item + when IF or WHILE commands are typed at the prompt. + 2. Parentheses are required when there is more than one Boolean + assertion. + 3. Parentheses are not required, but are allowed, when there is only + one Boolean assertion. + 4. Evaluation of Boolean assertions occurs left to right, but the + resulting Boolean expression is evaluated afterwards according to + the rules of precedence. All Boolean assertions are always + evaluated; there is no "early stopping" property and therefore no + question about when or if side effects will occur -- if any + Boolean assertion has side effects, they will always occur. + + Constructions of arbitrary complexity are possible, within reason. + + Also see [621]Section 7.4 for new IF / WHILE conditions. + _________________________________________________________________ + + 7.21. Screen Formatting and Cursor Control + + C-Kermit 7.0 adds a simple way to create formatted screens, the SCREEN + command: + + SCREEN { CLEAR, CLEOL, MOVE-TO row [ column ] } + Performs screen-formatting actions. Correct operation of these + commands depends on proper terminal setup on both ends of the + connection -- mainly that the host terminal type is set to + agree with the kind of terminal or the emulation you are + viewing C-Kermit through. The UNIX version uses terminfo or + termcap (not curses); the VMS version uses SMG; K-95 uses its + built in screen manager. + + SCREEN CLEAR + Moves the cursor to home position and clears the entire screen. + Synonyms: CLEAR COMMAND-SCREEN ALL (K-95 only), CLS, CLEAR + SCREEN. + + SCREEN CLEOL + Clears from the current cursor position to the end of the line. + Synonym: CLEAR COMMAND-SCREEN EOL (K-95 only) + + SCREEN MOVE-TO row column + Moves the cursor to the indicated row and column. The row and + column numbers are 1-based, so on a 24x80 screen the home + position is 1 1 and the lower right corner is 24 80. If a row + or column number is given that too large for what Kermit or the + operating system thinks is your screen size, the appropriate + number is substituted. + + These escape sequences used by these commands depends on the platform. + In UNIX, your TERM environment variable is used to query the + terminfo/termcap database; if the query fails, ANSI/VT100 sequences + are used. In VMS, the SMG library is used, which sends sequences based + on your VMS terminal type. K95 does its own screen control. On other + platforms (such as AOS/VS, VOS, etc), screen formatting is not + supported, and the SCREEN command does nothing. + + The three SCREEN actions can be used in scripts to produce menus, + formatted screens, dynamic displays, etc. Related variables include: + + \v(terminal) The type terminal C-Kermit thinks you have. + \v(rows) The number of rows C-Kermit thinks your terminal has. + \v(columns) The number of columns C-Kermit thinks your terminal has. + + And functions: + + \fscrncurx() The current X coordinate of the cursor (K-95 only). + \fscrncury() The current Y coordinate of the cursor (K-95 only). + \fscrnstr(x,y,n) The string of length nat position (x,y) (K-95 only). + + And commands: + + ECHO string Writes string + CRLF at the current cursor position. + XECHO string Writes string at current cursor position; CRLF not supplied. + GETC v prompt Issues prompt, reads one character into variable v, no echo. + + And special characters: + + Ctrl-L At the C-Kermit> command prompt, or in a C-Kermit command, + works like Return or Enter, but also clears the screen + + Example 1: A macro that prints a message \%1 at cursor position + (\%2,\%3): + + define MSG { + if not def \%3 def \%3 0 ; Default column to 0 + if > \v(argc) 2 screen move \%2 \%3 ; Move to given row/col (if any) + screen cleol ; Clear to end of line + if def \%1 xecho \fcontents(\%1) ; Print message (if any) + } + + Example 2: A macro put the cursor on the bottom screen line, left + margin: + + define BOT { + screen move \v(rows) 0 + } + + Example 3: A macro to center message \%1 on line \%2. + + define CENTER { + if not def \%2 def \%2 1 + .\%x ::= (\v(cols)-\flen(\%1))/2 + msg {\%1} {\%2} {\%x} + } + + Example 4: A simple menu (building on Examples 1-3): + + def \%c 0 ; Menu choice variable + screen clear ; Clear the screen + center {Welcome to This Menu} 2 ; Display the menu + msg {Choices:} 4 + msg { 1. File} 6 + msg { 2. Edit} 7 + msg { 3. Exit} 8 + while ( != \%c 3 ) { ; Read and verify choice + while true { ; Keep trying till we get a good one + screen move 10 ; Move to line 10 + screen cleol ; Clear this line + getc \%c {Your choice: } ; Prompt and get and echo 1 character + xecho \%c + if ( not numeric \%c ) { msg {Not numeric - "\%c"} 12, continue } + if ( >= \%c 1 && <= \%c 3 ) break + msg {Out of range - "\%c"} 12 + } + switch \%c { ; Valid choice - execute it. + :1, msg {Filing... } 12, break + :2, msg {Editing...} 12, break + :3, msg {Exiting...} 12, break + } + } + echo Bye ; Exit chosen - say goodbye. + bot ; Leave cursor at screen bottom. + exit ; And exit. + + Similar scripts can work over the communication connection; substitute + INPUT and OUTPUT for GETC and ECHO/XECHO. + _________________________________________________________________ + + 7.22. Evaluating Arithmetic Expressions + + A new arithmetic operator was added to the list recognized by the + EVALUATE command, the \feval() function, and which can also be used + anywhere else arithmetic expressions are accepted (numeric command + fields, array subscripts, etc): + + Prefix "!" + This operator inverts the "truth value" of the number or + arithmetic expression that follows. If the value of the operand + is 0, the result is 1. If the value is nonzero, the result is + 0. + + Examples: + + set eval old + evaluate 0 + 0 + + evaluate !0 + 1 + + evaluate !3 + 0 + + evaluate !(-3) + 0 + + .\%a = 1 + .\%b = 0 + evaluate !(\%a|\%b) + 0 + + evaluate !(\%a&\%b) + 1 + + evaluate !(!(\%a&\%b)) + 0 + + Note the distinction between Prefix ! (invert truth value) and Suffix + ! (factorial). Also the distinction between Prefix ! and Prefix ~ + (which inverts all the bits in its operand). Also note that prefix + operators (!, -, and ~) can not be adjacent unless you use parentheses + to separate them, as shown in the final example above. + _________________________________________________________________ + + 7.23. Floating-Point Arithmetic + + C-Kermit 7.0 adds limited support for floating-point numbers (numbers + that have fractional parts, like 3.141592653). This support is + provided through a small repertoire of functions and in Boolean + expressions that compare numbers, but does not apply to number parsing + in general, or to expression evaluation, array subscripts, the + INCREMENT and DECREMENT commands, or in any context other than those + listed in this section. + + A floating point number has an optional sign (+ or -), followed by a + series of decimal digits containing either zero or one period (.) + character, which is the decimal point. The use of comma or any other + character besides period as a decimal point is not supported. + Scientific notation is not supported either. Examples of legal + floating-point numbers: + + 0 Integers can be used + 1 Ditto + 2. A decimal point without decimal digits + 3.0 A decimal point with decimal digits + 3.141592653 Ditto + -4.0 A negative sign can be included + +5.0 A positive sign can be included + + Examples of notations that are not accepted: + + 1,000,000 Separators can not be used + 1.000.000 Ditto (or multiple decimal points) + 6.022137E23 No scientific notation + 6.62606868e-34 Ditto + 12.5+6.25 No "bare" expressions + + You can use IF FLOAT test a string or variable to see if it's in + acceptable floating-point format. Example: + + ask \%f { Type a number: } + if not def \%f .\%f = 0.0 + if not float \%f stop 1 Invalid floating-point number: "\%f" + + C-Kermit's floating-point support, like its support for whole numbers + (integers), relies on the capabilities of the underlying computer. + Your computer has only a limited amount of precision for numbers, + depending on its architecture. Thus floating-point numbers that have + too many digits will not be accurate; adding a very small number to a + very large one might have no effect at all; and so on. For details, + read a text on numerical analysis. Example: + + .\%a = 11111111111111111111 ; A long number + .\%b = 22222222222222222222 ; Another one + echo \ffpadd(\%a,\%b) ; Add them - the result should be all 3's + 33333333333333330000.0 ; See the result + + In this example, the computer has 16 digits of precision; after that, + the (low-order) digits are set to 0, since the computer doesn't know + what they really are. In fact, the computer returns random digits, but + Kermit sets all digits beyond the computer's precision to 0. + + C-Kermit's floating-point functions have names of the form + "\ffpxxx(args)" ("\f" for function, "fp" for floating-point), where + "xxx" is replaced by the name of the function, such as "sqrt", and + "args" is the argument list, consisting of one or two floating-point + numbers (depending on the function), and an optional "d" argument that + says now many decimal places should be shown in the result. Example: + + \ffpdiv(10,3,1) returns "3.3" + \ffpdiv(10,3,2) returns "3.33" + \ffpdiv(10,3,3) returns "3.333" + + and so on, up to the precision of the computer. If the decimal-places + argument is less than zero, the fractional part of the result is + truncated: + + \ffpdiv(10,3,-1) returns "3". + + If the decimal-places argument is 0, or is omitted, C-Kermit returns + as many decimal places as are meaningful in the computer's + floating-point precision, truncating any extraneous trailing 0's: + + \ffpdiv(10,8) returns "1.25". + \ffpdiv(10,4) returns "2.5". + \ffpdiv(10,2) returns "5.0". + \ffpdiv(10,3) returns "3.333333333333333" (for 16-digit precision). + + There is no way to request that a floating-point function return a + decimal point but no decimal places. However, this is easy enough to + accomplish in other ways, for example by supplying it outside the + function call: + + echo \ffpadd(\%a,\%b,-1). + + Kermit's floating-point functions always round the result for the + requested number of decimal places when the "d" argument is given and + has a value greater than 0 (see the description of \ffpround() just + below). + + Floating-point arguments can be constants in floating-point format or + variables whose values are floating-point numbers. If a floating-point + argument is omitted, or is a variable with no value, 0.0 is supplied + automatically. Example: + + def \%x 999.999 + undef \%y + echo \ffpmin(\%x,\%y) + 0.0 + + Or equivalently: + + echo \ffpmin(999.999) + 0.0 + + The floating-point functions are: + + \ffpround(f1,d) + Returns f1 rounded to d decimal places. For this function only, + d = 0 (or d omitted) has a special meaning: return the integer + part of f1 rounded according to the fractional part. Examples: + + \ffpround(2.74653,-1) returns "2" (fraction truncated, no rounding). + \ffpround(2.74653,0) returns "3" (integer part is rounded). + \ffpround(2.74653) returns "3" (d omitted same as d = 0). + \ffpround(2.74653,1) returns "2.7". + \ffpround(2.74653,2) returns "2.75". + \ffpround(2.74653,3) returns "2.747". + \ffpround(2.74653,4) returns "2.7465", etc. + + \ffpadd(f1,f2,d) + Returns the sum of f1 and f2. + + \ffpsubtract(f1,f2,d) + Subtracts f2 from f1 and returns the result. + + \ffpmultiply(f1,f2,d) + Returns the product of f1 and f2. + + \ffpdivide(f1,f2,d) + If f2 is not 0, divides f1 by f2 and returns the quotient. + If f2 is 0, a DIVIDE_BY_ZERO error occurs. + + \ffpraise(f1,f2,d) + If f1 = 0 and f2 <= 0, or if f1 < 0 and f2 has a fractional + part, an ARG_OUT_OF_RANGE error occurs; otherwise f1 raised to + the f2 power is returned. + + \ffpsqrt(f1,d) + If f1 >= 0, returns the square root of f1; otherwise + ARG_OUT_OF_RANGE. + + \ffpabsolute(f1,d) + Returns the absolute value of f1 (i.e. f1 without a sign). This + is the floating-point analog of \fabsolute(n1). + + \ffpint(f1) + Returns the integer part of f1. Equivalent to \ffpround(f1,-1). + + \ffpexp(f1,d) + The base of natural logarithms, e (2.718282...), raised to the + f1 power. + + \ffplogn(f1,d) + The natural logarithm of f1 (the power to which e must be + raised to obtain f1). + + \ffplog10(f1,d) + The base-10 logarithm of f1 (the power to which 10 must be + raised to obtain f1). + + \ffpmodulus(f1,f2,d) + If f2 is not 0, the remainder after dividing f1 by f2. + If f2 is 0, a DIVIDE_BY_ZERO error occurs. + This is the floating-point analog of \fmod(n1,n2). + + \ffpmaximum(f1,f2,d) + Returns the maximum of f1 and f2. This is the floating-point + analog of \fmax(n1,n2). + + \ffpminimum(f1,f2,d) + Returns the minimum of f1 and f2. This is the floating-point + analog of \fmin(n1,n2). + + \ffpsine(f1,d) + Returns the sine of f1 radians. + + \ffpcosine(f1,d) + Returns the cosine of f1 radians. + + \ffptangent(f1,d) + Returns the tangent of f1 radians. + + Note that all of these functions can be used with integer arguments. + If you want an integer result, specify d = -1 (to truncate) or feed + the result to \ffpround(xxx,0) (to round). + + Floating-point numbers (or variables or functions that return them) + can be used in Boolean expressions (see [622]Section 7.20.2) that + compare numbers: + + = x y + != x y + < x y + > x y + <= x y + >= x y + + In these examples, x and y can be either integers or floating-point + numbers in any combination. In an arithmetic comparison of an integer + and a floating-point number, the integer is converted to + floating-point before the comparison is made. Examples: + + .\%t = 3.000000000 + .\%f = 3.141592653 + .\%i = 3 + + if > \%f \%i echo Pi is greater. + if = \%t \%i echo "\%i" = "\%t". + + A floating-point number can also be used in: + + IF number command + + where the command is executed if the number is nonzero. If the number + is floating-point, the command is not executed if the number is 0.0, + and is executed otherwise. + + Floating-point numbers can be sorted using ARRAY SORT /NUMERIC (see + [623]Section 7.10.5 ). + + Two floating-point constants are provided: + + \v(math_pi) = Pi (3.141592653...) + \v(math_e) = e, the base of natural logarithms (2.71828...) + + These are given to the computer's precision, e.g. 16 digits. This + number itself is available in a variable: + + \v(math_precision) + How many significant digits in a floating-point number. + _________________________________________________________________ + + 7.24. Tracing Script Execution + + The TRACE command is handy for debugging scripts. + + TRACE [ { /ON, /OFF } ] [ { ASSIGNMENTS, COMMAND-LEVEL, ALL } ] + Selects tracing of the given object. + + Optional switches are /ON and /OFF. If no switch is given, /ON is + implied. The trace objects are ASSIGNMENTS, COMMAND-LEVEL, and ALL. + The default object is ALL, meaning to select all trace objects + (besides ALL). Thus TRACE by itself selects tracing of everything, as + does TRACE /ON, and TRACE /OFF turns off all tracing. + + When tracing of ASSIGNMENTS is on, every time the value of any + user-defined variable or macro changes, C-Kermit prints one of the + following: + + >>> name: "value" + The name of the variable or macro followed by the new value in + quotes. This includes implicit macro-parameter assignments + during macro invocation. + + >>> name: (undef) + This indicates that the variable or macro has been undefined. + + <<< name: "value" + For RETURN statements: the name of the macro and the return + value. + + <<< name: (null) + For RETURN statements that include no value or an empty value. + + When tracing of COMMAND-LEVEL is on, C-Kermit prints: + + [n] +F: "name" + Whenever a command file is entered, where "n" is the command + level (0 = top); the name of the command file is shown in + quotes. + + [n] +M: "name" + Whenever a macro is entered; "n" is the command level. The name + of the macro is shown in quotes. + + [n] -F: "name" + Whenever a command file is reentered from below, when a macro + or command file that it has invoked has returned. + + [n] -M: "name" + Whenever a macro is reentered from below. + + For other debugging tools, see SHOW ARGS, SHOW STACK, SET TAKE, SET + MACRO, and of course, ECHO. + _________________________________________________________________ + + 7.25. Compact Substring Notation + + It is often desirable to extract a substring from a string which is + stored in a variable, and for this we have the \fsubstring() function, + which is used like this: + + define \%a 1234567890 + echo \fsubstring(\%a,3,4) ; substring from 3rd character length 4 + 3456 + + or like this with macro-named variables: + + define string 1234567890 + echo \fsubstring(\m(string),3,4) + 3456 + + C-Kermit 7.0 adds a pair of alternative compact notations: + +\:(variablename[start:length]) <-- Substring of variable's value +\s(macroname[start:length]) <-- Substring of macro's definition + + These are exactly equivalent to using \fsubstring(), except more + compact to write and also faster since evaluation is in one step + instead of two. + + The "\:()" notation can be used with any Kermit variable, that is, + almost anything that starts with a backslash: + + \:(\%a[2:6]) <-- equivalent to \fsubstring(\%a,2,6) + \:(\&x[1][2:6]) <-- equivalent to \fsubstring(\&x[1],2,6) + \:(\m(foo)[2:6]) <-- equivalent to \fsubstring(\m(foo),2,6) + \:(\v(time)[2:6]) <-- equivalent to \fsubstring(\v(time),2,6) + \:(\$(TERM)[2:6]) <-- equivalent to \fsubstring(\$(TERM),2,6) + \:(ABCDEFGH[2:6]) <-- equivalent to \fsubstring(ABCDEFGH,2,6) + + Whatever appears between the left parenthesis and the left bracket is + evaluated and then the indicated substring of the result is returned. + + The "\s()" notation is the same, except after evaluating the variable, + the result is treated as a macro name and is looked up in the macro + table. Then the indicated substring of the macro definition is + returned. Example: + + define testing abcdefghijklmnopqrstuvwxyz + define \%a testing + + \s(testing[2:6]) --> bcdefg + \:(testing[2:6]) --> esting + \:(\%a[2:6]) --> esting + \s(\%a[2:6]) --> bcdefg + + Note that the following two examples are equivalent: + + \:(\m(foo)[2:6]) + \s(foo[2:6]) + + The first number in the brackets is the 1-based starting position. If + it is omitted, or less than 1, it is treated as 1. If it is greater + than the length of the string, an empty string is returned. + + The second number is the length of the desired substring. If the + second number is omitted, is less than 0, or would be past the end of + the string, then "through the end of the string" is assumed. If it is + 0, the empty string is returned. + + If the brackets are empty or omitted, the original string is returned. + + The starting position and length need not be literal numbers; they can + also be variables, functions, arithmetic expressions, or even other + \s() or \:() quantities; anything that evaluates to a number, for + example: + + \s(block[1025:\fhex2n(\s(block[\%b:\%n+4]))/2]) + + Syntactically, \m(name) and \s(name) differ only in that the sequence + [*] at the end of the name (where * is any sequence of 0 or more + characters) is treated as substring notation in \s(name), but is + considered part of the name in \m(name) (to see why, see [624]Section + 7.10.9). + _________________________________________________________________ + + 7.26. New WAIT Command Options + + The WAIT command has been extended to allow waiting for different + kinds of things (formerly it only waited for modem signals). Now it + also can wait for file events. + + 7.26.1. Waiting for Modem Signals + + The previous syntax: + + WAIT time { CD, DSR, RTS, RI, ... } + + has changed to: + + WAIT time MODEM-SIGNALS { CD, DSR, RTS, RI, ... } + + However, the previous syntax is still accepted. The behavior is the + same in either case. + _________________________________________________________________ + + 7.26.2. Waiting for File Events + + The new WAIT option: + + WAIT time FILE { CREATION, DELETION, MODIFICATION } filename + + lets you tell Kermit to wait the given amount of time (or until the + given time of day) for a file whose name is filename to be created, + deleted, or modified, respectively. The filename may not contain + wildcards. If the specified event does not occur within the time + limit, or if WAIT CANCELLATION is ON and you interrupt from the + keyboard before the time is up, the WAIT command fails. If the event + is MODIFICATION and the file does not exist, the command fails. + Otherwise, if the given event occurs within the time limit, the + command succeeds. Examples: + + WAIT 600 FILE DELETION oofa.tmp + Wait up to 10 minutes for file oofa.tmp to disappear. + + WAIT 23:59:59 FILE MOD orders.db + Wait until just before midnight for the orders.db file to be + changed. + + Example: Suppose you want to have the current copy of /etc/motd on + your screen at all times, and you want to hear a bell whenever it + changes: + + def \%f /etc/motd ; The file of interest. + while 1 { ; Loop forever... + cls ; Clear the screen. + echo \%f: \v(date) \v(time)... ; Print 2-line heading... + echo + if ( not exist \%f ) { ; If file doesn't exist, + echo \%f does not exist... ; print message, + wait 600 file creat \%f ; and wait for it to appear. + continue + } + beep ; Something new - beep. + type /head:\v(rows-2) \%f ; Display the file + if fail exit 1 \%f: \ferrstring() ; (checking for errors). + wait 999 file mod \%f ; Wait for it to change. + } + + This notices when the file is created, deleted, or modified, and acts + only then (or when you interrupt it with); the time shown in the + heading is the time of the most recent event (including when the + program started). + + See [625]Section 1.10, where the \v(kbchar) variable is explained. + This lets you modify a loop like the one above to also accept + single-character commands, which interrupt the WAIT, and dispatch + accordingly. For example: + + wait 999 file mod \%f ; Wait for the file to change. + if defined \v(kbchar) { ; Interrupted from keyboard? + switch \v(kbchar) { ; Handle the keystroke... + :q, exit ; Q to Quit + :h, echo blah blah, break ; H for Help + :default, beep, continue ; Anything else beep and ignore + } + } + + This lets you write event-driven applications that wait for up to + three events at once: a file or modem event, a timeout, and a + keystroke. + _________________________________________________________________ + + 7.27. Relaxed FOR and SWITCH Syntax + + For consistency with the extended IF and WHILE syntax, the FOR and + SWITCH control lists may (but need not be) enclosed in parentheses: + + FOR ( \%i 1 \%n 1 ) { command-list... } + SWITCH ( \%c ) { command-list... } + + In the FOR command, the increment item can be omitted if the control + list is enclosed in parentheses, in which case the increment defaults + appropriately to 1 or -1, depending on the values of the first two + variables. + + As with IF, the parentheses around the FOR-command control list must + be set off by spaces (in the SWITCH command, the spaces are not + required since the SWITCH expression is a single arithmetic + expression). + + Also, outer braces around the command list are supplied automatically + if you omit them, e.g.: + + FOR ( \%i 1 %n 1 ) echo \%i + _________________________________________________________________ + + 8. USING OTHER FILE TRANSFER PROTOCOLS + + In C-Kermit 7.0, alternative protocols can be selected using switches. + Switches are described in [626]Section 1.5; the use of + protocol-selection switches is described in [627]Section 4.7.1. + Example: + + send /binary /protocol:zmodem x.tar.gz + + Note that file transfer recovery works only with Kermit and Zmodem + protocols. With Zmodem, recovery can be initiated only by the sender. + + Only pre-1988 versions of the publicly-distributed sz/rz programs use + Standard I/O; those released later than that do not use Standard I/O + and therefore do not work with REDIRECT. However, Omen Technology does + offer an up-to-date redirectable version called crzsz, which must be + licensed for use: + + "Unix Crz and Csz support XMODEM, YMODEM, and ZMODEM transfers when + called by dial-out programs such as Kermit and certain versions of + cu(1). They are clients designed for this use. + + "Crz and Csz are Copyrighted shareware programs. Use of these + programs beyond a brief evaluation period requires registration. + Please print the "mailer.rz" file, fill out the form and return + same with your registration." + + To use the crzsz programs as your external XYZMODEM programs in + C-Kermit, follow the instructions in the book, but put a "c" before + each command, e.g.: + + set protocol zmodem {csz %s} {csz -a %s} crz crz crz crz + + To use Zmodem protocol over Telnet or other non-transparent + connections, you might need to add the -e (Escape) option: + + set protocol zmodem {csz -e %s} {csz -e -a %s} crz crz crz crz + _________________________________________________________________ + + 9. COMMAND-LINE OPTIONS + + 9.0. Extended-Format Command-Line Options + + Standard UNIX command line options are a single letter. C-Kermit has + run out of letters, so new options are in a new extended format: + + --word[:arg] + + where a keyword (rather than a single letter) specifies the function, + and if an argument is to be included, it is separated by a colon (or + equal sign). Most of the new extended-format command-line options are + only for use with the Internet Kermit Service Daemon; see the + [628]IKSD Administration Guide for details. However, several of them + are also general in nature: + + --nointerrupts + Disables keyboard interrupts that are normally enabled, which + are usually Ctrl-C (to interrupt a command) and Ctrl-Z (UNIX + only, to suspend C-Kermit). + + --help + Lists the extended command-line options that are available in + your version of C-Kermit. If any options seem to be missing, + that is because your copy of C-Kermit was built with + compile-time options to deselect them. + + --helpfile:filename + Specifies the name of a file to be displayed if the user types + HELP (not followed by a specific command or topic), in place of + the built-in top-level help text. The file need not fit on one + screen; more-prompting is used if the file is more than one + screen long if COMMAND MORE-PROMPTING is ON, as it is by + default. + + --bannerfile:filename + The name of a file containing a message to be printed after the + user logs in, in place of the normal message (Copyright notice, + "Type HELP or ? for help", "Default transfer mode is...", etc). + + --cdmessage:{on,off,0,1,2} + For use in the Server-Side Server configuration; whenever the + client tells the server to change directory, the server sends + the contents of a "read me" file to the client's screen. This + feature is On by default, and operates only in client/server + mode when ON or 1. If set to 2 or higher, it also operates when + the CD command is given at the IKSD> prompt. Synonym: --cdmsg. + + --cdfile:filename + When cdmessage is on, this is the name of the "read me" file to + be sent. Normally you would specify a relative (not absolute) + name, since the file is opened using the literal name you + specified, after changing to the new directory. Example: + + --cdfile:READ.ME + + You can also give a list of up to 8 filenames by (a) enclosing + each filename in braces, and (b) enclosing the entire list in + braces. Example: + --cdfile:{{./.readme}{READ.ME}{aaareadme.txt}{README}{read-this + -first}} When a list is given, it is searched from left to + right and the first file found is displayed. The default list + for UNIX is: + + {{./.readme}{README.TXT}{READ.ME}} + _________________________________________________________________ + + 9.1. Command Line Personalities + + Beginning in version 7.0, if the C-Kermit binary is renamed to + "telnet" (or TELNET.EXE, telnet.pr, etc, depending on the platform), + it accepts the Telnet command line: + + telnet [ host [ port ] ] + + In Unix, you can achieve the same effect with a symlink: + + cd /usr/bin + mv telnet oldtelnet + ln -ls /usr/local/bin/kermit telnet + + When installed in this manner, C-Kermit always reads its + initialization file. If no host (and therefore no port) is given, + C-Kermit starts in interactive prompting mode. If a host is given as + the first command-line argument, C-Kermit makes a connection to it. + The host argument can be an IP host name or address, or the name of a + TCP/IP entry in your C-Kermit network directory. + + If a port is given, it is used. If a port is not given, then if the + hostname was found in your network directory and port was also listed + there, then that port is used. Otherwise port 23 (the Telnet port) is + used. + + When C-Kermit is called "telnet" and it is invoked with a hostname on + the command line, it exits automatically when the connection is + closed. While the connection is open, however, you may escape back and + forth as many times as you like, transfer files, etc. + + An rlogin personality is also available, but it is less useful, at + least in UNIX and VMS, where the Rlogin TCP port is privileged. + + The new variable \v(name) indicates the name with which C-Kermit was + invoked ("kermit", "wermit", "k95", "telnet", etc). + _________________________________________________________________ + + 9.2. Built-in Help for Command Line Options + + "kermit -h", given from the system prompt, lists as many command-line + options as will fit on a standard 24x80 screen. For more comprehensive + help, use the interactive HELP OPTIONS command that was added in + C-Kermit 7.0: + + HELP OPTIONS + Explains how command-line options work, their syntax, etc. + + HELP OPTIONS ALL + Lists all command-line options and gives brief help about each one. + + HELP OPTION x + Gives brief help about option "x". + + HELP EXTENDED-OPTIONS + Lists the available extended-format command-line options. + + HELP EXTENDED-OPTION xxx + Gives help for the specified extended option. + _________________________________________________________________ + + 9.3. New Command-Line Options + + Command-line options added since C-Kermit 6.0 are: + + + + (plus sign by itself): The next argument is the name of a + script to execute; all subsequent arguments are ignored by + C-Kermit itself, but passed to the script as top-level copies + of \%1, \%2, etc; the \&_[] is also set accordingly. \%0 and + \&_[0] become the name of the script file, rather than the + pathname of the C-Kermit program, which is its normal value. + Primarily for use in the top line of "Kerbang" scripts in UNIX + (see [629]Section 7.19). Example from UNIX command line: + + $ kermit [ regular kermit args ] + filename + + Sample first line of Kerbang script: + + #!/usr/local/bin/kermit + + + -- + (two hyphens surrounded by whitespace) Equivalent to "=", for + compatibility with UNIX getopt(1,3). + + -G + GET (like -g), but send the incoming file to standard output. + Example: "kermit -G oofa.txt | lpr" retrieves a file from your + local computer (providing it is running a Kermit program that + supports the autodownload feature and has it enabled) and + prints it. + + -O + equivalent to -x (start up in server mode), but exits after the + first client command has been executed (mnemonic: O = Only + One). This one is handy replacing "kermit -x" in the + "automatically start Kermit on the other end" string: + + set protocol kermit {kermit -ir} {kermit -r} {kermit -x} + + since -x leaves the remote Kermit in server mode after the + transfer, which can be confusing, whereas -O makes it go away + automatically after the transfer. + + -L + Recursive, when used in combination with -s (mnemonic: L = + Levels). In UNIX or other environments where the shell expands + wildcards itself, the -s argument, if it contains wildcards, + must be quoted to prevent this, e.g.: + + kermit -L -s "*.c" + + In UNIX only, "kermit -L -s ." means to send the current + directory tree. See [630]Sections 4.10 and [631]4.11 about + recursive file transfer. + + -V + Equivalent to SET FILE PATTERNS OFF ([632]Section 4.3) and SET + TRANSFER MODE MANUAL. In other words, take the FILE TYPE + setting literally. For example, "kermit -VT oofa.bin" means + send the file in Text mode, no matter what its name is and no + matter whether a kindred spirit is recognized at the other end + of the connection. + + -0 + (digit zero) means "be 100% transparent in CONNECT mode". This + is equivalent to the following series of commands: SET PARITY + NONE, SET COMMAND BYTESIZE 8, SET TERMINAL BYTESIZE 8, SET FLOW + NONE, SET TERM ESCAPE DISABLED, SET TERM CHAR TRANSPARENT, SET + TERM AUTODOWNLOAD OFF, SET TERM APC OFF, SET TELOPT KERMIT + REFUSE REFUSE. + _________________________________________________________________ + + 10. C-KERMIT AND G-KERMIT + + Every multifunctioned and long-lived software program grows in + complexity and size over time to meet the needs and requests of its + users and the demands of the underlying technology as it changes. + + Eventually users begin to notice how big the application has grown, + how much disk space it occupies, how long it takes to load, and they + start to long for the good old days when it was lean and mean. Not + long after that they begin asking for a "light" version that only does + the basics with no frills. + + And so it is with C-Kermit. A "light" version of Kermit was released + (for UNIX only) in December 1999 under the GNU General Public License; + thus it is called G-Kermit (for GNU Kermit). All it does is send and + receive files, period. You can find it at: + + [633]http://www.columbia.edu/kermit/gkermit.html + + Where the C-Kermit 7.0 binary might be anywhere from 1 to 3 million + bytes in size, the G-Kermit binary ranges from 30K to 100K, depending + on the underlying architecture (RISC vs CISC, etc). + + G-Kermit and C-Kermit may reside side-by-side on the same computer. + G-Kermit does not make connections; it does not have a script + language; it does not translate character sets. G-Kermit may be used + instead of C-Kermit when: + + * It is on the remote end. + * Files are to be transferred in binary mode or in text mode without + character-set translation. + * File timestamps don't need to be preserved. + + In such cases G-Kermit might be preferred since it generally starts up + faster, and yet transfers files just as fast on most (but not + necessarily all) kinds of connections; for example, it supports + streaming ([634]Section 4.20). + + G-Kermit is also handy for bootstrapping. It is easier to load on a + new computer than C-Kermit -- it fits on a floppy diskette with plenty + of room to spare. Thus if you have (say) an old PC running (say) SCO + Xenix and no network connection, you can download the Xenix version of + G-Kermit to (say) a DOS or Windows PC, copy it to diskette, read the + diskette on Xenix with "dosread", and then use G-Kermit to receive + C-Kermit (which does not fit on a diskette). If diskettes aren't an + option, other bootstrapping methods are possible too -- see the + [635]G-Kermit web page for details. + _________________________________________________________________ + +III. APPENDICES + + III.1. Character Set Tables + + III.1.1. The Hewlett Packard Roman8 Character Set + +dec col/row oct hex description +160 10/00 240 A0 (Undefined) +161 10/01 241 A1 A grave +162 10/02 242 A2 A circumflex +163 10/03 243 A3 E grave +164 10/04 244 A4 E circumflex +165 10/05 245 A5 E diaeresis +166 10/06 246 A6 I circumflex +167 10/07 247 A7 I diaeresis +168 10/08 250 A8 Acute accent +169 10/09 251 A9 Grave accent +170 10/10 252 AA Circumflex accent +171 10/11 253 AB Diaeresis +172 10/12 254 AC Tilde accent +173 10/13 255 AD U grave +174 10/14 256 AE U circumflex +175 10/15 257 AF Lira symbol +176 11/00 260 B0 Top bar (macron) +177 11/01 261 B1 Y acute +178 11/02 262 B2 y acute +179 11/03 263 B3 Degree Sign +180 11/04 264 B4 C cedilla +181 11/05 265 B5 c cedilla +182 11/06 266 B6 N tilde +183 11/07 267 B7 n tilde +184 11/08 270 B8 Inverted exclamation mark +185 11/09 271 B9 Inverted question mark +186 11/10 272 BA Currency symbol +187 11/11 273 BB Pound sterling symbol +188 11/12 274 BC Yen symbol +189 11/13 275 BD Paragraph +190 11/14 276 BE Florin (Guilder) symbol +191 11/15 277 BF Cent symbol +192 12/00 300 C0 a circumflex +193 12/01 301 C1 e circumflex +194 12/02 302 C2 o circumflex +195 12/03 303 C3 u circumflex +196 12/04 304 C4 a acute +197 12/05 305 C5 e acute +198 12/06 306 C6 o acute +199 12/07 307 C7 u acute +200 12/08 310 C8 a grave +201 12/09 311 C9 e grave +202 12/10 312 CA o grave +203 12/11 313 CB u grave +204 12/12 314 CC a diaeresis +205 12/13 315 CD e diaeresis +206 12/14 316 CE o diaeresis +207 12/15 317 CF u diaeresis +208 13/00 320 D0 A ring +209 13/01 321 D1 i circumflex +210 13/02 322 D2 O with stroke +211 13/03 323 D3 AE digraph +212 13/04 324 D4 a ring +213 13/05 325 D5 i acute +214 13/06 326 D6 o with stroke +215 13/07 327 D7 ae digraph +216 13/08 330 D8 A diaeresis +217 13/09 331 D9 i grave +218 13/10 332 DA O diaeresis +219 13/11 333 DB U diaeresis +220 13/12 334 DC E acute +221 13/13 335 DD i diaeresis +222 13/14 336 DE German sharp s +223 13/15 337 DF O circumflex +224 14/00 340 E0 A acute +225 14/01 341 E1 A tilde +226 14/02 342 E2 a tilde +227 14/03 343 E3 Icelandic Eth +228 14/04 344 E4 Icelandic eth +229 14/05 345 E5 I acute +230 14/06 346 E6 I grave +231 14/07 347 E7 O acute +232 14/08 350 E8 O grave +233 14/09 351 E9 O tilde +234 14/10 352 EA o tilde +235 14/11 353 EB S caron +236 14/12 354 EC s caron +237 14/13 355 ED U acute +238 14/14 356 EE Y diaeresis +239 14/15 357 EF y diaeresis +240 15/00 360 F0 Icelandic Thorn +241 15/01 361 F1 Icelandic thorn +242 15/02 362 F2 Middle dot +243 15/03 363 F3 Greek mu +244 15/04 364 F4 Pilcrow sign +245 15/05 365 F5 Fraction 3/4 +246 15/06 366 F6 Long dash, horizontal bar +247 15/07 367 F7 Fraction 1/4 +248 15/08 370 F8 Fraction 1/2 +249 15/09 371 F9 Feminine ordinal +250 15/10 372 FA Masculine ordinal +251 15/11 373 FB Left guillemot +252 15/12 374 FC Solid box +253 15/13 375 FD Right guillemot +254 15/14 376 FE Plus or minus sign +255 15/15 377 FF (Undefined) + _________________________________________________________________ + + III.1.2. Greek Character Sets + + III.1.2.1. The ISO 8859-7 Latin / Greek Alphabet = ELOT 928 + +dec col/row oct hex description +160 10/00 240 A0 No-break space +161 10/01 241 A1 Left single quotation mark +162 10/02 242 A2 right single quotation mark +163 10/03 243 A3 Pound sign +164 10/04 244 A4 (UNUSED) +165 10/05 245 A5 (UNUSED) +166 10/06 246 A6 Broken bar +167 10/07 247 A7 Paragraph sign +168 10/08 250 A8 Diaeresis (Dialytika) +169 10/09 251 A9 Copyright sign +170 10/10 252 AA (UNUSED) +171 10/11 253 AB Left angle quotation +172 10/12 254 AC Not sign +173 10/13 255 AD Soft hyphen +174 10/14 256 AE (UNUSED) +175 10/15 257 AF Horizontal bar (Parenthetiki pavla) +176 11/00 260 B0 Degree sign +177 11/01 261 B1 Plus-minus sign +178 11/02 262 B2 Superscript two +179 11/03 263 B3 Superscript three +180 11/04 264 B4 Accent (tonos) +181 11/05 265 B5 Diaeresis and accent (Dialytika and Tonos) +182 11/06 266 B6 Alpha with accent +183 11/07 267 B7 Middle dot (Ano Teleia) +184 11/08 270 B8 Epsilon with accent +185 11/09 271 B9 Eta with accent +186 11/10 272 BA Iota with accent +187 11/11 273 BB Right angle quotation +188 11/12 274 BC Omicron with accent +189 11/13 275 BD One half +190 11/14 276 BE Upsilon with accent +191 11/15 277 BF Omega with accent +192 12/00 300 C0 iota with diaeresis and accent +193 12/01 301 C1 Alpha +194 12/02 302 C2 Beta +195 12/03 303 C3 Gamma +196 12/04 304 C4 Delta +197 12/05 305 C5 Epsilon +198 12/06 306 C6 Zeta +199 12/07 307 C7 Eta +200 12/08 310 C8 Theta +201 12/09 311 C9 Iota +202 12/10 312 CA Kappa +203 12/11 313 CB Lamda +204 12/12 314 CC Mu +205 12/13 315 CD Nu +206 12/14 316 CE Ksi +207 12/15 317 CF Omicron +208 13/00 320 D0 Pi +209 13/01 321 D1 Rho +210 13/02 322 D2 (UNUSED) +211 13/03 323 D3 Sigma +212 13/04 324 D4 Tau +213 13/05 325 D5 Upsilon +214 13/06 326 D6 Phi +215 13/07 327 D7 Khi +216 13/08 330 D8 Psi +217 13/09 331 D9 Omega +218 13/10 332 DA Iota with diaeresis +219 13/11 333 DB Upsilon with diaeresis +220 13/12 334 DC alpha with accent +221 13/13 335 DD epsilon with accent +222 13/14 336 DE eta with accent +223 13/15 337 DF iota with accent +224 14/00 340 E0 upsilon with diaeresis and accent +225 14/01 341 E1 alpha +226 14/02 342 E2 beta +227 14/03 343 E3 gamma +228 14/04 344 E4 delta +229 14/05 345 E5 epsilon +230 14/06 346 E6 zeta +231 14/07 347 E7 eta +232 14/08 350 E8 theta +233 14/09 351 E9 iota +234 14/10 352 EA kappa +235 14/11 353 EB lamda +236 14/12 354 EC mu +237 14/13 355 ED nu +238 14/14 356 EE ksi +239 14/15 357 EF omicron +240 15/00 360 F0 pi +241 15/01 361 F1 rho +242 15/02 362 F2 terminal sigma +243 15/03 363 F3 sigma +244 15/04 364 F4 tau +245 15/05 365 F5 upsilon +246 15/06 366 F6 phi +247 15/07 367 F7 khi +248 15/08 370 F8 psi +249 15/09 371 F9 omega +250 15/10 372 FA iota with diaeresis +251 15/11 373 FB upsilon with diaeresis +252 15/12 374 FC omicron with diaeresis +253 15/13 375 FD upsilon with accent +254 15/14 376 FE omega with accent +255 15/15 377 FF (UNUSED) + _________________________________________________________________ + + III.1.2.2. The ELOT 927 Character Set + +dec col/row oct hex description + 32 02/00 40 20 SPACE + 33 02/01 41 21 EXCLAMATION MARK + 34 02/02 42 22 QUOTATION MARK + 35 02/03 43 23 NUMBER SIGN + 36 02/04 44 24 DOLLAR SIGN + 37 02/05 45 25 PERCENT SIGN + 38 02/06 46 26 AMPERSAND + 39 02/07 47 27 APOSTROPHE + 40 02/08 50 28 LEFT PARENTHESIS + 41 02/09 51 29 RIGHT PARENTHESIS + 42 02/10 52 2A ASTERISK + 43 02/11 53 2B PLUS SIGN + 44 02/12 54 2C COMMA + 45 02/13 55 2D HYPHEN, MINUS SIGN + 46 02/14 56 2E PERIOD, FULL STOP + 47 02/15 57 2F SOLIDUS, SLASH + 48 03/00 60 30 DIGIT ZERO + 49 03/01 61 31 DIGIT ONE + 50 03/02 62 32 DIGIT TWO + 51 03/03 63 33 DIGIT THREE + 52 03/04 64 34 DIGIT FOUR + 53 03/05 65 35 DIGIT FIVE + 54 03/06 66 36 DIGIT SIX + 55 03/07 67 37 DIGIT SEVEN + 56 03/08 70 38 DIGIT EIGHT + 57 03/09 71 39 DIGIT NINE + 58 03/10 72 3A COLON + 59 03/11 73 3B SEMICOLON + 60 03/12 74 3C LESS-THAN SIGN, LEFT ANGLE BRACKET + 61 03/13 75 3D EQUALS SIGN + 62 03/14 76 3E GREATER-THAN SIGN, RIGHT ANGLE BRACKET + 63 03/15 77 3F QUESTION MARK + 64 04/00 100 40 COMMERCIAL AT SIGN + 65 04/01 101 41 CAPITAL LETTER A + 66 04/02 102 42 CAPITAL LETTER B + 67 04/03 103 43 CAPITAL LETTER C + 68 04/04 104 44 CAPITAL LETTER D + 69 04/05 105 45 CAPITAL LETTER E + 70 04/06 106 46 CAPITAL LETTER F + 71 04/07 107 47 CAPITAL LETTER G + 72 04/08 110 48 CAPITAL LETTER H + 73 04/09 111 49 CAPITAL LETTER I + 74 04/10 112 4A CAPITAL LETTER J + 75 04/11 113 4B CAPITAL LETTER K + 76 04/12 114 4C CAPITAL LETTER L + 77 04/13 115 4D CAPITAL LETTER M + 78 04/14 116 4E CAPITAL LETTER N + 79 04/15 117 4F CAPITAL LETTER O + 80 05/00 120 50 CAPITAL LETTER P + 81 05/01 121 51 CAPITAL LETTER Q + 82 05/02 122 52 CAPITAL LETTER R + 83 05/03 123 53 CAPITAL LETTER S + 84 05/04 124 54 CAPITAL LETTER T + 85 05/05 125 55 CAPITAL LETTER U + 86 05/06 126 56 CAPITAL LETTER V + 87 05/07 127 57 CAPITAL LETTER W + 88 05/08 130 58 CAPITAL LETTER X + 89 05/09 131 59 CAPITAL LETTER Y + 90 05/10 132 5A CAPITAL LETTER Z + 91 05/11 133 5B LEFT SQUARE BRACKET + 92 05/12 134 5C REVERSE SOLIDUS, BACKSLASH + 93 05/13 135 5D RIGHT SQUARE BRACKET + 94 05/14 136 5E CIRCUMFLEX ACCENT + 95 05/15 137 5F UNDERSCORE + 96 06/00 140 60 ACCENT GRAVE + 97 06/01 141 61 GREEK LETTER ALPHA + 98 06/02 142 62 GREEK LETTER BETA + 99 06/03 143 63 GREEK LETTER GAMMA +100 06/04 144 64 GREEK LETTER DELTA +101 06/05 145 65 GREEK LETTER EPSILON +102 06/06 146 66 GREEK LETTER ZETA +103 06/07 147 67 GREEK LETTER ETA +104 06/08 150 68 GREEK LETTER THETA +105 06/09 151 69 GREEK LETTER IOTA +106 06/10 152 6A GREEK LETTER KAPPA +107 06/11 153 6B GREEK LETTER LAMDA +108 06/12 154 6C GREEK LETTER MU +109 06/13 155 6D GREEK LETTER NU +110 06/14 156 6E GREEK LETTER KSI +111 06/15 157 6F GREEK LETTER OMICRON +112 07/00 160 70 GREEK LETTER PI +113 07/01 161 71 GREEK LETTER RHO +114 07/02 162 72 GREEK LETTER SIGMA +115 07/03 163 73 GREEK LETTER TAU +116 07/04 164 74 GREEK LETTER UPSILON +117 07/05 165 75 GREEK LETTER FI +118 07/06 166 76 GREEK LETTER XI +119 07/07 167 77 GREEK LETTER PSI +120 07/08 170 78 GREEK LETTER OMEGA +121 07/09 171 79 SPACE +122 07/10 172 7A SPACE +123 07/11 173 7B LEFT CURLY BRACKET, LEFT BRACE +124 07/12 174 7C VERTICAL LINE, VERTICAL BAR +125 07/13 175 7D RIGHT CURLY BRACKET, RIGHT BRACE +126 07/14 176 7E TILDE +127 07/15 177 7F RUBOUT, DELETE + _________________________________________________________________ + + III.1.2.3. PC Code Page 869 + + (to be filled in...) + _________________________________________________________________ + + III.2. Updated Country Codes + + Date: Mon, 7 Apr 1997 23:23:49 EDT + From: Dave Leibold + Newsgroups: comp.dcom.telecom + Subject: Ex-USSR Country Codes Profile + Organization: TELECOM Digest + + Ex-USSR Country Codes Profile + 4 April 1997 + + Below is a summary of the country codes that have formed in the wake + of the USSR dissolution, along with some updated findings and reports. + Additional or corrected information on any of these nations would be + welcome (c/o dleibold@else.net). + * Kyrgyz Republic country code 996 will take effect, at least in + Canada, effective 1 May 1997, according to CRTC Telecom Order + 97-464, based on Stentor Tariff Notice 433. There is no indication + whether there will be a permissive dialing period involved or for + how long such a permissive operation would remain. + * Country code 992 was reported as a recent assignment for + Tajikistan, which will be moving from country code 7 at some + unknown time. + * Uzbekistan has its own country code assignment, but I have no + information if this is in service yet or what implementation dates + have been set. + * Kazakstan does not have a known separate country code assignment + at present. It remains in country code 7 for the time being. + * Russia seems destined to keep country code 7. + * Recent news reports speak of some agreements forming between + Russia and Belarus. While there is no outright reunification yet, + there is expected to be much closer ties between the two nations. + Whether this will lead to a reunification of telephone codes + remains to be seen. + + In the table, "Effective" means the date at which the country code + began service (which could vary according to the nation). "Mandatory" + means the date at which the country code 7 is invalid for calls to + that nation. There are a number of question marks since exact dates + have not been collected in all cases. + +CC Nation Effective Mandatory Notes + +370 Lithuania 1993? ??? Announced Jan 1993 +371 Latvia 1993? ??? +372 Estonia 1 Feb 1993? March 1993? +373 Moldova 1993? ??? Announced Jan 1993 +374 Armenia 1 May 1995 1 July 1995 Announced Jan 1995 (ITU) +375 Belarus 16 Apr 1995 1997? +380 Ukraine 16 Apr 1995 Oct 1995? +7 Kazakstan (no known changes) +7 Russia (presumably not changing) +992 Tajikistan ??? ??? Announced 1996-7? +993 Turkmenistan 3 Jan 1997 3 Apr 1997 Canada as of 29 Nov 1996 +994 Azerbaijan Sept 1994? ??? Announced 1992 +995 Georgia 1994? ??? ref: Telecom Digest Oct 1994 +996 Kyrgyz Republic 1 May 1997 ??? ref: Stentor Canada/CRTC +998 Uzbekistan ??? ??? Announced 1996? (ITU) + + Details courtesy Toby Nixon, ITU, Stentor (Canada), CRTC (Canada), + TELECOM Digest (including information collected for the country code + listings). + _________________________________________________________________ + +IV. ERRATA & CORRIGENDA + + The following errors in [636]Using C-Kermit, Second Edition, first + printing, have been noted. + + First, some missing acknowledgements for C-Kermit 6.0: JE Jones of + Microware for help with OS-9, Nigel Roles for his help with Plan 9, + Lucas Hart for help with VMS and Digital UNIX, Igor Kovalenko for his + help with QNX. And later, to Susan Kleinmann for her help with Debian + Linux packaging; Patrick Volkerding for his help with Slackware Linux + packaging; Jim Knoble for his help with Red Hat Linux packaging; and + to dozens of others for sending individual C-Kermit binaries for + varied and diverse platforms. + + Thanks to James Spath for both binaries and reporting many of the + typos noted below. Also to Dat Thuc Nguyen for spotting several typos. + +PAGE REMARKS +COVER "COS" is a misprint. There is no COS. Pretend it says "SCO" or "VOS". + (This is fixed in the second printing.) + xxi Second line: Fred Smith's affiliation should be Computrition. + 83 Change "commands other" to "commands as other" (1st paragraph) + 87 Change "The the" to "The" (2nd paragraph) + 92 "set modem-type user-defined supra" should be "set modem type ..." + 95 Change "VI" to "vi" (1st paragraph) + 96 Change "it it" to "it is" (1st paragraph) + 97 Change "advantage a literal" to "advantage of a literal" (2nd + paragraph) +102 The call-waiting example would be better as SET DIAL PREFIX *70W + (rather than "*70,") because the former will not cause an incorrect + call to be placed with pulse dialing. +123 Third paragraph from bottom: "..otherwise if a your local username.." + should be "..otherwise your local username..". +160 Delete the "it" between "and" and "to" (2nd paragraph) +185 In "When TRANSFER DISPLAY is OFF, C-Kermit skips the display...", + "OFF" should be "NONE". +187 The last paragraph says the "A command" is ignored, should be "S". +194 Change "it known" to "it is known" (4th paragraph). +235 In C-Kermit 7.0, the syntax of the GET command changed. MGET now + must be used to get a list of files and there is no more multiline + GET command. +268 Last paragraph: "effect" should be "affect". +275 In the SET PROTOCOL KERMIT description, the following sentence is + incorrect and should be removed: 'If you omit the commands, the + default ones are restored: "kermit -ir" and "kermit -r" respectively". + The correct information is given at the bottom of page 281. +279 9th line. The decimal value of ST is 156, not 155. +295 In the stepping stones, skip ahead to Chapter 17 on p. 327. +298 Table 16-2, Portuguese entry. Column 4/00 should show section sign, + not acute accent. +316 Other languages written in the Hebrew alphabet include Karaim (a Turkic + language spoken in Lithuania and Poland), Judeo-Kurdish, and Judeo- + Georgian. +332 UNDEFINE definition, change "This just" to "This is just". +344 It might be necessary to set the modem's pulse generation rate when + sending numeric pages; most Hayes compatible modems use the S11 + register for this. +350 Delete "is" from between "It" and "ceases" (4th paragraph) +351 Top - both occurrences of "print \%a" should be "echo \%a". +364 \v(input) and \v(query) out of alphabetical order. +378 In the MYSEND macro, "if not \m(rc) goto bad" should be: + "if \m(rc) goto bad" (remove the "not"). +382-383 It should be stated that the loop control variable must be of the \%a + type, or else an array element; macro names can not be used for this. +383 In line 3, "\%f[\%i]" should be "\&f[\%i]". +383 In the sort example, it should be stated that the array is 1-based. +387 Change "You can list" to "You can get a list" (5th paragraph) +393 \Fverify() description. The 3rd sentence could be stated more clearly + as "If all characters in string2 are also in string1, 0 is returned." +398 Copying \ffiles() results to an array before is not required as of + C-Kermit 7.0 (see [637]Section 7.3). +403 In "(\%a + 3) * (\%b 5)", a minus sign is missing between b and 5. +407 C-Kermit 7.0 no longer supports multiline GET. Change + "get, \%1, \%2" to "get {\%1} {\%2}" or "get /as:{\%2} {\%1}". +409 READ example while loop should be: + while success { echo \m(line), read line } +409 "WRITE file" should be "WRITE keyword" (you can't put a filename there) + (The same applies to WRITE-LINE / WRITELN). +414 \Funhexify() missing from Table 18-3. +425 MINPUT definition, change 2nd "text2" to "text3". +436 Several lines are missing from the UNIXLOGIN macro listing. + After the "xif fail" block, insert: + + out \%1\13 ; Send username, carriage return + inp 5 Password: ; Wait 5 sec for this prompt + if fail end 1 No password prompt + pause ; Wait a sec + out \%2\13 ; Send password + +440 Change "set terminal byteszie" to "set terminal bytesize". + Change "input Password:" to "input 10 Password". +448 Franchise script: "access line" should be "access \m(line)". +453 There are two incorrectly coded IF statements in the DELIVER macro + definition. Replace both occurrences of "if > \%1 \%3 {" with + "xif > \%i \%3 {" (replace "if" by "xif" and "\%1" with "\%i"). +453 "the the" (last paragraph) should be "the". +454 EOT (last paragraph) is End of Transmission, not End of Text. +457 _DEFINE definition: "name constructed" should be "name is constructed". +457 "macro for and" (last paragraph) should be "macro and". +459 Should explain that \v(user) is a legal abbreviation of \v(userid). +480 Figure II-2 is backwards; the least-significant bit is transmitted + first, then up to the highest, and the parity bit last. +534 The VMS Appendix section on Odd Record Lengths no longer applies; + C-Kermit 7.0 handles odd record lengths as well as even ones. +559 Table VIII-3, Portuguese entry. Column 4/00 should show section sign, + not acute accent. +560-563 HP-Roman8 missing from Table VII-4; there wasn't room to squeeze it in. + It is listed in section II(6). +565 "d stroke" in Table VII-5 has the wrong appearance; the stem should + be upright. The letter shown in the table is actually a lowercase + Icelandic eth, which has a curved stem. +601-604 BeBox, BeOS, Plan 9, and probably others not listed in trademarks. +604 The words "SCRIBE TEXT FORMATTER" appear at the end of the last + sentence of the first paragraph of the Colophon. They should have + been in the Index. +Index: Missing entries: SET { SEND, RECEIVE } PATHNAMES, Call waiting, ... + \F() Page 605, add also 413-414 + \Fbreak 389 + \Fcapitalize 390 + \Fchecksum 414 + \Fcrc16 414 + \Fexecute 414 + \Fhexify 390 + \Fltrim 391 + \Frepeat 392 + \Fspawn 392 + \Ftod2secs 399 + \v() built_in Page 606, add also 361-364 + \v(_line) 354, 361 + \v(apcactive) 361 + \v(charset) 362 + \v(cpu) 362 + \v(crc16) 357, 362 + \v(d$xxx) add page 362 + \v(dialnumber) 362 + \v(dialresult) 362 + \v(errno) 362 + \v(errstring) 362 + \v(exedir) 362 + \v(inidir) 363 + \v(ipaddress) 363 + \v(keyboard) 363 + \v(macro) 363 + \v(minput) 363 + \v(m_xxx) 94, 363 + \v(password) 364 + \v(query) 364 + \v(prompt) 364 + \v(speed) 356, 364 + \v(startup) 364 + \v(status) 364 + \v(sysid) 364 + \v(system) 364 + \v(fsize) at lower half page 606 should read \v(tfsize) + \v(xversion) 364 + BEEP Command 40 + SET FLOW 62, 212 + + Figure II-5 on page 493. The pin assignments of the Mini Din-8 + connector are not described anywhere. As noted in the text, these tend + to vary from vendor to vendor. One common arrangement is: + + 1. HSKout (Handshake out -- definition depends on software) + 2. HSKin (Handshake in or external clock) + 3. TxD- + 4. Not used + 5. RxD- + 6. TxD+ + 7. Not used + 8. RxD+ + + Note the "balanced pairs" for Receive Data (RxD) and Transmit Data + (TxD), and the utter lack of modem signals. These connectors follow + the RS-423 standard, rather than RS-232. In some arrangements, Pin 1 + is used for DTR and Pin 2 for CD; in others Pin 1 is RTS and Pin 2 is + CTS. + + Please send reports of other errors to the authors, as well as + suggestions for improvements, additional index entries, and any other + comments: + + [638]kermit@columbia.edu + _________________________________________________________________ + +APPENDIX V. ADDITIONAL COPYRIGHT NOTICES + + The following copyrights cover some of the source code used in the + development of C-Kermit, Kermit 95, or Kermit 95 support libraries. + +/*****************************************************************************/ +/* */ +/* Copyright (c) 1995 by Oy Online Solutions Ltd. */ +/* */ +/* Distribution of this source code is strictly forbbidden. Use of this */ +/* source code is granted to the University of Columbia C-Kermit project */ +/* to be distributed in binary format only. Please familiarize yourself */ +/* with the accompanying LICENSE.P file. */ +/* */ +/*****************************************************************************/ + + used for Xmodem, Ymodem, and Zmodem protocol in Kermit 95 (p95.dll, + p2.dll) + _________________________________________________________________ + + Copyright (c) 1997 Stanford University + + The use of this software for revenue-generating purposes may require a + license from the owners of the underlying intellectual property. + Specifically, the SRP-3 protocol may not be used for + revenue-generating purposes without a license. + + Within that constraint, permission to use, copy, modify, and + distribute this software and its documentation for any purpose is + hereby granted without fee, provided that the above copyright notices + and this permission notice appear in all copies of the software and + related documentation. + + THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INCIDENTAL, + INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT + ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + SOFTWARE. + + Used for Secure Remote Password (TM) protocol (SRP) in C-Kermit, + Kermit 95 (k95.exe, k2.exe, k95crypt.dll, k2crypt.dll) + _________________________________________________________________ + + Copyright 1990 by the Massachusetts Institute of Technology. All + Rights Reserved. + + Export of this software from the United States of America may require + a specific license from the United States Government. It is the + responsibility of any person or organization contemplating export to + obtain such a license before exporting. + + WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + distribute this software and its documentation for any purpose and + without fee is hereby granted, provided that the above copyright + notice appear in all copies and that both that copyright notice and + this permission notice appear in supporting documentation, and that + the name of M.I.T. not be used in advertising or publicity pertaining + to distribution of the software without specific, written prior + permission. M.I.T. makes no representations about the suitability of + this software for any purpose. It is provided "as is" without express + or implied warranty. + + Used for Telnet Authentication Option, Telnet Encryption Option, and + Kerberos (TM) authentication in C-Kermit, Kermit 95 (k95.exe, k2.exe, + k95crypt.dll, k2crypt.dll) + _________________________________________________________________ + + Copyright (c) 1991, 1993 The Regents of the University of California. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. All advertising materials mentioning features or use of this + software must display the following acknowledgement: + + This product includes software developed by the University of + California, Berkeley and its contributors. + 4. Neither the name of the University nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS + BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Used for Telnet Authentication Option, Telnet Encryption Option, and + Kerberos (TM) authentication in C-Kermit, Kermit 95 (k95.exe, k2.exe, + k95crypt.dll, k2crypt.dll) + _________________________________________________________________ + + Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) All rights + reserved. + + This package is an DES implementation written by Eric Young + (eay@cryptsoft.com). The implementation was written so as to conform + with MIT's libdes. + + This library is free for commercial and non-commercial use as long as + the following conditions are aheared to. The following conditions + apply to all code found in this distribution. + + Copyright remains Eric Young's, and as such any Copyright notices in + the code are not to be removed. If this package is used in a product, + Eric Young should be given attribution as the author of that the SSL + library. This can be in the form of a textual message at program + startup or in documentation (online or textual) provided with the + package. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + 1. Redistributions of source code must retain the copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. All advertising materials mentioning features or use of this + software must display the following acknowledgement: This product + includes software developed by Eric Young (eay@cryptsoft.com) + + THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + The license and distribution terms for any publically available + version or derivative of this code cannot be changed. i.e. this code + cannot simply be copied and put under another distrubution license + [including the GNU Public License.] + + The reason behind this being stated in this direct manner is past + experience in code simply being copied and the attribution removed + from it and then being distributed as part of other packages. This + implementation was a non-trivial and unpaid effort. + + Used DES encryption in Kermit 95 (k95crypt.dll, k2crypt.dll) + _________________________________________________________________ + + * This is version 1.1 of CryptoLib + * + * The authors of this software are Jack Lacy, Don Mitchell and Matt Blaze + * Copyright (c) 1991, 1992, 1993, 1994, 1995 by AT&T. + * Permission to use, copy, and modify this software without fee + * is hereby granted, provided that this entire notice is included in + * all copies of any software which is or includes a copy or + * modification of this software and in all copies of the supporting + * documentation for such software. + * + * NOTE: + * Some of the algorithms in cryptolib may be covered by patents. + * It is the responsibility of the user to ensure that any required + * licenses are obtained. + * + * + * SOME PARTS OF CRYPTOLIB MAY BE RESTRICTED UNDER UNITED STATES EXPORT + * REGULATIONS. + * + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR AT&T MAKE ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + + Used for Big Number library in Kermit 95 (k95crypt.dll, k2crypt.dll). + + [ [639]Top ] [ [640]C-Kermit ] [ [641]Kermit Home ] + _________________________________________________________________ + + CKERMIT70.HTM / The Kermit Project / Columbia University / 8 Feb 2000 + +References + + 1. http://www.columbia.edu/kermit/ckermit70.html#contents + 2. http://www.columbia.edu/kermit/ckermit.html + 3. http://www.columbia.edu/kermit/index.htm + 4. mailto:kermit-support@columbia.edu + 5. http://www.columbia.edu/kermit/ + 6. http://www.kermit-project.org/ + 7. http://www.columbia.nyc.ny.us/kermit/ + 8. ftp://kermit.columbia.edu/kermit/f/COPYING.TXT + 9. ftp://kermit.columbia.edu/kermit/f/ckcmai.c + 10. http://www.columbia.edu/kermit/ckermit70.html#xv + 11. http://www.columbia.edu/kermit/ckb2.htm + 12. ftp://kermit.columbia.edu/kermit/f/ckcbwr.txt + 13. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt + 14. ftp://kermit.columbia.edu/kermit/f/ckvbwr.txt + 15. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt + 16. ftp://kermit.columbia.edu/kermit/f/ckermit70.txt + 17. ftp://kermit.columbia.edu/kermit/f/security.txt + 18. http://www.columbia.edu/kermit/security.htm + 19. ftp://kermit.columbia.edu/kermit/f/iksd.txt + 20. http://www.columbia.edu/kermit/iksd.htm + 21. http://www.columbia.edu/kermit/cuiksd.htm + 22. ftp://kermit.columbia.edu/kermit/f/telnet.txt + 23. http://www.columbia.edu/kermit/telnet.htm + 24. ftp://kermit.columbia.edu/kermit/f/COPYING.TXT + 25. http://www.columbia.edu/kermit/k95.html + 26. http://www.opensource.org/ + 27. http://www.columbia.edu/kermit/ckb2.htm + 28. http://www.columbia.edu/kermit/ckermit70.html#xi + 29. http://www.columbia.edu/kermit/ckermit70.html#xii + 30. http://www.columbia.edu/kermit/ckermit70.html#x0 + 31. http://www.columbia.edu/kermit/ckermit70.html#x1 + 32. http://www.columbia.edu/kermit/ckermit70.html#x1.0 + 33. http://www.columbia.edu/kermit/ckermit70.html#x1.1 + 34. http://www.columbia.edu/kermit/ckermit70.html#x1.2 + 35. http://www.columbia.edu/kermit/ckermit70.html#x1.3 + 36. http://www.columbia.edu/kermit/ckermit70.html#x1.4 + 37. http://www.columbia.edu/kermit/ckermit70.html#x1.5 + 38. http://www.columbia.edu/kermit/ckermit70.html#x1.5.1 + 39. http://www.columbia.edu/kermit/ckermit70.html#x1.5.2 + 40. http://www.columbia.edu/kermit/ckermit70.html#x1.5.3 + 41. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4 + 42. http://www.columbia.edu/kermit/ckermit70.html#x1.5.5 + 43. http://www.columbia.edu/kermit/ckermit70.html#x1.6 + 44. http://www.columbia.edu/kermit/ckermit70.html#x1.7 + 45. http://www.columbia.edu/kermit/ckermit70.html#x1.8 + 46. http://www.columbia.edu/kermit/ckermit70.html#x1.9 + 47. http://www.columbia.edu/kermit/ckermit70.html#x1.10 + 48. http://www.columbia.edu/kermit/ckermit70.html#x1.11 + 49. http://www.columbia.edu/kermit/ckermit70.html#x1.11.1 + 50. http://www.columbia.edu/kermit/ckermit70.html#x1.11.2 + 51. http://www.columbia.edu/kermit/ckermit70.html#x1.11.3 + 52. http://www.columbia.edu/kermit/ckermit70.html#x1.11.4 + 53. http://www.columbia.edu/kermit/ckermit70.html#x1.11.5 + 54. http://www.columbia.edu/kermit/ckermit70.html#x1.11.6 + 55. http://www.columbia.edu/kermit/ckermit70.html#x1.11.7 + 56. http://www.columbia.edu/kermit/ckermit70.html#x1.12 + 57. http://www.columbia.edu/kermit/ckermit70.html#x1.13 + 58. http://www.columbia.edu/kermit/ckermit70.html#x1.14 + 59. http://www.columbia.edu/kermit/ckermit70.html#x1.15 + 60. http://www.columbia.edu/kermit/ckermit70.html#x1.16 + 61. http://www.columbia.edu/kermit/ckermit70.html#x1.17 + 62. http://www.columbia.edu/kermit/ckermit70.html#x1.18 + 63. http://www.columbia.edu/kermit/ckermit70.html#x1.19 + 64. http://www.columbia.edu/kermit/ckermit70.html#x1.20 + 65. http://www.columbia.edu/kermit/ckermit70.html#x1.21 + 66. http://www.columbia.edu/kermit/ckermit70.html#x1.22 + 67. http://www.columbia.edu/kermit/ckermit70.html#x1.22.1 + 68. http://www.columbia.edu/kermit/ckermit70.html#x1.22.2 + 69. http://www.columbia.edu/kermit/ckermit70.html#x1.22.3 + 70. http://www.columbia.edu/kermit/ckermit70.html#x1.22.4 + 71. http://www.columbia.edu/kermit/ckermit70.html#x1.22.5 + 72. http://www.columbia.edu/kermit/ckermit70.html#x1.22.6 + 73. http://www.columbia.edu/kermit/ckermit70.html#x1.22.7 + 74. http://www.columbia.edu/kermit/ckermit70.html#x1.22.8 + 75. http://www.columbia.edu/kermit/ckermit70.html#x1.23 + 76. http://www.columbia.edu/kermit/ckermit70.html#x1.24 + 77. http://www.columbia.edu/kermit/ckermit70.html#x2 + 78. http://www.columbia.edu/kermit/ckermit70.html#x2.0 + 79. http://www.columbia.edu/kermit/ckermit70.html#x2.1 + 80. http://www.columbia.edu/kermit/ckermit70.html#x2.1.1 + 81. http://www.columbia.edu/kermit/ckermit70.html#x2.1.2 + 82. http://www.columbia.edu/kermit/ckermit70.html#x2.1.3 + 83. http://www.columbia.edu/kermit/ckermit70.html#x2.1.4 + 84. http://www.columbia.edu/kermit/ckermit70.html#x2.1.5 + 85. http://www.columbia.edu/kermit/ckermit70.html#x2.1.6 + 86. http://www.columbia.edu/kermit/ckermit70.html#x2.1.7 + 87. http://www.columbia.edu/kermit/ckermit70.html#x2.1.8 + 88. http://www.columbia.edu/kermit/ckermit70.html#x2.1.9 + 89. http://www.columbia.edu/kermit/ckermit70.html#x2.1.10 + 90. http://www.columbia.edu/kermit/ckermit70.html#x2.1.11 + 91. http://www.columbia.edu/kermit/ckermit70.html#x2.1.12 + 92. http://www.columbia.edu/kermit/ckermit70.html#x2.1.13 + 93. http://www.columbia.edu/kermit/ckermit70.html#x2.1.14 + 94. http://www.columbia.edu/kermit/ckermit70.html#x2.1.15 + 95. http://www.columbia.edu/kermit/ckermit70.html#x2.1.16 + 96. http://www.columbia.edu/kermit/ckermit70.html#x2.2 + 97. http://www.columbia.edu/kermit/ckermit70.html#x2.2.1 + 98. http://www.columbia.edu/kermit/ckermit70.html#x2.2.2 + 99. http://www.columbia.edu/kermit/ckermit70.html#x2.3 + 100. http://www.columbia.edu/kermit/ckermit70.html#x2.3.0 + 101. http://www.columbia.edu/kermit/ckermit70.html#x2.3.1 + 102. http://www.columbia.edu/kermit/ckermit70.html#x2.3.2 + 103. http://www.columbia.edu/kermit/ckermit70.html#x2.3.3 + 104. http://www.columbia.edu/kermit/ckermit70.html#x2.3.4 + 105. http://www.columbia.edu/kermit/ckermit70.html#x2.3.5 + 106. http://www.columbia.edu/kermit/ckermit70.html#x2.3.6 + 107. http://www.columbia.edu/kermit/ckermit70.html#x2.4 + 108. http://www.columbia.edu/kermit/ckermit70.html#x2.5 + 109. http://www.columbia.edu/kermit/ckermit70.html#x2.6 + 110. http://www.columbia.edu/kermit/ckermit70.html#x2.7 + 111. http://www.columbia.edu/kermit/ckermit70.html#x2.7.0 + 112. http://www.columbia.edu/kermit/ckermit70.html#x2.7.1 + 113. http://www.columbia.edu/kermit/ckermit70.html#x2.7.2 + 114. http://www.columbia.edu/kermit/ckermit70.html#x2.7.3 + 115. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4 + 116. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.1 + 117. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.2 + 118. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.3 + 119. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.4 + 120. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.5 + 121. http://www.columbia.edu/kermit/ckermit70.html#x2.8 + 122. http://www.columbia.edu/kermit/ckermit70.html#x2.9 + 123. http://www.columbia.edu/kermit/ckermit70.html#x2.9.1 + 124. http://www.columbia.edu/kermit/ckermit70.html#x2.9.2 + 125. http://www.columbia.edu/kermit/ckermit70.html#x2.10 + 126. http://www.columbia.edu/kermit/ckermit70.html#x2.11 + 127. http://www.columbia.edu/kermit/ckermit70.html#x2.12 + 128. http://www.columbia.edu/kermit/ckermit70.html#x2.13 + 129. http://www.columbia.edu/kermit/ckermit70.html#x2.14 + 130. http://www.columbia.edu/kermit/ckermit70.html#x2.15 + 131. http://www.columbia.edu/kermit/ckermit70.html#x3 + 132. http://www.columbia.edu/kermit/ckermit70.html#x3.1 + 133. http://www.columbia.edu/kermit/ckermit70.html#x3.2 + 134. http://www.columbia.edu/kermit/ckermit70.html#x3.3 + 135. http://www.columbia.edu/kermit/ckermit70.html#x3.4 + 136. http://www.columbia.edu/kermit/ckermit70.html#x4 + 137. http://www.columbia.edu/kermit/ckermit70.html#x4.0 + 138. http://www.columbia.edu/kermit/ckermit70.html#x4.1 + 139. http://www.columbia.edu/kermit/ckermit70.html#x4.1.1 + 140. http://www.columbia.edu/kermit/ckermit70.html#x4.1.2 + 141. http://www.columbia.edu/kermit/ckermit70.html#x4.1.3 + 142. http://www.columbia.edu/kermit/ckermit70.html#x4.2 + 143. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1 + 144. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1.1 + 145. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1.2 + 146. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1.3 + 147. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2 + 148. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2.1 + 149. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2.2 + 150. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3 + 151. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3.1 + 152. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3.2 + 153. http://www.columbia.edu/kermit/ckermit70.html#x4.2.4 + 154. http://www.columbia.edu/kermit/ckermit70.html#x4.2.5 + 155. http://www.columbia.edu/kermit/ckermit70.html#x4.2.6 + 156. http://www.columbia.edu/kermit/ckermit70.html#x4.2.7 + 157. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8 + 158. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.1 + 159. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.2 + 160. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.3 + 161. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.4 + 162. http://www.columbia.edu/kermit/ckermit70.html#x4.3 + 163. http://www.columbia.edu/kermit/ckermit70.html#x4.3.1 + 164. http://www.columbia.edu/kermit/ckermit70.html#x4.3.2 + 165. http://www.columbia.edu/kermit/ckermit70.html#x4.3.3 + 166. http://www.columbia.edu/kermit/ckermit70.html#x4.3.4 + 167. http://www.columbia.edu/kermit/ckermit70.html#x4.4 + 168. http://www.columbia.edu/kermit/ckermit70.html#x4.4.1 + 169. http://www.columbia.edu/kermit/ckermit70.html#x4.4.1.1 + 170. http://www.columbia.edu/kermit/ckermit70.html#x4.4.1.2 + 171. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2 + 172. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2.1 + 173. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2.1.1 + 174. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2.1.2 + 175. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2.2 + 176. http://www.columbia.edu/kermit/ckermit70.html#x4.5 + 177. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1 + 178. http://www.columbia.edu/kermit/ckermit70.html#x4.5.2 + 179. http://www.columbia.edu/kermit/ckermit70.html#x4.5.2.1 + 180. http://www.columbia.edu/kermit/ckermit70.html#x4.5.2.2 + 181. http://www.columbia.edu/kermit/ckermit70.html#x4.5.3 + 182. http://www.columbia.edu/kermit/ckermit70.html#x4.5.4 + 183. http://www.columbia.edu/kermit/ckermit70.html#x4.6 + 184. http://www.columbia.edu/kermit/ckermit70.html#x4.7 + 185. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1 + 186. http://www.columbia.edu/kermit/ckermit70.html#x4.7.2 + 187. http://www.columbia.edu/kermit/ckermit70.html#x4.7.3 + 188. http://www.columbia.edu/kermit/ckermit70.html#x4.8 + 189. http://www.columbia.edu/kermit/ckermit70.html#x4.8.1 + 190. http://www.columbia.edu/kermit/ckermit70.html#x4.8.2 + 191. http://www.columbia.edu/kermit/ckermit70.html#x4.9 + 192. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1 + 193. http://www.columbia.edu/kermit/ckermit70.html#x4.9.2 + 194. http://www.columbia.edu/kermit/ckermit70.html#x4.9.3 + 195. http://www.columbia.edu/kermit/ckermit70.html#x4.10 + 196. http://www.columbia.edu/kermit/ckermit70.html#x4.11 + 197. http://www.columbia.edu/kermit/ckermit70.html#x4.11.1 + 198. http://www.columbia.edu/kermit/ckermit70.html#x4.11.2 + 199. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3 + 200. http://www.columbia.edu/kermit/ckermit70.html#x4.11.4 + 201. http://www.columbia.edu/kermit/ckermit70.html#x4.11.5 + 202. http://www.columbia.edu/kermit/ckermit70.html#x4.11.6 + 203. http://www.columbia.edu/kermit/ckermit70.html#x4.12 + 204. http://www.columbia.edu/kermit/ckermit70.html#x4.13 + 205. http://www.columbia.edu/kermit/ckermit70.html#x4.14 + 206. http://www.columbia.edu/kermit/ckermit70.html#x4.15 + 207. http://www.columbia.edu/kermit/ckermit70.html#x4.16 + 208. http://www.columbia.edu/kermit/ckermit70.html#x4.17 + 209. http://www.columbia.edu/kermit/ckermit70.html#x4.17.1 + 210. http://www.columbia.edu/kermit/ckermit70.html#x4.17.2 + 211. http://www.columbia.edu/kermit/ckermit70.html#x4.18 + 212. http://www.columbia.edu/kermit/ckermit70.html#x4.19 + 213. http://www.columbia.edu/kermit/ckermit70.html#x4.20 + 214. http://www.columbia.edu/kermit/ckermit70.html#x4.20.1 + 215. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2 + 216. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.1 + 217. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.2 + 218. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.3 + 219. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.4 + 220. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.5 + 221. http://www.columbia.edu/kermit/ckermit70.html#x4.20.3 + 222. http://www.columbia.edu/kermit/ckermit70.html#x4.21 + 223. http://www.columbia.edu/kermit/ckermit70.html#x4.22 + 224. http://www.columbia.edu/kermit/ckermit70.html#x4.22.1 + 225. http://www.columbia.edu/kermit/ckermit70.html#x4.22.2 + 226. http://www.columbia.edu/kermit/ckermit70.html#x4.22.3 + 227. http://www.columbia.edu/kermit/ckermit70.html#x4.22.4 + 228. http://www.columbia.edu/kermit/ckermit70.html#x4.22.5 + 229. http://www.columbia.edu/kermit/ckermit70.html#x4.22.6 + 230. http://www.columbia.edu/kermit/ckermit70.html#x4.22.7 + 231. http://www.columbia.edu/kermit/ckermit70.html#x4.22.8 + 232. http://www.columbia.edu/kermit/ckermit70.html#x4.23 + 233. http://www.columbia.edu/kermit/ckermit70.html#x4.24 + 234. http://www.columbia.edu/kermit/ckermit70.html#x4.25 + 235. http://www.columbia.edu/kermit/ckermit70.html#x5 + 236. http://www.columbia.edu/kermit/ckermit70.html#x5.0 + 237. http://www.columbia.edu/kermit/ckermit70.html#x5.1 + 238. http://www.columbia.edu/kermit/ckermit70.html#x5.2 + 239. http://www.columbia.edu/kermit/ckermit70.html#x5.3 + 240. http://www.columbia.edu/kermit/ckermit70.html#x5.3.1 + 241. http://www.columbia.edu/kermit/ckermit70.html#x5.3.2 + 242. http://www.columbia.edu/kermit/ckermit70.html#x5.4 + 243. http://www.columbia.edu/kermit/ckermit70.html#x5.5 + 244. http://www.columbia.edu/kermit/ckermit70.html#x5.6 + 245. http://www.columbia.edu/kermit/ckermit70.html#x5.7 + 246. http://www.columbia.edu/kermit/ckermit70.html#x6 + 247. http://www.columbia.edu/kermit/ckermit70.html#x6.0 + 248. http://www.columbia.edu/kermit/ckermit70.html#x6.1 + 249. http://www.columbia.edu/kermit/ckermit70.html#x6.2 + 250. http://www.columbia.edu/kermit/ckermit70.html#x6.3 + 251. http://www.columbia.edu/kermit/ckermit70.html#x6.4 + 252. http://www.columbia.edu/kermit/ckermit70.html#x6.5 + 253. http://www.columbia.edu/kermit/ckermit70.html#x6.6 + 254. http://www.columbia.edu/kermit/ckermit70.html#x6.6.1 + 255. http://www.columbia.edu/kermit/ckermit70.html#x6.6.2 + 256. http://www.columbia.edu/kermit/ckermit70.html#x6.6.2 + 257. http://www.columbia.edu/kermit/ckermit70.html#x6.6.3 + 258. http://www.columbia.edu/kermit/ckermit70.html#x6.6.4 + 259. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5 + 260. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.1 + 261. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.2 + 262. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.3 + 263. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.4 + 264. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.5 + 265. http://www.columbia.edu/kermit/ckermit70.html#x6.7 + 266. http://www.columbia.edu/kermit/ckermit70.html#x7 + 267. http://www.columbia.edu/kermit/ckermit70.html#x7.0 + 268. http://www.columbia.edu/kermit/ckermit70.html#x7.1 + 269. http://www.columbia.edu/kermit/ckermit70.html#x7.1.1 + 270. http://www.columbia.edu/kermit/ckermit70.html#x7.1.2 + 271. http://www.columbia.edu/kermit/ckermit70.html#x7.1.3 + 272. http://www.columbia.edu/kermit/ckermit70.html#x7.1.4 + 273. http://www.columbia.edu/kermit/ckermit70.html#x7.2 + 274. http://www.columbia.edu/kermit/ckermit70.html#x7.3 + 275. http://www.columbia.edu/kermit/ckermit70.html#x7.4 + 276. http://www.columbia.edu/kermit/ckermit70.html#x7.5 + 277. http://www.columbia.edu/kermit/ckermit70.html#x7.6 + 278. http://www.columbia.edu/kermit/ckermit70.html#x7.7 + 279. http://www.columbia.edu/kermit/ckermit70.html#x7.8 + 280. http://www.columbia.edu/kermit/ckermit70.html#x7.9 + 281. http://www.columbia.edu/kermit/ckermit70.html#x7.9.1 + 282. http://www.columbia.edu/kermit/ckermit70.html#x7.9.2 + 283. http://www.columbia.edu/kermit/ckermit70.html#x7.10 + 284. http://www.columbia.edu/kermit/ckermit70.html#x7.10.1 + 285. http://www.columbia.edu/kermit/ckermit70.html#x7.10.2 + 286. http://www.columbia.edu/kermit/ckermit70.html#x7.10.3 + 287. http://www.columbia.edu/kermit/ckermit70.html#x7.10.4 + 288. http://www.columbia.edu/kermit/ckermit70.html#x7.10.5 + 289. http://www.columbia.edu/kermit/ckermit70.html#x7.10.6 + 290. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7 + 291. http://www.columbia.edu/kermit/ckermit70.html#x7.10.8 + 292. http://www.columbia.edu/kermit/ckermit70.html#x7.10.9 + 293. http://www.columbia.edu/kermit/ckermit70.html#x7.10.10 + 294. http://www.columbia.edu/kermit/ckermit70.html#x7.11 + 295. http://www.columbia.edu/kermit/ckermit70.html#x7.12 + 296. http://www.columbia.edu/kermit/ckermit70.html#x7.13 + 297. http://www.columbia.edu/kermit/ckermit70.html#x7.14 + 298. http://www.columbia.edu/kermit/ckermit70.html#x7.15 + 299. http://www.columbia.edu/kermit/ckermit70.html#x7.16 + 300. http://www.columbia.edu/kermit/ckermit70.html#x7.17 + 301. http://www.columbia.edu/kermit/ckermit70.html#x7.18 + 302. http://www.columbia.edu/kermit/ckermit70.html#x7.19 + 303. http://www.columbia.edu/kermit/ckermit70.html#x7.20 + 304. http://www.columbia.edu/kermit/ckermit70.html#x7.20.1 + 305. http://www.columbia.edu/kermit/ckermit70.html#x7.20.2 + 306. http://www.columbia.edu/kermit/ckermit70.html#x7.21 + 307. http://www.columbia.edu/kermit/ckermit70.html#x7.22 + 308. http://www.columbia.edu/kermit/ckermit70.html#x7.23 + 309. http://www.columbia.edu/kermit/ckermit70.html#x7.24 + 310. http://www.columbia.edu/kermit/ckermit70.html#x7.25 + 311. http://www.columbia.edu/kermit/ckermit70.html#x7.26 + 312. http://www.columbia.edu/kermit/ckermit70.html#x7.26.1 + 313. http://www.columbia.edu/kermit/ckermit70.html#x7.26.2 + 314. http://www.columbia.edu/kermit/ckermit70.html#x7.27 + 315. http://www.columbia.edu/kermit/ckermit70.html#x8 + 316. http://www.columbia.edu/kermit/ckermit70.html#x9 + 317. http://www.columbia.edu/kermit/ckermit70.html#x9.0 + 318. http://www.columbia.edu/kermit/ckermit70.html#x9.1 + 319. http://www.columbia.edu/kermit/ckermit70.html#x9.2 + 320. http://www.columbia.edu/kermit/ckermit70.html#x9.3 + 321. http://www.columbia.edu/kermit/ckermit70.html#x10 + 322. http://www.columbia.edu/kermit/ckermit70.html#xiii + 323. http://www.columbia.edu/kermit/ckermit70.html#xiii.1 + 324. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.1 + 325. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.2 + 326. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.2.1 + 327. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.2.2 + 328. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.2.3 + 329. http://www.columbia.edu/kermit/ckermit70.html#xiii.2 + 330. http://www.columbia.edu/kermit/ckermit70.html#xiv + 331. http://www.columbia.edu/kermit/ckermit70.html#xv + 332. http://www.columbia.edu/kermit/ckb2.htm + 333. http://www.columbia.edu/kermit/ckbreviews.html + 334. http://www.bhusa.com/ + 335. http://www.columbia.edu/kermit/manuals.html#ckde + 336. http://www.columbia.edu/kermit/manuals.html#ktb + 337. http://www.columbia.edu/kermit/news.html + 338. news:comp.protocols.kermit.announce + 339. news:comp.protocols.kermit.misc + 340. http://www.columbia.edu/kermit/ckb2.htm + 341. http://www.columbia.edu/kermit/ckermit70.html#x4 + 342. http://www.columbia.edu/kermit/ckermit70.html#x4.3 + 343. http://www.columbia.edu/kermit/ckermit70.html#x4.23 + 344. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1 + 345. http://www.columbia.edu/kermit/ckermit70.html#x1.5 + 346. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1 + 347. http://www.columbia.edu/kermit/ckermit70.html#x4.9. + 348. http://www.columbia.edu/kermit/ckb2.htm + 349. http://www.columbia.edu/kermit/ckermit70.html#x7.9.2 + 350. http://www.columbia.edu/kermit/ckermit70.html#x2.15 + 351. http://www.columbia.edu/kermit/ckermit70.html#x9.1 + 352. http://www.columbia.edu/kermit/ckermit70.html#x1.6 + 353. http://www.columbia.edu/kermit/ckermit70.html#x7.4 + 354. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1 + 355. http://www.columbia.edu/kermit/ckermit70.html#mjd + 356. http://www.columbia.edu/kermit/ckermit70.html#mjd + 357. http://www.columbia.edu/kermit/ckermit70.html#x4.9 + 358. http://www.columbia.edu/kermit/ckb2.htm + 359. http://www.columbia.edu/kermit/ckb2.htm + 360. http://www.columbia.edu/kermit/ckermit70.html#x7.5 + 361. http://www.columbia.edu/kermit/ckermit70.html#x2.12 + 362. http://www.columbia.edu/kermit/ckermit70.html#x1.5 + 363. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1 + 364. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5 + 365. http://www.columbia.edu/kermit/ckermit70.html#x4.9 + 366. http://www.columbia.edu/kermit/ckermit70.html#x7.18 + 367. http://www.columbia.edu/kermit/ckermit70.html#x7.4 + 368. http://www.columbia.edu/kermit/ckermit70.html#x1.15 + 369. http://www.columbia.edu/kermit/ckermit70.html#x4.3 + 370. http://www.columbia.edu/kermit/ckermit70.html#x7.3 + 371. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7 + 372. http://www.columbia.edu/kermit/ckermit70.html#x7.1 + 373. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1 + 374. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt + 375. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt + 376. http://www.columbia.edu/kermit/ckermit70.html#x1.22.4 + 377. http://www.columbia.edu/kermit/ckermit70.html#x1.22.5 + 378. http://www.columbia.edu/kermit/ckb2.htm + 379. http://www.columbia.edu/kermit/ckermit70.html#x1.22.5 + 380. http://www.columbia.edu/kermit/ckermit70.html#x7.12 + 381. http://www.columbia.edu/kermit/ckermit70.html#x2.1.16 + 382. http://www.columbia.edu/kermit/ckermit70.html#x2.7 + 383. http://www.columbia.edu/kermit/ckermit70.html#x2.3.5 + 384. http://www.columbia.edu/kermit/ckermit70.html#x7.5 + 385. http://www.telefonica.es/cambiodenumeracion/ + 386. http://www.columbia.edu/kermit/ckermit70.html#x7.5 + 387. http://www.columbia.edu/kermit/ckb2.htm + 388. http://www.columbia.edu/kermit/ckermit70.html#x2.2.2 + 389. http://www.columbia.edu/kermit/ckermit70.html#x2.1.11 + 390. http://www.columbia.edu/kermit/ckermit70.html#x2.1.13 + 391. http://www.columbia.edu/kermit/ckermit70.html#x2.1.12 + 392. http://www.columbia.edu/kermit/ckb2.htm + 393. http://www.columbia.edu/kermit/ckermit70.html#x2.1.1 + 394. http://www.columbia.edu/kermit/ckb2.htm + 395. http://www.columbia.edu/kermit/ckb2.htm + 396. http://www.columbia.edu/kermit/ckermit70.html#x2.1.7 + 397. http://www.columbia.edu/kermit/ckermit70.html#x2.1.6 + 398. http://www.columbia.edu/kermit/ckb2.htm + 399. ftp://kermit.columbia.edu/kermit/f/telnet.txt + 400. http://www.columbia.edu/kermit/telnet.htm + 401. ftp://kermit.columbia.edu/kermit/f/telnet.txt + 402. http://www.columbia.edu/kermit/telnet.htm + 403. ftp://ftp.isi.edu/in-notes/rfc1572.txt + 404. ftp://ftp.isi.edu/in-notes/rfc779.txt + 405. http://www.columbia.edu/kermit/ckb2.htm + 406. http://www.columbia.edu/kermit/ckermit70.html#x2.10 + 407. http://www.columbia.edu/kermit/ckermit70.html#x2.8 + 408. http://www.columbia.edu/kermit/ckermit70.html#x1.5 + 409. http://www.columbia.edu/kermit/ckermit70.html#x4.20 + 410. http://www.psy.uq.oz.au/~ftp/Crypto/ + 411. http://www.columbia.edu/kermit/security.htm + 412. http://srp.stanford.edu/srp/ + 413. http://www.columbia.edu/kermit/ckermit70.html#x2.7.1, + 414. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt + 415. http://www.columbia.edu/kermit/security.htm + 416. http://www.columbia.edu/kermit/ckb2.htm + 417. http://www.columbia.edu/kermit/ckermit70.html#x2.7 + 418. http://www.columbia.edu/kermit/ckermit70.html#x2.0 + 419. ftp://kermit.columbia.edu/kermit/f/ckuins.txt + 420. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt + 421. ftp://kermit.columbia.edu/kermit/f/ckuins.txt + 422. http://www.columbia.edu/kermit/iksd.html#x4.2 + 423. http://www.columbia.edu/kermit/iksd.html + 424. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.1 + 425. ftp://ftp.isi.edu/in-notes/rfc1945.txt + 426. http://www.columbia.edu/kermit/ckermit70.html#x1.5 + 427. http://www.columbia.edu/kermit/ckermit70.html#x3.2 + 428. http://www.columbia.edu/kermit/ckermit70.html#x3.2 + 429. http://www.columbia.edu/kermit/ckb2.htm + 430. http://www.columbia.edu/kermit/ckb2.htm + 431. http://www.columbia.edu/kermit/ckermit70.html#x5.4 + 432. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt + 433. http://www.columbia.edu/kermit/ckermit70.html#x4.10 + 434. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1 + 435. http://www.columbia.edu/kermit/ckermit70.html#x4.7.3 + 436. http://www.columbia.edu/kermit/ckermit70.html#x4.3 + 437. http://www.columbia.edu/kermit/ckermit70.html#x4.10 + 438. http://www.columbia.edu/kermit/ckermit70.html#x4.11 + 439. http://www.columbia.edu/kermit/ckermit70.html#x4.15 + 440. http://www.columbia.edu/kermit/ckermit70.html#x4.2.4 + 441. http://www.columbia.edu/kermit/ckermit70.html#x4.7 + 442. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3 + 443. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1.3 + 444. http://www.columbia.edu/kermit/ckb2.htm + 445. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2 + 446. http://www.columbia.edu/kermit/ckermit70.html#x1.5 + 447. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.2 + 448. http://www.columbia.edu/kermit/ckermit70.html#x4.3 + 449. http://www.columbia.edu/kermit/ckermit70.html#x4.10 + 450. http://www.columbia.edu/kermit/ckermit70.html#x4.11 + 451. http://www.columbia.edu/kermit/ckermit70.html#x4.15 + 452. http://www.telstra.com.au/docs/PGP/ + 453. http://www.telstra.com.au/docs/PGP/pgpdoc2/pgpdoc2_17.html + 454. http://www.columbia.edu/kermit/security.htm + 455. http://www.columbia.edu/kermit/ckermit70.html#x2.7 + 456. http://www.columbia.edu/kermit/ckb2.htm + 457. http://www.columbia.edu/kermit/ckermit70.html#x2.14 + 458. http://www.columbia.edu/kermit/ckermit70.html#x1.23 + 459. http://www.columbia.edu/kermit/ckermit70.html#x4.7 + 460. http://www.columbia.edu/kermit/ckb2.htm + 461. http://www.columbia.edu/kermit/ckb2.htm + 462. http://www.columbia.edu/kermit/ckermit70.html#x4.9 + 463. http://www.columbia.edu/kermit/ckb2.htm + 464. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4 + 465. http://www.columbia.edu/kermit/ckermit70.html#x4.3 + 466. http://www.columbia.edu/kermit/ckermit70.html#x1.5.5 + 467. http://www.columbia.edu/kermit/ckermit70.html#x7.5 + 468. http://www.columbia.edu/kermit/ckermit70.html#x4.9 + 469. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4 + 470. http://www.columbia.edu/kermit/ckermit70.html#x4.9 + 471. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4 + 472. http://www.columbia.edu/kermit/ckermit70.html#x1.5.5 + 473. http://www.columbia.edu/kermit/ckb2.htm + 474. http://www.columbia.edu/kermit/ckb2.htm + 475. http://www.columbia.edu/kermit/ckermit70.html#x1.5 + 476. http://www.columbia.edu/kermit/ckermit70.html#x1.6 + 477. http://www.columbia.edu/kermit/ckermit70.html#x7.10 + 478. http://www.columbia.edu/kermit/ckermit70.html#x7.10.11 + 479. http://www.columbia.edu/kermit/ckermit70.html#x1.6 + 480. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2 + 481. http://www.columbia.edu/kermit/ckermit70.html#x4.11 + 482. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4 + 483. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1 + 484. http://www.columbia.edu/kermit/ckermit70.html#x4.0.6 + 485. http://www.columbia.edu/kermit/ckermit70.html#x4.2 + 486. http://www.columbia.edu/kermit/ckermit70.html#x4.1 + 487. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1 + 488. http://www.columbia.edu/kermit/ckb2.htm + 489. http://www.columbia.edu/kermit/ckermit70.html#x1.5 + 490. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2 + 491. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1 + 492. http://www.columbia.edu/kermit/ckermit70.html#x4.2 + 493. http://www.columbia.edu/kermit/ckermit70.html#x4.10 + 494. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2 + 495. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1 + 496. http://www.columbia.edu/kermit/ckermit70.html#x4.2 + 497. http://www.columbia.edu/kermit/ckermit70.html#x4.10 + 498. http://www.columbia.edu/kermit/ckermit70.html#x1.11.5 + 499. http://www.columbia.edu/kermit/ckermit70.html#x4.0.6 + 500. http://www.columbia.edu/kermit/ckermit70.html#x4.11 + 501. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1 + 502. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3 + 503. http://www.columbia.edu/kermit/ckermit70.html#x4.9 + 504. http://www.columbia.edu/kermit/ckermit70.html#x4.9 + 505. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1 + 506. http://www.columbia.edu/kermit/ckermit70.html#x7.10 + 507. http://www.columbia.edu/kermit/ckermit70.html#x7.10.5 + 508. http://www.columbia.edu/kermit/ckermit70.html#x7.10.3 + 509. http://www.columbia.edu/kermit/ckermit70.html#x7.10.5 + 510. http://www.columbia.edu/kermit/ckb2.htm + 511. http://www.columbia.edu/kermit/ckermit70.html#x4.3 + 512. http://www.columbia.edu/kermit/ckermit70.html#x4.10 + 513. http://www.columbia.edu/kermit/ckermit70.html#x4.3 + 514. http://www.columbia.edu/kermit/ckermit70.html#x4.10 + 515. http://www.columbia.edu/kermit/ckermit70.html#x4.15 + 516. http://www.columbia.edu/kermit/ckermit70.html#x4.18 + 517. http://www.columbia.edu/kermit/ckermit70.html#x4.20 + 518. http://www.columbia.edu/kermit/ckermit70.html#x4.20 + 519. http://www.columbia.edu/kermit/ckermit70.html#x4.20 + 520. http://www.columbia.edu/kermit/ckermit70.html#x4.19 + 521. http://www.columbia.edu/kermit/ckermit70.html#x4.16 + 522. http://www.columbia.edu/kermit/ckermit70.html#x4.19 + 523. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.3 + 524. http://www.columbia.edu/kermit/ckermit70.html#x1.5 + 525. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.4 + 526. http://www.columbia.edu/kermit/ckermit70.html#x4.22.2 + 527. http://www.columbia.edu/kermit/ckermit70.html#x4.22.3 + 528. http://www.columbia.edu/kermit/ckb2.htm + 529. http://www.columbia.edu/kermit/ckb2.htm + 530. http://www.columbia.edu/kermit/ckermit70.html#x9.3 + 531. http://www.columbia.edu/kermit/ckermit70.html#x5.2.1 + 532. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1 + 533. http://www.columbia.edu/kermit/ckermit70.html#x4.5.2 + 534. http://www.columbia.edu/kermit/ckermit70.html#x6.6 + 535. http://www.columbia.edu/kermit/ckermit70.html#xiii + 536. http://www.columbia.edu/kermit/ckermit70.html#xiii + 537. ftp://ftp.isi.edu/in-notes/rfc1489.txt + 538. ftp://ftp.isi.edu/in-notes/rfc2319.txt + 539. http://www.unicode.org/ + 540. http://www.columbia.edu/kermit/ckermit70.html#x6.6.2 + 541. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.1 + 542. ftp://ftp.isi.edu/in-notes/rfc2640.txt + 543. http://www.columbia.edu/kermit/ckermit70.html#x6.6.2 + 544. http://www.columbia.edu/kermit/ckermit70.html#x6.0 + 545. http://www.columbia.edu/kermit/ckermit70.html#x6.5 + 546. http://www.columbia.edu/kermit/ckermit70.html#x6.4 + 547. http://www.columbia.edu/kermit/ckb2.htm + 548. http://www.columbia.edu/kermit/ckermit70.html#x4.21 + 549. http://www.columbia.edu/kermit/ckermit70.html#x6.5 + 550. http://www.columbia.edu/kermit/ckermit70.html#x2.8 + 551. http://www.columbia.edu/kermit/ckermit70.html#x7.7 + 552. http://www.columbia.edu/kermit/ckermit70.html#x7.2 + 553. http://www.columbia.edu/kermit/ckermit70.html#x1.19 + 554. http://www.columbia.edu/kermit/ckermit70.html#x4.9 + 555. http://www.columbia.edu/kermit/ckermit70.html#x4.1 + 556. http://www.columbia.edu/kermit/ckermit70.html#x4.2 + 557. http://www.columbia.edu/kermit/ckermit70.html#x4.1 + 558. http://www.columbia.edu/kermit/ckermit70.html#x4.2 + 559. http://www.columbia.edu/kermit/ckermit70.html#x2.1.11 + 560. http://www.columbia.edu/kermit/ckermit70.html#x2.10 + 561. http://www.columbia.edu/kermit/ckermit70.html#ferrstring + 562. http://www.columbia.edu/kermit/ckermit70.html#x4.2.5 + 563. http://www.columbia.edu/kermit/ckermit70.html#x2.1.10 + 564. http://www.columbia.edu/kermit/ckermit70.html#x9.1 + 565. http://www.columbia.edu/kermit/ckermit70.html#x7.23 + 566. http://www.columbia.edu/kermit/ckermit70.html#x7.23 + 567. http://www.columbia.edu/kermit/ckermit70.html#x1.22 + 568. http://www.columbia.edu/kermit/ckermit70.html#x1.6 + 569. http://www.columbia.edu/kermit/ckermit70.html#x7.23 + 570. http://www.columbia.edu/kermit/ckermit70.html#x7.24 + 571. http://www.columbia.edu/kermit/ckermit70.html#x7.24 + 572. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3 + 573. http://www.columbia.edu/kermit/ckermit70.html#x7.12 + 574. http://www.columbia.edu/kermit/ckermit70.html#x7.9 + 575. http://www.columbia.edu/kermit/ckb2.htm + 576. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3 + 577. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3 + 578. http://www.columbia.edu/kermit/ckermit70.html#x7.5 + 579. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7 + 580. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7 + 581. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.4 + 582. http://www.columbia.edu/kermit/ckermit70.html#x4.2.5 + 583. http://www.columbia.edu/kermit/ckermit70.html#x7.8 + 584. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1 + 585. http://www.columbia.edu/kermit/ckb2.htm + 586. http://www.columbia.edu/kermit/ckermit70.html#x7.19 + 587. http://www.columbia.edu/kermit/ckermit70.html#x7.16 + 588. http://www.columbia.edu/kermit/ckermit70.html#x7.9.1 + 589. http://www.columbia.edu/kermit/ckermit70.html#x7.5 + 590. http://www.columbia.edu/kermit/ckermit70.html#x7.3 + 591. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3 + 592. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1 + 593. http://www.columbia.edu/kermit/ckermit70.html#x7.10 + 594. http://www.columbia.edu/kermit/ckermit70.html#x7.10.10 + 595. http://www.columbia.edu/kermit/ckermit70.html#x1.5 + 596. http://www.columbia.edu/kermit/ckermit70.html#x7.23 + 597. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7 + 598. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7 + 599. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3 + 600. http://www.columbia.edu/kermit/ckermit70.html#x7.10.11 + 601. http://www.columbia.edu/kermit/ckermit70.html#x4.9 + 602. http://www.columbia.edu/kermit/ckermit70.html#x7.10.3 + 603. http://www.columbia.edu/kermit/ckermit70.html#x7.3 + 604. http://www.columbia.edu/kermit/ckermit70.html#x7.9.2 + 605. http://www.columbia.edu/kermit/ckb2.htm + 606. http://www.columbia.edu/kermit/ckermit70.html#x4.17.2 + 607. http://www.columbia.edu/kermit/ckermit70.html#x1.22 + 608. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1 + 609. http://www.columbia.edu/kermit/ckermit70.html#x1.22 + 610. http://www.columbia.edu/kermit/ckermit70.html#x4.3 + 611. http://www.columbia.edu/kermit/ckermit70.html#x4.9 + 612. http://www.columbia.edu/kermit/ckermit70.html#x1.22 + 613. http://www.columbia.edu/kermit/ckermit70.html#x1.6 + 614. http://www.columbia.edu/kermit/ckermit70.html#x7.5 + 615. http://www.columbia.edu/kermit/ckermit70.html#x7.5 + 616. http://www.columbia.edu/kermit/ckermit70.html#x7.19 + 617. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1 + 618. http://www.columbia.edu/kermit/ckermit70.html#x9.3 + 619. http://www.columbia.edu/kermit/ckermit70.html#x7.5 + 620. http://www.columbia.edu/kermit/ckb2.htm + 621. http://www.columbia.edu/kermit/ckermit70.html#x7.4 + 622. http://www.columbia.edu/kermit/ckermit70.html#x7.20.2 + 623. http://www.columbia.edu/kermit/ckermit70.html#x7.10.5 + 624. http://www.columbia.edu/kermit/ckermit70.html#x7.10.9 + 625. http://www.columbia.edu/kermit/ckermit70.html#x1.10 + 626. http://www.columbia.edu/kermit/ckermit70.html#x1.5 + 627. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1 + 628. http://www.columbia.edu/kermit/iksd.html + 629. http://www.columbia.edu/kermit/ckermit70.html#x7.19 + 630. http://www.columbia.edu/kermit/ckermit70.html#x4.10 + 631. http://www.columbia.edu/kermit/ckermit70.html#x4.11 + 632. http://www.columbia.edu/kermit/ckermit70.html#x4.3 + 633. http://www.columbia.edu/kermit/gkermit.html + 634. http://www.columbia.edu/kermit/ckermit70.html#x4.20 + 635. http://www.columbia.edu/kermit/gkermit.html + 636. http://www.columbia.edu/kermit/ckb2.htm + 637. http://www.columbia.edu/kermit/ckermit70.html#x7.3 + 638. mailto:kermit@columbia.edu + 639. http://www.columbia.edu/kermit/ckermit70.html#top + 640. http://www.columbia.edu/kermit/ckermit.html + 641. http://www.columbia.edu/kermit/index.html diff --git a/ckermit80.txt b/ckermit80.txt new file mode 100644 index 0000000..493338a --- /dev/null +++ b/ckermit80.txt @@ -0,0 +1,10349 @@ + + C-Kermit 8.0 Update Notes + + [ [1]Contents ] [ [2]C-Kermit ] [ [3]Kermit Home ] + + Second Supplement to Using C-Kermit, Second Edition + +For C-Kermit 8.0 + + As of C-Kermit version: 8.0.211 + Date of C-Kermit release: 10 April 2003 + This file last updated: Sat Apr 10 16:36:11 2004 + + * IF YOU ARE READING A PLAIN-TEXT version of this document, note + that it is a plain-text dump of a Web page. You can visit the + original (and possibly more up-to-date) Web page here: + [4]http://www.columbia.edu/kermit/ckermit80.html + * If you are reading the HTML version of this file with a GUI Web + browser, the features added since C-Kermit 8.0.201 are shown in + red if your browser and monitor permit. Features that were new to + versions 8.0.200 and 201 are in black. + +Authors: Frank da Cruz and Christine M. Gianone +Address: The Kermit Project + Columbia University + 612 West 115th Street + New York NY 10025-7799 + USA +Fax: +1 (212) 662-6442 +E-Mail: [5]kermit-support@columbia.edu +Web: [6]http://www.columbia.edu/kermit/ +Or: [7]http://www.kermit-project.org/ +Or: [8]http://www.columbia.nyc.ny.us/kermit/ + _________________________________________________________________ + + NOTICES + + This document: + Copyright © 1997, 2002, Frank da Cruz and Christine M. Gianone. + All rights reserved. + + Kermit 95: + Copyright © 1995, 2002, Trustees of Columbia University in the + City of New York. All rights reserved. + + C-Kermit: + Copyright © 1985, 2002, + Trustees of Columbia University in the City of New York. All + rights reserved. See the C-Kermit [9]COPYING.TXT file or the + copyright text in the [10]ckcmai.c module for disclaimer and + permissions. + + When Kerberos(TM) and/or SRP(TM) (Secure Remote Password) and/or + SSL/TLS protocol are included: + Portions Copyright © 1990, Massachusetts Institute of + Technology. + Portions Copyright © 1991, 1993 Regents of the University of + California. + Portions Copyright © 1991, 1992, 1993, 1994, 1995 by AT&T. + Portions Copyright © 1997, Stanford University. + Portions Copyright © 1995-1997, Eric Young + . + + For the full text of the third-party copyright notices, see + [11]Appendix V. + _________________________________________________________________ + + WHAT IS IN THIS FILE + + This file lists changes made to C-Kermit since version 7.0 was + released in January 2000. Use this file as a supplement to: + + * The second edition of [12]Using C-Kermit; and: + * The [13]C-Kermit 7.0 Update Notes. Also available in plain-text + form as [14]ckermit70.txt. + + until the third edition of Using C-Kermit is published. We apologize + for the scattered documentation and will consolidate it when we are + able. + _________________________________________________________________ + + ADDITIONAL FILES Several other files accompany this new Kermit + release: + + [15]ckututor.html + C-Kermit Tutorial (for Unix). Also distributed in Nroff form as + [16]ckuker.nr, the Unix C-Kermit manual page. + + [17]security.htm + Discussion of Kermit's new authentication and encryption + features, updated for C-Kermit 8.0. + + [18]telnet.htm + Detailed documentation of Kermit's Telnet client, updated for + C-Kermit 8.0. + + [19]ftpscripts.html + Tutorial: Writing FTP automation scripts + + [20]ckcbwr.html + Platform-independent C-Kermit hints and tips. Also distributed + in plain text form as [21]ckcbwr.txt + + [22]ckubwr.html + Unix-specific C-Kermit hints and tips. Also distributed in + plain text form as [23]ckubwr.txt. + + [24]ckvbwr.html + VMS-specific C-Kermit hints and tips. Also distributed in plain + text form as [25]ckvbwr.txt. + + [26]ckuins.html + Unix C-Kermit installation instructions. Also distributed in + plain text form as [27]ckuins.txt. + + [28]ckvins.html + VMS C-Kermit installation instructions. Also distributed in + plain text form as [29]ckvins.txt. + + [30]ckccfg.html + Compile-time configuration options. Also distributed in plain + text form as [31]ckccfg.txt. + + [32]ckcplm.html + C-Kermit Program Logic Manual. Also distributed in plain text + form as [33]ckcplm.txt. + + [34]iksd.html + Internet Kermit Service Aministrators Guide for Unix. + + [35]skermit.html + C-Kermit as an SSH Subsystem (SFTP server replacement). + + [ [36]Top ] [ [37]C-Kermit ] [ [38]Kermit Home ] + __________________________________________________________________________ + +CONTENTS + + [39]0. WHAT'S NEW + [40]1. FIXES SINCE VERSION 7.0.196 + [41]2. SSH AND HTTP + [42]2.1. SSH Connections + [43]2.2. HTTP Connections + [44]2.2.1. HTTP Command Switches + [45]2.2.2. HTTP Action Commands + [46]2.2.3. HTTP Headers + [47]2.2.4. Secure HTTP Connections + [48]2.2.5. HTTP Variables + [49]2.2.6. The HTTP Command-Line Personality + [50]3. THE BUILT-IN FTP CLIENT + [51]3.1. Making and Managing FTP Connections + [52]3.1.1. Kermit Command-Line Options for FTP + [53]3.1.2. The FTP Command-Line Personality + [54]3.1.3. The FTP URL Interpreter + [55]3.1.4. Interactive FTP Session Establishment + [56]3.2. Making Secure FTP Connections + [57]3.3. Setting FTP Preferences + [58]3.4. Managing Directories and Files + [59]3.5. Uploading Files With FTP + [60]3.5.1. FTP PUT Switches + [61]3.5.2. Update Mode + [62]3.5.3. Recovery + [63]3.6. Downloading Files With FTP + [64]3.6.1. FTP GET Switches + [65]3.6.2. Filename Collisions + [66]3.6.3. Recovery + [67]3.7. Translating Character Sets + [68]3.7.1. Character Sets and Uploading + [69]3.7.2. Character Sets and Downloading + [70]3.8. FTP Command Shortcuts + [71]3.9. Dual Sessions + [72]3.10. Automating FTP Sessions + [73]3.10.1. FTP-Specific Variables and Functions + [74]3.10.2. Examples + [75]3.10.3. Automating Secure FTP Connections + [76]3.11. Advanced FTP Protocol Features [77]4. FILE SCANNING + [78]5. FILE AND DIRECTORY NAMES CONTAINING SPACES + [79]6. OTHER COMMAND PARSING IMPROVEMENTS + [80]6.1. Grouping Macro Arguments + [81]6.2. Directory and File Name Completion + [82]6.3. Passing Arguments to Command Files + [83]6.4. More-Prompting + [84]6.5. Commas in Macro Definitions + [85]6.6. Arrow Keys + [86]7. NEW COMMANDS AND SWITCHES + [87]8. SCRIPTING IMPROVEMENTS + [88]8.1. Performance and Debugging + [89]8.2. Using Macros as Numeric Variables + [90]8.3. New IF Conditions + [91]8.4. The ON_UNKNOWN_COMMAND and ON_CD Macros + [92]8.5. The SHOW MACRO Command + [93]8.6. Arrays + [94]8.7. New or Improved Built-in Variables and Functions + [95]8.8. The RETURN and END Commands + [96]8.9. UNDEFINing Groups of Variables + [97]8.10. The INPUT and MINPUT Commands + [98]8.11. Learned Scripts + [99]8.12. Pattern Matching + [100]8.13. Dates and Times + [101]8.14. Trapping Keyboard Interruption + [102]9. S-EXPRESSIONS + [103]9.1. What is an S-Expression? + [104]9.2. Integer and Floating-Point-Arithmetic + [105]9.3. How to Use S-Expressions + [106]9.4. Summary of Built-in Constants and Operators + [107]9.5. Variables + [108]9.6. Assignments and Scope + [109]9.7. Conditional Expressions + [110]9.8. Extensibility + [111]9.9. Examples + [112]9.10. Differences from Algebraic Notation + [113]9.11.Differences from Lisp + [114]10. FILE TRANSFER + [115]11. MODEMS AND DIALING + [116]12. TERMINAL CONNECTION + [117]13. CHARACTER SETS + [118]14. DIALOUT FROM TELNET TERMINAL SERVERS + [119]15. COPING WITH BROKEN KERMIT PARTNERS + [120]16. NEW COMMAND-LINE OPTIONS + [121]17. LOGS + + [ [122]Top ] [ [123]C-Kermit ] [ [124]Kermit Home ] + __________________________________________________________________________ + +0. WHAT'S NEW + + The Initialization and Customization Files + C-Kermit 8.0 now supports specification of the initialization + file name (path) in an environment variable, CKERMIT_INI. It + also relies far less than before on the initialization for + functioning. See [125]Section 5 of the Unix C-Kermit + [126]installation instructions for details. As of version + 8.0.201, C-Kermit also executes your customization file (if you + have one) even if the initialization file was not found. + Previously, the customization file was executed by a TAKE + command in the initialization file (and it still is, if an + initialization is found). + + Incompatible Changes + As always, we do our best to avoid changes that break existing + scripts. However, C-Kermit 8.0 does include a rather pervasive + syntax change that might alter the behavior of scripts that + depend on the previous behavior. As described in [127]Section + 5, C-Kermit now accepts doublequotes in most contexts where you + previously had to use braces to group multiple words into a + single field, or to force inclusion of leading or trailing + blanks. Most noticeably, in C-Kermit 7.0 and earlier: + + echo {this is a string} + + would print: + + this is a string + + whereas: + + echo "this is a string" + + printed: + + "this is a string" + + In C-Kermit 8.0, both print: + + this is a string + + To force the doublequotes to be treated as part of the string, + use either of the following forms: + + echo {"this is a string"} + echo ""this is a string"" + + Similarly, to force braces to be treated as part of the string: + + echo "{this is a string}" + echo {{this is a string}} + + Other incompatibilities: + + 1. Using the SET HOST command to make HTTP connections is no + longer supported. Instead, use the new HTTP OPEN command, + described in [128]Section 2.2. + + C-Kermit 7.1 Alpha.01 (8 December 2000) + + Its major new features are those listed in the [129]Table of + Contents: the FTP client, file scanning, command parsing and + scripting improvements, S-Expressions, and support for the + Telnet Com Port Option, plus wider availability of the + Kerberos, SSL/TLS, and SRP security options for secure Internet + connections. + + C-Kermit 7.1.199 Alpha.02 (4 January 2001) + + + C-Kermit now accepts [130]FTP, TELNET, and IKSD URLs as its + first command-line argument. + + Character-set translation added to the FTP client for + [131]filenames. + + Optional [132]setting of date of incoming files by FTP [M]GET + from the server date. + + [133]FTP CHECK filename added to let FTP client check the + existence of a file on the server. + + [134]FTP GET /NAMELIST:filename added to get list of server + filenames into a local file. + + [135]FTP [M]PUT /SERVER-RENAME:template added to make server + rename a file as indicated by the template after it has + arrived completely. + + FTP [M]GET /SERVER-RENAME:template added to make server + rename a file as indicated by the template after it has been + sent completely. + + FTP [136]VDIRECTORY added for getting verbose directory + listings from TOPS-20. + + [137]FTP TYPE TENEX added for transferring 8-bit binary files + with PDP-10s. + + Added [138]automatic text/binary mode switching for FTP + [M]GET, based on filename patterns (e.g. *.zip, *.gz, *.exe + are binary; *.txt, *.c are text). + + [139]SET SEND I-PACKETS OFF added for coping with Kermit + servers that do not support I packets. + + A new option was added to [140]\fword() and \fsplit() for + parsing comma-separated lists that might contain empty + elements. + + Bug fixes including: + o {} or "" could not be used as expected to represent the + empty string. + o ,- on a line by itself in a macro definition caused + subsequent statements to be skipped. + o FTP [M]GET didn't work right if path segments were + included in the filespec. + o FTP MGET, if interrupted, did not clear its file list. + o Various problems with FTP PUT /AS-NAME that nobody + noticed. + o Some FTP messages and displays interfered with each + other. + o Parsing of YESTERDAY, TODAY, and TOMORROW in date-time + fields was broken. + o Automatic old-to-new dialing directory format conversion + was broken on VMS. + o Various source-code portability problems fixed. + + Improvement of various HELP and SHOW messages. + + C-Kermit 7.1.199 Alpha.04 (1 April 2001) + + + Big changes: + o Changed default modem type from NONE to GENERIC. + o Generic dialing now sends no init string at all. + o Changed default terminal bytesize from 7 to 8. + + New features: + o SET SESSION-LOG TIMESTAMPED-TEXT for timestamped session + log. + + New modem types: + o Conexant modem family + o Lucent VENUS chipset + o PCTel V.90 chipset + o Zoom V.90 + o Zoom V.92 + + FTP client: + o FTP OPEN /PASSIVE and /ACTIVE switches added. + o Now works with servers that that don't include path in + NLST response. + o Fixed SEND /RECURSIVE not to follow symlinks (UNIX). + o SET FTP VERBOSE-MODE default is now OFF instead of ON. + + Kermit protocol: + o Fixed what I hope is the last "Receive window full" + error. + o SET PREFIXING or SET CONTROL PREFIX now automatically + sets CLEARCHANNEL OFF. + o Fixed incorrect report of number of files transferred at + end of transfer. + o Fixed SEND /RECURSIVE not to follow symlinks (UNIX). + + UNIX: + o HTTP and shadow passwords enabled for SCO 5.0.6. + o Even with SET FILENAMES CONVERTED, spaces were still + accepted in incoming filenames; now they are converted + to underscores. + o Added support for compile-time mktemp()/mkstemp() + selection. + + VMS: + o Session-log format for scripted sessions fixed. + + Scripting: + o Fixed \frdir() not to follow symlinks (UNIX). + o Fixed \fday() not to dump core for dates prior to 17 Mar + 1858. + + General: + o "Closing blah..." message upon exit could not be + surpressed. + o Added /PAGE and /NOPAGE to DELETE switches. + o Added GO response for DELETE /ASK (delete all the rest + without asking). + o Added GO response to "more?" prompt (for multi-page + screen output). + o Updated HELP texts. + + C-Kermit 7.1.199 Beta.01 (10 May 2001) + + + FTP client verbosity adjustments. + + Bug with generic modem dialing pausing several secs fixed. + + SET HOST /USER:, SET LOGIN USERID, etc, fixed when given no + user ID. + + A couple \v(dm_blah) dial modifier variables added. + + "--version" command-line switch added. + + Fixed NetBSD serial-port DTR handling. + + Lots of syntax cleanups for Flexelint and gcc -Wall. + + Fixed modem-type aliases to not take precedence over real + names. + + Fixed funny treatment of doublequotes by ECHO command. + + Enabled SET SESSION-LOG for VMS and other non-UNIX platorms. + + Fixed changing direction in command history buffer. + + Fixed handling of IKSD URLs. + + Made sure DELETE prints a message if it got any errors. + + C-Kermit 8.0.200 Beta.02 (28 June 2001) + + + Major version number increased from 7 to 8. + + [141]SSH command. + + More-consistent Kermit protocol defaults. + + CONNECT idle timeout and action selection. + + CONNECT status variable. + + A way to allocate more space for filename lists. + + Pseudoterminal handler fixed for late-model Linuxes. + + Command-line option -dd for timestamped debug log. + + Download directory now works for external protocols too. + + GREP /COUNT:variable. + + SET ATTRIBUTE RECORD-FORMAT { OFF, ON }. + + Bug fixes. + + C-Kermit 8.0.200 Beta.03 (9 Sep 2001) + + + [142]HTTP 1.1 connections and scripting + + [143]ON_CTRLC macro for trapping Ctrl-C in scripts + + [144]Date-time parsing improvements, timezones, comparison, + arithmetic + + [145]Pattern-matching improvements + + FTP improvements + + SET EXIT HANGUP { ON, OFF } + + SET FILE EOF { CTRL-Z, LENGTH } + + ASK[Q] /TIMEOUT + + Bug fixes + + New platforms + + C-Kermit 8.0.200 Beta.04 (16 Nov 2001) + + + [146]New Unix man page + + [147]New Unix installation instructions + + SET TELOPT policies are now enforced on non-Telnet ports if + the server begins Telnet negotiations. + + SET TERMINAL IDLE-ACTION { TELNET-NOP, TELNET-AYT }. + + UUCP lockfile creation race condition fixed. + + Dialout, modem signals, hangup, hardware flow control, etc, + tested extensively on many platforms, numerous problems + fixed. + + Improved hints when dialing fails. + + SET STOP-BITS 2 can now be given without SET FLOW HARDWARE. + + Major improvements in RFC 2217 Telnet Com-Port Control. + + Improved ability to REDIAL a modem server port. + + kermit -h now shows the command name in the usage usage + string. + + kermit -h now shows ALL command-line options. + + kermit -s blah, where blah is a symlink, now works. + + --noperms command-line option = SET ATTRIBUTE PERMISSIONS + OFF. + + HTTP and HTTPS URLs now supported on the command line. + + An http command-line personality is now available. + + Initialization file streamlined to load faster, anachronisms + removed. + + Updated NEWS, INTRO, HELP text, SHOW commands. In particular, + see SHOW COMM, HELP SET LINE, HELP WAIT. + + Date/time arithmetic routines converted from floating-point + to integer arithmetic (internally) for greater accuracy and + portability. + + Quoted strings containing commas no longer break macro + execution. + + Dynamic Kermit file-transfer timeouts are now much more + aggressive. + + New "hot keys" to turn debug.log on/off during file transfer. + + Improved hints when file transfer fails. + + FTP CD orientation messages are now printed. + + -R now accepted on the FTP command line to request Recursion. + + -m allows Active or Passive mode to be chosen on the FTP + command line. + + -dd on the FTP command line creates a timestamped debug.log. + + FTP command-line security options filled in. + + Improved automatic text/binary mode switching for MGET. + + Removed spurious error messages that sometimes occur during + MGET. + + DIRECTORY, GREP, TYPE, HEAD, and TAIL now have a /OUTPUT:file + option. + + TYPE /NUMBER adds line numbers. + + CAT = TYPE /NOPAGE; MORE = TYPE /PAGE. + + GETOK ?-help fixed. + + \v(timestamp) (= "\v(ndate) \v(time)") + + \v(hour) (hour of the day, 0-23) + + \funix2dospath() converts a UNIX path (/) to a DOS one (\). + + \fdos2unixpath() converts a DOS (Windows, OS/2) path to a + UNIX one. + + \fkeywordval() parses name=value pair, allows macro keyword + parameters. + + We now make every attempt to not write passwords to the + debug.log. + + New Certficate Authority certificates file, includes the + Kermit Project at Columbia University so you can access our + IKSD securely. + + Secure targets improved and better documented in Unix + makefile. + + All Linux (libc and glibc) builds consolidated under "make + linux". + + HP-UX makefile targets now have consistent names. + + New aix50 and aix51 targets added. + + C-Kermit 8.0.200 Final (12 Dec 2001) + + + Remote/local-mode confusion on some platforms introduced in + Beta.04, fixed. + + Many of the makefile targets adjusted, new ones added. + + New "make install" target should please most people. + + New command: SHOW IKSD. + + FTP over TLS. + + Last-minute touchups to text messages, HELP text, etc. + + Enable modem-signal reading for SCO OSR5 and Unixware 7. + + Special superfast TRANSMIT /BINARY /NOECHO /NOWAIT mode + added. + + Fixed PBX dialing in unmarked-area-code case. + + Improved SHOW COMMUNICATIONS tells lockfile directory, + typical dialout device name. + + Some FTP OPEN command parsing problems fixed. + + Some errors in date arithmetic fixed. + + New command: SET TERMINAL AUTODOWNLOAD { ..., ERROR { STOP, + CONTINUE } } + + New command: HELP FIREWALL. + + SET MODEM HANGUP-METHOD DTR added as synomym for RS232-SIGNAL + + Support for secure URL protocols added: telnets:, ftps:, + https:. + + C-Kermit 8.0.201 (8 Feb 2002) + + + Installability as an [148]SSH v2 Subsystem. + + [149]SET LOCUS command. + + [150]L-versions of CD, DIR, DELETE, MKDIR, etc, to force + local execution. + + [151]USER and ACCOUNT added as synonyms for FTP USER and FTP + ACCOUNT. + + [152]SHOW VARIABLES now accepts a list of variables. + + Rudimentary support for [153]Caller ID when receiving phone + calls. + + Up/Down [154]Arrow-key navigation of command history buffer. + + [155]Automatic execution of customization file if init file + is missing. + + C-Kermit 8.0.206 Beta.01 (11 Oct 2002) + + New commands: + + o ORIENTATION lists location-related variables and their + values. + o KCD changes to special directories by their symbolic + names ("kcd ?" for a list). + o SET CD HOME path to specify home directory for CD and + KCD commands. + o CONTINUE given at top level is equivalent to END -- + handy when PROMPT'ed out of a script, to continue the + script. + + New switches or operands for existing commands: + + o GETOK /TIMEOUT + o ASK, ASKQ, GETOK /QUIET (suppresses error message on + timeout) + o COPY /APPEND now allows concatenating multiple source + files into one dest file. + o SET TCP { HTTP-PROXY, SOCKS-SERVER } /USER, /PASSWORD. + o DIRECTORY command now accepts multiple filespecs, e.g. + "dir a b c". + + SET QUIET ON now also applies to: + + o SET HOST connection progress messages. + o "Press the X or E key to cancel" file-transfer message. + o REMOTE CD response. + o REMOTE LOGIN response. + + Improvements and new features: + + o Numerous FTP client fixes and new features, listed + below. + o C-Kermit, when in remote mode at the end of a file + transfer, now prints a one-line "where" message. Control + with SET TRANSFER REPORT. + o Unix makefile "install" target now creates an UNINSTALL + script. + o Improved operation and performance on RFC 2217 Telnet + connections. + o Improved CONNECT (interactive terminal connection) + performance. + o HELP text updated for many commands. + + New or fixed makefile targets: + + o Solaris 9 (several variations) + o Concurrent PowerMAX + o Mac OS X 10.2 + o FreeBSD 1.0 + o FreeBSD 4.6, 5.0 + o AIX 5.2, 5.3 + + Bugs fixed (general): + + o Failure to run in VMS Batch fixed. + o LDIRECTORY fixed to run Kermit's built-in DIRECTORY + command rather than an external one. + o Fixed Solaris and other SVORPOSIX builds to find out + their full hostnames rather than just the "uname -n" + name. + o Fixed some problems matching strings that start with + ".". + o Fixed some problems matching pattern that contain + {a,b,c} lists. + o Fixed erroneous reporting of text-mode reception as + binary when sender did not report the file size + (cosmetic only). + o Many problems with SWITCH statements fixed. + o Fixed SET OPTIONS DIRECTORY /DOTFILES to work for server + too. + o Fixed DELETE to print an error message if the file was + not found. + o Fixed SET CONTROL UNPREFIX ALL and SET PREFIXING NONE to + do the same thing. + o Fixed bugs executing macros from within the ON_EXIT + macro. + o \fday() and \fnday() fixed for dates prior to 17 Nov + 1858. + o Serial speed-changing bug in Linux fixed. + o "Unbalanced braces" script parsing errors when using + \{number} fixed. + o "if defined \v(name)" fixed to behave as described in + the book. + o Fixed Problems caused by LOCAL variables whose names are + left substrings of macro names. + o The INPUT command was fixed to honor the PARITY setting. + o Fixed bug with COPY to existing file that is longer than + source file. + o REINPUT command failed to strip braces/quotes around its + target string. + o Network directory lookups didn't work for SSH + connections. + o REMOTE SET { FILE, TRANSFER } CHARACTER-SET fixed. + o Closed some holes whereby an incompletely received file + was not deleted when SET FILE INCOMPLETE is DISCARD, + e.g. when the Kermit is hung up upon. + o SET XFER CHARACTER-SET TRANSPARENT fixed to do the same + as SET XFER TRANSLATION OFF. + o SET HOST PTY (e.g. SSH) connection fixed to pass along + window-size changes. + o C-Kermit search path for TAKE files was accidentally + disabled. + + FTP client bugs fixed: + + o Character set translation was broken on little-endian + (e.g. PC) architectures. + o FTP PUT /SERVER-RENAME:, /RENAME-TO:, /MOVE-TO: switches + were sticky. + o Make SET TRANSFER MODE MANUAL apply to FTP. + o Make SET FILE INCOMPLETE { KEEP, DISCARD } apply to FTP. + o FTP MGET /UPDATE handled equal times incorrectly. + o FTP MGET /RECOVER fixed to ignore file dates, use only + size. + o FTP MGET /RECOVER sometimes downloaded files it didn't + need to. + o FTP downloads with TRANSFER DISPLAY BRIEF could give + misleading error messages. + o FTP MGET temp file not deleted if FTP DEBUG set to OFF + after it was ON. + o LOCUS not switched back when FTP connection is lost. + o Set incoming file date even if it was not completely + received. + o FTP MGET sent SIZE and MDTM commands even when it didn't + have to. + o FTP MGET sent SIZE and MDTM commands even when it knew + they wouldn't work. + o FTP MGET failed if no files were selected for download. + o FTP MGET a* b* c* would fail to get any c*'s if no b*'s + existed. + o Big problems canceling MGET with Ctrl-C. + o Some extraneous LOCUS dialogs squelched. + o Some inconsistencies in SET FTP FILENAMES AUTO fixed. + o Fixed file-descriptor pileup after multiple MGETs when + using mkstemp(). + o Fixed "mget foo", where foo is a directory name. + + FTP improvements: + + o New [156]FTP protocol features added (FEAT, MLSD). + o FTP MGET /RECURSIVE now works as expected if server + supports MLSD. + o FTP MGET /DATES-DIFFER to download if local and remote + file dates differ. + o FTP DATES default changed to ON. + o FTP MPUT, MGET /EXCEPT now allows up to 64 patterns (up + from 8). + o Top-level SITE and PASSIVE commands added for + convenience. + o MGET /COLLISION:APPEND /AS-NAME:newfile *.* puts all + remote files into one local file. + o SET FTP SERVER-TIME-OFFSET for when server has wrong + timezone set. + o Allow for alternative server interpretations of [M]MPUT + /UNIQUE. + o SET FTP ANONOMOUS-PASSWORD lets you specify the default + anonymous password. + o Allow "GET /RECURSIVE path/file" to force local + subdirectory creation. + o SET FTP DISPLAY is like SET TRANSFER DISPLAY but applies + only to FTP. + o FTP { ENABLE, DISABLE } new-protocol-feature-name. + o FTP MGET /NODOTFILES. + o Debug log now records FTP commands and responses in + grep-able format. + + [ [157]Top ] [ [158]Contents ] [ [159]C-Kermit ] [ [160]Kermit Home ] + __________________________________________________________________________ + +1. FIXES SINCE VERSION 7.0.196 First, the changes from 7.0.196 to 7.0.197... +Source and makefile tweaks to get successful builds on platforms that were not +available in time for the 7.0 release: + + * 4.2BSD + * 4.3BSD + * AIX 4.3 + * AT&T 3B2 and 3B20 + * BeOS 4.5 + * CLIX + * Interactive UNIX System V/386 R3.2 V4.1.1 + * OS-9/68000 + * OSF/1 1.3. + * PS/2 AIX 1.2.1 + * SCO OSR5.0.x + * SCO Xenix 2.3.4 + * SINIX 5.41/Intel + * Stratus FTX + * Stratus VOS + * SunOS 4.1 with X.25 + * Ultrix 4.2 + * Unixware 2.0 + + There were no functional changes from 196 to 197. + + Fixes applied after C-Kermit 7.0.197 was released: + + Source code: Big flexelint and "gcc -Wall" audit and cleanup. + + Configuration: + * Solaris RTS/CTS (hardware flow control) didn't work. + * BSDI RTS/CTS worked only in one direction. + * FreeBSD 4.0 with ncurses 5.0 broke interactive command parsing. + * QNX-32 build lacked -DBIGBUFOK so couldn't execute big macros. + + Connections: + * SET HOST /PTY didn't work on some platforms. + * Broken SET HOST /USER:xxx /PASSWORD:yyy /ACCOUNT:zzz switches + fixed. + * Transparent printing was broken in Unix. + * ANSWER 0 (wait forever) didn't work. + * Some problems in Multitech modem command strings. + * Spurious "?Sorry, can't condition console terminal" errors. + * Disabling modem command strings by setting them to nothing broke + dialing. + * SET DIAL TIMEOUT value was usually ignored. + * SET DIAL METHOD PULSE didn't work. + * Certain modem commands, if changed, not refreshed if modem type + changed. + * SET SESSION-LOG command was missing from VMS. + * VMS session log format fixed for scripts. + * HANGUP by dropping DTR didn't work in NetBSD. + * SET FLOW /AUTO versus SET FLOW confusion fixed. + * Spurious secondary Solaris lockfile removed. + * SCO OSR5 DTR On/Off hangup. + * UUCP lockfile race condition. + + Commands and scripts: + * Missing CAUTIOUS and FAST commands restored. + * Broken PTY command in late-model Linuxes fixed (API changed). + * Fixed off-by-one error in command recall when switching direction. + * Fixed recall of commands that contain '?'. + * COPY /SWAP-BYTES didn't work on some architectures. + * Various combinations of COPY switches didn't work. + * Various problems with COPY or RENAME with a directory name as + target. + * SHIFT didn't decrement \v(argc) if used within IF, ELSE, or SWITCH + block. + * SHIFT didn't affect the \%* variable. + * Divide by zero improperly handled in some \function()s. + * Problems with RETURN from right-recursive functions. + * FSEEK /LINE \%c LAST didn't work if already at end. + * Some buffer vulnerabilities and potential memory leaks were + discovered and fixed. + * \frdirectory() fixed not to follow symbolic links. + * SET EXIT WARNING OFF fixed to work when EXIT given in a script. + * Missing DELETE and MKDIR error message fixed. + * \fday() core dump for ancient dates fixed. + + File transfer: + * SEND /COMMAND was broken. + * CRECEIVE was broken (but RECEIVE /COMMAND was OK). + * Quoting wildcard chars in filenames didn't work. + * Problems canceling streaming file transfers with X or Z. + * Problems shifting between streaming and windowing file transfer. + * Non-FULL file-transfer displays erroneously said STREAMING when + not. + * An active SEND-LIST prevented GET from working. + * SET SERVER GET-PATH interpretation of relative names like "." was + wrong. + * The MAIL command was broken. + * "kermit -s *" might have skipped some files. + * Transaction log entries were not made for external protocol + transfers. + * File count report fixed to show number of files actually + transferred. + * Fixed filename conversion to convert spaces to underscores. + * Made SET PREFIXING / SET CONTROL PREFIX also adjust CLEARCHANNEL. + * More "Receive window full" errors fixed. + * Broken terminal buffering after curses display in Solaris fixed. + * SET FILE INCOMPLETE DISCARD did not work in all cases. + * Packet log changed to reformat the start-of-packet character + printably. + * Dynamic timeouts could grow ridiculously large. + + Character sets: + * Hebrew-7 translations missed the letter Tav. + * C1 area of CP1252 was ignored. + * SET TRANSFER CHARACTER-SET TRANSPARENT could give garbage + translations. + * TRANSLATE might not work on Little Endian architectures. + * Insufficient range checking in certain TRANSLATE operations. + + The following bugs in C-Kermit 8.0.200 were fixed in 8.0.201: + + * An obscure path through the code could cause the Unix version of + C-Kermit to dump core during its startup sequence. This happened + to only one person, but now it's fixed. + * When C-Kermit 8.0 is in Kermit server mode and the client says + "get blah", where blah (on the server) is a symlink rather than a + real file, the server unreasonably refused to send the linked-to + file. + * When C-Kermit is an FTP client and says "get foo/bar" (i.e. a + filename that includes one or more path segments), it failed to + accept the incoming file (this happened only with GET, not MGET). + * Array references should be case insensitive but only lowercase + array letters were accepted. + * SHOW VARIABLES dumped core on \v(sexpression) and \v(svalue). + * Spurious refusals of remote directory listings if the remote + server's date was set in the past. + * In AIX, and maybe elsewhere too, Kermit's COPY command always + failed with "Source and destination are the same file" when the + destination file didn't exist. + * The VMS version of C-Kermit did not work in Batch or when SPAWN'd. + To compound the problem, it also pretty much ignored the -B and -z + command-line options, whose purpose is to work around such + problems. + * C-Kermit 8.0 could not be built on IRIX 5.x. + * The C-Kermit 8.0 build for QNX6 said it was an "(unknown + version)". + + Other fixes are listed in the [161]previous section. + + [ [162]Top ] [ [163]Contents ] [ [164]C-Kermit ] [ [165]Kermit Home ] + __________________________________________________________________________ + +2. SSH AND HTTP + + 2.1. SSH Connections + + This section does not apply to [166]Kermit 95 2.0, which has its + own built-in SSH client, which is documented [167]SEPARATELY. + + On most UNIX platforms, C-Kermit can make SSH (Secure SHell) + connection by running the external SSH command or program through its + pseudoterminal interface. The command is: + + SSH text + Tells Kermit to start the external SSH client, passing the + given text to it on the command line. Normally the text is just + the hostname, but it can be anything else that is acceptable to + the ssh client. If the command succeeds, the connection is made + and Kermit automatically enters CONNECT (terminal) mode. You + can use the SSH command to make a connection to any host that + has an SSH server. + + Kermit's SSH command gives you all the features of Kermit on an SSH + connection: command language, file transfer, character-set + translation, scripting, and all the rest. By default, C-Kermit invokes + SSH with "-e none", which disables the ssh escape character and makes + the connection transparent for purposes of file transfer. You can, + however, change the SSH invocation to whatever else you might need (an + explicit path, additional command-line arguments, etc) with: + + SET SSH COMMAND text + Specifies the system command that Kermit's SSH command should + use to invoke the external SSH client. Use this command to + supply a specific path or alternative name, or to include + different or more command-line options. + + In most cases, these connections work quite well. They can be scripted + like any other connection, and file transfer goes as fast as, or + faster than, on a regular Telnet connection. In some cases, however, + the underlying pseudoterminal driver is a limiting factor, resulting + in slow or failed file transfers. Sometimes you can work around such + problems by reducing the Kermit packet length. Note that Kermit does + not consider SSH connections to be reliable, so it does not offer to + use streaming in Kermit protocol transfers (but you can force it with + SET RELIABLE or SET STREAMING if you wish). + + The SSH command is like the TELNET command: it enters CONNECT mode + automatically when the connection is made. Therefore, to script an SSH + connection, use: + + set host /pty ssh -e none [ other-options ] host + if fail ... + + to make the connection. + + Here's a sequence that can be used to make a connection to a given + host using Telnet if the host accepts it, otherwise SSH: + + if not defined \%1 exit 1 Usage: \%0 host + set quiet on + set host \%1 23 /telnet + if fail { + set host /pty ssh -l \m(user) -e none \%1 + if fail exit 1 \%1: Telnet and SSH both fail + echo SSH connection to \%1 successful + } else { + echo Telnet connection to \%1 successful + } + + In SSH v2, it is possible to make an SSH connection direct to a Kermit + server system if the host administrator has configured the SSH server + to allow this; [168]CLICK HERE for details. + + Since Kermit uses external ssh client software, and since there are + different ssh clients (and different releases of each one), the exact + command to be used to make an SSH/Kermit connection can vary. Here is + the command for the OpenSSH 3.0.2p1 client: + +set host /pipe ssh -e none [ -l username ] -T -s hostname kermit + + Example: + +set host /pipe ssh -e none -l olga -T -s hq.xyzcorp.com kermit + + The SSH client might or might not prompt you for a password or other + information before it makes the connection; this depends on your SSH + configuration (your public and private keys, your authorized hosts + file, etc). Here's a brief synopsis of the OpenSSH client command + syntax ("man ssh" for details): + + -e none + This tells the SSH client to use no escape character. Since we + will be transferring files across the connection, we don't want + the connection to suddenly block because some character in the + data. + + -l username + This is the username on the remote host. You can omit the -l + option and its argument if your local and remote usernames are + the same. If they are different, you must supply the remote + username. + + -T + This tells the SSH client to tell the SSH server not to + allocate a pseudoterminal. We are not making a terminal + connection, we don't need a terminal, and in fact if a terminal + were allocated on the remote end, the connection would not + work. + + -s ... kermit + This tells the SSH client to tell the SSH server to start the + specified subsystem ("kermit") once the connection is made. The + subsystem name comes after the hostname. + + hostname + The IP host name or address of the desired host. + + You might want to include other or additional ssh command-line + options; "man ssh" explains what they are. Here are some examples for + the OpenSSH 3.0.2p1 client: + + -oClearAllForwardings yes + -oForwardAgent no + -oForwardX11 no + -oFallbackToRsh no + These ensure that a secure connection is used and that the + connection used for file transfer is not also used for + forwarding other things that might be specified in the + ssh_config file. + + -oProtocol 2 + (i.e. SSH v2) Ensures that the negotiated protocol supports + subsystems. + + Once you have an SSH connection to a Kermit server, it's just like any + other connection to a Kermit server (and very similar to a connection + to an FTP server). You give the client file transfer and management + commands for the server, and the server executes them. Of course you + can also give the client any other commands you wish. + + [ [169]SSH Kermit Server Subsystem ] [ [170]Kermit 95 Built-in SSH + Client ] + _________________________________________________________________ + + 2.2. HTTP Connections + + Hypertext Transfer Protocol, or HTTP, is the application protocol of + the World Wide Web (WWW), used between Web browsers (clients) and Web + servers. It allows a client to get files from websites, upload files + to websites, delete files from websites, get information about website + directories and files, and interact with server-side CGI scripts. + C-Kermit includes an HTTP client capable of both clear-text and secure + HTTP connections, that can do all these tasks and can be automated + through the Kermit scripting language. + + Although C-Kermit 7.0 could make HTTP connections to Web servers, it + could do so only when no other connection was open, and the procedure + was somewhat awkward. C-Kermit 8.0 improves matters by: + + * Allowing an HTTP connection to be open at the same time as a + regular SET LINE or SET HOST connection, and also at the same time + as an FTP connection ([171]Section 3); + * Upgrading the HTTP protocol level from 1.0 to 1.1, thus allowing + for persistent connections, in which a series of commands can be + sent on the same connection, rather than only one as in HTTP 1.0 + (and C-Kermit 7.0); + * Providing for "one-shot" URL-driven HTTP operations such as GET or + PUT. + * Providing a distinct HTTP command-line personality. + + Persistent HTTP connections are managed with the following commands: + + HTTP [ switches ] OPEN [ security-options ] host-or-url [ port ] + Opens a persistent connection to the specified host (IP host + name or address) on the specified port. If any switches + (options, listed in the next section) are included, their + values are saved and used for all subsequent HTTP action + commands on the same connection. If no port is specified, HTTP + (80) is used. A Uniform Resource Locator (URL, [172]RFC 1738) + can be given instead of a hostname (or address) and port (but + the URL can not include a directory/file path). The security + options are explained [173]below. The HTTP OPEN command + replaces the C-Kermit 7.0 SET HOST hostname HTTP command, which + no longer works with HTTP GET and related commands. + + HTTP CLOSE + Closes any open HTTP connection and clears any saved switch + values. + + A URL starts with a protocol name, which must be http or https in this + case; optionally includes a username and password; and must contain a + host name or address: + + protocol://[user[.password]]@host[:port][URI] + + HTTP is Hypertext Transfer Protocol. HTTPS is the secure (SSL/TLS) + version of HTTP. The TCP service port is derived from the protocol + prefix (so normally the ":port" field is omitted). Thus the URL + protocol name specifies a default TCP service port and the URL user + and password fields can take the place of the /USER and /PASSWORD + switches ([174]Section 2.2.1). The optional URI is a "compact string + of characters for identifying an abstract or physical resource" + ([175]RFC 2396), such as a file. It must begin with a slash (/); if + the URI is omitted, "/" is supplied. Examples: + + http open http://www.columbia.edu/ + Equivalent to http open www.columbia.edu or http open + www.columbia.edu http. + + http open https://olga.secret@www1.xyzcorp.com/ + Equivalent to http /user:olga /pass:secret open + www1.xyzcorp.com https. + + Persistence is accomplished unilaterally by C-Kermit 8.0. An HTTP 1.0 + server closes the connection after each action. Although HTTP 1.1 + allows multiple actions on the same connection, an HTTP 1.1 server + tends to close the connection if it is idle for more than a few + seconds, to defend itself against denial-of-service attacks. But when + you use Kermit's HTTP OPEN command to create a connection, Kermit + reopens it automatically (if necessary) for each HTTP action until you + close it with HTTP CLOSE, regardless of the server's HTTP protocol + version, or how many times it closes the connection. + + Firewalls can be negotiated through proxies with the following + commands: + + SET TCP HTTP-PROXY [ host[:port] ] + If a host (by hostname or IP address) is specified, Kermit uses + it as a proxy server when attempting outgoing TCP connections + -- not only HTTP connections, but all TCP/IP connections, + Telnet and FTP included. This allows Kermit to adapt to the + HTTP firewall penetration method (as opposed to other methods + such as SOCKS4). If no hostname or ip-address is specified, any + previously specified Proxy server is removed. If no port number + is specified, the "http" service is used. This command must be + given before the HTTP OPEN command if a proxy is to be used or + canceled. + + HTTP [ switches ] CONNECT host[:port] + Instructs the HTTP server to act as a proxy, establishing a + connection to the specified host (IP hostname or address) on + the given port (80 = HTTP by default) and to redirect all data + transmitted between Kermit and itself to the given host for the + life of the connection. This command is to be used only for + debugging HTTP proxy connections. If a proxy connection is + required, instruct Kermit to use the proxy with the SET TCP + HTTP-PROXY command. + + 2.2.1. HTTP Command Switches + + HTTP switches, like all other switches, are optional. When HTTP + switches are included with the HTTP OPEN command, they apply + automatically to this and all subsequent HTTP actions (GET, PUT, ...) + on the same connection until an HTTP CLOSE command is given. So if you + include switches (or the equivalent URL fields, such as user and + password) in the HTTP OPEN command, you can omit them from subsequent + commands on the same connection. If the connection has closed since + your last command, it is automatically reopened with the same options. + + If you include switches with an HTTP action command (such as GET or + PUT), they apply only to that command. + + /USER:name + To be used in case a page requires a username for access. The + username is sent with page requests. If it is given with the + OPEN command it is saved until needed. If a username is + included in a URL, it overrides the username given in the + switch. CAUTION: Username and password (and all other + information, including credit card numbers and other material + that you might prefer to protect from public view) are sent + across the network in clear text on regular HTTP connections, + but authentication is performed securely on HTTPS connections. + + /PASSWORD:text + To be used in case a web page requires a password for access. + The password is sent with page requests. If it is given with + the OPEN command it is saved until needed. If a password is + given in a URL, it overrides the one given here. CAUTION: (same + as for /USER:). + + /AGENT:user-agent + Identifies the client to the server. Overrides the default + agent string, which is "C-Kermit" (for C-Kermit) or "Kermit-95" + (for Kermit 95). + + /ARRAY:array-designator + Tells Kermit to store the response headers in the given array, + one line per element. The array need not be declared in + advance. Example: /array:&a. + + /TOSCREEN + Tells Kermit to display any response text on the screen. It + applies independently of the output file specification; thus it + is possible to have the server response go to the screen, a + file, both, or neither. + + /HEADER:header-item(s) + Used for specifying any optional headers to be sent with HTTP + requests. + + /HEADER:tag:value + + To send more than one header, use braces for grouping: + + /HEADER:{{tag:value}{tag:value}...} + + For a list of valid tags and value formats see [176]RFC 2616, + "Hypertext Transfer Protocol -- HTTP/1.1". A maximum of eight + headers may be specified. + + 2.2.2. HTTP Action Commands + + HTTP actions can occur within a persistent connection, or they can be + self-contained ("connectionless"). A persistent HTTP connection begins + with an HTTP OPEN command, followed by zero or more HTTP action + commands, and is terminated with an HTTP CLOSE command: + + http open www.columbia.edu + if failure stop 1 HTTP OPEN failed: \v(http_message) + http get kermit/index.html + if failure stop 1 HTTP GET failed: \v(http_message) + (more actions possible here...) + http close + + A self-contained HTTP action occurs when a URL is given instead of a + remote file name to an HTTP action command. In this case, Kermit makes + the HTTP connection, takes the action, and then closes the connection. + If an HTTP connection was already open, it is closed silently and + automatically. + + http get http://www.columbia.edu/kermit/index.html + + Kermit's HTTP action commands are as follows. Switches may be included + with any of these to override switch (or default) values given in the + HTTP OPEN command. + + HTTP [ switches ] GET remote-filename [ local-filename ] + Retrieves the named file from the server specified in the most + recent HTTP OPEN command for which a corresponding HTTP CLOSE + command has not been given. The filename may not include + wildcards (HTTP protocol does not support them). If no HTTP + OPEN command is in effect, this form of the HTTP GET command + fails. The default local filename is the same as the remote + name, but with any pathname stripped. For example, the command + http get kermit/index.html stores the file in the current local + directory as index.html. If the /HEADERS: switch is included, + information about the file is also stored in the specified + array (explained in [177]Section 2.2.3). All files are + transferred in binary mode. HTTP does not provide for + record-format or character-set conversion. + + HTTP [ switches ] GET url [ local-filename ] + When HTTP GET is given a URL rather than a filename, Kermit + opens a connection to the designated server (closing any + previously open HTTP connection), gets the file, and then + closes the connection. If the URL does not include a filename, + index.html is supplied. This is the self-contained one-step + "connectionless" method for getting a file from a Web server. + The data is not interpreted; HTTP GET is like "lynx -source" + rather than "lynx -dump". + + In the remaining HTTP action commands, the distinction between a + remote filename and a URL are the same as in the HTTP GET command. + + HTTP [ switches ] HEAD remote-filename-or-url [ local-filename ] + Like GET except without actually getting the file; instead it + retrieves only the headers. If the /ARRAY: or /TOSCREEN switch + is included, there is no default local output filename but you + can still specify one. If neither of these switches is + included, the default local filename is the same as the remote + filename, but with any path stripped and with ".head" appended. + The HEAD command can be used in a script with the /ARRAY: + switch to retrieve information about the requested resource to + determine whether the resource should actually be retrieved + with a subsequent GET request. + + HTTP [ switches ] INDEX remote-directory-or-url [ local-filename ] + Asks the server to send a listing of the files in the given + server directory. This command is not supported by most Web + servers. Even when it is supported, there is no standard format + for the listing. + + HTTP [ switches ] POST [ /MIME-TYPE:type ] source-file + remote-path-or-url [ result-file ] + Sends data to a process running on the remote host; the result + is usually an HTML file but could be anything. The data to be + posted must be read from a local file (the source-file). If a + result file is specified, Kermit stores the server's response + in it. + + HTTP [ switches ] PUT [ MIME-TYPE:type ] local-file [ + remote-file-or-url [ result-file ] ] + Uploads a local file to the server. Only the name of a single + file can be given; wildcards (and group transfers) are not + supported by HTTP protocol. If no remote filename is given, the + file is sent with the same name as the local file, but with any + pathname stripped. + + HTTP [ switches ] DELETE remote-file-or-url [ local-result-file ] + Asks the server to delete the specified single file. If a + result file is specified, it will contain any response data + returned by the server. + + Note the limitations of HTTP protocol compared to (say) FTP or Kermit. + There is no command for changing directories, no standard way to get + file or directory lists, no way to transfer file groups by using + wildcard notation, etc, and therefore no good way to (say) fetch all + pages, descend through subdirectories, perform automatic updates, etc. + There is no assurrance a connection will stay open and, as noted, + there is no provision for data conversion between unlike platforms. + The data's MIME headers can be used for postprocessing. + + 2.2.3. HTTP Headers + + Each HTTP request and response contains a set of name/value pairs + called headers. HTTP headers are specified in [178]RFC 2616. For + example, an HTTP GET request for /index.html on www.columbia.edu + contains the following headers: + + GET /index.html HTTP/1.1 + Host: www.columbia.edu:80 + User-agent: C-Kermit 8.0 + Authorization: Basic base64-encoded-username-password + + These might be followed by any others specified with a /HEADERS: + switch: + + Accept: image/gif, image/x-xbitmap, image/jpeg, *.* + Accept-Encoding: gzip + Accept-Language: en + Accept-Charset: iso-8859-1,utf-8 + Cookie: cookie-data + + The server sends back a short report about the file prior to sending + the file contents. Example: + + HTTP/1.1 200 OK + Date: Fri, 24 Aug 2001 21:09:39 GMT + Server: Apache/1.3.4 (Unix) + Last-Modified: Mon, 06 Aug 2001 21:16:13 GMT + ETag: "1fa137-10d7-3b6f091d" + Accept-Ranges: bytes + Content-Length: 4311 + Content-Type: text/html + + If you want to have this information available to a Kermit script you + can use the /ARRAY switch to have Kermit put it in array, one line per + array element. Example: + + set exit warning off + http open www.columbia.edu + if fail exit 1 Can't reach server + http /array:&a get /index.html + if fail exit 1 Can't get file + echo Header lines: \fdim(&a) + for \%i 1 \fdim(&a) 1 { + echo \%i. \&a[\%i] + } + + Note that the "Date:" item is the current date and time; the + "Last-Modifed:" item is the file's modification date and time. An + example showing how to use this information is presented in + [179]Section 8.13.7. + + 2.2.4. Secure HTTP Connections + + SSL/TLS (Secure Sockets Layer / Transport Layer Security) is the + protocol used to secure HTTP, SMTP, and other Internet applications. + See the [180]C-Kermit Reference Section 5.4 for an introduction to + SSL/TLS. To make a secure HTTP connection, you need: + + 1. A secure client (a version of C-Kermit or Kermit 95 with SSL/TLS + security built in). Type "check ssl" at the Kermit prompt to make + sure you have it. + 2. A secure server to connect to. + 3. The CA Root Certificate used to authenticate the server to the + client. (see [181]Section 15 of the security reference for an + introduction to certificates). + + And you must make a connection to the secure HTTP port: service name + HTTPS, port number 443 (as opposed to service HTTP, port 80). You can + also make secure connections to other ports by including the /TLS or + /SSL switch with the HTTP OPEN command, if the host supports SSL/TLS + on the given port: + + The quality of the SSL/TLS connection depends on the cipher suite. + There are several possibilities: + + Anonymous cipher suite: + If an anonymous cipher suite is negotiated, the connection is + encrypted but there is no authentication. This connection is + subject to a Man-In-The-Middle (MITM) attack. + + X.509 certificate on the server: + When you connect to certain secure servers, an X.509 + certificate is returned. This certificate is issued to a + special hostname, something like www1.xyzcorp.com or + wwws.xyzcorp.com (rather than the normal www.xyzcorp.com). It + is signed by the host's Certificate Authority (CA). If the host + certificate is configured on the client, it can be used to + verify the certificate received from the server. If the + certificate it verified as authentic, a check is made to ensure + it has not expired and it was issued to the host you were + attempting to connect to. If you had asked to connect to (say) + www.xyzcorp.com but were given a certificate for + www1.xyzcorp.com, you would be prompted for permission to + continue. + + If the verification succeeded, the connection would be + encrypted with one-way (server-to-client) authentication. This + connection is not subject to a MITM attack. + + If a username and password are transmitted over this + connection, they are not subject to interception. However, the + standard risks associated with passing the password to the host + for verification apply; for example, if the host has been + compromised, the password will be compromised. + + X.509 client certificate: + If a connection has been established with an X.509 server + certificate, the server can ask the client to send a + certificate of its own. This certificate must be verified + against a CA Root certificate. The certificate itself (or + subject info from the certificate) is used to determine the + authorization for the client, and if successful, the username + and password need not be sent to the server. + + Kerberos 5: + Instead of using X.509 certifcates, Kerberos 5 can be used to + perform the authentication and key exchange. In this situation, + there is mutual authentication between the client and server. + The Kerberos 5 principal is used by the server to look up the + appropriate authorization data. There is no need to send + username and password. + + An HTTP connection is made with the HTTP OPEN command: + + HTTP [ switches ] OPEN [ { /SSL, /TLS } ] host [ port ] + If /SSL or /TLS switches are included (these are synonyms), or + if the service is HTTPS or the port is 443, a secure connection + is attempted using the current authentication settings; see + HELP SET AUTHENTICATION for details ([182]Section 6.2 of the + security reference). If the no /SSL or /TLS switch is included + but the port is 443 or the service is HTTPS, a secure + connection is attempted. If an /SSL or /TLS switch is included + but a port is not specified, an SSL/TLS connection is attempted + on the default port (80). + + Certificates are covered in the separate [183]Kermit Security + Reference for C-Kermit 8.0. You should let Kermit know to verify + certificates with the SET AUTHENTICATION TLS command. For example: + + SET AUTHENTICATION TLS CRL-DIR directory + Specifies a directory that contains certificate revocation + files where each file is named by the hash of the certificate + that has been revoked. + + SET AUTHENTICATION TLS CRL-FILE filename + Specifies a file that contains a list of certificate + revocations. + + SET AUTHENTICATION TLS VERIFY-DIR directory + Specifies a directory that contains root CA certificate files + used to verify the certificate chains presented by the peer. + Each file is named by a hash of the certificate. + + SET AUTHENTICATION TLS VERIFY-FILE filename + Specifies a file that contains root CA certificates to be used + for verifying certificate chains. + + SET AUTHENTICATION TLS VERIFY OFF + Tells Kermit not to require a certificate and accept any + certificate that is presented regardless of whether it is + valid. + + There are many other options; see the security document for details. + + Now suppose you need need to fetch the file denoted by the following + URL: + + https://myuserid:mypassword@wwws.xyzcorp.com/clients/info/secret.html + + Once you have set up the handling of certificates as desired, you can + use the following Kermit commands: + + http /user:myuserid /password:mypassword open www1.xyzcorp.com https + if success { + http get /clients/info/secret.html + http close + } + + As another example, let's say that you have a web form you need to + populate with three fields: red,white and blue. + +
+ + + +
+ + You can handle this with the HTTP POST command. The data to be posted + is stored in the local file data.txt. + + Red=seven stripes&White=six stripes&Blue=fifty stars + + and the response from the server will be stored into response.txt. + + http open www.xyzcorp.com http + if success { + http /array:c post data.txt /cgi-bin/form.cgi response.txt + http close + } + + In this scenario, the Common Gateway Interface (CGI) sends a response + whether it succeeds or fails in a script-dependent manner. The script + can either report success and enclose the response data; or it might + send a 302 Found error which indicates that the "Location:" header + should be used to determine the URL at which the data can be found. + + 2.2.5. HTTP Variables + + \v(http_code) + The HTTP protocol code number of the most recent server reply, + e.g. 404 for "not found". + + \v(http_connected) + 1 when an HTTP connection is open, 0 when there is no HTTP + connection. + + \v(http_host) + If an HTTP connection is open, the hostname:port, e.g. + www.columbia.edu:80; otherwise, empty. + + \v(http_message) + Server error message, if any, from most recent HTTP command. + + \v(http_security) + A list of the security parameters and values for the current + connection, if any. Empty if the connection is not to a secure + server, or there is no connection. + + To display all the HTTP variables at once, type SHOW VAR HTTP: + + C-Kermit> http open www.columbia.edu + C-Kermit> http get lkjlkjlkjlkj + C-Kermit> sho var http + \v(http_code) = 404 + \v(http_connected) = 1 + \v(http_host) = www.columbia.edu:80 + \v(http_message) = Not Found + \v(http_security) = NULL + C-Kermit> + + 2.2.6. The HTTP Command-Line Personality + + If you invoke C-Kermit with the name "http" or "https", you can use a + special set of HTTP-specific command-line options. You can do this by + creating a symbolic linke "http" or "https" to the C-Kermit 8.0 + executable, or by having a separate copy of it called "http" or + "https". Here's the usage message ("http -h"): + + Usage: ./http host [ options... ] + -h This message. + -d Debug to debug.log. + -S Stay (issue command prompt when done). + -Y Do not execute Kermit initialization file. + -q Quiet (suppress most messages). + -u name Username. + -P password Password. + -g pathname Get remote pathname. + -p pathname Put remote pathname. + -H pathname Head remote pathname. + -l pathname Local path for -g, -p, and -H. + -z opt[=value] Security options... + cert=file Client certificate file + certsok Accept all certificates + key=file Client private key file + secure Use SSL + verify=n 0 = none, 1 = peer , 2 = certificate required + + The "host" argument is the name of a Web host, e.g. www.columbia.edu. + The action options are -p, -g, and -H. If you give an action option, + Kermit does the action and then exits. If you give a host without an + action option, Kermit makes an HTTP connection to the host and then + gives you the C-Kermit prompt. Here's a simple example that fetches a + publicly readable Web page: + + http www.columbia.edu -g kermit/index.html + + If you need to access a website for which a username and password are + required, you can supply them on the command line with -u and -P. If + you include a username but omit the password, Kermit prompts you for + it: + + http www.columbia.edu -u olga -p kermit/index.html -l index.html + Password: + + Note that when PUT'ing files to websites, you have to supply both the + -p (remote pathname) and -l (local path) options. + + If your version of Kermit is built with SSL/TLS security, you can also + use the -z option to make secure HTTP (https) connections. + + Finally, as noted in [184]Section 16, you can also give a URL instead + of a host name and options. + + [ [185]Top ] [ [186]Contents ] [ [187]C-Kermit Home ] [ [188]Kermit + Home ] + __________________________________________________________________________ + +3. THE BUILT-IN FTP CLIENT + + 3.1. [189]Making and Managing FTP Connections + 3.2. [190]Making Secure FTP Connections + 3.3. [191]Setting FTP Preferences + 3.4. [192]Managing Directories and Files + 3.5. [193]Uploading Files With FTP + 3.6. [194]Downloading Files With FTP + 3.7. [195]Translating Character Sets + 3.8. [196]FTP Command Shortcuts + 3.9. [197]Dual Sessions + 3.10. [198]Automating FTP Sessions + 3.11. [199]Advanced FTP Protocol Features + + Earlier versions of C-Kermit and K95 included an FTP command, but it + simply invoked an external FTP client. Now, by popular demand, Kermit + includes its own built-in FTP client that offers the following + advantages over traditional FTP clients (and its previous interface to + them): + + * Any of Kermit's built-in [200]security methods can be used to + establish and conduct secure FTP sessions with [201]FTP servers + that support these methods. (Security modules can be subject to + export restrictions.) + * Kermit's FTP client uses "passive mode" by default to avoid + blockage by firewalls and network address translators. Of course + active mode can be chosen too when needed. + * [202]Character sets can be translated as part of the transfer + process even when the FTP server does not support character-set + translation, including to/from the new Internet standard + international character set, [203]Unicode UTF-8. This includes + both the file's name and (for text files only) its contents. + * All of C-Kermit's [204]file-selection mechanisms are available: + size, date, name patterns and lists, exception lists, etc. + * [205]Atomic file movement capabilities are provided (delete, move, + or rename files automatically after successful transfer). + * The correct file type, "ascii" (i.e. text) or binary, is chosen + automatically for each file (explained in [206]Section 4), and any + mixture of text and binary files can be sent in a single + operation, even across platforms. + * Update mode ("don't bother transferring files that didn't change + since last time") and recovery (resumption of an interrupted + transfer from the point of failure) are available in both + directions. + * When uploading files from UNIX to UNIX, the file's permissions can + be preserved if desired. + * Recursive directory-tree PUTs are supported between any two + platforms that have tree-structured file systems. Recursive GETs + are supported between like platforms if the server cooperates and + between like or unlike platforms if the server supports MLSD + ([207]Section 3.11). + * When receiving files, all of Kermit's file collision actions are + available: backup, update, refuse, rename, etc. + * Multi-file transfers can be interrupted on a per-file basis, + automatically skipping to the next file. + * FTP sessions are [208]fully scriptable. + * An entire FTP session (connect, login, CD, upload or download, + logout) can be specified on the command line without using a + script. + * All of Kermit's logging options and formats are available to keep + an accurate and complete record of each connection and file + transfer, and to aid in troubleshooting. + * All of Kermit's file-transfer display options are available + (fullscreen, brief, CRT, serial, none). + + And best of all: + * Kermit doesn't give you those annoying per-file prompts every time + you start a multi-file transfer without remembering to give a + "prompt" command first :-). + + [ [209]Top ] [ [210]FTP Top ] [ [211]FTP Client Overview ] [ [212]FTP + Script Tutorial ] [ [213]C-Kermit Home ] [ [214]Kermit Home ] + _________________________________________________________________ + + 3.1. Making and Managing FTP Connections + + Each copy of Kermit can have one FTP connection open at a time. FTP + connections are independent of regular terminal connections; a + terminal connection (serial or network via SET LINE, DIAL, SET HOST, + TELNET, etc) may be, but need not be, open at the same time as an FTP + connection, and terminal connections can also be closed, and new + connections opened, without interfering with the FTP connection (and + vice versa). Thus, for example, Kermit can have an FTP connection and + a TELNET connection open to the same host simultaneously, using the + TELNET connection (e.g.) to send mail or take other desired actions as + various FTP actions complete. Of course, each copy of Kermit can do + only one thing at a time, so it can't (for example) transfer a file + with FTP and another file with Kermit protocol simultaneously. + + A Kermit FTP session can be established by [215]command-line options, + by [216]URL, or by [217]interactive commands. + + 3.1.1. Kermit Command-Line Options for FTP + + The new command-line option '-9' (sorry, we're out of letters) can be + used when starting C-Kermit, telling it to make an FTP connection: + + kermit -9 hostname + + or if a non-default FTP port is needed: + + kermit -9 hostname:port + + You can also specify the username on the command line with the -M ("My + User ID") option that was already there for other connection types: + + kermit -9 hostname -M olga + + If you specify the username on the command line, Kermit uses it when + making the connection and does not prompt you for it (but it does + prompt you for the password if one is required). + + Once the connection is made, you get the regular Kermit prompt, and + can give interactive commands such as the ones described below. When + you give a BYE command, Kermit closes the session and exits, just as a + regular FTP client would do. If you don't want Kermit to exit when you + give a BYE command, include the -S ("Stay") option on the command + line. + + Other Kermit command-line options that are not specific to non-FTP + connections should affect the FTP session in the expected ways; for + example, -i and -T force binary and text mode transfers, respectively. + + File transfers can not be initiated on the "kermit -9" command line; + for that you need to use Kermit's FTP personality (next section) or + you can use URLs ([218]Section 3.1.3). + _________________________________________________________________ + + 3.1.2. The FTP Command-Line Personality + + If you want to replace your regular FTP client with C-Kermit, you can + make a link called "ftp" to the C-Kermit binary (or you can store a + copy of the C-Kermit binary under the name "ftp"). When C-Kermit is + invoked with a program name of "ftp" (or "FTP", case doesn't matter), + it assumes the command-line personality of the regular FTP client: + + ftp [ options ] hostname [ port ] + + In this case the options are like those of a regular FTP client: + + -d Debug: enables debug messages and creates a debug.log file. + -n No autologin: Kermit should not send your user ID automatically. + -t Packet trace: accepted but is treated the same as -d. + -v Verbose: accepted but ignored (operation is verbose by default). + -i Not interactive: accepted but ignored. + + and the hostname can also be a URL (explained in [219]Section 3.1.3). + To specify a non-default TCP port for the FTP server, include the port + number or name after the hostname. + + There are also some bonus options that allow you to execute an entire + FTP session from the shell command line, as long as you don't include + the -n option. These are not available with regular FTP clients, and + at least one of these options (-g) conflicts with UNIX ftp (where -g + means "no globbing", which does not apply to Kermit), and some of them + (like the options above) also conflict with regular Kermit + command-line options: + + -m mode = "passive" (default) or "active" + -Y Don't execute the Kermit initialization file [1] + -q Quiet, suppresses all but error messages [1] + -S Stay, don't exit automatically [1] + -A Autologin anonymously [2] + -u name Username for autologin [2] (synonym: -M [1]) + -P password Password for autologin (see cautions below) [2] + -D directory cd after autologin [2] + -b Binary mode [2] + -a Text ("ascii") mode [2] (synonym: -T [1]) + -R Recursive (works with -p) [4] + -p files Files to put (upload) after autologin [2] (synonym: -s [1]) + -g files Files to get (download) after autologin [3] + + [1] Same as Kermit, not available in regular FTP clients. + [2] Conflicts with Kermit, not available in regular FTP clients. + [3] Same as Kermit, conflicts with regular FTP clients. + [4] Conflicts with Kermit, available in some FTP clients. + + Fancier options such as restart, character-set translation, filename + collision selection, automatic move/rename/delete, etc, are not + available from the command line; for these you can use the commands + described in the following sections. The -R option might also work + with -g (GET) but that depends on the server. + + The following security options are also available, explained in + [220]Section 3.2: + + -k realm Kerberos 4 realm [4] + -f Kerberos 5 credentials forwarding [4] + -x autoencryption mode [4] + -c cipher SRP cipher type [4] + -H hash SRP encryption hash [4] + -z option Security options [4] + + If you include -A or specify a name of "anonymous" or "ftp", you are + logged in anonymously and, in the absence of -P, Kermit automatically + supplies a password of "user@host", where "user" is your local user + ID, and "host" is the hostname of the computer where Kermit is + running. If you do not include -p or -g, Kermit enters command mode so + you can type commands or execute them from a script. + + If you include -p or -g, Kermit attempts to transfer the specified + files and then exits automatically at the end of the transfer unless + you also included -S (Stay). It uses the "brief" file transfer display + (one line per file) unless you include the -q option to suppress it. + + When uploading files with -p, Kermit switches automatically between + text and binary mode for each file. + + When downloading, you can either specify a particular mode (text or + binary) to be used for all the files, or you can let Kermit select the + type for each file automatically, based on its name (see [221]Sections + 3.5 and [222]3.6 for greater detail). In UNIX be sure to quote any + wildcard characters to prevent the shell from expanding them, as shown + in the examples just below. Filename collisions are handled according + Kermit's FILE COLLISION setting (if specified in your Kermit + customization file; otherwise the default, which is BACKUP). + + It should go without saying that the -P option should be used with + caution. In addition to the well-known risks of transmitting plaintext + passwords over the Internet, in this case the password also echos to + the screen if you type it, and can be seen in ps and w listings that + show the user's currently active command and command-line arguments. + Thus command-line FTP sessions are most appropriate for secure or + anonymous connections (those that do not require passwords). + + Here's an example in which you download the latest C-Kermit "tarball" + from the Columbia University FTP archive: + + ftp -A kermit.columbia.edu -bg kermit/archives/ckermit.tar.gz + + This assumes that "ftp" is a symbolic link to C-Kermit. It logs you in + anonymously and gets the ckermit.tar.gz file in binary mode from the + kermit/archives directory. + + Here's a slightly more ambitious example that illustrates CD'ing to + the desired server directory to get a group of files in text mode (in + this case the C-Kermit source files): + + ftp -A kermit.columbia.edu -D kermit/f -ag "ck[cuw]*.[cwh]" makefile + + In this case we CD to the kermit/f directory so we don't have to + include it in each file specification, and we quote the ck[cuw]*.[cwh] + specification so the shell doesn't expand it, since we have to pass it + as-is to the server. Note also that the quotes don't go around the + entire file list; only around each file specification that needs to be + quoted. + + Here's one more example, that uploads a debug log file in binary mode + to the Kermit incoming directory (as we might ask you to do when + following up on a problem report): + + ftp -A kermit.columbia.edu -D kermit/incoming -bp debug.log + + In this case the -D option is required to tell the server where to put + the incoming file. + + Unless the -Y option is included, your Kermit initialization file + (.mykermrc in UNIX, K95.INI in Windows) is executed before the command + line options, so you can set any FTP-related preferences there, as + described in the subsequent sections. + _________________________________________________________________ + + 3.1.3. The FTP URL Interpreter + + If Kermit is invoked with either its regular personality (as "kermit") + or its FTP personality (as "ftp"), you can also give a URL + (Universal Resource Locator) instead of a hostname and options, + with or without a username and password: + ftp ftp://user:password@host/path + ftp ftp://user@host/path + ftp ftp://@host/path (or ftp://:@host/path) + ftp ftp://host/path + kermit ftp://host/path + + If the FTP personality is used, the service must be "ftp". In all + cases, a hostname or address must be included. If a user is included + but no password, you are prompted for the password. If a path + (filename) is included: + * If "@" is included without a user, Kermit prompts for the username + and password. + * If no user and no "@" are included, "anonymous" is used. + * GET is assumed. + + If no path (and no action options) are included, an interactive FTP + session is started, as in this example: + ftp ftp://kermit.columbia.edu + + If a path is included, but a username is not included, "anonymous" is + used and an appropriate user@host password is supplied automatically. + If authentication is successful, Kermit attempts to GET the file + indicated by the path or, if the path is the name of a directory, it + asks the server for a directory listing. In both cases, Kermit + disconnects from the server and exits after the operation is complete + (unless you have included the -S option on the command line). + + Here's an example that gets a listing of the Kermit directory at the + Kermit ftp site: + ftp ftp://kermit.columbia.edu/kermit/ + + This example gets the top-level READ.ME file from the same directory: + ftp ftp://kermit.columbia.edu/kermit/READ.ME + + Here's the same example, but requesting a text-mode transfer: + ftp -T ftp://kermit.columbia.edu/kermit/READ.ME + This illustrates that you can mix command-line options and URLs + if you desire. + + Here's an example that logs in as a (fictitious) real user to get a + file: + ftp ftp://olga@ftp.xyzcorp.com/resume.txt + The password is not included, so Kermit prompts for it. + + This scheme allows Kermit to be used as the FTP helper of other + applications, such as Web browsers, with all its advantages over other + FTP clients (especially the ones that are built in to most Web + browsers), e.g. that it can be given wildcards, and it can pick text + and binary mode automatically for each file. + + HINT: suppose somebody sends you an FTP URL in email, or you see it in + some text. If your terminal screen supports copy/paste, copy the url, + and then at the shell prompt type "kermit", a space, and then paste + the URL, e.g.: + + $ kermit ftp://alpha.greenie.net/pub/mgetty/source/1.1/mgetty1.1.27-O + + "$ is the shell prompt; the part you type is underlined, the rest is + pasted in. Kermit does the rest. + _________________________________________________________________ + + 3.1.4. Interactive FTP Session Establishment + + As you read this and the following sections, bear in mind that any + command that can be given at the prompt can also be used in a script + program. Kermit's script programming language is the same as its + interactive command language. [223]CLICK HERE if you would like to + learn a bit more about script writing. + + An FTP session is established with the FTP OPEN command: + + FTP [ OPEN ] [ { /SSL, /TLS } ] hostname [ switches ] [ port ] + Opens an FTP connection to the given host on the given port + and, if FTP AUTOLOGIN is ON, also logs you in to the server, + prompting for username and password if necessary. If no port is + specified, the regular FTP protocol port (21) is used. The OPEN + keyword is optional (unless the hostname conflicts with one of + the FTP command keywords, which you can list by typing "ftp + ?"). + + The hostname can be an IP host name, numeric IP address, or if you + have a network directory active (SET NETWORK DIRECTORY; see Chapter 6 + of [224]Using C-Kermit), an entry name in the directory. In the latter + case, if the given hostname matches exactly one entry, the associated + name or address is used; if it matches more than one, Kermit cycles + through them until one is found that can be opened; if it matches + none, then the hostname is used as-is. If a directory is active but + you want to bypass directory lookup, include an "=" sign at the + beginning of the hostname, and/or use a numeric IP address. + + When an FTP connection is opened, the default file-transfer mode is + set to binary if the client and server platforms are alike (e.g. both + of them are some kind of UNIX), and to text ("ascii") if they are not + alike. This has no particular effect for uploading since Kermit + automatically switches between text and binary mode for each file, but + might be important for downloading. The connection is also set to + Stream mode and File structure. Record- or page-oriented file + transfers are not supported by C-Kermit's FTP client. + + The optional FTP OPEN switches are: + + /ANONYMOUS + Logs you in anonymously, automatically supplying username + "anonymous" and user@host as the password, based on your local + user and host names. + + /NOLOGIN + + Overrides SET FTP AUTOLOGIN ON for this connection only. + + /USER:name + Uses the given username to log you in, thus avoiding the Name: + prompt. + Overrides SET FTP AUTOLOGIN OFF for this connection only. + + /PASSWORD:text + Uses the given text as your password, thus avoiding the + Password: prompt. This switch is not recommended for use in + script files, which would be a security risk. + + /ACCOUNT:text + Uses the given text as your account (or secondary password, + depending on the requirements of the server; most servers do + not require or accept an account name). If an account is not + supplied, you are not prompted for one. + + /PASSIVE + Opens the connection in passive mode. Passive mode is the + default in Kermit's FTP client, unlike in most others, since it + works better through firewalls. The /PASSIVE and /ACTIVE + switches apply only to the connection that is being opened, and + do not affect the global FTP PASSIVE-MODE setting. + + /ACTIVE + Opens the connection in active mode. Use this switch if the + server does not support passive mode, or use the command SET + FTP PASSIVE-MODE OFF. + + /NOINIT + Added in C-Kermit 8.0.201. Tells C-Kermit not to send REST, + STRU, FEAT, and MODE commands to the server when the connection + is opened, since these have been reported to cause confusion in + certain servers. + + When a username or password is missing, a prompt is issued at the + controlling terminal and you must type the response; the response can + not be scripted. Use the switches to avoid prompts, or one of the + secure authentication methods described in the next section, or see + [225]SET FTP AUTOLOGIN and the [226]FTP USER and similar commands + described later in this section. + + Examples: + + ftp open kermit.columbia.edu /anonymous ; Open and log in anonymously + ftp kermit.columbia.edu /anonymous ; The OPEN keyword can be omitted + ftp xyzcorp.com ; Open and maybe prompt for username + ftp xyzcorp.com /user:olga ; Open and log in as olga + ftp testing.abccorp.com 449 ; Specify a special TCP port number + ftp testing.abccorp.com /user:olaf /password:secret 449 + + The FTP OPEN command succeeds if a connection was opened to the server + (even if the given username and password were not valid) and fails + otherwise (see [227]Section 3.8 for details). + + When your FTP session is complete, you can terminate it as follows: + + FTP BYE + Closes the FTP connection if one was open. The FTP prefix can + be omitted if no other connection is open at the same time (see + [228]Section 3.8 for details). If a connection log is active, + an FTP record is written to it. If Kermit was started with the + -9 command-line option or with its FTP command-line + personality, and the -S (Stay) option was not given, AND there + is no other active connection, the FTP BYE command also exits, + just as it does on a regular FTP client. Synonyms: FTP CLOSE, + FTP QUIT (but if the FTP prefix is omitted from QUIT, this + becomes the regular Kermit QUIT command, which is equivalent to + EXIT; i.e. it closes the connection and exits from Kermit). + + The following commands can be used to achieve greater control over the + connection and login process: + + SET FTP ANONYMOUS-PASSWORD text + Allows you to choose the password text to be sent automatically + by Kermit when you open an FTP connection with the /ANONYMOUS + switch. + + SET FTP AUTOLOGIN { ON, OFF } + If you give this command prior to opening an FTP connection, it + controls whether Kermit tries to log you in automatically as + part of the connection process. Normally ON, which means the + username and password are sent automatically (and prompted for + if they are not yet known). When OFF, FTP OPEN connects to the + server without logging in. OFF is equivalent to the -n + command-line option when using Kermit's FTP command-line + personality. + + FTP USER name [ password [ account ] ] + Used to log in to an FTP server to which a connection has been + made without autologin, or when autologin failed. If the + password is furnished on the command line, it is used; + otherwise you are prompted for a password. An account may also + be furnished if required by the server; it is not required by + Kermit and is not prompted for if omitted. Synonyms: USER, FTP + LOGIN. + + FTP ACCOUNT text + Sends an account name to a server that supports accounts. If + the server does not support accounts, an error response occurs. + If the server does support accounts, the account is accepted if + it is valid and rejected if it is not. The account might be + used for charging purposes or it might be a secondary password, + or it might be used for any other purpose, such as an access + password for a particular disk. Servers that support accounts + might or might not allow or require the account to be sent + prior to login; usually it is sent after login, if at all. + Synonym: ACCOUNT. + + Example: + +set ftp autologin off ; One thing at a time please +ftp xyzcorp.com ; Try to make the connection +if fail exit 1 FTP connection failed ; Check that it was made +ftp user olga secret ; Now log in to the server +if fail exit 1 FTP login failed ; Check that it worked +ftp account 103896854 ; Login OK - send account +if fail echo WARNING - FTP ACCT failed ; Warn if problem +... ; (have session here) +bye ; Log out and disconnect + + The following commands are used to control or get information about + the FTP connection. Any particular FTP server does not necessarily + support all of them. + + FTP RESET + Terminates a user session but leaves the connection open, + allowing a new login via FTP USER. + + FTP IDLE [ number ] + Most FTP servers automatically log you out and and disconnect + your session if there has been no activity for a certain amount + of time. Use this command to ask the server to set its idle + limit to the given number of seconds. Omit the number to ask + the server to inform you of its current idle limit. + + FTP STATUS [ filename ] + Asks the FTP server to send information about the current + session. The result is a free-format report that might include + server identification, username and login time, FTP protocol + settings, and file-transfer statistics. If a filename is given, + the server is supposed to send detailed information about the + file. + + FTP SYSTEM + Asks the FTP server to identify its operating system (Listed in + Internet Assigned Numbers, Operating System Names). Examples: + UNIX, VMS, VM/CMS, WINDOWS-NT. Unfortunately many variations + are allowed (e.g. LINUX-2.0, LINUX-2.2, FREEBSD, ULTRIX, etc, + instead of UNIX; WINDOWS-NT-3, WINDOWS-NT-3.5, WINDOWS-NT-3.51, + WINDOWS-NT-4, etc). The report might also include other + information like "Type L8", "Type I", or "Type A", indicating + the file-transfer mode. + + FTP HELP [ keyword [ keyword [ ... ] ] + Asks the server to list the commands it supports. The response + is usually cryptic, listing FTP command mnemonics, not the + commands used by the client (since the server has no way of + knowing anything about the client's user interface). For + example, the PUT command is STOR in FTP protocol. If a keyword + is given, which should be an FTP protocol command, + slightly-more- detailed help is given about the corresponding + command (if the FTP server supports this feature). Examples: + "ftp help", "ftp help stor". + + FTP SITE text + (Advanced) Sends an FTP SITE (site-specific) command. Usually + this means that the FTP server is asked to run an external + command with the given arguments. You might be able to find out + what SITE commands are available by sending "ftp help site" to + the server, but in general the availability of and response to + SITE commands is (not surprisingly) site specific. + + FTP QUOTE text + (Advanced) Sends an FTP command in FTP protocol format. Use + this command to send commands to the server that the FTP client + might not know about. + + SHOW FTP + Lists client (Kermit) FTP settings and information. Also SHOW + CONNECTION, SHOW COMMUNICATIONS. + + HELP FTP [ keyword ] + Asks Kermit to list and describe its built-in FTP commands. + + HELP SET FTP [ keyword ] + Asks Kermit to list and describe its built-in SET FTP commands. + + [ [229]Top ] [ [230]FTP Top ] [ [231]C-Kermit Home ] [ [232]Kermit + Home ] + _________________________________________________________________ + + 3.2. Making Secure FTP Connections + + Also see: [233]Accessing IBM Information Exchange with Kermit. + + In the previous section, you can see several examples of traditional + insecure authentication: username and password sent across the network + in clear text. Of course this is bad practice on at least two counts: + (1) storing passwords in files (such as script files) gives access to + the target systems to anybody who can obtain read access to your + scripts; and (2) sending this information over the network leaves it + open to interception by network sniffers or compromised hosts. + + Because of the increasing need for security on the Internet, FTP + servers are beginning to appear that offer secure forms of + authentication, in which no information is sent over the network that + would allow anyone who intercepts it to usurp your identity and gain + your access rights. + + Kermit provides an equivalent form of FTP security for each type of + IETF standard security implemented in Telnet. These include + GSSAPI-KERBEROS5, KERBEROS4, Secure Remote Password (SRP), and + Transport Layer Security (SSL and TLS). It does not presently include + SSL tunneling nor any form of SSH v1 or v2. When Kermit is built with + the necessary libraries, secure FTP connections are attempted by + default, in which all connections are authenticated and the command + and data channels are private. + + The use of authentication and encryption for FTP connections can be + adjusted with the commands listed below, which are available only if + your version of Kermit was built with the corresponding security + options and libraries: + + SET FTP AUTHTYPE { AUTOMATIC, GSSAPI-KRB5, KERBEROS4, SRP, SSL, TLS } + Specifies an ordered list of authentication methods to be + attempted when AUTOAUTHENTICATION is ON. The default list is: + GSSAPI-KRB5, SRP, KERBEROS_V4, TLS, SSL. If none of the + selected methods are supported by the server, an insecure login + is used as a fallback. Note, by the way, that SSL or TLS can be + used to secure an anonymous connection. + + SET FTP AUTOAUTHENTICATION { ON, OFF } + Tells whether authentication should be negotiated by the FTP + OPEN command. Default is ON. Use SET FTP AUTOAUTHENTICATION OFF + to force a clear-text, unencrypted connection to FTP servers + (such as the one at the Kermit FTP site) that normally would + try to negotiate secure authentication and encryption. + + SET FTP AUTOENCRYPTION { ON, OFF } + Tells whether encryption (privacy) should be negotiated by the + FTP OPEN command, which can happen only if secure + authentication is also negotiated. Default is ON. + + SET FTP AUTOLOGIN { ON, OFF } + Tells Kermit whether to try logging in automatically when you + make an FTP connection, as opposed to letting you do it "by + hand" with the FTP USER command. + + SET FTP COMMAND-PROTECTION-LEVEL { CLEAR, CONFIDENTIAL, PRIVATE, SAFE + } + Determines the level of protection applied to the command + channel: + + CLEAR Data is sent in plaintext and not protected against tampering. + CONFIDENTIAL Data is encrypted but not protected against tampering. + PRIVATE Data is encrypted and is protected against tampering. + SAFE Data is sent in plaintext but protected against tampering. + + The default is PRIVATE. + + SET FTP CREDENTIAL-FORWARDING { ON, OFF } + Tells whether end-user credentials are to be forwarded to the + server if supported by the authentication method (GSSAPI-KRB5 + only). This is often required to allow access to distributed + file systems (e.g. AFS.) + + SET FTP DATA-PROTECTION-LEVEL { CLEAR, CONFIDENTIAL, PRIVATE, SAFE } + Tells what level of protection is applied to subsequent data + channels. The meanings of the protection-level keywords are the + same as for SET FTP COMMAND-PROTECTION-LEVEL. The default is + PRIVATE. + + SET FTP SRP CIPHER name + Specifies the cipher to be used for encryption when SRP + authentication is in use. The list of possible choices is + computed based on the capabilities of the local SRP library and + includes NONE plus zero or more of the following: + + BLOWFISH_ECB CAST5_ECB DES_ECB DES3_ECB + BLOWFISH_CBC CAST5_CBC DES_CBC DES3_CBC + BLOWFISH_CFB64 CAST5_CFB64 DES_CFB64 DES3_CFB64 + BLOWFISH_OFB64 CAST5_OFB64 DES_OFB64 DES3_OFB64 + + The default is DES3_ECB. + + SET FTP SRP HASH name + Specifies the hash to be used for data protection when SRP + authentication is in use. The choices are MD5 and SHA. The + default is SHA. + + Command-line options: + + -k name + Specifies the realm to be used with Kerberos 4 authentication + (= SET AUTH K4 REALM name). + + -f + Enables forwarding of Kerberos 5 credentials to the host when + using GSSAPI authentication (= SET AUTH K5 FORWARDABLE ON). + + -x + Enables autoencryption (= SET FTP AUTOENCRYPTION ON). + + -c cipher + Specifies the kind of cipher to be used for encryption with SRP + authentication. Equivalent to SET FTP SRP CIPHER, with the same + choices. If this option is not given, CAST5_CBC is used. + + -H hash + Specifies the hash to be used for encryption with SRP + authentication. Equivalent to SET FTP SRP HASH, with the same + choices. If this option is not given, SHA is used. + + -z debug + Turns on SSL/TLS debugging. + + -z secure + Requires secure connection. + + -z certsok + Says to accept all certificates without checking validity. + + -z verify=n + Sets certificate verification mode to the given number, n: + 0 = no verification + 1 = verify certificate if presented + 2 = require verification of certificate + + -z cert=filename + Specifies a file containing a client certificate to be + presented to the FTP server. + + -z key=filename + Specifies a file containing a private key matching the client + certificate. + + -z !krb4 + (nokrb4) Disables the use of Kerberos 4. + + -z !gss + -z nogss + Disables the use of GSSAPI - Kerberos 5. + + -z !srp + -z nosrp + Disables use of SRP. + + -z !ssl + -z nossl + Disables the use of SSL. + + -z !tls + -z notls + Disables the use of TLS. + + Caution: If your FTP connection is secured via AUTH TLS, it is not + possible to interrupt a file transfer. This is a limitation of all + known FTP servers that support AUTH TLS. + + Note that when using certain security methods, such as SSL or TLS, you + may be prompted to confirm or verify certain actions or conditions, + for example, whether to accept self-signed certificates. This can + interfere with unattended operation of scripts; see [234]Section 3.10. + + [ [235]Top ] [ [236]FTP Top ] [ [237]C-Kermit Home ] [ [238]Kermit + Home ] + _________________________________________________________________ + + 3.3. Setting FTP Preferences FTP preferences can be set globally and + persistently with the commands in the following sections; many of + these can also be overridden on a per-command basis with switches that + have the same name. + + 3.3.1. Logs, Messages, and Other Feedback + + You can control the amount of feedback received from your FTP session + with the commands in this section. First, you can create a log of your + FTP transfers with the following commands: + + SET TRANSACTION-LOG { VERBOSE, FTP, BRIEF } + Selects the log format. VERBOSE is the default, and is + described in [239]the manual. FTP chooses a WU-FTPD format, the + same as is used by the popular FTP server. BRIEF creates + per-file records in comma-separated-list format. For greater + detail, see [240]Section 4.17 of the [241]C-Kermit 7.0 Update + Notes. + + LOG TRANSACTIONS filename + Records FTP (or Kermit, or any other protocol) uploads and + downloads in the given file using the format selected by the + most recent SET TRANSACTION-LOG command, if any, or else the + default format. + + FTP screen messages and displays are controlled by the following + commands: + + SET TRANSFER DISPLAY { FULLSCREEN, CRT, SERIAL, BRIEF, NONE, OFF } + FTP transfers use Kermit's normal file-transfer display styles. + Use this command to choose the desired format; the default on + most platforms is FULLSCREEN. The display is automatically + disabled if Kermit is running in the background or in batch. + BRIEF is always used for command-line initiated transfers + (unless suppressed by -q). While a file-transfer is in + progress, you can interrupt it in the normal Kermit way by + typing one of the following keys or key combinations: + X - Cancel current file but go on to the next one (if any). + Z - Cancel the entire transfer. Ctrl-L or Ctrl-W - Refresh + the file-transfer display (if any). + + SET FTP DISPLAY { FULLSCREEN, CRT, SERIAL, BRIEF, NONE, OFF } + Like SET TRANSFER DISPLAY, but applies only to FTP connections, + and does not affect Kermit- or other protocol file transfers. + + SET QUIET { ON, OFF } + This command applies to Kermit in general, not just FTP. OFF by + default; when ON, it surpresses most messages from most + commands as well as the file-transfer display. + + SET FTP PROGRESS-MESSAGES { ON, OFF } + Tells whether Kermit should print locally-generated feedback + messages for each non-file-transfer command. ON by default. + + SET FTP VERBOSE-MODE { ON, OFF } + Tells whether to display all responses from the FTP server. OFF + by default. This shows all responses to all commands, except + when the file-transfer display is active, and unless you have + SET QUIET ON. When OFF, responses are shown only for commands + such as FTP PWD whose purpose is to display a response. + + SET FTP DEBUG { ON, OFF } + Tells whether local client debugging information should be + displayed. OFF by default. When ON, the commands that are sent + to the server are shown, as well as its responses (even if + VERBOSE-MODE is OFF), plus additional informational messages + are printed regarding the progress of secure operations. Also, + the temporary file created by the [242]MGET command is not + deleted so you can see what's in it. + + Set all of these to OFF when silent running is desired. + + 3.3.2. Operational Preferences + + FTP DISABLE new-protocol-feature-name + FTP ENABLE new-protocol-feature-name + Explained in [243]Section 3.11. + + SET FTP AUTOLOGIN { ON, OFF } + If you give this command prior to opening an FTP connection, it + controls whether Kermit tries to log you in automatically as + part of the connection process. Normally ON, which means the + username and password are sent automatically (and prompted for + if they are not yet known). When OFF, FTP OPEN connects to the + server without logging in. OFF is equivalent to the -n + command-line option when using Kermit's FTP command-line + personality. See [244]Section 3.1.4 for usage. + + SET FTP PASSIVE-MODE { ON, OFF } + ON by default, to avoid random TCP port assignment for data + connections, which can prevent FTP protocol from working + through firewalls and network address translators (for more on + these topics, see the [245]Kermit security reference. Set to + OFF in case the FTP server does not support passive mode, or in + case the client has problems with it (it has been observed, for + example, that when using passive mode, the SCO XENIX 2.3.4 + TCP/IP stack hangs in the connect() call forever). Synonyms: + PASSIVE [ ON ], PASSIVE OFF, PASV [ ON ], PASV OFF. + + SET FTP SEND-PORT-COMMANDS { ON, OFF } + This command determines whether the FTP client sends a new PORT + command to the server when accepting incoming data connections + (as when not using passive mode.) When PASSIVE-MODE is OFF and + SET SEND-PORT is OFF, the port that was originally specified is + reused. This is the default behavior for normal FTP clients but + it is not compatible with many firewalls. + + SET FTP CHARACTER-SET-TRANSLATION { ON, OFF } + Whether to translate character sets when transferring files + with FTP (explained in [246]Section 3.7). OFF by default. + + SET FTP SERVER-CHARACTER-SET name + Tells Kermit the character set used by the FTP server, UTF-8 by + default ([247]Section 3.7). + + SET FTP SERVER-TIME-OFFSET delta-time + Tells Kermit to apply the given [248]delta time to file + timestamps provided by the server for its files; for use when + (for example) the server does not have its timezone set + correctly. + + SET FTP ERROR-ACTION { PROCEED, QUIT } + When transferring a group of files with FTP, and an error + occurs with one of the files, Kermit normally goes on the next + file. Use SET FTP ERROR-ACTION to QUIT to make Kermit stop the + transfer immediately and fail if an error occurs with any + single file in the group. Example: you have given Kermit a list + of files to send, and one of the files can not be found, or + read permission is denied. Note that cancelling a file by + typing 'X' during transfer is not considered an error (if you + want to cancel the entire transfer, type 'Z' or Ctrl-C). + + SET FTP PERMISSIONS { AUTO, ON, OFF } + When uploading files with PUT or MPUT, this tells whether + Kermit should send each file's permissions. The default is OFF, + which means not to send permissions, in which case the uploaded + file's permissions are set by the FTP server according to its + own criteria. ON means to send them, AUTO means to send them + only if the client (Kermit) and server are on like platforms + (e.g. both UNIX). This command has no effect when downloading, + since the FTP protocol does not include a way for the server to + inform the client of a file's permissions. Also see [249]FTP + PUT /PERMISSIONS. Note that setting permissions after uploading + is likely to work (correctly or at all) only when the client + and server platforms are alike (e.g. both of them are some form + of UNIX). Also note that Windows files don't have permissions. + Also see [250]FTP CHMOD. + + SET FTP DATES { ON, OFF } + When downloading files with GET or MGET, this tells whether + Kermit should try to set the received file's date from the + server's date. FTP DATES is ON by default. Note, however, that + FTP protocol does not allow date preservation when uploading. + So at best, SET FTP DATES ON can work only when downloading, + and then only when the server agrees to furnish file dates. + + SET FTP FILENAMES { AUTO, CONVERTED, LITERAL } + When uploading (sending) files, this tells whether to convert + outbound filenames to "common form". This means allowing only + one period in a name, uppercasing any lowercase letters, + replacing spaces by underscores, etc. AUTOMATIC is the default, + meaning LITERAL when client and server are the same type of + system (e.g. UNIX) and CONVERTED otherwise. Special case: if + the setting is AUTOMATIC and the client is not UNIX and the + server identifies itself as UNIX, Kermit uses a less-strict + form of conversion, in which lowercase letters are not + uppercased and the filename can contain any number of periods, + but spaces are still converted to underscore. When receiving, + conversion generally means to change all-uppercase names to + lowercase and spaces to underscore. + + SET FTP UNIQUE-SERVER-NAMES { ON, OFF } + Applies only to uploads. Tells the server to create new, unique + names for incoming files that have the same names as existing + files. OFF by default, in which case the server overwrites + existing files with new files of the same name. When ON, the + server uses its own built-in method for creating new names for + incoming files; for example, appending a period (.) and a + number to the name. CAUTION: Use this option only if you do not + need to refer to the file after it is uploaded, since FTP + protocol provides no mechanism for the client to find out what + name was assigned by the server. + + SET FTP COLLISION { ... } + When downloading, what to do if an incoming file has the same + name as an existing file. Options are the same as for SET FILE + COLLISION. If this command is not given, Kermit's regular FILE + COLLISION setting is used. If this command is given, it + overrides the FILE COLLISION setting for FTP transfers only. + See [251]Section 3.6.2 for details. + + SET FTP TYPE { TEXT, BINARY, TENEX } + Changes the default transfer mode. When sending (uploading) + files, this command has no effect unless you disable automatic + text/binary mode switching ([252]Section 4) with SET FILE SCAN + OFF or SET TRANSFER MODE MANUAL. When receiving (downloading) + files, this command establishes the transfer mode to be used + when a filename does not match any of Kermit's text or binary + filename patterns, unless you use SET FTP + GET-FILETYPE-SWITCHING or SET TRANSFER MODE MANUAL to disable + automatic switching, in which case, this command establishes + the transfer mode for all downloaded files. In all cases, + however, the FTP TYPE can be overridden in any GET or PUT + command by including a /TEXT (/ASCII), /BINARY, or /TENEX + switch. The FTP TYPE is independent of the Kermit FILE TYPE + setting. TENEX is used for sending 8-bit binary files to 36-bit + platforms such as TOPS-10, TOPS-20, and TENEX, and getting them + back again. Synonym: ASCII = TEXT. Note: there is also an FTP + TYPE command, which does what SET FTP TYPE does but also sends + a TYPE command to the server immediately if the given type is + different from the current one. + + If you want want specific FTP preference settings to be in effect for + all your Kermit FTP sessions, put the desired SET FTP commands in your + Kermit customization file (~/.mykermrc in UNIX, K95CUSTOM.INI in + Windows). + + [ [253]Top ] [ [254]FTP Top ] [ [255]C-Kermit Home ] [ [256]Kermit + Home ] + _________________________________________________________________ + + 3.4. Managing Directories and Files + + In Kermit, commands for directory and file management can refer to: + + * The local computer + * A remote computer when you have a connection to a Kermit server or + IKSD. + * A remote computer when you have a connection to an FTP server. + + (There can also be an HTTP connection, but the commands in this + section don't apply to HTTP connections.) + + Thus in general, each such command comes in three forms: + + 1. With no prefix in C-Kermit 8.0.200, it refers to the local + computer (CD, DIR, etc). In C-Kermit 8.0.201 and later, however, + the "locus" switches to automatically to the remote FTP server + when you make an FTP connection (see the SET LOCUS description + [257]Section 7); thus C-Kermit 8.0.201 acts almost exactly like a + regular FTP client when it has an FTP connection, yet still acts + like itself on other kinds of connections. + 2. With the REMOTE prefix, it is for a Kermit server (REMOTE CD, + REMOTE DIR). + 3. With the FTP prefix, it's for an FTP server (FTP CD, FTP DIR). + 4. Also see [258]Section 3.8, which explains "R-commands" and + "L-commands". + + Kermit's FTP file and directory management commands are as follows. + When an R-command is included in the Synonyms list, be sure to read + [259]Section 3.8 about rules for use of R-commands. + + FTP CD [ directory ] + Tells the FTP server to change its default (working) directory + to the one given, which usually must be expressed in the syntax + of the server platform (UNIX, VMS, etc). If the directory is + not specified, the result depends on the FTP server -- it might + complain that the command is illegal, or it might change to + your original login directory. Synonyms: FTP CWD (Change + Wording Directory); RCD. + + FTP CDUP + Tells the FTP server to change its default (working) directory + to the parent directory of its current one (equivalent to + "cd .." in UNIX, or "cd [-]" in VMS). Synonyms: RCDUP, FTP UP. + + FTP PWD + Asks the FTP server to report ("print") its current working + directory. Synonym: RPWD. + + FTP MKDIR directory + Asks the FTP server to create the directory whose name is + given. In general, the name must be in the syntax of the + server's file system, and it must be either absolute (a full + pathname) or relative to the server's current (working) + directory. This command fails if the directory can't be created + for any reason, including that it exists already. Synonym: + RMKDIR. + + FTP RMDIR directory + Asks the FTP server to remove the directory whose name is + given. The rules are the same as for MKDIR, plus in most cases, + the server will not remove any directory unless it is empty. + Synonym: RRMDIR. + + FTP DIRECTORY [ filespec ] [ redirectors ] + Tells the FTP server to send a directory listing of the + specified files. If no filespec is given, the server lists all + files in its current working directory. The results are in + whatever format the server chooses to send them. You can use + UNIX-like redirectors to send the listing to a file or a + pipeline, exactly as with the regular Kermit client/server + REMOTE DIRECTORY command ([260]Using C-Kermit, Chapter 11). + Synonym: RDIRECTORY. Examples: + + ftp dir ; Show listing of all files on screen + ftp dir *.txt ; List *.txt files on screen + ftp dir *.txt > somefile ; Put listing in somefile + ftp dir *.txt >> somefile ; Append listing to somefile + ftp dir *.txt | sort > somefile ; Put sorted listing in somefile + ftp dir | more ; Runs list through "more" + ftp dir | sort | more ; Runs list through "sort" and "more" + + FTP VDIRECTORY [ filespec ] [ redirectors ] + "Verbose" directory. This is an alternative FTP DIRECTORY + command primarily for use with DECSYSTEM-20 (TOPS-20) FTP + servers, which send only filenames when given a DIRECTORY + command; the VDIRECTORY command makes them also send file + sizes, dates, and attributes. + + FTP CHECK filespec + Asks the FTP server whether the given file exists or, if the + filespec contains wildcards, if any files match, and this + command succeeds or fails accordingly. + + FTP MODTIME filename + Asks the FTP server, via the not-yet-standard FTP MDTM command, + to send the modification date and time of the given file. The + response should be a numeric string in the format: + yyyymmddhhmmssxxxxx... where yyyy is the year, mm is the month, + dd is the day, hh is the hour (0-23), mm is the minute, ss is + the second, and xxx... is the optional fraction of the second + (0 or more digits). The date and time is expressed in UTC (GMT, + Zulu, Zero-Meridian). The result is available programmatically + in the [261]\v(ftp_message) variable, and is understandable by + Kermit's date-time switches and functions. For example, suppose + we want to upload all local files that are newer than a + particular file on the server: + + C-Kermit> ftp modtime signpost + C-Kermit> echo \v(ftp_message) + 20010807113542.014 + C-Kermit> ftp mput /after:\v(ftp_message)GMT * + + Note that we must append "GMT" to the date-time string to let + the /AFTER switch know the time is GMT rather than local. + + FTP SIZE filename + Asks the FTP server to send the size (in bytes) of the given + file. The result might vary depending on whether the current + FTP TYPE is binary or text ("ascii"). For a reliable byte + count, do FTP TYPE BINARY first. The result is available + programmatically in the [262]\v(ftp_message) variable. + + FTP CHMOD permissions filename + Tells the FTP server to set the permissions (protection) of the + given file to the ones given. The permissions and filename must + be given in whatever syntax is required by the server. Example + (for a UNIX-based FTP server): + + ftp chmod 664 oofa.txt + + Not all servers support this command. For non-UNIX-based + servers, you might need to use FTP QUOTE or FTP SITE and the + appropriate platform-specific FTP server command. + + FTP UMASK [ number ] + This command is probably specific to UNIX-based servers; it + sets the UNIX "umask", which is the default permissions mask + for new (in this case, incoming) files. Crudely put, the UNIX + umask is an octal representation of a binary number in in which + a 1 bit stands for a permission bit that must be 0, and a 0 bit + stands for a permission bit that can be 0 or 1 depending on + other factors, such as the permissions of the parent directory. + Example: "umask 007" requires that new files are created + without read/write/execute world permission. If the number is + not specified, the server's current umask is reported. + + FTP RENAME filename newname + Asks the FTP server to rename the file whose name is "filename" + to "newname". Works only for one file; can not be used with + wildcards. The server's interpretation of "newname" can vary + (in some cases it must be a filename, in others perhaps it can + also be a directory name, in which case if the filename denote + a regular file, the file might be moved to the given + directory). Some servers might allow files to be renamed + ("moved") between physical disks or partitions, others might + not. Synonym: RRENAME. + + FTP DELETE [ switches ] filespec [ filespec [ ... ] ] + Tells the FTP server to delete the file or files listed. Each + file specification may, but need not, contain wildcard + characters to match multiple files. File specifications and + wildcard syntax must be those of the server. Any file + specifications that contain spaces must be enclosed in braces + or doublequotes. FTP DELETE switches are: + + /ERROR-ACTION: /FILENAMES: /NOBACKUPFILES /QUIET + /EXCEPT: /LARGER-THAN: /NODOTFILES /NOPAGE + /PAGE /RECURSIVE /SMALLER-THAN: + + When used with FTP DELETE, the /RECURSIVE switch deletes files + but not directories, and furthermore depends on the server + providing recursive file lists, which is not the normal + behavior. For further details, see the decriptions of these + switches in [263]Section 3.6. Synonyms: FTP MDELETE (Kermit + makes no distinction between DELETE and MDELETE); RDELETE. + + FTP TYPE { TEXT, BINARY, TENEX } + Tells the FTP server to change its file-transfer type to the + one given, immediately. See [264]SET FTP TYPE for details. + + [ [265]Top ] [ [266]FTP Top ] [ [267]C-Kermit Home ] [ [268]Kermit + Home ] + _________________________________________________________________ + + 3.5. Uploading Files With FTP + + Uploading means sending files from the client (Kermit) to the FTP + server. The basic command for uploading files with FTP is PUT: + + FTP PUT [ switches ] [ filespec [ as-name ] ] + Uploads (sends) the file or files that match the file + specification, which may include wildcards, to the server. If + no filespec is given, the names of files to send are taken from + the /LISTFILE: file, if any, otherwise from the SEND-LIST, if + any. Unless you go out of your way to prevent it, Kermit + determines the transfer mode (text or binary) for each file + automatically, and switches automatically on a per-file basis. + If an as-name is given, the file is sent under that name + instead of its own (if an as-name is given with a wildcard + filespec, the result is a bit more complicated, and is + explained later in this section). + + Unlike normal FTP clients, Kermit does not prompt you by default (or + at all) for each file; it just sends them, just as it does with Kermit + protocol. The filespec can be a literal filename or a Kermit pattern, + described in: + + [269]http://www.columbia.edu/kermit/ckermit70.html#x4.9 + + Kermit patterns are equivalent to C-Shell patterns and provide a fair + amount of flexibility in selecting which files to send, which is + augmented by the file-selection switches presented in [270]Section + 3.5.1. + + FTP MPUT [ switches ] filespec [ filespec [ ... ] ] + FTP MPUT is just like FTP PUT except it allows you to give more + than one file specification, and it does not allow an as-name + in the file list. However, as-names can be given to either PUT + or MPUT with the /AS-NAME: switch. + + If a PUT or MPUT command results in one file being uploaded, it + succeeds if the file is uploaded completely and fails otherwise. If + more than one file is selected for upload, success or failure depends + on the [271]FTP ERROR-ACTION setting; if it is PROCEED (the default + setting), then the [M]PUT command succeeds if at least one of the + files was completely uploaded, and fails otherwise, If FTP + ERROR-ACTION is QUIT, the [M]PUT command succeeds if all selected + files were uploaded successfully, and fails if any file failed. + + FTP uploads may be interrupted just like Kermit uploads. While the + transfer is in progress, type: + + X to interrupt the current file and go on to the next file. + Z to cancel the current file and all remaining files. + ^C (Control-C): Like Z, but might act more quickly. + + MPUT may be used as in regular FTP clients, but it is not required to + send multiple files; in Kermit it is required only if you want to give + multiple file specifications. Examples: + + ftp put oofa.txt ; Send a single file oofa.txt + ftp put oofa.txt budget.txt ; Send single file oofa.txt as budget.txt + ftp put *.txt ; Send all *.txt files + ftp mput *.txt ; Send all *.txt files (same as "put *.txt") + ftp mput *.txt foo.bar ; Send all *.txt files plus foo.bar + + The distinction between PUT and MPUT is important only when more than + one filespec is given, just like the distinction between Kermit SEND + and MSEND: + + ftp put oofa.txt budget.txt ; Send oofa.txt AS budget.txt + ftp mput oofa.txt budget.txt ; Send oofa.txt AND budget.txt + + If the source file specification includes any path segments, for + example: + + put /tmp/oofa.txt + put subdir/another/andanother/oofa.txt + + the path portion is stripped from the filename that is sent to the + server. However, if an as-name contains a path, it is retained. + Examples: + + ftp put /usr/doc/oofa.txt ; Send as "oofa.txt". + ftp put oofa.txt /tmp/oofa.txt ; Send as "/tmp/oofa.txt" + + The latter example sends the file oofa.txt from your current local + directory to the server's /tmp directory. This works only if the + server uses the same directory notation that you used in the as-name + AND the given directory already exists on the server AND if you have + write access to it. + + Use caution when uploading from a case-sensitive file system, such as + UNIX, to a file system that is not case sensitive, such as Windows or + VMS. If you have two files in UNIX, AA and aa and upload both of them, + the second one will overwrite the first. The only way around this + provided by FTP protocol is its "unique server names" feature (SET FTP + UNIQUE-SERVER-NAMES or the /UNIQUE switch described below). + _________________________________________________________________ + + 3.5.1. FTP PUT Switches + + FTP PUT and MPUT are similar in format and behavior to the regular + Kermit SEND and MSEND commands, and they allow most of the same + optional switches: + +C-Kermit>ftp put ? Filename, or switch, one of the following: + /after: /larger-than: /rename-to: + /array: /listfile: /server-character-set: + /as-name: /local-character-set: /server-rename-to: + /before: /move-to: /simulate + /binary /nobackupfiles /smaller-than: + /command /nodotfiles /tenex + /delete /nofollowlinks /text + /dotfiles /not-after: /transparent + /error-action: /not-before: /type: + /except: /permissions: /update + /filenames: /quiet /unique-server-names + /filter: /recover + /followlinks /recursive + + Since most of these switches are common to Kermit's SEND and MSEND + commands, they described only briefly here. For greater detail see: + + [272]http://www.columbia.edu/kermit/ckermit70.html#x1.5 (explanation + of switches) + [273]http://www.columbia.edu/kermit/ckermit70.html#x4.7 + (file-transfer switches) + + First the file-selection switches: + + /AFTER:date-time + /BEFORE:date-time + /NOT-AFTER:date-time + /NOT-BEFORE:date-time + Only send those files modified on or after or before the given + date and time. These switches can be combined to select files + modified between two date/times. Various date-time formats are + accepted; if the date-time contains spaces, it must be enclosed + in braces or doublequotes. See + [274]http://www.columbia.edu/kermit/ckermit70.html#x1.6 and + [275]Section 8.13 of this document for details about date-time + formats. Examples: + + ftp put /after:{1 jan 2000 0:00:00} * + ftp put /after:-5days * + + /LARGER-THAN:number + /SMALLER-THAN:number + Only send files larger (smaller) than the given number of bytes + (octets). These switches can be combined to select files in a + certain size range. + + /TYPE:{TEXT,BINARY} + Only send files that are the given type, which is determined + for each file just before sending it by file scanning. BINARY + includes TENEX; if you have included a /TENEX switch, or + previously given a [SET] FTP TYPE TENEX command, binary files + are sent in TENEX, rather than BINARY mode. + + /[NO]DOTFILES + [Don't] include files whose names begin with dot (.). By + default, such files are not included unless your filespec + explicitly mentions them. + + /NOBACKUPFILES + Don't include files whose names end with .~nnn~, where nnn is a + number, e.g. oofa.txt.~27~. These are backup files created by + Kermit, EMACS, and other applications. By default, backup files + are included. + + /NOFOLLOWLINKS + (UNIX only) Skip over symbolic links rather than following them + (default). This applies to wildcard and/or recursive [M]PUTs; + if a single filename is given, and it happens to be a symbolic + link, the file it points to is sent. + + /FOLLOWLINKS + (UNIX only) Always follow (resolve) symbolic links, even in + wildcard or recursive [M]PUTs. Use with caution. Watch out for + circular links, endless loops, etc. + + /EXCEPT:pattern + Exception list -- don't send files whose names match the given + pattern. See [276]Section 1.5.4 of the [277]C-Kermit 7.0 Update + Notes for details. If you want to exclude a directory from a + recursive [M]PUT, use /EXCEPT:{dirname/*}. + + /RECURSIVE + Sends the desired files from the current (or given) directory, + plus all directories beneath it, including empty directories, + replicating the directory structure on the server. No special + capabilities are required in the server, but of course your + login ID on the server must have the appropriate access and + permission to create directories. Recursive PUTs work not only + between like platforms (e.g. UNIX to UNIX) but also between + unlike ones (e.g. UNIX to VMS or Windows), in which case + text-file format differences are handled by Kermit's automatic + text/binary mode switching ([278]Section 4) and character-set + translation ([279]Section 3.7). Synonym: /SUBDIRECTORIES. + + /UPDATE + Send only files that have changed since last time ([280]Section + 3.5.2). + + /ARRAY:arrayname + The "file" to be sent is an array, or a segment of one, rather + than a real file. In this case the other selection switches + don't apply. The array contents are sent in text mode, and each + array element is treated as a line. Example: + + ftp put /as-name:array.txt /array:&a + + (or, to send a segment of the array, /array:&a[100:199]). If + you don't include an /AS-NAME, a name of "_array_x_" is used + (where x is the array letter). If you include this switch, most + other switches are meaningless and ignored. + + /COMMAND + The "file" to be sent is the standard output of a command, + rather than a real file. It is sent in text or binary mode + according to the prevailing FTP TYPE, which can be overridden + with a /TEXT or /BINARY switch. Example: Example: + + ftp put /command /as-name:{userlist} {finger | sort -r} + + /LISTFILE:filename + Tells Kermit to obtain the list of files to be sent from the + file whose name is given. This file must contain one file + specification (which may be wild) per line. If the list + includes files from different directories, such as a recursive + listing of a directory tree, the paths are recreated on the + server (if possible) if you include the /RECURSIVE switch; + otherwise all the files are sent to the current directory on + the server. + + Now the other switches: + + /AS-NAME:text + If a single file is being sent, send it with the given text as + its name. If multiple files are being sent, the text must be a + template that includes variables such as \v(filename), + \v(filenumber), \v(ntime), to allow dynamic creation of each + name. The same applies to the as-name field of the FTP PUT + command. If this switch is not included (and an as-name is not + included as the second filename to PUT), each file is sent with + its own name. + + /BINARY + /TEXT + /TENEX + Forces this upload to take place in the given mode, regardless + of the current FTP TYPE setting, and without automatic + text/binary switching. /ASCII is a synonym for /TEXT. + + /FILTER:command + Specifies that the file(s) is/are to be passed through the + given command or pipeline on their way to the server. Example: + + ftp put /binary /filter:{gzip -c \v(filename)} /as-name:\v(filename).gz * + + /TRANSPARENT + /LOCAL-CHARACTER-SET:name + /SERVER-CHARACTER-SET:name + Character-set translation for text files, explained in + [281]Section 3.7. + + /ERROR-ACTION:{PROCEED,QUIT} + Overrides the prevailing [282]FTP ERROR-ACTION for the duration + of this PUT or MPUT command only. + + /RECOVER + Resume an interrupted transfer where from the point of + interruption (explained in [283]Section 3.5.2). Synonym: + /RESTART. + + /DELETE + Tells Kermit to delete each source file immediately after, and + only if, it has been uploaded completely and successfully. + This, in effect, moves the file from the client to the server. + + /MOVE-TO:directory + Tells Kermit to move each source file to the named local + directory after, and only if, it has been uploaded completely + and successfully. + + /RENAME-TO:template + Tells Kermit to rename each (local) source file according to + the given template after, and only if, it has been uploaded + completely and successfully. The template works as in /AS-NAME. + + /SERVER-RENAME-TO:template + Tells Kermit to ask the server to rename each file according to + the given template as soon as, and only if, it has been + received completely and successfully. The template works as in + /AS-NAME. Requires write and rename access on the server, so + doesn't usually work with (e.g.) anonymous uploads to public + incoming areas where the permissions don't allow renaming. + Examples: + + ftp mput /server-rename:\v(filename).ok * + Appends ".ok" to each filename on the server when it's + finished uploading. + + ftp mput /as-name:\v(filename).tmp /server-rename:\v(filename) * + This is the reverse of the previous example; it uses a + temporary name while uploading is in progress and reverts + the file to its real name when uploading is complete. + + ftp mput /as-name:\v(filename) + /server-rename:../final/\v(filename) * + Moves the file from the working directory to a final + directory when the upload is complete, but in this case + you have to know the pathname syntax of the server. If + the rename fails, the [M]PUT command fails according to + the [284]FTP ERROR-ACTION selection. + + /FILENAMES:{AUTOMATIC,CONVERTED,LITERAL} + Overrides the [285]FTP FILENAMES setting for this upload only. + + /PERMISSIONS:{ON,OFF} + Overrides the [286]FTP PERMISSIONS setting for this upload + only. + + /UNIQUE + Tells Kermit to tell the server to give [287]unique names to + incoming files that would otherwise overwrite existing files + that have the same name. This switch conflicts with /UPDATE, + /RECOVER, /PERMISSIONS, and /SERVER-RENAME since the client has + no way of knowing the name assigned by the server. + + /QUIET + Don't display file-transfer progress or statistics. + + /SIMULATE + Shows which files would be sent without actually sending them. + Useful (for example) with /UPDATE (next section). The results + are shown in the file-transfer display (if it is not disabled) + and in the transaction log (if one is active). Hint: use SET + TRANSFER DISPLAY BRIEF. + _________________________________________________________________ + + 3.5.2. Update Mode + + When you include the /UPDATE switch, this means to skip sending any + file that already exists on the server if the local file's + modification date/time is not later than that of the corresponding + file on the server. Here is a typical application for update mode: + Suppose that on Computer A, you maintain a large set of files (say, a + collection of Web pages and graphics images, or the source files for a + software application), and you need to keep a parallel copy on another + Computer, B. Of course you could upload the entire collection every + day: + + cd source-directory + ftp computerb.xyzcorp.com + ( authentication details... ) + ftp cd target-directory + ftp put [ switches ] * + + But if the total size is large or the network slow, this would be + unnecessarily time-consuming. Worse, if other users or sites had to + update whenever new files appeared in B's directory, this would cause + them unnecessary work. By including the /UPDATE switch: + + ftp put /update [ other-switches ] * + + only those files that changed since last time are uploaded. Here's how + it works. For each local file that is selected for uploading: + + * The remote filename is determined in the normal way, according to + the [288]FTP FILENAMES setting, /FILENAMES switch, or the as-name, + if any. + * Kermit sends an MDTM (modification time) command for the + corresponding remote filename to the server. + * If the server does not understand the MDTM command, the file is + sent. + * If the server can't find a file with the given name, the file is + sent. + * If the local file's modification time is later than that of the + remote file, the file is sent. + * Otherwise -- the remote file exists but its modification time is + equal to or earlier than that of the local file -- the file is + skipped. + + All time comparisons take place in Coordinated Universal Time + (UTC)([289]1), also known as GMT or Zulu time: Timezone 0; standard + time, without daylight savings. + + WARNING: Some FTP servers, such as Novell NWFTPD.NLM, ignore or + misimplement the FTP specification and send local time rather than + UTC. + + Update mode is useful only when always used in the same direction. + When you upload (PUT) a file with FTP, the destination file receives + the current timestamp on the server's computer, not the original + file's timestamp ([290]2). If you try to FTP PUT /UPDATE the same file + again, it will be skipped (as expected) since the remote copy is + newer. However, if you try to FTP GET /UPDATE the same file + ([291]Section 3.6), it will be transferred for the same reason. + + To check the availability of PUT /UPDATE on a particular connection, + issue an FTP MODTIME command for a file that is known to exist on the + server. If it succeeds, PUT /UPDATE should work and in that case, you + can run a procedure like the one above every day: the first time, it + sends all the files; after that, it sends only the ones that changed. + If a transaction log is active, a notation is included for any files + that are skipped. + + Notes: + 1. Why is Coordinated Universal Time abbreviated UTC? From the + [292]National Institute of Standards and Technology FAQ: "In 1970 + the Coordinated Universal Time system was devised by an + international advisory group of technical experts within the + International Telecommunication Union (ITU). The ITU felt it was + best to designate a single abbreviation for use in all languages + in order to minimize confusion. Since unanimous agreement could + not be achieved on using either the English word order, CUT, or + the French word order, TUC, the acronym UTC was chosen as a + compromise." + 2. The Kermit FTP client is unusual in that, when downloading only, + it can set the received file's date from the file's date on the + server, but this should not affect the update feature. When + uploading to an FTP server, however, there is no mechanism for the + client to set the date of the uploaded file on the server. + _________________________________________________________________ + + 3.5.3 Recovery + + Suppose that while you are uploading a large file over a slow + connection, the connection is lost before the entire file is + transferred. With most FTP clients, you would have to start over, thus + resending the portion of the file that was sent already, and that is + already on the server. But Kermit's /RECOVER switch (Synonym: + /RESTART) lets you continue an interrupted transfer from the point of + failure, thus transferring only the part that wasn't sent already. The + prerequisites for recovery are: + + * The transfer must be in BINARY mode, or else the client and server + must reside on like systems (e.g. both on some form of UNIX). + * The FTP server must support the SIZE command. + + Here's how it works. When you include the /RECOVER switch: + + * Kermit checks for conflicting switches, such as /UPDATE and + /UNIQUE; if /RECOVER is given with these switches an error occurs. + If /RECOVER is given in other circumstances where it could serve + no useful purpose (e.g. with arrays, pipes, or filters), it is + ignored. + + If the switch is accepted, then for each selected file: + + * If it is not binary (determined by scanning) and the client and + server are not on like platforms, recovery is canceled (the entire + file is sent). Otherwise: + * A SIZE command is sent for the file (using its remote name). If + the reply indicates the file was not found, or the SIZE command + was not understood, or any other kind of error, recovery is + canceled. Otherwise: + * A MDTM (modification time) command is sent for the file. If a + valid reply is received, and the modification time of the local + file is later than that of the remote file, recovery is canceled. + Otherwise: + * If the sizes of the two files are identical, the file is not sent. + Otherwise: + * Kermit seeks to the recovery spot in the local file, tells the + server to APPEND the data which is about to arrive to the remote + file, and then sends the data starting at the recovery point. + + To safeguard file integrity, recovery is not attempted unless all the + preconditions are met. For the widest possible usefulness, APPEND is + used rather than RESTART. For stream transfers (the only kind that + Kermit supports) the results are the same. + + By design, the /RECOVER switch can be included with any FTP PUT or + MPUT command, even if it specifies a group of files. This allows you + to resume an interrupted batch transfer from where it left off. The + files that were already completely sent are skipped, the file that was + interrupted is recovered, and the remaining files are uploaded. + + By the way, it doesn't matter how the original partial file was + uploaded -- FTP, Kermit, Zmodem, etc: as long as the preconditions are + met, it can be recovered with FTP PUT /RECOVER, or for that matter + also using Kermit protocol and SEND /RECOVER. + + A word of caution, however, when the original upload was in text mode + with character-set translation ([293]Section 3.7): + + * If the original upload involved a translation from one single-byte + character set to another (e.g. Code Page 850 to Latin-1), recovery + is safe if you specify the same translations for the recovery. If + you don't, the resulting file will contain a mixture of character + sets. + * If the original upload involved a translation that changed the + size of the file (e.g. from an alphabetic Code Page or Latin + Alphabet to Unicode, or vice versa), recovery is NOT safe, even if + you specify the same translations. + + Kermit has no way of knowing anything about the previous upload. As a + safeguard, an error occurs if you include /RECOVER and also specify a + character-set of UCS2 or UTF8, since recovery can't possibly work in + that situation. Otherwise, it's up to you to avoid unsafe recovery + operations. + + [ [294]Top ] [ [295]FTP Top ] [ [296]C-Kermit Home ] [ [297]Kermit + Home ] + _________________________________________________________________ + + 3.6. Downloading Files With FTP + + Although uploading files with Kermit's FTP client is just as easy and + flexible as sending files with Kermit protocol, the same is not always + true for downloading because FTP servers lack some of the capabilities + of a Kermit server: + + * If you want to get more than one file, you have to use MGET, not + GET, since the underlying FTP protocol is different in the two + cases. Kermit can't "autodetect" which one you mean, as it can + with PUT and MPUT, since it can't be expected to know the wildcard + syntax of the remote platform and/or FTP server (the same is true + for all other FTP clients). To complicate matters, FTP protocol + now includes two underlying mechanisms (NLST and MLSD) for + accomplishing MGET operations and, as explained in [298]Section + 3.11, the two behave differently. + * Automatic text-binary mode switching is not done by the server. It + can be done by the client (Kermit), but in this case it is not + based on a file scan (since there is no way for Kermit prescan a + server file), but rather on the filename, using C-Kermit 7.0 + [299]filename patterns. + * Some options that are available with FTP PUT can not be used with + FTP [M]GET or don't work the same way: + /PERMISSIONS (FTP protocol has no mechanism for this). + /[NOT-]BEFORE, /[NOT-]AFTER (because of the timezone problem). + /RECOVER works only in binary mode. /RECURSIVE has limited + utility. + + The commands for downloading are: + + SET FILE DOWNLOAD-DIRECTORY [ directory ] + As with Kermit transfers, this command, if given, tells + C-Kermit where to store incoming files in the absence of a + specific as-name. If not given, incoming files are stored as + indicated by the as-name, if any, otherwise in the current + directory, just as with Kermit transfers. The more verbose + transfer display formats give the full pathname of each + received file, and, in case you have trouble finding a + downloaded file afterwards, its full path is also listed in the + transaction log (if you kept one), and you can also ask Kermit + where it went with the [300]WHERE command. + + SET FTP GET-FILETYPE-SWITCHING { ON, OFF } + ON by default, causing Kermit to switch automatically into text + or binary mode for each file based on whether its name matches + a text pattern or binary pattern. Set this OFF, or use a /TEXT, + /BINARY, or /TENEX switch to defeat this feature. Use SHOW + PATTERNS to see the current pattern list. + + [ FTP ] GET [ switches ] filename [ as-name ] + Asks the server to send the given file, and if it comes, stores + it locally under the given as-name, if any, otherwise under its + original name (modified according to the selected filename + conversion option), in your download directory, if you have + specified one, otherwise in the directory indicated in the + as-name, if any, otherwise in your current directory. If you + accidentally use a wildcard in the filename ("get *.txt") the + server will reply with a message like "File not found" (unless + there is a file whose name actually is "*.txt"). If FTP + GET-FILETYPE-SWITCHING is ON, and in the absence of any GET + switches to override it, the file is transferred in binary mode + if it matches any of Kermit's binary name patterns, and in text + mode if it matches any of Kermit's text name patterns, and in + the prevailing FTP TYPE if it matches none of these patterns. + + [ FTP ] MGET [ switches ] filespec [ filespec [ filespec [ ... ] ] ] + Like GET, but for multiple files. One or more file + specifications can be given, and any or all (or none) of them + can contain wildcards or can be directory names. The file list + may not include an as-name, but you can still give one with the + /AS-NAME: switch. + + In both the FTP GET and MGET commands, any filenames that contain + spaces must be enclosed in braces or doublequotes (see [301]Section 5 + for details). + + FTP downloads may be interrupted just like Kermit transfers. While the + transfer is in progress, type: + + * X to interrupt the current file and go on to the next file. + * Z (or Control-C) to cancel the current file and all remaining + files. + + Before proceeding, a brief word about temporary files. In FTP + protocol, the MGET command works by requesting a file list from the + server, and then (internally) issuing a GET command (FTP RETR protocol + directive) for each file. The file list returned by the server can be + any size at all, so in case it is huge, we don't store it in memory; + instead we put it in a temporary file. For troubleshooting purposes, + you should be aware of two points: + + 1. The location of the temporary file is chosen according the TMP or + TEMP environment variables. If neither of these variables is + defined, you might need to define it. In case there is not enough + space on the indicated disk or partition for the server's file + list, you might need to either clean up the temporary area, or + redefine the environment variable to indicate a different area + that has sufficient space. + 2. If you want to look at the list yourself, use SET FTP DEBUG ON. + This tells Kermit to (a) give you the full pathname of the + temporary file at the end of each MGET command, and (b) not to + delete it, as it normally does. + _________________________________________________________________ + + 3.6.1. FTP GET Switches + + The following switches are available with FTP GET and MGET: + + /TEXT + Specifies a text-mode transfer. Overrides the global FTP TYPE + setting and filename pattern-matching for the duration of the + current command only, All files are downloaded in text mode. + Synonym: /ASCII. + + /BINARY + Specifies a binary-mode transfer. Overrides the global FTP TYPE + setting and filename pattern-matching for the duration of the + current command only. All files are downloaded in binary mode. + + /TENEX + Like /BINARY but specifies a special binary transfer mode to be + used when getting 8-bit binary files from a 36-bit platform + such as TOPS-10, TOPS-20, or TENEX. All files are downloaded in + the special binary mode. + + /RECOVER + This instructs Kermit to try to recover an incomplete download + from the point of failure. Works only in binary mode, and only + if the server supports the (not-yet-standard) FTP "REST" + directive. See [302]Section 3.6.3 for details. Synonym: + /RESTART. + + /FILENAMES:{CONVERTED,LITERAL} + Overrides the [303]FTP FILENAMES (filename conversion) setting + for this download only, forcing incoming filenames to be either + converted or taken literally. + + /AS-NAME:text + For GET, this is equivalent to giving an as-name after the + filename. For MGET, this is the only way to specify alternative + names for the incoming files. With MGET, the /AS-NAME text + should (must) contain a Kermit variable, usually \v(filename) + or \v(filenumber). Example: + + mget /text /as-name:\v(filename).new *.c + + This gets all ".c" files and stores them with " + + .new" appended to their names. See the [304]C-Kermit 7.0 Update + Notes for details. + + /COMMAND + This specifies that the incoming file is to be written to the + standard input of a command, rather than to a file. The command + name is the as-name from the GET command or the /AS-NAME + argument. If you need to refer to the incoming file's name in + the command, use \v(filename). See the description of the + regular Kermit [305]GET /COMMAND command for details and + examples. + + /QUIET + Transfers the files quietly; don't put up a file-transfer + display. + + /ERROR-ACTION:{QUIT,PROCEED} + This switch affects only MGET. If an error occurs with a + particular file, this tells whether to go on to the next file + (PROCEED) or to stop right away and fail (QUIT). The default is + PROCEED. + + The file selection switches are: + + /EXCEPT:{pattern} or /EXCEPT:{{pattern}{pattern}{...}} + Exception list for MGET; skip downloading any file whose name + matches any of the given patterns (when using the second + format, up to 64 patterns may be specified). [306]CLICK HERE + for syntax details. + + /SMALLER-THAN:number + Download only files whose size is smaller than the given number + of bytes (octets). Requires that the FTP server support the + SIZE or MLSD directive. + + /LARGER-THAN:number + Download only files whose size is greater than the given number + of bytes. Requires that the FTP server support the SIZE or MLSD + directive. + + /NOBACKUPFILES + During MGET, don't download any files whose names end with + backup suffixes (.~n~ where n is a number). + + /NODOTFILES + During MGET, don't download any files whose names begin with + period (.). Equivalent to /EXCEPT:{.*}. + + /LISTFILE:local-filename + The given file contains a list of files to GET, one per line. + Filenames in the listfile can contain wildcard characters in + the syntax of the server. There is no limit on the number of + lines in the listfile. + + /NAMELIST:local-filename + If this switch is given, then instead of actually retrieving + the selected files, the GET command retrieves a list of the + names of the files that would be retrieved, and places it in + the specifed file. The resulting file is an ordinary text file, + with one filename per line, suitable for reading by a person, + or processing by a computer program, including Kermit itself + (FOPEN / FREAD / FWRITE / FCLOSE), and as /FILELIST: file. If + the filename is omitted or given as "-" (dash, hyphen), the + list goes to the screen. NOTE: if you want a copy of the + complete list sent by the server, use SET FTP DEBUG ON, perform + an MGET, and the temporary file containing the list will be + kept rather than deleted (and Kermit tells you its name). + + /UPDATE, /COLLISION:keyword + Explained in [307]Section 3.6.2. + + /RECURSIVE + This means to try to download an entire directory tree, rather + than just files from a particular directory. In fact, FTP + protocol does not provide a method to request a recursive + download (unless the server supports MLSD; see [308]Section + 3.11), so this works only if the FTP server does it anyway, + without being asked, as some do. In this case, Kermit detects + that names in the returned file list contain directory + separators, and therefore attempts to create the needed + directories as the files arrive. But this can work only if the + server is on the same kind of platform as the client, so the + pathname syntax can be recognized, and also because the server + does not switch between text and binary mode, which would be + vital for cross-platform transfers. Use with caution. Synonym: + /SUBDIRECTORIES. + + Even when the server does not provide recursive file lists, + [M]GET /RECURSIVE forces Kermit to replicate any directory + structure implied or expressed by the server's file list. For + example: + + get somepath/somefile + + Gets the file named somefile from the server's somepath + directory and puts it Kermit's current (or download) directory, + whereas: + + get /recursive somepath/somefile + + creates the path locally and then puts the file in it. + Similarly for MGET: + + mget */data/* + + downloads all the files in all the data subdirectories of all + the subdirectories of the server's current directory and stores + them locally in Kermit's current (or download) directory, + whereas: + + mget /recursive */data/* + + re-creates the server's directory structure locally. + + The FTP protocol does not include explicit mechanisms for recursion, + so Kermit builds upon what is available. Although an Internet draft + describes a mechanism ("MLSD") that would allow protocol-driven + recursion, similar to Kermit's File Attribute packets (circa 1984), it + has not yet attained RFC or standard status, and servers are not yet + widely available that offer this feature. In the meantime, the + effectiveness of MGET /RECURSIVE depends on the FTP server + implementation. If the server returns a recursive list in response to + the standard NLST command (whose behavior is ill-defined), Kermit's + FTP MGET /RECURSIVE command uses it to re-create the remote directory + tree locally. If the server supports MLSD, C-Kermit 8.0.206 and Kermit + 95 2.1 and later are able to sense it automatically and use it, as + described below in [309]Section 3.11. + + The /BEFORE:, /AFTER:, /NOT-BEFORE:, and /NOT-AFTER: switches are not + available for downloading because of the confusion with timezones. + Would the given times be in the local timezone, the server's timezone, + or GMT? The FTP server's directory listings show its own local times + but since we don't know what timezone the server is in, there's no way + to reconcile our local times with the server's. Similarly, + /PERMISSIONS can't be preserved in downloads because FTP protocol + provides no means of querying the server for a file's permission. + + Source-file disposition switches: + + /DELETE + Each file that is downloaded successfully is to be deleted from + the server. Requires the appropriate file access rights on the + server. + + /SERVER-RENAME-TO:template + Asks the server to rename each (remote) source file immediately + after, and only if, it is sent correctly. See [310]PUT + /SERVER-RENAME-TO: for details. + + Destination-file disposition switches: + + /TO-SCREEN + Displays the incoming file on the screen rather than storing it + on disk. If this switch is given, the /RENAME-TO and /MOVE-TO + switches are ignored, the file-transfer display is suppressed, + and the given file(s) is/are shown on the screen. Can be used + with /FILTER, e.g. + + get /text /to-screen /filter:more oofa.txt + + In fact, you should always use /TO-SCREEN with /FILTER or + /COMMAND when the command would result in displaying the + incoming file on the screen; otherwise C-Kermit would have no + way of knowing to suppress its file transfer display (since it + can't be expected to know what the command or filter does). + + /RENAME-TO:template + Each file that is downloaded is to be renamed as indicated if + and only if it was received completely and without error. The + template can be literal text or can contain variables that are + evaluated for each file. For MGET, the text must contain + variables; for GET it can be a literal string. The \v(filename) + variable contains the name of the current file, so: + + ftp mget /rename-to:\v(filename).ok * + + causes each file that is successfully downloaded to have ".ok" + appended to its name. For details see [311]Section 4.1 of the + [312]C-Kermit 7.0 Update Notes. + + /MOVE-TO:text + Just like /RENAME-TO:, except the text denotes the name of a + directory to which successfully downloaded files are to be + moved. If the directory does not exist, it is created. + + The file transfer display does not show the /MOVE-TO or /RENAME-TO + value, since the incoming file has not yet been moved or renamed. + _________________________________________________________________ + + 3.6.2. Filename Collisions + + What should happen if an incoming file has the same name as an + existing file in the same directory? By default, Kermit's FILE + COLLISION setting applies: BACKUP, RENAME, UPDATE, DISCARD, etc, as + described in [313]Using C-Kermit. Kermit's default FILE COLLISION + setting is BACKUP (rename the existing file and store the incoming + file under its own name) and therefore this is also the default FTP + collision action. + + The name under which an incoming file is to be stored is determined as + follows: + + * If an as-name was given, the as-name is used. Otherwise: + * If the client and server platforms are alike or [314]FTP FILENAMES + is set to LITERAL (or the /FILENAMES:LITERAL switch was given for + this download), the incoming filename is used literally. + Otherwise: + * The incoming filename is converted to a form that is friendly to + the local platform. For UNIX, for example, incoming filenames that + are all uppercase (as they might be from, say, VMS or an IBM + mainframe) are converted to lowercase. + + If the resulting name coincides with the name of a local file that + already exists, we have a filename collision. Collisions are handled + according to the currently selected collision action: + + SET FTP COLLISION { BACKUP, RENAME, UPDATE, DISCARD, APPEND, OVERWRITE + } + This establishes a filename collision for FTP, separate from + the Kermit one. The initial FTP collision setting is inherited + from Kermit's FILE COLLISION setting when the first FTP command + is given, but subsequent changes to Kermit's FILE COLLISION + setting do not affect the FTP COLLISION setting. SHOW FTP tells + the current FTP COLLISION setting. + + FTP GET /COLLISION:{BACKUP,RENAME,UPDATE,DISCARD,APPEND,OVERWRITE} + Overrides the current FTP COLLISION action for this download + only. + + FTP GET /UPDATE + This is equivalent to GET /COLLISION:UPDATE, and is included + for symmetry with PUT /UPDATE + + FTP GET /UPDATE and /COLLISION:UPDATE mean to download only those + files whose modification dates on the server are later than those on + the client. Date-time comparisons are done in Coordinated Universal + Time (UTC, GMT, ZULU). The command: + + FTP MGET /COLLISION:APPEND /AS-NAME:newfilename *.* + + Downloads all matching remote files into a single local file (in + whatever order the server sends them). + _________________________________________________________________ + + 3.6.3. Recovery + + Recovery is available for downloads too, but there are some + differences from the uploading case described in [315]Section 3.5.3: + + * The transfer must be in BINARY mode. It can not be in text mode, + even if the FTP server is on the same kind of platform as Kermit, + and even if there is no character-set translation. The original + download must also have been in binary mode. + * The FTP server must support the REST ("restart") directive. + Unfortunately, this is not a standard command; at this writing, it + is described only in an Internet Draft, not an RFC or Internet + Standard, but nevertheless it is found in several popular FTP + servers, such as [316]ProFTPD. + + Here's how download recovery works: + + * Kermit checks for conflicting switches, such as /UPDATE, /COMMAND, + or /FILTER. If /RECOVER is given with these switches an error + occurs. + * The prevailing transfer mode (SET FTP TYPE) must be BINARY. If it + is not, the /BINARY switch must have been included with the FTP + [M]GET command. + + If the /RECOVER switch is accepted, then for each selected file: + + * A SIZE command is sent for the file (using its remote name). If + the reply indicates the file was not found, or the SIZE command + was not understood, or any other kind of error, recovery is + canceled (i.e. the entire file is downloaded). + * If the sizes of the two files are identical, the file is not sent. + Otherwise: + * Kermit sends the REST directive to the server, indicating the size + of the local file. If the server responds affirmatively, Kermit + opens the local file in append mode and appends the incoming data + to it. Otherwise, recovery is canceled and the entire file is + downloaded. + + The /RECOVER switch can be included with any FTP GET or MGET command, + even if it specifies a group of files. This lets you resume an + interrupted batch transfer from where it left off. The files that were + already completely sent are skipped, the file that was interrupted is + recovered, and the remaining files are uploaded. BUT... unlike with + uploading, where this can be done with any mixture of text and binary + files, when downloading, it can only be done if all the files are + binary. + + It doesn't matter how the original partial file was downloaded -- FTP, + Kermit, HTTP, Zmodem, etc: as long as the preconditions are met, it + can be recovered with FTP [M]GET /RECOVER, or for that matter also + with GET /RECOVER (using Kermit protocol). + + [ [317]Top ] [ [318]FTP Top ] [ [319]C-Kermit Home ] [ [320]Kermit + Home ] + _________________________________________________________________ + + 3.7. Translating Character Sets + + A possibly unique feature of Kermit's FTP client is its ability to + convert character sets when transferring files in text mode, + independent of the capabilites of the FTP server, as well as to + translate the character sets of filenames regardless of transfer mode. + For compatibility with existing FTP clients, and because there is a + certain performance penalty, Kermit won't do this unless you ask for + it. If you enable this feature, you need to inform Kermit of the + character set (to be) used on the server and in some cases (explained + below) also the local file character set. This discussion assumes you + know a bit about character sets (as you must if you have to use them); + see Chapter 16 of [321]Using C-Kermit for a detailed treatment. The + Kermit commands for FTP character-set conversion are: + + SET FTP CHARACTER-SET-TRANSLATION { ON, OFF } + Whether to translate character sets when transferring text + files with FTP. OFF by default. Set this to ON to enable + character-set translation for subsequent FTP uploads and + downloads. + + SET FTP SERVER-CHARACTER-SET [322]name + Text character set (to be) used by the server. Most FTP servers + are ignorant of character sets, so all translations are done + unilaterally by Kermit's FTP client. This means that when + downloading files, you must know in advance the character-set + used in the files you are downloading (and in their names). + When uploading, you must specify the character-set to which + local filenames and text-file contents are to be translated for + transmission to the server. If you SET FTP + CHARACTER-SET-TRANSLATION ON but do not specify an FTP + SERVER-CHARACTER-SET, [323]UTF8 is used, since this is the new + Internet standard international character set; it is upwards + compatible with ASCII and it encompasses most written languages + and therefore does not favor any particular group of people, as + any other default would do. If you SET FTP SERVER-CHARACTER-SET + to something (anything) when FTP CHARACTER-SET TRANSLATION is + OFF, this also sets the latter ON. + + SET FILE CHARACTER-SET [324]name + This is the regular Kermit (non-FTP-specific) command for + identifying the character set (to be) used in local text files + and filenames. + + TO REITERATE: If you SET FTP CHARACTER-SET TRANSLATION ON but do not + specify an FTP SERVER-CHARACTER-SET, outbound text files are converted + to UTF-8 and inbound text files are assumed to be UTF-8. If this is + not appropriate, be sure to also specify the desired FTP + SERVER-CHARACTER-SET. + + You can use "special" (non-ASCII) characters in filenames in all the + client / server file management commands (FTP MKDIR, RMDIR, DIRECTORY, + VDIRECTORY, DELETE, etc), and also in file-transfer commands. When + giving commands such as FTP DIR (RDIR) and FTP PWD (RPWD), the reply + is translated too, so you can read it. In this example, the client and + server use entirely different codes to represent the special + characters of German: + + C-Kermit> ftp xyzcorp.de /anonymous + C-Kermit> set ftp server-character-set latin1 + C-Kermit> set file character-set german + C-Kermit> rcd Städte + C-Kermit> rpwd + "/pub/ftp/Städte is current directory" + C-Kermit> rdir + -rw-rw---- 1 olaf 54018 Jan 6 17:58 Adenbüttel.txt + -rw-rw---- 1 ursula 373 Jan 5 15:19 Aßlar.txt + -rw-rw---- 1 gisbert 482 Jan 5 15:20 Blowatz.txt + -rw-rw---- 1 gudrun 124 Jan 5 15:19 Böblingen.txt + -rw-rw---- 1 olga 14348 Jan 7 14:23 Köln.txt + + When the client and server file systems use different character sets, + you should take care to use only those characters that the two sets + share in common when creating filenames or text-file contents. For + example, PC code pages contain a lot line- and box-drawing characters, + and sometimes "smart quotes", etc, that are not found in ISO standard + 8-bit character sets. You should be especially careful to avoid using + such characters in filenames. + + [ [325]C-Kermit Character Sets ] + _________________________________________________________________ + + 3.7.1. Character Sets and Uploading + + Kermit's PUT and MPUT commands include full file-scanning + capabilities, as described in [326]Section 4. Thus if FTP + CHARACTER-SET-TRANSLATION is ON and your character-set associations + are set up appropriately, Kermit automatically switches on a per-file + basis between text and binary mode, and for each text file between + your chosen 7-bit text character set (e.g. ASCII or ISO 646 German), + 8-bit text (e.g. Latin-1 or Japanese EUC), UCS-2, and UTF-8, and + converts each of these automatically to the server character-set, and + furthermore automatically differentiates between the Little and Big + Endian forms of UCS-2, always sending in Big Endian form. + + WARNING: It is not advisable to use UCS-2 (or any Unicode + transformation other than UTF-8) "on the wire", i.e. as a server + character set. Most FTP servers are not able to cope with it, since + it contains lots of 0 (NUL) characters. If you do use it, Kermit + does not translate filenames to or from UCS-2, for reasons well + known to C programmers (for example, UNIX APIs assume filename + strings are NUL-terminated). [327]UTF-8 is the preferred (and + standard) Unicode format for the Internet. + + FTP character-set translations differ from the regular Kermit ones by + not restricting translations to a file-character-set / + transfer-character-set pair. You can have Kermit's FTP client + translate between any pair of character sets it knows about. You can + see the list of supported character sets by typing either of the + following: + + set ftp server-character-set ? + set file character-set ? + + A typical list looks like this ([328]CLICK HERE for an explanation of + the names): + + C-Kermit>set file char ? One of the following: + ascii cp869-greek hebrew-7 mazovia-pc + british cyrillic-iso hebrew-iso next-multinational + bulgaria-pc danish hp-roman8 norwegian + canadian-french dec-kanji hungarian portuguese + cp1250 dec-multinational iso2022jp-kanji shift-jis-kanji + cp1251-cyrillic dg-international italian short-koi + cp1252 dutch jis7-kanji spanish + cp437 elot927-greek koi8 swedish + cp850 elot928-greek koi8r swiss + cp852 euc-jp koi8u ucs2 + cp855-cyrillic finnish latin1-iso utf8 + cp858 french latin2-iso + cp862-hebrew german latin9-iso + cp866-cyrillic greek-iso macintosh-latin + C-Kermit> + + Thus you can translate not only between private sets (like PC code + pages) and standard ones (like Latin-1) as in Kermit protocol, but + also between any given pair of private sets (e.g. CP852 and Mazovia). + All conversions go through Unicode as the intermediate character set, + resulting in a minimum of character loss, since Unicode is a superset + of all other character sets known to Kermit. + + In addition to the SET commands listed above, the FTP PUT and MPUT + commands include switches that apply only to the current command: + + /LOCAL-CHARACTER-SET:name + /SERVER-CHARACTER-SET:name + Use these switches to force a particular translation. These + switches override the global FTP CHARACTER-SET-TRANSLATION and + SERVER-CHARACTER-SET settings and also character-set + differentiation by file scanning for the duration of the PUT or + MPUT command. The file scan is still performed, however, to + determine whether the file is text or binary; thus these + switches do not affect binary files unless you also include the + /TEXT switch to force all files to be treated as text. + + In other words, if you include one or both of these switches with a + PUT or MPUT command, they are used. Similarly, the /TRANSPARENT switch + disables character-set translation for the PUT or MPUT command despite + the prevailing FTP CHARACTER-SET-TRANSLATION and SERVER-CHARACTER-SET + settings. + + When uploading, the FILE CHARACTER-SET setting is ignored unless you + have forced Kermit not to [329]scan local files by including a /TEXT + or /BINARY switch with your [M]PUT command, or by disabling automatic + text/binary switching in some other way. + + Examples: + + 1. Suppose you have a CP852 (East European) text file that you want + to upload and store in ISO Latin Alphabet 2 encoding: + ftp put /local-char:cp852 /server-char:latin2 magyar.txt + 2. Suppose you always want your text files converted to Latin-2 when + uploading with FTP. Then put: + set ftp server-character-set latin2 + in your Kermit customization file, and then you can omit the + /SERVER-CHARACTER-SET: switch from your FTP PUT commands: + ftp put /local-char:cp852 magyar.txt + 3. Now suppose that all the text files on your PC are written in + Hungarian, but they have a variety of encodings, and you don't + want to have to include the /LOCAL-CHARACTER-SET: switch on every + FTP PUT command, or (more to the point) you want to be able to + send a mixture of these files all at once. Put these commands in + your Kermit customization file: + set ftp server-character-set latin2 ; ISO 8859-2 + set file default 7-bit-character-set hungarian ; ISO 646 Hungarian + set file default 8-bit-character-set cp852 ; PC East European Code Page + and now PUT and MPUT will automatically detect and switch among + ISO 646 Hungarian, Code Page 852, UTF-8, and UCS-2 encodings, + translating each one to Latin-2 for uploading: + ftp put *.txt + + And since binary files are also detected automatically, the latter can + be simplified to: + + ftp put * + + even when "*" matches a diverse collection of binary and text files, + because translations are skipped automatically for binary files. + _________________________________________________________________ + + 3.7.2. Character Sets and Downloading + + The commands and switches are the same as for uploading, but automatic + character-set switching works differently, since Kermit can't scan the + server files in advance. Instead, the transfer mode (text or binary) + is based on the filenames; each name is compared with Kermit's list of + text name patterns and binary name patterns. If the name matches a + binary pattern (for example, if the filename is oofa.tar.gz and one of + the filename patterns is "*.gz"), the file is downloaded in binary + mode; otherwise if it matches a text pattern (e.g. oofa.txt matches + "*.txt"), it is transferred in text ("ascii") mode. Otherwise, it is + transferred in the prevailing FTP TYPE. + + In C-Kermit 8.0, the pattern lists used with FTP GET are not the same + lists used with Kermit transfers, and can not be viewed with SHOW + PATTERNS, nor adjusted with ADD and REMOVE TEXT-PATTERNS and + BINARY-PATTERNS, or SET FILE TEXT-PATTERNS and BINARY-PATTERNS. + Configuration of the FTP patterns list will be added in a future + release. + + Examples: + + get /server-char:latin1 /local-char:cp850 Grüße.txt + In this command, the filename contains special characters, + which you enter using whatever character set your local + computer uses, in this case PC Code Page 850 (cp850). The + command tells Kermit (in case it didn't know already from its + FILE CHARACTER-SET setting) that the local character set is + cp850 and the server's character-set is ISO 8859-1 Latin + Alphabet 1 (latin1). Kermit translates the filename from cp850 + to latin1 and sends the latin1 name to the server. Since it's a + text file (matches "*.txt"), its contents are translated to + cp850 on arrival, and it is saved with a cp850 name. + + mget /text /server:latin1 /local:utf8 *.txt + This command: + + + Tells C-Kermit that the server's files are encoded in ISO + 8859-1 Latin Alphabet 1. + + Tells C-Kermit to translate the incoming files into Unicode + UTF-8 for storage. + + Asks the server to send all ".txt" files in text mode. + + mget /server:latin1 /local:utf8 * + Tells Kermit to get all files from the server's directory, + switching between text and binary mode based on the filename. + The names of all the files are translated (to UTF-8 in this + case), but contents are translated (also to UTF-8) only for + text files. + + Note that any pair of 8-bit character sets is likely to have some + incompatibilities. Any characters in the source file that do not have + equivalents in the destination file's character set are converted to + question marks. This applies to both filenames and to text file + contents. + + Also note that the server's ability to accept special characters in + filenames depends on the particular server. For example: + + get Grüße.txt + + works with WU-FTPD, but: + + mget Grüß*.txt + + does not. + _________________________________________________________________ + + 3.7.3. RFC2640 + + [330]RFC2640, July 1999, specifies a method by which the FTP client + and server can negotiate the use of UTF8. However, RFC2640-capable + servers are rare to nonexistent at this writing, and in any case you + don't need them to be able to transfer text in UTF8. C-Kermit lets you + upload and download text files in any character set it knows about, + converting to or from any other character set it knows about, without + the knowledge, permission, or cooperation of the server, and + regardless of its capabilities. + + [ [331]Top ] [ [332]FTP Top ] [ [333]C-Kermit Home ] [ [334]Kermit + Home ] + _________________________________________________________________ + + 3.8. FTP Command Shortcuts + + C-Kermit's FTP client coexists with other C-Kermit functions by + requiring the "ftp" prefix for each FTP-related command: FTP OPEN, FTP + GET, FTP BYE, and so on. For interactive use, however, this can be + rather awkward and sometimes surprising, for example when a GET + command starts a Kermit GET rather than an FTP GET. In fact, many + Kermit commands might just as easily apply to an FTP connection: GET, + PUT (SEND), BYE, and CLOSE. The following command lets you choose how + these commands are interpreted: + + SET GET-PUT-REMOTE { AUTO, KERMIT, FTP } + Controls the orientation of GET, PUT, REMOTE and other + file-transfer and client/server commands that might apply to + either Kermit or FTP. The default setting is AUTO, meaning that + these commands apply to FTP if an FTP connection is open, and + to Kermit otherwise. KERMIT means they always apply to Kermit, + FTP means they always apply to FTP. + + Here is a complete list of affected commands: + + Kermit Command FTP Equivalent + (none) FTP [ OPEN ] + LOGIN FTP USER + LOGOUT FTP RESET + BYE FTP BYE + FINISH FTP BYE + CLOSE FTP BYE + HANGUP FTP BYE + BINARY FTP TYPE BINARY + TEXT (or ASCII) FTP TYPE ASCII + SEND (or PUT) FTP PUT + MSEND (or MPUT) FTP MPUT + RESEND FTP PUT /RECOVER + CSEND FTP PUT /COMMAND + GET FTP GET + MGET FTP MGET + REGET FTP GET /RECOVER + REMOTE HELP (RHELP) FTP HELP + REMOTE CD (RCD) FTP CD (CWD) + REMOTE PWD (RPWD) FTP PWD + REMOTE DIRECTORY (RDIR) FTP DIRECTORY + REMOTE DELETE (RDEL) FTP DELETE + REMOTE MKDIR (RMKDIR) FTP MKDIR + REMOTE RMDIR (RRMDIR) FTP RMDIR + REMOTE RENAME (RRENAME) FTP RENAME + REMOTE TYPE (RTYPE) FTP TYPE + REMOTE EXIT (REXIT) FTP BYE + + The commands in the right-hand column always access FTP. The commands + in the left column can access either Kermit protocol or FTP: + + * When GET-PUT-REMOTE is set to KERMIT, or to AUTO when there is no + FTP connection, the commands in the left-hand column access Kermit + protocol, and those right-hand column are required for FTP. + * When GET-PUT-REMOTE is set to FTP, or to AUTO when there is an + active FTP connection, the commands in the left-hand column access + the FTP connection and can not be used to access Kermit protocol. + In this case, if you want to be able to use both Kermit protocol + and the FTP connection, you must SET GET-PUT-REMOTE KERMIT, and + then use the FTP commands in the right-hand column to access the + FTP connection. + + Note that file-management commands such as DIRECTORY, DELETE, CD, PWD, + MKDIR, RMDIR, HELP, RENAME, COPY, TYPE, and so on, always apply + locally, no matter what kind of connection you have. This is the + opposite of most FTP clients, where these commands are intended for + the server, and require an "L" prefix for local execution (e.g. "dir" + gets a directory listing from the server, "ldir" gets a local + directory listing). To illustrate with the CD command and a typical + UNIX FTP client: + + Client Server Change Local Directory Change Remote Directory + FTP FTP lcd cd (cwd) + Kermit Kermit cd rcd, remote cd + Kermit FTP cd ftp cd, rcd, remote cd + + Also note that not all REMOTE commands are useful with FTP, since FTP + servers do not offer the corresponding functions. These include: + + * REMOTE ASSIGN - FTP servers don't have variables + * REMOTE COPY - FTP servers don't copy files + * REMOTE HOST - FTP servers don't execute host (shell) commands + * REMOTE KERMIT - FTP servers don't execute Kermit commands + * REMOTE PRINT - FTP servers don't print files + * REMOTE QUERY - FTP servers don't have variables + * REMOTE SET - FTP servers don't have Kermit settings + * REMOTE WHO - FTP servers don't send user lists + + Finally note that command shortcuts do not apply to the HELP command. + For help about an FTP command, use (for example) "help ftp delete", + not "help delete" or "help rdelete". + + [ [335]Top ] [ [336]FTP Top ] [ [337]C-Kermit Home ] [ [338]Kermit + Home ] + _________________________________________________________________ + + 3.9. Dual Sessions + + You can have an FTP session open at the same time as a regular Kermit + SET LINE or SET HOST (terminal) session. In this case, the default SET + GET-PUT-REMOTE AUTO setting should ensure that all "two-faced" + commands like GET, PUT, REMOTE, HANGUP, BYE, etc, apply to the Kermit + session, and all commands for the FTP session must include the FTP + prefix. To be absolutely certain, you can use SET GET-PUT-REMOTE + KERMIT. + + ftp foo.bar.baz.com + if fail ... + (log in) + set host foo.bar.baz.com + if fail ... + (log in) + + Now you have both an FTP and Telnet connection to the same host (of + course they could also be to different hosts, and you could also have + a direct or dialed serial connection instead of a Telnet connection). + Now assuming you have a Kermit server on the far end of the Kermit + connection: + + rcd incoming ; Changes Kermit server's directory (= REMOTE CD) + ftp cd incoming ; Changes FTP server's directory + put oofa.txt ; Sends a file on the Kermit connection + ftp put oofa.txt ; Sends a file on the FTP connection + bye ; Shuts down the Kermit connection + ftp bye ; Shuts down the FTP connection + + Note that PUT and SEND are synonyms for both FTP and Kermit + connections. + + You can also establish dual sessions on the Kermit command line: + + kermit -j host1 -9 host2 + + This makes a Telnet connection to host1 and an FTP connection to + host2. + + [ [339]Top ] [ [340]FTP Top ] [ [341]C-Kermit Home ] [ [342]Kermit + Home ] + _________________________________________________________________ + + 3.10. Automating FTP Sessions + + Most of Kermit's scripting features can be used to make and control + FTP sessions: FOR and WHILE loops, IF-ELSE and SWITCH constructions, + variables, arrays, built-in functions, and all the rest. You can't use + INPUT, MINPUT, OUTPUT, CLEAR, or SCRIPT on an FTP session, but these + are not needed since the FTP protocol is well defined. + + [343]CLICK HERE for an FTP scripting tutorial. + + 3.10.1. FTP-Specific Variables and Functions + + The following variable tells whether an FTP connection is open: + + \v(ftp_connected) + 1 if there is an active FTP connection, 0 if there isn't. + + The FTP OPEN command sets: + + \v(ftp_host) + The host to which the most recent FTP connection was made. + + \v(ftp_security) + The security method negotiated for the current FTP session. The + value is "NULL" when no security is used. See [344]3.2. Making + Secure FTP Connections. + + \v(ftp_server) + The OS type (UNIX, VMS, etc) of the FTP server host. + + The FTP USER command (or FTP OPEN /USER:, or FTP with automatic login) + sets: + + \v(ftp_loggedin) + 1 if you are logged in to an FTP server, 0 if you are not. + + The current COMMAND-PROTECTION-LEVEL and DATA-PROTECTION-LEVEL values + are reflected in: + + \v(ftp_cpl) + \v(ftp_dpl) + The values are "clear", "confidential", "safe" or "private". + See [345]3.2. Making Secure FTP Connections. + + The FTP GET-PUT-REMOTE setting is reflected in: + + \v(ftp_getputremote) + The values are "auto", "ftp", or "kermit". + + Every FTP command sets the \v(success) variable, as well as the + following two FTP-specific variables: + + \v(ftp_code) + The standardized numeric FTP protocol code from the server's + response to the last client command, a 3-digit decimal number + defined in [346]RFC959. Briefly: + + 1xx = Positive Preliminary Reply + 2xx = Positive Completion Reply + 3xx = Positive Intermediate Reply + 4xx = Transient Negative Completion Reply + 5xx = Permanent Negative Completion Reply + + \v(ftp_message) + The text message, if any, from the server's response to the + last client command. If the most recent response had multiple + lines, this variable has only the final line. These messages + are not standardized and vary in format and content from server + to server. Synonym: \v(ftp_msg). + + FTP file transfers set the regular Kermit transfer status variables: + + \v(cps) Characters per second of most recent transfer. + \v(filespec) File specification used in most recent transfer. + \v(fsize) Size of file most recently transferred. + \v(tfsize) Total size of file group most recently transferred. + \v(xferstatus) Status of most recent transfer (0 = success, 1 = failure). + \v(tftime) Elapsed time of most recent transfer, in seconds. + + During an FTP transfer, the per-file variables are: + + \v(filename) Name of current file. + \v(filenumber) Ordinal file number in group (1, 2, 3, ...) + _________________________________________________________________ + + 3.10.2. Examples + + Let's begin with a simple example showing how to log in, send some + files, and log out: + + define error if fail { ftp bye, stop 1 Error: \%1 } + set transact brief + log t + ftp ftp.xyzcorp.com /anonymous + if fail stop 1 Connection failed + if not \v(ftp_loggedin) stop 1 Login failed + ftp cd incoming + error {ftp cd} + cd upload + error {local cd} + ftp put /delete * + error {put} + ftp bye + + First we define an error handling macro to be used after the + connection is made. Then we set up a brief-format transaction log to + keep a record of our file transfers. Then we make a connection to the + host and log in anonymously. The "if fail" command checks whether the + connection was made. The "if not" command checks whether login was + successful. Obviously the script should not continue unless both tests + succeed. + + Next we change to the server's 'incoming' directory and to our own + 'upload' directory, and send all the files that are in it (they can be + any mixture of text and binary files), deleting each source file + automatically after it is successfully uploaded. Each of these + operations is checked with the ERROR macro, which prevents the script + from continuing past a failure. + + Finally we close the FTP session with the "bye" command. + + Just like any other Kermit script, this one can be used in many ways: + + * It can be stored in a file, and Kermit can be told to TAKE the + file. + * In UNIX, it can be a "[347]kerbang" script and therefore run + directly from the shell prompt or as a cron job. + + We could have used command shortcuts like "rcd", "put", and "bye", but + since they can be ambiguous under certain circumstances, it is better + to avoid them in scripts; they are intended mainly for convenience + during interactive use. However, if you wish to use the shortcuts in a + script, you can do it this way (error handling omitted for brevity): + + local \%t ; Declare a local temporary veriable + assign \%t \v(ftp_getputremote) ; Save current FTP GET-PUT-REMOTE setting + set ftp get-put-remote ftp ; Choose FTP orientation + ftp xyzcorp.com /anonymous ; Open an FTP connection + get oofa.txt ; GET a file + put foo.bar ; PUT a file + rdel yesterday.log ; Delete a file on the server + bye ; Log out and disconnect from server. + set ftp get-put-remote \%t ; Restore previous GET-PUT-REMOTE setting + + Of course, FTP scripts can also be written as macros. This lets you + pass parameters such as hostnames, usernames, and filenames to them: + + define doftpget { + if < \v(argc) 4 end 1 Usage: \%0 host user remotefile [ localfile ] + ftp \%1 /user:\%2 + if fail end 1 FTP OPEN \%1 failed + if not \v(ftp_loggedin) end 1 FTP LOGIN failed + ftp get {\%3} {\%4} + if fail end 1 FTP GET \%3 failed + ftp bye + } + + Add this definition to your Kermit customization file, and it will + always be available when you start Kermit. This macro lets you + download a file with FTP by giving a single command, e.g.: + + doftpget xyzcorp.com anonymous oofa.txt + _________________________________________________________________ + + 3.10.3. Automating Secure FTP Sessions + + Often when making secure connections, you are prompted interactively + for certain information or permission to proceed. These prompts can + stop an automated procedure. To avoid them, you must give the + appropriate commands to disable them, and/or supply the prompted-for + information beforehand. Here are a few hints: + + * Make sure that SET TAKE ERROR and SET MACRO ERROR are both OFF. + This is the default, but in case you have set either one of these + ON in your script or initialization file, this makes the script + halt on any kind of error. Normally you would want to check each + operation for success or failure and take appropriate action. + * On SSL and TLS connections, you may be asked whether it is OK to + proceed with a connection to server that presents a self-signed + certificate. You can use the SET AUTHENTICATION SSL (or TLS) + VERIFY or SET AUTH SSL (or TLS) CERTS-OK commands to avoid this + prompt by not requesting a certificate from the peer. + * (More to be added...) + + [ [348]Top ] [ [349]FTP Top ] [ [350]FTP Script Tutorial ] [ + [351]C-Kermit Home ] [ [352]Kermit Home ] + _________________________________________________________________ + + 3.11. Advanced FTP Protocol Features + + The remainder of the FTP documention (through the end of Section 3) is + new to C-Kermit 8.0.206, but we leave it in black to prevent + headaches. Except for titles. + * [353]TERMINOLOGY + * [354]FEATURE NEGOTIATION + * [355]USING MGET: NLST VERSUS MLSD + * [356]EXAMPLES + * [357]REFERENCES + + The new releases of [358]C-Kermit (8.0.206) and [359]Kermit 95 (2.1) + support new FTP protocol features from RFC 2389 as well as most of + what's in the Elz and Hethmon Extensions to FTP Internet Draft (see + [360]References). Some of these features, such as SIZE (request a + file's size), MDTM (request file's modification time), and REST + (restart interrupted transfer) have been widely implemented in FTP + clients and servers for years (as well as in the initial release of + the Kermit FTP clients). Others such as FEAT and MLSD are rarely seen + and are new to the upcoming Kermit releases. TVFS (Trivial Virtual + File Store) is supported implicitly, and the UTF-8 character-set is + already fully supported at the protocol and data-interchange level. + + For Kermit users, the main benefit of the new FTP protocol extensions + is the ability to do recursive downloads. But the extensions also + introduce complications and tradeoffs that you should be aware of. Of + course Kermit tries to "do the right thing" automatically in every + case for backwards compatibility. But (as noted later) some cases are + inherently ambiguous and/or can result in nasty surprises, and for + those situations new commands and switches are available to give you + precise control over Kermit's behavior, in case the defaults don't + produce the desired results. + _________________________________________________________________ + + 3.11.1. Terminology Command-line FTP clients such as Kermit (as well + as the traditional FTP programs found on Unix, VMS, ..., even Windows) + have commands like PUT, MPUT, GET, MGET, and BYE, which they convert + into zero or more FTP protocol commands, such as NLST, RETR, QUIT. For + clarity, we'll use "command" to refer to commands given by the user to + the FTP client, and "directive" for FTP protocol commands sent by the + FTP client to the FTP server. + _________________________________________________________________ + + 3.11.2. Feature Negotiation New FTP protocol features are negotiated + by the client sending a FEAT directive and the server responding with + a list of (new) features it supports, or else with an error indication + if it does not support the FEAT directive at all, in which case the + client has to guess which new features it supports (Kermit guesses + that it supports SIZE and MDTM but not MLST). Note that the MLST + feature includes MLSD, which is not listed separately as a feature. + + Guessing is nice when it works, but sometimes it doesn't, and some FTP + servers become confused when you send them a directive they don't + understand, or they do something you didn't want, sometimes to the + point of closing the connection. For this reason, Kermit lets you + override default or negotiated features with the following new + commands: + + FTP { ENABLE, DISABLE } FEAT + Enables or disables the automatic sending of a FEAT directive + upon connection to an FTP server. Note that + FTP [ OPEN ] /NOINIT also inhibits sending the FEAT directive + (and several others) for the connection being OPEN'd, but + without necessarily disabling FEAT for subsequent connections + in the same Kermit instance. FEAT is ENABLED by default, in + which case many FTP servers are likely to reply: + +500 'FEAT': command not understood + + which is normally harmless (but you never know). (In C-Kermit + 8.0.208, this error message is suppressed unless you SET FTP + DEBUG ON.) + + FTP ENABLE { MDTM, MLST, SIZE } + Enables the given directive for implicit use by the FTP GET and + MGET commands in case it has been disabled or erroneously + omitted by the server in its FEAT response. Note: MLSD can be + used in the FTP ENABLE and DISABLE commands as a synonym for + MLST. YOU MUST GIVE THIS COMMAND AFTER MAKING THE FTP + CONNECTION. + + FTP DISABLE { MDTM, MLST, SIZE } + Disables implicit use of the given directive by GET or MGET in + case it causes problems; for example, because it makes + multifile downloads take too long or the server announces it + erroneously or misimplements it. Use DISABLE FEAT before making + a connection to prevent Kermit from sending the FEAT directive + as part of its initial sequence. Note that disabling FEAT, + SIZE, or MDTM does not prevent you from executing explicit FTP + FEATURES, FTP SIZE, or FTP MODTIME commands. Also note that + disabling SIZE prevents PUT /RESTART (recovery of interrupted + uploads) from working. YOU MUST GIVE THIS COMMAND AFTER MAKING + THE FTP CONNECTION. + + To enable or disable more than one feature, use multiple FTP ENABLE or + FTP DISABLE commands. The SHOW FTP command shows which features are + currently enabled and disabled. + + FTP FEATURES + This command sends a FEAT directive to the server. In case you + have been disabling and enabling different features, this + resynchronizes Kermit's feature list with the server's. If the + server does not support the FEAT directive, Kermit's feature + list is not changed. + + FTP OPTIONS directive + Informational only: the server tells what options, if any, it + supports for the given directive, e.g. MLST. Fails if the + server does not support the OPTS directive or if the directive + for which options are requested is not valid. The directive is + case-insensitive. + + FTP SIZE filename + Sends a SIZE directive to the server for the given file. The + filename must not contain wildcards. The server responds with + an error if the file can't be found, is not accessible, or the + SIZE directive is not supported, otherwise with the length of + the file in bytes, which Kermit displays and also makes + available to you in its \v(ftp_message) variable. If the + directive is successful, Kermit (re-)enables it for internal + use by the GET and MGET directives on this connection. + + FTP MODTIME filename + Works just like the SIZE directive except it sends an MDTM + directive. Upon success, the server sends modification + date-time string, which Kermit interprets for you and also + makes available in its \v(ftp_message) variable. + + Whenever a SIZE or MDTM directive is sent implicitly and rejected by + the server because it is unknown, Kermit automatically disables it. + _________________________________________________________________ + + 3.11.3. Using MGET: NLST versus MLSD When you give an MGET command to + an FTP client, it sends a request to the FTP server for a list of + files, and then upon successful receipt of the list, goes through it + and issues a RETR (retrieve) directive for each file on the list (or + possibly only for selected files). + + With the new FTP protocol extensions, now there are two ways to get + the list of files: the NLST directive, which has been part of FTP + protocol since the beginning, and the new MLSD directive, which is new + and not yet widely implemented. When NLST is used and you give a + command like "mget *.txt", the FTP client sends: + +NLST *.txt + + and the server sends back a list of the files whose names match, e.g. + +foo.txt +bar.txt +baz.txt + + Then when downloading each file, the client sends SIZE (if it wants + have a percent-done display) and MDTM (if it wants to set the + downloaded file's timestamp to match that of the original), as well as + RETR (to retrieve the file). + + But when MLSD is used, the client is not supposed to send the filename + or wildcard to the server; instead it sends an MLSD directive with no + argument (or the name of a directory), and the server sends back a + list of all the files in the current or given directory; then the + client goes through the list and checks each file to see if it matches + the given pattern, the rationale being that the user knows only the + local conventions for wildcards and not necessarily the server's + conventions. So with NLST the server interprets wildcards; with MLSD + the client does. + + The interpretation of NLST wildcards by the server is not + necessarily required or even envisioned by the FTP protocol + definition (RFC 959), but in practice most clients and servers work + this way. + + The principal advantage of MLSD is that instead of sending back a + simple list of filenames, it sends back a kind of database in which + each entry contains a filename together with information about the + file: type, size, timestamp, and so on; for example: + +size=0;type=dir;perm=el;modify=20020409191530; bin +size=3919312;type=file;perm=r;modify=20000310140400; bar.txt +size=6686176;type=file;perm=r;modify=20001215181000; baz.txt +size=3820092;type=file;perm=r;modify=20000310140300; foo.txt +size=27439;type=file;perm=r;modify=20020923151312; foo.zip +(etc etc...) + + (If the format of the file list were the only difference between NLST + and MLSD, the discussion would be finished: it would always be better + to use MLSD when available, and the MGET user interface would need no + changes. But there's a lot more to MLSD than the file-list format; + read on...) + + The client learns whether the server supports MLSD in FEAT exchange. + But the fact that the server supports MLSD doesn't mean the client + should always use it. It is better to use MLSD: + + * On connections where the server imposes a time penalty for every + command, e.g. the Red Hat Rawhide server. With MLSD, the client + needs to send only one command (RETR) per file, whereas NLST + requires three (SIZE, RETR, and MDTM). Suppose there is a + 30-second delay for each command and 1000 files are to be fetched; + in that case, MLSD saves 60,000 seconds = 1000 minutes = 16 hours + and 40 minutes. + * For recursive downloads since there is no dependable way to + download directory trees with NLST. + + But it is better to use NLST: + + * If you want only a couple short files out of a large directory. In + this case, NLST is the better choice since the server sends a list + of only the files you want, not a list of (say) a million files, + which can make a big difference on slow connections. For example, + suppose your wildcard matches three files of 1K each, but the + million-file listing is 80MB long, and your connection is through + a modem. The overhead of using MLSD is practically infinite. + * If the server supports wildcarding features not known to the + client, but that can be used to achieve desirable effects + otherwise unobtainable, such as "[dir...]*.txt" in VMS or AOS/VS + "except" clauses. + * If you have been given a wildcard string by an FTP site + administrator for fetching a specific group of files out of a + larger directory, e.g. "mget ck[cuw]*.[cwh] makefile", that is + expected to work with any client (an FTP site administrator can't + be expected to know the wildcard syntax of every FTP client). + + But when using MLSD there are complications: + + * MLSD wants either a blank argument (meaning the current directory) + or else the name of a specific directory. The client must not send + it a wildcard or a filename. + * But if the user's command is "mget xxx", how does the client know + whether to send "xxx" in the MLSD directive? It might be the name + of a directory on on the server, in which case it should be sent, + or it might be the name of a file on the server (or a wildcard), + in which case it must not be sent. Since the client knows its own + wildcard syntax, then in most cases it would be right to send + "MLSD" with no argument if xxx is wild, and to send "MLSD xxx" if + it is not. + * But suppose the server's file system allows filename characters + that correspond with the client's wildcard syntax? For example: + "[abc]" could be either a valid VMS directory name or a wildcard + pattern used by the FTP client. What should the client do with + "mget [abc]"? In this case there must be a way for the user to + force sending the MGET argument as the MLSD argument. + * If "xxx" is a regular file in the server's current directory, + "mget xxx" works with NLST but not with MLSD. + + To further complicate matters, NLST can (in theory) work just like + MLSD: if sent with a blank argument or a directory name, it is + supposed to return a complete list of files in the current or given + directory, which the client can match locally against some pattern. It + is not known if any FTP server or client does this but nevertheless, + it should be possible since this behavior can be inferred from RFC + 959. + + In view of these considerations, and given the need to preserve the + traditional FTP client command structure and behavior so the software + will be usable by most people: + + 1. The MGET command should produce the expected result in the common + cases, regardless of whether NLST or MLSD is used underneath. + 2. For anomalous cases, the user needs a way to control whether the + MGET argument is sent to the server or kept for local use. + 3. At the same time, the user might need a way to send a directory + name to the server, independent of any wildcard pattern. + 4. The user needs a way to force NLST or MLSD for a given MGET + command. + + By default, Kermit's MGET command uses MLSD if MLST is reported by the + server in its FEAT list. When MLSD is used, the filespec is sent to + the server if it is not wild (according to Kermit's own definition of + "wild" since it can't possibly know the server's definition). If the + filespec is wild it is held for local use to select files from the + list returned by the server. If MLST is not reported by the server or + is disabled, Kermit sends the MGET filespec with the NLST directive. + + The default behavior can be overridden globally with FTP DISABLE MLST, + which forces Kermit to use NLST to get file lists. And then for + situations in which MLSD is enabled, the following MGET switches can + be used to override the defaults for a specific MGET operation: + + /NLST + Forces the client to send NLST. Example: + +mget /nlst foo.* + + /MLSD + Forces the client to send MLSD (even if MLST is disabled). + Example: + +mget /mlsd foo.* + + /MATCH:pattern + When this switch is given, it forces the client to hold the + pattern for local use against the returned file list. If a + remote filespec is also given (e.g. the "blah" in "mget + /match:*.txt blah"), then it is sent as the NLST or MLSD + argument, presumably to specify the directory whose files are + to be listed. When the /MATCH switch is not given, the MGET + filespec is sent to the server if the directive is NLST or if + the filespec is not wild. Examples: + + Command: With NLST: With MLSD: + mget NLST MLSD + mget *.txt NLST *.txt MLSD + mget foo NLST foo MLSD foo + mget /match:*.txt NLST MLSD + mget /match:*.txt foo NLST foo MLSD foo + + In other words, the pattern is always intepreted locally unless MGET + uses NLST and no /MATCH switch was given. + _________________________________________________________________ + + 3.11.4. Examples + + 3.11.4.1. Downloading a Single File + + There are no choices here, just use the FTP GET command. Kermit always + sends the RETR directive, and possibly SIZE and/or MDTM. The small + advantage of using MLST in this case is outweighed by the risk and + effort of coding a special case. + + 3.11.4.2. Downloading a Group of Files from a Single Directory + + This case presents tradeoffs, especially on slow connections: + + * For downloading all or most of the files in a directory, MLSD is + better because it eliminates the need to send SIZE and MDTM for + each file. No special actions are required in this case; Kermit + uses MLSD automatically if the server supports it (unless you have + disabled it). + * For a small number of files from a large directory, NLST is better + because it bypasses downloading of a potentially huge file list + prior to the files themselves. If you have a connection to a + server that supports MLSD, use the /NLST switch to force NLST: + +mget /nlst t[1234].h + + * If the server supports MLSD but does not support separate SIZE or + MDTM directives, and you need the size and/or timestamp + information, MLSD is better; no special actions required. + * If the server supports MLSD but does not support the "size" and + "modify" facts, but it does support the SIZE or MDTM directives, + and you need the size and/or timestamp information, NLST is + better. + + 3.11.4.3. Downloading a Directory Tree + + MLSD is the only choice for recursive downloads; they rarely, if ever, + work with NLST (the few cases where they do work rely on + extra-protocol "secret" notations for the NLST argument). No special + actions are required to force MLSD when the server supports it, unless + you have disabled it. Examples: + + MGET /RECURSIVE + This tells the server to send all files and directories in the + tree rooted at its current directory. + + MGET /RECURSIVE *.txt + This tells the server to send all *.txt files in the tree + rooted at its current directory. + + MGET /MLSD /RECURSIVE *.txt + Same as the previous example but forces Kermit to send MLSD in + case it was disabled, or in case the server is known to support + it even though it did not announce it in its FEAT listing. + + MGET /RECURSIVE /MATCH:*.zip archives + Tells the server to send all ZIP files in the tree rooted at + its "archives" directory. + + MGET /RECURSIVE /MATCH:* [abc] + The server is running on VMS and you want it to send all the + files in the directory tree rooted at [ABC]. But since "[abc]" + looks just like a wildcard, you have to include a /MATCH: + switch to force Kermit to send "[abc]" as the MLSD argument. + + In all cases in which the /RECURSIVE switch is included, the server's + tree is duplicated locally. + + Although MLSD allows recursion and NLST does not, the MLSD + specification places a heavy burden on the client; the obvious, + straightforward, and elegant implementation (depth-first, the one + that Kermit currently uses) requires as many open temporary files + as the server's directory tree is deep, and therefore client + resource exhaustion -- e.g. exceeding the maximum number of open + files -- is a danger. Unfortunately MLSD was not designed with + recursion in mind. (Breadth-first traversal could be problematic + due to lack of sufficient navigation information.) + + Of course all of Kermit's other MGET switches can be used too, e.g. + for finer-grained file selection (by date, size, etc), for moving or + renaming files as they arrive, to override Kermit's automatic per-file + text/binary mode switching, to pass the incoming files through a + filter, to convert text-file character sets, and so on. + + 3.11.4.4. NLST/MLSD Summary Table + + Here's a table summarizing MGET behavior when the server supports both + NLST and MLSD. /NLST and /MLSD switches are included for clarity to + indicate which protocol is being used, and the expected effects. In + practice you can omit the /NLST and /MLSD switches and the Kermit + client chooses the appropriate or desired protocol as described above. + Sample commands presume a Unix file system on the server, but of + course the server can have any file system or syntax at all. + + User's Command FTP Sends Remarks + mget /nlst NLST Gets a list of all the files in the server's current + and downloads each file. The list includes names only, so Kermit also + must send SIZE and MDTM directives if size and timestamp information + is required (this is always true of NLST). Sending NLST without an + argument is allowed by the RFC959 NLST definition and by the Kermit + FTP client, but might not work with other clients, and also might not + work with every server. + mget /nlst foo NLST foo If "foo" is a directory, this gets a list of + all the files from the server's "foo" directory and downloads each + file; otherwise this downloads the file named "foo" (if any) from the + server's current directory. + mget /nlst *.txt NLST *.txt Gets a list of the files in the server's + current directory whose names match the pattern *.txt, and then + downloads each file from the list. Because we are using NLST, we send + the filespec (*.txt) to the server and the server interprets any + wildcards. + mget /nlst foo/*.txt NLST foo/*.txt Gets a list of the files in the + server's "foo" directory whose names match the pattern *.txt, and then + downloads each file from the list (server interprets wildcards). + mget /nlst /match:*.txt NLST Gets a list of all the files in the + server's current directory and then downloads each one whose name + matches the pattern *.txt (client interprets wildcards). + mget /nlst /match:*.txt foo NLST foo Gets a list of all the files in + the server's "foo" directory and then downloads each one whose name + matches the pattern *.txt (client interprets wildcards). + mget /mlsd MLSD Gets a list of all the files from the server's current + directory and then downloads each one. The list might include size and + timestamp information, in which case Kermit does not need to send SIZE + and MDTM directives for each file (this is always true of MLSD). + mget /mlsd foo MLSD foo Gets a list of all the files from the server's + "foo" directory (where the string "foo" does not contain wildcards) + and then downloads each one. If "foo" is a regular file and not a + directory, this command is supposed to fail, but some servers have + been observed that send the file. + mget /mlsd *.txt MLSD Gets a list of all the files from the server's + current directory and then downloads only the ones whose names match + the pattern "*.txt". Because we are using MLSD and the MGET filespec + is wild, we do not send the filespec to the server, but treat it as + though it had been given in a /MATCH: switch and use it locally to + match the names in the list. + mget /mlsd foo/*.txt MLSD This one won't work because MLSD requires + that the notions of server directory and filename-matching pattern be + separated. However, the client, which can't be expected to know the + server's file-system syntax, winds up sending a request that the + server will (or should) reject. + mget /mlsd /match:*.txt MLSD Gets a list of all the files from the + server's current directory and then downloads only the ones whose + names match the pattern "*.txt" (client interprets wildcards). + mget /mlsd /match:*.txt foo MLSD foo If "foo" is a directory on the + server, this gets a list of all the files from the server's "foo" + directory and then downloads only the ones whose names match the + pattern "*.txt" (client interprets wildcards). This leaves the server + CD'd to the "foo" directory; there's no way the client can restore the + server's original directory because MLSD doesn't give that + information, and since the client can not be expected to know the + server's file-system syntax, it would not be safe to guess. If "foo" + is a regular file, MLSD fails. + mget /mlsd foo bar MLSD This one is problematic. You're supposed to be + able to give MGET a list a filespecs; in this case we name two + directories. The client must change the server's directory to "foo" to + get the list of files, and then the files themselves. But then it has + no way to return to the server's previous directory in order to do the + same for "bar", as explained in the previous example. + mget /mlsd /match:* [abc] MLSD [abc] Including a /MATCH: switch forces + [abc] to be sent to the server even though the client would normally + think it was a wildcard and hold it for local interpretation. In this + example, [abc] might be a VMS directory name. + mget /mlsd /match:* t*.h MLSD t*.h Contrary to the MLSD specification, + some MLSD-capable FTP servers do interpret wildcards. This form of the + MGET command can be used to force a wildcard to be sent to the server + for interpretation. + + When MLSD is used implicitly (that is, without an /MLSD switch given + to force the use of MLSD) and an MGET command such as "mget foo/*.txt" + fails, Kermit automatically falls back to NLST and tries again. + _________________________________________________________________ + + 3.11.5. References + + 1. Postel, J., and J. Reynolds, File Transfer Protocol (FTP), RFC + 959, October 1985: [361]ftp://ftp.isi.edu/in-notes/rfc959.txt. + 2. Hethmon, P, and R. Elz, Feature negotiation mechanism for the File + Transfer Protocol, RFC 2389, August 1998: + [362]ftp://ftp.isi.edu/in-notes/rfc2389.txt. + 3. Elz, R, and P. Hethmon, Extensions to FTP, Internet Draft + draft-ietf-ftpext-mlst-16.txt, September 2002: + [363]http://www.ietf.org/internet-drafts/draft-ietf-ftpext-mlst-16 + .txt. + 4. [364]The Kermit FTP Client (overview). + + [ [365]Top ] [ [366]FTP Top ] [ [367]C-Kermit Home ] [ [368]Kermit + Home ] + __________________________________________________________________________ + +4. FILE SCANNING + + A new feature called file scanning is used in various contexts to + determine if a file is text or binary, and if it is text, what kind of + text. The overhead of file scanning is surprisingly tolerable, usually + about a quarter second per file. File scanning is now used instead of + filename patterns unless you SET FILE SCAN OFF, which restores the + previous behavior. + + The primary benefit of file scanning is in file transfer. For all + practical purposes, now you can stop worrying about whether a file + should be sent in binary or text mode, or about sending mixtures of + text and binary files in a single operation, or configuring and + fine-tuning your lists of binary-file and text-file name patterns: now + it all just works. + + File scanning is done by the file sender, which determines the type of + each file before it sends it and informs the receiver (Kermit or FTP + server) of the type. File scanning is NOT done by the receiver, + because it is the sender's responsibility to determine each file's + type, send the file in the right mode, and inform the receiver of the + mode. If both transfer partners are capable of this (or any other) + form of automatic text/binary mode switching, then files can be sent + in both directions with no worries about corruption due to + inappropriate transfer mode. (As noted in [369]Section 3, FTP servers + don't do this, so this discussion does not apply when using Kermit to + download from an FTP server.) + + The rest of this section is mainly for the curious. If you don't read + it and simply accept all defaults, every file you send should go in + the appropriate mode automatically. As always, however, for + character-set translation to work for 7- and 8-bit character-set + files, the appropriate SET FILE CHARACTER-SET command(s) must have + been executed to identify their encoding (Kermit's default file + character-set is neutral ASCII except on platforms like HP-UX or + DG/UX, where the default file character-set is known). And of course, + receiving is another matter -- obviously the other Kermit must also + send each file in the appropriate mode. + + Scanning is more reliable than filename patterns simply because + filenames are not reliable indicators of the file's contents. Classic + examples include ".doc" files, which are binary if Microsoft Word + documents but text on most other platforms, and ".com" files, which + are binary on DOS and Windows but text on VMS. Anyway, nobody knows + the naming conventions (if any) of all the applications (and persons!) + on your computer. Scanning, on the other hand, determines each file's + type by inspecting its contents rather than just looking at its name. + + Also, file patterns -- even when they work as intended -- categorize + each file only as text or binary, whereas file scanning can make finer + distinctions: + + BINARY + Binary data, not to be converted in any way. Examples include + binary machine code (executable programs), graphics images + (GIF, JPG, etc), compressed files (Z, GZ, etc), archives and + packages (ZIP, TAR, RPM, etc), object files and libraries (OBJ, + DLL, etc). + + 7-BIT TEXT + Text encoded in a 7-bit character set such as ASCII or one of + the ISO 646 national versions. Kermit has no way to tell which + character is used, only that it's 7-bit text. Typical examples + include program source code, README files, Perl or Kermit + scripts, plain-text email, HTML, TeX, and various textual + encodings of binary files: Hex, Base64, etc. When sending such + files, the FILE DEFAULT 7BIT-CHARACTER-SET is used as the file + character-set, and then the appropriate transfer character set + is chosen from the associations list (ASSOCIATE, SHOW + ASSOCIATIONS). + + 8-BIT TEXT + Text encoded in an 8-bit character set such as Latin-1, + Latin-2, Latin/Hebrew, Latin/Cyrillic, KOI8, HP-Roman8, JIS X + 0208, Code Page 437, or Code Page 1252. Again, Kermit has no + way of knowing which particular set is in use, only that it's + 8-bit text. When sending such files, the FILE DEFAULT + 8BIT-CHARACTER-SET is used as the file character-set, and then + the appropriate transfer character set is chosen from the + associations list. + + UCS2 TEXT + Unicode in its basic form, 16 bits (2 octets) per character. + When sending such files, UCS2 is the file character-set and the + byte order is identified automatically; the appropriate + transfer character set is chosen from the associations list. + Normally this would be UTF8. UTF-16 is not supported yet; + Kermit's Unicode translations are restricted to Plane 0, the + Base Multilingual Plane (BMP). + + UTF8 TEXT + Unicode in its 8-bit transformation format. When sending such + files, UTF8 is the file character-set; the appropriate transfer + character set is chosen from the associations list, normally + UCS2 or UTF8. + + File scanning is available in UNIX C-Kermit, in K-95, and to a limited + extent, in VMS C-Kermit (full scanning is problematic in VMS because + even plain-text files might contain binary record-format information). + The relevant commands are: + + SET TRANSFER MODE { AUTOMATIC, MANUAL } + Tells whether the file-transfer mode (text or binary) should be + set by automatic or "manual" means. AUTOMATIC is the default, + which allows any of the automatic methods that are enabled to + do their jobs: FILE SCAN, FILE PATTERNS, peer recognition, etc. + MANUAL lets you control the transfer mode with the SET FILE + TYPE commands. As always, /TEXT and /BINARY switches on your + file-transfer commands override all other methods; if you give + one of these switches, scanning is not done. SHOW TRANSFER + displays the current TRANSFER MODE setting. + + SET FILE SCAN { ON [ number ], OFF } + Turns this feature on and off. It's ON by default. When OFF, + the previous rules apply (SET FILE PATTERNS, etc). When ON is + given, you can also specify a number of bytes to be scanned. + The default is 49152 (= 48K). If a negative number is given, + the entire file is scanned, no matter how big, for maximum + certainty (for example, a PostScript file that appears to be + plain text might include an embedded graphic past the normal + scanning limit). SHOW FILE displays the current FILE SCAN + setting. + + SET FILE DEFAULT 7BIT-CHARACTER-SET name + Tells the 7-bit character-set to use if scanning identifies a + 7-bit text file, e.g. GERMAN. SHOW FILE displays the current + SET FILE DEFAULT settings. So does SHOW CHARACTER-SETS. + + SET FILE DEFAULT 8BIT-CHARACTER-SET name + Tells the 8-bit character-set to use if scanning identifies an + 8-bit text file, e.g. LATIN1. SHOW FILE and SHOW CHARACTER-SET + display this. + + ASSOCIATE FILE-CHARACTER-SET fcs tcs + When sending files and a file character-set (fcs) is identified + by scanning, this tells C-Kermit which transfer character-set + (tcs) to translate it to. It also allows C-Kermit to set the + appropriate transfer character-set automatically whenever you + give a SET FILE CHARACTER-SET command. + + ASSOCIATE TRANSFER-CHARACTER-SET tcs fcs + When receivinging files and a file arrives whose transfer + character-set (tcs) is announced by the sender, this command + tells C-Kermit which file character-set (fcs) to translate it + to. It also allows C-Kermit to set the appropriate file + character-set whenever you give a SET TRANSFER CHARACTER-SET + command. + + SET FILE CHARACTER-SET name + When given for a 7-bit set, also sets FILE DEFAULT + 7BIT-CHARACTER-SET to the same set. When given for an 8-bit + set, also sets FILE DEFAULT 8BIT-CHARACTER-SET to the same set. + If an ASSOCIATE FILE-CHARACTER-SET command has been given for + this set, also sets the corresponding transfer character-set. + + DIRECTORY /XFERMODE [ filespec ] + Performs a file scan of the given files, listing the result for + each file. If FILE SCAN is OFF but PATTERNS are ON, the result + shown according to the current FILE TEXT-PATTERNS and + BINARY-PATTERNS, and are restricted to (B) and (T). When FILE + SCAN is ON, the results are: + + (B) Binary + (T)(7BIT) Text: 7-bit + (T)(8BIT) Text: 8-bit + (T)(UTF8) Text: Unicode UTF8 + (T)(UCS2BE) Text: Unicode UCS2 Big Endian + (T)(UCS2LE) Text: Unicode UCS2 Little Endian + + So you can use DIR /XFER to get a preview of how each file in a + selected group will be transferred. Everything to the right of + the (B) or (T) is new. If FILE SCAN is OFF, you only get the + (B) or (T) as before. + + Note: Big and Little Endian refer to the ordering of bytes + within a computer word. Big Endian architecture is standard and + is used on most non-PC computers. Little Endian architecture is + used on PCs. + + To illustrate file-transfer with scanning, suppose you have a + directory containing a mixture of text and binary files, and each text + file can be 7-bit German ISO 646, 8-bit Latin-1, or Unicode in any of + the following forms: UCS2 Little Endian, UCS2 Big Endian, or UTF8 + ([370]UTF-16 is not supported yet). Assuming all the built-in defaults + are in effect, the following three commands do the job: + + set file char german ; This sets the default for 7-bit text files + set file char latin1 ; This sets the default for 8-bit text files + send * + + Each file is sent in the appropriate mode (text or binary), with text + files converted to the appropriate transfer character-set and labeled + so the receiver can convert them according to its own local + conventions. + + By the way, what if you want to inhibit character-set translation but + still allow automatic text/binary mode switching? Previously, you + could simply SET TRANSFER CHARACTER-SET TRANSPARENT. But now with file + scanning, the file and transfer character-sets are set automatically + per file. A new command was added for this purpose: + + SET TRANSFER TRANSLATION { ON, OFF } + Enables and disables file-transfer character-set translation. + It is enabled by default. + + When TRANSFER TRANSLATION is OFF but FILE SCAN is ON, files are still + scanned to see if they are text or binary, but no character-set + translation is done when they text: only the normal record-format + conversion. + + Like all SET commands, SET TRANSFER TRANSLATION is global and + persistent. You can also force a particular file-transfer command + (SEND, MSEND, GET, RECEIVE, TRANSMIT, etc) to not translate without + affecting the global translation settings by including the new + /TRANSPARENT switch, e.g. + + send /transparent oofa.txt + + As of C-Kermit 8.0.206, SET TRANSFER CHARACTER-SET TRANSPARENT implies + SET TRANSFER TRANSLATION OFF. + + File scanning is also used in the TYPE command. The source file type + and character set are determined as above, and then the file is + automatically converted to your display character-set, line by line. + In Kermit 95, the display character-set is Unicode, perhaps converted + to your current console code page; in other versions of C-Kermit, it + is your current file character-set. Thus if you have the following set + appriately: + + SET FILE CHARACTER-SET (necessary in Unix but not K95) + SET FILE DEFAULT 7BIT CHARACTER-SET + SET FILE DEFAULT 8BIT CHARACTER-SET + + then you should be able to TYPE any text file and see something + reasonable. For example, in Unix, if your DEFAULT 7BIT-CHARACTER-SET + is ITALIAN and your DEFAULT 8BIT-CHARACTER-SET is LATIN1, and your + FILE CHARACTER-SET is LATIN1, you can TYPE an Italian ISO 646 file, a + Latin-1 file, or any kind of Unicode file, and have it translated + automatically to Latin-1 for your display. + + In the GUI version of Kermit 95, you can see mixtures of many + different scripts if the file is UTF8 or UCS2: Roman, Cyrillic, + Hebrew, Greek, Armenian, Georgian, etc, all on the same screen at + once. + + File scanning also adds a new criterion for file selection, i.e. to + select only text (or binary) files. Several commands now include a new + switch, /TYPE:{BINARY,TEXT,ALL}. BINARY means select only binary + regular files (not directories). TEXT means select only text files. + ALL means don't scan; select all files. Examples: + + SEND /TYPE:BINARY *.* + Sends only binary files, skipping over text files. + + NOTE: File scanning is NOT done when using external protocols (because + the external protocol programs, such as sz, are processing each file, + not Kermit). + + DIRECTORY /TYPE:TEXT + Lists only text files but not binary files. + + DELETE /TYPE:BINARY foo.* + Deletes all foo.* files that are regular binary files but does + not delete any text files. + + CHMOD /TYPE:BINARY 775 * + (UNIX) Changes the permissions of all binary files to 775. + + When FILE SCAN is OFF and FILE PATTERNS are ON, behavior is as before + with PATTERNS ON, but with some improvements: + + * Pathnames are now stripped prior to pattern matching. + * Backup suffixes (like .~3~) are stripped prior to pattern + matching. + + [ [371]Top ] [ [372]Contents ] [ [373]C-Kermit Home ] [ [374]Kermit + Home ] + __________________________________________________________________________ + +5. FILE AND DIRECTORY NAMES CONTAINING SPACES + + Prior to the introduction of the graphical user interface (GUI), it + was inconceivable that file or directory names could contain spaces, + because space is a field delimiter in all command languages. GUIs, + however, use dialog boxes for filenames, so there is never any + question of distinguishing a filename from adjacent fields -- because + there are no adjacent fields -- and therefore it has become quite + common on computers that have GUIs to have file and directory names + composed of multiple words. Of course this poses problems for command + shells and other text-oriented programs. + + Most command shells address these problems by allowing such names to + be enclosed in doublequotes, e.g.: + + cd "c:\Program Files" + + C-Kermit previously used braces for this: + + cd {c:\Program Files} + + which was not what most people expected. And even when braces were + used, Kermit had difficulties with completion, file menus, and so + forth, within braced fields. + + C-Kermit 8.0 allows either doublequotes or braces to be used for + grouping: + + send "this file" + send {this file} + rename "this file" "that file" + rename {this file} "that file" + rename "this file" {that file} + cd {Program Files} + cd "Program Files" + + Note that the doublequotes or brackets must enclose the whole file or + directory specification: + + "c:\My Directory" + + not: + + c:\"My Directory" + + In C-Kermit 8.0, you can also use completion on these filenames, in + which case Kermit supplies the quotes (or braces) automatically. + Example (in which the current directory contains only one file whose + name starts with "th" and its full name is "this file" (without the + quotes, but with the space)): + + cat th + + Kermit repaints the filename field like this: + + cat "this file" + + That is, it backspaces over the original "th" and then writes the + filename in doublequotes. + + If completion is only partial, Kermit still supplies the quotes, but + in this case also beeps. To continue the filename, you must first + backspace over the closing quote. The closing quote is supplied in + this case to make sure that you can see the spaces, especially if they + are trailing. For example, if the current directory contains two files + whose names start with "th", and their fill names are "this file" and + "this other file": + + cat th + + Kermit prints: + + cat "this " + + If it didn't print the closing quote, you would probably wonder why it + was beeping. + + Also, if you begin a filename field with a doublequote or opening + brace, now you can use completion or get ?-help; this was never + possible before. + + C-Kermit>type "thi? Input file specification, one of the following: + this file this other file + C-Kermit>type "thi_ + + [ [375]Top ] [ [376]Contents ] [ [377]C-Kermit Home ] [ [378]Kermit + Home ] + __________________________________________________________________________ + +6. OTHER COMMAND PARSING IMPROVEMENTS + + 6.1. Grouping Macro Arguments + + Doublequotes now can be used in macro invocations to group arguments + containing spaces, where previously only braces could be used: + + define xx show args + xx one "this is two" three + + Result: + + Macro arguments at level 0 (\v(argc) = 4): + \%0 = xx + \%1 = one + \%2 = this is two + \%3 = three + + Also, you can now quote braces and quotes in macro args (this didn't + work before). Examples: + + xx "{" ; The argument is a single left brace + xx {"} ; The argument is a doublequote character + + In case this new behavior interferes with your scripts, you can + restore the previous behavior with: + + SET COMMAND DOUBLEQUOTING OFF + + 6.2. Directory and File Name Completion + + C-Kermit 8.0 also includes better completion for directory names, e.g. + in the CD command. If the name typed so far uniquely matches a + directory name, it is completed (as before), but now if the directory + contains any subdirectories, completion is partial (allowing you to + supply additional path segments without backspacing); otherwise it is + complete. + + Completion has also been improved for file and directory names that + contain not only spaces (as described above) but also "metacharacters" + such as asterisk (*) and tilde (~): now the field is repainted if + necessary. For example, if the current directory contains only one + file whose name contains "blah", then in: + + type *blah + + "*blah" is replaced by the filename. In earlier releases, the part + typed so far was left on the command line (and in the history buffer), + so even when the original command worked, the recalled version would + not. Similarly for ~ (the nearly-universal Unix notation for + username): + + type ~olga/x + + is repainted as (e.g.): + + type /users/home/olga/x(Beep) + + Speaking of command history, the new SHOW HISTORY command shows your + command history and recall buffer. SAVE COMMAND HISTORY saves it into + a file of your choice. + + 6.3. Passing Arguments to Command Files + + The method for passing arguments to command files has been improved. + Prior to C-Kermit 7.0 there was no provision for doing this. In + C-Kermit 7.0, the TAKE command was changed to allow arguments to be + given after the filename: + + take commandfile arg1 arg2 ... + + This was accomplished by replacing the current \%1, \%2, etc, with the + given arguments, since a new set of macro argument variables is + created only when a macro is executed, not a command file. It is much + more intuitive, however, if arguments to command files worked like + those to macros: the command file sees the arguments as its own \%1, + \%2, etc, but the caller's variables are not disturbed. C-Kermit 8.0 + accomplishes this by automatically creating an intermediate temporary + macro to start the command file (if any arguments were given), thus + creating a new level of arguments as expected. + + 6.4. More-Prompting + + The familiar --more?-- prompt that appears at the end of each + screenful of command-response output now accepts a new answer: G (Go) + meaning "show all the rest without pausing and asking me any more + questions". P (Proceed) is a synonym for G. + + 6.5. Commas in Macro Definitions + + As noted in the [379]C-Kermit manual, comma is used to separate + commands in a macro definition. Even when the macro is defined on + multiple lines using curly-brace block-structure notation without + commas, the definition is still stored internally as a comma-separated + list of commands. Therefore special tricks are needed to include a + comma in a command. The classic example is: + + define foo { + (some command) + if fail echo Sorry, blah failed... + } + + This would result in Kermit trying to execute a "blah" command. This + could always be handled by enclosing the text in braces: + + define foo { + (some command) + if fail echo {Sorry, blah failed...} + } + + but doublequotes (more intuitive) should have worked too. Now they do: + + define foo { + (some command) + if fail echo "Sorry, blah failed..." + } + + 6.6. Arrow Keys + + As of version 8.0.201, C-Kermit on most platforms lets you access the + command history buffer with arrow keys, just as you always could with + control characters. The restrictions are: + + 1. Only Up and Down arrow keys are accepted. + 2. Only 7-bit ANSI arrow-key sequences are understood (ESC followed + by [ or uppercase letter O, followed by uppercase letter A or (up) + B (down). + + This change was made to facilitate command recall in Linux-based PDAs + that don't have a Control key, or at least not one that's easily (or + always) accessible, such as the Sharp Zaurus SL5500. + + [ [380]Top ] [ [381]Contents ] [ [382]C-Kermit Home ] [ [383]Kermit + Home ] + __________________________________________________________________________ + +7. NEW COMMANDS AND SWITCHES + + See [384]Section 4 for more about file scanning and the /TYPE: switch. + + ASK[Q] [ /TIMEOUT:number /QUIET /DEFAULT:text ] variable [ prompt ] + The new optional /TIMEOUT: switch for ASK and ASKQ causes the + command to time out and and fail if no response is given within + the specified number of seconds, 1 or greater (0 or less means + no timeout, wait forever). This works just like SET ASK-TIMER, + except its effect is local to the ASK command with which it is + given and it does not disturb the global ask timer setting. The + new /QUIET switch tells Kermit not to print an error message if + the ASK or ASKQ command times out waiting for a response. + + Version 8.0.211 adds the /DEFAULT:text switch for ASK-Class + commands (ASK, ASKQ, and GETOK). This lets you supply a default + answer in case the user supplies an empty answer or the + /TIMEOUT: switch was included and the time limit expired + without an answer. In both these cases, the command succeeds. + + CAT filename + Equivalent to TYPE /NOPAGE. + + CDUP + Changes Kermit's local working directory to the parent of the + current one. Equivalent to "cd .." in UNIX or Windows, "cd [-]" + in VMS, "cd ^" in AOS/VS, etc; in other words, it's a + platform-independent way of moving one level up in a directory + tree. + + CHMOD [ switches ] permission files + UNIX only. Sets file permissions for one or more files or + directories. The permission must be given as an octal number, + e.g. 664, 755. Switches: /DIRECTORIES, /FILES, /NOLIST, /PAGE, + /DOTFILES, /LIST, /NOPAGE, /RECURSIVE, /TYPE:{TEXT,BINARY,ALL}, + /SIMULATE. The /TYPE: switch allows selection of only text or + binary files. For example, if you have a mixture of source + files and executables, you can use "chmod /files /type:text + 664" to give owner/group read/write and world read permission + to the text files, and "chmod /files /type:binary 775" to give + the same plus execute permission to the executables. Use + /SIMULATE to see which files would be affected, without + actually changing their permissions. + + CLEAR KEYBOARD-BUFFER + Flushes any as-yet unread characters from the keyboard input + buffer. Useful for flushing typeahead in scripts. + + CONTINUE + When given at an interactive command prompt that was reached by + issuing a PROMPT command (described in this section) from a + script, this command returns to the script, continuing its + execution at the command after the PROMPT command. In this + context, CONTINUE is simply a more-intuitive synonym for END. + + COPY, RENAME, and TRANSLATE + These commands now work on file groups if the target filename + is a directory, e.g. "copy oofa.* ..", "rename * ~olga/tmp/" + + COPY /APPEND source destination + The source file specification can now include wildcards, in + which case all of the source files that match will go into the + destination file in alphabetical order by name. + + DELETE /ASK + Asks permission to delete each file before deleting it. In + C-Kermit 7.0, the answers were "yes" (or "ok") and "no". + C-Kermit 8.0 adds "go" (meaning, delete all the rest without + asking) and "quit" (cancel the DELETE command and return to the + prompt). + + DELETE /DIRECTORIES + Deletes not only files but also directories. + + DELETE /RECURSIVE + Deletes all files that match the given file specification in + the current (or given) directory and all directories beneath + it. + + DELETE /SUMMARY + Prints only the number of files deleted and total size freed, + without listing each file. + + DELETE /TREE + Shorthand for DELETE /RECURSIVE /DIRECTORIES /DOTFILES/. + Equivalent to Windows DELTREE or Unix "rm -Rf". If no file + specification is given, the contents of the current directory, + plus all of its subdirectories and their contents, are deleted. + + DELETE /TYPE:BINARY + Delete only regular binary files (requires FILE SCAN ON). + + DELETE /TYPE:TEXT + Delete only regular text files (requires FILE SCAN ON). + + DIRECTORY [ switches ] [ filespec [ filespec [ filespec ... ] ] ] + The DIRECTORY command now accepts more than one file + specification; e.g. "directory moon.txt sun.doc stars.*". + + DIRECTORY /NORECURSIVE xxx + If xxx is a directory name, forces listing of the directory + itself rather than its contents. + + DIRECTORY /FOLLOWLINKS xxx + (UNIX only) Tells the DIRECTORY command to follow symbolic + links. This not the default because it can cause endless loops. + + DIRECTORY /NOFOLLOWLINKS xxx + (UNIX only) Tells the DIRECTORY command not to follow symbolic + links, but rather, merely to list them. This is the default. + + DIRECTORY /OUTPUT:filename + Sends the results of the DIRECTORY command to the given file. + + DIRECTORY /SUMMARY + Prints only the number of directories and files and the total + size, without listing each file. + + DIRECTORY /TYPE:{TEXT,BINARY} + Shows only files of the selected type, based on file scan. + + DIRECTORY /XFERMODE + Now shows results of file scan (see [385]Section 4). + + FOPEN [ switches ] channel filename + + As of version 8.0.211, FOPEN allows /dev/tty as a filename in + Unix-based operating systems. + + FREAD /TRIM + (8.0.211) Trims any trailing blanks or tabs from the item (such + as a line of text) that it has read. + + FREAD /UNTABIFY + (8.0.211) Converts Horizontal Tab characters to the appropriate + number of spaces, based on VT100-like tab stops + (1,9,17,25,...). + + GREP [ switches ] pattern files + Similar to Unix grep command: displays file lines that match + the given [386]pattern. Switches: + + /COUNT[:variable] + Don't show the matching lines, just tell how many lines + match. If a variable name is specified, the count is + stored in the given variable. + + /DOTFILES + Include files whose names begin with dot. + + /LINENUMBERS + Show line numbers of matching lines. + + /NAMEONLY + only list the names of files that contain matching lines, + but not the lines themselves. + + /NOBACKUP + Skip backup files. + + /NOCASE + Ignore alphabetic case while pattern matching. + + /NODOTFILES + skip files whose names start with dot (period). + + /NOLIST + Suppress output but set SUCCESS or FAILURE according to + search result. + + /NOMATCH + Look for lines that do not match the pattern. + + /NOPAGE + Don't pause between screens of output. + + /OUTPUT:filename + Write results into the given file. + + /PAGE + Pause between screens of output. + + /RECURSIVE + Search files in subdirectories too. + + /TYPE:{TEXT,BINARY} + Search only files of the specified type. + + Synonyms: FIND, SEARCH. + + GETOK /TIMEOUT:n /QUIET /DEFAULT:text + The new /QUIET switch instructs GETOK, when given a timeout, + not to print an error message if it times out. As of 8.0.211, a + default answer can be supplied (see ASK). + + HEAD [ switches ] filename + Equivalent to TYPE /HEAD [ other-switches ] filename. + + HELP DATE + Explains date-time formats, including timezone notation and + delta times. + + HELP FIREWALLS + Explains the firewall negotiation capabilities of your version + of Kermit. + + KCD [ symbolic-directory-name ] + Changes Kermit's working directory to the named symbolic + directory, such as such as exedir, inidir, startup, download, + or and home. Type "kcd ?" for a list of symbolic directory + names known to your copy of Kermit, or give the new ORIENTATION + command for a more detailed explanation. If you give a KCD + command without a directory name, Kermit returns to its "home" + directory, which is determined in some way that depends on the + underlying operating system, but which you can redefine with + the (new) SET CD HOME command. Your home directory is shown by + SHOW CD and it's also the value of the \v(home) variable. + + LICENSE + Displays the C-Kermit license. + + L-commands + When Kermit has a connection to a Kermit or FTP server, file + managment commands such as CD, DIRECTORY, and DELETE might be + intended for the local computer or the remote server. C-Kermit + 8.0.200 and earlier always executes these commands on the local + computer. If you want them executed by the remote server, you + have to prefix them with REMOTE (e.g. REMOTE CD) or use special + R-command aliases (e.g. RCD = REMOTE CD, RDIR = REMOTE DIR, + etc). But this feels unnatural to FTP users, who expect + unprefixed file management commands to be executed by the + remote server, rather than locally. C-Kermit 8.0.201 adds + automatic locus switching to present an FTP-like interface for + FTP connections and the normal Kermit interface for Kermit + connections, and a SET LOCUS command (described below) to + control whether or how this is done. For when LOCUS is REMOTE, + a new set of commands was added for local management: LCD + (Local CD), LDIR (Local DIR), etc. These are described below + under SET LOCUS. + + MORE filename + Equivalent to TYPE /PAGE. + + ORIENTATION + Displays symbolic directory names and the corresponding + variable names and values. The symbolic names, such as exedir, + inidir, startup, download, and home, can be used as arguments + to the new KCD command. + + PROMPT [ text ] + For use in a macro or command file: enters interactive command + mode within the current context ([387]Section 8.1). If the + optional text is included, the prompt is set to it. The text + can include variables, functions, etc, as in the SET PROMPT + command. They are evaluated each time the prompt is printed. + Unlike the SET PROMPT command, the text argument applies only + to the current command level. Thus you can have different + prompts at different levels. + + REMOTE SET MATCH { DOTIFILE, FIFO } { ON, OFF } + Allows the client to tell the server whether wildcards sent to + the server should match dot files (files whose names begin with + period) or FIFOs (named pipes). See SET MATCH. + + SET ATTRIBUTE RECORD-FORMAT { ON, OFF } + Allows control of the Kermit's Record-Format attribute. Set + this to OFF in case incoming file are refused due to unknown or + invalid record formats if you want to accept the file anyway + (and, perhaps, postprocess it to fix its record format). + + SET CD HOME [ directory ] + Specifies the target directory for the CD and KCD commands, + when they are given without an argument, and also sets the + value of the \v(home) variable. + + SET EXIT HANGUP { OFF, ON } + Normally ON, meaning that when Kermit exits, it also explicitly + hangs up the current SET LINE / SET PORT serial port according + to the current SET MODEM TYPE and SET MODEM HANGUP METHOD, and + closes the port device if it was opened by Kermit in the first + place (as opposed to inherited). SET EXIT HANGUP OFF tells + Kermit not to do this. This can't prevent the operating system + from closing the device when Kermit exits (and it's a "last + close") but if the port or modem have been conditioned to + somehow ignore the close and keep the connection open, at least + Kermit itself won't do anything explicit to hang it up or close + it. + + SET FILE EOF { CTRL-Z, LENGTH } + Specifies the end-of-file detection method to be used by + C-Kermit when sending and receiving text files, and in the TYPE + and similar text-file oriented commands. The normal and default + method is LENGTH. You can specify CTRL-Z when handling CP/M or + MS-DOS format text files, in which a Ctrl-Z (ASCII 26) + character within the file marks the end of the file. + + SET FILE LISTSIZE number + Allocates space for the given number of filenames to be filled + in by the wildcard expander. The current number is shown by + SHOW FILE. If you give a command that includes a filename + containing a wildcard (such as "*") that matches more files + that Kermit's list has room for, you can adjust the list size + with this command. + + SET FILE STRINGSPACE number + Allocates space for the given amount of filename strings for + use by the wildcard expander. The current number is shown by + SHOW FILE. The number is the total number of bytes of all the + file specifications that match the given wildcard. + + If you need to process a bigger list of files than your computer + has memory for, you might be able use an external file list. The + Kermit SEND and the FTP PUT and GET commands accept a /LISTFILE: + switch, which gives the name of a file that contains the list of + files to be transferred. Example for UNIX: + + !find . -print | grep / > /tmp/names + ftp put /update /recursive /listfile:/tmp/names + + SET LOCUS { AUTO, LOCAL, REMOTE } + Added in C-Kermit 8.0.201. Sets the locus for unprefixed file + management commands such as CD, DIRECTORY, MKDIR, etc. When + LOCUS is LOCAL these commands act locally and a REMOTE (or R) + prefix (e.g. REMOTE CD, RCD, RDIR) is required to send file + management commands to a remote server. When LOCUS is REMOTE, + an L prefix is required to issue local file management commands + (e.g. LCD, LDIR). The word LOCAL can't be used as a prefix + since it is already used for declaring local variables. LOCUS + applies to all types of connections, and thus is orthogonal to + SET GET-PUT-REMOTE, which selects between Kermit and FTP for + remote file-transfer and management commands. The default LOCUS + is AUTO, which means we switch to REMOTE whenever an FTP + connection is made, and to LOCAL whenever a non-FTP connection + is made, and switch back accordingly whenever a connnection is + closed. So by default, Kermit behaves in its traditional manner + unless you make an FTP connection, in which case it acts like a + regular FTP client (but better :-) LOCUS applies to the + following commands: + + Unprefixed Remote Local Description + CD (CWD) RCD LCD Change (Working) Directory + CDUP RCDUP LCDUP CD Up + PWD RPWD LPWD Print Working Directory + DIRECTORY RDIR LDIR Request a directory listinga + DELETE RDEL LDEL Delete (a) file(s) + RENEME RREN LREN Rename a file + MKDIR RMKDIR LMKDIR Create a directory + RMDIR RRMDIR LRMDIR Remove a directory + + SET MATCH { DOTIFILE, FIFO } { ON, OFF } + Whether C-Kermit filename patterns (wildcards) should match + filenames that start with dot (period), or (Unix only) FIFOs + (named pipes). The defaults are to skip dotfiles in Unix but + match them elsewhere, and to skip FIFOs. Applies to both + interactive use and to server mode, when the server receives + wildcards, e.g. in a GET command. Also see REMOTE SET MATCH. + + SET OPTIONS DIRECTORY /DOTFILES + Now works for server listings too (UNIX only). Give this + command prior to having Kermit enter server mode, and then it + will show files whose names begin with dot (period) when sent a + REMOTE DIRECTORY command. + + SET QUIET ON + (as well as the -q command-line option) Now applies also to: + + + SET HOST connection progress messages. + + "Press the X or E key to cancel" file-transfer message. + + REMOTE CD response. + + REMOTE LOGIN response. + + SET RECEIVE PERMISSIONS { ON, OFF } + Tells C-Kermit whether to set the permissions of incoming files + (received with Kermit protocol) from the permissions supplied + in the file's Attribute packet (if any). Normally ON. Also see + SET SEND PERMISSIONS. + + SET ROOT directory + Like UNIX chroot, without requiring privilege. Sets the root + for file access, does not allow reference to or creation of + files outside the root, and can't be undone. + + SET SEND PERMISSIONS { ON, OFF } + Tells C-Kermit whether to include file permissions in the + attributes it includes with each file when sending with Kermit + protocol. Also see SET RECEIVE PERMISSIONS. + + SET TCP { HTTP-PROXY, SOCKS-SERVER } /USER:name /PASSWORD:text + These commands now allow specification of username and + password. + + SET TERMINAL . . . + (See [388]Section 12.) + + SET TRANSFER MESSAGE [ text ] + Sets an initial text message to be displayed in the + file-transfer display. The transfer message is automatically + deleted once used, so must be set each time a message a + desired. Any variables in the message are evaluated at the time + the SET command is given. If the optional text is omitted, any + transfer message that is currently set is removed. Synonym: SET + XFER MSG. SHOW TRANSFER displays it if it has been set but not + yet used. + + SHOW COMMUNICATIONS + In C-Kermit 8.0, SHOW COMMUNICATIONS, when given in remote mode + (i.e. before any connection has been established), tells the + typical dialout device name for the particular platform on + which it's running (e.g. TXA0: for VMS, or /dev/cua0p0 for + HP-UX). On Unix platforms, it also tells the name of the + lockfile directory. This way, you have an idea of what the SET + LINE device name should look like, and if the SET LINE command + fails, you know the name of the directory or device that is + protected against you. + + SHOW VARIABLES [ name [ name [ ... ] ] ] + In C-Kermit 8.0.201 you can request values of a list of + built-in (\v(xxx)) variables. Each name is a pattern, as + before, but now it a free pattern rather than an anchored one + (explained in [389]Section 8.12) so now "show var date time" + shows the values of all variables whose names include the + strings "date" or "time". + + TAIL [ switches ] filename + Equivalent to TYPE /TAIL [ other-switches ] filename. + + TRANSMIT /NOECHO [ other switches ] filename + The /NOECHO switch is equivalent to giving the command SET + TRANSMIT ECHO OFF prior to the TRANSMIT command, except the + switch affects only the command with which it was given and + does not affect the prevailing global setting. + + TRANSMIT /NOWAIT [ other switches ] filename + The /NOWAIT switch is equivalent to giving the command SET + TRANSMIT PROMPT 0 prior to the TRANSMIT command, except the + switch affects only the command with which it was given and + does not affect the prevailing global setting. + + TRANSMIT /NOWAIT /NOECHO /BINARY [ other switches ] filename + When the TRANSMIT command is given with the /NOWAIT, /NOECHO, + and /BINARY switches, this activates a special "blast the whole + file out the communications connection all at once" mode that + Kermit didn't have prior to version 8.0. There has been + increasing demand for this type of transmission with the advent + of devices that expect image (e.g. .JPG) or sound (e.g. .MP3) + files as raw input. The obvious question is: how does the + receiving device know when it has the whole file? This depends + on the device, of course; usually after a certain amount of + time elapses with nothing arriving, or else when Kermit hangs + up or closes the connection. + + TYPE /CHARACTER-SET:name + Allows you to specify the character set in which the file to be + typed is encoded. + + TYPE /NUMBER + Adds line numbers. + + TYPE /OUTPUT:filename + Sends the results of the TYPE command to the given file. + + TYPE /TRANSLATE-TO:name + Used in conjunction with TYPE /CHARACTER-SET:xxx; allows you to + specify the character set in which the file is to be displayed. + + TYPE /TRANSPARENT + Used to disable character-set translation in the TYPE command, + which otherwise can take place automatically based on file + scanning, even when /CHARACTER-SET and /TRANSLATE-TO switches + are not given. + + VOID text + Parses the text, evaluating any backslash items in it (such as + function calls) but doesn't do anything further, except + possibly printing error messages. Useful for invoking functions + that have side effects without using or printing their direct + results, e.g. "void \fsplit(\%a,&a)". + + Symbolic Links in UNIX + + The UNIX versions of C-Kermit have had /FOLLOWLINKS and /NOFOLLOWLINKS + switches added to several commands to control the treatment of + symbolic links. Different commands deal differently with symbolic + links: + + Kermit SEND, FTP MPUT + /NOFOLLOWLINKS is the default, which means symbolic links are + skipped entirely. The alternative, /FOLLOWLINKS, should be used + with caution, since an innocent link might point to a whole + file system, or it might cause a loop. There is no way in + Kermit or FTP protocol to send the link itself. We either skip + them or follow them; we can't duplicate them. + + DIRECTORY + /NOFOLLOWLINKS is the default, which means the DIRECTORY + command lists symbolic links in a way that shows they are + links, but it does not follow them. The alternative, + /FOLLOWLINKS, follows links and gives information about the + linked-to directories and files. + + DELETE, RMDIR + The DELETE command does not have link-specific switches. DELETE + never follows links. If you tell Kermit to delete a symbolic + link, it deletes the link itself, not the linked-to file. Ditto + for RMDIR. + + COPY + The COPY command behaves just like the UNIX cp command; it + always follows links. + + RENAME + The RENAME command behaves just like the UNIX mv command; it + operates on links directly rather than following. + + [ [390]Top ] [ [391]Contents ] [ [392]C-Kermit Home ] [ [393]Kermit + Home ] + __________________________________________________________________________ + +8. OTHER SCRIPTING IMPROVEMENTS + + 8.1. Performance and Debugging + + A command cache for frequently used commands plus some related + optimizations increases the speed of compute-bound scripts by anywhere + from 50% to 1000%. + + The new PROMPT command can be used to set breakpoints for debugging + scripts. If executed in a command file or macro, it gives you an + interactive command prompt in the current context of the script, with + all its variables, arguments, command stack, etc, available for + examination or change, and the ability to resume the script at any + point (END resumes it, Ctrl-C or STOP cancels it and returns to top + level). + + The new Ctrl-C trapping feature ([394]Section 8.14) lets you intercept + interruption of scripts. This can be used in combination with the + PROMPT command to debug scripts. Example: + +define ON_CTRLC { + echo INTERRUPTED BY CTRL-C... + echo The command stack has not yet been rolled back: + show stack + echo Type Ctrl-C again or use the END command to return to top level. + prompt Debug> +} + + Adding this ON_CTRL definition to your script lets you interrupt it at + any point and get prompt that is issued at the current command level, + so you can query local variables, etc. + + [ [395]Top ] [ [396]Contents ] [ [397]C-Kermit Home ] [ [398]Kermit + Home ] + _________________________________________________________________ + + 8.2. Using Macros as Numeric Variables + + A macro is a way to assign a value to a name, and then use the name to + refer to the value. Macros are used in two ways in Kermit: as + "subroutines" or functions composed of Kermit commands, which are + executed, or as variables to hold arbitrary values -- text, numbers, + filenames, etc. + + When a macro is to be executed, its name is given as if it were a + C-Kermit command, optionally preceded by the word "do". When a macro + is used as a variable, it must be "escaped" with \m(xxx) (or + equivalent function, e.g. \s(xxx), \:(xxx), \fdefinition(xxx)), where + xxx is the macro name, for example: + + define filename /usr/olga/oofa.txt + send \m(filename) + + Of course variables can also hold numbers: + + define size 17 + declare \&a[\m(size)] + ... + define index 3 + if ( == \m(index) 3 ) echo The third value is: \&a[\m(index)] + evaluate index (\m(index) * 4) + if ( > \m(index) \m(size) ) echo Out of range! + + But these are contexts in which only numbers are valid. C-Kermit 8.0 + has been changed to treat non-escaped non-numeric items in strictly + numeric contexts as macro names. So it is now possible (but not + required) to omit the \m(...) notation and just use the macro name in + these contexts: + + define size 17 + declare \&a[size] + ... + define index 3 + if ( == index 3 ) echo The third value is: \&a[index] + evaluate index (index * 4) + if ( > index size ) echo Out of range! + + This is especially nice for loops that deal with arrays. Here, for + example, is a loop that reverses the order of the elements in an + array. Whereas formerly it was necessary to write: + + .\%n ::= \fdim(&a) + for \%i 1 \%n/2 1 { + .tmp := \&a[\%n-\%i+1] + .\&a[\%n-\%i+1] := \&a[\%i] + .\&a[\%i] := \m(tmp) + } + + Recoding this to use macro names "i" and "n" instead of the backslash + variables \%i and \%n, we have: + + .n ::= \fdim(&a) + for i 1 n/2 1 { + .tmp := \&a[n-i+1] + .\&a[n-i+1] := \&a[i] + .\&a[i] := \m(tmp) + } + + which reduces the backslash count to less than half. The final + statement in the loop could be written ".\&a[i] ::= tmp" if the array + contained only numbers (since ::= indicates arithmetic expression + evaluation). + + Also, now you can use floating-point numbers in integer contexts (such + as array subscripts), in which case they are truncated to an integer + value (i.e. the fractional part is discarded). + + Examples of numeric contexts include: + + * Array subscripts. + * Any numeric function argument. + * Right-hand side of ::= assignments. + * EVALUATE command or \fevaluate() function expression. + * The INCREMENT or DECREMENT by-value. + * IF =, >, <, !=, >=, and <= comparands. + * The IF number construct. + * FOR-loop variables. + * STOP, END, and EXIT status codes. + * The INPUT timeout value. + * PAUSE, WAIT, SLEEP, MSLEEP intervals. + * The SHIFT argument. + * Numeric switch arguments, e.g. TYPE /WIDTH:number, SEND + /LARGER:number. + * SCREEN MOVE-TO row and column number. + * Various SET DIAL parameters (timeout, retry limit, etc). + * Various SET SEND or RECEIVE parameters (packet length, window + size, etc). + * Various other SET parameters. + + and: + + * S-Expressions (explained in [399]Section 9). + + Macro names used in numeric contexts must not include mathematical + operators. Although it is legal to create a macro called "foo+bar", in + a numeric context this would be taken as the sum of the values of + "foo" and "bar". Any such conflict can be avoided, of course, by + enclosing the macro name in \m(...). + + [ [400]Top ] [ [401]Contents ] [ [402]C-Kermit Home ] [ [403]Kermit + Home ] + _________________________________________________________________ + + 8.3. New IF Conditions + + Several new IF conditions are available: + + IF DECLARED arrayname + Explained in [404]Section 8.6. + + IF KBHIT + Allows a script to test whether a key was pressed without + actually trying to read it. + + IF KERBANG (Unix only) + True if Kermit was started from a Kerbang script. This is + useful for knowing how to interpret the \&@[] and \&_[] + argument vector arrays, and under what conditions to exit. + + IF INTEGER n + This is just a synonym for IF NUMERIC, which is true if n + contains only digits (or, if n is a variable, its value + contains only digits). + + By contrast, IF FLOAT n succeeds if n is a floating-point number OR an + integer (or a variable with floating-point or integer value). + Therefore, IF FLOAT should be used whenever any kind of number is + acceptable, whereas IF INTEGER (or IF NUMERIC) when only an integer + can be used. + + [ [405]Top ] [ [406]Contents ] [ [407]C-Kermit Home ] [ [408]Kermit + Home ] + _________________________________________________________________ + + 8.4. The ON_UNKNOWN_COMMAND Macro + + The new ON_UNKNOWN_COMMAND macro, if defined, is executed whenever you + give a command that is not known to C-Kermit; any operands are passed + as arguments. Here are some sample definitions: + + DEF ON_UNKNOWN_COMMAND telnet \%1 ; Treat unknown commands as hostnames + DEF ON_UNKNOWN_COMMAND dial \%1 ; Treat unknown commands phone numbers + DEF ON_UNKNOWN_COMMAND take \%1 ; Treat unknown commands as filenames + DEF ON_UNKNOWN_COMMAND !\%* ; Treat unknown commands as shell commands + + The ON_CD macro, if defined, is executed whenever Kermit is given a CD + (change directory) command (8.0.211). Upon entry to this macro, the + directory has already changed and the new directory string is + available in the \v(directory) variable, and also as the first + argument (\%1). + + [ [409]Top ] [ [410]Contents ] [ [411]C-Kermit Home ] [ [412]Kermit + Home ] + _________________________________________________________________ + + 8.5. The SHOW MACRO Command + + The SHOW MACRO command has been changed to accept more than one macro + name: + + (setq a 1 b 2 c 3) + show mac a b c + a = 1 + b = 2 + c = 3 + + An exact match is required for each name (except that case doesn't + matter). If you include wildcard characters, however, a pattern match + is performed: + + show mac [a-c]*x + + shows all macros whose names start with a, b, or c, and end with x. + + [ [413]Top ] [ [414]Contents ] [ [415]C-Kermit Home ] [ [416]Kermit + Home ] + _________________________________________________________________ + + 8.6. Arrays + + A clarification regarding references to array names (as opposed to + array elements): You can use array-name "abbreviations" like &a only + in contexts that expect array names, like ARRAY commands or array-name + function arguments such as the second argument of \fsplit(). In a + LOCAL statement, however, you have to write \&a[], since "local &a" + might refer to a macro named "&a". + + In function arguments, however, you MUST use the abbreviated form: + \fsplit(\%a,&a) or \fsplit(\%a,&a[]). If you include the backslash (as + in "\fsplit(\%a,\&a[])") a parse error occurs. + + Here are the new array-related commands: + + IF DECLARED arrayname + Allows a script to test whether an array has been declared. The + arrayname can be a non-array backslash variable such as \%1 or + \m(name), in which case it is evaluated first, and the result + is treated as the array name. Otherwise, arrayname is treated + as in the ARRAY commands: it can be a, &a, &a[], \&a, \&a[], + \&a[3], \&a[3:9], etc, with the appropriate results in each + case. Synonym: IF DCL. + + UNDECLARE arrayname + UNDECLARE is a new top-level command to undeclare an array. + Previously this could only be done with "declare \&a[0]" (i.e. + re-declare the array with a dimension of 0). + + ARRAY LINK linkname arrayname + Creates a symbolic link from the array named by linkname (which + must be the name of an array that is not yet declared in the + current context) to the array named by arrayname (which must + the name of a currently declared array that is not itself a + link, or a variable containing the name of such an array). The + two names indicate the same array: if you change an array + element, the change is reflected in the link too, and vice + versa. If you undeclare the link, the real array is unaffected. + If you undeclare the real array, all links to it disappear. If + you resize an array (directly or through a link), all links to + it are updated automatically. + + Array links let you pass array names as arguments to macros. For + example, suppose you had a program that needed to uppercase all the + elements of different arrays at different times. You could write a + macro to do this, with the array name as an argument. But without + array links, there would be no way to refer to the argument array + within the macro. Array links make it easy: + + define arrayupper { + local \&e[] \%i + array link \&e[] \%1 + for i 1 \fdim(&e) 1 { .\&e[i] := \fupper(\&e[i]) } + } + declare \&a[] = these are some words + arrayupper &a + show array &a + + The macro declares the array link LOCAL, which means it doesn't + conflict with any array of the same name that might exist outside the + macro, and that the link is destroyed automatically when the macro + exits. This works, by the way, even if the link name and the macro + argument name are the same, as long as the link is declared LOCAL. + + As noted, you can't make a link to a nonexistent array. So when + writing a macro whose job is to create an array whose name is passed + as an argument, you must declare the array first (the size doesn't + matter as long as it's greater than 0). Example: + + define tryme { ; Demonstration macro + local \&e[] ; We only need this inside the macro + array link \&e[] \%1 ; Make local link + shift ; Shift argument list + void \fsplit(\%*,&e) ; Split remainder of arg list into array + } + declare \&a[1] ; Declare target array in advance + tryme &a here are some words ; Invoke the macro with array name and words + show array a ; See the results + + One final improvement allows the macro itself to declare the array + (this was not possible in earlier Kermit releases): if the array name + in the DECLARE command is a variable (and not an array name), or + includes variables, the resulting value is used as the array name. So: + + define tryme { ; Demonstration macro + declare \%1[1] ; Preliminary declaration for target array + local \&e[] ; We only need this inside the macro + array link \&e[] \%1 ; Make local link + shift ; Shift argument list + void \fsplit(\%*,&e) ; Split remainder of arg list into array + } + tryme &a here are some words ; Invoke the macro with array name and words + show array a ; See the results + + The SHOW ARRAY command now indicates whether an array name is a link. + + Also see the descriptions of [417]\fjoin() and [418]\fsplit(), plus + [419]Section 8.10 on the MINPUT command, which shows how an entire + array (or segment of it) can be used as the MINPUT target list. + + [ [420]Top ] [ [421]Contents ] [ [422]C-Kermit Home ] [ [423]Kermit + Home ] + _________________________________________________________________ + + 8.7. New or Improved Built-in Variables and Functions + + The following new built-in variables are available: + + \v(buildid) A date string like "20000808" indicating when C-Kermit was +built. + \v(ftime) Current time, secs since midnight, including fraction of se +cond. + \v(iprompt) The current SET PROMPT value + \v(sexp) The most recent S-Expression (see [424]Section 9) + \v(sdepth) The current S-Expression invocation depth ([425]Section 9) + \v(svalue) The value of the most recent S-Expression ([426]Section 9) + + \v(ftp_code) Most recent FTP response code ([427]Section 3) + \v(ftp_connected) FTP connection status ([428]Section 3) + \v(ftp_cpl) FTP Command Protection Level ([429]Section 3.2) + \v(ftp_dpl) FTP Data Protection Level ([430]Section 3.2) + \v(ftp_getputremote) The current SET GET-PUT-REMOTE setting ([431]Section 3.8 +) + \v(ftp_host) Name or IP address of FTP server ([432]Section 3) + \v(ftp_loggedin) FTP login status ([433]Section 3) + \v(ftp_message) Most recent FTP response message ([434]Section 3) + \v(ftp_security) FTP Security method ([435]Section 3.2) + \v(ftp_server) OS type of FTP server ([436]Section 3) + + \v(http_code) Most recent HTTP response code + \v(http_connected) HTTP connection status + \v(http_host) Name or IP address of HTTP server + \v(http_message) Most recent HTTP response message + \v(http_security) TLS cipher used to secure the HTTP session + + \v(hour) Hour of the day, 0 to 23. + \v(timestamp) Equivalent to "\v(ndate) \v(time)". + + \v(log_debug) Current debug log file, if any. + \v(log_packet) Current packet log file, if any. + \v(log_session) Current session log file, if any. + \v(log_transaction) Current transaction log file, if any. + \v(log_connection) Current connection log file, if any. + + The following new or improved built-in functions are available: + + \fcmdstack() Allows programmatic access to the command stack. + \fcvtdate() [437]Section 8.13, format options added + \fdelta2secs() [438]Section 8.13 + \fdostounixpath(s1) Converts a DOS filename to Unix format. + \fsplit() Now allows grouping/nesting in source string. + \fword() Allows the same grouping and nesting. + \fjoin(&a,s1,n1,n2) Copies an array into a single string. + \fsubstitute(s1,s2,s3) Substitutes characters within a string. + \freplace() Has new 4th "occurrence" argument. + \fsexpression() Evaluates an S-Expression (explained in [439]Section +9). + \ftrim(), \fltrim() Now trim CR and LF by default, as well as SP and Tab. + \funixtodospath(s1) Converts a Unix filename to DOS format. + \fkeywordval(s1,c1) Assigns values to keywords (macros) (explained below) +. + + Most functions that have "2" in their names to stand for the word "to" + can now also be written with "to", e.g. "\fdelta2secs()," + \fdeltatosecs()." + + \funtabify(string) + (New to 8.0.211) Replaces Horizontal Tab characters in the + given string with spaces based on VT100-like tab stops. + + \fverify(s1,s2,n) + As of version 8.0.211, returns -1 if s2 is an empty string. + Previously it returned 0, making \fverify(abc,\%a) look as if + \%a was a string combosed of a's, b's, and/or c's when in fact + it contained nothing. + + \fcode(string) + As of version 8.0.211, returns 0 if string is empty or missing. + Previously it returned the empty string, which made it unsafe + to use in arithmetic or boolean expressions. + + \v(inscale) + New to version 8.0.211, its value is the INPUT SCALE-FACTOR + ([440]Section 8.10), default 1.0. + + 8.7.1. The \fkeywordval() Function + + \fkeywordval(s1,c1) is new to C-Kermit 8.0. Given a string s1 of the + form "name=value", it creates a macro with the given name and assigns + it the given value. If no value appears after the equal sign, any + existing macro of the given name is undefined. Blanks are + automatically trimmed from around the name and value. The optional c1 + parameter is the assignment operator character, equal sign (=) by + default. This function is handy for processing keyword parameters or + any other form of parameter-value pair. Suppose, for example, you want + to write a macro that accepts keyword parameters rather than + positional ones: + + define MYDIAL { + local \%i modem hangup method device speed number + def number 5551234 ; Assign default parameter values + def speed 57600 + def modem usrobotics + def hangup rs232 + def method tone + def country 1 + for \%i 1 \v(argc)-1 1 { ; Parse any keyword parameters... + if not \fkeywordval(\&_[\%i]) end 1 Bad parameter: "\&_[\%i]" + } + set dial country \m(country) + set modem type \m(modem) + set modem hang \m(hangup) + set dial method \m(tone) + set line \m(device) + if fail stop 1 + set speed \m(speed) + if fail stop 1 + show comm + set dial display on + dial \m(number) + if success connect + } + + In this example, all the defaults are set up inside the macro, and + therefore it can be invoked with no parameters at all. But if you want + to have the macro dial a different number, you can supply it as + follows: + + mydial number=7654321 + + You can supply any number of keyword parameters, and you can give them + in any order: + + mydial number=7654321 hangup=modem speed=115200 + + 8.7.2. The \fsplit(), \fjoin(), and \fword() Functions + + \fjoin(&a,s1,n1,n2) is also new; it creates a string from an array (or + a piece of one). &a is the name of the array (a range specifier can be + included); s1 is a character or string to separate each element in the + result string (can be omitted, in which case the elements are not + separated at all), and n1 is a grouping mask, explained below. If s1 + is empty or not specified, the array elements are separated with + spaces. If you want the elements concatenated with no separator, + include a nonzero n2 argument. Given the array: + + declare \&a[] = 0 1 2 3 4 5 6 7 8 9 + + you can get effects like this: + + \fjoin(&a) 0 1 2 3 4 5 6 7 8 9 + \fjoin(&a,:) 0:1:2:3:4:5:6:7:8:9 + \fjoin(&a,{,}) 0,1,2,3,4,5,6,7,8,9 + \fjoin(&a,...) 0...1...2...3...4...5...6...7...8...9 + \fjoin(&a,,,1) 0123456789 + + \fsplit(), \fword(), \fstripb(), and \fjoin() accept a "grouping mask" + argument, n1, which is a number from 0 to 63, in which: + + 1 = "" doublequotes + 2 = {} braces + 4 = '' singlequotes + 8 = () parentheses + 16 = [] square brackets + 32 = <> angle brackets + + These can be OR'd (added) together to make any number 0-63 (-1 is + treated the same as 63, 0 means no grouping). If a bit is on, the + corresponding kind of grouping is selected. (If more than 1 bit is set + for \fjoin(), only the lowest-order one is used.) + + If you include the same character in the grouping mask and the include + list, the grouping mask takes precedence. Example: + + def \%a a "b c d" e + \fsplit(\%a,&a[],,,-1) = 3 <-- doublequote used for grouping + \fsplit(\%a,&a[],,",-1) = 3 <-- doublequote still used for grouping + + Nesting of matched left and right grouping characters (parentheses, + braces, and brackets, but not quotes) is recognized. Example: + + def \%a a (b c n o) p + \fsplit(\%a,&a,,,0) = 16 (no grouping) + \fsplit(\%a,&a,,,2) = 15 (braces only) + \fsplit(\%a,&a,,,16) = 11 (square brackets only) + \fsplit(\%a,&a,,,32) = 7 (angle brackets only) + \fsplit(\%a,&a,,,63) = 3 (all) + \fsplit(\%a,&a,,,-1) = 3 (all) + + \fsplit() and \fjoin() are "reciprocal" functions. You can split a + string up into an array and join it back into a new string that is + equivalent, as long as \fsplit() and \fjoin() are given equivalent + grouping masks, except that the type of braces might change. Example: + + def \%a a {b c [d e] f g} "h i" j m + echo STRING=[\%a] + echo WORDS=\fsplit(\%a,&a,,,-1) + show array a + asg \%b \fjoin(&a,{ },2) + echo JOIN =[\%b] + echo WORDS=\fsplit(\%b,&b,,,-1) + show array b + + The arrays a and b are identical. The strings a and b are as follows: + + \%a: a {b c [d e] f g} "h i" j m + \%b: a {b c [d e] f g} {h i} j {k l} m + + It is possible to quote separator grouping characters with backslash + to override their grouping function. And of course to include + backslash itself in the string, it must be quoted too. Furthermore, + each backslash must be doubled, so the command parser will still pass + one backslash to \fsplit() for each two that it sees. Here are some + examples using \fsplit() with a grouping mask of 8 (treat parentheses + as grouping characters). + + String Result + a b c d e f 6 + a b\\ c d e f 5 + a b (c d e) f 4 + a b \\(c d e\\) f 6 + a b \\\\(c d e\\\\) f 7 + + \fsplit() has also been changed to create its array (if one is given) + each time it is called, so now it can be conveniently called in a loop + without having to redeclare the array each time. + + Incidentally... Sometimes you might want to invoke \fsplit() in a + situation where you don't care about its return value, e.g. when you + just want to fill the array. Now you can "call" \fsplit() or any other + function with the new [441]VOID command: + + void \fsplit(\%a,&a) + + \fsplit() and \fjoin() also accept a new, optional 6th argument, an + options flag, a number that can specify a number of options. So far + there is just one option, whose value is 1: + + separator-flag + Normally separators are collapsed. So, for example, + + \fword(Three little words,2) + + returns "little" (the second word). Space is a separator, but + there are multiple spaces between each word. If the value 1 is + included in the option flag, however, each separator counts. If + two separators are adjacent, an empty word is produced between + them. This is useful for parsing (e.g.) comma-separated lists + exported from databases or spreadsheets. + + 8.7.3. The \fcmdstack() Function + + The new \fcmdstack() function gives access to the command stack: + + \fcmdstack(n1,n2) + Arguments: n1 is the command stack level. If omitted, the + current level, \v(cmdlevel), is used. n2 is a function code + specifying the desired type of information: + + 0 (default) = name of object at level n1. + 1 (nonzero) = object type (0 = prompt; 1 = command file; 2 = macro). + + The default for n2 is 0. + + The name associated with prompt is "(prompt)". Here's a loop that can + be included in a macro or command file to show the stack (similar to + what the SHOW STACK command does): + + for \%i \v(cmdlevel) 0 -1 { + echo \%i. [\fcmdstack(\%i,1)] \fcmdstack(\%i,0) + } + + In this connection, note that \v(cmdfile) always indicates the most + recently invoked active command file (if any), even if that file is + executing a macro. Similarly, \v(macro) indicates the most recently + invoked macro (if any), even if the current command source is not a + macro. The name of the "caller" of the currently executing object + (command file or macro) is: + + \fcmdstack(\v(cmdlevel)-1) + + and its type is: + + \fcmdstack(\v(cmdlevel)-1,1) + + To find the name of the macro that invoked the currently executing + object, even if one or more intermediate command files (or prompting + levels) are involved, use a loop like this: + + for \%i \v(cmdlevel)-1 0 -1 { + if = \fcmdstack(\%i,1) 2 echo CALLER = \fcmdstack(\%i,0) + } + + Of course if you make a macro to do this, the macro must account for + its own additional level: + + define CALLER { + for \%i \v(cmdlevel)-2 0 -1 { + if = \fcmdstack(\%i,1) 2 return \fcmdstack(\%i,0) + } + return "(none)" + } + + The built-in variable \v(cmdsource) gives the current command source + as a word ("prompt", "file", or "macro"). + + 8.7.4. The VOID Command + + VOID is like ECHO in that all functions and variables in its argument + text are evaluated. but it doesn't print anything (except possibly an + error message if a function was invocation contained or resulted in + any errors). VOID sets FAILURE if it encounters any errors, SUCCESS + otherwise. + + [ [442]Top ] [ [443]Contents ] [ [444]C-Kermit Home ] [ [445]Kermit + Home ] + _________________________________________________________________ + + 8.8. The RETURN and END Commands + + The execution of a macro is terminated in any of the following ways: + + * With an END [ number [ message ] ] command. If a number is given, + the macro succeeds if the number is 0, and fails if it is not + zero; if a number is not given, the macro succeeds. + * With a STOP command, which works just like END except it peels + back the command stack all the way to top level. + * With a RETURN [ text ] command, in which case the macro always + succeeds. + * By running out of commands to execute, in which case the macro + succeeds or fails according the most recently executed command + that sets success or failure. + + The same considerations apply to command files invoked by the TAKE + command. + + If a macro does not execute any commands that set success or failure, + then invoking the macro does not change the current SUCCESS/FAILURE + status. It follows, then, that the mere invocation of a macro does not + change the SUCCESS/FAILURE status either. This makes it possible to + write macros to react to the status of other commands (or macros), for + example: + + define CHKLINE { + if success end 0 + stop 1 SET LINE failed - please try another device. + } + set modem type usrobotics + set line /dev/cua0 + chkline + set speed 57600 + dial 7654321 + + By the way, none of this is news. But it was not explicitly documented + before, and C-Kermit 7.0 and earlier did not always handle the RETURN + statement as it should have. + + [ [446]Top ] [ [447]Contents ] [ [448]C-Kermit Home ] [ [449]Kermit + Home ] + _________________________________________________________________ + + 8.9. UNDEFINing Groups of Variables + + The UNDEFINE command, which previously accepted one variable name, now + accepts a list of them, and also accepts wildcard notation to allow + deletion of variables that match a given pattern. + + UNDEFINE [ switches ] name [ name [ name [ ... ] ] ] + Undefines the variables whose names are given. Up to 64 names + may be given in one UNDEFINE command. + + If you omit the switches and include only one name, the UNDEFINE + command works as before. + + Switches include: + + /MATCHING + Specifies that the names given are to treated as patterns + rather than literal variable names. Note: pattern matching + can't be used with array references; use the ARRAY command to + manipulate arrays and subarrays. + + /LIST + List the name of each variable to be undefined, and whether it + was undefined successfully ("ok" or "error"), plus a summary + count at the end. + + /SIMULATE + List the names of the variables that would be deleted without + actually deleting them. Implies /LIST. + + The UNDEFINE command fails if there were any errors and succeeds + otherwise. + + The new _UNDEFINE command is like UNDEFINE, except the names are + assumed to be variable names themselves, which contain the names (or + parts of them) of the variables to be undefined. For example, if you + have the following definitions: + + define \%a foo + define foo This is some text + + then: + + undef \%a + + undefines the variable \%a, but: + + _undef \%a + + undefines the macro foo. + + Normal Kermit patterns are used for matching; metacharacters include + asterisk, question mark, braces, and square brackets. Thus, when using + the /MATCHING switch, if the names of the macros you want to undefine + contain any of these characters, you must quote them with backslash to + force them to be taken literally. Also note that \%* is not the name + of a variable; it is a special notation used within a macro for "all + my arguments". The command "undef /match \%*" deletes all \%x + variables, where x is 0..9 and a..z. Use "undef /match \%[0-9]" to + delete macro argument variables or "undef /match \%[i-n]" to delete a + range of \%x variables. + + [ [450]Top ] [ [451]Contents ] [ [452]C-Kermit Home ] [ [453]Kermit + Home ] + _________________________________________________________________ + + 8.10. The INPUT and MINPUT Commands + + As of C-Kermit 8.0.211, the INPUT and MINPUT commands accept a switch: + + [M]INPUT /NOMATCH timeout + The /NOMATCH switch allows INPUT or MINPUT to read incoming + material for the specified amount of time, without attempting + to match it with any text or patterns. When this switch is + included, the [M]INPUT command succeeds when the timeout + interval expires, with \v(instatus) set to 1, meaning "timed + out", or fails upon interruption or i/o error. + + Also in version 8.0.211, there is a new way to apply a scale factor to + [M]INPUT timeouts: + + SET INPUT SCALE-FACTOR floating-point-number + This scales all [M]INPUT timeouts by the given factor, allowing + time-sensitive scripts to be adjusted to changing conditions + such as congested networks or different-speed modems without + having to change each INPUT-class command. This affects only + those timeouts that are given in seconds, not as wall-clock + times. Although the scale factor can have a fractional part, + the INPUT timeout is still an integer. The new built-in + variable \v(inscale) tells the current INPUT SCALE-FACTOR. + + The MINPUT command can be used to search the incoming data stream for + several targets simultaneously. For example: + + MINPUT 8 one two three + + waits up to 8 seconds for one of the words "one", "two", or "three" to + arrive. Words can be grouped to indicate targets that contain spaces: + + MINPUT 8 nineteeen twenty "twenty one" + + And of course you can also use variables in place of (or as part of) + the target names: + + MINPUT 8 \%a \&x[3] \m(foo) + + Until now you had to know the number of targets in advance when + writing the MINPUT statement. Each of the examples above has exactly + three targets. + + But suppose your script needs to look for a variable number of + targets. For this you can use arrays and \fjoin(), described in + [454]Section 8.7. Any number of \fjoin() invocations can be included + in the MINPUT target list, and each one is expanded into the + appropriate number of separate targets each time the MINPUT command is + executed. Example: + + declare \&a[10] = one two three + minput 10 foo \fjoin(&a) bar + + This declares an array of ten elements, and assigns values to the + first three of them. The MINPUT command looks for these three (as well + as the words "foo" and "bar"). Later, if you assign additional + elements to the array, the same MINPUT command also looks for the new + elements. + + If an array element contains spaces, each word becomes a separate + target. To create one target per array element, use \fjoin()'s + grouping feature: + + dcl \&a[] = {aaa bbb} {ccc ddd} {xxx yyy zzz} + + minput 10 \fjoin(&a) <-- 7 targets + minput 10 \fjoin(&a,,2) <-- 3 targets + + [ [455]Top ] [ [456]Contents ] [ [457]C-Kermit Home ] [ [458]Kermit + Home ] + _________________________________________________________________ + + 8.11. Learned Scripts + + C-Kermit now includes a simple script recorder that monitors your + commands, plus your actions during CONNECT mode, and automatically + generates a script program that mimics what it observed. You should + think of this feature as a script-writing ASSISTANT since, as you will + see [459]later in this section, the result generally needs some + editing to make it both secure and flexible. The script recorder is + controlled by the new LEARN command: + + LEARN [ /ON /OFF /CLOSE ] [ filename ] + If you give a filename, the file is opened for subsequent + recording. The /ON switch enables recording to the current file + (if any); /OFF disables recording. /CLOSE closes the current + script recording file (if any). If you give a filename without + any switches, /ON is assumed. + + The /OFF and /ON switches let you turn recording off and on during a + session without closing the file. + + When recording: + + * All commands that you type (or recall) at the prompt are recorded + in the file except: + + LEARN commands are not recorded. + + The CONNECT command is not recorded. + + The TELNET command is converted to SET HOST /NETWORK:TCP. + * Commands obtained from macros or command files are not recorded. + * During CONNECT: + + Every line you type is converted to an OUTPUT command. + + The last prompt before any line you type becomes an INPUT + command. + + Timeouts are calculated automatically for each INPUT command. + + A PAUSE command is inserted before each OUTPUT command just + to be safe. + + Thus the script recorder is inherently line-oriented. It can't be used + to script character-oriented interactions like typing Space to a + "More?" prompt or editing a text file with VI or EMACS. + + But it has advantages too; for example it takes control characters + into account that might not be visible to you otherwise, and it + automatically converts control characters in both the input and output + streams to the appropriate notation. It can tell, for example that the + "$ " prompt on the left margin in UNIX is really {\{13}\{10}$ }, + whereas in VMS it might be {\{13}\{10}\{13}$ }. These sequences are + detected and recorded automatically. + + A learned script should execute correctly when you give a TAKE command + for it. However, it is usually appropriate to edit the script a bit. + The most important change would be to remove any passwords from it. + For example, if the script contains: + + INPUT 9 {\{13}\{10}Password: } + IF FAIL STOP 1 INPUT timeout + PAUSE 1 + OUTPUT bigsecret\{13} + + you should replace this by something like: + + INPUT 9 {\{13}\{10}Password: } + IF FAIL STOP 1 INPUT timeout + ASKQ pswd Please type your password: + PAUSE 1 + OUTPUT \m(pswd)\{13} + + The LEARN command can't do this for you since it knows nothing about + "content"; it only knows about lines and can't be expected to parse or + understand them -- after all, the Password prompt might be in some + other language. So remember: if you use the LEARN command to record a + login script, be sure edit the resulting file to remove any passwords. + Also be sure to delete any backup copies your editor or OS might have + made of the file. + + Other manual adjustments might also be appropriate: + + * If the target of an INPUT command can vary, you can replace the + INPUT command with MINPUT and the appropriate target list, and/or + the target with a \fpattern(). For example, suppose you are + dialing a number that can be answered by any one of 100 terminal + servers, whose prompts are ts-00>, ts-01>, ts-02>, ... ts-99>. The + script records a particular one of these, but you want it to work + for all of them, so change (e.g.): + INPUT 10 ts-23> ; or whatever + to: + INPUT 10 \fpattern(ts-[0-9][0-9]>) + * The INPUT timeout values are conservative, but they are based only + on a single observation; you might need to tune them. + * The PAUSE commands might not be necessary, or the PAUSE interval + might need adjustment. + * In case you made typographical errors during recording, they are + incorporated in your script; you can edit them out if you want to. + + Here is a sample script generated by Kermit ("learn vms.ksc") in which + a Telnet connection is made to a VMS computer, the user logs in, + starts Kermit on VMS, sends it a file, and then logs out: + + ; Scriptfile: vms.ksc + ; Directory: /usr/olga + ; Recorded: 20001124 15:21:23 + + SET HOST /NETWORK:TCP vms.xyzcorp.com + IF FAIL STOP 1 Connection failed + + INPUT 7 {\{13}\{10}\{13}Username: } + IF FAIL STOP 1 INPUT timeout + PAUSE 1 + OUTPUT olga\{13} + INPUT 3 {\{13}\{10}\{13}Password: } + IF FAIL STOP 1 INPUT timeout + PAUSE 1 + OUTPUT secret\{13} + INPUT 18 {\{13}\{10}\{13}$ } + IF FAIL STOP 1 INPUT timeout + PAUSE 1 + OUTPUT set default [.incoming]\{13} + INPUT 12 {\{13}\{10}\{13}$ } + IF FAIL STOP 1 INPUT timeout + PAUSE 1 + OUTPUT kermit\{13} + INPUT 15 {\{13}\{10}\{13}ALTO:[OLGA.INCOMING] C-Kermit>} + IF FAIL STOP 1 INPUT timeout + PAUSE 1 + OUTPUT receive\{13} + send myfile.txt + + INPUT 18 {\{13}\{10}\{13}ALTO:[OLGA.INCOMING] C-Kermit>} + IF FAIL STOP 1 INPUT timeout + PAUSE 1 + OUTPUT exit\{13} + INPUT 6 {\{13}\{10}\{13}$ } + IF FAIL STOP 1 INPUT timeout + PAUSE 1 + OUTPUT logout\{13} + close + exit + + The commands generated by Kermit during CONNECT (INPUT, IF FAIL, + PAUSE, and OUTPUT) have uppercase keywords; the commands typed by the + user are in whatever form the user typed them (in this case, + lowercase). + + [ [460]Top ] [ [461]Contents ] [ [462]C-Kermit Home ] [ [463]Kermit + Home ] + _________________________________________________________________ + + 8.12. Pattern Matching + + A pattern is a character string that is used to match other strings. + Patterns can contain metacharacters that represent special actions + like "match any single character", "match zero or more characters", + "match any single character from a list", and so on. The best known + application of patterns is in file specifications that contain + wildcards, as in "send *.txt", meaning "send all files whose names end + with .txt". + + Patterns are also used in increasingly many other ways, to the extent + it is useful to point out certain important distinctions in the ways + in which they are used: + + Anchored Patterns + If an anchored pattern does not begin with "*", it must match + the beginning of the string, and if it does not end with "*", + it must match the end of the string. For example, the anchored + pattern "abc" matches only the string "abc", not "abcde" or + "xyzabc" or "abcabc". The anchored pattern "abc*" matches any + string that starts with "abc"; the anchored pattern "*abc" + matches any string that ends with "abc"; the anchored pattern + "*abc*" matches any string that contains "abc" (including any + that start and/or end with it). + + Floating Patterns + A floating pattern matches any string that contains a substring + that matches the pattern. In other words, a floating pattern + has an implied "*" at the beginning and end. You can anchor a + floating pattern to the beginning by starting it with "^", and + you can anchor it to the end by ending it with "$" (see + examples below). + + Wildcards + A wildcard is an anchored pattern that has the additional + property that "*" does not match directory separators. + + This terminology lets us describe Kermit's commands with a bit more + precision. When a pattern is used for matching filenames, it is a + wildcard, except in the TEXT-PATTERNS and BINARY-PATTERNS lists and + /EXCEPT: clauses, in which case directory separators are not + significant (for example, a BINARY-PATTERN of "*.exe" matches any file + whose name ends in .exe, no matter how deeply it might be buried in + subdirectories). When Kermit parses a file specification directly, + however, it uses the strict wildcard definition. For example, "send + a*b" sends all files whose names start with "a" and end with "b" in + the current directory, and not any files whose names end with "b" that + happen to be in subdirectories whose names start with "a". And as + noted, wildcards are anchored, so "delete foo" deletes the file named + "foo", and not all files whose names happen to contain "foo". + + Most other patterns are anchored. For example: + + if match abc bc ... + + does not succeed (and you would be surprised if it did!). In fact, the + only floating patterns are the ones used by commands or functions that + search for patterns in files, arrays, or strings. These include: + + * The GREP and TYPE /MATCH commands. + * The \fsearch(), \frsearch(), and \farraylook() functions. + + Thus these are the only contexts in which explicit anchors ("^" and + "$") may be used: + + grep abc *.txt + Prints all lines containing "abc" in all files whose names end + with ".txt". + + grep ^abc *.txt + Prints all lines that start with "abc" in all ".txt" files. + + grep abc$ *.txt + Prints all lines that end with "abc" in all ".txt" files. + + grep ^a*z$ *.txt + Prints all lines that start with "a" and end with "z" in all + ".txt" files. + + Similarly for TYPE /PAGE, /fsearch(), /frsearch(), and \farraylook(). + + Here is a brief summary of anchored and floating pattern equivalences: + + Anchored Floating + abc ^abc$ + *abc abc$ + abc* ^abc + *abc* abc + + [ [464]Top ] [ [465]Contents ] [ [466]C-Kermit Home ] [ [467]Kermit + Home ] + _________________________________________________________________ + + 8.13. Dates and Times + + C-Kermit's comprehension of date-time formats is considerably expanded + in version 8.0. Any command that reads dates, including the DATE + command itself, or any switch, such as the /BEFORE: and /AFTER: + switches, or any function such as \fcvtdate(), now can understand + dates and times expressed in any ISO 8601 format, in Unix "asctime" + format, in FTP MDTM format, and in practically any format used in RFC + 822 or RFC 2822 electronic mail, with or without timezones, and in a + great many other formats as well. HELP DATE briefly summarizes the + acceptable date-time formats. + + Furthermore, C-Kermit 8.0 includes a new and easy-to-use form of + date-time arithmetic, in which any date or time can be combined with a + "delta time", to add or subtract the desired time interval (years, + months, weeks, days, hours, minutes, seconds) to/from the given date. + And new functions are available to compare dates and to compute their + differences. + + As you can imagine, all this requires quite a bit of "syntax". The + basic format is: + + [ date ] [ time ] [ delta ] + + Each field is optional, but in most cases (depending on the context) + there must be at least one field. If a date is given, it must come + first. If no date is given, the current date is assumed. If no time is + given, an appropriate time is supplied depending on whether a date was + supplied. If no delta is given, no arithmetic is done. If a delta is + given without a date or time, the current date and time are used as + the base. + + Date-time-delta fields are likely to contain spaces (although they + need not; space-free forms are always available). Therefore, in most + contexts -- and notably as switch arguments -- date-time information + must be enclosed in braces or doublequotes, for example: + + send /after:"8-Aug-2001 12:00 UTC" *.txt + + Kermit's standard internal format for dates and times is: + + yyyymmdd hh:mm:ss + + for example: + + 20010208 10:28:01 + + Date-times can always be given in this format. yyyy is the 4-digit + year, mm is the two-digit month (1-12; supply leading zero for + Jan-Sep), dd is the 2-digit day (leading zero for 1-9), hh is the hour + (0-23), mm the minute (0-59), ss the second (0-59), each with leading + zero if less than the field width. The date and time can be separated + by a space, an underscore, a colon, or the letter T. The time is in + 24-hour format. Thus the various quantites are at the following fixed + positions: + +Position Contents + 1-4 Year (4 digits, 0000-9999) + 5-6 Month (2 digits, 1-12) + 7-8 Day (2 digits, 1-31) + 9 Date-Time Separator (space, :, _, or the letter T) + 10-11 Hour (2 digits, 0-23) + 12 Hour-Minute Separator (colon) + 13-14 Minute (2 digits, 0-59) + 15 Minute-Second Separator (colon) + 16-17 Second (2 digits, 0-59) + + Example: + + 19800526 13:07:12 26 May 1980, 13:07:12 (1:07:12PM) + + This is the format produced by the DATE command and by any function + that returns a date-time. It is suitable for lexical comparison and + sorting, and for use as a date-time in any Kermit command. When this + format is given as input to a command or function, various date-time + separators (as noted) are accepted: + + 19800526 13:07:12 26 May 1980, 13:07:12 (1:07:12PM) + 20010208_10:28:35 2 February 2001, 10:28:35 AM + 18580101:12:00:00 1 January 1858, noon + 20110208T00:00:00 2 February 2011, midnight + + Certain other special date-time formats that are encountered on + computer networks are recognized: + + Asctime Format + This is a fixed format used by Unix, named after Unix's + asctime() ("ASCII time") function. It is always exactly 24 + characters long. Example: Fri Aug 10 16:38:01 2001 + + Asctime with Timezone + This is like Asctime format, but includes a 3-character + timezone between the time and year. It is exactly 28 characters + long. Example: Fri Aug 10 16:38:01 GMT 2001 + + E-Mail Format + E-mail date-time formats are defined in [468]RFC 2822 with a + fair amount of flexibility and options. The following examples + are typical of e-mails and HTTP (web-page) headers: + + Sat, 14 Jul 2001 11:49:29 (No timezone) + Fri, 24 Mar 2000 14:19:59 EST (Symbolic timezone) + Tue, 26 Jun 2001 10:19:45 -0400 (EDT) (GMT Offset + comment) + + FTP MDTM Format + This is the date-time format supplied by FTP servers that + support the (not yet standard but widely used nevertheless) + MDTM command, by which the FTP client asks for a file's + modification time: + + yyyymmddhhmmss[.ffff] + + where yyyy is the 4-digit year, mm is the 2-digit month, and so + on, exactly 14 digits long. An optional fractional part + (fraction of second) may also be included, separated by a + decimal point (period). Kermit rounds to the nearest second. + Example: + + 20020208102835.515 (8 February 2002 10:28:36 AM) + + 8.13.1. The Date + + The date, if given, must precede the time and/or delta, and can be in + many, many formats. For starters, you can use several symbolic date + names in place of actual dates: + + NOW + This is replaced by the current date and time. The time can not + be overriden (if you want to supply a specific time, use TODAY + rather than NOW). + + TODAY + This is replaced by the current date and a default time of + 00:00:00 is supplied, but can be overridden by a specific time; + for example, if today is 8 February 2002, then "TODAY" is + "20020802 00:00:00" but "TODAY 10:28" is "20020802 10:28:00". + + TOMORROW + Like TODAY, but one day later (if today is 8 February 2002, + then "TOMORROW" is "20020803 00:00:00" but "TOMORROW 16:30" is + "20020803 16:30:00"). + + YESTERDAY + Like TODAY, but one day earlier. + + MONDAY, TUESDAY, WEDNESDAY, ..., SUNDAY + The date on the given day of the week, today or later. A + default time of 00:00:00 is supplied but can be overridden. + Example: "SATURDAY 12:00" means next Saturday (or today, if + today is Saturday) at noon. + + You can give an explicit date in almost any conceivable format, but + there are some rules: + + * If a date is given, it must have three fields: day, month, and + year; the order can vary (except that the month can not be last). + * If names are used for days, months, etc, they must be English. + * The year must lie between 0000 and 9999, inclusive. + * All calendar calculations use Gregorian dating, so calculated + dates for years prior to 1582 (or later, depending on the country) + will not agree with historical dates. Other forms of dating (e.g. + Hebrew, Chinese) are not supported. + + Various date-field separators are accepted: hyphen, slash, space, + underscore, period. The same field separator (if any) must be used in + both places; for example 18-Sep-2001 but not 18-Sep/2001. Months can + be numeric (1-12) or English names or abbreviations. Month name + abbreviations are normally three letters, e.g. Apr, May, Jun, Jul. + Capitalization doesn't matter. + + Here are a few examples: + + 18 Sep 2001 (English month, abbreviated) + 18 September 2001 (English month, spelled out) + 2001 Sept 18 (Year, month, day) + 18-Sep-2001 (With hyphens) + 18/09/2001 (All numeric with slashes) + 18.09.2001 (Ditto, with periods) + 18_09_2001 (Ditto, with underscores) + 09/18/2001 (See below) + 2001/09/18 (See below) + September 18, 2001 (Correspondence style) + Sep-18-2001 (Month-day-year) + 20010918 (Numeric, no separators) + + You can also include the day of the week with a specific date, in + which case it is accepted (if it is a valid day name), but not + verified to agree with the given date: + + Tue, 18 Sep 2001 (Abbreviated, with comma) + Tue,18 Sep 2001 (Comma but no space) + Tue 18 Sep 2001 (Abbreviated, no comma) + Tuesday 18 Sep 2001 (Spelled out) + Tuesday, 18 Sep 2001 (etc) + Friday, 18 Sep 2001 (Accepted even if not Friday) + + In all-numeric dates with the year last, such as 18/09/2001, Kermit + identifies the year because it's 4 digits, then decides which of the + other two numbers is the month or day based on its value. If both are + 12 or less and are unequal, the date is ambiguous and is rejected. In + all-numeric dates with the year first, the second field is always the + month and the third is the day. The month never comes last. A date + with no separators is accepted only if it is all numeric and has + exactly eight digits, and is assumed to be in yyyymmdd format. + + 20010918 (18-Sep-2001 00:00:00) + + or 14 digits (as in FTP MDTM format): + + 20010918123456 (18-Sep-2001 12:34:56) + + You can always avoid ambiguity by putting the year first, or by using + an English, rather than numeric, month. A date such as 09/08/2001 + would be ambiguous but 2001/09/08 is not, nor is 09-Aug-2001. + + Until the late 1990s, it was common to encounter 2-digit years, and + these are found to this day in old e-mails and other documents. Kermit + accepts these dates if they have English months, and interprets them + according to the windowing rules of [469]RFC 2822: "If a two digit + year is encountered whose value is between 00 and 49, the year is + interpreted by adding 2000, ending up with a value between 2000 and + 2049. If a two digit year is encountered with a value between 50 and + 99, or any three digit year is encountered, the year is interpreted by + adding 1900." + + If you need to specify a year prior to 1000, use leading zeros to + ensure it is not misinterpreted as a "non-Y2K-compliant" modern year: + + 7-Oct-77 (19771007 00:00:00) + 7-Oct-0077 (00771007 00:00:00) + + 8.13.2. The Time + + The basic time format is hh:mm:dd; that is hours, minutes, seconds, + separated by colons, perhaps with an optional fractional second + separated by a decimal point (period). The hours are in 24-hour + format; 12 is noon, 13 is 1pm, and so on. Fields omitted from the + right default to zero. Fields can be omitted from the left or middle + by including the field's terminating colon. Examples: + + 11:59:59 (11:59:59 AM) + 11:59 (11:59:00 AM) + 11 (11:00:00 AM) + 11:59:59.33 (11:59:59 AM) + 11:59:59.66 (Noon) + 03:21:00 (3:21:00 AM) + 3:21:00 (3:21:00 AM) + 15:21:00 (3:21:00 PM) + :21:00 (00:21:00 AM) + ::01 (00:00:01 AM) + 11::59 (11:00:59 AM) + + Leading zeros can be omitted, but it is customary and more readable to + keep them in the minute and second fields: + + 03:02:01 (03:02:01 AM) + 3:02:01 (03:02:01 AM) + 3:2:1 (03:02:01 AM) + + AM/PM notation is accepted if you wish to use it: + + 11:59:59 (11:59:59 AM) + 11:59:59AM (11:59:59 AM) + 11:59:59A.M. (11:59:59 AM) + 11:59:59am (11:59:59 AM) + 11:59:59a.m. (11:59:59 AM) + 11:59:59PM (11:59:59 PM = 23:59:59) + 11:59:59P.M. (11:59:59 PM = 23:59:59) + 11:59:59pm (11:59:59 PM = 23:59:59) + 11:59:59p.m. (11:59:59 PM = 23:59:59) + + You can omit the colons if you wish, in which case Kermit uses the + following rules to interpret the time: + + 1. 6 digits is hh:mm:ss, e.g. 123456 is 12:34:56. + 2. 5 digits is h:mm:ss, e.g. 12345 is 1:23:45. + 3. 4 digits is hh:mm, e.g. 1234 is 12:34. + 4. 3 digits is h:mm, e.g. 123 is 1:23. + 5. 2 digits is hh, e.g. 12 is 12:00. + 6. 1 digit is h (the hour), e.g. 1 is 1:00. + + Examples: + + 1 (01:00:00 AM) + 10 (10:00:00 AM) + 230 (02:30:00 AM) + 230pm (02:30:00 PM = 14:30:00) + 1115 (11:15:00 AM) + 2315 (11:15:00 PM = 23:15:00 PM) + 23150 (02:31:50 AM) + 231500 (23:15:00 PM) + + 8.13.3. Time Zones + + If a time is given, it can (but need not) be followed by a time zone + designator. If no time zone is included, the time is treated as local + time and no timezone conversions are performed. + + The preferred time zone designator is the UTC Offset, as specified in + [470]RFC 2822: a plus sign or minus sign immediately followed by + exactly four decimal digits, signifying the difference in hh (hours) + and mm (minutes) from Universal Coordinated Time (UTC, also known as + Greenwich Mean Time, or GMT), with negative numbers to the West and + positive numbers to the East. For example: + + Fri, 13 Jul 2001 12:54:29 -0700 + + indicates a local time of 12:54:29 that is 07 hours and 00 minutes + behind (less than, East of) Universal Time. The space is optional, so + the example could also be written as: + + Fri, 13 Jul 2001 12:54:29-0700 + + The following symbolic time zones are also accepted, as specified by + [471]RFC 2822 and/or in ISO 8601: + + GMT = +0000 Greenwich Mean Time + Z = +0000 Zulu (Zero Meridian) Time + UTC = +0000 Universal Coordinated Time + UT = +0000 Universal Time + EDT = -0400 Eastern (USA) Daylight Time + EST = -0500 Eastern (USA) Standard Time + CDT = -0500 Central (USA) Daylight Time + CST = -0600 Central (USA) Standard Time + MDT = -0600 Mountain (USA) Daylight Time + MST = -0700 Mountain (USA) Standard Time + PDT = -0700 Pacific (USA) Daylight Time + PST = -0800 Pacific (USA) Standard Time + + Note that GMT, Z, UTC, and UT all express the same concept: standard + (not daylight) time at the Zero Meridian. UTC, by the way, is an + international standard symbol and does not correspond to the order of + the English words, Universal Coordinated Time, but it happens to have + the same initial letters as these words. Of course hundreds of other + symbolic timezones and variations exist, but they are not + standardized, and are therefore not supported by Kermit. + + When a time zone is included with a time, the time is converted to + local time. In case the conversion crosses a midnight boundary, the + date is adjusted accordingly. Examples converting to EST (Eastern USA + Standard Time = -0500): + + 11:30:00 = 11:30:00 + 11:30:00 EST = 11:30:00 + 11:30:00 GMT = 06:30:00 + 11:30:00 PST = 14:30:00 + 11:30:00Z = 06:30:00 + 11:30PM GMT = 18:30:00 + 11:30 -0500 = 11:30:00 + 11:30 -0800 = 08:30:00 + 11:30 +0200 = 04:30:00 + + Unlike most of Kermit's other date-time conversions, timezone + knowledge (specifically, the offset of local time from UTC) is + embodied in the underlying operating system, not in Kermit itself, and + any conversion errors in this department are the fault of the OS. For + example, most UNIX platforms do not perform conversions for years + prior to 1970. + + 8.13.4. Delta Time + + Date/time expressions can be composed of a date and/or time and a + delta time, or a delta time by itself. When a delta time is given by + itself, it is relative to the current local date and time. Delta times + have the following general format: + + {+,-}[number units][hh[:mm[:ss]]] + + In other words, a delta time always starts with a plus or minus sign, + which is followed by a "part1", a "part2", or both. The "part1", if + given, specifies a number of days, weeks, months, or years; "part2" + specifies a time in hh:mm:ss notation. In arithmetic terms, these + represents some number of days or other big time units, and then a + fraction of a day expressed as hours, minutes, and seconds; these are + to be added to or subtracted from the given (or implied) date and + time. The syntax is somewhat flexible, as shown by the following + examples: + + +1 day (Plus one day) + +1day (Ditto) + +1d (Ditto) + + 1 day (Ditto) + + 1 day 3:00 (Plus one day and 3 hours) + +1d3:00 (Ditto) + +1d3 (Ditto) + +3:00:00 (Plus 3 hours) + +3:00 (Ditto) + +3 (Ditto) + +2 days (Plus 2 days) + -12 days 7:14:22 (Minus 12 days, 7 hours, 14 minutes, and 22 seconds) + + The words "week", "month", and "year" can be used like "day" in the + examples above. A week is exactly equivalent to 7 days. When months + are specified, the numeric month number of the date is incremented or + decremented by the given number, and the year and day adjusted + accordingly if necessary (for example, 31-Jan-2001 +1month = + 03-Mar-2001 because February does not have 31 days). When years are + specified, they are added or subtracted to the base year. Examples + (assuming the current date is 10-Aug-2001 and the current time is + 19:21:11): + + 18-Sep-2001 +1day (20010918 00:00:00) + today +1day (20010811 00:00:00) + now+1d (20010811 19:21:11) + + 1 day (20010811 19:21:11) + + 1 day 3:14:42 (20010811 22:35:54) + + 7 weeks (20010928 19:21:11) + +1d3:14:42 (20010811 22:35:54) + +1w3:14:42 (20010817 22:35:54) + +1m3:14:42 (20010910 22:35:54) + +1y3:14:42 (20020810 22:35:54) + 2 feb 2001 + 10 years (20110208 00:00:00) + 2001-02-08 +10y12 (20110208 12:00:00) + 31-dec-1999 23:59:59+00:00:01 (20000101 00:00:00) + 28-feb-1996 +1day (19960229 00:00:00) (leap year) + 28-feb-1997 +1day (19970301 00:00:00) (nonleap year) + 28-feb-1997 +1month (19970328 00:00:00) + 28-feb-1997 +1month 11:59:59 (19970328 11:59:59) + 28-feb-1997 +20years (20170228 00:00:00) + 28-feb-1997 +8000years (99970228 00:00:00) + + For compatibility with VMS, the following special delta-time format is + also accepted: + + +number-hh:mm:ss + -number-hh:mm:ss + + (no spaces). The hyphen after the number indicates days. It + corresponds exactly to the Kermit notation: + + +numberdhh:mm:ss + -numberdhh:mm:ss + + The following forms all indicate exactly the same date and time: + + 18-Sep-2001 12:34:56 +1-3:23:01 + 18-Sep-2001 12:34:56 +1d3:23:01 + 18-Sep-2001 12:34:56 +1 day 3:23:01 + + and mean "add a day plus 3 hours, 23 minutes, and 1 second" to the + given date. + + Note that delta times are not at all the same as UTC offsets; the + former specifies an adjustment to the given date/time and the latter + specifies that the local time is a particular distance from Universal + Time, for example: + + 11-Aug-2001 12:34:56 -0800 (20010811 16:34:56 -- UTC Offset) + 11-Aug-2001 12:34:56 -08:00 (20010811 04:34:56 -- Delta time) + + If you give a time followed by a modifer that starts with a + or - + sign, how does Kermit know whether it's a UTC offset or a delta time? + It is treated as a UTC offset if the sign is followed by exactly four + decimal digits; otherwise it is a delta time. Examples (for USA + Eastern Daylight Time): + + 11-Aug-2001 12:34:56 -0800 (20010811 16:34:56 -- UTC Offset) + 11-Aug-2001 12:34:56 -08:00 (20010811 04:34:56 -- Delta time) + 11-Aug-2001 12:34:56 -800 (20010811 04:34:56 -- Delta time) + 11-Aug-2001 12:34:56 -8 (20010811 04:34:56 -- Delta time) + + The first example says that at some unknown place which is 8 hours + ahead of Universal Time, the time is 12:34:56, and this corresponds to + 16:34:56 in Eastern Daylight time. The second example says to subtract + 8 hours from the local time. The third and fourth are delta times + because, even though a colon is not included, the time does not + consist of exactly 4 digits. + + When a delta time is written after a timezone, however, there is no + ambiguity and no syntax distinction is required: + + 11-Aug-2001 12:34:56 -0800 -0800 (20010811 08:34:56) + 11-Aug-2001 12:34:56 -0800 -08:00 (Ditto) + 11-Aug-2001 12:34:56 -08:00 -08:00 (Illegal) + + 8.13.5. The DATE Command + + Obviously a great many combinations of date, time, time zone, and + delta time are possible, as well as many formatting options. The + purpose of all this flexibility is to comply with as many standards as + possible -- Internet RFCs, ISO standards, and proven corporate + standards -- as well as with notations commonly used by real people, + in order that dates and times from the widest variety of sources can + be assigned to a variable and used in any date-time field in any + Kermit command. + + You can test any date-and/or-time format with the DATE command, which + converts it to standard yyyymmdd hh:mm:ss format if it is understood, + or else gives an explicit error message (rather than just "BAD DATE" + as in previous C-Kermit releases) to indicate what is wrong with it. + Examples (on Tuesday, 31 July 2001 in New York City, Eastern Daylight + Time, UTC -0400): + + DATE command argument Result + 12:30 20010731 12:30:00 + 12:30:01 20010731 12:30:01 + 12:30:01.5 20010731 12:30:02 + 1230 20010731 12:30:00 + 230 20010731 02:30:00 + 230+1d 20010801 02:30:00 + 230+1d3:00 20010801 05:30:00 + 20010718 19:21:15 20010718 19:21:15 + 20010718_192115 20010718 19:21:15 + 20010718T192115 20010718 19:21:15 + 18 Jul 2001 +0400 20010717 23:59:59 + 18 Jul 2001 192115 20010718 19:21:15 + 18 Jul 2001 192115.8 20010718 19:21:16 + 18-Jul-2001T1921 20010718 19:21:00 + 18-Jul-2001 1921Z 20010718 15:21:00 + 18-Jul-2001 1921 GMT 20010718 15:21:00 + 18-Jul-2001 1921 UTC 20010718 15:21:00 + 18-Jul-2001 1921 Z 20010718 15:21:00 + 18-Jul-2001 1921Z 20010718 15:21:00 + 18-Jul-2001 1921 -04:00:00 20010718 19:21:00 + 21-Jul-2001_08:20:00am 20010721 08:20:00 + 21-Jul-2001_8:20:00P.M. 20010721 20:20:00 + Fri Jul 20 11:26:25 2001 20010720 11:26:25 + Fri Jul 20 11:26:25 GMT 2001 20010720 07:26:25 + Sun, 9 Apr 2000 06:46:46 +0100 20000409 01:46:46 + Sunday, 9 Apr 2000 06:46:46 +0100 20000409 01:46:46 + now 20010731 19:41:12 + today 20010731 00:00:00 + today 09:00 20010731 09:00:00 + tomorrow 20010801 00:00:00 + tomorrow 09:00 20010801 09:00:00 + tomorrow 09:00 GMT 20010801 05:00:00 + yesterday 20010730 00:00:00 + yesterday 09:00 20010730 09:00:00 + + 3 days 20010803 00:00:00 + +3 days 20010803 00:00:00 + +3days 20010803 00:00:00 + + 3days 20010803 00:00:00 + + 3 days 09:00 20010803 09:00:00 + + 2 weeks 20010814 00:00:00 + + 1 month 20010831 00:00:00 + - 7 months 20001231 00:00:00 + + 10 years 20110731 00:00:00 + friday 20010803 00:00:00 + saturday 20010804 00:00:00 + sunday 20010805 00:00:00 + monday 20010806 00:00:00 + tuesday 20010731 00:00:00 + wednesday 20010801 00:00:00 + thursday 20010802 00:00:00 + friday 07:00 20010803 07:00:00 + thursday 1:00pm 20010802 13:00:00 + thursday 1:00pm GMT 20010802 09:00:00 + Thu, 10 Nov 94 10:50:47 EST 19941110 10:50:47 + Fri, 20 Oct 1995 18:35:15 -0400 (EDT) 19951020 18:35:15 + 31/12/2001 20011231 00:00:00 + 12/31/2001 20011231 00:00:00 + 2001-July-20 20010720 00:00:00 + 2001-September-30 20010930 00:00:00 + 30-September-2001 20010930 00:00:00 + Sep 30, 2001 12:34:56 20010930 12:34:56 + September 30, 2001 20010930 00:00:00 + September 30, 2001 630 20010930 06:30:00 + September 30 2001 630 20010930 06:30:00 + Sep-30-2001 12:34:59 20010930 12:34:59 + 20010807113542.014 20010807 11:35.42 + 20010807113542.014Z 20010807 07:35:42 + + 8.13.6. New Date-Time Functions + + In the following descriptions, date-time function arguments are the + same free-format date-time strings discussed above, with the same + defaults for missing fields. They are automatically converted to + standard format internally prior to processing. + + \fcvtdate(d1) + Converts the date-time d1 to standard format and local time. + This function is not new, but now it accepts a wider range of + argument formats that can include timezones and/or delta times. + If the first argument is omitted, the current date and time are + assumed. The optional second argument is a format code for the + result: + + n1 = 1: yyyy-mmm-dd hh:mm:ss (mmm = English 3-letter month + abbreviation) + n1 = 2: dd-mmm-yyyy hh:mm:ss (ditto) + n1 = 3: yyyymmddhhmmss (all numeric) + + \futcdate(d1) + Converts the date-time d1 to Universal Coordinated Time (UTC), + also known as GMT or Zulu or Zero-Meridian time. The default d1 + is NOW. If d1 is a valid date-time, the UTC result is returned + in standard format, yyyymmdd hh:ss:mm. + + \fcmpdates(d1,d2) + Compares two free-format date-times, d1 and d2, and, if both + arguments are valid, returns a number: -1 if d1 is earlier than + (before) d2; 0 if d1 is the same as d2; 1 if d1 is later than + (after) d2. + + \fdiffdates(d1,d2) + Computes the difference between two free-format date-times, d1 + and d2. If both arguments are valid, returns a delta time which + is negative if d1 is earlier than (before) d2 and positive + otherwise. If d1 and d2 are equal, the result is "+0:00". + Otherwise, the result consists of the number of days, hours, + minutes, and seconds that separate the two date-times. If the + number of days is zero, it is omitted. If the number of days is + nonzero but the hours, minutes, and seconds are all zero, the + time is omitted. if the seconds are zero, they are omitted. + + \fdelta2secs(dt) + Converts a delta time to seconds. For example, "+1d00:00:01" to + 86401. Valid delta times must start with a + or - sign. Days + are accepted as time units, but not years, months, or weeks. If + the result would overflow a computer long word (as would happen + with 32-bit long words when the number of days is greater than + 24854), the function fails. + + HINT: Although Kermit has a number of built-in date and time + variables, it doesn't have a single one suitable for writing a + timestamp. For this you would normally use something like "\v(ndate) + \v(time)". But \fcvtdate() (with no arguments) is equivalent: it + returns the current date and time in yyyymmdd hh:mm:ss format, + suitable for time stamping. + + 8.13.7. Date-Time Programming Examples + + Here's a macro that converts any date-time to UTC, which you might use + if C-Kermit didn't already have a \futcdate() function: + + define utcdate { + .local := \fcvtdate(\%*) ; 1. + .tmp := \fcvtdate(\m(local)UTC) ; 2. + .offset := \fdiffdate(\m(local),\m(tmp)) ; 3. + .utc := \fcvtdate(\m(local)\m(offset)) ; 4. + sho mac utc ; 5. + } + + Brief explanation: Line 1 converts the macro argument, a free-format + date-time, to standard-format local time. Line 2 appends the "UTC" + timezone to the local time and converts the result to local time. In + other words, we take the same time as the local time, but pretend it's + UTC time, and convert it to local time. For example, if New York time + is 4 hours ahead of UTC, then 6:00pm New York time is 2:00pm UTC. Line + 3 gets the difference of the two results (e.g. "+04:00"). Line 4 + appends the difference (delta time) to the local time, and converts it + again, which adds (or subtracts) the UTC offset to the given time. + Line 5 displays the result. + + Here's a script that opens a web page, gets its headers into an array, + scans the array for the "Last-Modified:" header, and inteprets it: + http open www.columbia.edu + if fail stop 1 HTTP OPEN failed + http /array:a head index.html /dev/null + if fail stop 1 HTTP GET failed + show array a + for \%i 1 \fdim(&a) 1 { + .\%x := \findex(:,\&a[\%i]) + if not \%x continue + .tag := \fleft(\&a[\%i],\%x-1) + .val := \fltrim(\fsubstr(\&a[\%i],\%x+1)) + if ( eq "\m(tag)" "Last-Modified" ) { + echo HTTP Date: \m(val) + .rdate := \fcvtdate(\m(val)) + echo {Standard Date (local): \m(rdate)} + echo {Standard Date (UTC): \futcdate(\m(rdate))} + break + } + } + http close + + The result: + + HTTP Date: Mon, 13 Aug 2001 20:05:42 GMT + Standard Date (local): 20010813 16:05:42 + Standard Date (UTC): 20010813 20:05:42 + + As you can see, Kermit had no trouble decoding the date-time-string + from the website, converting to local time, and converting back to UTC + with no conflicts or loss of information. If it had been in any other + known format, the result would have been the same. + + Now suppose we want to download the web page only if it is newer than + our local copy. The \fdate(filename) function (which returns the + modification date-time of the given file) and the new \fcmpdates() + function make it easy. Insert the following just before the BREAK + statement: + + if ( < 0 \fcmpdates(\m(rdate),\fdate(index.html)) ) { + echo GETTING index.html... + http get index.html index.html + if success echo HTTP GET OK + } else { + echo index.html: no update needed + } + http close + exit + + This says, "if 0 is less than the comparison of the remote file date + and the local file date, get the remote file, otherwise skip it." And + it automatically reconciles the time-zone difference (if any). + + It would be nice to be able to extend this script into a + general-purpose website updater, but unfortunately HTTP protocol + doesn't provide any mechanism for the client to ask the server for a + list of files, recursive or otherwise. + + [ [472]Top ] [ [473]Contents ] [ [474]C-Kermit Home ] [ [475]Kermit + Home ] + _________________________________________________________________ + + 8.14. Trapping Keyboard Interruption + + Normally when you type Ctrl-C and Kermit is in command mode (as + opposed to CONNECT mode) with COMMAND INTERRUPTION ON (as it is unless + you have set it OFF), Kermit interrupts any command that is currently + in progress, and if a command file or macro is executing, rolls the + command stack back to top level, closing all open command files, + deactivating all macros, deallocating all local variables and arrays, + and leaving you at the command prompt. + + Suppose, however, you want certain actions to occur when a script is + interrupted; for example, closing open files, writing log entries, or + displaying summary results. You can do this by defining a macro named + ON_CTRLC. When Ctrl-C is detected, and a macro with this name is + defined, Kermit executes it from the current command level, thus + giving it full access to the environment in which the interruption + occurred, including local variables and open files. Only when the + ON_CTRLC macro completes execution is the command stack rolled back to + top level. + + Once the ON_CTRLC macro is defined, it can be executed only once. This + is to prevent recursion if the user types Ctrl-C while the ON_CTRLC + macro is executing. If you type Ctrl-C while the Ctrl-C macro is + active, this does not start a new copy of ON_CTRLC; rather, it returns + to the top-level command prompt. After the ON_CTRLC macro returns, it + has been removed from the macro table so if you want to use it again + or install a different Ctrl-C trap, you must execute a new DEFINE + ON_CTRLC command. In any case, as always when you interrupt a script + with Ctrl-C, its completion status is FAILURE. + + Normally the ON_CTRLC macro would be defined in the command file or + macro to which it applies, and should be declared LOCAL. This way, if + the command file or macro completes successfully without being + interrupted, the ON_CTRLC definition disappears automatically. + Otherwise the definition would still be valid and the macro would be + executed, probably out of context, the next time you typed Ctrl-C. + + Here's a simple example of a command file that sets a Ctrl-C trap for + itself: + + local on_ctrlc ; Make Ctrl-C trap local to this command file. + define on_ctrlc { ; Define the ON_CTRLC macro. + echo Interrupted at \v(time). + echo Iterations: \%n + } + xecho Type Ctrl-C to quit + for \%n 1 999 1 { ; Prints a dot every second until interrupted. + sleep 1 + xecho . + } + echo Finished normally at \v(time) ; Get here only if not interrupted. + decrement \%n + echo Iterations: \%n + + This prints a summary no matter whether it completes normally or is + interrupted from the keyboard. In both cases the trap is automatically + removed afterwards. + + For an example of how to use ON_CTRLC to debug scripts, see + [476]Section 8.1. + + [ [477]Top ] [ [478]Contents ] [ [479]C-Kermit Home ] [ [480]Kermit + Home ] + __________________________________________________________________________ + +9. S-EXPRESSIONS + + This section is primarily for those who want to write + calculation-intensive scripts, especially if they require + floating-point arithmetic, and/or for those who are familiar with the + LISP programming language. + + Ever since C-Kermit version 5 was released in 1988, scripting has been + one of its major attractions, and arithmetic is a key part of it. + Versions 5 and 6 included integer arithmetic only, using traditional + algebraic notation, e.g.: + + echo \fevaluate(3*(2+7)/2) + 13 + + C-Kermit 7.0 added support for floating-point arithmetic, but only + through function calls: + + echo \ffpdivide(\ffpmultiply(3.0,\ffpadd(2.0,7.0)),2.0) + 13.5 + + C-Kermit 8.0 introduces a third form of arithmetic that treats + integers and floating-point numbers uniformly, is easier to read and + write, and executes very quickly: + + (/ (* 3 (+ 2 7)) 2) + 13.5 + + But first some background. + + The Kermit command and scripting language differs from true + programming languages (such as C or Fortran) in many ways; one of the + most prominent differences is the way in which variables are + distinguished from constants. In a command language, words are taken + literally; for example, the Unix shell: + + cat foo.bar + + displays the file named foo.bar. Whereas in a programming language + like C, words are assumed to be variables: + + s = foo.bar; /* Assigns the value of foo.bar to the variable s */ + + To make a programming language take words literally, you have to quote + or "escape" them: + + s = "foo.bar"; /* Assigns a pointer to the string "foo.bar" to the variable +s */ + + The opposite holds for command languages: to get them to treat a word + as a variable rather than a constant, you have to escape them. For + example, in the Unix shell: + + foo=123 ; Assign value 123 to variable foo. + echo foo ; Prints "foo" + echo $foo ; Prints "123" + + And in Kermit: + + define foo 123 ; Assign value 123 to variable foo. + echo 123 ; This prints "123". + echo foo ; This prints "foo". + echo \m(foo) ; This prints "123". + + In other words, character strings (such as "foo" above) are + interpreted as literal strings, rather than variable names, except in + special commands like DEFINE that deal specifically with variable + names (or in numeric contexts as explained in [481]Section 8.2). The + special "escape" character (dollar sign ($) for the shell, backslash + (\) for Kermit) indicates that a variable is to be replaced by its + value. + + The requirement to escape variable names in command languages normally + does not impose any special hardship, but can add a considerable + notational burden to arithmetic expressions, which are typically full + of variables. Especially in Kermit when floating point numbers are + involved, where you must use special \ffpxxx() functions, e.g. + "\ffpadd(\m(a),\m(b))" rather than the simple "+" operator to add two + floating-point numbers together, because the original arithmetic + handler doesn't support floating point (this might change in the + future). To illustrate, the general formula for the area of a triangle + is: + + sqrt(s * (s - a) * (s - b) * (s - c)) + + where a, b, and c are the lengths of the triangle's three sides and: + + s = (a + b + c) / 2 + + Except in special cases (e.g. a = 3, b = 4, c = 5), the result has a + fractional part so the computation must be done using floating-point + arithmetic. We can create a Kermit 7.0 function for this as follows: + + def area { + local s t1 t2 t3 + assign s \ffpdiv(\ffpadd(\ffpadd(\%1,\%2),\%3),2.0) + assign t1 \ffpsub(\m(s),\%1) + assign t2 \ffpsub(\m(s),\%2) + assign t3 \ffpsub(\m(s),\%3) + return \ffpsqrt(\ffpmul(\m(s),\ffpmul(\m(t1),\ffpmul(\m(t2),\m(t3))))) + } + + But as you can see, this is rather cumbersome. Note, in particular, + that arithmetic functions like \ffpadd(), \ffpmul(), etc, take exactly + two operands (like their symbolic counterparts + and *), so obtaining + the product of three or more numbers (as we do in this case) is + awkward. + + Using the alternative S-Expression notation, we can reduce this to a + form that is both easier to read and executes faster (the details are + explained later): + + def newarea { + (let s (/ (+ \%1 \%2 \%3) 2.0)) + (sqrt (* s (- s \%1) (- s \%2) (- s \%3))) + } + + In both examples, the \%1..3 variables are the normal Kermit macro + arguments, referenced by the normal escaping mechanism. For increased + readability, we can also assign the macro arguments \%1, \%2, and \%3 + to the letters a, b, and c corresponding to our formula: + +def newarea { + (let a \%1 b \%2 c \%3) + (let s (/ (+ a b c) 2.0)) + (sqrt (* s (- s a) (- s b) (- s c))) +} + + And now the Kermit function reads almost like the original formula. + Here Kermit behaves more like a regular programming language. In an + S-Expression, macro names need not be escaped when they are used as + the names of numeric variables. + + [ [482]Top ] [ [483]Contents ] [ [484]C-Kermit Home ] [ [485]Kermit + Home ] + _________________________________________________________________ + + 9.1. What is an S-Expression? + + The S-Expression concept is borrowed from the Lisp programming + language. "S-Expression" is short for Symbolic Expression (itself + sometimes shortened to SEXP). S-Expressions provide a kind of + Alternative Mini-Universe within the Kermit command language when the + regular rules don't apply, a universe enclosed in parentheses. + + C-Kermit does not pretend to be a full Lisp interpreter; only the + arithmetic parts of Lisp have been incorporated: S-Expressions that + operate on numbers and return numeric values (plus extensibility + features described in [486]Section 9.8, which allow some degree of + string processing). + + An S-Expression is a list of zero or more items, separated by spaces, + within parentheses. Examples: + + () + (1) + (a) + (+ a 1) + (* 2 a b) + + If the S-Expression is empty, it has the NIL (empty) value. If it is + not empty and the first item is an operator (such as + or *), there + can be zero or more subsequent items, called the operands: + + (+ 1 2) + + Here the operator is "+" and the operands are "1" and "2", and the + value of the S-Expression is the value of the operation (in this case + 3). The operator always comes first, which is different from the + familiar algebraic notation; this because S-Expression operators can + have different numbers of operands: + + (+ 1) + (+ 1 2) + (+ 1 2 3 4 5 6 7 8 9) + + If the first item in the S-Expression is not an operator, then it must + be a variable or a number (or a macro; see [487]Section 9.8), and the + S-Expression can only contain one item; in this case, the + S-Expression's value is the value of the variable or number: + + (a) + (3) + + Operands can be numbers, variables that have numeric values, functions + that return numbers, or other S-Expressions. To illustrate an + S-Expression within an S-Expression, observe that: + + (+ 1 2) + + is equivalent to any of the following (plus an infinite number of + others): + + (+ 1 (+ 1 1)) + (+ (- 3 2) (/ 14 (+ 3 4))) + + S-Expressions can be nested to any reasonable level; for example, the + value of the following S-Expression is 64: + + (- (* (+ 2 (* 3 4)) (- 9 (* 2 2))) 6) + + Operators have no precedence, implied or otherwise, since they can't + be mixed. The only exceptions are unary + and -, which simply indicate + the sign of a number: + + (* 3 -1) + + Order of evaluation is specified entirely by parentheses, which are + required around each operator and its operands: (+ a (* b c)) instead + of (a + b * c). + + S-Expressions provide a simple and isolated environment in which + Kermit's macro names can be used without the \m(...) escaping that is + normally required. Given: + + define a 1 + define b 2 + define c 3 + + Then: + + (+ \m(a) \m(b) \m(c)) + + is equivalent to: + + (+ a b c) + + Within an S-Expression, as in other strictly numeric contexts + ([488]Section 8.2), any operand that starts with a letter is treated + as a Kermit macro name. In this context, abbreviations are not + accepted; variable names must be spelled out in full. Alphabetic case + is not significant; "a" and "A" are the same variable, but both are + different from "area". + + Of course, regular Kermit variables and functions can be used in + S-Expressions in the normal ways: + + (* \v(math_pi) (^ \%r 2)) ; Area of a circle with radius \%r + (+ \fjoin(&a)) ; Sum of all elements of array \&a[] + + [ [489]Top ] [ [490]Contents ] [ [491]C-Kermit Home ] [ [492]Kermit + Home ] + _________________________________________________________________ + + 9.2. Integer and Floating-Point-Arithmetic + + Normally, if all numbers in an S-Expression are integers, the result + is an integer: + + (+ 1 1) ; Result is 2 + (/ 9 3) ; Result is 3 + + If any of the operands is floating point, however, the result is also + floating point: + + (+ 1 1.0) ; Result is 2.0 + (/ 9.0 3) ; Result is 3.0 + + If all the operands are integers but the result has a fractional part, + the result is floating point: + + (/ 10 3) ; Result is 3.333333333333333 + + To force an integer result in such cases, use the TRUNCATE operator: + + (truncate (/ 10 3)) ; Result is 3 + + Similarly, to force a computation to occur in floating point, you can + coerce one of its operands to FLOAT: + + (+ 1 (float 1)) ; Result is 2.0 + + The result is also floating point if the magnitude of any integer + operand, intermediate result, or the result itself, is larger than the + maximum for the underlying machine architecture: + + (^ 100 100) + + If the result is too large even for floating-point representation, + "Infinity" is printed; if it is too small to be distinguished from 0, + 0.0 is returned. + + Large numbers can be used and large results generated, but they are + accurate only to the precision of the underlying machine. For example, + the result of: + + (+ 111111111111111111111 222222222222222222222) + + should be 333333333333333333333, but 333333333333333300000.0 is + produced instead if the machine is accurate to only about 16 decimal + digits, even with coercion to floating-point. The order of magnitude + is correct but the least significant digits are wrong. The imprecise + nature of the result is indicated by the ".0" at the end. Contrast + with: + + (+ 111111111 222222222) + + which produces an exact integer result. + + [ [493]Top ] [ [494]Contents ] [ [495]C-Kermit Home ] [ [496]Kermit + Home ] + _________________________________________________________________ + + 9.3. How to Use S-Expressions + + S-Expressions may be given as commands to C-Kermit. Any command whose + first character is "(" (left parenthesis) is interpreted as an + S-Expression. + + If you enter an S-Expression at the C-Kermit> prompt, its result is + printed: + + C-Kermit>(/ 10.0 3) + 3.333333333333333 + C-Kermit> + + If an S-Expression is executed within a macro or command file, its + value is not printed. However, you can control the printing action + with: + + SET SEXPRESSION ECHO { AUTO, ON, OFF } + AUTO is the default, meaning print the value at top level only; + ON means always print the value; OFF means never print it. + + In any case, the value of the most recent S-Expression (and the + S-Expression itself) may be accessed programmatically through the + following variables: + + \v(sexpression) + The S-Expression most recently executed. + + \v(svalue) + The value of the S-Expression most recently executed. + + Besides issuing S-Expressions as commands in themselves, you can also + execute them anywhere within a Kermit command, but in this case they + must be enclosed in a function call (otherwise they are taken + literally): + + \fsexpression(s) + The argument "s" is an S-Expression; the outer parentheses may + be omitted. The value of the S-Expression is returned. Note + that since S-Expressions usually contain spaces, some form of + grouping or quoting might be needed in some contexts: + + echo \fsexpression((+ 1 1)) ; Outer parentheses may be included + echo \fsexpr(+ 1 1) ; Outer parentheses may be omitted + echo Value = "\fsexp(+ 1 a)" ; Can be embedded in strings + echo Value = \&a[\fsexp(/ b 2)] ; Can be used in array subscripts + if = {\fsexp(+ 1 1)} 2 { ; Braces needed here for grouping + echo One plus one still equals two + } + + The IF statement illustrates how to use S-Expressions as (or in) IF or + WHILE conditions: + + * Although S-Expressions and IF conditions are similar in + appearance, they are not interchangeable. Therefore you must use + \fsexpr() to let Kermit know it's an S-Expression rather than a + regular IF condition, or a boolean or algebraic expression within + an IF condition. + * In contexts where a single "word" is expected, you must enclose + the \fsexp() invocation in braces if the S-Expression contains + spaces (and most of them do). + + If an S-Expression is the last command executed in a macro, its value + becomes the return value of the macro; no RETURN command is needed. + Example: + + def newarea { + (let s (/ (+ \%1 \%2 \%3) 2.0)) + (sqrt (* s (- s \%1) (- s \%2) (- s \%3))) + } + + This is equivalent to (but more efficient than): + + def newarea { + (let s (/ (+ \%1 \%2 \%3) 2.0)) + return \fsexp(sqrt (* s (- s \%1) (- s \%2) (- s \%3))) + } + + When an S-Expression is entered as a command -- that is, the first + nonblank character of the command is a left parenthesis -- then it is + allowed to span multiple lines, as many as you like, until the first + left parenthesis is matched: + + (let s (/ + (+ + \%1 + \%2 + \%3 + ) + 2.0 + ) + ) + (sqrt (* + s + (- s \%1) + (- s \%2) + (- s \%3) + ) + ) + + The S-Expression concept lends itself easily to embedding and + recursion, but the depth to which recursion can occur is limited by + the resources of the computer (memory size, address space, swap space + on disk) and other factors. There is no way that C-Kermit can know + what this limit is, since it varies not only from computer to + computer, but also from moment to moment. If resources are exhausted + by recursion, C-Kermit simply crashes; there's no way to trap this + error. However, you can set a depth limit on S-Expressions: + + SET SEXPRESSION DEPTH-LIMIT number + Limits the number of times the S-Expression reader can invoke + itself without returning to the given number. The default limit + is 1000. This limit applies to S-Expressions embedded within + other S-Expressions as well as to S-Expressions that invoke + recursive macros. If the limit is exceeded, Kermit prints + "?S-Expression depth limit exceeded" and returns to its prompt. + More about recursion in [497]Section 9.8. + + You can also test the depth programmatically: + + \v(sdepth) + The current S-Expression invocation depth. The depth includes + both nesting level and recursion. For example, in: + (foo (foo (foo (foo (foo))))), the innermost (foo) is at depth + 5. + + Help, completion, and syntax checking are not available within an + S-Expression. If you type ? within an S-Expression, it says: + + C-Kermit>(? S-Expression ("help sexp" for details) + + As it says, typing "help sexp" will display a brief help text. + + The SHOW SEXPRESSION command displays current SET SEXPRESSION settings + and related information. + + [ [498]Top ] [ [499]Contents ] [ [500]C-Kermit Home ] [ [501]Kermit + Home ] + _________________________________________________________________ + + 9.4. Summary of Built-in Constants and Operators + + Three constants are built in: + + * PI, whose value is the value of pi (the quotient of circumference + of any circle and its diameter, 3.141592653...) to the underlying + machine's precision; + * T, which always has the value 1, which signifies truth in Kermit + logical expressions or S-Expressions; + * NIL, which always has the empty value, and can serve as a False + truth value. + + These constants are specific to S-Expressions and are not visible + outside them. They may not be used as the target of an assignment. So, + for example: + + (setq t 0) Fails + assign t 0 Succeeds but this is not the same T! + + E (the base of natural logarithms, 2.7182818184...) is not built in + since it is not intrinsic in most Lisp dialects. If you want E to be + the base of natural logarithms you can: + + (setq e (exp 1)) + + Operators are either symbols (such as "+") or words. Words must be + spelled out in full, not abbreviated. Differences of alphabetic case + are ignored. + + The most basic operation in S-Expressions is evaluation: + + EVAL [ s-expression or variable or number [ another [ another ... ] ] + ] + Evaluates its operands and returns the value of the last one + evaluated. Examples: + + (eval) 0 + (eval 1) 1 + (eval a) value of a + (eval (+ 1 a)) value of a+1 + (eval (setq a 1) (setq b (+ a 0.5))) value of b (= a+0.5) + + You can use "." as a shorthand for EVAL: + + (.) + (. 1) + (. a) + (. (+ 1 a)) + (. (setq a 1) (setq b (+ a 0.5))) + + Opposite of EVAL is the operator that suppresses evaluation of its + operand: + + QUOTE item + The value (quote item) is "item". If the item is itself an + S-Expression, the result is the S-Expression with the outer + parentheses stripped. Examples: + + (quote) (illegal) + (quote a) a + (quote hello) hello + (quote (this is a string)) this is a string + (quote this is a string) (illegal) + + A shorthand notation is also accepted for quoting: + 'a is equivalent to (quote a). And therefore: + '(a b c) is equivalent to (quote (a b c)). + More about quoting in [502]Section 9.8. + + STRING item + Is a combination of EVAL and QUOTE. It evaluates the item as an + S-Expression, and then puts quotes around the result (more + about this in [503]Section 9.8). + + The following operators assign values to variables: + + SETQ [ variable [ value [ variable [ value [ ... ] ] ] ] ] + Applies to global variables. For each variable given: if a + value is not given, the variable is undefined. If a value is + given, assigns the value to the variable. The value may be a + number, a variable, or anything that resolves to a number + including an S-Expression. Returns the value of the last + assignment. Examples: + + (setq) Does nothing, returns NIL. + (setq a) Undefines a, returns NIL. + (setq a 1) Assigns 1 to a, returns 1. + (setq a 1 b 2) Assigns 1 to a, 2 to b, returns 2. + (setq a 1 b 2 c) Assigns 1 to a, 2 to b, undefines c, returns NIL. + + To undefine a variable that is not the final one in the list, give it + a value of "()" or NIL: + + (setq a () b 2) Undefines a, assigns 2 to b, returns 2. + (setq a nil b 2) Ditto. + + Note that a variable can be used right away once it has a value: + + (setq a 1 b a) Assigns 1 to a, the value of a (1) to b, returns 1. + + The results of SETQ (when used with macro names) can be checked + conveniently with SHOW MACRO, e.g: + + show mac a b c + + LET [ variable [ value [ variable [ value [ ... ] ] ] ] ] + Like SETQ, but applies to local variables. Note that "local" is + used in the Kermit sense, not the Lisp sense; it applies to the + current Kermit command level, not to the current S-Expression. + + If you want to use SETQ or LET to assign a value to a backslash + variable such as \%a or \&a[2], you must double the backslash: + + (setq \\%a 3) + (setq \\%b (+ \%a 1)) + (setq \\&a[2] (setq (\\%c (+ \%a \%b)))) + + In other words: + + * Double the backslash when you want to indicate the variable's + NAME; + * Don't double the backslash when you want its VALUE. + + See [504]Section 9.6 for a fuller explanation of variable syntax and + scope. + + Here's a summary table of arithmetic operators; in the examples, a is + 2 and b is -1.3: + + Operator Description Example Result + + Adds all operands (0 or more) (+ a b) 0.7 + - Subtracts all operands (0 or more) (- 9 5 2 1) 1 + * Multiplies all operands (0 or more) (* a (+ b 1) 3) -1.80 + / Divides all operands (2 or more) (/ b a 2) -0.325 + ^ Raise given number to given power (^ 3 2) 9 + ++ Increments variables (++ a 1.2) 3.2 + -- Decrements variables (-- a) 1 + ABS Absolute value of 1 operand (abs (* a b 3)) 7.8 + MAX Maximum of all operands (1 or more) (max 1 2 3 4) 4 + MIN Minimum of all operands (1 or more) (min 1 2 3 4) 1 + MOD (%) Modulus of all operands (1 or more) (mod 7 4 2) 1 + FLOAT Convert an integer to floating-point (float 1) 1.0 + TRUNCATE Integer part of floating-point operand (truncate 3.333) 3 + CEILING Ceiling of floating-point operand (ceiling 1.25) 2 + FLOOR Floor of floating-point operand (floor 1.25) 1 + ROUND Operand rounded to nearest integer (round 1.75) 2 + SQRT Square root of 1 operand (sqrt 2) 1.414.. + EXP e (2.71828..) to the given power (exp -1) 0.367.. + SIN Sine of angle-in-radians (sin (/ pi 2)) 1.0 + COS Cosine of angle-in-radians (cos pi) -1.0 + TAN Tangent of angle-in-radians (tan pi) 0.0 + LOG Natural log (base e) of given number (log 2.7183) 1.000.. + LOG10 Log base 10 of given number (log10 1000) 3.0 + + The ++ and -- operators are also assignment operators and work just + like SETQ and LET in their interpretations of operators and operands, + but: + + * Each target variable must already be defined and have a numeric + value; + * The assignment value is the amount by which to increment or + decrement the variable. + * If an assignment value is not given, 1 is used. + + If you include more than one variable-value pair in a ++ or -- + expression, every variable (except, optionally, the last) must be + followed by a value. Examples: + + (++ a) Equivalent to (setq a (+ a 1)) and to (++ a 1) + (++ a 2) Equivalent to (setq a (+ a 2)) + (-- a (* 2 pi)) Equivalent to (setq a (- a (* 2 pi))) + (++ a 1 b 1 c 1 d) Equivalent to four SETQs incrementing a,b,c,d by 1. + + Another group of operators forms the predicates. These return a "truth + value", in which 0 (or NIL) is false, and 1 or any other nonzero + number is true. + + Operator Description Example Result + = (or ==) Operands are equal (= 1 1.0) 1 + != Operands are not equal (!= 1 1.0) 0 + < Operands in strictly ascending order (< 1 2 3) 1 + <= Operands in ascending order (<= 1 1 2 3) 1 + > Operands in strictly descending order (> 3 2 1) 1 + >= Operands in descending order (<= 3 3 2 1) 1 + AND (&&) Operands are all true (and 1 1 1 1 0) 0 + OR (||) At least one operand is true (or 1 1 1 1 0) 1 + XOR Logical Exclusive OR (xor 3 1) 0 + NOT (!) Reverses truth value of operand (not 3) 0 + + The Exclusive OR of two values is true if one value is true and the + other value is false. + + And another group operates on bits within an integer word: + + Operator Description Example Result + & Bitwise AND (& 7 2) 2 + | Bitwise OR (| 1 2 3 4) 7 + # Bitwise Exclusive OR (# 3 1) 2 + ~ Reverses all bits (~ 3) -4 + + These operators coerce their operands to integer by truncation if + necessary. The result of bit reversal is hardware dependent. + + The final category of operator works on truth values: + + Operator Description Example Result + IF Conditional evaluation (if (1) 2 3) 2 + + IF (predicate) (s1) [ (s2) ] + The IF operator is similar to Kermit's IF command. If the + predicate is true (i.e. evaluates to a nonzero number), the + first S-Expression (s1) is evaluated and its value is returned. + Otherwise, if (s2) is given, it is evaluated and its value + returned; if (s2) is not given, nothing happens and the NIL + (empty) value is returned. + + You can group multiple expressions in the s1 and s2 expressions using + EVAL (or "."): + + (if (< a 0) (eval (setq x 0) (setq y 0)) (eval (setq x a) (setq y b))) + + or equivalently: + + (if (< a 0) (. (setq x 0) (setq y 0)) (. (setq x a) (setq y b))) + + Each operator has its own requirement as to number and type of + operands. In the following table, "number" means any kind of number -- + integer or floating-point -- or a variable, function, macro, or + S-Expression that returns a number; "vname" means variable name, + "fpnumber" means a floating-point number (or anything that resolves to + one), and "integer" means integer (or anything that resolves to one). + "truthvalue" means anything that resolves to a value of zero or an + empty value (which indicates false) or a nonzero value (which + indicates true). "any" means any kind of value, including none at all. + + Operator Number of operands Type of operands Returns + EVAL (.) 0 or more S-Expression Last value (default NIL) + STRING 1 S-Expression string + QUOTE (') 1 word string + SETQ 0 or more vname value pairs Last value (default NIL) + LET 0 or more vname value pairs Last value (default NIL) + + 0 or more number number (default 0) + - 0 or more number number (default 0) + * 0 or more number number (see note (1)) + / 2 or more number number + ^ 2 or more number number + ++ 1 or more vname value pairs Result of last increment + -- 1 or more vname value pairs Result of last decrement + ABS 1 number number + MAX 1 or more number number + MIN 1 or more number number + MOD (%) 2 number number + FLOAT 1 number fpnumber + TRUNCATE 1 number integer + CEILING 1 number integer + FLOOR 1 number integer + ROUND 1 number integer + SQRT 1 number fpnumber + EXP 1 number fpnumber + SIN 1 number fpnumber + COS 1 number fpnumber + TAN 1 number fpnumber + LOG 1 number fpnumber + LOG10 1 number fpnumber + = (==) 1 or more number truthvalue + != 1 or more number truthvalue + < 1 or more number truthvalue + <= 1 or more number truthvalue + > 1 or more number truthvalue + >= 1 or more number truthvalue + AND (&&) 1 or more truthvalue truthvalue + OR (||) 1 or more truthvalue truthvalue + XOR 2 truthvalue truthvalue + NOT (!) 1 truthvalue truthvalue + & 1 or more number (see note 2) integer + | 1 or more number (see note 2) integer + # 2 number (see note 2) integer + ~ 1 number (see note 2) integer + IF 2 or 3 truthvalue,any,any any + + Operators that don't require any arguments return the default values + shown. + + 1. The value of "*", when used as an operator, is initially "1" and + the value of the most recent S-Expression thereafter, as in Franz + Lisp. This is handy when doing a series of calculations by hand: + C-Kermit>(* 13272.42 0.40) + 5308.968 + C-Kermit>(/ * 2) + 2654.4840 + C-Kermit> + 2. The bitwise operators coerce their operands to integer by + truncation. + + [ [505]Top ] [ [506]Contents ] [ [507]C-Kermit Home ] [ [508]Kermit + Home ] + _________________________________________________________________ + + 9.5. Variables + + As noted elsewhere in this discussion, all backslash items (variables + such as \%a, macro parameters such as \%1, array elements such as + \&a[\%i], built-in variables such as \v(ndate), built-in functions + such as \fjoin(), macro names enclosed in \m(), \s(), or \:(), etc) + are evaluated at "top level" before the S-Expression is sent to the + S-Expression reader. To use a backslash variable as the target of an + assignment (e.g. by SETQ, LET, ++, or --), you must double the + backslash, e.g. (setq \\%r 1234). This is discussed at greater length + in the next section. + + Thus S-Expression reader generally deals only with macro names (not + backslash items) as variables. It is important to understand how the + reader handles macro names. There are fundamentally two kinds of + S-Expressions: those that contain a single element, such as: + + (foo) + + and those that contain more than one element: + + (foo a b c) + + If an S-Expression contains only one element, and it is the name of a + macro, the macro's definition is examined. If the definition is a + number (integer or floating-point, positive or negative), then this + becomes the value of the expression. If the definition starts with ' + (apostrophe), then the quoted word or string is the value of the + expression (explained in [509]Section 9.8). Otherwise, the macro is + assumed to be composed of Kermit commands (possibly including + S-Expressions), which are executed. If the macro has a RETURN value, + or it executes an S-Expression as its last command, the result becomes + the value of the S-Expression; otherwise the result is empty. + + For S-Expressions that contain more than one element, and the first + element is the name of a macro, then this macro is executed with the + arguments that are given, after the arguments are evaluated by the + S-Expression reader. Likewise, If the first element is a built-in + operator, then it is applied to the operands after they are evaluated. + In both cases, each operand is fed to the S-Expression reader + recursively for evaluation. If an operand is a number or a quoted + string, it is used as-is. But if it's a macro name, this degenerates + into the first case, and the previous paragraph applies. + + Examples: + + define foo 123 + (foo) Result: 123 + define foo 'abc + (foo) Result: abc + define foo '(one two three) + (foo) Result: one two three + define foo return \frandom(1000) + (foo) Result: 713 (or other number) + define foo (+ a b) + (foo) Result: The sum of a and b + + A more difficult example: + + define foo abc + (foo) Result: ??? + + The result in the last example depends on the definition of abc: + + * If it has no definition, an error occurs; otherwise: + * If the definition is an S-Expression, the result is the + S-Expression's value; otherwise: + * If the definition consists of Kermit commands, they are executed. + But in this case "(foo)" produces the empty result, because it + doesn't RETURN anything. + + The use of macros as S-Expression operators is described in + [510]Section 9.8. + + [ [511]Top ] [ [512]Contents ] [ [513]C-Kermit Home ] [ [514]Kermit + Home ] + _________________________________________________________________ + + 9.6. Assignments and Scope + + The assignment operators SETQ and LET apply to global and local + variables, respectively. SETQ and LET are standard Lisp operators + adapted to Kermit scoping rules. When the operands are numeric or + arithmetic, SETQ is equivalent to Kermit's EVALUATE command: + + (setq a (+ 1 2)) + evaluate a 1 + 2 + + When the operand is a string, SETQ is equivalent to DEFINE: + + (setq a '(this is a string)) + define a this is a string + + In the first case, both statements create a macro named "a" with a + value of 3. But in neither case is the macro "a" necessarily global. + If either of these commands executes in an environment (i.e. macro + invocation level) where a "local a" command has been given, the "a" + macro is global to that environment, but is not visible outside it. + + LET is equivalent to the Kermit LOCAL command, followed by the + corresponding EVALUATE: + + (let a (+ 1 2)) + + is equivalent to: + + local a + evaluate a 1 + 2 + + Again, "local" in this context applies to the Kermit macro invocation + stack, not to the S-Expression nesting level. To illustrate, recall + our "newarea" macro: + +def newarea { + (let a \%1 b \%2 c \%3) + (let s (/ (+ a b c) 2.0)) + (sqrt (* s (- s a) (- s b) (- s c))) +} + + Because SETQ and LET expressions return a value, they can be placed + within a larger S-Expression. In this case we can replace the first + reference to the "s" variable by its defining expression: + +def newarea { + (let a \%1 b \%2 c \%3) + (sqrt (* (let s (/ (+ a b c) 2.0)) (- s a) (- s b) (- s c))) +} + + This would not work if LET were local to the S-Expression, but it + works nicely in the context of Kermit macros. The previous definition + is equivalent to: + +def newarea { + local a b c s + (setq a \%1 b \%2 c \%3) + (sqrt (* (setq s (/ (+ a b c) 2.0)) (- s a) (- s b) (- s c))) +} + + In both cases, the variables a, b, c, and s are local to the "newarea" + macro, and global within it. + + Multiple assignments can be handled in several ways. Here is the + obvious way to initialize a series of variables to the same value: + + (setq a 0) + (setq b 0) + (setq c 0) + (setq s 0) + + Here is a more compact and efficient way of doing the same thing: + + (setq a 0 b 0 c 0 s 0) + + However, in case the value was more complex, it's better to put only + one copy of it in the S-Expression; in this case we rely on the fact + that SETQ returns the value of its last assignment: + + (setq a (setq b (setq c (setq s (* x (^ y 2)))))) + + Similarly, to set a series of variables to x, x+1, x+2, ... + + (setq c (+ (setq b (+ (setq a (+ (setq s x) 1)) 1)) 1)) + + In the last example, you can see why "last" does not always correspond + to "rightmost" (the leftmost variable "c" is assigned last). + + If you are working with backslash variables like \%a or array elements + like \&a[1], remember two rules: + 1. Don't put spaces inside array brackets. + 2. You must double the backslash when using SETQ, LET, ++, or -- to + assign a value to a backslash variable. + + Examples of assigning to a backslash variable: + + (setq x 1) + (setq \\%a 0) + (setq \\&a[x+1] 1) + (++ \\%x) + (-- \\&a[x+2]) + + Examples of referring to a backslash variable's value: + + (setq a (+ \%a 1)) + (setq b (+ \%a \&a[1])) + (++ a \%x) + (-- b \&a[1]) + + The special notation is required because all backslashed items (\%x + variables, array elements, built-in \v(xxx) variables, and \fxxx() + function invocations) are evaluated in a single pass BEFORE the + S-Expression is executed; any other approach would result in + unacceptable performance. So, for example, in: + + declare \&a[] = 1 2 3 + define \%x 4 + define \%y 0 + (setq \\%y (+ \%x \&a[1])) + + the S-Expression becomes: + + (setq \%y (+ 4 1)) + + before it is sent to the S-Expression evaluator. If the backslash had + not been doubled on the assignment target, the result would have been: + + (setq 0 (+ 4 1)) + + which is illegal because you can't assign a value to a number. + Conversely, if backslashes were doubled on right-hand-side values: + + (setq \\%y (+ \\%x \\&a[1]) + + this too, would give an error (not numeric - "\%x"). + + If you omit the double backslash in the assignment target, the result + depends on whether the variable already has a value: + + (setq \%a (* 3 3)) + + If \%a has a non-numeric single-word value, then this becomes the name + of the variable that is assigned by SETQ. To illustrate: + + define \%a foo + echo \%a + foo + (setq \%a (* 3 3)) + echo \%a + foo + show macro foo + foo = 9 + + If \%a has no value, a numeric value, or a multiword value, an + "invalid assignment" error occurs. + + [ [515]Top ] [ [516]Contents ] [ [517]C-Kermit Home ] [ [518]Kermit + Home ] + _________________________________________________________________ + + 9.7. Conditional Expressions + + The IF operator provides a compact form of decision-making within + S-Expressions. An IF expression can stand wherever a number might + stand, as long is it returns a number. Here's a quick way to obtain + the average value of all the elements in an array that contains only + numbers: + + (/ (+ \fjoin(&a)) (float \fdim(&a))) + + This results in a "Divide by zero" error if the array is empty. If you + want to define the average value of an empty array to be 0 instead of + getting an error, you can use IF to check the array size: + + (if \fdim(&a) (/ (+ \fjoin(&a)) (float \fdim(&a))) 0) + + or equivalently: + + (if (not \fdim(&a)) 0 (/ (+ \fjoin(&a)) (float \fdim(&a)))) + + Of course, IF can fit anywhere else into an S-Expression: + + (setq a (+ b (if (< c 0) 0 c))) + + and the IF expression can be as complex as you like: + + (setq a (+ b (if (and (or (> x 0) (> y 0)) (< c 0) (> d 1) (!= e 0)) 1 0))) + + and the "then" and "else" parts can contain multiple S-Expressions + enclosed within (EVAL ...): + + (if x (eval (...) (...) (...)) (eval (...) (...) (...))) + + AND and OR operators are guaranteed to "short circuit". If any operand + of AND is false, none of the subsequent operands is evaluated; + likewise, if an OR operand is true, no further operands are evaluated. + + Bear in mind that the S-Expression IF is not the same as Kermit IF; + the condition is only allowed to be an S-Expression or a variable or + number, not the whole list of possibilities you see when you type "if + ?" at the C-Kermit> prompt. But keep reading... + + [ [519]Top ] [ [520]Contents ] [ [521]C-Kermit Home ] [ [522]Kermit + Home ] + _________________________________________________________________ + + 9.8. Extensibility + + To extend the capabilities of S-Expressions, you can use Kermit macro + names as operators, with the following limitations: + + * The macro must not have the same name as a built-in operator. + * You must use the full macro name, not an abbreviation. + + And with the following enhancement: + + * If the last statement executed by the macro is an S-Expression, + its value is returned automatically. In other words: + + define bump (++ \%1) + + is equivalent to: + + define bump return \fsexpression(++ \%1) + + Here's an example in which we define a FIBONACCI operator that returns + the nth element, n >= 0, of the Fibonacci series, 0 1 1 2 3 5 8 13 21 + 34 55, . . ., in which the first element is 0, the second is 1, and + each subsequent element is the sum of the two before it. This series + was devised by Leonardo Pisano, Filius Bonacci (Fibonacci for short) + in 1202 to describe how fast rabbits can breed, and also forms the + basis for the Golden Mean, the branching behavior of plants, the + spiral of a nautilus shell, etc. (Thanks to [523]Dat Thuc Nguyen for + December 2003 corrections to this section!) + + We can write a FIBONACCI function as a macro easily with + S-Expressions: + + define FIBONACCI { + (if (== \%1 0) 0 + (if (== \%1 1) 1 (+ (fibonacci (- \%1 2)) (fibonacci (- \%1 1))))) + } + + You can read this as: + + If the argument (\%1) is 0, return a result of 0; if it is 1, + return 1; otherwise: + return the sum of fibonacci(argument - 2) and fibonacci(argument - + 1) + + Note that a RETURN statement is not needed, since S-Expressions + automatically set the return value of their containing macros. + + For comparison, here's how it would be coded without S-Expressions: + + define FIBONACCI { + if == \%1 0 { + return 0 + } else if == \%1 1 { + return 1 + } else { + return \feval(\fexec(fibonacci \feval(\%1-2)) - + + \fexec(fibonacci \feval(\%1-1))) + } + } + + Now we can use the FIBONACCI function (whichever way you write it) + just as if it were a built-in operator: + + (fibonacci 6) + + Or: + + (setq a 10) + (fibonacci a) + + Within S-Expressions only (not outside them), S-Expressions themselves + can be used as macro arguments: + + (setq a 2 b 4) + (setq x (fibonacci (* a b ))) + + The value of the S-Expression (in this case "8"), and not the + S-Expression itself, is sent to the macro. + + Your macro is responsible for argument validation and error handling. + A robust Fibonacci macro would be more like this: + + define FIBONACCI { + if < \v(argc) 2 end 1 ?\%0: Missing argument + if > \v(argc) 2 end 1 ?\%0: Too many arguments + if not integer \%1 end 1 ?\%0: Integers only + if < \%1 1 end 1 ?\%0: Argument out of range + (if (== \%1 0) 0 + (if (== \%1 1) 1 (+ (fibonacci (- \%1 2)) (fibonacci (- \%1 1))))) + } + + Recall that "END nonzero-number [ message ]" causes a macro invocation + to fail. When the macro is the operator in an S-Expression, this makes + the S-Expression fail too. Also note that our Fibonacci macro is just + an illustration, not a practical example. Since it is recursive (calls + itself), it won't work for large arguments because the call stack can + exceed available memory. See [524]Section 9.9.2 for a practical + alternative. + + Kermit macros, when used as S-Expression operators, can do anything at + all except initiate file transfers: they can print messages on the + screen, read and write files, interact with the user, and so on. For + example, here's a macro ASKME that asks you to enter a number, makes + sure that you did, and then returns its value for use in the + S-Expression: + + define ASKME { + local \%n + while true { + ask \%n { Number: } + if not def \%n continue + if not numeric \%n { + echo Not numeric - "\%n" + continue + } + break + } + return \%n + } + (setq a (* 2 (askme))) ; Get number from user, double it, assign result to a. + + Here's a macro you can use to validate that a number is in a given + range: + + define inrange { + if != \v(argc) 4 end 1 ?\%0: Wrong number of arguments + if ( < \%1 \%2 || > \%1 \%3 ) return 0 + return 1 + } + + The first argument is the number to be checked, the second is the + minimum acceptable value, the third is the maximum. You can use this + (for example) in IF conditions: + + define yes echo \%1 IS OK + define no echo \%1 IS NOT OK + + (setq a -1 b 999) + (if (inrange a 0 100) (yes a) (no a)) + (if (inrange b -1000 +1000) (yes b) (no b)) + + This is just an illustration, of course; there's already a built-in + operator to let you do range checking without help from macros: + + (if (<= 0 a 100) (yes a) (no a)) + (if (<= -1000 b +1000) (yes b) (no b)) + + To send string parameters to a macro, some kind of quoting is required + to tell the S-Expression parser to take a given "word" literally + rather than replacing it by its value. For this we use the Lisp QUOTE + operator: + + define length return \flength(\%1) + (length (quote abcdefghijklmnopqrstuvwxyz)) + 26 + + This causes the string "abcdefghijklmnopqrstuvwxyz" to be sent + literally to the LENGTH macro. Kermit, like Lisp, also offers a + shortcut for QUOTE, that lets us quote a word by prefixing it with a + single quote (') character, also called apostophe (ASCII 39): + + (length 'abcdefghijklmnopqrstuvwxyz) + 26 + + The two forms are equivalent. + + How the macro treats its arguments is up to the macro. In the example + above, the argument is treated as a literal string. However, it can + also be treated as a variable name: + + define string This is a string + define length return \flength(\m(\%1)) + (length 'string) + 16 + + Note the construct \m(\%1). This means "the value of the macro whose + name is the value of + \%1". The value of \%1 in this case is the word "string", and the + value of the macro whose name is "string" is "This is a string". + + What if the macro takes multiple arguments, or a variable number of + them? Here's a simple macro that prints a phrase that includes its + arguments: + + define complain echo It's too \%*! + + (Recall that \%* means "all arguments".) + + It can be called in the traditional way: + + complain hot Result: "It's too hot!" + complain cold and wet Result: "It's too cold and wet!" + + Or from an S-Expression if you quote the arguments: + + (complain 'hot) Result: "It's too hot!" + (complain 'cold 'and 'wet) Result: "It's too cold and wet!" + + To group multiple words into a single argument, use parentheses: + + (complain (quote (cold and wet))) Result: "It's too cold and wet!" + (complain '(cold and wet)) Result: "It's too cold and wet!" + + Note the difference: + + (complain 'cold 'and 'wet) Three arguments + (complain '(cold and wet)) One argument + + Since the COMPLAIN macro uses \%* to refer to all its arguments, no + matter how many, it doesn't care which form you use. But it makes a + difference in cases where the macro refers to its arguments + individually. + + To illustrate, let's consider a macro that receives the name of a + macro and its argument list and executes it with its arguments, + without knowing how many arguments there are. The following LOOP macro + is used to execute the given macro with the given argument list the + requested number of times: + + def loop { local i, for i 1 \%1 1 do \%2 \%3 } + + Within the LOOP macro, the first argument (\%1) is the loop count, \%2 + is the macro name, and \%3 is the argument list. When the LOOP macro + is invoked traditionally like this: + + loop 3 complain hot + + it prints "It's too hot!" three times. To invoke it from an + S-Expression, you must quote both the macro name as well as the + argument, since in this case the macro name itself is an argument: + + (loop 3 'complain 'hot) + + Now what if you need to send different or variable numbers of + arguments to the LOOP macro? The LOOP macro can handle it already, + provided you group the arguments into LOOP's third argument (\%3). In + Kermit syntax, without grouping: + + loop 3 complain cold and wet + + prints "It's too cold!" three times ("and wet" is lost); but with + grouping (either of the following two forms): + + loop 3 complain {cold and wet} + loop 3 complain "cold and wet" + + the LOOP macro prints "It's too cold and wet!" three times as desired. + + To do the same thing in an S-Expression, just use the Lisp forms of + quoting instead of the Kermit forms; the following two are equivalent: + + (loop 3 'complain (quote (cold and wet))) + (loop 3 'complain '(cold and wet)) + + Here's a similar example in which we write a macro that shows both the + name and the value of one or more other macros, whose names are given + as arguments (similar to "show macro"): + + define display { + local \%i + for \%i 1 \v(argc)-1 1 { + echo \&_[\%i] = \m(\&_[\%i]) + } + } + + (Recall that \&_[] is the macro's argument vector array, equivalent to + \%1, \%2, ...) The DISPLAY macro can be used in S-Expressions like + this: + + (setq a 1 b 2 c 3) + (display 'a 'b 'c 'd) + + which prints: + + a = 1 + b = 2 + c = 3 + d = + + The names must be quoted to prevent their evaluation before they are + sent to the macro. This ability to pass variables "by name" to macros, + rather than by value, lets you write macros that change the values of + argument variables. For example, here's a macro that doubles the value + of its argument variable: + + define double (++ \%1 \%1) + + which you can call like this: + + (setq a 12) + (double 'a) + + In the macro, \%1 is replace by the variable name "a"; "(++ a a)" adds + "a" to itself, and sets the value of "a" to the result. + + There are no built-in operators other than QUOTE, ', and STRING for + handling strings in S-Expressions, but using just these, plus macros + that use Kermit's regular string-handling features, you can easily + extend S-Expressions to do string manipulation: + + define len return \flen(\%1) Returns length of argument string + define cap return \fupper(\%1) Uppercase argument string + define rev return \freverse(\%1) Reverses argument string + define sub return \fsubstr(\%1,\%2,\%3) Returns substring of arg string + + (len '(this is a string)) Result: 16 + (rev '(this is a string)) Result: gnirts a si siht + (rev (cap '(this is a string))) Result: GNIRTS A SI SIHT + (sub (rev (cap '(this is a string))) 5 9) Result: TS A SI S + + You can assign a string to a macro name as follows: + + (setq foo '(this is a string)) + (setq foo (quote (this is a string))) + + The two are exactly equivalent. In both cases, the macro "foo" has the + value: + + '(this is a string) + + so when it is retrieved it can be identified as a string rather than a + number or commands to be executed. Thus: + + (setq foo (quote (this is a string))) + show macro foo + foo = '(this is a string) + (foo) + this is a string + + Note the different results for "show macro foo" and "(foo)". The + former shows the internal definition; the latter evaluates the + variable, which removes the quoting. And perhaps more important, note + that if the apostrophe and surrounding parentheses were not stored as + part of the definition, (foo) would try to execute "this is a string" + as a command. + + Given the assignment above, the following work as expected: + + (len foo) Result: 16 + (rev foo) Result: gnirts a si siht + (rev (cap foo)) Result: GNIRTS A SI SIHT + (sub (rev (cap foo)) 5 8) Result: TS A SI S + + Note that, unlike built-in S-Expression operators that return numbers + or truth values, these operators return strings. If you want to assign + their return values to other variables, you can do so: + + (setq bar (rev (cap foo))) Result: GNIRTS A SI SIHT + + But now the S-Expression processor doesn't know the value of "bar" is + supposed to be a string, rather than a macro to execute. For this you + need one final special operator, STRING. The STRING operator takes an + S-Expression as an operand, evaluates it, and then returns its value + enclosed in '(), so you can use the value as a string is subsequent + S-Expressions. Use STRING for referencing macros that return strings: + + (setq bar (string (rev (cap foo)))) Result: '(GNIRTS A SI SIHT) + + STRING is like QUOTE, except that it evaluates its operand before + applying the quoting, rather than taking the operand literally. + + To reference backslash variables or functions that return string + values, you must use the regular quoting mechanisms: + + (setq time '(\v(time))) + (setq date '(\v(date))) + assign \%r this is a string + (setq s1 '(\%r)) + + That's because backslash items are evaluated BEFORE the S-Expression + parser ever sees them, and the values of \v(time) and so on are not + valid S-Expressions, so STRING won't like them. + + Finally a brief word on the touchy topic of quoting. Suppose you want + to include (say) literal parentheses in a string that will later be + processed by the S-Expression reader (or \fsplit() or \fword()). + Normally, you can't do this because parentheses are meaningful in + these contexts. To defeat the normal parsing rules, you can quote the + parentheses with backslash. However, due to the many levels of string + processing involved, a surprisingly large amount of backslashes might + be required, for example: + + (setq s '(a b (c d) \\\\\\\\\\\\\\\\(e f (g h) x\\\\\\\\\\\\\\\\) j k)) + + This is nearly impossible to explain(*). Instead, just remember two + points: + + * In situations like this, it's better to use DEFINE to create the + string, rather than SETQ. The example above requires only double + backslashes when DEFINE is used: + define s '(a b (c d) \\(e f (g h) x\\) j k) + * The level of quoting depends on how many levels of evaluation the + string must pass through, which is not always obvious. However, + the number of backslashes required in any given situation is + always a power of 2. So if 1 doesn't work, try 2; if 2 doesn't + work, try 4; if 4 doesn't work, try 8, 16, 32, and so on. + + Considerations like this apply in any scripting language (shell, Tcl, + Perl, Python, etc). The situation is known as "Quoting Hell". + + (*) If you really want an explanation, here it is: + + * Every SEXP has its backslash items evaluated in a single pass at + top level before being passed to the SEXP reader, so \%1, + \v(ftime), etc, can be evaluated up front, freeing the SEXP reader + of having to know about such things, which in turn makes it much + more efficient. Therefore one level of quoting is lost right away, + and therefore you must double each backslash that is to be used as + a quote. + * When the SEXP reader sees '\', it treats it as a quote; discards + it and keeps the next character. Thus '\\' becomes '\'. This would + be the end of it, except that: + * The SEXP reader must call itself recursively on its operands, so + we must double any quotes in the operands: 2^2 = 4. + * If the result is to be passed as an argument to a macro, the + backslashes must again be doubled, because the macro processor + evaluates the arguments before sending them to the macro: 2^3 = 8. + * If the macro itself is to see the quotes, rather than just the + result of the quoting, the quotes must be doubled again: 2^4 = 16. + + Moral: To create string constants in which grouping characters must be + quoted, use DEFINE rather than SETQ. + + [ [525]Top ] [ [526]Contents ] [ [527]C-Kermit Home ] [ [528]Kermit + Home ] + _________________________________________________________________ + + 9.9. Examples + + 9.9.1. Statistics + + The following program computes statistics -- means, maxima, mimima, + variance, standard deviation, and correlation -- from data stored in + parallel arrays, \&x[] and \&y[], which can contain any mixture of + integer and floating-point numbers: positive, negative, or zero. Array + setup and validation are not shown. Except for the traditional FOR + loop and printing the results at the end, the entire computation is + done with S-Expressions: + +; Initialize sums, maxima, minima, and number of elements + + (setq xsum 0 ysum 0 xsum2 0 ysum2 0 xysum 0) + (setq xmin (setq xmax \&x[1]) ymin (setq ymax \&y[1])) + (setq n \fdim(&x)) + +; Loop through elements and accumulate sums, maxima, and minima + + for i 1 n 1 { + (setq x \&x[i] y \&y[i]) ; Notational convenience + (setq xmax (max xmax x) ymax (max ymax y)) ; X and Y maxima + (setq xmin (min xmin x) ymin (min ymin y)) ; X and Y minima + (++ xsum x ysum y) ; X and Y sums + (++ xsum2 (^ x 2) ysum2 (^ y 2)) ; Sum of X and Y squares + (++ xysum (* x y)) ; Sum of XY products + } + +; Calculate results + + (setq xmean (/ xsum n) ymean (/ ysum n)) ; Mean X and Y + (setq xss (- xsum2 (/ (^ xsum 2) n))) ; Intermediate values + (setq yss (- ysum2 (/ (^ ysum 2) n))) + (setq xyss (- xysum (/ (* xsum ysum) n))) + (setq xvar (/ xss n) yvar (/ yss n)) ; X and Y variance + (setq sdx (sqrt xvar) sdy (sqrt yvar)) ; Std deviation in X and Y + (setq tmp (* xss yss)) + (setq cc (if tmp (/ xyss (sqrt tmp)) 1.0)) ; Correlation coefficient + show macro xmean ymean xvar yvar sdx sdy cc ; Print the results + + The final "if tmp" check accounts for the possibility that both arrays + contain all 0's. Results can also be printed with "echo CC = \m(cc)", + or any other desired way. Interestingly, if we had not needed the sum + of the squares and products, we could have obtained the sums, maxima, + and minima of the X's and Y's without a loop like this: + + (setq xsum (+ \fjoin(&x)) ysum (+ \fjoin(&y))) + (setq xmax (max \fjoin(&x)) ymax (max \fjoin(&y))) + (setq xmin (min \fjoin(&x)) ymin (min \fjoin(&y))) + + Any Kermit function that returns numbers or lists of numbers can be + included in an S-Expression as an operand. + _________________________________________________________________ + + 9.9.2. Practical Fibonacci Series + + The recursive Fibonacci example given previously is simple and + elegant, but not very useful since it causes memory occupation to grow + each time it calls itself, until eventually both physical memory and + disk swap space are filled and the program crashes. Even for small + arguments, like 17, execution time can be prohibitive: + + (setq t1 \v(ftime)) + (setq result (fibonacci 17)) + (setq t2 (- \v(ftime) t1)) + echo FIBONACCI(17) = \m(result): TIME = \ffpround(t2,3) + + prints (on a certain rather slow computer): + + FIBONACCI(17) = 1597: TIME = 5.861 + + Any recursive function can be recoded iteratively. The result is not + as pretty, but execution is far less expensive: + + define FIBITER { + (if (== \%3 0) (\%2) (fibiter (+ \%1 \%2) \%1 (- \%3 1))) + } + define FIBONACCI { + (fibiter 1 0 \%1) + } + + Here's the result on the same computer for the same argument of 17: + + FIBONACCI(17) = 1597: TIME = 0.015 + + (47 times faster.) Execution time increases proportionally to the size + of the argument in the iterative case, whereas in the recursive case + it goes up geometrically, quickly reaching infinity. + + [ [529]Top ] [ [530]Contents ] [ [531]C-Kermit Home ] [ [532]Kermit + Home ] + _________________________________________________________________ + + 9.10. Differences from Algebraic Notation + + In C-Kermit: + + * Algebraic notation uses infix operators and normal rules of + operator precedence, with parentheses used to force exceptions to + the rules; many operations can be included in an expression. + S-Expressions use prefix operators with no intrinsic precedence; + each operation is enclosed in parentheses, and the arrangement of + parentheses determines precedence. + * Algebraic infix operators require two operands; S-Expression + prefix operators can accept a variable number of operands. + * You can use algebraic notation anywhere that C-Kermit accepts a + number, e.g. "echo \&a[((1+1)*2-1]", but you can use S-Expressions + only as top-level commands. You can, however, use either algebraic + or S-Expressions anywhere at all by enclosing them in \fevaluate() + or \fsexpression(), respectively. + * You can use any mixture of integer and floating-point numbers in + S-Expressions, but only integers are permitted in algebraic + expressions. Outside of S-Expressions, floating point arithmetic + is supported only by \ffp...() function calls. + * Operators and operands in S-Expressions must be separated by + spaces, e.g. "(+ a b)". Spaces are not required in algebraic + expressions: "((a+b)*c)". + * When assigning values to backslash variables (such as \%x or + \&a[2]) using SETQ or LET, you must double the backslash. + + [ [533]Top ] [ [534]Contents ] [ [535]C-Kermit Home ] [ [536]Kermit + Home ] + _________________________________________________________________ + + 9.11. Differences from Lisp + + * Kermit has a lot of built-in operators not found in Lisp: ++, ^, + etc. + * Most dialects of real Lisp do not allow S-Expressions that don't + start with an operator, for example: + (a) + This expression can cause an error in Lisp (even if "a" has a + value), but is acceptable in Kermit, where it returns the value of + the variable "a". Similarly, (1) returns the value "1". + * In real Lisp, EVAL requires exactly one operand. In Kermit, it can + have 0, 1, 2, or more operands. It returns the value of the last + operand evaluated. + * Real Lisp SETQ and LET usually require an even number of operands. + Kermit allows an odd number, in which case the last (or only) + variable is undefined (i.e. deleted, destroyed). + * Kermit does not support ratios such as "7/8". Some Lisp dialects + accept ratios as numbers, and generate ratios when told to divide + two integers whose quotient is not a whole number; e.g. in Common + Lisp: + [13] USER(37): (/ (+ 1 2 3 4) 3) + 10/3 + [13] USER(38): + * The result of (/ 10 3) is 3.333.... Some Lisp dialects truncate + the result to 3 since both operands are integers, some don't; some + give the result as a ratio. C-Kermit always gives a floating point + result when there is a fractional part. If you want an integer + result, you can use TRUNCATE, FLOOR, or CEILING, e.g. (truncate (/ + 10 3)). + * There is currently no "bignum" support. Large numbers can be used + and large results generated, but (as noted in [537]Section 9.2) + they are accurate only to the precision of the underlying machine. + \v(math_precision) gives the machine precision as a number of + decimal digits, e.g. 16. + * Scientific notation for floating-point numbers is not supported. + If the magnitude of a number is greater than the precision of the + underlying hardware, the less-significant digits are shown but + their values are meaningless. If it the number is too small to be + represented internally, it is shown as "0.0". + * Many Lisp features are omitted: List processing (CAR, CDR, etc), + DEFUN, Lisp-specific control structures, and so on. + + [ [538]Top ] [ [539]Contents ] [ [540]C-Kermit Home ] [ [541]Kermit + Home ] + __________________________________________________________________________ + +10. FILE TRANSFER + + New commands and switches: + + SET TRANSFER REPORT { OFF, ON } + Enables or disables the (new) one-line message printed by + Kermit after a remote-mode file transfer to indicate the source + and destination file, complete with path, to let you know where + the file went. + + SEND /TYPE:{TEXT,BINARY} + Sends only files of the given type (see [542]Section 4). + + SEND /NOFOLLOWLINKS: + (UNIX only) Skip over symbolic links rather than following them + (default). This applies to wildcard and/or recursive SENDs; if + a single filename is given, and it happens to be a symbolic + link, the file it points to is sent. + + SEND /FOLLOWLINKS: + (UNIX only) Follow (resolve) symbolic links. Watch out for + circular links, endless loops, etc. + + SET SEND I-PACKETS { OFF, ON } + When sending commands to a Kermit server, this tells whether + command packets should be preceded by an I (information) + packet, which is used to synchronize parameters prior to + executing the command. Normally ON. The only reason to set this + OFF is for communicating with buggy Kermit servers that + misbehave when an I packet is sent to them. There is also a SET + RECEIVE I-PACKETS command, but presently it has no effect. + + SET TRANSFER MESSAGE [ text ] + Sets an initial message to be shown in the Last Message field + of the fullscreen file-transfer display. + + SET TRANSFER TRANSLATION { ON, OFF } + Inhibits or re-enables text-file transfer character-set + translation globally. + + { SEND, MSEND, GET, RECEIVE } /TRANSPARENT + Inhibits character-set translation for this transfer only. + + { GET, RECEIVE } /PIPES:{ON,OFF} + Overrides global TRANSFER PIPES setting for this transfer only; + ON allows incoming files with names like "!tar xf -" to be + opened as pipelines rather than regular files. + + The following new "hot keys" are available when Kermit's file-transfer + display is visible: + + D: Turn on debugging, open "debug.log" if not already open. + d: Turn off debugging but leave log open (if it was open). + T: Turn on debug-log timestamps. + t: Turn off debug-log timestamps. + + Other improvements: + * SET FILE DOWNLOAD-DIRECTORY now works for external protocols (e.g. + sz/rz) too. + * Improved automatic per-file text/binary switching, described in + [543]Section 4. + * When sending a file group (e.g. "send *.*"), failure to open a + file is no longer fatal; now C-Kermit simply goes ahead to the + next file. + * Transaction log entries are now made for external protocols too. + + [ [544]Top ] [ [545]Contents ] [ [546]C-Kermit Home ] [ [547]Kermit + Home ] + __________________________________________________________________________ + +11. MODEMS AND DIALING + + In C-Kermit 8.0, the default modem type for dialing has changed from + NONE (= DIRECT, meaning no modem) to GENERIC. This change should have + no impact on direct connections. For dialing, it means that, unless + you SET MODEM TYPE to a specific type, such as USROBOTICS or CONEXANT, + Kermit assumes: + + 1. The modem uses the Hayes AT command set. + 2. The modem supports error correction, data compression, and + hardware flow control and is already configured to use them. + + In fact, Kermit assumes the modem is completely configured, and + therefore does not send it an initialization string or any + configuration commands. Instead, it sends only the simplest and most + portable commands: + + ATQ0V1 Give dial result codes. + ATDTnumber Dial the number. + + (or ATD or ATDP, as appropriate). + + The new defaults work for direct connections and for most modern + modems on most platforms, and they work much faster than + "full-treatment" dialing. If the new defaults don't work for you, or + if you need to perform explicit modem configuations or interactions, + then set a specific modem type and use the SET MODEM and SET DIAL + commands as documented in Using C-Kermit. + + WARNING: Don't use the generic modem on hosts that do not support + RTS/CTS flow control. If Xon/Xoff is in use on the serial port, + you'll need to select a particular modem type so Kermit knows what + command to give it to enable Xon/Xoff flow control between itself + and your serial port. + + The following new modem types were added in C-Kermit 8.0: + + lucent: Lucent Venus chipset + pctel: PCTel V.90 chipset + conexant: Conexant (ex-Rockwell) modem family + zoom-v32bis: New name for "Zoom" + zoom-v34 Zoom V.34 + zoom-v90 Zoom V.90 56K + zoom-v92: Zoom V.92 with V.44 data compression + zoltrix-v34: New name for "zoltrix" + zoltrix-hsp-v90: Synonym for PCTel + zoltrix-hcf-v90: Synonym for ITU-T-V250 + smartlink-v90: Synonym for usrobotics (same chipset) + acer-v90: Synonym for Rockwell-v90 + + New DIAL-related variables: + + \v(dm_hf): Dial modifier: Wait for Hook-Flash. + \v(dm_wb): Dial modifier: Wait for Bong. + + Finally, if dialing fails, Kermit now prints a context-sensitive hint + suggesting possible reasons and remedies. + + Added in C-Kermit 8.0.201: Rudimentary support for Caller ID, for + use with the ANSWER command. If the modem reports Caller ID + information, Kermit stores it in variables that you can access after + the call is answered: + + \v(callid_date) The date of the call + \v(callid_time) The time of the call + \v(callid_name) The name of the caller + \v(callid_nmbr) The telephone number of the caller + \v(callid_mesg) A message + + The format of these items depends on the originating and answering + phone companies and the modems and their configuration. + + Not very many modems support Caller ID, and those that do (a) tend to + have it disabled by default, and (b) use different commands to enable + it. A quick survey shows of some current models shows: + + - USR V.90: No + - ITU-T V.250: No + - Lucent Venus: No + - Diamond Supra: #CID=1 + - Rockwell 56K: #CID=1 + - PCTEL: #CID=1 + - Zoltrix: +VCID=1 + - Conexant: +VCID=1 + + To use Kermit's Caller ID feature, you have to set the modem to wait + for at least two rings before answering, and you have to give the + command to enable Caller ID; for example (after choosing a modem with + SET MODEM TYPE): + + set modem command autoanswer on ATS0=2#CID=1\{13} + set modem command autoanswer on ATS0=2+VCID=1\{13} + + These commands can be undone with: + + set modem command autoanswer on ATS0=1#CID=0\{13} + set modem command autoanswer on ATS0=1+VCID=0\{13} + + Kermit presently has no built-in knowledge of the Caller ID + capabilities or commands of the modems in its database. + + Since the variables can be accessed only after the call is answered, + the only way to refuse a call is to answer it, inspect the variables, + and then hang it up if desired. + + [ [548]Top ] [ [549]Contents ] [ [550]C-Kermit Home ] [ [551]Kermit + Home ] + __________________________________________________________________________ + +12. TERMINAL CONNECTION + + Now that 7-bit connections are no longer the norm, the default + terminal bytesize (also called "data size" or "word size") in C-Kermit + 8.0 is 8 bits, rather than 7 bits as it was in C-Kermit 7.0 and + earlier: + + SET ESCAPE character + This command, which specifies your CONNECT-mode escape + character, allows you to specify any ASCII control character in + a variety of formats. C-Kermit 8.0.201 now also lets you + specify any 8-bit value, 128-255, as the escape character. In + the SET ESCAPE command, you can type the 8-bit character + literally or you can enter its numeric code. Here are examples + that you can enter from a terminal or console that uses the ISO + Latin-1 character set: + + C-Kermit> set escape à + C-Kermit> set escape 195 + C-Kermit> show escape + Escape character: Code 195 (Ã): enabled + C-Kermit> + + Both of these commands set the escape character value to 195 + (decimal), which happens to be uppercase letter A with Tilde in + Latin-1. SHOW ESCAPE and SHOW TERMINAL show the value, as does + the CONNECT message. + + SET TERMINAL AUTODOWNLOAD ERROR { STOP, CONTINUE } + When Kermit has a terminal connection to another computer, and + a file transfer is initiated automatically because a Kermit + packet was received in CONNECT mode (i.e. in the terminal + screen), this command tells what Kermit should do if the + transfer fails. The default is to STOP, which leaves Kermit in + command mode with its file-transfer display showing, so you can + see that the transfer failed and why. If you SET TERMINAL + AUTODOWNLOAD ERROR CONTINUE, this causes Kermit to return + automatically to its terminal screen (i.e. resume its CONNECT + session) as if the transfer had succeeded; this can be + desirable if the entire session is under control of a + host-based script. + + SET TERMINAL BYTESIZE { 7, 8 } + The byte size to use during CONNECT and INPUT command + execution, which can be more restrictive than the bytesize + implied by the current PARITY setting, but not less + restrictive. In C-Kermit 7.0 and earlier, the terminal bytesize + was 7 by default to protect against the likelihood that parity + was in use on the connection without the user's knowledge. When + the terminal bytesize is 8 (as it is in C-Kermit 8.0 and + later), the user will see garbage in this (increasingly + unlikely) situation. Note that 8 data bits are required for + most character sets other than ASCII: Latin-1, UTF-8, and so + on. + + A new command has been added to produce timestamped session logs: + + SET TERMINAL SESSION-LOG TIMESTAMPED-TEXT + Records the terminal session in text mode (like SET TERMINAL + SESSION-LOG TEXT) but adds a timestamp at the beginning of each + line. The timestamp format is hh:mm:ss.nnn, and indicates the + time at which the first character of the line appeared. + + In most UNIX versions (those built with the select()-capable CONNECT + module -- pretty much all the ones that have or could have TELNET + included), an idle timeout feature has been added: + + SET TERMINAL IDLE-TIMEOUT number + If the number is not 0, then Kermit is to take an action when + the given amount of time passes with no activity during CONNECT + mode. If the number is positive it is the maximum number of + idle seconds; if number is negative it represents milliseconds + (thousandths of seconds). If 0 is given as the number, there + are no idle timeouts. Synonym: SET TERMINAL IDLE-LIMIT. + + SET TERMINAL IDLE-ACTION { RETURN, HANGUP, EXIT, OUTPUT [ string ] } + The action to be taken upon an idle timeout in CONNECT mode. + RETURN to the prompt, HANGUP the connection, EXIT from Kermit, + or OUTPUT the given string (if no string is given, a NUL (ASCII + 0) character is sent). + + SET TERMINAL IDLE-ACTION { TELNET-NOP, TELNET-AYT } + Actions that can be selected on Telnet connections only, that + might be useful if idle limits are enforced by the Telnet + server or in the TCP/IP protocol: TELNET-NOP sends a "NO + Operation" (do-nothing) command, which causes no response from + the server; TELNET-AYT sends an "Are You There" message to the + server, which should make the server send back a message. + Neither of these actions interferes with your remote session. + + SET TERMINAL IDLE-ACTION is useful for connections to hosts or + services that automatically log you out after a certain amount of idle + time, e.g.: + + set term idle-timeout 300 + set term idle-action output \32 + + sends a space (as if you had pressed the space bar) every 300 seconds + (five minutes) while there is no activity (32 is the ASCII code for + space). + + When C-Kermit returns from CONNECT to command mode, the reason for the + transition is given in a new variable, \v(cx_status): + + 0 No CONNECT command given yet. + 1 User escaped back manually. + 2 A trigger string was encountered. + 3 IKSD entered server mode. + 4 Application Program Command received from host. + 5 Idle timeout. + 6 Telnet protocol error. + 7 Keystroke macro. + 8 Time limit exceeded. + 100 Internal error. + 101 Carrier required by not detected. + 102 I/O error on connection. + 103 Disconnected by host. + 104 Disconnected by user. + 105 Session limit exceeded. + 106 Rejected due to Telnet policy. + 107 Received kill signal. + + Values 100 and above indicate there is no connection. + + [ [552]Top ] [ [553]Contents ] [ [554]C-Kermit Home ] [ [555]Kermit + Home ] + __________________________________________________________________________ + +13. CHARACTER SETS + + See the section on [556]file scanning above, and the section on + character-set conversion in [557]FTP. Also: + + * True support for CP1252 (rather than treating it as Latin-1). + * Proper handling of C1 values when converting ISO 8-bit text to + UTF-8. + * TYPE /CHARACTER-SET: /TRANSLATE-TO: allows specific translations. + * The TRANSLATE command now works on multiple files. + * K_CHARSET environment variable to set the file character-set. + * SET TRANSFER TRANSLATION OFF. + * FTP client character-set translation ([558]Section 3.7). + + [ [559]Top ] [ [560]Contents ] [ [561]C-Kermit Home ] [ [562]Kermit + Home ] + __________________________________________________________________________ + +14. DIALOUT FROM TELNET TERMINAL SERVERS + + For years, C-Kermit has supported dialing out from Telnet modem + servers (also called reverse terminal servers or access servers), but + until now there was no way for Kermit to control the communication + parameters (speed, parity, etc) on the serial port of the terminal + server; it had to use whatever was there. + + But now, if you make a connection to a server that supports the Telnet + Com Port Control Option, [563]RFC 2217, you have the same degree of + control as you would have over a serial port on the computer where + Kermit is running: SET SPEED, SET FLOW, SET PARITY, SET STOP-BITS, + SHOW COMM, WAIT, SET CARRIER-WATCH, the modem-signal variables, + sending Break, and so on, apply to the connection between the terminal + server and the modem. + + For example, using a Cisco Access Server 2509, where specifying a TCP + port in the 6000's selects a serial port that can be used for dialing + out: + + set host xxx 6001 ; xxx is the IP hostname or address of the server + (log in if necessary) ; With a script or by hand + set modem type usr ; Tell Kermit what kind of modem it has + set speed 57600 ; This affects the server's port + set flow rts/cts ; Ditto + dial 7654321 + + The modem server might or might not require a login sequence. It might + also allow for automatic authentication, e.g. via Kerberos tickets. + NOTE: If the modem server requires a login sequence, then REDIAL might + not work as expected. + + When you have a Telnet Com Port connection, your SET SPEED and SET + FLOW options change automatically to reflect the capabilities of the + server, rather than those of your local computer. + + See the configuration manual for your server for additional + information. For example, how to set up the server to drop the Telnet + connection automatically when the telephone call is hung up (e.g. + "autohangup" on Cisco models). + + For a Linux-based Telnet Com-Port server, click the Srdird link: + + [ [564]Top ] [ [565]Contents ] [ [566]Sredird ] [ [567]C-Kermit Home ] + [ [568]Kermit Home ] + __________________________________________________________________________ + +15. COPING WITH BROKEN KERMIT PARTNERS + + There are lots of faulty Kermit protocol implementations out there, + found mainly in 3rd-party products ranging from communications + software packages to file-transfer functions imbedded within devices. + This topic is covered [569]HERE for C-Kermit 7.0, but C-Kermit 8.0 + adds some additional tricks. + + SET ATTRIBUTE RECORD-FORMAT { ON, OFF } + Allows control of the Kermit's Record-Format attribute. Set + this to OFF in case incoming file are refused due to unknown or + invalid record formats if you want to accept the file anyway. + + SET SEND I-PACKETS { ON, OFF } + A Kermit server is supposed to accept I-packets; this is how + the client lets the server know its capabilities and + preferences before sending a command. Apparently there is at + least one Kermit server implementation that does not accept + I-packets, and does not properly respond with an Error packet + if it gets one. To get around such situations in C-Kermit 8.0, + you can use SET SEND I-PACKETS OFF to inhibit the sending of I + packets. In this case, the client must be able to adjust to the + server's configuration, rather than the other way around as we + are used to. + + SET PROTOCOL KERMIT {} {} {} + C-Kermit 6.0 and later automatically send "autoupload" and + "autodownload" commands when in local mode and you give a file + transfer command. For example, if you tell kermit to "send + oofa.txt", Kermit sends "kermit -r" and a carriage return, in + case you had forgotten to start Kermit on the far end and told + it to receive a file. If a Kermit program had already been + started on the far end, it should harmlessly absorb this + string. However, some Kermit programs violate the Kermit + protocol definition and treat such strings as Kermit packets + even though they are not. In such cases, give this command to + set the Kermit protocol autoupload and download strings to + nothing, which tells Kermit not to send them. (This is not a + new feature, but it was not previously included in the "Coping" + section of the documentation.) + + [ [570]Top ] [ [571]Contents ] [ [572]C-Kermit Home ] [ [573]Kermit + Home ] + __________________________________________________________________________ + +16. NEW COMMAND-LINE OPTIONS + + kermit -h Now prints a complete listing of its command-line options, + rather than an abbreviated list squeezed into a 24x80 space. + + -dd Debug, like -d but adds timestamps + --version Shows C-Kermit version number. + --noperms Equivalent to SET ATTRIBUTE PROTECTION OFF. + + Kermit now accepts a selection of URLs (Universal Resource Locators) + as its first command-line argument. These are: + + telnet:hostname + Makes a Telnet connection to the given host (IP hostname or + address). + + ftp://[user[:password]@]hostname[/path...] + Makes an FTP connection to the given host (IP hostname or + address). If a username is given, Kermit tries to log you in; + if a password is given, it is used; if not, you are prompted + for one. If no username is given, an anonymous login is + performed. If a pathname is included, Kermit tries to GET the + given file. See [574]Section 3.1.3 for details. + + ftps://[user[:password]@]hostname[/path...] + Makes a secure FTP connection over SSL. + + telnets://[user[:password]@]hostname + Makes a secure Telnet connection over SSL. + + kermit://[user[:password]@]hostname[/path...] + Makes a connection to an [575]Internet Kermit Server. + + http://[user[:password]@]hostname[/path...] + Makes a connection to Web server. + + https://[user[:password]@]hostname[/path...] + Makes a connection to secure Web server. + + [ [576]Top ] [ [577]Contents ] [ [578]C-Kermit Home ] [ [579]Kermit + Home ] + __________________________________________________________________________ + +17. LOGS + + In C-Kermit 8.0, we make an effort to keep passwords out of the debug + log. This can never be 100% effective, but it's better than before, + when there were no precautions at all. Whenever Kermit knows it's + prompting for, parsing, or transmitting a password, it temporarily + turns off logging and then turns it back on afterwards. This keeps the + debug log password-free in most common cases, but there can be no + guarantees. + + As noted elsewhere, the new "-dd" command-line option selects a + timestamped debug log (equivalent to "set debug timestamps on", "log + debug debug.log"). + + C-Kermit 8.0 also supports a new timestamped session log via "set + session-log timestamped-text", "log session". + + There have been requests for other kinds of logs, for example a + command log. These might be added at some point. One person wanted to + be able to log commands with timestamps, but only commands issued at + the prompt, not commands from files or macros, and also wanted a + header line at the beginning showing the date, user, and host. This + can be done as follows: + + .filename := \v(home)commands.log ; (for example) + fopen /write \%c \m(filename) + if success { + fwrite /line \%c \v(date): User=\v(user) Host=\v(host) + fclose \%c + set debug timestamps on + log debug {| grep "CMD(P)" >> \m(filename)} append + } + + [ [580]Top ] [ [581]Contents ] [ [582]C-Kermit Home ] [ [583]Kermit + Home ] + _________________________________________________________________ + + C-Kermit 8.0 Update Notes / [584]The Kermit Project / Columbia + University / 15 Dec 2003 + +References + + 1. http://www.columbia.edu/kermit/ckermit80.html#contents + 2. http://www.columbia.edu/kermit/ckermit.html + 3. http://www.columbia.edu/kermit/index.html + 4. http://www.columbia.edu/kermit/ckermit80.html + 5. mailto:kermit-support@columbia.edu + 6. http://www.columbia.edu/kermit/ + 7. http://www.kermit-project.org/ + 8. http://www.columbia.nyc.ny.us/kermit/ + 9. ftp://kermit.columbia.edu/kermit/f/COPYING.TXT + 10. ftp://kermit.columbia.edu/kermit/f/ckcmai.c + 11. http://www.columbia.edu/kermit/ckermit80.html#xv + 12. http://www.columbia.edu/kermit/ck60manual.html + 13. http://www.columbia.edu/kermit/ckermi70.html + 14. ftp://kermit.columbia.edu/kermit/f/ckermit70.txt + 15. http://www.columbia.edu/kermit/ckututor.html + 16. ftp://kermit.columbia.edu/kermit/f/ckuker.nr + 17. http://www.columbia.edu/kermit/security.htm + 18. http://www.columbia.edu/kermit/telnet.htm + 19. http://www.columbia.edu/kermit/ftpscripts.html + 20. http://www.columbia.edu/kermit/ckcbwr.html + 21. ftp://kermit.columbia.edu/kermit/f/ckcbwr.txt + 22. http://www.columbia.edu/kermit/ckubwr.html + 23. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt + 24. http://www.columbia.edu/kermit/ckvbwr.html + 25. ftp://kermit.columbia.edu/kermit/f/ckvbwr.txt + 26. http://www.columbia.edu/kermit/ckuins.html + 27. ftp://kermit.columbia.edu/kermit/f/ckuins.txt + 28. http://www.columbia.edu/kermit/ckvins.html + 29. ftp://kermit.columbia.edu/kermit/f/ckvins.txt + 30. http://www.columbia.edu/kermit/ckccfg.html + 31. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt + 32. http://www.columbia.edu/kermit/ckcplm.html + 33. ftp://kermit.columbia.edu/kermit/f/ckcplm.txt + 34. http://www.columbia.edu/kermit/iksd.html + 35. http://www.columbia.edu/kermit/skermit.html + 36. http://www.columbia.edu/kermit/ckermit80.html#top + 37. http://www.columbia.edu/kermit/ckermit.html + 38. http://www.columbia.edu/kermit/index.html + 39. http://www.columbia.edu/kermit/ckermit80.html#x0 + 40. http://www.columbia.edu/kermit/ckermit80.html#x1 + 41. http://www.columbia.edu/kermit/ckermit80.html#x2 + 42. http://www.columbia.edu/kermit/ckermit80.html#x2.1 + 43. http://www.columbia.edu/kermit/ckermit80.html#x2.2 + 44. http://www.columbia.edu/kermit/ckermit80.html#x2.2.1 + 45. http://www.columbia.edu/kermit/ckermit80.html#x2.2.2 + 46. http://www.columbia.edu/kermit/ckermit80.html#x2.2.3 + 47. http://www.columbia.edu/kermit/ckermit80.html#x2.2.4 + 48. http://www.columbia.edu/kermit/ckermit80.html#x2.2.5 + 49. http://www.columbia.edu/kermit/ckermit80.html#x2.2.6 + 50. http://www.columbia.edu/kermit/ckermit80.html#x3 + 51. http://www.columbia.edu/kermit/ckermit80.html#x3.1 + 52. http://www.columbia.edu/kermit/ckermit80.html#x3.1.1 + 53. http://www.columbia.edu/kermit/ckermit80.html#x3.1.2 + 54. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3 + 55. http://www.columbia.edu/kermit/ckermit80.html#x3.1.4 + 56. http://www.columbia.edu/kermit/ckermit80.html#x3.2 + 57. http://www.columbia.edu/kermit/ckermit80.html#x3.3 + 58. http://www.columbia.edu/kermit/ckermit80.html#x3.4 + 59. http://www.columbia.edu/kermit/ckermit80.html#x3.5 + 60. http://www.columbia.edu/kermit/ckermit80.html#x3.5.1 + 61. http://www.columbia.edu/kermit/ckermit80.html#x3.5.2 + 62. http://www.columbia.edu/kermit/ckermit80.html#x3.5.3 + 63. http://www.columbia.edu/kermit/ckermit80.html#x3.6 + 64. http://www.columbia.edu/kermit/ckermit80.html#x3.6.1 + 65. http://www.columbia.edu/kermit/ckermit80.html#x3.6.2 + 66. http://www.columbia.edu/kermit/ckermit80.html#x3.6.3 + 67. http://www.columbia.edu/kermit/ckermit80.html#x3.7 + 68. http://www.columbia.edu/kermit/ckermit80.html#x3.7.1 + 69. http://www.columbia.edu/kermit/ckermit80.html#x3.7.2 + 70. http://www.columbia.edu/kermit/ckermit80.html#x3.8 + 71. http://www.columbia.edu/kermit/ckermit80.html#x3.9 + 72. http://www.columbia.edu/kermit/ckermit80.html#x3.10 + 73. http://www.columbia.edu/kermit/ckermit80.html#x3.10.1 + 74. http://www.columbia.edu/kermit/ckermit80.html#x3.10.2 + 75. http://www.columbia.edu/kermit/ckermit80.html#x3.10.3 + 76. http://www.columbia.edu/kermit/ckermit80.html#x3.11 + 77. http://www.columbia.edu/kermit/ckermit80.html#x4 + 78. http://www.columbia.edu/kermit/ckermit80.html#x5 + 79. http://www.columbia.edu/kermit/ckermit80.html#x6 + 80. http://www.columbia.edu/kermit/ckermit80.html#x6.1 + 81. http://www.columbia.edu/kermit/ckermit80.html#x6.2 + 82. http://www.columbia.edu/kermit/ckermit80.html#x6.3 + 83. http://www.columbia.edu/kermit/ckermit80.html#x6.4 + 84. http://www.columbia.edu/kermit/ckermit80.html#x6.5 + 85. http://www.columbia.edu/kermit/ckermit80.html#x6.6 + 86. http://www.columbia.edu/kermit/ckermit80.html#x7 + 87. http://www.columbia.edu/kermit/ckermit80.html#x8 + 88. http://www.columbia.edu/kermit/ckermit80.html#x8.1 + 89. http://www.columbia.edu/kermit/ckermit80.html#x8.2 + 90. http://www.columbia.edu/kermit/ckermit80.html#x8.3 + 91. http://www.columbia.edu/kermit/ckermit80.html#x8.4 + 92. http://www.columbia.edu/kermit/ckermit80.html#x8.5 + 93. http://www.columbia.edu/kermit/ckermit80.html#x8.6 + 94. http://www.columbia.edu/kermit/ckermit80.html#x8.7 + 95. http://www.columbia.edu/kermit/ckermit80.html#x8.8 + 96. http://www.columbia.edu/kermit/ckermit80.html#x8.9 + 97. http://www.columbia.edu/kermit/ckermit80.html#x8.10 + 98. http://www.columbia.edu/kermit/ckermit80.html#x8.11 + 99. http://www.columbia.edu/kermit/ckermit80.html#x8.12 + 100. http://www.columbia.edu/kermit/ckermit80.html#x8.13 + 101. http://www.columbia.edu/kermit/ckermit80.html#x8.14 + 102. http://www.columbia.edu/kermit/ckermit80.html#x9 + 103. http://www.columbia.edu/kermit/ckermit80.html#x9.1 + 104. http://www.columbia.edu/kermit/ckermit80.html#x9.2 + 105. http://www.columbia.edu/kermit/ckermit80.html#x9.3 + 106. http://www.columbia.edu/kermit/ckermit80.html#x9.4 + 107. http://www.columbia.edu/kermit/ckermit80.html#x9.5 + 108. http://www.columbia.edu/kermit/ckermit80.html#x9.6 + 109. http://www.columbia.edu/kermit/ckermit80.html#x9.7 + 110. http://www.columbia.edu/kermit/ckermit80.html#x9.8 + 111. http://www.columbia.edu/kermit/ckermit80.html#x9.9 + 112. http://www.columbia.edu/kermit/ckermit80.html#x9.10 + 113. http://www.columbia.edu/kermit/ckermit80.html#x9.11 + 114. http://www.columbia.edu/kermit/ckermit80.html#x10 + 115. http://www.columbia.edu/kermit/ckermit80.html#x11 + 116. http://www.columbia.edu/kermit/ckermit80.html#x12 + 117. http://www.columbia.edu/kermit/ckermit80.html#x13 + 118. http://www.columbia.edu/kermit/ckermit80.html#x14 + 119. http://www.columbia.edu/kermit/ckermit80.html#x15 + 120. http://www.columbia.edu/kermit/ckermit80.html#x16 + 121. http://www.columbia.edu/kermit/ckermit80.html#x17 + 122. http://www.columbia.edu/kermit/ckermit80.html#top + 123. http://www.columbia.edu/kermit/ckermit.html + 124. http://www.columbia.edu/kermit/index.html + 125. http://www.columbia.edu/kermit/ckuins.html#x5 + 126. http://www.columbia.edu/kermit/ckuins.html + 127. http://www.columbia.edu/kermit/ckermit80.html#x5 + 128. http://www.columbia.edu/kermit/ckermit80.html#x2.2 + 129. http://www.columbia.edu/kermit/ckermit80.html#contents + 130. http://www.columbia.edu/kermit/ckermit80.html#x15 + 131. http://www.columbia.edu/kermit/ckermit80.html#x3.7 + 132. http://www.columbia.edu/kermit/ckermit80.html#ftpdates + 133. http://www.columbia.edu/kermit/ckermit80.html#ftpcheck + 134. http://www.columbia.edu/kermit/ckermit80.html#ftpnamelist + 135. http://www.columbia.edu/kermit/ckermit80.html#srvrename + 136. http://www.columbia.edu/kermit/ckermit80.html#ftpvdir + 137. http://www.columbia.edu/kermit/ckermit80.html#setftptype + 138. http://www.columbia.edu/kermit/ckermit80.html#x3.6 + 139. http://www.columbia.edu/kermit/ckermit80.html#x15 + 140. http://www.columbia.edu/kermit/ckermit80.html#x8.7 + 141. http://www.columbia.edu/kermit/ckermit80.html#x2.1 + 142. http://www.columbia.edu/kermit/ckermit80.html#x2.2 + 143. http://www.columbia.edu/kermit/ckermit80.html#x8.14 + 144. http://www.columbia.edu/kermit/ckermit80.html#x8.13 + 145. http://www.columbia.edu/kermit/ckermit80.html#x8.13 + 146. http://www.columbia.edu/kermit/ckututor.html + 147. http://www.columbia.edu/kermit/ckuins.html + 148. http://www.columbia.edu/kermit/skermit.html + 149. http://www.columbia.edu/kermit/ckermit80.html#setlocus + 150. http://www.columbia.edu/kermit/ckermit80.html#lcommands + 151. http://www.columbia.edu/kermit/ckermit80.html#ftpuser + 152. http://www.columbia.edu/kermit/ckermit80.html#showvar + 153. http://www.columbia.edu/kermit/ckermit80.html#callerid + 154. http://www.columbia.edu/kermit/ckermit80.html#x6.6 + 155. http://www.columbia.edu/kermit/ckermit80.html#x0 + 156. http://www.columbia.edu/kermit/ckermit80.html#x3.11 + 157. http://www.columbia.edu/kermit/ckermit80.html#top + 158. http://www.columbia.edu/kermit/ckermit80.html#contents + 159. http://www.columbia.edu/kermit/ckermit.html + 160. http://www.columbia.edu/kermit/index.html + 161. http://www.columbia.edu/kermit/ckermit80.html#x0 + 162. http://www.columbia.edu/kermit/ckermit80.html#top + 163. http://www.columbia.edu/kermit/ckermit80.html#contents + 164. http://www.columbia.edu/kermit/ckermit.html + 165. http://www.columbia.edu/kermit/index.html + 166. http://www.columbia.edu/kermit/k95.html + 167. http://www.columbia.edu/kermit/sshclient.html + 168. http://www.columbia.edu/kermit/skermit.html + 169. http://www.columbia.edu/kermit/skermit.html + 170. http://www.columbia.edu/kermit/sshclien.htm + 171. http://www.columbia.edu/kermit/ckermit80.html#x3 + 172. ftp://ftp.isi.edu/in-notes/rfc1738.txt + 173. http://www.columbia.edu/kermit/ckermit80.html#x2.2.2 + 174. http://www.columbia.edu/kermit/ckermit80.html#x2.2.1 + 175. ftp://ftp.isi.edu/in-notes/rfc2396.txt + 176. ftp://ftp.isi.edu/in-notes/rfc2616.txt + 177. http://www.columbia.edu/kermit/ckermit80.html#x2.2.3 + 178. ftp://ftp.isi.edu/in-notes/rfc2616.txt + 179. http://www.columbia.edu/kermit/ckermit80.html#x8.13.7 + 180. http://www.columbia.edu/kermit/security.htm#x5.4 + 181. http://www.columbia.edu/kermit/security.htm#x15 + 182. http://www.columbia.edu/kermit/security.htm#x6.2 + 183. http://www.columbia.edu/kermit/security.html + 184. http://www.columbia.edu/kermit/ckermit80.html#x16 + 185. http://www.columbia.edu/kermit/ckermit80.html#top + 186. http://www.columbia.edu/kermit/ckermit80.html#contents + 187. http://www.columbia.edu/kermit/ckermit.html + 188. http://www.columbia.edu/kermit/index.html + 189. http://www.columbia.edu/kermit/ckermit80.html#x3.1 + 190. http://www.columbia.edu/kermit/ckermit80.html#x3.2 + 191. http://www.columbia.edu/kermit/ckermit80.html#x3.3 + 192. http://www.columbia.edu/kermit/ckermit80.html#x3.4 + 193. http://www.columbia.edu/kermit/ckermit80.html#x3.5 + 194. http://www.columbia.edu/kermit/ckermit80.html#x3.6 + 195. http://www.columbia.edu/kermit/ckermit80.html#x3.7 + 196. http://www.columbia.edu/kermit/ckermit80.html#x3.8 + 197. http://www.columbia.edu/kermit/ckermit80.html#x3.9 + 198. http://www.columbia.edu/kermit/ckermit80.html#x3.10 + 199. http://www.columbia.edu/kermit/ckermit80.html#x3.11 + 200. http://www.columbia.edu/kermit/security.htm + 201. http://www.columbia.edu/kermit/security.htm#servers + 202. http://www.columbia.edu/kermit/ckcsets.html + 203. http://www.columbia.edu/kermit/unicode.html + 204. http://www.columbia.edu/kermit/ckermi70.htm#x1.5.4 + 205. http://www.columbia.edu/kermit/case10.html + 206. http://www.columbia.edu/kermit/ckermit80.html#x4 + 207. http://www.columbia.edu/kermit/ckermit80.html#x3.11 + 208. http://www.columbia.edu/kermit/ftpscripts.html + 209. http://www.columbia.edu/kermit/ckermit80.html#top + 210. http://www.columbia.edu/kermit/ckermit80.html#ftp + 211. http://www.columbia.edu/kermit/ftpclient.html + 212. http://www.columbia.edu/kermit/ftpscripts.html + 213. http://www.columbia.edu/kermit/ckermit.html + 214. http://www.columbia.edu/kermit/index.html + 215. http://www.columbia.edu/kermit/ckermit80.html#x3.1.1 + 216. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3 + 217. http://www.columbia.edu/kermit/ckermit80.html#x3.1.4 + 218. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3 + 219. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3 + 220. http://www.columbia.edu/kermit/ckermit80.html#x3.2 + 221. http://www.columbia.edu/kermit/ckermit80.html#x3.5 + 222. http://www.columbia.edu/kermit/ckermit80.html#x3.6 + 223. http://www.columbia.edu/kermit/ftpscripts.html + 224. http://www.columbia.edu/kermit/ckb2.htm + 225. http://www.columbia.edu/kermit/ckermit80.html#ftpautolog + 226. http://www.columbia.edu/kermit/ckermit80.html#ftpuser + 227. http://www.columbia.edu/kermit/ckermit80.html#x3.8 + 228. http://www.columbia.edu/kermit/ckermit80.html#x3.8 + 229. http://www.columbia.edu/kermit/ckermit80.html#top + 230. http://www.columbia.edu/kermit/ckermit80.html#ftp + 231. http://www.columbia.edu/kermit/ckermit.html + 232. http://www.columbia.edu/kermit/index.html + 233. http://www.columbia.edu/kermit/ibm_ie.html + 234. http://www.columbia.edu/kermit/ckermit80.html#x3.10 + 235. http://www.columbia.edu/kermit/ckermit80.html#top + 236. http://www.columbia.edu/kermit/ckermit80.html#ftp + 237. http://www.columbia.edu/kermit/ckermit.html + 238. http://www.columbia.edu/kermit/index.html + 239. http://www.columbia.edu/kermit/ck60manual.html + 240. http://www.columbia.edu/kermit/ckermit70.html#x4.17 + 241. http://www.columbia.edu/kermit/ckermit70.html + 242. http://www.columbia.edu/kermit/ckermit80.html#x3.6 + 243. http://www.columbia.edu/kermit/ckermit80.html#x3.11 + 244. http://www.columbia.edu/kermit/ckermit80.html#x3.1.4 + 245. http://www.columbia.edu/kermit/security.html + 246. http://www.columbia.edu/kermit/ckermit80.html#x3.7 + 247. http://www.columbia.edu/kermit/ckermit80.html#x3.7 + 248. http://www.columbia.edu/kermit/ckermit80.html#x8.13.4 + 249. http://www.columbia.edu/kermit/ckermit80.html#permswitch + 250. http://www.columbia.edu/kermit/ckermit80.html#ftpchmod + 251. http://www.columbia.edu/kermit/ckermit80.html#x3.6.2 + 252. http://www.columbia.edu/kermit/ckermit80.html#x4 + 253. http://www.columbia.edu/kermit/ckermit80.html#top + 254. http://www.columbia.edu/kermit/ckermit80.html#ftp + 255. http://www.columbia.edu/kermit/ckermit.html + 256. http://www.columbia.edu/kermit/index.html + 257. http://www.columbia.edu/kermit/ckermit80.html#x7 + 258. http://www.columbia.edu/kermit/ckermit80.html#x3.8 + 259. http://www.columbia.edu/kermit/ckermit80.html#x3.8 + 260. http://www.columbia.edu/kermit/ckb2.htm + 261. http://www.columbia.edu/kermit/ckermit80.html#x3.10 + 262. http://www.columbia.edu/kermit/ckermit80.html#x3.10 + 263. http://www.columbia.edu/kermit/ckermit80.html#x3.6 + 264. http://www.columbia.edu/kermit/ckermit80.html#setftptype + 265. http://www.columbia.edu/kermit/ckermit80.html#top + 266. http://www.columbia.edu/kermit/ckermit80.html#ftp + 267. http://www.columbia.edu/kermit/ckermit.html + 268. http://www.columbia.edu/kermit/index.html + 269. http://www.columbia.edu/kermit/ckermit70.html#x4.9 + 270. http://www.columbia.edu/kermit/ckermit80.html#x3.5.1 + 271. http://www.columbia.edu/kermit/ckermit80.html#erroraction + 272. http://www.columbia.edu/kermit/ckermit70.html#x1.5 + 273. http://www.columbia.edu/kermit/ckermit70.html#x4.7 + 274. http://www.columbia.edu/kermit/ckermit70.html#x1.6 + 275. http://www.columbia.edu/kermit/ckermit80.html#x8.13 + 276. http://www.columbia.edu/kermit/ckermi70.htm#x1.5.4 + 277. http://www.columbia.edu/kermit/ckermi70.htm + 278. http://www.columbia.edu/kermit/ckermit80.html#x4 + 279. http://www.columbia.edu/kermit/ckermit80.html#x3.7 + 280. http://www.columbia.edu/kermit/ckermit80.html#x3.5.2 + 281. http://www.columbia.edu/kermit/ckermit80.html#x3.7 + 282. http://www.columbia.edu/kermit/ckermit80.html#erroraction + 283. http://www.columbia.edu/kermit/ckermit80.html#x3.5.2 + 284. http://www.columbia.edu/kermit/ckermit80.html#erroraction + 285. http://www.columbia.edu/kermit/ckermit80.html#ftpfilenames + 286. http://www.columbia.edu/kermit/ckermit80.html#ftpperms + 287. http://www.columbia.edu/kermit/ckermit80.html#ftpunique + 288. http://www.columbia.edu/kermit/ckermit80.html#ftpfilenames + 289. http://www.columbia.edu/kermit/ckermit80.html#note_utc + 290. http://www.columbia.edu/kermit/ckermit80.html#note_date + 291. http://www.columbia.edu/kermit/ckermit80.html#x3.6 + 292. http://www.boulder.nist.gov/timefreq/faq/faq.htm#10: + 293. http://www.columbia.edu/kermit/ckermit80.html#x3.7 + 294. http://www.columbia.edu/kermit/ckermit80.html#top + 295. http://www.columbia.edu/kermit/ckermit80.html#ftp + 296. http://www.columbia.edu/kermit/ckermit.html + 297. http://www.columbia.edu/kermit/index.html + 298. http://www.columbia.edu/kermit/ckermit80.html#x3.11 + 299. http://www.columbia.edu/kermit/ckermi70.htm#x4.3 + 300. http://www.columbia.edu/kermit/ckermit70.html + 301. http://www.columbia.edu/kermit/ckermit80.html#x5 + 302. http://www.columbia.edu/kermit/ckermit80.html#x3.6.3 + 303. http://www.columbia.edu/kermit/ckermit80.html#ftpfilenames + 304. http://www.columbia.edu/kermit/ckermi70.htm#x4.1 + 305. http://www.columbia.edu/kermit/ckermi70.htm#x4.2.2 + 306. http://www.columbia.edu/kermit/ckermi70.htm#x1.5.4 + 307. http://www.columbia.edu/kermit/ckermit80.html#x3.6.2 + 308. http://www.columbia.edu/kermit/ckermit80.html#x3.11 + 309. http://www.columbia.edu/kermit/ckermit80.html#x3.11 + 310. http://www.columbia.edu/kermit/ckermit80.html#srvrename + 311. http://www.columbia.edu/kermit/ckermi70.htm#x4.1 + 312. http://www.columbia.edu/kermit/ckermi70.htm + 313. http://www.columbia.edu/kermit/ckb2.htm + 314. http://www.columbia.edu/kermit/ckermit80.html#ftpfilenames + 315. http://www.columbia.edu/kermit/ckermit80.html#x3.5.3 + 316. http://www.proftpd.net/ + 317. http://www.columbia.edu/kermit/ckermit80.html#top + 318. http://www.columbia.edu/kermit/ckermit80.html#ftp + 319. http://www.columbia.edu/kermit/ckermit.html + 320. http://www.columbia.edu/kermit/index.html + 321. http://www.columbia.edu/kermit/ckb2.htm + 322. http://www.columbia.edu/kermit/ckcsets.html + 323. http://www.columbia.edu/kermit/unicode.html + 324. http://www.columbia.edu/kermit/ckcsets.html + 325. http://www.columbia.edu/kermit/ckcsets.html + 326. http://www.columbia.edu/kermit/ckermit80.html#x4 + 327. http://www.columbia.edu/kermit/utf8.html + 328. http://www.columbia.edu/kermit/ckcsets.html + 329. http://www.columbia.edu/kermit/ckermit80.html#x4 + 330. ftp://ftp.isi.edu/in-notes/rfc2640.txt + 331. http://www.columbia.edu/kermit/ckermit80.html#top + 332. http://www.columbia.edu/kermit/ckermit80.html#ftp + 333. http://www.columbia.edu/kermit/ckermit.html + 334. http://www.columbia.edu/kermit/index.html + 335. http://www.columbia.edu/kermit/ckermit80.html#top + 336. http://www.columbia.edu/kermit/ckermit80.html#ftp + 337. http://www.columbia.edu/kermit/ckermit.html + 338. http://www.columbia.edu/kermit/index.html + 339. http://www.columbia.edu/kermit/ckermit80.html#top + 340. http://www.columbia.edu/kermit/ckermit80.html#ftp + 341. http://www.columbia.edu/kermit/ckermit.html + 342. http://www.columbia.edu/kermit/index.html + 343. http://www.columbia.edu/kermit/ftpscripts.html + 344. http://www.columbia.edu/kermit/ckermit80.html#x3.2 + 345. http://www.columbia.edu/kermit/ckermit80.html#x3.2 + 346. ftp://ftp.isi.edu/in-notes/rfc959.txt + 347. http://www.columbia.edu/kermit/ckscripts.html + 348. http://www.columbia.edu/kermit/ckermit80.html#top + 349. http://www.columbia.edu/kermit/ckermit80.html#ftp + 350. http://www.columbia.edu/kermit/ftpscript.html + 351. http://www.columbia.edu/kermit/ckermit.html + 352. http://www.columbia.edu/kermit/index.html + 353. http://www.columbia.edu/kermit/ckermit80.html#x3.11.1 + 354. http://www.columbia.edu/kermit/ckermit80.html#x3.11.2 + 355. http://www.columbia.edu/kermit/ckermit80.html#x3.11.3 + 356. http://www.columbia.edu/kermit/ckermit80.html#x3.11.4 + 357. http://www.columbia.edu/kermit/ckermit80.html#x3.11.5 + 358. http://www.columbia.edu/kermit/ckermit.html + 359. http://www.columbia.edu/kermit/k95.html + 360. http://www.columbia.edu/kermit/ckermit80.html#x3.11.5 + 361. ftp://ftp.isi.edu/in-notes/rfc959.txt + 362. ftp://ftp.isi.edu/in-notes/rfc2389.txt + 363. http://www.ietf.org/internet-drafts/draft-ietf-ftpext-mlst-16.txt + 364. http://www.columbia.edu/kermit/ftpclient.html + 365. http://www.columbia.edu/kermit/ckermit80.html#top + 366. http://www.columbia.edu/kermit/ckermit80.html#ftp + 367. http://www.columbia.edu/kermit/ckermit.html + 368. http://www.columbia.edu/kermit/index.html + 369. http://www.columbia.edu/kermit/ckermit80.html#x3 + 370. http://www.columbia.edu/kermit/ckermit80.html#ucs2 + 371. http://www.columbia.edu/kermit/ckermit80.html#top + 372. http://www.columbia.edu/kermit/ckermit80.html#contents + 373. http://www.columbia.edu/kermit/ckermit.html + 374. http://www.columbia.edu/kermit/index.html + 375. http://www.columbia.edu/kermit/ckermit80.html#top + 376. http://www.columbia.edu/kermit/ckermit80.html#contents + 377. http://www.columbia.edu/kermit/ckermit.html + 378. http://www.columbia.edu/kermit/index.html + 379. http://www.columbia.edu/kermit/ckb2.htm + 380. http://www.columbia.edu/kermit/ckermit80.html#top + 381. http://www.columbia.edu/kermit/ckermit80.html#contents + 382. http://www.columbia.edu/kermit/ckermit.html + 383. http://www.columbia.edu/kermit/index.html + 384. http://www.columbia.edu/kermit/ckermit80.html#x4 + 385. http://www.columbia.edu/kermit/ckermit80.html#x4 + 386. http://www.columbia.edu/kermit/ckermit80.html#x8.12 + 387. http://www.columbia.edu/kermit/ckermit80.html#x8.1 + 388. http://www.columbia.edu/kermit/ckermit80.html#x12 + 389. http://www.columbia.edu/kermit/ckermit80.html#x8.12 + 390. http://www.columbia.edu/kermit/ckermit80.html#top + 391. http://www.columbia.edu/kermit/ckermit80.html#contents + 392. http://www.columbia.edu/kermit/ckermit.html + 393. http://www.columbia.edu/kermit/index.html + 394. http://www.columbia.edu/kermit/ckermit80.html#x8.14 + 395. http://www.columbia.edu/kermit/ckermit80.html#top + 396. http://www.columbia.edu/kermit/ckermit80.html#contents + 397. http://www.columbia.edu/kermit/ckermit.html + 398. http://www.columbia.edu/kermit/index.html + 399. http://www.columbia.edu/kermit/ckermit80.html#x9 + 400. http://www.columbia.edu/kermit/ckermit80.html#top + 401. http://www.columbia.edu/kermit/ckermit80.html#contents + 402. http://www.columbia.edu/kermit/ckermit.html + 403. http://www.columbia.edu/kermit/index.html + 404. http://www.columbia.edu/kermit/ckermit80.html#x8.6 + 405. http://www.columbia.edu/kermit/ckermit80.html#top + 406. http://www.columbia.edu/kermit/ckermit80.html#contents + 407. http://www.columbia.edu/kermit/ckermit.html + 408. http://www.columbia.edu/kermit/index.html + 409. http://www.columbia.edu/kermit/ckermit80.html#top + 410. http://www.columbia.edu/kermit/ckermit80.html#contents + 411. http://www.columbia.edu/kermit/ckermit.html + 412. http://www.columbia.edu/kermit/index.html + 413. http://www.columbia.edu/kermit/ckermit80.html#top + 414. http://www.columbia.edu/kermit/ckermit80.html#contents + 415. http://www.columbia.edu/kermit/ckermit.html + 416. http://www.columbia.edu/kermit/index.html + 417. http://www.columbia.edu/kermit/ckermit80.html#fjoin + 418. http://www.columbia.edu/kermit/ckermit80.html#fsplit + 419. http://www.columbia.edu/kermit/ckermit80.html#x8.10 + 420. http://www.columbia.edu/kermit/ckermit80.html#top + 421. http://www.columbia.edu/kermit/ckermit80.html#contents + 422. http://www.columbia.edu/kermit/ckermit.html + 423. http://www.columbia.edu/kermit/index.html + 424. http://www.columbia.edu/kermit/ckermit80.html#x9 + 425. http://www.columbia.edu/kermit/ckermit80.html#x9 + 426. http://www.columbia.edu/kermit/ckermit80.html#x9 + 427. http://www.columbia.edu/kermit/ckermit80.html#x3 + 428. http://www.columbia.edu/kermit/ckermit80.html#x3 + 429. http://www.columbia.edu/kermit/ckermit80.html#x3.2 + 430. http://www.columbia.edu/kermit/ckermit80.html#x3.2 + 431. http://www.columbia.edu/kermit/ckermit80.html#x3.8 + 432. http://www.columbia.edu/kermit/ckermit80.html#x3 + 433. http://www.columbia.edu/kermit/ckermit80.html#x3 + 434. http://www.columbia.edu/kermit/ckermit80.html#x3 + 435. http://www.columbia.edu/kermit/ckermit80.html#x3.2 + 436. http://www.columbia.edu/kermit/ckermit80.html#x3 + 437. http://www.columbia.edu/kermit/ckermit80.html#x8.13 + 438. http://www.columbia.edu/kermit/ckermit80.html#x8.13 + 439. http://www.columbia.edu/kermit/ckermit80.html#x9 + 440. http://www.columbia.edu/kermit/ckermit80.html#x8.10 + 441. http://www.columbia.edu/kermit/ckermit80.html#x8.7.4 + 442. http://www.columbia.edu/kermit/ckermit80.html#top + 443. http://www.columbia.edu/kermit/ckermit80.html#contents + 444. http://www.columbia.edu/kermit/ckermit.html + 445. http://www.columbia.edu/kermit/index.html + 446. http://www.columbia.edu/kermit/ckermit80.html#top + 447. http://www.columbia.edu/kermit/ckermit80.html#contents + 448. http://www.columbia.edu/kermit/ckermit.html + 449. http://www.columbia.edu/kermit/index.html + 450. http://www.columbia.edu/kermit/ckermit80.html#top + 451. http://www.columbia.edu/kermit/ckermit80.html#contents + 452. http://www.columbia.edu/kermit/ckermit.html + 453. http://www.columbia.edu/kermit/index.html + 454. http://www.columbia.edu/kermit/ckermit80.html#x8.7 + 455. http://www.columbia.edu/kermit/ckermit80.html#top + 456. http://www.columbia.edu/kermit/ckermit80.html#contents + 457. http://www.columbia.edu/kermit/ckermit.html + 458. http://www.columbia.edu/kermit/index.html + 459. http://www.columbia.edu/kermit/ckermit80.html#scriptedit + 460. http://www.columbia.edu/kermit/ckermit80.html#top + 461. http://www.columbia.edu/kermit/ckermit80.html#contents + 462. http://www.columbia.edu/kermit/ckermit.html + 463. http://www.columbia.edu/kermit/index.html + 464. http://www.columbia.edu/kermit/ckermit80.html#top + 465. http://www.columbia.edu/kermit/ckermit80.html#contents + 466. http://www.columbia.edu/kermit/ckermit.html + 467. http://www.columbia.edu/kermit/index.html + 468. ftp://ftp.isi.edu/in-notes/rfc2822.txt + 469. ftp://ftp.isi.edu/in-notes/rfc2822.txt + 470. ftp://ftp.isi.edu/in-notes/rfc2822.txt + 471. ftp://ftp.isi.edu/in-notes/rfc2822.txt + 472. http://www.columbia.edu/kermit/ckermit80.html#top + 473. http://www.columbia.edu/kermit/ckermit80.html#contents + 474. http://www.columbia.edu/kermit/ckermit.html + 475. http://www.columbia.edu/kermit/index.html + 476. http://www.columbia.edu/kermit/ckermit80.html#x8.1 + 477. http://www.columbia.edu/kermit/ckermit80.html#top + 478. http://www.columbia.edu/kermit/ckermit80.html#contents + 479. http://www.columbia.edu/kermit/ckermit.html + 480. http://www.columbia.edu/kermit/index.html + 481. http://www.columbia.edu/kermit/ckermit80.html#x8.2 + 482. http://www.columbia.edu/kermit/ckermit80.html#top + 483. http://www.columbia.edu/kermit/ckermit80.html#contents + 484. http://www.columbia.edu/kermit/ckermit.html + 485. http://www.columbia.edu/kermit/index.html + 486. http://www.columbia.edu/kermit/ckermit80.html#x9.8 + 487. http://www.columbia.edu/kermit/ckermit80.html#x9.8 + 488. http://www.columbia.edu/kermit/ckermit80.html#x8.2 + 489. http://www.columbia.edu/kermit/ckermit80.html#top + 490. http://www.columbia.edu/kermit/ckermit80.html#contents + 491. http://www.columbia.edu/kermit/ckermit.html + 492. http://www.columbia.edu/kermit/index.html + 493. http://www.columbia.edu/kermit/ckermit80.html#top + 494. http://www.columbia.edu/kermit/ckermit80.html#contents + 495. http://www.columbia.edu/kermit/ckermit.html + 496. http://www.columbia.edu/kermit/index.html + 497. http://www.columbia.edu/kermit/ckermit80.html#x9.8 + 498. http://www.columbia.edu/kermit/ckermit80.html#top + 499. http://www.columbia.edu/kermit/ckermit80.html#contents + 500. http://www.columbia.edu/kermit/ckermit.html + 501. http://www.columbia.edu/kermit/index.html + 502. http://www.columbia.edu/kermit/ckermit80.html#x9.8 + 503. http://www.columbia.edu/kermit/ckermit80.html#x9.8 + 504. http://www.columbia.edu/kermit/ckermit80.html#x9.6 + 505. http://www.columbia.edu/kermit/ckermit80.html#top + 506. http://www.columbia.edu/kermit/ckermit80.html#contents + 507. http://www.columbia.edu/kermit/ckermit.html + 508. http://www.columbia.edu/kermit/index.html + 509. http://www.columbia.edu/kermit/ckermit80.html#x9.8 + 510. http://www.columbia.edu/kermit/ckermit80.html#x9.8 + 511. http://www.columbia.edu/kermit/ckermit80.html#top + 512. http://www.columbia.edu/kermit/ckermit80.html#contents + 513. http://www.columbia.edu/kermit/ckermit.html + 514. http://www.columbia.edu/kermit/index.html + 515. http://www.columbia.edu/kermit/ckermit80.html#top + 516. http://www.columbia.edu/kermit/ckermit80.html#contents + 517. http://www.columbia.edu/kermit/ckermit.html + 518. http://www.columbia.edu/kermit/index.html + 519. http://www.columbia.edu/kermit/ckermit80.html#top + 520. http://www.columbia.edu/kermit/ckermit80.html#contents + 521. http://www.columbia.edu/kermit/ckermit.html + 522. http://www.columbia.edu/kermit/index.html + 523. mailto:thucdat@hotmail.com + 524. http://www.columbia.edu/kermit/ckermit80.html#x9.9.2 + 525. http://www.columbia.edu/kermit/ckermit80.html#top + 526. http://www.columbia.edu/kermit/ckermit80.html#contents + 527. http://www.columbia.edu/kermit/ckermit.html + 528. http://www.columbia.edu/kermit/index.html + 529. http://www.columbia.edu/kermit/ckermit80.html#top + 530. http://www.columbia.edu/kermit/ckermit80.html#contents + 531. http://www.columbia.edu/kermit/ckermit.html + 532. http://www.columbia.edu/kermit/index.html + 533. http://www.columbia.edu/kermit/ckermit80.html#top + 534. http://www.columbia.edu/kermit/ckermit80.html#contents + 535. http://www.columbia.edu/kermit/ckermit.html + 536. http://www.columbia.edu/kermit/index.html + 537. http://www.columbia.edu/kermit/ckermit80.html#x9.2 + 538. http://www.columbia.edu/kermit/ckermit80.html#top + 539. http://www.columbia.edu/kermit/ckermit80.html#contents + 540. http://www.columbia.edu/kermit/ckermit.html + 541. http://www.columbia.edu/kermit/index.html + 542. http://www.columbia.edu/kermit/ckermit80.html#x4 + 543. http://www.columbia.edu/kermit/ckermit80.html#x4 + 544. http://www.columbia.edu/kermit/ckermit80.html#top + 545. http://www.columbia.edu/kermit/ckermit80.html#contents + 546. http://www.columbia.edu/kermit/ckermit.html + 547. http://www.columbia.edu/kermit/index.html + 548. http://www.columbia.edu/kermit/ckermit80.html#top + 549. http://www.columbia.edu/kermit/ckermit80.html#contents + 550. http://www.columbia.edu/kermit/ckermit.html + 551. http://www.columbia.edu/kermit/index.html + 552. http://www.columbia.edu/kermit/ckermit80.html#top + 553. http://www.columbia.edu/kermit/ckermit80.html#contents + 554. http://www.columbia.edu/kermit/ckermit.html + 555. http://www.columbia.edu/kermit/index.html + 556. http://www.columbia.edu/kermit/ckermit80.html#x4 + 557. http://www.columbia.edu/kermit/ckermit80.html#x3.7 + 558. http://www.columbia.edu/kermit/ckermit80.html#x3.7 + 559. http://www.columbia.edu/kermit/ckermit80.html#top + 560. http://www.columbia.edu/kermit/ckermit80.html#contents + 561. http://www.columbia.edu/kermit/ckermit.html + 562. http://www.columbia.edu/kermit/index.html + 563. ftp://ftp.isi.edu/in-notes/rfc2217.txt + 564. http://www.columbia.edu/kermit/ckermit80.html#top + 565. http://www.columbia.edu/kermit/ckermit80.html#contents + 566. ftp://kermit.columbia.edu/kermit/sredird/ + 567. http://www.columbia.edu/kermit/ckermit.html + 568. http://www.columbia.edu/kermit/index.html + 569. http://www.columbia.edu/kermit/ckermi70.htm#x4.22 + 570. http://www.columbia.edu/kermit/ckermit80.html#top + 571. http://www.columbia.edu/kermit/ckermit80.html#contents + 572. http://www.columbia.edu/kermit/ckermit.html + 573. http://www.columbia.edu/kermit/index.html + 574. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3 + 575. http://www.columbia.edu/kermit/cuiksd.html + 576. http://www.columbia.edu/kermit/ckermit80.html#top + 577. http://www.columbia.edu/kermit/ckermit80.html#contents + 578. http://www.columbia.edu/kermit/ckermit.html + 579. http://www.columbia.edu/kermit/index.html + 580. http://www.columbia.edu/kermit/ckermit80.html#top + 581. http://www.columbia.edu/kermit/ckermit80.html#contents + 582. http://www.columbia.edu/kermit/ckermit.html + 583. http://www.columbia.edu/kermit/index.html + 584. http://www.columbia.edu/kermit/index.html diff --git a/ckermod.ini b/ckermod.ini new file mode 100644 index 0000000..5848c3f --- /dev/null +++ b/ckermod.ini @@ -0,0 +1,144 @@ +; File CKERMOD.INI, Sample C-Kermit 7.0 customization file. +; +; This file, which is ONLY A SAMPLE, should be called: +; +; .mykermrc (UNIX, OS-9, Aegis, BeBox, Plan 9) +; CKERMOD.INI (VMS, OpenVMS, AOS/VS, OS/2, Amiga, Atari ST) +; ckermod.ini (Stratus VOS) +; +; This file is executed automatically by the standard C-Kermit initialization +; file, CKERMIT.INI (or .kermrc). This file is not executed by C-Kermit itself +; unless the initialization file is not found. +; +; MODify this file to suit your needs and preferences, and install it in your +; home directory. Or replace it entirely with a new file. +; +; The design of this sample customization file lets you fill in a section for +; each different operating system where you run C-Kermit. +; +; In UNIX, if you give this file execute permission and make sure the top +; line indicates the full path of the C-Kermit 7.0-or-later executable, you +; can execute this file directly, as if it was a shell script, except it is +; interpreted by Kermit rather than the shell. This lets you have as many +; different startup files as you like, each suited to a particular purpose. +; +; Authors: Christine Gianone, Frank da Cruz, Jeffrey Altman, +; The Kermit Project, Columbia University. +; Creation: 23 November 1992 for C-Kermit 5A(188). +; Modified: 30 June 1993 for edit 189. +; 04 October 1994 for edit 190. +; 17 April 1995 for edit 191. +; 6 September 1996 for version 6.0, edit 192. +; 1 January 2000 for version 7.0, edit 196. +; 14 October 2001 for version 8.0, edit 200. + +ECHO +ECHO Executing SAMPLE C-Kermit customization file \v(cmdfile) for \v(system)... +ECHO { Please edit this file to reflect your needs and preferences.} +ECHO +; +; ... and then remove the ECHO commands above. + +COMMENT - Settings that apply to all the systems I use: +; +set delay 1 ; I escape back quickly +set dial display on ; I like to watch C-Kermit dial + +; Dialing locale and method +; +; SET DIAL COUNTRY-CODE 1 ; Uncomment and replace with yours +; SET DIAL AREA-CODE 000 ; Uncomment and replace with yours +; SET DIAL LD-PREFIX 1 ; Uncomment and replace with yours +; SET DIAL INTL-PREFIX 011 ; Uncomment and replace with yours +; SET DIAL METHOD TONE ; Uncomment and replace with PULSE if necessary +; SET DIAL DIRECTORY ... ... ; List dialing directory files here + +if < \v(version) 600192 - + stop 1 \v(cmdfile): C-Kermit 6.0.192 or later required. + +set take error on ; Make errors fatal temporarily +check if ; Do we have an IF command? +set take error off ; Yes we do, back to normal + +; The ON_EXIT macro is executed automatically when C-Kermit exits. +; Define as desired. +; +define ON_EXIT echo Returning you to \v(system) now. + +; System-independent quick dialing macro. Depends on having the +; macros MYMODEM, MYPORT, and (optionally) MYSPEED defined in the +; system-dependent sections below. +; +define MYDIAL { + if not defined MYMODEM end 1 {\%0: Modem type not defined.} + set modem type \m(MYMODEM) + if fail end 1 {\%0: \m(MYMODEM): Unsupported modem type.} + if not defined MYPORT end 1 {\%0: Communication port not defined.} + set port \m(MYPORT) + if fail end 1 {\%0: SET PORT \m(MYPORT) failed.} + if defined MYFLOW set flow \m(MYFLOW) + if fail end 1 {\%0: SET FLOW \m(MYFLOW) failed.} + if defined MYSPEED set speed \m(MYSPEED) + if fail end 1 {\%0: SET SPEED \m(MYSPEED) failed.} + dial \%1\%2\%3\%4\%5\%6\%7\%8\%9 + end \v(status) +} + +forward \v(system) ; Go execute system-dependent commands + +:UNIX ; UNIX, all versions... +define MYPORT /dev/cua ; My dialing environment +define MYMODEM usr ; Replace these by what you actually have +define MYSPEED 57600 +; +; If you want all your downloads to go to the same directory, no matter +; what your current directory is, uncomment and edit the following command: +; +; set file download-directory ~/download ; Download directory for UNIX + +; Put other UNIX-specific commands here... +end ; End of UNIX section + +:VMS ; VMS and OpenVMS +define MYPORT TXA0: ; My dialing environment +define MYMODEM usr ; Replace these by what you actually have +define MYSPEED 57600 +; set file download-directory [\$(USER).DOWNLOAD] ; Download directory for VMS +; Put other VMS-specific commands here... +end ; End of VMS section + +:WIN32 ; Windows and OS/2 customizations... +:OS/2 +define MYPORT COM1 ; My dialing environment +define MYMODEM usr ; Replace these by what you actually have +define MYSPEED 57600 +set command byte 8 ; Use 8 bits between Kermit and console +set xfer char latin1 ; Use Latin-1 for text file transfer +set term char latin1 ; And use Latin-1 during CONNECT mode +; set file download-directory C:\DOWNLOADS +end + +:OS9/68K ; OS-9/68000 +define MYPORT /t3 ; My dialing environment +define MYMODEM usr ; Replace these by what you actually have +define MYSPEED 9600 +; set file download-directory ~/downloads +end ; End of OS-9 section + +:AOS/VS ; Data General AOS/VS +define MYPORT @con3 ; My dialing environment +define MYMODEM usr ; Replace these by what you actually have +define MYSPEED 9600 +; set file download-directory \v(home)DOWNLOADS +end + +; And so on, you get the idea... +; Fill in the sections that apply to you. + +:Stratus_VOS ; Stratus VOS +:Amiga ; Commodore Amiga +:Atari_ST ; Atari ST +:Macintosh ; Apple Macintosh +:unknown ; Others + +; (End of CKERMOD.INI) diff --git a/ckubwr.txt b/ckubwr.txt new file mode 100644 index 0000000..4b0d387 --- /dev/null +++ b/ckubwr.txt @@ -0,0 +1,5330 @@ + + C-Kermit 8.0 Unix Hints and Tips + + Frank da Cruz + [1]The Kermit Project, [2]Columbia University + + As of: C-Kermit 8.0.211 10 April 2004 + This page last updated: Fri Apr 16 16:13:14 2004 (New York USA Time) + + IF YOU ARE READING A PLAIN-TEXT version of this document, note it + is a plain-text dump of a Web page. You can visit the original (and + possibly more up-to-date) Web page here: + + [3]http://www.columbia.edu/kermit/ckubwr.html + + Since the material in this file has been accumulating since 1985, + some (much) of it might be dated. [4]Feedback from experts on + particular OS's and platforms is always welcome. + + [ [5]C-Kermit ] [ [6]Installation Instructions ] [ [7]TUTORIAL ] + ________________________________________________________________________ + + CONTENTS + + 1. [8]INTRODUCTION + 2. [9]PREBUILT C-KERMIT BINARIES + 3. [10]PLATFORM-SPECIFIC NOTES + 4. [11]GENERAL UNIX-SPECIFIC LIMITATIONS AND BUGS + 5. [12]INITIALIZATION AND COMMAND FILES + 6. [13]COMMUNICATION SPEED SELECTION + 7. [14]COMMUNICATIONS AND DIALING + 8. [15]HARDWARE FLOW CONTROL + 9. [16]TERMINAL CONNECTION AND KEY MAPPING + 10. [17]FILE TRANSFER + 11. [18]EXTERNAL FILE TRANSFER PROTOCOLS + 12. [19]SECURITY + 13. [20]MISCELLANEOUS USER REPORTS + 14. [21]THIRD-PARTY DRIVERS + + Quick Links: [ [22]Linux ] [ [23]*BSD ] [[24]Mac OS X] [ [25]AIX ] [ + [26]HP-UX ] [ [27]Solaris ] [ [28]SCO ] [ [29]DEC/Compaq ] + ________________________________________________________________________ + + 1. INTRODUCTION + + [ [30]Top ] [ [31]Contents ] [ [32]Next ] + + SECTION CONTENTS + + 1.1. [33]Documentation + 1.2. [34]Technical Support + 1.3. [35]The Year 2000 + 1.4. [36]The Euro + + THIS IS WHAT USED TO BE CALLED the "beware file" for the Unix version + of C-Kermit, previously distributed as ckubwr.txt and, before that, as + ckuker.bwr, after the fashion of old Digital Equipment Corporation + (DEC) software releases that came with release notes (describing what + had changed) and a "beware file" listing known bugs, limitations, + "non-goals", and things to watch out for. The C-Kermit beware file has + been accumulating since 1985, and it applies to many different + hardware platforms and operating systems, and many versions of them, + so it is quite large. Prior to C-Kermit 8.0, it was distributed only + in plain-text format. Now it is available as a Web document with + links, internal cross references, and so on, to make it easier to use. + + This document applies to Unix C-Kermit in general, as well as to + specific Unix variations like [37]Linux, [38]AIX, [39]HP-UX, + [40]Solaris, and so on, and should be read in conjunction with the + [41]platform-independent C-Kermit beware file, which contains similar + information, but applying to all versions of C-Kermit (VMS, Windows, + OS/2, AOS/VS, VOS, etc, as well as to Unix). + + There is much in this document that is (only) of historical interest. + The navigation links should help you skip directly to the sections + that are relevant to you. Numerous offsite Web links are supposed to + lead to further information but, as you know, Web links go stale + frequently and without warning. If you can supply additional, + corrected, updated, or better Web links, please feel free to [42]let + us know. + + 1.1. Documentation + + [ [43]Top ] [ [44]Contents ] [ [45]Next ] + + C-Kermit 6.0 is documented in the book [46]Using C-Kermit, Second + Edition, by Frank da Cruz and Christine M. Gianone, Digital Press, + Burlington, MA, USA, ISBN 1-55558-164-1 (1997), 622 pages. This + remains the definitive C-Kermit documentation. Until the third edition + is published (sorry, there is no firm timeframe for this), please also + refer to: + + [47]Supplement to Using C-Kermit, Second Edition, For C-Kermit 7.0 + Thorough documentation of features new to version 7.0. + + [48]Supplement to Using C-Kermit, Second Edition, For C-Kermit 8.0 + Thorough documentation of features new to version 8.0. + + 1.2. Technical Support + + [ [49]Top ] [ [50]Contents ] [ [51]Section Contents ] [ [52]Next ] [ + [53]Previous ] + + For information on how to get technical support, please visit: + + [54]http://www.columbia.edu/kermit/support.html + + 1.3. The Year 2000 + + [ [55]Top ] [ [56]Contents ] [ [57]Section Contents ] [ [58]Next ] [ + [59]Previous ] + + The Unix version of C-Kermit, release 6.0 and later, is "Year 2000 + compliant", but only if the underlying operating system is too. + Contact your Unix operating system vendor to find out which operating + system versions, patches, hardware, and/or updates are required. + (Quite a few old Unixes are still in operation in the new millenium, + but with their date set 28 years in the past so at least the non-year + parts of the calendar are correct.) + + As of C-Kermit 6.0 (6 September 1996), post-millenium file dates are + recognized, transmitted, received, and reproduced correctly during the + file transfer process in C-Kermit's File Attribute packets. If + post-millenium dates are not processed correctly on the other end, + file transfer still takes place, but the modification or creation date + of the received file might be incorrect. The only exception would be + if the "file collision update" feature is being used to prevent + unnecessary transfer of files that have not changed since the last + time a transfer took place; in this case, a file might be transferred + unnecessarily, or it might not be transferred when it should have + been. Correct operation of the update feature depends on both Kermit + programs having the correct date and time. + + Of secondary importance are the time stamps in the transaction and/or + debug logs, and the date-related script programming constructs, such + as \v(date), \v(ndate), \v(day), \v(nday), and perhaps also the + time-related ones, \v(time) and \v(ntime), insofar as they might be + affected by the date. The \v(ndate) is a numeric-format date of the + form yyyymmdd, suitable for both lexical and numeric comparison and + sorting: e.g. 19970208 or 20011231. If the underlying operating system + returns the correct date information, these variables will have the + proper values. If not, then scripts that make decisions based on these + variables might not operate correctly. + + Most date-related code is based upon the C Library asctime() string, + which always has a four-digit year. In Unix, the one bit of code in + C-Kermit that is an exception to this rule is several calls to + localtime(), which returns a pointer to a tm struct, in which the year + is presumed to be expressed as "years since 1900". The code depends on + this assumption. Any platforms that violate it will need special + coding. As of this writing, no such platforms are known. + + Command and script programming functions that deal with dates use + C-Kermit specific code that always uses full years. + + 1.4. The Euro + + [ [60]Top ] [ [61]Contents ] [ [62]Section Contents ] [ [63]Previous ] + + C-Kermit 7.0 and later support Unicode (ISO 10646), ISO 8859-15 Latin + Alphabet 9, PC Code Page 858, Windows Code Pages 1250 and 1251, and + perhaps other character sets, that encode the Euro symbol, and can + translate among them as long as no intermediate character-set is + involved that does not include the Euro. + ________________________________________________________________________ + + 2. PREBUILT C-KERMIT BINARIES + + [ [64]Top ] [ [65]Contents ] [ [66]Next ] [ [67]Previous ] + + It is often dangerous to run a binary C-Kermit (or any other) program + built on a different computer. Particularly if that computer had a + different C compiler, libraries, operating system version, processor + features, etc, and especially if the program was built with shared + libraries, because as soon as you update the libraries on your system, + they no longer match the ones referenced in the binary, and the binary + might refuse to load when you run it, in which case you'll see error + messages similar to: + + Could not load program kermit + Member shr4.o not found or file not an archive + Could not load library libcurses.a[shr4.o] + Error was: No such file or directory + + (These samples are from AIX.) To avoid this problem, we try to build + C-Kermit with statically linked libraries whenever we can, but this is + increasingly impossible as shared libraries become the norm. + + It is often OK to run a binary built on an earlier OS version, but it + is rarely possible (or safe) to run a binary built on a later one, for + example to run a binary built under Solaris 8 on Solaris 2.6. + Sometimes even the OS-or-library patch/ECO level makes a difference. + + A particularly insidious problem occurs when a binary was built on a + version of the OS that has patches from the vendor (e.g. to + libraries); in many cases you won't be able to run such a binary on an + unpatched version of the same platform. + + When in doubt, build C-Kermit from the source code on the computer + where it is to be run (if possible!). If not, ask us for a binary + specific to your configuration. We might have one, and if we don't, we + might be able to find somebody who will build one for you. + ________________________________________________________________________ + + 3. NOTES ON SPECIFIC UNIX VERSIONS + + [ [68]Top ] [ [69]Contents ] [ [70]Next ] [ [71]Previous ] + + SECTION CONTENTS + + 3.0. [72]C-KERMIT ON PC-BASED UNIXES + 3.1. [73]C-KERMIT AND AIX + 3.2. [74]C-KERMIT AND HP-UX + 3.3. [75]C-KERMIT AND LINUX + 3.4. [76]C-KERMIT AND NEXTSTEP + 3.5. [77]C-KERMIT AND QNX + 3.6. [78]C-KERMIT AND SCO + 3.7. [79]C-KERMIT AND SOLARIS + 3.8. [80]C-KERMIT AND SUNOS + 3.9. [81]C-KERMIT AND ULTRIX + 3.10. [82]C-KERMIT AND UNIXWARE + 3.11. [83]C-KERMIT AND APOLLO SR10 + 3.12. [84]C-KERMIT AND TANDY XENIX 3.0 + 3.13. [85]C-KERMIT AND OSF/1 (DIGITAL UNIX) (TRU64 UNIX) + 3.14. [86]C-KERMIT AND SGI IRIX + 3.15. [87]C-KERMIT AND THE BEBOX + 3.16. [88]C-KERMIT AND DG/UX + 3.17. [89]C-KERMIT AND SEQUENT DYNIX + 3.18. [90]C-KERMIT AND {FREE,OPEN,NET}BSD + 3.19. [91]C-KERMIT AND MAC OS X + 3.20. [92]C-KERMIT AND COHERENT + + The following sections apply to specific Unix versions. Most of them + contain references to FAQs (Frequently Asked Questions), but these + tend to be ephemeral. For possibly more current information see: + + [93]http://www.faqs.org + [94]http://aplawrence.com/Unixart/newtounix.html + + One thread that runs through many of them, and implicitly perhaps + through all, concerns the problems that occur when trying to dial out + on a serial device that is (also) enabled for dialing in. The + "solutions" to this problem are many, varied, diverse, and usually + gross, involving configuring the device for bidirectional use. This is + done in a highly OS-dependent and often obscure manner, and the + effects (good or evil) are also highly dependent on the particular OS + (and getty variety, etc). Many examples are given in the + [95]OS-specific sections below. + + An important point to keep in mind is that C-Kermit is a + cross-platform, portable software program. It was not designed + specifically and only for your particular Unix version, or for that + matter, for Unix in particular at all. It also runs on VMS, AOS/VS, + VOS, and other non-Unix platforms. All the Unix versions of C-Kermit + share common i/o modules, with compile-time #ifdef constructions used + to account for the differences among the many Unix products and + releases. If you think that C-Kermit is behaving badly or missing + something on your particular Unix version, you might be right -- we + can't claim to be expert in hundreds of different OS / version / + hardware / library combinations. If you're a programmer, take a look + at the source code and [96]send us your suggested fixes or changes. Or + else just [97]send us a report about what seems to be wrong and we'll + see what we can do. + ________________________________________________________________________ + + 3.0. C-KERMIT ON PC-BASED UNIXES + + [ [98]Top ] [ [99]Contents ] [ [100]Section Contents ] [ [101]Next ] + + Also see: [102]http://www.pcunix.com/. + + SECTION CONTENTS + + 3.0.1. [103]Interrupt Conflicts + 3.0.2. [104]Windows-Specific Hardware + 3.0.3. [105]Modems + 3.0.4. [106]Character Sets + 3.0.5. [107]Keyboard, Screen, and Mouse Access + 3.0.6. [108]Laptops + + 3.0.1. Interrupt Conflicts + + [ [109]Top ] [ [110]Contents ] [ [111]Section Contents ] [ [112]Next ] + + PCs are not the best platform for real operating systems like Unix. + The architecture suffers from numerous deficiencies, not the least of + which is the stiflingly small number of hardware interrupts (either 7 + or 15, many of which are preallocated). Thus adding devices, using + multiple serial ports, etc, is always a challenge and often a + nightmare. The free-for-all nature of the PC market and the lack of + standards combined with the diversity of Unix OS versions make it + difficult to find drivers for any particular device on any particular + version of Unix. + + Of special interest to Kermit users is the fact that there is no + standard provision in the PC architecture for more than 2 + communication (serial) ports. COM3 and COM4 (or higher) will not work + unless you (a) find out the hardware address and interrupt for each, + (b) find out how to provide your Unix version with this information, + and (c) actually set up the configuration in the Unix startup files + (or whatever other method is used). Watch out for interrupt conflicts, + especially when using a serial mouse, and don't expect to be able to + use more than two serial ports. + + The techniques for resolving interrupt conflicts are different for + each operating system (Linux, NetBSD, etc). In general, there is a + configuration file somewhere that lists COM ports, something like + this: + + com0 at isa? port 0x3f8 irq 4 # DOS COM1 + com1 at isa? port 0x2f8 irq 3 # DOS COM2 + + The address and IRQ values in this file must agree with the values in + the PC BIOS and with the ports themselves, and there must not be more + than one device with the same interrupt. Unfortunately, due to the + small number of available interrupts, installing new devices on a PC + almost always creates a conflict. Here is a typical tale from a Linux + user (Fred Smith) about installing a third serial port: + + ...problems can come from a number of causes. The one I fought with + for some time, and finally conquered, was that my modem is on an + add-in serial port, cua3/IRQ5. By default IRQ5 has a very low + priority, and does not get enough service in times when the system + is busy to prevent losing data. This in turn causes many resends. + There are two 'fixes' that I know of, one is to relax hard disk + interrupt hogging by using the correct parameter to hdparm, but I + don't like that one because the hdparm man page indicates it is + risky to use. The other one, the one I used, was to get 'irqtune' + and use it to give IRQ5 the highest priority instead of nearly the + lowest. Completely cured the problem. + + Here's another one from a newsgroup posting: + + After much hair pulling, I've discovered why my serial port won't + work. Apparently my [PC] has three serial devices (two comm ports + and an IR port), of which only two at a time can be active. I + looked in the BIOS setup and noticed that the IR port was + activated, but didn't realize at the time that this meant that COM2 + was thereby de-activated. I turned off the IR port and now the + serial port works as advertised. + ________________________________________________________________________ + + 3.0.2. Windows-Specific Hardware + + [ [113]Top ] [ [114]Contents ] [ [115]Section Contents ] [ [116]Next ] + [ [117]Previous ] + + To complicate matters, the PC platform is becoming increasingly and + inexorably Windows-oriented. More and more add-on devices are "Windows + only" -- meaning they are incomplete and rely on proprietary + Windows-based software drivers to do the jobs that you would expect + the device itself to do. PCMCIA, PCI, or "Plug-n-Play" devices are + rarely supported on PC-based Unix versions such as SCO; Winmodems, + Winprinters, and the like are not supported on any Unix variety (with + [118]a few exceptions). The self-proclaimed Microsoft PC 97 (or later) + standard only makes matters worse since its only purpose to ensure + that PCs are "optimized to run Windows 95 and Windows NT 4.0 and + future versions of these operating systems". + + With the exception noted (the Lucent modem, perhaps a handful of + others by the time you read this), drivers for "Win" devices are + available only for Windows, since the Windows market dwarfs that of + any particular Unix brand, and for that matter all Unixes (or for that + matter, all non-Windows operating systems) combined. If your version + of Unix (SCO, Linux, BSDI, FreeBSD, etc) does not support a particular + device, then C-Kermit can't use it either. C-Kermit, like any Unix + application, must access all devices through drivers and not directly + because Unix is a real operating system. + + Don't waste time thinking that you, or anybody else, could write a + Linux (or other Unix) driver for a Winmodem or other "Win" device. + First of all, these devices generally require realtime control, but + since Unix is a true multitasking operating system, realtime device + control is not possible outside the kernel. Second, the specifications + for these devices are secret and proprietary, and each one (and each + version of each one) is potentially different. Third, a Winmodem + driver would be enormously complex; it would take years to write and + debug, by which time it would be obsolete. + + A more recent generation of PCs (circa 1999-2000) is marketed as + "Legacy Free". One can only speculate what that could mean. Most + likely it means it will ONLY run the very latest versions of Windows, + and is made exclusively of Winmodems, Winprinters, Winmemory, and + Win-CPU-fans (Legacy Free is a concept [119]pioneered by Microsoft). + + Before you buy a new PC or add-on equipment, especially serial ports, + internal modems, or printers, make sure they are compatible with your + version of Unix. This is becoming an ever-greater challenge; only a + huge company like Microsoft can afford to be constantly cranking out + and/or verifying drivers for the thousands of video boards, sound + cards, network adapters, SCSI adapters, buses, etc, that spew forth in + an uncontrolled manner from all corners of the world on a daily basis. + With very few exceptions, makers of PCs assemble the various + components and then verify them only with Windows, which they must do + since they are, no doubt, preloading the PC with Windows. To find a + modern PC that is capable of running a variety of non-Windows + operating systems (e.g. Linux, SCO OpenServer, Unixware, and Solaris) + is a formidable challenge requiring careful study of each vendor's + "compatibility lists" and precise attention to exact component model + numbers and revision levels. + ________________________________________________________________________ + + 3.0.3. Modems + + [ [120]Top ] [ [121]Contents ] [ [122]Section Contents ] [ [123]Next ] + [ [124]Previous ] + + External modems are recommended: + + * They don't need any special drivers. + * You can use the lights and speaker to troubleshoot dialing. + * You can share them among all types of computers. + * You can easily turn them off and on when power-cycling seems + warranted. + * They are more likely to have manuals. + + Internal PC modems (even when they are not Winmodems, which is + increasingly unlikely in new PCs) are always trouble, especially in + Unix. Even when they work for dialing out, they might not work for + dialing in, etc. Problems that occur when using an internal modem can + almost always be eliminated by switching to an external one. Even when + an internal modem is not a Winmodem or Plug-n-Play, it is often a + no-name model of unknown quality -- not the sort of thing you want + sitting directly on your computer's bus. (Even if it does not cause + hardware problems, it probably came without a command list, so no Unix + software will know how to control it.) For more about Unix compatible + modems, see: + + [125]http://www.idir.net/~gromitkc/winmodem.html + + Remember that PCs, even now -- more than two decades after they were + first introduced -- are not (in general) capable of supporting more + than 2 serial devices. Here's a short success story from a recent + newsgroup posting: "I have a Diamond SupraSonic II dual modem in my + machine. What I had to end up doing is buying a PS/2 mouse and port + and install it. Had to get rid of my serial mouse. I also had to + disable PnP in my computer bios. I was having IRQ conflicts between my + serial mouse and 'com 3'. Both modems work fine for me. My first modem + is ttyS0 and my second is ttyS1." Special third-party multiport boards + such as [126]DigiBoard are available for certain Unix platforms + (typically SCO, maybe Linux) that come with special platform-specific + drivers. + ________________________________________________________________________ + + 3.0.4. Character Sets + + [ [127]Top ] [ [128]Contents ] [ [129]Section Contents ] [ [130]Next ] + [ [131]Previous ] + + PCs generally have PC code pages such as CP437 or CP850, and these are + often used by PC-based Unix operating systems, particularly on the + console. These are supported directly by C-Kermit's SET FILE + CHARACTER-SET and SET TERMINAL CHARACTER-SET commands. Some PC-based + Unix versions, such as recent Red Hat Linux releases, might also + support Microsoft Windows code pages such as CP1252, or even Latin + Alphabet 1 itself (perhaps displayed with CP437 glyphs). (And work is + in progress to support Unicode UTF8 in Linux.) + + Certain Windows code pages are not supported directly by C-Kermit, but + since they are ISO Latin Alphabets with nonstandard "extensions" in + the C1 control range, you can substitute the corresponding Latin + alphabet (or other character set) in any C-Kermit character-set + related commands: + + Windows Code Page Substitution + CP 1004 Latin-1 + CP 1051 HP Roman-8 + + Other Windows code pages are mostly (or totally) incompatible with + their Latin Alphabet counterparts (e.g. CP1250 and Latin-2), and + several of these are already supported by C-Kermit 7.0 and later + (1250, 1251, and 1252). + ________________________________________________________________________ + + 3.0.5. Keyboard, Screen, and Mouse Access + + [ [132]Top ] [ [133]Contents ] [ [134]Section Contents ] [ [135]Next ] + [ [136]Previous ] + + Finally, note that as a real operating system, Unix (unlike Windows) + does not provide the intimate connection to the PC keyboard, screen, + and mouse that you might expect. Unix applications can not "see" the + keyboard, and therefore can not be programmed to understand F-keys, + Editing keys, Arrow keys, Alt-key combinations, and the like. This is + because: + + a. Unix is a portable operating system, not only for PCs; + b. Unix sessions can come from anywhere, not just the PC's own + keyboard and screen; and: + c. even though it might be possible for an application that actually + is running on the PC's keyboard and screen to access these devices + directly, there are no APIs (outside of X) for this. + ________________________________________________________________________ + + 3.0.6. Laptops + + [ [137]Top ] [ [138]Contents ] [ [139]Section Contents ] [ + [140]Previous ] + + (To be filled in . . .) + ________________________________________________________________________ + + 3.1. C-KERMIT AND AIX + + [ [141]Top ] [ [142]Contents ] [ [143]Section Contents ] [ [144]Next ] + [ [145]Previous ] + + SECTION CONTENTS + + 3.1.1. [146]AIX: General + 3.1.2. [147]AIX: Network Connections + 3.1.3. [148]AIX: Serial Connections + 3.1.4. [149]AIX: File Transfer + 3.1.5. [150]AIX: Xterm Key Map + + For additional information see: + * [151]http://www.emerson.emory.edu/services/aix-faq/ + * [152]http://www.faqs.org/faqs/by-newsgroup/comp/comp.unix.aix.html + * [153]http://www.cis.ohio-state.edu/hypertext/faq/usenet/aix-faq/to + p.html + * [154]http://aixpdslib.seas.ucla.edu/ + * [155]http://www.rootvg.net (AIX history) + * [156]ftp://rtfm.mit.edu/pub/usenet/news.answers/aix-faq/part1 + * [157]ftp://mirrors.aol.com/pub/rtfm/usenet-by-hierarchy/comp/unix/ + aix + + and/or read the [158]comp.unix.aix newsgroup. + ______________________________________________________________________ + + 3.1.1. AIX: General + + [ [159]Top ] [ [160]Contents ] [ [161]Section Contents ] [ [162]Next ] + + About AIX version numbers: "uname -a" tells the two-digit version + number, such as 3.2 or 4.1. The three-digit form can be seen with the + "oslevel" command (this information is unavailable at the API level + and is reportedly obtained by scanning the installed patch list). + Supposedly all three-digit versions within the same two-digit version + (e.g. 4.3.1, 4.3.2) are binary compatible; i.e. a binary built on any + one of them should run on all others, but who knows. Most AIX + advocates tell you that any AIX binary will run on any AIX version + greater than or equal to the one under which it was built, but + experience with C-Kermit suggests otherwise. It is always best to run + a binary built under your exact same AIX version, down to the third + decimal place, if possible. Ideally, build it from source code + yourself. Yes, this advice would be easier to follow if AIX came with + a C compiler. + ______________________________________________________________________ + + 3.1.2. AIX: Network Connections + + [ [163]Top ] [ [164]Contents ] [ [165]Section Contents ] [ [166]Next ] + [ [167]Previous ] + + File transfers into AIX 4.2 or 4.3 through the AIX Telnet or Rlogin + server have been observed to fail (or accumulate huge numbers of + correctable errors, or even disconnect the session), when exactly the + same kind of transfers into AIX 4.1 work without incident, as do such + transfers into all non-AIX platforms on the same kind of connections + (with a few exceptions noted elsewhere in this document). AIX 4.3.3 + seems to be particularly fragile in this regard; the weakness seems to + be in its pseudoterminal (pty) driver. High-speed streaming transfers + work perfectly, however, if the AIX Telnet server and pty driver are + removed from the picture; e.g, by using "set host * 3000" on AIX. + + The problem can be completely cured by replacing the IBM Telnet server + with [168]MIT's Kerberos Telnet server -- even if you don't actually + use the Kerberos part. Diagnosis: AIX pseudoterminals (which are + controlled by the Telnet server to give you a login terminal for your + session) have quirks that not even IBM knows about. The situation with + AIX 5.x is not known, but if it has the same problem, the same cure is + available. + + Meanwhile, the only remedy when going through the IBM Telnet server is + to cut back on Kermit's performance settings until you find a + combination that works: + + * SET STREAMING OFF + * SET WINDOW-SIZE small-number + * SET { SEND, RECEIVE } PACKET-LENGTH small-number + * SET PREFIXING { CAUTIOUS, ALL } + + In some cases, severe cutbacks are required, e.g. those implied by the + ROBUST command. Also be sure that the AIX C-Kermit on the remote end + has "set flow none" (which is the default). NOTE: Maybe this one can + also be addressed by starting AIX telnetd with the "-a" option. The + situation with SSH connections is not known, but almost certainly the + same. + + When these problems occur, the system error log contains: + + LABEL: TTY_TTYHOG + IDENTIFIER: 0873CF9F + Type: TEMP + Resource Name: pts/1 + + Description + TTYHOG OVER-RUN + + Failure Causes + EXCESSIVE LOAD ON PROCESSOR + + Recommended Actions + REDUCE SYSTEM LOAD. + REDUCE SERIAL PORT BAUD RATE + + Before leaving the topic of AIX pseudoterminals, it is very likely + that Kermit's PTY and SSH commands do not work well either, for the + same reason that Telnet connections into AIX don't work well. A brief + test with "pty rlogin somehost" got a perfectly usable terminal + (CONNECT) session, but file-transfer problems like those just + described. + + Reportedly, telnet from AIX 4.1-point-something to non-Telnet ports + does not work unless the port number is in the /etc/services file; + it's not clear from the report whether this is a problem with AIX + Telnet (in which case it would not affect Kermit), or with the sockets + library (in which case it would). The purported fix is IBM APAR + IX61523. + + C-Kermit SET HOST or TELNET from one AIX 3.1 (or earlier) system to + another won't work right unless you set your local terminal type to + something other than AIXTERM. When your terminal type is AIXTERM, AIX + TELNET sends two escapes whenever you type one, and the AIX telnet + server swallows one of them. This has something to do with the "hft" + device. This behavior seems to be removed in AIX 3.2 and later. + ______________________________________________________________________ + + 3.1.3. AIX: Serial Connections + + [ [169]Top ] [ [170]Contents ] [ [171]Section Contents ] [ [172]Next ] + [ [173]Previous ] + + In AIX 3, 4, or 5, C-Kermit won't be able to "set line /dev/tty0" (or + any other dialout device) if you haven't installed "cu" or "uucp" on + your system, because installing these is what creates the UUCP + lockfile directory. If SET LINE commands always result in "Sorry, + access to lock denied", even when C-Kermit has been given the same + owner, group, and permissions as cu: + + -r-sr-xr-x 1 uucp uucp 67216 Jul 27 1999 cu + + and even when you run it as root, then you must go back and install + "cu" from your AIX installation media. + + According to IBM's "From Strength to Strength" document (21 April + 1998), in AIX 4.2 and later "Async supports speeds on native serial + ports up to 115.2kbps". However, no API is documented to achieve + serial speeds higher than 38400 bps. Apparently the way to do this -- + which might or might not work only on the IBM 128-port multiplexer -- + is: + + cxma-stty fastbaud /dev/tty0 + + which, according to "man cxma-stty": + + fastbaud Alters the baud rate table, so 50 baud becomes 57600 baud. + -fastbaud Restores the baud rate table, so 57600 baud becomes 50 + baud. + + Presumably (but not certainly) this extrapolates to 110 "baud" becomes + 76800 bps, and 150 becomes 115200 bps. So to use high serial speeds in + AIX 4.2 or 4.3, the trick would be to give the "cxma-stty fastbaud" + command for the desired tty device before starting Kermit, and then + use "set speed 50", "set speed 110", or "set speed 150" to select + 56700, 76800, or 115200 bps. It is not known whether cxma-stty + requires privilege. + + According to one report, "Further investigation with IBM seems to + indicate that the only hardware capable of doing this is the 128-port + multiplexor with one (or more) of the 16 port breakout cables + (Enhanced Remote Async Node 16-Port EIA-232). We are looking at about + CDN$4,000 in hardware just to hang a 56kb modem on there. Of course, + we can then hang 15 more, if we want. This hardware combo is described + to be good to 230.4kbps." + + Another report says (quote from AIX newsgroup, March 1999): + + The machine type and the adapter determine the speed that one can + actually run at. The older microchannel machines have much slower + crystal frequencies and may not go beyond 76,800. A feature put + into AIX 421 allows one to key in non-POSIX baud rates and if the + uart can support that speed, it will get set. this applies also to + 43p's and beyond. 115200 is the max for the 43P's native serial + port. As crytal frequencies continue to increase, the built-in + serial ports speeds will improve. To use 'uucp' or 'ate' at the + higher baud rates, configure the port for the desired speed, but + set the speed of uucp or ate to 50. Any non-POSIX speeds set in the + ttys configuration will the be used. In the case of the 128-port + adapters or the ISA 8-port or PCI 8-port adapter, there are only a + few higher baud rates. + + a. Change the port to enable high baud rates: + + B50 for 57600 + + B75 for 76800 + + B110 for 115200 + + B200 for 230000 + b. chdev -l ttyX -a fastbaud=enable + + For the 128 ports original style rans, only 57600 bps is + supported. + + For the new enhanced RANs, up to 230Kbps is supported. + + In AIX 2.2.1 on the RT PC with the 8-port multiplexer, SET SPEED 38400 + gives 9600 bps, but SET SPEED 19200 gives 19200 (on the built-in S1 + port). + + Note that some RS/6000s (e.g. the IBM PowerServer 320) have + nonstandard rectangular 10-pin serial ports; the DB-25 connector is + NOT a serial port; it is a parallel printer port. IBM cables are + required for the serial ports, (The IBM RT PC also had rectangular + serial ports -- perhaps the same as these, perhaps different.) + + If you dial in to AIX through a modem that is connected directly to an + AIX port (e.g. on the 128-port multiplexer) and find that data is + lost, especially when uploading files to the AIX system (and system + error logs report buffer overruns on the port): + + 1. Make sure the port and modem are BOTH configured for hardware + (RTS/CTS) flow control. The port is configured somewhere in the + system configuration, outside of Kermit. + 2. Tell C-Kermit to "set flow keep"; experimentation shows that SET + FLOW RTS/CTS has no effect when used in remote mode (i.e. on + /dev/tty, as opposed to a specify port device). + 3. Fixes for bugs in the original AIX 4.2 tty (serial i/o) support + and other AIX bugs are available from IBM at: + [174]http://service.software.ibm.com/rs6000/ + Downloads -> Software Fixes -> Download FixDist gets an + application for looking up known problems. + + Many problems reported with bidirectional terminal lines on AIX 3.2.x + on the RS/6000. Workaround: don't use bidirectional terminal lines, or + write a shell-script wrapper for Kermit that turns getty off on the + line before starting Kermit, or before Kermit attempts to do the SET + LINE. (But note: These problems MIGHT be fixed in C-Kermit 6.0 and + later.) The commands for turning getty off and on (respectively) are + /usr/sbin/pdisable and /usr/sbin/penable. + ______________________________________________________________________ + + 3.1.4. AIX: File Transfer + + [ [175]Top ] [ [176]Contents ] [ [177]Section Contents ] [ [178]Next ] + [ [179]Previous ] + + Evidently AIX 4.3 (I don't know about earlier versions) does not allow + open files to be overwritten. This can cause Kermit transfers to fail + when FILE COLLISION is OVERWRITE, where they might work on other Unix + varieties or earlier AIX versions. + + Transfer of binary -- and maybe even text -- files can fail in AIX if + the AIX terminal has particular port can have character-set + translation done for it by the tty driver. The following advice from a + knowledgeable AIX user: + + [This feature] has to be checked (and set/cleared) with a separate + command, unfortunately stty doesn't handle this. To check: + + $ setmaps + input map: none installed + output map: none installed + + If it says anything other than "none installed" for either one, it + is likely to cause a problem with kermit. To get rid of installed + maps: + + $ setmaps -t NOMAP + + However, I seem to recall that with some versions of AIX before + 3.2.5, only root could change the setting. I'm not sure what + versions - it might have only been under AIX 3.1 that this was + true. At least with AIX 3.2.5 an ordinary user can set or clear the + maps. + + On the same problem, another knowledgeable AIX user says: + + The way to get information on the NLS mapping under AIX (3.2.5 + anyway) is as follows. From the command line type: + + lsattr -l tty# -a imap -a omap -E -H + + Replace the tty number for the number sign above. This will give a + human readable output of the settings that looks like this; + + # lsattr -l tty2 -a imap -a omap -E -H + attribute value description user_settable + + imap none INPUT map file True + omap none OUTPUT map file True + + If you change the -H to a -O, you get output that can easily be + processed by another program or a shell script, for example: + + # lsattr -l tty2 -a imap -a omap -E -O + #imap:omap + none:none + + To change the settings from the command line, the chdev command is + used with the following syntax. + + chdev -l tty# -a imap='none' -a omap='none' + + Again substituting the appropriate tty port number for the number + sign, "none" being the value we want for C-Kermit. Of course, the + above can also be changed by using the SMIT utility and selecting + devices - tty. (...end quote) + ______________________________________________________________________ + + 3.1.5. AIX: Xterm Key Map + + [ [180]Top ] [ [181]Contents ] [ [182]Section Contents ] [ + [183]Previous ] + + Here is a sample configuration for setting up an xterm keyboard for + VT220 or higher terminal emulation on AIX, courtesy of Bruce Momjian, + Drexel Hill, PA. Xterm can be started like this: + + xterm $XTERMFLAGS +rw +sb +ls $@ -tm 'erase ^? intr ^c' -name vt220 \ + -title vt220 -tn xterm-220 "$@" & + +--------------------------------------------------------------------------- + XTerm*VT100.Translations: #override \n\ + Home: string(0x1b) string("[3~") \n \ + End: string(0x1b) string("[4~") \n + vt220*VT100.Translations: #override \n\ + Shift F1: string("[23~") \n \ + Shift F2: string("[24~") \n \ + Shift F3: string("[25~") \n \ + Shift F4: string("[26~") \n \ + Shift F5: string("[K~") \n \ + Shift F6: string("[31~") \n \ + Shift F7: string("[31~") \n \ + Shift F8: string("[32~") \n \ + Shift F9: string("[33~") \n \ + Shift F10: string("[34~") \n \ + Shift F11: string("[28~") \n \ + Shift F12: string("[29~") \n \ + Print: string(0x1b) string("[32~") \n\ + Cancel: string(0x1b) string("[33~") \n\ + Pause: string(0x1b) string("[34~") \n\ + Insert: string(0x1b) string("[2~") \n\ + Delete: string(0x1b) string("[3~") \n\ + Home: string(0x1b) string("[1~") \n\ + End: string(0x1b) string("[4~") \n\ + Prior: string(0x1b) string("[5~") \n\ + Next: string(0x1b) string("[6~") \n\ + BackSpace: string(0x7f) \n\ + Num_Lock: string(0x1b) string("OP") \n\ + KP_Divide: string(0x1b) string("Ol") \n\ + KP_Multiply: string(0x1b) string("Om") \n\ + KP_Subtract: string(0x1b) string("OS") \n\ + KP_Add: string(0x1b) string("OM") \n\ + KP_Enter: string(0x1b) string("OM") \n\ + KP_Decimal: string(0x1b) string("On") \n\ + KP_0: string(0x1b) string("Op") \n\ + KP_1: string(0x1b) string("Oq") \n\ + KP_2: string(0x1b) string("Or") \n\ + KP_3: string(0x1b) string("Os") \n\ + KP_4: string(0x1b) string("Ot") \n\ + KP_5: string(0x1b) string("Ou") \n\ + KP_6: string(0x1b) string("Ov") \n\ + KP_7: string(0x1b) string("Ow") \n\ + KP_8: string(0x1b) string("Ox") \n\ + KP_9: string(0x1b) string("Oy") \n + + ! Up: string(0x1b) string("[A") \n\ + ! Down: string(0x1b) string("[B") \n\ + ! Right: string(0x1b) string("[C") \n\ + ! Left: string(0x1b) string("[D") \n\ + + *visualBell: true + *saveLines: 1000 + *cursesemul: true + *scrollKey: true + *scrollBar: true + ________________________________________________________________________ + + 3.2. C-KERMIT AND HP-UX + + [ [184]Top ] [ [185]Contents ] [ [186]Section Contents ] [ [187]Next ] + [ [188]Previous ] + + SECTION CONTENTS + + 3.2.0. [189]Common Problems + 3.2.1. [190]Building C-Kermit on HP-UX + 3.2.2. [191]File Transfer + 3.2.3. [192]Dialing Out and UUCP Lockfiles in HP-UX + 3.2.4. [193]Notes on Specific HP-UX Releases + 3.2.5. [194]HP-UX and X.25 + + REFERENCES + + For further information, read the [195]comp.sys.hp.hpux newsgroup. + + C-Kermit is included as part of the HP-UX operating system by contract + between Hewlett Packard and Columbia University for HP-UX 10.00 and + later. Each level of HP-UX includes a freshly built C-Kermit binary in + /bin/kermit, which should work correctly. Binaries built for regular + HP-UX may be used on Trusted HP-UX and vice-versa, except for use as + IKSD because of the different authentication methods. + + Note that HP does not update C-Kermit versions for any but its most + current HP-UX release. So, for example, HP-UX 10.20 has C-Kermit 6.0; + 11.00 has C-Kermit 7.0, and 11.22 has 8.0. Of course, as with all + software, older Kermit versions have bugs (such as buffer overflow + vulnerabilities) that are fixed in later versions. From time to time, + HP discovers one of these (long-ago fixed) bugs and issues a security + alert for the older OS's, recommending some draconian measure to avoid + the problem. The true fix in each situation is to install the current + release of C-Kermit. + + 3.2.0. Common Problems + + [ [196]Top ] [ [197]Contents ] [ [198]Section Contents ] [ [199]Next ] + + Some HP workstations have a BREAK/RESET key. If you hit this key while + C-Kermit is running, it might kill or suspend the C-Kermit process. + C-Kermit arms itself against these signals, but evidently the + BREAK/RESET key is -- at least in some circumstances, on certain HP-UX + versions -- too powerful to be caught. (Some report that the first + BREAK/RESET shows up as SIGINT and is caught by C-Kermit's former + SIGINT handler even when SIGINT is currently set to SIG_IGN; the + second kills Kermit; other reports suggest the first BREAK/RESET sends + a SIGTSTP (suspend signal) to Kermit, which it catches and suspends + itself. You can tell C-Kermit to ignore suspend signals with SET + SUSPEND OFF. You can tell C-Kermit to ignore SIGINT with SET COMMAND + INTERRUPTION OFF. It is not known whether these commands also grant + immunity to the BREAK/RESET key (one report states that with SET + SUSPEND OFF, the BREAK/RESET key is ignored the first four times, but + kills Kermit the 5th time). In any case: + + 1. If this key is mapped to SIGINT or SIGTSTP, C-Kermit catches or + ignores it, depending on which mode (CONNECT, command, etc) Kermit + is in. + 2. If it causes HP-UX to kill C-Kermit, there is nothing C-Kermit can + do to prevent it. + + When HP-UX is on the remote end of the connection, it is essential + that HP-UX C-Kermit be configured for Xon/Xoff flow control (this is + the default, but in case you change it and then experience + file-transfer failures, this is a likely reason). + ________________________________________________________________________ + + 3.2.1. Building C-Kermit on HP-UX + + [ [200]Top ] [ [201]Contents ] [ [202]Section Contents ] [ [203]Next ] + [ [204]Previous ] + + This section applies mainly to old (pre-10.20) HP-UX version on + old, slow, and/or memory-constrained hardware. + + During the C-Kermit 6.0 Beta cycle, something happened to ckcpro.w + (or, more precisely, the ckcpro.c file that is generated from it) + which causes HP optimizing compilers under HP-UX versions 7.0 and 8.0 + (apparently on all platforms) as well as under HP-UX 9.0 on Motorola + platforms only, to blow up. In versions 7.0 and 8.0 the problem has + spread to other modules. + + The symptoms vary from the system grinding to a halt, to the compiler + crashing, to the compilation of the ckcpro.c module taking very long + periods of time, like 9 hours. This problem is handled by compiling + the modules that tickle it without optimization; the new C-Kermit + makefile takes care of this, and shows how to do it in case the same + thing begins happening with other modules. + + On HP-UX 9.0, a kernel parameter, maxdsiz (maximum process data + segment size), seems to be important. On Motorola systems, it is 16MB + by default, whereas on RISC systems the default is much bigger. + Increasing maxdsiz to about 80MB seems to make the problem go away, + but only if the system also has a lot of physical memory -- otherwise + it swaps itself to death. + + The optimizing compiler might complain about "some optimizations + skipped" on certain modules, due to lack of space available to the + optimizer. You can increase the space (the incantation depends on the + particular compiler version -- see the [205]makefile), but doing so + tends to make the compilations take a much longer time. For example, + the "hpux0100o+" makefile target adds the "+Onolimit" compiler flag, + and about an hour to the compile time on an HP-9000/730. But it *does* + produce an executable that is about 10K smaller :-) + + In the makefile, all HP-UX entries automatically skip optimization of + problematic modules. + ________________________________________________________________________ + + 3.2.2. File Transfer + + [ [206]Top ] [ [207]Contents ] [ [208]Section Contents ] [ [209]Next ] + [ [210]Previous ] + + Telnet connections into HP-UX versions up to and including 11.11 (and + possibly 11.20) tend not to lend themselves to file transfer due to + limitations, restrictions, and/or bugs in the HP-UX Telnet server + and/or pseudoterminal (pty) driver. + + In C-Kermit 6.0 (1996) an unexpected slowness was noted when + transferring files over local Ethernet connections when an HP-UX + system (9.05 or 10.00) was on the remote end. The following experiment + was conducted to determine the cause. C-Kermit 6.0 was used; the + situation is slightly better using C-Kermit 7.0's streaming feature + and HP-UX 10.20 on the far end. + + The systems were HP-UX 10.00 (on 715/33) and SunOS 4.1.3 (on + Sparc-20), both on the same local 10Mbps Ethernet, packet length 4096, + parity none, control prefixing "cautious", using only local disks on + each machine -- no NFS. In the C-Kermit 6.0 (ACK/NAK) case, the window + size was 20; in the streaming case there is no window size (i.e. it is + infinite). The test file was C-Kermit executable, transferred in + binary mode. Conditions were relatively poor: the Sun and the local + net heavily loaded; the HP system is old, slow, and + memory-constrained. + + C-Kermit 6.0... C-Kermit 7.0... + Local Remote ACK/NAK........ Streaming...... + Client Server Send Receive Send Receive + Sun HP 36 18 64 18 + HP HP 25 15 37 16 + HP Sun 77 83 118 92 + Sun Sun 60 60 153 158 + + So whenever HP is the remote we have poor performance. Why? + + * Changing file display to CRT has no effect (so it's not the curses + library on the client side). + * Changing TCP RECV-BUFFER or SEND-BUFFER has little effect. + * Telling the client to make a binary-mode connection (SET TELNET + BINARY REQUESTED, which successfully negotiates a binary + connection) has no effect on throughput. + + BUT... If I start HP-UX C-Kermit as a TCP service: + + set host * 3000 + server + + and then from the client "set host xxx 3000", I get: + + C-Kermit 6.0... C-Kermit 7.0... + Local Remote ACK/NAK........ Streaming...... + Client Server Send Receive Send Receive + Sun HP 77 67 106 139 + HP HP 50 50 64 62 + HP Sun 57 85 155 105 + Sun Sun 57 50 321 314 + + Therefore the HP-UX telnet server or pty driver seems to be adding + more overhead than the SunOS one, and most others. When going through + this type of connection (a remote telnet server) there is little + Kermit can do improve matters, since the telnet server and pty driver + are between the two Kermits, and neither Kermit program can have any + influence over them (except putting the Telnet connection in binary + mode, but that doesn't help). + + (The numbers for the HP-HP transfers are lower than the others since + both Kermit processes are running on the same slow 33MHz CPU.) + + Matters seem to have deteriorated in HP-UX 11. Now file transfers over + Telnet connections fail completely, rather than just being slow. In + the following trial, a Telnet connection was made from Kermit 95 to + HP-UX 11.11 on an HP-9000/785/B2000 over local 10Mbps Ethernet running + C-Kermit 8.00 in server mode (under the HP-UX Telnet server): + + Text........ Binary...... + Stream Pktlen GET SEND GET SEND + On 4000 Fail Fail Fail Fail + Off 4000 Fail Fail Fail Fail + Off 2000 OK Fail OK Fail + On 2000 OK Fail OK Fail + On 3000 Fail Fail Fail Fail + On 2500 Fail Fail Fail Fail + On 2047 OK Fail OK Fail + On 2045 OK Fail OK Fail + Off 500 OK OK OK OK + On 500 OK Fail OK Fail + On 240 OK Fail OK Fail + + As you can see, downloads are problematic unless the receiver's Kermit + packet length is 2045 or less, but uploads work only with streaming + disabled and the packet length restricted to 500. To force file + transfers to work on this connection, the desktop Kermit must be told + to: + + set streaming off + set receive packet-length 2000 + set send packet-length 500 + + However, if a connection is made between the same two programs on the + same two computers over the same network, but this time a direct + socket-to-socket connection bypassing the HP-UX Telnet server and pty + driver (tell HP-UX C-Kermit to "set host /server * 3000 /raw"; tell + desktop client program to "set host blah 3000 /raw"), everything works + perfectly with the default Kermit settings (streaming, 4K packets, + liberal control-character unprefixing, 8-bit transparency, etc): + + Text........ Binary...... + Stream Pktlen GET SEND GET SEND + On 4000 OK OK OK OK + + And in this case, transfer rates were approximately 900,000 cps. To + verify that the behavior reported here is not caused by the new Kermit + release, the same experiment was performed on a Telnet connection from + the same PC over the same network to the old 715/33 running HP-UX + 10.20 and C-Kermit 8.00. Text and binary uploads and downloads worked + perfectly (albeit slowly) with all the default settings -- streaming, + 4K packets, etc. + ________________________________________________________________________ + + 3.2.3. Dialing Out and UUCP Lockfiles in HP-UX + + [ [211]Top ] [ [212]Contents ] [ [213]Section Contents ] [ [214]Next ] + [ [215]Previous ] + + HP workstations do not come with dialout devices configured; you have + to do it yourself (as root). First look in /dev to see what's there; + for example in HP-UX 10.00 or later: + + ls -l /dev/cua* + ls -l /dev/tty* + + If you find a tty0p0 device but no cua0p0, you'll need to creat one if + you want to dial out; the tty0p0 does not work for dialing out. It's + easy: start SAM; in the main Sam window, double-click on Peripheral + Device, then in the Peripheral Devices window, double-click on + Terminals and Modems. In the Terminals and Modems dialog, click on + Actions, then choose "Add modem" and fill in the blanks. For example: + Port number 0, speed 57600 (higher speeds tend not to work reliably), + "Use device for calling out", do NOT "Receive incoming calls" (unless + you know what you are doing), leave "CCITT modem" unchecked unless you + really have one, and do select "Use hardware flow control (RTS/CTS)". + Then click OK. This creates cua0p0 as well as cul0p0 and ttyd0p0 + + If the following sequence: + + set line /dev/cua0p0 ; or other device + set speed 115200 ; or other normal speed + + produces the message "?Unsupported line speed". This means either that + the port is not configured for dialout (go into SAM as described above + and make sure "Use device for calling out" is selected), or else that + speed you have given (such as 460800) is supported by the operating + system but not by the physical device (in which case, use a lower + speed like 57600). + + In HP-UX 9.0, serial device names began to change. The older names + looked like "/dev/cua00", "/dev/tty01", etc (sometimes with only one + digit). The newer names have two digits with the letter "p" in + between. HP-UX 8.xx and earlier have the older form, HP-UX 10.00 and + later have the newer form. HP-UX 9.xx has the newer form on Series 800 + machines, and the older form on other hardware models. The situation + is summarized in the following table (the Convio 10.0 column applies + to HP-UX 10 and 11). + + Converged HP-UX Serial I/O Filenames : TTY Mux Naming + --------------------------------------------------------------------- + General meaning Old Form S800 9.0 Convio 10.0 + --------------------------------------------------------------------- + tty* hardwired ports tty ttyp ttyp

+ diag:mux diag:mux + --------------------------------------------------------------------- + ttyd* dial-in modems ttyd ttydp ttydp

+ diag:ttydp diag:ttydp

+ --------------------------------------------------------------------- + cua* auto-dial out cua cuap cuap

+ diag:cuap + --------------------------------------------------------------------- + cul* dial-out cul culp culp

+ diag:culp + --------------------------------------------------------------------- + = LU (Logical Unit) = Devspec (decimal card instance) + or = Port

= Port + + For dialing out, you should use the cua or cul devices. When + C-Kermit's CARRIER setting is AUTO or ON, C-Kermit should pop back to + its prompt automatically if the carrier signal drops, e.g. when you + log out from the remote computer or service. If you use the ttyp + (e.g. tty0p0) device, the carrier signal should be ignored. The + ttyp device should be used for direct connections where the + carrier signal does not follow RS-232 conventions (use the cul device + for hardwired connections through a true null modem). Do not use the + ttydp device for dialing out. + + Kermit's access to serial devices is controlled by "UUCP lockfiles", + which are intended to prevent different users using different software + programs (Kermit, cu, etc, and UUCP itself) from accessing the same + serial device at the same time. When a device is in use by a + particular user, a file with a special name is created in: + + /var/spool/locks (HP-UX 10.00 and later) + /usr/spool/uucp (HP-UX 9.xx and earlier) + + The file's name indicates the device that is in use, and its contents + indicates the process ID (pid) of the process that is using the + device. Since serial devices and the locks directory are not both + publicly readable and writable, Kermit and other communication + software must be installed setuid to the owner (bin) of the serial + device and setgid to the group (daemon) of the /var/spool/locks + directory. Kermit's setuid and setgid privileges are enabled only when + opening the device and accessing the lockfiles. + + Let's say "unit" means a string of decimal digits (the interface + instance number) followed (in HP-UX 10.00 and later) by the letter "p" + (lowercase), followed by another string of decimal digits (the port + number on the interface), e.g.: + + "0p0", "0p1", "1p0", etc (HP-UX 10.00 and later) + "0p0", "0p1", "1p0", etc (HP-UX 9.xx on Series 800) + "00", "01", "10", "0", etc (HP-UX 9.xx not on Series 800) + "00", "01", "10", "0", etc (HP-UX 8.xx and earlier) + + Then a normal serial device (driver) name consists of a prefix ("tty", + "ttyd", "cua", "cul", or possibly "cuad" or "culd") followed by a + unit, e.g. "cua0p0". Kermit's treatment of UUCP lockfiles is as close + as possible to that of the HP-UX "cu" program. Here is a table of the + lockfiles that Kermit creates for unit 0p0: + + Selection Lockfile 1 Lockfile 2 + /dev/tty0p0 LCK..tty0p0 (none) +* /dev/ttyd0p0 LCK..ttyd0p0 (none) + /dev/cua0p0 LCK..cua0p0 LCK..ttyd0p0 + /dev/cul0p0 LCK..cul0p0 LCK..ttyd0p0 + /dev/cuad0p0 LCK..cuad0p0 LCK..ttyd0p0 + /dev/culd0p0 LCK..culd0p0 LCK..ttyd0p0 + LCK.. (none) + + (* = Dialin device, should not be used.) + + In other words, if the device name begins with "cu", a second lockfile + for the "ttyd" device, same unit, is created, which should prevent + dialin access on that device. + + The case allows for symbolic links, etc, but of course it is + not foolproof since we have no way of telling which device is really + being used. + + When C-Kermit tries to open a dialout device whose name ends with a + "unit", it searches the lockfile directory for all possible names for + the same unit. For example, if user selects /dev/cul2p3, Kermit looks + for lockfiles named: + + LCK..tty2p3 + LCK..ttyd2p3 + LCK..cua2p3 + LCK..cul2p3 + LCK..cuad2p3 + LCK..culd2p3 + + If any of these files are found, Kermit opens them to find out the ID + (pid) of the process that created them; if the pid is still valid, the + process is still active, and so the SET LINE command fails and the + user is informed of the pid so s/he can use "ps" to find out who is + using the device. + + If the pid is not valid, the file is deleted. If all such files (i.e. + with same "unit" designation) are successfully removed, then the SET + LINE command succeeds; up to six messages are printed telling the user + which "stale lockfiles" are being removed. + + When the "set line" command succeeds in HP-UX 10.00 and later, + C-Kermit also creates a Unix System V R4 "advisory lock" as a further + precaution (but not guarantee) against any other process obtaining + access to the device while you are using it. + + If the selected device was in use by "cu", Kermit can't open it, + because "cu" has changed its ownership, so we never get as far as + looking at the lockfiles. In the normal case, we can't even look at + the device to see who the owner is because it is visible only to its + (present) owner. In this case, Kermit says (for example): + + /dev/cua0p0: Permission denied + + When Kermit releases a device it has successfully opened, it removes + all the lockfiles that it created. This also happens whenever Kermit + exits "under its own power". + + If Kermit is killed with a device open, the lockfile(s) are left + behind. The next Kermit program that tries to assign the device, under + any of its various names, will automatically clean up the stale + lockfiles because the pids they contain are invalid. The behavior of + cu and other communication programs under these conditions should be + the same. + + Here, by the way, is a summary of the differences between the HP-UX + port driver types from John Pezzano of HP: + + There are three types of device files for each port. + + The ttydXXX device file is designed to work as follows: + + 1. The process that opens it does NOT get control of the port until + CD is asserted. This was intentional (over 15 years ago) to allow + getty to open the port but not control it until someone called in. + If a process wants to use the direct or callout device files + (ttyXXX and culXXX respectively), they will then get control and + getty would be blocked. This eliminated the need to use uugetty + (and its inherent problems with lock files) for modems. You can + see this demonstrated by the fact that "ps -ef" shows a ? in the + tty column for the getty process as getty does not have the port + yet. + 2. Once CD is asserted, the port is controlled by getty (or the + process handling an incoming call) if there was no process using + the port. The ? in the "ps" command now shows the port. At this + point, the port accepts data. + + Therefore you should use either the callout culXXX device file + (immediate control but no data until CD is asserted) or the direct + device file ttyXXX which gives immediate control and immediate data + and which ignores by default modem control signals. + + The ttydXXX device should be used only for callin and my + recommendation is to use it only for getty and uugetty. + ________________________________________________________________________ + + 3.2.4 Notes on Specific HP-UX Releases + + SECTION CONTENTS + + 3.2.4.1. [216]HP-UX 11 + 3.2.4.2. [217]HP-UX 10 + 3.2.4.3. [218]HP-UX 9 + 3.2.4.4. [219]HP-UX 8 + 3.2.4.5. [220]HP-UX 7 and Earlier + + 3.2.4.1. HP-UX 11 + + [ [221]Top ] [ [222]Contents ] [ [223]Section Contents ] [ [224]Next ] + + As noted in [225]Section 3.2.2, the HP-UX 11 Telnet server and/or + pseudoterminal driver are a serious impediment to file transfer over + Telnet connections into HP-UX. If you have a Telnet connection into + HP-UX 11, tell your desktop Kermit program to: + + set streaming off + set receive packet-length 2000 + set send packet-length 500 + + File transfer speeds over connections from HP-UX 11 (dialed or Telnet) + are not impeded whatsoever, and can go at whatever speed is allowed by + the connection and the Kermit partner on the far end. + + PA-RISC binaries for HP-UX 10.20 or later should run on any PA-RISC + system, S700 or S800, as long as the binary was not built under a + later HP-UX version than the host operating system. HP-UX 11.00 and + 11.11 are only for PA-RISC systems. HP-UX 11.20 is only for IA64 + (subsequent HP-UX releases will be for both PA-RISC and IA64). To + check binary compatibility, the following C-Kermit 8.0 binaries were + run successfully on an HP-9000/785 with HP-UX 11.11: + + * Model 7xx HP-UX 10.20 + * Model 8xx HP-UX 10.20 + * Model 7xx HP-UX 11.00 + * Model 8xx HP-UX 11.00 + * Model 7xx HP-UX 11.11 + * Model 8xx HP-UX 11.11 + + Binaries built under some of the earlier HP-UX releases, such as 9.05, + might also work, but only if built for the same hardware family (e.g. + s700). + ________________________________________________________________________ + + 3.2.4.2. HP-UX 10 + + [ [226]Top ] [ [227]Contents ] [ [228]Section Contents ] [ [229]Next ] + [ [230]Previous ] + + Beginning in HP-UX 10.10, libcurses is linked to libxcurses, the new + UNIX95 (X/Open) version of curses, which has some serious bugs; some + routines, when called, would hang and never return, some would dump + core. Evidently libxcurses contains a select() routine, and whenever + C-Kermit calls what it thinks is the regular (sockets) select(), it + gets the curses one, causing a segmentation fault. There is a patch + for this from HP, PHCO_8086, "s700_800 10.10 libcurses patch", "shared + lib curses program hangs on 10.10", "10.10 enhanced X/Open curses core + dumps due to using wrong select call", 96/08/02 (you can tell if the + patch is installed with "what /usr/lib/libxcurses.1"; the unpatched + version is 76.20, the patched one is 76.20.1.2). It has been verified + that C-Kermit works OK with the patched library, but results are not + definite for HP-UX 10.20 or higher. + + To ensure that C-Kermit works even on non-patched HP-UX 10.10 systems, + separate makefile entries are provided for HP-UX 10.00/10.01, 10.10, + 10.20, etc, in which the entries for 10.10 and above link with + libHcurses, which is "HP curses", the one that was used in + 10.00/10.01. HP-UX 11.20 and later, however, link with libcurses, as + libHcurses disappeared in 11.20. + ________________________________________________________________________ + + 3.2.4.3. HP-UX 9 + + [ [231]Top ] [ [232]Contents ] [ [233]Section Contents ] [ [234]Next ] + [ [235]Previous ] + + HP-UX 9.00 and 9.01 need patch PHNE_10572 (note: this replaces + PHNE_3641) for hptt0.o, asio0.o, and ttycomn.o in libhp-ux.a. Contact + Hewlett Packard if you need this patch. Without it, the dialout device + (tty) will be hung after first use; subsequent attempts to use will + return an error like "device busy". (There are also equivalent patches + for s700 9.03 9.05 9.07 (PHNE_10573) and s800 9.00 9.04 (PHNE_10416). + + When C-Kermit is in server mode, it might have trouble executing + REMOTE HOST commands. This problem happens under HP-UX 9.00 (Motorola) + and HP-UX 9.01 (RISC) IF the C-Shell is the login shell AND with the + C-Shell Revision 70.15. Best thing is to install HP's Patch PHCO_4919 + for Series 300/400 and PHCO_5015 for the Series 700/800. PHCO_5015 is + called "s700_800 9.X cumulative csh(1) patch with memory leak fix" + which works for HP-UX 9.00, 9.01, 9.03, 9.04, 9.05 and 9.07. At least + you need C-Shell Revision 72.12! + + C-Kermit works fine -- including its curses-based file-transfer + display -- on the console terminal, in a remote session (e.g. when + logged in to the HP 9000 on a terminal port or when telnetted or + rlogin'd), and in an HP-VUE hpterm window or an xterm window. + ________________________________________________________________________ + + 3.2.4.4. HP-UX 8 + + [ [236]Top ] [ [237]Contents ] [ [238]Section Contents ] [ [239]Next ] + [ [240]Previous ] + + To make C-Kermit work on HP-UX 8.05 on a model 720, obtain and install + HP-UX patch PHNE_0899. This patch deals with a lot of driver issues, + particularly related to communication at higher speeds. + + One user reports: + + On HP-UX 8 DON'T install 'tty patch' PHKL_4656, install PHKL_3047 + instead! Yesterday I tried this latest tty patch PHKL_4656 and had + terrible problems. This patch should fix RTS/CTS problems. With + text transver all looks nice. But when I switched over to binary + files the serial interface returned only rubish to C-Kermit. All + sorts of protocol, CRC and packed errors I had. After several tests + and after uninstalling that patch, all transvers worked fine. MB's + of data without any errors. So keep your fingers away from that + patch. If anybody needs the PHKL_3047 patch I have it here. It is + no longer availabel from HP's patch base. + ________________________________________________________________________ + + 3.2.4.5. HP-UX 7 and Earlier + + [ [241]Top ] [ [242]Contents ] [ [243]Section Contents ] [ + [244]Previous ] + + When transferring files into HP-UX 5 or 6 over a Telnet connection, + you must not use streaming, and you must not use a packet length + greater than 512. However, you can use streaming and longer packets + when sending files from HP-UX on a Telnet connection. In C-Kermit 8.0, + the default receive packet length for HP-UX 5 and 6 was changed to 500 + (but you can still increase it with SET RECEIVE PACKET-LENGTH if you + wish, e.g. for non-Telnet connections). Disable streaming with SET + STREAMING OFF. + + The HP-UX 5.00 version of C-Kermit does not include the fullscreen + file-transfer because of problems with the curses library. + + If HP-UX 5.21 with Wollongong TCP/IP is on the remote end of a Telnet + connection, streaming transfers to HP-UX invariably fail. Workaround: + SET STREAMING OFF. Packets longer than about 1000 should not be used. + Transfers from these systems, however, can use streaming and/or longer + packets. + + Reportedly, "[there is] a bug in C-Kermit using HP-UX version 5.21 on + the HP-9000 series 500 computers. It only occurs when the controlling + terminal is using an HP-27140 six-port modem mux. The problem is not + present if the controlling terminal is logged into an HP-27130 + eight-port mux. The symptom is that just after dialing successfully + and connecting Kermit locks up and the port is unusable until both + forks of Kermit and the login shell are killed." (This report predates + C-Kermit 6.0 and might no longer apply.) + ________________________________________________________________________ + + 3.2.5. HP-UX and X.25 + + [ [245]Top ] [ [246]Contents ] [ [247]Section Contents ] [ + [248]Previous ] + + Although C-Kermit presently does not include built-in support for + HP-UX X.25 (as it does for the Sun and IBM X.25 products), it can + still be used to make X.25 connections as follows: start Kermit and + then telnet to localhost. After logging back in, start padem as you + would normally do to connect over X.25. Padem acts as a pipe between + Kermit and X.25. In C-Kermit 7.0, you might also be able to avoid the + "telnet localhost" step by using: + + C-Kermit> pty padem address + + This works if padem uses standard i/o (who knows?). + ________________________________________________________________________ + + 3.3. C-KERMIT AND LINUX + + [ [249]Top ] [ [250]Contents ] [ [251]Section Contents ] [ [252]Next ] + [ [253]Previous ] + + SECTION CONTENTS + + 3.3.1. [254]Problems Building C-Kermit for Linux + 3.3.2. [255]Problems with Serial Devices in Linux + 3.3.3. [256]Terminal Emulation in Linux + 3.3.4. [257]Dates and Times + 3.3.5. [258]Startup Errors + 3.3.6. [259]The Fullscreen File Transfer Display + + REFERENCES + + For further information, read the [260]comp.os.linux.misc, + [261]comp.os.linux.answers, and other Linux-oriented newsgroups, and + see: + + The Linux Document Project (LDP) + [262]http://www.tldp.org/ + + The Linux FAQ + [263]http://www.tldp.org/FAQ/Linux-FAQ.html + + The Linux HOWTOs (especially the Serial HOWTO) + + [264]http://www.tldp.org/HOWTO/Serial-HOWTO.html + + [265]http://tldp.org/HOWTO/Modem-HOWTO.html + + [266]ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO + + [267]ftp://tsx-11.mit.edu/pub/linux/docs/HOWTO + + [268]http://www.tldp.org/HOWTO/ + + [269]http://www.tldp.org/hmirrors.html + + Linux Vendor Tech Support Pages: + + [270]http://www.redhat.com/apps/support/ + + [271]http://www.debian.org/support + + [272]http://www.slackware.com/support/ + + [273]http://www.caldera.com/support/ + + [274]http://www.suse.com/support/ + + [275]http://www.mandrake.com/support/ + + [276]http://www.turbolinux.com/support/ + + Linux Winmodem Support + [277]http://www.linmodems.org/ + + Also see general comments on PC-based Unixes in [278]Section 3.0. + + What Linux version is it? -- "uname -a" supplies only kernel + information, but these days it's the distribution that matters: Red + Hat 7.3, Debian 2.2, Slackware 8.0, etc. Unfortunately there's no + consistent way to get the distribution version. Usually it's in a + distribution-specific file: + + Red Hat: /etc/issue or /etc/redhat-release + Debian: /etc/debian_version + Slackware: /etc/slackware-version (at least in later versions) + + Did you know: DECnet is available for Linux? See: + + [279]http://linux.dreamtime.org/decnet/ + + (But there is no support for it in C-Kermit -- anybody interested in + adding it, please [280]let us know). + + Before proceeding, let's handle the some of the most frequently asked + question in the Linux newsgroups: + + 1. Neither C-Kermit nor any other Linux application can use + Winmodems, except in the [281]rare cases where Linux drivers have + been written for them. See [282]Section 3.0.2 for details. + 2. "Why does it take such a long time to make a telnet connection to + (or from) my Linux PC?" (this applies to C-Kermit and to regular + Telnet). Most telnet servers these days perform reverse DNS + lookups on the client (for security and/or logging reasons). If + the Telnet client's address cannot be found by the server's local + DNS server, the DNS request goes out to the Internet at large, and + this can take quite some time. The solution to this problem is to + make sure that both client and host are registered in DNS, and + that the registrations are exported. C-Kermit itself performs + reverse DNS lookups unless you tell it not to; this is to allow + C-Kermit to let you know which host it is actually connected to in + case you have made a connection to a host pool (multihomed host). + You can disable C-Kermit's reverse DNS lookup with SET TCP + REVERSE-DNS-LOOKUP OFF. + 3. (Any question that has the word "Telnet" in it...) The knee-jerk + reaction is "don't use Telnet, use SSH!" There's nothing wrong + with Telnet. In fact it's far superior to SSH as a protocol in + terms of features and extensibility, not to mention platform + neutrality. The issue lurking behind the knee-jerk reaction is + security. SSH is thought to be secure, whereas Telnet is thought + to be insecure. This is true for clear-text Telnet (because + passwords travel in the clear across the network), but apparently + few people realize that [283]secure Telnet clients and servers + have been available for years, and these are more secure than SSH + (for reasons explained [284]HERE. + 4. (Any question that has the word "FTP" in it...) The knee-jerk + reaction being "Don't use FTP, use SCP!" (or SFTP). Same answer as + above, but moreso. SCP and SFTP are not only not platform neutral, + they're diversity-hostile. They transfer files only in binary + mode, which mangles text files across different platforms, to the + same degree the platform's text-file record format and character + set differ. An extreme example would be an Variable-Block format + EBCDIC text file on an IBM mainframe, binary transfer of which to + Unix would do you little good indeed. FTP was designed with + diversity in mind and secure versions are available. + ________________________________________________________________________ + + 3.3.1. Problems Building C-Kermit for Linux + + [ [285]Top ] [ [286]Contents ] [ [287]Section Contents ] [ [288]Next ] + + Modern Linux distributions like Red Hat give you a choice at + installation whether to include "developer tools". Obviously, you + can't build C-Kermit or any other C program from source code if you + have not installed the developer tools. But to confuse matters, you + might also have to choose (separately) to install the "curses" or + "ncurses" terminal control library; thus it is possible to install the + C compiler and linker, but omit the (n)curses library and headers. If + curses is not installed, you will not be able to build a version of + C-Kermit that supports the fullscreen file-transfer display, in which + case you'll need to use the "linuxnc" makefile target (nc = No Curses) + or else install ncurses before building. + + There are all sorts of confusing issues caused by the many and varied + Linux distributions. Some of the worst involve the curses library and + header files: where are they, what are they called, which ones are + they really? Other vexing questions involve libc5 vs libc6 vs glibc vs + glibc2 (C libraries), gcc vs egcs vs lcc (compilers), plus using or + avoiding features that were added in a certain version of Linux or a + library or a distribution, and are not available in others. As of + C-Kermit 8.0, these questions should be resolved by the "linux" + makefile target itself, which does a bit of looking around to see + what's what, and then sets the appropriate CFLAGS. + ________________________________________________________________________ + + 3.3.2. Problems with Serial Devices in Linux + + [ [289]Top ] [ [290]Contents ] [ [291]Section Contents ] [ [292]Next ] + [ [293]Previous ] + + Also see: "man setserial", "man irqtune". + And: [294]Sections 3.0, [295]6, [296]7, and [297]8 of this + document. + + NOTE: Red Hat Linux 7.2 and later include a new API that allows + serial-port arbitration by non-setuid/gid programs. This API has + not yet been added to C-Kermit. If C-Kermit is to be used for + dialing out on Red Hat 7.2 or later, it must still be installed as + described in in Sections [298]10 and [299]11 of the + [300]Installation Instructions. + + Don't expect it to be easy. Queries like the following are posted to + the Linux newsgroups almost daily: + + Problem of a major kind with my Compaq Presario 1805 in the sense + that the pnpdump doesn't find the modem and the configuration tells + me that the modem is busy when I set everything by hand! + + I have , kernel 2.0.35. Using the + Compaq tells me that the modem (which is internal) is on COM2, with + the usual IRQ and port numbers. Running various Windows diagnostics + show me AT-style commands exchanged so I have no reason to beleive + that it is a Winmodem. Also, the diagnostics under Win98 tell me + that I am talking to an NS 16550AN. + + [Editor's note: This does not necessarily mean it isn't a Winmodem.] + + Under Linux, no joy trying to talk to the modem on /dev/cua1 + whether via minicom, kppp, or chat; kppp at least tells me that + tcgetattr() failed. + + Usage of setserial: + + setserial /dev/cua1 port 0x2F8 irq 3 autoconfig + setserial -g /dev/cua1 + + tells me that the uart is 'unknown'. I have tried setting the UART + manullay via. setserial to 16550A, 16550, and the other one (8550?) + (I didn't try 16540). None of these manual settings resulted in any + success. + + A look at past articles leads me to investigate PNP issues by + calling pnpdump but pnpdump returns "no boards found". I have + looked around on my BIOS (Phoenix) and there is not much evidence + of it being PNP aware. However for what it calls "Serial port A", + it offers a choice of Auto, Disabled or Manual settings (currently + set to Auto), but using the BIOS interface I tried to change to + 'manual' and saw the default settings offered to be were 0x3F8 and + IRQ 4 (COM1). The BIOS menus did not give me any chance to + configure COM2 or any "modem". I ended up not saving any BIOS + changes in the course of my investigations. + + You can also find out a fair amount about your PC's hardware + configuration in the text files in /proc, e.g.: + + -r--r--r-- 1 root 0 Sep 4 14:00 /proc/devices + -r--r--r-- 1 root 0 Sep 4 14:00 /proc/interrupts + -r--r--r-- 1 root 0 Sep 4 14:00 /proc/ioports + -r--r--r-- 1 root 0 Sep 4 14:00 /proc/pci + + From the directory listing they look like empty files, but in fact + they are text files that you "cat": + +$ cat /proc/pci + Bus 0, device 14, function 0: + Serial controller: US Robotics/3Com 56K FaxModem Model 5610 (rev 1). + IRQ 10. + I/O at 0x1050 [0x1057]. + +$ setserial -g /dev/ttyS4 +/dev/ttyS4, UART: 16550A, Port: 0x1050, IRQ: 10 + +$ cat /proc/ioports +1050-1057 : US Robotics/3Com 56K FaxModem Model 5610 + 1050-1057 : serial(auto) + +$ cat /proc/interrupts + CPU0 + 0: 7037515 XT-PIC timer + 1: 2 XT-PIC keyboard + 2: 0 XT-PIC cascade + 4: 0 XT-PIC serial + 8: 1 XT-PIC rtc + 9: 209811 XT-PIC usb-uhci, eth0 + 14: 282015 XT-PIC ide0 + 15: 6 XT-PIC ide1 + + Watch out for PCI, PCMCIA and Plug-n-Play devices, Winmodems, and the + like (see cautions in [301]Section 3.0 Linux supports Plug-n-Play + devices to some degree via the isapnp and pnpdump programs; read the + man pages for them. (If you don't have them, look on your installation + CD for isapnptool or download it from sunsite or a sunsite mirror or + other politically correct location du jour). + + PCI modems do not use standard COM port addresses. The I/O address and + IRQ are assigned by the BIOS. All you need to do to get one working, + find out the I/O address and interrupt number with (as root) "lspci -v + | more" and then give the resulting address and interrupt number to + setserial. + + Even when you have a real serial port, always be wary of interrupt + conflicts and similar PC hardware configuration issues: a PC is not a + real computer like other Unix workstations -- it is generally pieced + together from whatever random components were the best bargain on the + commodity market the week it was built. Once it's assembled and boxed, + not even the manufacturer will remember what it's made of or how it + was put together because they've moved on to a new model. Their job is + to get it (barely) working with Windows; for Linux and other OS's you + are on your own. + + "set line /dev/modem" or "set line /dev/ttyS2", etc, results in an + error, "/dev/modem is not a tty". Cause unknown, but obviously a + driver issue, not a Kermit one (Kermit uses "isatty()" to check that + the device is a tty, so it knows it will be able to issue all the + tty-related ioctl's on it, like setting the speed & flow control). Try + a different name (i.e. driver) for the same port, e.g. "set line + /dev/cua2" or whatever. + + To find what serial ports were registered at the most recent system + boot, type (as root): "grep tty /var/log/dmesg". + + "set modem type xxx" (where xxx is the name of a modem) followed by + "set line /dev/modem" or "set + line /dev/ttyS2", etc, hangs (but can be interrupted with Ctrl-C). + Experimentation shows that if the modem is configured to always assert + carrier (&C0) the same command does not hang. Again, a driver issue. + Use /dev/cua2 (or whatever) instead. (Or not -- hopefully none of + these symptoms occurs in C-Kermit 7.0 or later.) + + "set line /dev/cua0" reports "Device is busy", but "set line + /dev/ttyS0" works OK. + + In short: If the cua device doesn't work, try the corresponding ttyS + device. If the ttyS device doesn't work, try the corresponding cua + device -- but note that Linux developers do not recommend this, and + are phasing out the cua devices. From /usr/doc/faq/howto/Serial-HOWTO: + + 12.4. What's The Real Difference Between the /dev/cuaN And /dev/ttySN + Devices? + The only difference is the way that the devices are opened. The + dialin devices /dev/ttySN are opened in blocking mode, until CD + is asserted (ie someone connects). So, when someone wants to + use the /dev/cuaN device, there is no conflict with a program + watching the /dev/ttySN device (unless someone is connected of + course). The multiple /dev entries, allow operation of the same + physical device with different operating characteristics. It + also allows standard getty programs to coexist with any other + serial program, without the getty being retrofitted with + locking of some sort. It's especially useful since standard + Unix kernel file locking, and UUCP locking are both advisory + and not mandatory. + + It was discovered during development of C-Kermit 7.0 that rebuilding + C-Kermit with -DNOCOTFMC (No Close/Open To Force Mode Change) made the + aforementioned problem with /dev/ttyS0 go away. It is not yet clear, + however, what its affect might be on the /dev/cua* devices. As of 19 + March 1998, this option has been added to the CFLAGS in the makefile + entries for Linux ("make linux"). + + Note that the cua device is now "deprecated", and new editions of + Linux will phase (have phased) it out in favor of the ttyS device. See + (if it's still there): + + [302]http://linuxwww.db.erau.edu/mail_archives/linux-kernel/Mar_98/1441.html + + (no, of course it isn't; you'll have to use your imagination). One + user reported that C-Kermit 7.0, when built with egcs 1.1.2 and run on + Linux 2.2.6 with glibc 2.1 (hardware unknown but probably a PC) dumps + core when given a "set line /dev/ttyS1" command. When rebuilt with + gcc, it works fine. + + All versions of Linux seem to have the following deficiency: When a + modem call is hung up and CD drops, Kermit can no longer read the + modem signals; SHOW COMMUNICATIONS says "Modem signals not available". + The TIOCMGET ioctl() returns -1 with errno 5 ("I/O Error"). + + The Linux version of POSIX tcsendbreak(), which is used by C-Kermit to + send regular (275msec) and long (1.5sec) BREAK signals, appears to + ignore its argument (despite its description in the man page and info + topic), and always sends a regular 275msec BREAK. This has been + observed in Linux versions ranging from Debian 2.1 to Red Hat 7.1. + ________________________________________________________________________ + + 3.3.3. Terminal Emulation in Linux + + [ [303]Top ] [ [304]Contents ] [ [305]Section Contents ] [ [306]Next ] + [ [307]Previous ] + + C-Kermit is not a terminal emulator. For a brief explanation of why + not, see [308]Section 3.0.5. For a fuller explanation, [309]ClICK + HERE. + + In Unix, terminal emulation is supplied by the Window in which you run + Kermit: the regular console screen, which provides Linux Console + "emulation" via the "console" termcap entry, or under X-Windows in an + xterm window, which gives VTxxx emulation. An xterm that includes + color ANSI and VT220 emulation is available with Xfree86: + + [310]http://dickey.his.com/xterm/xterm.html + + Before starting C-Kermit in an xterm window, you might need to tell + the xterm window's shell to "stty sane". + + To set up your PC console keyboard to send VT220 key sequences when + using C-Kermit as your communications program in an X terminal window + (if it doesn't already), create a file somewhere (e.g. in /root/) + called .xmodmaprc, containing something like the following: + + keycode 77 = KP_F1 ! Num Lock => DEC Gold (PF1) + keycode 112 = KP_F2 ! Keypad / => DEC PF1 + keycode 63 = KP_F3 ! Keypad * => DEC PF3 + keycode 82 = KP_F4 ! Keypad - => DEC PF4 + keycode 111 = Help ! Print Screen => DEC Help + keycode 78 = F16 ! Scroll Lock => DEC Do + keycode 110 = F16 ! Pause => DEC Do + keycode 106 = Find ! Insert => DEC Find + keycode 97 = Insert ! Home => DEC Insert + keycode 99 = 0x1000ff00 ! Page Up => DEC Remove + keycode 107 = Select ! Delete => DEC Select + keycode 103 = Page_Up ! End => DEC Prev Screen + keycode 22 = Delete ! Backspace sends Delete (127) + + Then put "xmodmap filename" in your .xinitrc file (in your login + directory), e.g. + + xmodmap /root/.xmodmaprc + + Of course you can move things around. Use the xev program to find out + key codes. + + Console-mode keys are mapped separately using loadkeys, and different + keycodes are used. Find out what they are with showkey. + + For a much more complete VT220/320 key mapping for [311]Xfree86 xterm, + [312]CLICK HERE. + ________________________________________________________________________ + + 3.3.4. Dates and Times + + [ [313]Top ] [ [314]Contents ] [ [315]Section Contents ] [ [316]Next ] + [ [317]Previous ] + + If C-Kermit's date-time (e.g. as shown by its DATE command) differs + from the system's date and time: + + a. Make sure the libc to which Kermit is linked is set to GMT or is + not set to any time zone. Watch out for mixed libc5/libc6 systems; + each must be set indpendently. + b. If you have changed your TZ environment variable, make sure it is + exported. This is normally done in /etc/profile or /etc/TZ. + ________________________________________________________________________ + + 3.3.5. Startup Errors + + [ [318]Top ] [ [319]Contents ] [ [320]Section Contents ] [ [321]Next ] + [ [322]Previous ] + + C-Kermit should work on all versions of Linux current through March + 2003, provided it was built on the same version you have, with the + same libraries and header files (just get the source code and "make + linux"). Binaries tend not to travel well from one Linux machine to + another, due to their many differences. There is no guarantee that a + particular C-Kermit binary will not stop working at a later date, + since Linux tends to change out from under its applications. If that + happens, rebuild C-Kermit from source. If something goes wrong with + the build process, look on the [323]C-Kermit website for a newer + version. If you have the latest version, then [324]report the problem + to us. + + Inability to transfer files in Red Hat 7.2: the typical symptom would + be if you start Kermit and tell it to RECEIVE, it fails right away + with "?/dev/tty: No such device or address" or "?Bad file descriptor". + One report says this is because of csh, and if you change your shell + to bash or other shell, it doesn't happen. Another report cite bugs in + Red Hat 7.2 Telnetd "very seldom (if ever) providing a controlling + tty, and lots of other people piled on saying they have the same + problem.") A third theory is that this happens only when Linux has + been installed without "virtual terminal support". + + A search of RedHat's errata pages shows a bug advisory (RHBA-2001-153) + issued 13 November 2001, but updated 6 December, about this same + symptom (but with tcsh and login.) Seems that login was not always + assigning a controlling TTY for the session, which would make most use + of "/dev/tty" somewhat less than useful. + + [325]http://www.redhat.com/support/errata/RHBA-2001-153.html + + Quoting: "Due to terminal handling problems in /bin/login, tcsh would + not find the controlling terminal correctly, and a shell in single + user mode would exhibit strange terminal input characteristics. This + update fixes both of these problems." + + Since the Red Hat 5.1 release (circa August 1998), there have been + numerous reports of prebuilt Linux executables, and particularly the + Kermit RPM for Red Hat Linux, not working; either it won't start at + all, or it gives error messages about "terminal type unknown" and + refuses to initialize its curses support. The following is from the + [326]Kermit newsgroup: + + From: rchandra@hal9000.buf.servtech.com + Newsgroups: comp.protocols.kermit.misc + Subject: Red Hat Linux/Intel 5.1 and ncurses: suggestions + Date: 22 Aug 1998 15:54:46 GMT + Organization: Verio New York + Keywords: RedHat RPM 5.1 + + Several factors can influence whether "linux" is recognized as a + terminal type on many Linux systems. + + 1. Your program, or the libraries it linked with (if statically + linked), or the libraries it dynamically links with at runtime, + are looking for an entry in /etc/termcap that isn't there. (not + likely, but possible... I believe but am not certain that this is + a very old practice in very old [n]curses library implementations + to use a single file for all terminal descriptions.) + 2. Your program, or the libraries...are looking for a terminfo file + that just plain isn't there. (also not so likely, since many + people in other recent message threads said that other programs + work OK). + 3. Your program, or the libraries...are looking for a terminfo file + that is stored at a pathname that isn't expected by your program, + the libraries--and so on. I forgot if I read this in the errata + Web page or where exactly I discovered this (Netscape install? + Acrobat install?), but it may just be that one libc (let's say for + sake of argument, libc5, but I don't know this to be true) expects + your terminfo to be in /usr/share/terminfo, and the other (let's + say libc6/glibc) expects /usr/lib/terminfo. I remember that the + specific instructions in this bugfix/workaround were to do the + following or equivalent: + cd /usr/lib + ln -s ../share/terminfo ./terminfo + or: + ln -s /usr/share/terminfo /usr/lib/terminfo + + So what this says is that the terminfo database/directory structure + can be accessed by either path. When something goes to reference + /usr/lib/terminfo, the symlink redirects it to essentially + /usr/share/terminfo, which is where it really resides on your + system. I personally prefer wherever possible to use relative + symlinks, because they still hold, more often than break, across + mount points, particularly NFS mounts, where the directory + structure may be different on the different systems. + + Evidently the terminfo file moved between Red Hat 5.0 and 5.1, but Red + Hat did not include a link to let applications built prior to 5.1 find + it. Users reported that installing the link fixes the problem. + ________________________________________________________________________ + + 3.3.6. The Fullscreen File Transfer Display + + [ [327]Top ] [ [328]Contents ] [ [329]Section Contents ] [ + [330]Previous ] + + Starting with ncurses versions dated 1998-12-12 (about a year before + ncurses 5.0), ncurses sets the terminal for buffered i/o, but + unfortunately is not able to restore it upon exit from curses (via + endwin()). Thus after a file transfer that uses the fullscreen file + transfer display, the terminal no longer echos nor responds + immediately to Tab, ?, and other special command characters. The same + thing happens on other platforms that use ncurses, e.g. FreeBSD. + Workarounds: + + * Use SET XFER DISPLAY BRIEF, CRT, SERIAL, or NONE instead of + FULLSCREEN; or: + * Rebuild with KFLAGS=-DNONOSETBUF (C-Kermit 8.0) + + In Red Hat 7.1, when using C-Kermit in a Gnome terminal window, it was + noticed that when the fullscreen file transfer display exits (via + endwin()), the previous (pre-file-transfer-display) screen is + restored. Thus you can't look at the completed display to see what + happened. This is a evidently a new feature of xterm. I can only + speculate that initscreen() and endwin() must send some kind of + special escape sequences that command xterm to save and restore the + screen. To defeat this effect, tell Linux you have a vt100 or other + xterm-compatible terminal that is not actually an xterm, or else tell + Kermit to SET TRANSFER DISPLAY to something besides FULLSCREEN. + ________________________________________________________________________ + + 3.4. C-KERMIT AND NEXTSTEP + + [ [331]Top ] [ [332]Contents ] [ [333]Section Contents ] [ [334]Next ] + [ [335]Previous ] + + Run C-Kermit in a Terminal, Stuart, or xterm window, or when logged in + remotely through a serial port or TELNET connection. C-Kermit does not + work correctly when invoked directly from the NeXTSTEP File Viewer or + Dock. This is because the terminal-oriented gtty, stty, & ioctl calls + don't work on the little window that NeXTSTEP pops up for non-NeXTSTEP + applications like Kermit. CBREAK and No-ECHO settings do not take + effect in the command parser -- commands are parsed strictly line at a + time. "set line /dev/cua" works. During CONNECT mode, the console + stays in cooked mode, so characters are not transmitted until carriage + return or linefeed is typed, and you can't escape back. If you want to + run Kermit directly from the File Viewer, then launch it from a shell + script that puts it in the desired kind of window, something like this + (for "Terminal"): + + Terminal -Lines 24 -Columns 80 -WinLocX 100 -WinLocY 100 $FONT $FONTSIZE \ + -SourceDotLogin -Shell /usr/local/bin/kermit & + + C-Kermit does not work correctly on a NeXT with NeXTSTEP 3.0 to which + you have established an rlogin connection, due to a bug in NeXTSTEP + 3.0, which has been reported to NeXT. + + The SET CARRIER command has no effect on the NeXT -- this is a + limitation of the NeXTSTEP serial-port device drivers. + + Hardware flow control on the NeXT is selected not by "set flow + rts/cts" in Kermit (since NeXTSTEP offers no API for this), but + rather, by using a specially-named driver for the serial device: + /dev/cufa instead /dev/cua; /dev/cufb instead of /dev/cub. This is + available only on 68040-based NeXT models (the situation for Intel + NeXTSTEP implementations is unknown). + + NeXT-built 68030 and 68040 models have different kinds of serial + interfaces; the 68030 has a Macintosh-like RS-422 interface, which + lacks RTS and CTS signals; the 68040 has an RS-423 (RS-232 compatible) + interface, which supports the commonly-used modem signals. WARNING: + the connectors look exactly the same, but the pins are used in + completely DIFFERENT ways -- different cables are required for the two + kinds of interfaces. + + IF YOU GET LOTS OF RETRANSMISSIONS during file transfer, even when + using a /dev/cuf* device and the modem is correctly configured for + RTS/CTS flow control, YOU PROBABLY HAVE THE WRONG KIND OF CABLE. + + On the NeXT, Kermit reportedly (by TimeMon) causes the kernel to use a + lot of CPU time when using a "set line" connection. That's because + there is no DMA channel for the NeXT serial port, so the port must + interrupt the kernel for each character in or out. + + One user reported trouble running C-Kermit on a NeXT from within + NeXT's Subprocess class under NeXTstep 3.0, and/or when rlogin'd from + one NeXT to another: Error opening /dev/tty:, congm: No such device or + address. Diagnosis: Bug in NeXTSTEP 3.0, cure unknown. + ________________________________________________________________________ + + 3.5. C-KERMIT AND QNX + + [ [336]Top ] [ [337]Contents ] [ [338]Section Contents ] [ [339]Next ] + [ [340]Previous ] + + See also: The [341]comp.os.qnx newsgroup. + + Support for QNX 4.x was added in C-Kermit 5A(190). This is a + full-function implementation, thoroughly tested on QNX 4.21 and later, + and verified to work in both 16-bit and 32-bit versions. The 16-bit + version was dropped in C-Kermit 7.0 since it can no longer be built + successfully (after stripping most most features, I succeeded in + getting it to compile and link without complaint, but the executable + just beeps when you run it); for 16-bit QNX 4.2x, use C-Kermit 6.0 or + earlier, or else [342]G-Kermit. + + The 32-bit version (and the 16-bit version prior to C-Kermit 7.0) + supports most of C-Kermit's advanced features including TCP/IP, high + serial speeds, hardware flow-control, modem-signal awareness, curses + support, etc. + + BUG: In C-Kermit 6.0 on QNX 4.22 and earlier, the fullscreen file + transfer display worked fine the first time, but was fractured on + subsequent file transfers. Cause and cure unknown. In C-Kermit 7.0 and + QNX 4.25, this no longer occurs. It is not known if it would occur in + C-Kermit 7.0 or later on earlier QNX versions. + + Dialout devices are normally /dev/ser1, /dev/ser2, ..., and can be + opened explicitly with SET LINE. Reportedly, "/dev/ser" (no unit + number) opens the first available /dev/sern device. + + Like all other Unix C-Kermit implementations, QNX C-Kermit does not + provide any kind of terminal emulation. Terminal specific functions + are provided by your terminal, terminal window (e.g. QNX Terminal or + xterm), or emulator. + + QNX C-Kermit, as distributed, does not include support for UUCP + line-locking; the QNX makefile entries (qnx32 and qnx16) include the + -DNOUUCP switch. This is because QNX, as distributed, does not include + UUCP, and its own communications software (e.g. qterm) does not use + UUCP line locking. If you have a UUCP product installed on your QNX + system, remove the -DNOUUCP switch from the makefile entry and + rebuild. Then check to see that Kermit's UUCP lockfile conventions are + the same as those of your UUCP package; if not, read the [343]UUCP + lockfile section of the [344]Installation Instructions and make the + necessary changes to the makefile entry (e.g. add -DHDBUUCP). + + QNX does, however, allow a program to get the device open count. This + can not be a reliable form of locking unless all applications do it, + so by default, Kermit uses this information only for printing a + warning message such as: + + C-Kermit>set line /dev/ser1 + WARNING - "/dev/ser1" looks busy... + + However, if you want to use it as a lock, you can do so with: + + SET QNX-PORT-LOCK { ON, OFF } + + This is OFF by default; if you set in ON, C-Kermit will fail to open + any dialout device when its open count indicates that another process + has it open. SHOW COMM (in QNX only) displays the setting, and if you + have a port open, it also shows the open count. + + As of C-Kermit 8.0, C-Kermit's "open-count" form of line locking works + only in QNX4, not in QNX6 (this might change in a future C-Kermit + release). + ________________________________________________________________________ + + 3.6. C-KERMIT AND SCO + + [ [345]Top ] [ [346]Contents ] [ [347]Section Contents ] [ [348]Next ] + [ [349]Previous ] + + SECTION CONTENTS + +3.6.1. [350]SCO XENIX +3.6.2. [351]SCO UNIX and OSR5 +3.6.3. [352]Unixware +3.6.4. [353]Open UNIX 8 + + REFERENCES + + * The comp.unix.sco.* newsgroups. + * [354]Section 3.10 below for Unixware. + * The following FAQs: + + The comp.sco.misc FAQ: + [355]http://aplawrence.com/SCOFAQ/ + + Caldera (SCO) comp.unix.sco.programmer FAQ: + [356]http://www.zenez.com/cgi-bin/scoprogfaq/faq.pl + + The UnixWare 7/OpenUNIX 8 FAQ: + [357]http://www.zenez.com/cgi-bin/scouw7faq/faq.pl + [358]http://zenez.pcunix.com/cgi-bin/scouw7faq/faq.pl + + High Speed Modems for SCO Unix: + [359]http://pcunix.com/Unixart/modems.html + + The UnixWare FAQ + [360]http://www.freebird.org/faq/ + + The UnixWare 1.x and 2.0 Programmer FAQ + [361]http://www.freebird.org/faq/developer.html + + Caldera Support Knowledge Base + [362]http://support.caldera.com/caldera + + [363]http://stage.caldera.com/ta/ + Caldera (SCO) Technical Article Search Center + + [364]http://aplawrence.com/newtosco.html + New to SCO (Tony Lawrence) + + The same comments regarding terminal emulation and key mapping apply + to SCO operating systems as to all other Unixes. C-Kermit is not a + terminal emulator, and you can't use it to map F-keys, Arrow keys, + etc. The way to do this is with xmodmap (xterm) or loadkeys (console). + For a brief explanation, see [365]Section 3.0.5. For a fuller + explanation, [366]ClICK HERE. + + Also see general comments on PC-based Unixes in [367]Section 3.0. + + 3.6.1. SCO XENIX + + [ [368]Top ] [ [369]Contents ] [ [370]Section Contents ] [ [371]Next ] + + Old Xenix versions... Did you know: Xenix 3.0 is *older* than Xenix + 2.0? + + In Xenix 2.3.4 and probably other Xenix versions, momentarily dropping + DTR to hang up a modem does not work. DTR goes down but does not come + up again. Workaround: Use SET MODEM HANGUP-METHOD MODEM-COMMAND. + Anybody who would like to fix this is welcome to take a look at + tthang() in [372]ckutio.c. Also: modem signals can not be read in + Xenix, and the maximum serial speed is 38400. + + There is all sorts of confusion among SCO versions, particularly when + third- party communications boards and drivers are installed, + regarding lockfile naming conventions, as well as basic functionality. + As far as lockfiles go, all bets are off if you are using a + third-party multiport board. At least you have the source code. + Hopefully you also have a C compiler :-) + + Xenix 2.3.0 and later claim to support RTSFLOW and CTSFLOW, but this + is not modern bidirectional hardware flow control; rather it + implements the original RS-232 meanings of these signals for + unidirectional half-duplex line access: If both RTSFLOW and CTSFLOW + bits are set, Xenix asserts RTS when it wants to send data and waits + for CTS assertion before it actually starts sending data (also, + reportedly, even this is broken in Xenix 2.3.0 and 2.3.1). + ________________________________________________________________________ + + 3.6.2. SCO UNIX AND OSR5 + + [ [373]Top ] [ [374]Contents ] [ [375]Section Contents ] [ [376]Next ] + [ [377]Previous ] + + SCO systems tend to use different names (i.e. drivers) for the same + device. Typically /dev/tty1a refers to a terminal device that has no + modem control; open, read, write, and close operations do not depend + on carrier. On the other hand, /dev/tty1A (same name, but with final + letter upper case), is the same device with modem control, in which + carrier is required (the SET LINE command does not complete until + carrier appears, read/write operations fail if there is no carrier, + etc). + + SCO OpenServer 5.0.5 and earlier do not support the reading of modem + signals. Thus "show comm" does not list modem signals, and C-Kermit + does not automatically pop back to its prompt when the modem hangs up + the connection (drops CD). The ioctl() call for this is simply not + implmented, at least not in the standard drivers. OSR5.0.6 attempts to + deal with modem signals but fails; however OSR5.0.6a appears to + function properly. + + Dialing is likely not to work well in SCO OpenServer 5.0.x because + many of the serial-port APIs simply do not operate when using the + standard drivers. For example, if DTR is dropped by the recommended + method (setting speed to 0 for half a seconds, then restoring the + speed), DTR and RTS go down but never come back up. When in doubt SET + MODEM HANGUP-METHOD MODEM-COMMAND or SET DIAL HANGUP OFF. + + On the other hand, certain functions that might not (do not) work + right or at all when using SCO drivers (e.g. high serial speeds, + hardware flow control, and/or reading of modem signals) might work + right when using third-party drivers. (Example: hardware flow control + works, reportedly, only on uppercase device like tty1A -- not tty1a -- + and only when CLOCAL is clear when using the SCO sio driver, but there + are no such restrictions in, e.g., [378]Digiboard drivers). + + One user reports that he can't transfer large files with C-Kermit + under SCO OSR5.0.0 and 5.0.4 -- after the first 5K, everything falls + apart. Same thing without Kermit -- e.g. with ftp over a PPP + connection. Later, he said that replacing SCO's SIO driver with FAS, + an alternative communications driver, made the problem go away: + + [379]ftp://ftp.fu-berlin.de/pub/unix/driver/fas + + With regard to bidirectional serial ports on OpenServer 5.0.4, the + following advice appeared on an SCO-related newsgroup: + + No amount of configuration information is going to help you on + 5.0.4 unless it includes the kludge for the primary problem. With + almost every modem, the 5.0.4 getty will barf messages and may or + may not connect. There are 2 solutions and only one works on 5.0.4. + Get the atdialer binary from a 5.0.0 system and substitute it for + the native 5.0.4 atdialer. The other solution is to upgrade to + 5.0.5. And, most of all, on any OpenServer products, do NOT run the + badly broken Modem Manager. Configure the modems in the time + honored way that dates back to Xenix. + + Use SCO-provided utilities for switching the directionality of a modem + line, such as "enable" and "disable" commands. For example, to dial + out on tty1a, which is normally set up for logins: + + disable tty1a + kermit -l /dev/tty1a + enable tty1a + + If a tty device is listed as an ACU in /usr/lib/uucp/Devices and is + enabled, getty resets the ownership and permissions to uucp.uucp and + 640 every time the device is released. If you want to use the device + only for dialout, and you want to specify other owners or permissions, + you should disable it in /usr/lib/uucp/Devices; this will prevent + getty from doing things to it. You should also changes the device's + file modes in /etc/conf/node.d/sio by changing fields 5-7 for the + desired device(s); this determines how the devices are set if you + relink the kernel. + + One SCO user of C-Kermit 5A(190) reported that only one copy of Kermit + can run at a time when a Stallion Technologies multiport boards are + installed. Cause, cure, and present status unknown (see [380]Section + 14 for more info regarding Stallion). + + Prior to SCO OpenServer 5.0.4, the highest serial port speed supported + by SCO was 38400. However, in some SCO versions (e.g. OSR5) it is + possible to map rarely-used lower speeds (like 600 and 1800) to higher + ones like 57600 and 115200. To find out how, go to + [381]http://www.sco.com/ and search for "115200". In OSR5.0.4, serial + speeds up to 921600 are supported through the POSIX interface; + C-Kermit 6.1.193 or later, when built for OSR5.0.4 using /bin/cc (NOT + the UDK, which hides the high-speed definitions from CPP), supports + these speeds, but you might be able to run this binary on earlier + releases to get the high serial speeds, depending on various factors, + described by Bela Lubkin of SCO: + + Serial speeds under SCO Unix / Open Desktop / OpenServer + ======================================================== + Third party drivers (intelligent serial boards) may provide any speeds + they desire; most support up to 115.2Kbps. + + SCO's "sio" driver, which is used to drive standard serial ports with + 8250/16450/16550 and similar UARTs, was limited to 38400bps in older + releases. Support for rates through 115.2Kbps was added in the + following releases: + + SCO OpenServer Release 5.0.0 (requires supplement "rs40b") + SCO OpenServer Release 5.0.2 (requires supplement "rs40a" or "rs40b") + SCO OpenServer Release 5.0.4 or later + SCO Internet FastStart Release 1.0.0 or later + + SCO supplements are at [382]ftp://ftp.sco.com/; the "rs40" series are + under directory /Supplements/internet + + Kermit includes the high serial speeds in all OSR5 builds, but that + does not necessarily mean they work. For example, on our in-house + 5.0.5 system, SET SPEED 57600 or higher seems to succeed (no error + occurs) but when we read the speed back the driver says it is 50. + Similarly, 76800 becomes 75, and 115200 becomes 110. Testing shows the + resulting speed is indeed the low one we read back, not the high one + we asked for. Moral: Use speeds higher than 38400 with caution on SCO + OSR5. + + Reportedly, if you have a script that makes a TCP/IP SET HOST (e.g. + Telnet) connection to SCO 3.2v4.2 with TCP/IP 1.2.1, and then does the + following: + + script $ exit + hangup + + this causes a pseudoterminal (pty) to be consumed on the SCO system; + if you do it enough times, it will run out of ptys. An "exit" command + is being sent to the SCO shell, and a HANGUP command is executed + locally, so the chances are good that both sides are trying to close + the connection at once, perhaps inducing a race condition in which the + remote pty is not released. It was speculated that this would be fixed + by applying SLS net382e, but it did not. Meanwhile, the workaround is + to insert a "pause" between the SCRIPT and HANGUP commands. (The + situation with later SCO releases is not known.) + + SCO UNIX and OpenServer allow their console and/or terminal drivers to + be configured to translate character sets for you. DON'T DO THIS WHEN + USING KERMIT! First of all, you don't need it -- Kermit itself already + does this for you. And second, it will (a) probably ruin the + formatting of your screens (depending on which emulation you are + using); and (b) interfere with all sorts of other things -- legibility + of non-ASCII text on the terminal screen, file transfer, etc. Use: + + mapchan -n + + to turn off this feature. + + Note that there is a multitude of SCO entries in the makefile, many of + them exhibiting an unusually large number of compiler options. Some + people actually understand all of this. Reportedly, things are + settling down with SCO OpenServer 5.x and Unixware 7 (and Open UNIX 8 + and who knows what the next one will be -- Linux probably) -- the SCO + UDK compiler is said to generate binaries that will run on either + platform, by default, automatically. When using gcc or egcs, on the + other hand, differences persist, plus issues regarding the type of + binary that is generated (COFF, ELF, etc), and where and how it can + run. All of this could stand further clarification by SCO experts. + ________________________________________________________________________ + + 3.6.3. Unixware + + [ [383]Top ] [ [384]Contents ] [ [385]Section Contents ] [ [386]Next ] + [ [387]Previous ] + + Unixware changed hands several times before landing at SCO, and so has + its [388]own section in this document. (Briefly: AT&T UNIX Systems + Laboratories sold the rights to the UNIX name and to System V R4 (or + R5?) to Novell; later Novell spun its UNIX division off into a new + company called Univel, which eventually was bought by SCO, which later + was bought by Caldera, which later sort of semi-spun-off SCO...) + ________________________________________________________________________ + + 3.6.4. Open UNIX 8 + + [ [389]Top ] [ [390]Contents ] [ [391]Section Contents ] [ + [392]Previous ] + + SCO was bought by Caldera in 2000 or 2001 and evolved Unixware 7.1 + into Caldera Open UNIX 8.00. It's just like Unixware 7.1 as far as + Kermit is concerned (the Unixware 7.1 makefile target works for Open + UNIX 8.00, and in fact a Unixware 7.1 Kermit binary built on Unixware + 7.1 runs under OU8; a separate OU8 makefile target exists simply to + generate an appropriate program startup herald). Open Unix is now + defunct; subsequent releases are called UnixWare again (e.g. UnixWare + 7.1.3). + ________________________________________________________________________ + + 3.7. C-KERMIT AND SOLARIS + + [ [393]Top ] [ [394]Contents ] [ [395]Section Contents ] [ [396]Next ] + [ [397]Previous ] + + SECTION CONTENTS + +3.7.1. [398]Serial Port Configuration +3.7.2. [399]Serial Port Problems +3.7.3. [400]SunLink X.25 +3.7.4. [401]Sun Workstation Keyboard Mapping +3.7.5. [402]Solaris 2.4 and Earlier + + REFERENCES + + * The [403]comp.unix.solaris newsgroup + * [404]http://access1.sun.com/ + * [405]http://docs.sun.com/ + * [406]http://www.sunhelp.com/ + * [407]http://www.wins.uva.nl/pub/solaris/solaris2/ + * [408]http://www.wins.uva.nl/cgi-bin/sfaq.cgi + * [409]ftp://ftp.wins.uva.nl/pub/solaris + * [410]http://www.science.uva.nl/pub/solaris/solaris2.html + + And about serial communications in particular, see "Celeste's Tutorial + on Solaris 2.x Modems and Terminals": + + [411]http://www.stokely.com/ + + In particular: + + [412]http://www.stokely.com/unix.sysadm.resources/faqs.sun.html + + For PC-based Solaris, also see general comments on PC-based Unixes in + [413]Section 3.0. Don't expect Solaris or any other kind of Unix to + work right on a PC until you resolve all interrupt conflicts. Don't + expect to be able to use COM3 or COM4 (or even COM2) until you have + configured their addresses and interrupts. + ________________________________________________________________________ + + 3.7.1. Serial Port Configuration + + [ [414]Top ] [ [415]Contents ] [ [416]Section Contents ] [ + [417]Section Contents ] [ [418]Next ] + + Your serial port can't be used -- or at least won't work right -- + until it is enabled in Solaris. For example, you get a message like + "SERIAL: Operation would block" when attempting to dial. This probably + indicates that the serial port has not been enabled for use with + modems. You'll need to follow the instructions in your system setup or + management manual, such as (e.g.) the Desktop SPARC Sun System & + Network Manager's Guide, which should contain a section "Setting up + Modem Software"; read it and follow the instructions. These might (or + might not) include running a program called "eeprom", editing some + system configuration file (such as, for example: + + /platform/i86pc/kernel/drv/asy.conf + + and then doing a configuration reboot, or running some other programs + like drvconfig and devlinks. "man eeprom" for details. + + Also, on certain Sun models like IPC, the serial port hardware might + need to have a jumper changed to make it an RS-232 port rather than + RS-423. + + eeprom applies only to real serial ports, not to "Spiff" devices + (serial port expander), in which case setup with Solaris' admintool is + required. + + Another command you might need to use is pmadm, e.g.: + + pmadm -d -p zsmon -s tty3 + pmadm -e -p zsmon -s tty3 + + You can use the following command to check if a process has the device + open: + + fuser -f /dev/term/3 + + In some cases, however (according to Sun support, May 2001) "It is + still possible that a zombie process has hold of the port EVEN IF + there is no lock file and the fuser command comes up empty. In that + case, the only way to resolve the problem is by rebooting." + + If you can't establish communication through a serial port to a device + that is not asserting CD (Carrier Detect), try setting the environment + variable "ttya-ignore-cd" to "true" (replace "ttya" with the port + name). + ________________________________________________________________________ + + 3.7.2. Serial Port Problems + + [ [419]Top ] [ [420]Contents ] [ [421]Section Contents ] [ [422]Next ] + [ [423]Previous ] + + Current advice from Sun is to always the /dev/cua/x devices for + dialing out, rather than the /dev/term/x. Nevertheless, if you have + trouble dialing out with one, try the other. + + Reportedly, if you start C-Kermit and "set line" to a port that has a + modem connected to it that is not turned on, and then "set flow + rts/cts", there might be some (unspecified) difficulties closing the + device because the CTS signal is not coming in from the modem. + ________________________________________________________________________ + + 3.7.3. SunLink X.25 + + [ [424]Top ] [ [425]Contents ] [ [426]Section Contents ] [ [427]Next ] + [ [428]Previous ] + + The built-in SunLink X.25 support for Solaris 2.3/2.4./25 and SunLink + 8.01 or 9.00 works OK provided the X.25 system has been installed and + initialized properly. Packet sizes might need to be reduced to 256, + maybe even less, depending on the configuration of the X.25 + installation. On one connection where C-Kermit 6.0 was tested, very + large packets and window sizes could be used in one direction, but + only very small ones would work in the other. + + In any case, according to Sun, C-Kermit's X.25 support is superfluous + with SunLink 8.x / Solaris 2.3. Quoting an anonymous Sun engineer: + + ... there is now no need to include any X.25 code within kermit. As + of X.25 8.0.1 we support the use of kermit, uucp and similar + protocols over devices of type /dev/xty. This facility was there in + 8.0, and should also work on the 8.0 release if patch 101524 is + applied, but I'm not 100% sure it will work in all cases, which is + why we only claim support from 8.0.1 onwards. + + When configuring X.25, on the "Advanced Configuration->Parameters" + screen of the x25tool you can select a number of XTY devices. If + you set this to be > 1, press Apply, and reboot, you will get a + number of /dev/xty entries created. + + Ignore /dev/xty0, it is a special case. All the others can be used + exactly as if they were a serial line (e.g. /dev/tty) connected to + a modem, except that instead of using Hayes-style commands, you use + PAD commands. + + From kermit you can do a 'set line' command to, say, /dev/xty1, + then set your dialing command to be "CALL 12345678", etc. All the + usual PAD commands will work (SET, PAR, etc). + + I know of one customer in Australia who is successfully using this, + with kermit scripts, to manage some X.25-connected switches. He + used standard kermit, compiled for Solaris 2, with X.25 8.0 xty + devices. + ________________________________________________________________________ + + 3.7.4. Sun Workstation Keyboard Mapping + + [ [429]Top ] [ [430]Contents ] [ [431]Section Contents ] [ [432]Next ] + [ [433]Previous ] + + Hints for using a Sun workstation keyboard for VT emulation when + accessing VMS, from the [434]comp.os.vms newsgroup: + + From: Jerry Leichter + Newsgroups: comp.os.vms + Subject: Re: VT100 keyboard mapping to Sun X server + Date: Mon, 19 Aug 1996 12:44:21 -0400 + + > I am stuck right now using a Sun keyboard (type 5) on systems + running SunOS + > and Solaris. I would like to use EVE on an OpenVMS box with + display back to + > the Sun. Does anyone know of a keyboard mapping (or some other + procedure) + > which will allow the Sun keyboard to approximate a VT100/VT220? + + You can't get it exactly - because the keypad has one fewer key - + but you can come pretty close. Here's a set of keydefs I use: + + keycode 101=KP_0 + keycode 119=KP_1 + keycode 120=KP_2 + keycode 121=KP_3 + keycode 98=KP_4 + keycode 99=KP_5 + keycode 100=KP_6 + keycode 75=KP_7 + keycode 76=KP_8 + keycode 77=KP_9 + keycode 52=KP_F1 + keycode 53=KP_F2 + keycode 54=KP_F3 + keycode 57=KP_Decimal + keycode 28=Left + keycode 29=Right + keycode 30=KP_Separator + keycode 105=KP_F4 + keycode 78=KP_Subtract + keycode 8=Left + keycode 10=Right + keycode 32=Up + keycode 33=Down + keycode 97=KP_Enter + + Put this in a file - I use "keydefs" in my home directory and feed + it into xmodmap: + + xmodmap - <$HOME/keydefs + + This takes care of the arrow keys and the "calculator" key cluster. + The "+" key will play the role of the DEC "," key. The Sun "-" key + will be like the DEC "-" key, though it's in a physically different + position - where the DEC PF4 key is. The PF4 key is ... damn, I'm + not sure where "key 105" is. I *think* it may be on the leftmost + key of the group of four just above the "calculator" key cluster. + + I also execute the following (this is all in my xinitrc file): + + xmodmap -e 'keysym KP_Decimal = KP_Decimal' + xmodmap -e 'keysym BackSpace = Delete BackSpace' \ + -e 'keysym Delete = BackSpace Delete' + xmodmap -e 'keysym KP_Decimal = Delete Delete KP_Decimal' + xmodmap -e 'add mod1 = Meta_R' + xmodmap -e 'add mod1 = Meta_L' + + Beware of one thing about xmodmap: Keymap changes are applied to + the *whole workstation*, not just to individual windows. There is, + in fact, no way I know of to apply them to individual windows. + These definitions *may* confuse some Unix programs (and/or some + Unix users). + + If you're using Motif, you may also need to apply bindings at the + Motif level. If just using xmodmap doesn't work, I can try and dig + that stuff up for you. + ________________________________________________________________________ + + 3.7.5. Solaris PPP Connections + + [ [435]Top ] [ [436]Contents ] [ [437]Section Contents ] [ [438]Next ] + [ [439]Previous ] + + The following is a report from a user of C-Kermit 8.0 on Solaris 8 and + 9, who had complained that while Kermit file transfers worked + perfectly on direct (non-PPP) dialout connections, they failed + miserably on PPP connections. We suggested that the PPP dialer + probably was not setting the port and/or modem up in the same way that + Kermit did: + + I want to get back on this and tell you what the resolution was. + You pointed me in the direction of flow control, which turned out + to be the key. + + Some discussion on the comp.unix.solaris newsgroup led to some + comments from Greg Andrews about the need to use the uucp driver to + talk to the modem (/dev/cua/a). I had to remind Greg that no matter + what the manpages for the zs and se drivers say, the ppp that Sun + released with Solaris 8 7/01, and has in Solaris 9, is a setuid + root program, and simply trying to make a pppd call from user space + specifying /dev/cua/a would fail because of permissions. Greg + finally put the question to the ppp people, who came back with + information that is not laid out anywhere in the docs available for + Solaris users. Namely, put /dev/cua/a in one of the priviledged + options files in the /etc/ppp directory. That, plus resetting the + OBP ttya-ignore-cd flag (this is Sun hardware) to false, seems to + have solved the problems. + + While I note that I had installed Kermit suid to uucp to use + /dev/cua/a on this particular box, it seems to run fine through + /dev/term/a. Not so with pppd. + + With this change in place, I seem to be able to upload and download + through telnet run on Kermit with the maximum length packets. I + note that the window allocation display does show STREAMING, using + telnet. Running ssh on Kermit, I see the standard 1 of 30 windows + display, and note that there appears to be a buffer length limit + between 1000 and 2000 bytes. Run with 1000, and it's tick-tock, + solid as a rock. With 2000 I see timeout errors and RTS/CTS action + on the modem. + + Kermit's packet-length and other controls let you make adjustments + like this to get around whatever obstacles might be thrown up -- in + this case (running Kermit over ssh), the underling Solaris PTY driver. + ________________________________________________________________________ + + 3.7.6. Solaris 2.4 and Earlier + + [ [440]Top ] [ [441]Contents ] [ [442]Section Contents ] [ + [443]Previous ] + + C-Kermit can't be compiled successfully under Solaris 2.3 using + SUNWspro cc 2.0.1 unless at least some of the following patches are + applied to cc (it is not known which one(s), if any, fix the problem): + + * 100935-01 SparcCompiler C 2.0.1: bad code generated when addresses + of two double arguments are involved + * 100961-05 SPARCcompilers C 2.0.1: conditional expression with + function returning structure gives wrong value + * 100974-01 SparcWorks 2.0.1: dbx jumbo patch + * 101424-01 SPARCworks 2.0.1 maketool SEGV's instantly on Solaris + 2.3 + + With unpatched cc 2.0.1, the symptom is that certain modules generate + truncated object files, resulting in many unresolved references at + link time. + + The rest of the problems in this section have to do with + bidirectional terminal ports and the Solaris Port Monitor. A bug in + C-Kermit 5A ticked a bug in Solaris. The C-Kermit bug was fixed in + version 6.0, and the Solaris bug was fixed in 2.4 (I think, or + maybe 2.5). + + Reportedly, "C-Kermit ... causes a SPARCstation running Solaris 2.3 to + panic after the modem connects. I have tried compiling C-Kermit with + Sun's unbundled C compiler, with GCC Versions 2.4.5 and 2.5.3, with + make targets 'sunos51', 'sunos51tcp', 'sunos51gcc', and even 'sys5r4', + and each time it compiles and starts up cleanly, but without fail, as + soon as I dial the number and get a 'CONNECT' message from the modem, + I get: + + BAD TRAP + kermit: Data fault + kernel read fault at addr=0x45c, pme=0x0 + Sync Error Reg 80 + ... + panic: Data Fault. + ... + Rebooting... + + The same modem works fine for UUCP/tip calling." Also (reportedly), + this only happens if the dialout port is configured as in/out via + admintool. If it is configured as out-only, no problem. This is the + same dialing code that works on hundreds of other System-V based Unix + OS's. Since it should be impossible for a user program to crash the + operating system, this problem must be chalked up to a Solaris bug. + Even if you SET CARRIER OFF, CONNECT, and dial manually by typing + ATDTnnnnnnn, the system panics as soon as the modem issues its CONNECT + message. (Clearly, when you are dialing manually, C-Kermit does not + know a thing about the CONNECT message, and so the panic is almost + certainly caused by the transition of the Carrier Detect (CD) line + from off to on.) This problem was reported by many users, all of whom + say that C-Kermit worked fine on Solaris 2.1 and 2.2. If the + speculation about CD is true, then a possible workaround might be to + configure the modem to leave CD on (or off) all the time. Perhaps by + the time you read this, a patch will have been issued for Solaris 2.3. + + The following is from Karl S. Marsh, Systems & Networks Administrator, + AMBIX Systems Corp, Rochester, NY: + + Environment: Solaris 2.3 Patch 101318-45 C-Kermit 5A(189) (and + presumably this applies to 188 and 190 also). eeprom setting: + + ttya-rts-dtr-off=false + ttya-ignore-cd=false + ttya-mode=19200,8,n,8,- + + To use C-Kermit on a bidirectional port in this environment, do not + use admintool to configure the port. Use admintool to delete any + services running on the port and then quit admintool and issue the + following command: + + pmadm -a -p zsmon -s ttyb -i root -fu -v 1 -m "`ttyadm -b -d /dev/term/b \ + -l conttyH -m ldterm,ttcompat -s /usr/bin/login -S n`" + + [NOTE: This was copied from a blurry fax, so please check it + carefully] where: + + -a = Add service + -p = pmtag (zsmon) + -s = service tag (ttyb) + -i = id to be associated with service tag (root) + -fu = create utmp entry + -v = version of ttyadm + -m = port monitor-specific portion of the port monitor administrative file + entry for the service + -b = set up port for bidirectional use + -d = full path name of device + -l = which ttylabel in the /etc/ttydefs file to use + -m = a list of pushable STREAMS modules + -s = pathname of service to be invoked when connection request received + -S = software carrier detect on or off (n = off) + + "This is exactly how I was able to get Kermit to work on a + bi-directional port without crashing the system." + + On the Solaris problem, also see SunSolve Bug ID 1150457 ("Using + C-Kermit, get Bad Trap on receiving prompt from remote system"). + Another user reported "So, I have communicated with the Sun tech + support person that submitted this bug report [1150457]. Apparently, + this bug was fixed under one of the jumbo kernel patches. It would + seem that the fix did not live on into 101318-45, as this is EXACTLY + the error that I see when I attempt to use kermit on my system." + + Later (Aug 94)... C-Kermit dialout successfully tested on a Sun4m with + a heavily patched Solaris 2.3. The patches most likely to have been + relevant: + + * 101318-50: SunOS 5.3: Jumbo patch for kernel (includes libc, + lockd) + * 101720-01: SunOS 5.3: ttymon - prompt not always visible on a + modem connection + * 101815-01: SunOS 5.3: Data fault in put() NULL queue passed from + ttycommon_qfull() + * 101328-01: SunOS 5.3: Automation script to properly setup tty + ports prior to PCTS execution + + Still later (Nov 94): another user (Bo Kullmar in Sweden) reports that + after using C-Kermit to dial out on a bidirectional port, the port + might not answer subsequent incoming calls, and says "the problem is + easy enough to fix with the Serial Port Manager; I just delete the + service and install it again using the graphical interface, which + underneath uses commands like sacadm and pmadm." Later Bo reports, "I + have found that if I run Kermit with the following script then it + works. This script is for /dev/cua/a, "-s a" is the last a in + /dev/cua/a: + + #! /bin/sh + kermit + sleep 2 + surun pmadm -e -p zsmon -s a + ________________________________________________________________________ + + 3.8. C-KERMIT AND SUNOS + + [ [444]Top ] [ [445]Contents ] [ [446]Section Contents ] [ [447]Next ] + [ [448]Previous ] + + For additional information, see "Celeste's Tutorial on SunOS 4.1.3+ + Modems and Terminals": + + [449]http://www.stokely.com/ + + For FAQs, etc, from Sun, see: + * [450]http://access1.sun.com/ + + For history of Sun models and SunOS versions, see (should be all the + same): + * [451]http://www.ludd.luth.se/~bear/project/sun/sun.hardware.txt + * [452]ftp://ftp.netcom.com/pub/ru/rubicon/sun.hdwr.ref + * [453]ftp://ftp.intnet.net/pub/SUN/Sun-Hardware-Ref + + Sun SPARCstation users should read the section "Setting up Modem + Software" in the Desktop SPARC Sun System & Network Manager's Guide. + If you don't set up your serial ports correctly, Kermit (and other + communications software) won't work right. + + Also, on certain Sun models like IPC, the serial port hardware might + need to have a jumper changed to make it an RS-232 port rather than + RS-423. + + Reportedly, C-Kermit does not work correctly on a Sun SPARCstation in + an Open Windows window with scrolling enabled. Disable scrolling, or + else invoke Kermit in a terminal emulation window (xterm, crttool, + vttool) under SunView (this might be fixed in later SunOS releases). + + On the Sun with Open Windows, an additional symptom has been reported: + outbound SunLink X.25 connections "magically" translate CR typed at + the keyboard into LF before transmission to the remote host. This + doesn't happen under SunView. + + SET CARRIER ON, when used on the SunOS 4.1 version of C-Kermit + (compiled in the BSD universe), causes the program to hang + uninterruptibly when SET LINE is issued for a device that is not + asserting carrier. When Kermit is built in the Sys V universe on the + same computer, there is no problem (it can be interrupted with + Ctrl-C). This is apparently a limitation of the BSD-style tty driver. + + SunOS 4.1 C-Kermit has been observed to dump core when running a + complicated script program under cron. The dump invariably occurs in + ttoc(), while trying to output a character to a TCP/IP TELNET + connection. ttoc() contains a write() call, and when the system or the + network is very busy, the write() call can get stuck for long periods + of time. To break out of deadlocks caused by stuck write() calls, + there is an alarm around the write(). It is possible that the core + dump occurs when this alarm signal is caught. (This one has not been + observed recently -- possibly fixed in edit 190.) + + On Sun computers with SunOS 4.0 or 4.1, SET FLOW RTS/CTS works only if + the carrier signal is present from the communication device at the + time when C-Kermit enters packet mode or CONNECT mode. If carrier is + not sensed (e.g. when dialing), C-Kermit does not attempt to turn on + RTS/CTS flow control. This is because the SunOS serial device driver + does not allow characters to be output if RTS/CTS is set (CRTSCTS) but + carrier (and DSR) are not present. Workaround (maybe): SET CARRIER OFF + before giving the SET LINE command, establish the connection, then SET + FLOW RTS/CTS + + It has also been reported that RTS/CTS flow control under SunOS 4.1 + through 4.1.3 works only on INPUT, not on output, and that there is a + patch from Sun to correct this problem: Patch-ID# T100513-04, 20 July + 1993 (this patch might apply only to SunOS 4.1.3). It might also be + necessary to configure the eeprom parameters of the serial port; e.g. + do the following as root at the shell prompt: + + eeprom ttya-ignore-cd=false + eeprom ttya-rts-dtr-off=true + + There have been reports of file transfer failures on Sun-3 systems + when using long packets and/or large window sizes. One user says that + when this happens, the console issues many copies of this message: + + chaos vmunix: zs1: ring buffer overflow + + This means that SunOS is not scheduling Kermit frequently enough to + service interrupts from the zs serial device (Zilog 8350 SCC serial + communication port) before its input silo overflows. Workaround: use + smaller packets and/or a smaller window size, or use "nice" to + increase Kermit's priority. Use hardware flow control if available, or + remove other active processes before running Kermit. + + SunLink X.25 support in C-Kermit 5A(190) was built and tested + successfully under SunOS 4.1.3b and SunLink X.25 7.00. + ________________________________________________________________________ + + 3.9. C-KERMIT AND ULTRIX + + [ [454]Top ] [ [455]Contents ] [ [456]Section Contents ] [ [457]Next ] + [ [458]Previous ] + + See also: The [459]comp.unix.ultrix and [460]comp.sys.dec newsgroups. + + There is no hardware flow control in Ultrix. That's not a Kermit + deficiency, but an Ultrix one. + + When sending files to C-Kermit on a Telnet connection to a remote + Ultrix system, you must SET PREFIXING ALL (or at least prefix more + control characters than are selected by SET PREFIXING CAUTIOUS). + + Reportedly, DEC ULTRIX 4.3 is immune to C-Kermit's disabling of + SIGQUIT, which is the signal that is generated when the user types + Ctrl-\, which kills the current process (i.e. C-Kermit) and dumps + core. Diagnosis and cure unknown. Workaround: before starting C-Kermit + -- or for that matter, when you first log in because this applies to + all processes, not just Kermit -- give the following Unix command: + + stty quit undef + + Certain operations driven by RS-232 modem signal do not work on + DECstations or other DEC platforms whose serial interfaces use MMP + connectors (DEC version of RJ45 telephone jack with offset tab). These + connectors convey only the DSR and DTR modem signals, but not carrier + (CD), RTS, CTS, or RI. Use SET CARRIER OFF to enable communication, or + "hotwire" DSR to CD. + + The maximum serial speed on the DECstation 5000 is normally 19200, but + various tricks are available (outside Kermit) to enable higher rates. + For example, on the 5000/200, 19200 can be remapped (somehow, + something to do with "a bit in the SIR", whatever that is) to 38400, + but in software you must still refer to this speed as 19200; you can't + have 19200 and 38400 available at the same time. + + 19200, reportedly, is also the highest speed supported by Ultrix, but + NetBSD reportedly supports speeds up to 57600 on the DECstation, + although whether and how well this works is another question. + + In any case, given the lack of hardware flow control in Ultrix, high + serial speeds are problematic at best. + ________________________________________________________________________ + + 3.10. C-KERMIT AND UNIXWARE + + [ [461]Top ] [ [462]Contents ] [ [463]Section Contents ] [ [464]Next ] + [ [465]Previous ] + + See also: + * The Freebird Project (Unixware software repository) + [466]http://www.freebird.org/ + * The UnixWare FAQ: [467]http://www.freebird.org/faq/ + * The following newsgroups: + + [468]comp.unix.unixware.misc + + [469]comp.unix.sco.misc. + + Also see general comments on PC-based Unixes in [470]Section 3.0. By + the way, this section is separate from the SCO (Caldera) section + because at the time this section was started, Unixware was owned by a + company called Univel. Later it was sold to Novell, and then to SCO. + Still later, SCO was sold to Caldera. + + In Unixware 2.0 and later, the preferred serial device names (drivers) + are /dev/term/00 (etc), rather than /dev/tty00 (etc). Note the + following correspondence of device names and driver characteristics: + + New name Old name Description + /dev/term/00 /dev/tty00 ??? + /dev/term/00h /dev/tty00h Modem signals and hardware flow control + /dev/term/00m /dev/tty00m Modem signals(?) + /dev/term/00s /dev/tty00s Modem signals and software flow control + /dev/term/00t /dev/tty00t ??? + + Lockfile names use device.major.minor numbers, e.g.: + + /var/spool/locks/LK.7679.003.005 + + The minor number varies according to the device name suffix (none, h, + m, s, or t). Only the device and major number are compared, and thus + all of the different names for the same physical device (e.g. all of + those shown in the table above) interlock effectively. + + Prior to UnixWare 7, serial speeds higher than 38400 are not + supported. In UnixWare 7, we also support 57600 and 115200, plus some + unexpected ones like 14400, 28800, and 76800, by virtue of a strange + new interface, evidently peculiar to UnixWare 7, discovered while + digging through the header files: tcsetspeed(). Access to this + interface is allowed only in POSIX builds, and thus the UnixWare 7 + version of C-Kermit is POSIX-based, unlike C-Kermit for Unixware 1.x + and 2.x (since the earlier UnixWare versions did not support high + serial speeds, period). + + HOWEVER, turning on POSIX features engages all of the "#if + (!_POSIX_SOURCE)" clauses in the UnixWare header files, which in turn + prevent us from having modem signals, access to the hardware flow + control APIs, select(), etc -- in short, all the other things we need + in communications software, especially when high speeds are used. Oh + the irony. And so C-Kermit must be shamelessly butchered -- as it has + been so many times before -- to allow us to have the needed features + from the POSIX and non-POSIX worlds. See the UNIXWAREPOSIX sections of + [471]ckutio.c. + + After the butchery, we wind up with Unixware 2.x having full + modem-signal capability, but politically-correct Unixware 7.x lacking + the ability to automatically detect a broken connection when carrier + drops. + + Meanwhile the Unixware tcsetspeed() function allows any number at all + (any long, 0 or positive) as an argument and succeeds if the number is + a legal bit rate for the serial device, and fails otherwise. There is + no list anywhere of legal speeds. Thus the SET SPEED keyword table + ("set speed ?" to see it) is hardwired based on trial and error with + all known serial speeds, the maximum being 115200. However, to allow + for the possibility that other speeds might be allowed in the future + (or with different port drivers), the SET SPEED command for UnixWare 7 + only allows you to specify any number at all; a warning is printed if + the number is not in the list, but the number is accepted anyway; the + command succeeds if tcsetspeed() accepts the number, and fails + otherwise. + + In C-Kermit 8.0 testing, it was noticed that the POSIX method for + hanging up the phone by dropping DTR (set speed 0, pause, restore + speed) did not actually drop DTR. The APIs do not return any error + indication, but nothing happens. I changed tthang() to skip the + special case I had made for Unixware and instead follow the normal + path: if TIOCSDTR is defined use that, otherwise blah blah... It turns + out TIOCSDTR *is* defined, and it works. + + So in Unixware (at least in 2.1.3) we can read modem signals, hangup + by toggling DTR, and so on, BUT... But once the remote hangs up and + Carrier drops, the API for reading modem signals ceases to function; + although the device is still open, the TIOCMGET ioctl always raises + errno 6 = ENXIO, "No such device or address". + + Old business: + + Using C-Kermit 6.0 on the UnixWare 1.1 Application Server, one user + reported a system panic when the following script program is executed: + + set line /dev/tty4 + set speed 9600 + output \13 + connect + + The panic does not happen if a PAUSE is inserted: + + set line /dev/tty4 + set speed 9600 + pause 1 + output \13 + connect + + This is using a Stallion EasyIO card installed as board 0 on IRQ 12 on + a Gateway 386 with the Stallion-supplied driver. The problem was + reported to Novell and Stallion and (reportedly) is now fixed. + ________________________________________________________________________ + + 3.11. C-KERMIT AND APOLLO SR10 + + [ [472]Top ] [ [473]Contents ] [ [474]Section Contents ] [ [475]Next ] + [ [476]Previous ] + + Reportedly, version 5A(190), when built under Apollo SR10 using "make + sr10-bsd", compiles, links, and executes OK, but leaves the terminal + unusable after it exits -- the "cs7" or "cs8" (character size) + parameter has become cs5. The terminal must be reset from another + terminal. Cause and cure unknown. Suggested workaround: Wrap Kermit in + a shell script something like: + + kermit @* + stty sane + ________________________________________________________________________ + + 3.12. C-KERMIT AND TANDY XENIX 3.0 + + [ [477]Top ] [ [478]Contents ] [ [479]Section Contents ] [ [480]Next ] + [ [481]Previous ] + + C-Kermit 7.0 was too big to be built on Tandy Xenix, even in a minimum + configuration; version 6.0 is the last one that fits. + + Reportedly, in C-Kermit 6.0, if you type lots of Ctrl-C's during + execution of the initialization file, ghost Kermit processes will be + created, and will compete for the keyboard. They can only be removed + via "kill -9" from another terminal, or by rebooting. Diagnosis -- + something strange happening with the SIGINT handler while the process + is reading the directory (it seems to occur during the SET PROMPT + [\v(dir)] ... sequence). Cure: unknown. Workaround: don't interrupt + C-Kermit while it is executing its init file on the Tandy 16/6000. + ________________________________________________________________________ + + 3.13. C-KERMIT AND OSF/1 (DIGITAL UNIX) (TRU64 UNIX) + + [ [482]Top ] [ [483]Contents ] [ [484]Section Contents ] [ [485]Next ] + [ [486]Previous ] + + While putting together and testing C-Kermit 8.0, it was discovered + that binaries built for one version of Tru64 Unix (e.g. 4.0G) might + exhibit very strange behavior if run on a different version of Tru64 + Unix (e.g. 5.1A). The typical symptom was that a section of the + initialization file would be skipped, notably locating the dialing + and/or network directory as well as finding and executing the + customization file, ~/.mykermrc. This problem also is reported to + occur on Tru64 Unix 5.0 (Rev 732) even when running a C-Kermit binary + that was built there. However, the Tru64 5.1A binary works correctly + on 5.0. Go figure. + + When making Telnet connections to a Digital Unix or Tru64 system, and + your Telnet client forwards your user name, the Telnet server + evidently stuffs the username into login's standard input, and you + see: + + login: ivan + Password: + + This is clearly going to play havoc with scripts that look for + "login:". Workaround (when Kermit is your Telnet client): SET LOGIN + USER to nothing, to prevent Kermit from sending your user ID. + + Before you can use a serial port on a new Digital Unix system, you + must run uucpsetup to enable or configure the port. Evidently the + /dev/tty00 and 01 devices that appear in the configuration are not + usable; uucpsetup turns them into /dev/ttyd00 and 01, which are. Note + that uucpsetup and other uucp-family programs are quite primitive -- + they only know about speeds up to 9600 bps and their selection of + modems dates from the early 1980s. None of this affects Kermit, though + -- with C-Kermit, you can use speeds up to 115200 bps (at least in + DU4.0 and later) and modern modems with hardware flow control and all + the rest. + + Reportedly, if a modem is set for &S0 (assert DSR at all times), the + system resets or drops DTR every 30 seconds; reportedly DEC says to + set &S1. + + Digital Unix 3.2 evidently wants to believe your terminal is one line + longer than you say it is, e.g. when a "more" or "man" command is + given. This is has nothing to do with C-Kermit, but tends to annoy + those who use Kermit or other terminal emulators to access Digital + Unix systems. Workaround: tell Unix to "stty rows 23" (or whatever). + + Reportedly, there is some bizarre behavior when trying to use a + version of C-Kermit built on one Digital Unix 4.0 system on another + one, possibly due to differing OS or library revision levels; for + example, the inability to connect to certain TCP/IP hosts. Solution: + rebuild C-Kermit from source code on the system where you will be + using it. + + Digital Unix tgetstr() causes a segmentation fault. C-Kermit 7.0 added + #ifdefs to avoid calling this routine in Digital Unix. As a result, + the SCREEN commands always send ANSI escape sequences -- even though + curses knows your actual terminal type. + + Reportedy the Tru64 Unix 4.0E 1091 Telnet server does not tolerate + streaming transfers into itself, at least not when the sending Kermit + is on the same local network. Solution: tell one Kermit or the other + (or both) to "set streaming off". This might or might be the case with + earlier and/or later Tru64, Digital Unix, and OSF/1 releases. + ________________________________________________________________________ + + 3.14. C-KERMIT AND SGI IRIX + + [ [487]Top ] [ [488]Contents ] [ [489]Section Contents ] [ [490]Next ] + [ [491]Previous ] + + See also: + * The [492]comp.sys.sgi.misc and [493]comp.sys.sgi.admin newsgroups. + [494]The SGI website + * The SGI FAQ: + + [495]http://www-viz.tamu.edu/~sgi-faq/ + + [496]ftp://viz.tamu.edu/pub/sgi/faq/ + + About IRIX version numbers: "uname -a" tells the "two-digit" version + number, such as "5.3" or "6.5". The three-digit form can be seen with + "uname -R". (this information is unavailable at the simple API level). + Supposedly all three-digit versions within the same two-digit version + (e.g. 6.5.2, 6.5.3) are binary compatible; i.e. a binary built on any + one of them should run on all others. The "m" suffix denotes just + patches; the "f" suffix indicates that features were added. + + An IRIX binary built on lower MIPS model (Instruction Set + Architecture, ISA) can run on higher models, but not vice versa: + + MIPS1 R3000 and below + MIPS2 R4000 + MIPS3 R4x00 + MIPS4 R5000 and above + + Furthermore, there are different Application Binary Inferfaces (ABIs): + + COFF 32 bits, IRIX 5.3, 5.2, 5.1, 4.x and below + o32 ELF 32 bits, IRIX 5.3, 6.0 - 6.5 + N32 ELF 32 bits, IRIX 6.2 - 6.5 + N64 ELF 64 bits, IRIX 6.2 - 6.5 + + Thus a prebuilt IRIX binary works on a particular machine only if (a) + the machine's IRIX version (to one decimal place) is equal to or + greater than the version under which the binary was built; (b) the + machine's MIPS level is greater or equal to that of the binary; and + (c) the machine supports the ABI of the binary. If all three + conditions are not satisfied, of course, you can build a binary + yourself from source code since, unlike some other Unix vendors, SGI + does supply a C compiler and libraries. + + SGI did not supply an API for hardware flow control prior to IRIX 5.2. + C-Kermit 6.1 and higher for IRIX 5.2 and higher supports hardware flow + control in the normal way, via "set flow rts/cts". + + For hardware flow control on earlier IRIX and/or C-Kermit versions, + use the ttyf* (modem control AND hardware flow control) devices and + not the ttyd* (direct) or ttym* (modem control but no hardware flow + control) ones, and obtain the proper "hardware handshaking" cable from + SGI, which is incompatible with the ones for the Macintosh and NeXT + even though they look the same ("man serial" for further info) and + tell Kermit to "set flow keep" and "set modem flow rts/cts". + + Serial speeds higher than 38400 are available in IRIX 6.2 and later, + on O-class machines (e.g. Origin, Octane) only, and are supported by + C-Kermit 7.0 and later. Commands such as "set speed 115200" may be + given on other models (e.g. Iris, Indy, Indigo) but will fail because + the OS reports an invalid speed for the device. + + Experimentation with both IRIX 5.3 and 6.2 shows that when logged in + to IRIX via Telnet, that remote-mode C-Kermit can't send files if the + packet length is greater than 4096; the Telnet server evidently has + this restriction (or bug), since there is no problem sending long + packets on serial or rlogin connections. However, it can receive files + with no problem if the packet length is greater than 4096. As a + workaround, the FAST macro for IRIX includes "set send packet-length + 4000". IRIX 6.5.1 does not have this problem, so evidently it was + fixed some time after IRIX 6.2. Tests show file-transfer speeds are + better (not worse) with 8K packets than with 4K packets from IRIX + 6.5.1. + + Reportedly some Indys have bad serial port hardware. IRIX 5.2, for + example, needs patch 151 to work around this; or upgrade to a later + release. Similarly, IRIX 5.2 has several problems with serial i/o, + flow control, etc. Again, patch or upgrade. + + Reportedly on machines with IRIX 4.0, Kermit cannot be suspended by + typing the suspend ("swtch") character if it was started from csh, + even though other programs can be suspended this way, and even though + the Z and SUSPEND commands still work correctly. This is evidently + because IRIX's csh does not deliver the SIGTSTP signal to Kermit. The + reason other programs can be suspended in the same environment is + probably that they do not trap SIGTSTP themselves, so the shell is + doing the suspending rather than the application. + + Also see notes about IRIX 3.x in the [497]C-Kermit for Unix + Installation Instructions. + + If you have problems making TCP/IP connections in versions of IRIX + built with GCC 2.95.2, see the bugs section of: + + [498]http://freeware.sgi.com/Installable/gcc-2.95.2.html. + + Reportedly, if you allow gcc to compile C-Kermit on Irix you should be + aware that there might be problems with some of the network code. The + specifics are at + [499]http://freeware.sgi.com/Installable/gcc-2.95.2.html; scroll down + to the "known bugs" section at the end of the document. + ________________________________________________________________________ + + 3.15. C-KERMIT AND THE BEBOX + + [ [500]Top ] [ [501]Contents ] [ [502]Section Contents ] [ [503]Next ] + [ [504]Previous ] + + See also: The [505]comp.sys.be newsgroup. + + The BeBox has been discontinued and BeOS repositioned for PC + platforms. The POSIX parts of BeOS are not finished, nor is the + sockets library, therefore a fully functional version of C-Kermit is + not possible. In version 6.0 of C-Kermit, written for BeOS DR7, it was + possible to: + + * set line /dev/serial2 (and probably the other serial ports) + * set speed 115200 (and at least some of the lower baud rates) + * connect + * set modem type hayes (and likely others, too) + * dial phone-number + * set send packet-length 2048 (other lengths for both send and + receive) + * set receive packet length 2048 + * set file type binary (text mode works, too) (with remote kermit + session in server mode) + * put bedrop.jpg + * get bedrop.jpg + * get bedrop.jpg bedrop.jpg2 + * finish, bye + + The following do not work: + * kermit does not detect modem hangup + * !/RUN/PUSH [commandline command] + * Running kermit in remote mode + * Using other protocols (x/y/zmodem) + * TCP networking interface (Be's TCP/IP API has a ways to go, still) + + C-Kermit does not work on BeOS DR8 because of changes in the + underlying APIs. Unfortunately not enough changes were made to allow + the regular POSIX-based C-Kermit to work either. Note: the lack of a + fork() service requires the select()-based CONNECT module, but there + is no select(). There is a select() in DR8, but it doesn't work. + + C-Kermit 7.0 was built for BeOS 4.5 and works in remote mode. It does + not include networking support since the APIs are still not there. It + is not known if dialing out works, but probably not. Be experts are + welcome to lend a hand. + ________________________________________________________________________ + + 3.16. C-KERMIT AND DG/UX + + [ [506]Top ] [ [507]Contents ] [ [508]Section Contents ] [ [509]Next ] + [ [510]Previous ] + + Somebody downloaded the C-Kermit 6.0 binary built under DG/UX 5.40 and + ran it under DG/UX 5.4R3.10 -- it worked OK except that file dates for + incoming files were all written as 1 Jan 1970. Cause and cure unknown. + Workaround: SET ATTRIBUTE DATE OFF. Better: Use a version of C-Kermit + built under and for DG/UX 5.4R3.10. + ________________________________________________________________________ + + 3.17. C-KERMIT AND SEQUENT DYNIX + + [ [511]Top ] [ [512]Contents ] [ [513]Section Contents ] [ [514]Next ] + [ [515]Previous ] + + Reportedly, when coming into a Sequent Unix (DYNIX) system through an + X.25 connection, Kermit doesn't work right because the Sequent's + FIONREAD ioctl returns incorrect data. To work around, use the + 1-character-at-a-time version of myread() in ckutio.c (i.e. undefine + MYREAD in ckutio.c and rebuild the program). This is unsatisfying + because two versions of the program would be needed -- one for use + over X.25, and the other for serial and TCP/IP connections. + ________________________________________________________________________ + + 3.18. C-KERMIT AND {FREE,OPEN,NET}BSD + + [ [516]Top ] [ [517]Contents ] [ [518]Section Contents ] [ [519]Next ] + [ [520]Previous ] + + Some NebBSD users have reported difficulty escaping back from CONNECT + mode, usually when running NetBSD on non-PC hardware. Probably a + keyboard issue. + + NetBSD users have also reported that C-Kermit doesn't pop back to the + prompt if the modem drops carrier. This needs to be checked out & + fixed if possible. + + (All the above seems to work properly in C-Kermit 7.0 and later.) + ________________________________________________________________________ + + 3.19. C-KERMIT AND MAC OS X (Rhapsody, Darwin, Jaguar, Panther) + + [ [521]Top ] [ [522]Contents ] [ [523]Section Contents ] [ [524]Next ] + [ [525]Previous ] + + Mac OS X is Apple's 4.4BSD Unix variety, closely related to FreeBSD, + but different. "uname -a" is singularly uninformative, as in Linux, + giving only the Darwin kernel version number. As far as I can tell, + there is no way to find out the Mac OS X version number, such as 10.3 + (in Linux you can find the distribution version in a + distribution-dependent file). Here are some points to be aware of: + + * The biggest gotcha for Kermit users is that Mac OS X does not + support serial ports and, as far as I can tell, doesn't support + its built-in modem either, for anything other than making Internet + connections. Macintoshes capable of running Mac OS X, such as the + G5, some without serial ports and without any APIs to support + them, and also without the UUCP family of programs (including cu), + nor any standard for serial-port lockfile directory. + * At least early versions of Mac OS X came without Curses, Termlib, + or Terminfo libraries. Later versions seem to have ncurses. Kermit + uses curses for its file-transfer display. See elsewhere about + curses-vs-ncurses confusion. + * In the HFS+ file system, filenames are case-folded. Thus + "makefile" and "Makefile" are the same file. The UFS file system + is, like normal Unix, case-sensitive. + * Files that are composed of a resource fork and a data fork... I + doubt that C-Kermit does anything useful with them. There is no + code in C-Kermit for traditional two-forked Macintosh files, but + it could be added if there is any demand. + * In case you want to transfer a traditional Macintosh text file (or + data fork of a file that is plain text), you can use these + C-Kermit commands: + +set file eol cr +set file character-set apple-quickdraw +send /text filename + + * File or pathnames that include spaces must be enclosed in either + doublequotes or curly braces in C-Kermit commands. + * Mac OS X has its own package format for applications, called + "fink". Various fink packages for C-Kermit are floating around + that are not standard releases. For example, there's a C-Kermit + 8.0.201 package in which C-Kermit was modifed (at least) to use a + UUCP lockfile directory that does not exist on vanilla Mac OS X + systems. + + Mac OS X and Serial Ports + + Apple is in the forefront of companies that believe serial ports have + no use in the modern world and so has simply eliminated all traces of + them from its machines and OS. But of course serial ports are still + needed to connect not only to external modems, but also to the control + ports of hubs, routers, terminal servers, PBXs, and similar devices, + not to mention barcode readers, POS systems and components, automated + factory-floor equipment, and scientific, medical, and lab equipment + (to name a few). Among workers in these areas, there is a need to add + serial ports back onto this platform, which is being filled by + third-party products such as the [526]Keyspan USB Serial Adapter. To + use the Keyspan device, you must install the accompanying device + drivers, which wind up giving you serial ports with names like + /dev/cu.USA19H3b1P1.1. + + To configure your Mac OS X system to allow C-Kermit to use these (or + any other) serial devices: + + 1. su + chgrp xxxx /var/spool/lock + chmod g+w /var/spool/lock + chgrp xxxx /dev/cu.* + (where xxxx is the name of the group for users to whom serial-port + access is to be granted). Use "admin" or other existing group, or + create a new group if desired. NB: + + In the absence of official guidance from Apple or anyone else, we + choose /var/spool/lock as the lockfile directory because this + directory (a) already exists on vanilla Mac OS X installations, and + (b) it is the directory used for serial-port lockfiles on many + other platforms. + 2. Put all users who need access to the serial port in the same + group. + 3. Make sure the serial device files that are to be used by C-Kermit + have group read-write permission and (if you care) lack world + read-write permission, e.g.: + chmod g+rw,o-rw /dev/cu.* + + If you do the above, then there's no need to become root to use + Kermit, or to make Kermit suid or sgid. Just do this: + +chmod 775 wermit +mv wermit /usr/local/bin/kermit + + (or whatever spot is more appropriate). For greater detail about + installation (man page, etc), [527]CLICK HERE. + + Back when Macs had serial ports, they were not RS-232 (the standard + for connecting computers with nearby modems) but rather RS-422 or -423 + (a standard for connecting serial devices over longer distances). + Macintosh serial ports do not support modems well because they do not + have enough wires (or more properly in the case RS-422/423, wire + pairs) to convey a useful subset of modem signals. The Keyspan USB + adapter gives you two Mini-Din8 RS-422 ports, that are no better (or + worse) for communicating with modems or serial devices than a real Mac + Din-8 port was. In essense, you get Data In, Data Out, and two modem + signals. It looks to me as if the signals chosen by Keyspan are RTS + and CTS. This gives you hardware flow control, but at the expense of + Carrier Detect. Thus to use C-Kermit with a Keyspan USB serial port, + you must tell C-Kermit to: + +set modem type none ; (don't expect a modem) +set carrier-watch off ; (ignore carrier signal) +set port /dev/cu.USA19H3b1P1.1 ; (open the port) +set flow rts/cts ; (this is the default) +set speed 57600 ; (or whatever) +connect ; (or whatever) + + Use Ctrl-\C in the normal manner to escape back to the C-Kermit> + prompt. Kermit can't pop back to its prompt automatically when Carrier + drops because there is no Carrier signal. + + Instructions for the built-in modem remain to be written. + + Links: + * [528]Unix tips for Mac OS X (Jerry Stratton) + ________________________________________________________________________ + + 3.20. C-KERMIT AND COHERENT + + [ [529]Top ] [ [530]Contents ] [ [531]Section Contents ] [ + [532]Previous ] + + Also see: + + [533]http://www.uni-giessen.de/faq/archiv/coherent-faq.general/msg00 + 000.html + + Mark Williams COHERENT was perhaps the first commercial Unix-based + operating system for PCs, first appearing about 1983 or -84 for the + PC/XT (?), and popular until about 1993, when Linux took over. + C-Kermit, as of version 8.0, is still current for COHERENT 386 4.2 + (i.e. only for i386 and above). Curses is included, but lots of other + features are omitted due to lack of the appropriate OS features, APIs, + libraries, hardware, or just space: e.g. TCP/IP, floating-point + arithmetic, learned scripts. Earlier versions of COHERENT ran on 8086 + and 80286, but these are to small to build or run C-Kermit, but + G-Kermit should be OK (as might be ancient versions of C-Kermit). + + You can actually build a version with floating point support -- just + take -DNOFLOAT out of CFLAGS and add -lm to LIBS; NOFLOAT is the + default because COHERENT tends to run on old PCs that don't have + floating-point hardware. You can also add "-f" to CFLAGS to have it + link in the floating-point emulation library. Also I'm not sure why + -DNOLEARN is included, since it depends on select(), which COHERENT + has. + ________________________________________________________________________ + + 4. GENERAL UNIX-SPECIFIC HINTS, LIMITATIONS, AND BUGS + + [ [534]Top ] [ [535]Contents ] [ [536]Next ] [ [537]Previous ] + + 4.1. Modem Signals + + There seems to be an escalating demand for the ability to control + "dumb serial devices" (such as "smartcard readers", barcode readers, + etc) by explicitly manipulating modem signals, particularly RTS. This + might have been easy to do in DOS, where there is no operating system + standing between the application and the serial device, but it is + problematic in Unix, where modem signals are controlled by the serial + device driver. If the driver does not provide an API for doing this, + then the application can't do it. If it does provide an API, expect it + to be totally different on each Unix platform, since there is no + standard for this. + + 4.2. NFS Troubles + + Beginning with C-Kermit 6.0, the default C-Kermit prompt includes your + current (working) directory; for example: + + [/usr/olga] C-Kermit> + + (In C-Kermit 7.0 the square braces were replaced by round parentheses + to avoid conflicts with ISO 646 national character sets.) + + If that directory is on an NFS-mounted disk, and NFS stops working or + the disk becomes unavailable, C-Kermit will hang waiting for NFS + and/or the disk to come back. Whether you can interrupt C-Kermit when + it is hung this way depends on the specific OS. Kermit has called the + operating systems's getcwd() function, and is waiting for it to + return. Some versions of Unix (e.g. HP-UX 9.x) allow this function to + be interrupted with SIGINT (Ctrl-C), others (such as HP-UX 8.x) do + not. To avoid this effect, you can always use SET PROMPT to change + your prompt to something that does not involve calling getcwd(), but + if NFS is not responding, C-Kermit will still hang any time you give a + command that refers to an NFS-mounted directory. Also note that in + some cases, the uninterruptibility of NFS-dependent system or library + calls is considered a bug, and sometimes there are patches. For HP-UX, + for example: + + replaced by: + HP-UX 10.20 libc PHCO_8764 PHCO_14891/PHCO_16723 + HP-UX 10.10 libc PHCO_8763 PHCO_14254/PHCO_16722 + HP-UX 9.x libc PHCO_7747 S700 PHCO_13095 + HP-UX 9.x libc PHCO_6779 S800 PHCO_11162 + + 4.3. C-Kermit as Login Shell + + You might have reason to make C-Kermit the login shell for a specific + user, by entering the pathname of Kermit (possibly with command-line + switches, such as -x to put it in server mode) into the shell field of + the /etc/passwd file. This works pretty well. In some cases, for + "ultimate security", you might want to use a version built with + -DNOPUSH (see the [538]Configurations Options document for this, but + even if you don't, then PUSHing or shelling out from C-Kermit just + brings up a new copy of C-Kermit (but warning: this does not prevent + the user from explicitly running a shell; e.g. "run /bin/sh"; use + NOPUSH to prevent this). + + 4.4. C-Kermit versus screen and splitvt + + C-Kermit file transfers will probably not work if attemped through the + "splitvt" or GNU "screen" programs because the screen optimization (or + at least, line wrapping, control-character absorption) done by this + package interferes with Kermit's packets. + + The same can apply to any other environment in which the user's + session is captured, monitored, recorded, or manipulated. Examples + include the 'script' program (for making a typescript of a session), + the Computronics PEEK package and pksh (at least versions of it prior + to 1.9K), and so on. + + You might try the following -- what we call "doomsday Kermit" -- + settings to push packets through even the densest and most obstructive + connections, such as "screen" and "splitvt" (and certain kinds of 3270 + protocol emulators): Give these commands to BOTH Kermit programs: + + SET FLOW NONE + SET CONTROL PREFIX ALL + SET RECEIVE PACKET-LENGTH 70 + SET RECEIVE START 62 + SET SEND START 62 + SET SEND PAUSE 100 + SET BLOCK B + + If it works, it will be slow. + + 4.5. C-Kermit versus DOS Emulators + + On Unix workstations equipped with DOS emulators like SoftPC, watch + out for what these emulators do to the serial port drivers. After + using a DOS emulator, particularly if you use it to run DOS + communications software, you might have to reconfigure the serial + ports for use by Unix. + + 4.6. C-Kermit versus Job Control + + Interruption by Ctrl-Z makes Unix C-Kermit try to suspend itself with + kill(0,SIGTSTP), but only on platforms that support job control, as + determined by whether the symbol SIGTSTP is defined (or on POSIX or + SVR4 systems, if syconf(_SC_JOB_CONTROL) or _POSIX_JOB_CONTROL in + addition to SIGTSTP). However, if Kermit is running under a login + shell (such as the original Bourne shell) that does not support job + control, the user's session hangs and must be logged out from another + terminal, or hung up on. There is no way Kermit can defend itself + against this. If you use a non-job control shell on a computer that + supports job control, give a command like "stty susp undef" to fix it + so the suspend signal is not attached to any particular key, or give + the command SET SUSPEND OFF to C-Kermit, or build C-Kermit with + -DNOJC. + + 4.7. Dates and Times + + Unix time conversion functions typically apply locale rules to return + local time in terms of any seasonal time zone change in effect for the + given date. The diffdate function assumes that the same timezone rules + are in effect for both dates, but a date with timezone information + will be converted to the local time zone in effect at the given time, + e.g., a GMT specification will produce either a Standard Time or + Daylight Savings Time, depending on which applies at the given time. + An example using the 2001 seasonal change from EDT (-0400) to EST + (-0500): + + C-Kermit> DATE 20011028 05:01:02 GMT ; EDT + 20011028 01:01:02 + C-Kermit> DATE 20011028 06:01:02 GMT ; EST + 20011028 01:01:02 + C-Kermit> + + but the implicit change in timezone offset is not recognized: + + C-Kermit> echo \fdiffdate(20011028 05:01:02 GMT, 20011028 06:01:02 GMT) + +0:00 + C-Kermit> + + Date/time arithmetic, offsets, delta times, and timezone support are + new to C-Kermit 8.0, and might be expected to evolve and improve in + subsequent releases. + + On some platforms, files downloaded with HTTP receive the current + timestamp, rather than the HTTP "Last Modified" time (this can be + fixed by including utime.h, e.g. in SunOS and Tru64...). + + 4.8. Pseudoterminals + + The SSH and PTY commands work by assigning a pseudoterminal and + reading and writing from it. Performance varies according to the + specific platform ranging from very fast to very flow. + + SSH and PTY commands can fail if (a) all pseudoterminals are in use; + or (b) you do not have read/write access to the pseudoterminal that + was assigned. An example of (b) was reported with the Zipslack + Slackware Linux distribution, in which the pseudoterminals were + created with crw-r--r-- permission, instead of crw-rw-rw-. + + 4.9. Miscellaneous + + * Reportedly, the Unix C-Kermit server, under some conditions, on + certain particular systems, fails to log out its login session + upon receipt of a BYE command. Before relying on the BYE command + working, test it a few times to make sure it works on your system: + there might be system configuration or security mechanisms to + prevent an inferior process (like Kermit) from killing a superior + one (like the login shell). + * On AT&T 7300 (3B1) machines, you might have to "stty nl1" before + starting C-Kermit. Do this if characters are lost during + communications operations. + * Under the bash shell (versions prior to 1.07 from CWRU), "pushing" + to an inferior shell and then exiting back to Kermit leaves Kermit + in the background such that it must be explicitly fg'd. This is + reportedly fixed in version 1.07 of bash (and definitely in modern + bash versions). + ________________________________________________________________________ + + 5. INITIALIZATION AND COMMAND FILES + + [ [539]Top ] [ [540]Contents ] [ [541]Next ] [ [542]Previous ] + + C-Kermit's initialization file for Unix is .kermrc (lowercase, starts + with period) in your home directory, unless Kermit was built with the + system-wide initialization-file option (see the [543]C-Kermit for Unix + Installation Instructions). + + C-Kermit identifies your home directory based on the environment + variable, HOME. Most Unix systems set this variable automatically when + you log in. If C-Kermit can't find your initialization file, check + your HOME variable: + + echo $HOME (at the Unix prompt) + + or: + + echo \$(HOME) (at the C-Kermit prompt) + + If HOME is not defined, or is defined incorrectly, add the appropriate + definition to your Unix .profile or .login file, depending on your + shell: + + setenv HOME full-pathname-of-your-home-directory (C-Shell, .login file) + + or: + + HOME=full-pathname-of-your-home-directory (sh, ksh, .profile file) + export HOME + + NOTE: Various other operations depend on the correct definition of + HOME. These include the "tilde-expansion" feature, which allows you to + refer to your home directory as "~" in filenames used in C-Kermit + commands, e.g.: + + send ~/.kermrc + + as well as the \v(home) variable. + + Prior to version 5A(190), C-Kermit would look for its initialization + file in the current directory if it was not found in the home + directory. This feature was removed from 5A(190) because it was a + security risk. Some people, however, liked this behavior and had + .kermrc files in all their directories that would set up things + appropriately for the files therein. If you want this behavior, you + can accomplish it in various ways, for example: + + * Create a shell alias, for example: + alias kd="kermit -Y ./.kermrc" + * Create a .kermrc file in your home directory, whose contents are: + take ./.kermrc + + Suppose you need to pass a password from the Unix command line to a + C-Kermit script program, in such a way that it does not show up in + "ps" or "w" listings. Here is a method (not guaranteed to be 100% + secure, but definitely more secure than the more obvious methods): + + echo mypassword | kermit myscript + + The "myscript" file contains all the commands that need to be executed + during the Kermit session, up to and including EXIT, and also includes + an ASK or ASKQ command to read the password from standard input, which + has been piped in from the Unix 'echo' command, but it must not + include a CONNECT command. Only "kermit myscript" shows up in the ps + listing. + ________________________________________________________________________ + + 6. COMMUNICATION SPEED SELECTION + + [ [544]Top ] [ [545]Contents ] [ [546]Next ] [ [547]Previous ] + + Version-7 based Unix implementations, including 4.3 BSD and earlier + and Unix systems based upon BSD, use a 4-bit field to record a serial + device's terminal speed. This leaves room for 16 speeds, of which the + first 14 are normally: + + 0, 50, 75, 110, 134.5, 150, 200, 300, 600, 1200, 1800, 2400, 4800, + and 9600 + + The remaining two are usually called EXTA and EXTB, and are defined by + the particular Unix implementation. C-Kermit determines which speeds + are available on your system based on whether symbols for them are + defined in your terminal device header files. EXTA is generally + assumed to be 19200 and EXTB 38400, but these assumptions might be + wrong, or they might not apply to a particular device that does not + support these speeds. Presumably, if you try to set a speed that is + not legal on a particular device, the driver will return an error, but + this can not be guaranteed. + + On these systems, it is usually not possible to select a speed of + 14400 bps for use with V.32bis modems. In that case, use 19200 or + 38400 bps, configure your modem to lock its interface speed and to use + RTS/CTS flow control, and tell C-Kermit to SET FLOW RTS/CTS and SET + DIAL SPEED-MATCHING OFF. + + The situation is similar, but different, in System V. SVID Third + Edition lists the same speeds, 0 through 38400. + + Some versions of Unix, and/or terminal device drivers that come with + certain third-party add-in high-speed serial communication interfaces, + use the low "baud rates" to stand for higher ones. For example, SET + SPEED 50 gets you 57600 bps; SET SPEED 75 gets you 76800; SET SPEED + 110 gets 115200. + + SCO ODT 3.0 is an example where a "baud-rate-table patch" can be + applied that can rotate the tty driver baud rate table such that + 600=57600 and 1800=115k baud. Similarly for Digiboard + multiport/portservers, which have a "fastbaud" setting that does this. + Linux has a "setserial" command that can do it, etc. + + More modern Unixes support POSIX-based speed setting, in which the + selection of speeds is not limited by a 4-bit field. C-Kermit 6.1 + incorporates a new mechanism for finding out (at compile time) which + serial speeds are supported by the operating system that does not + involve editing of source code by hand; on systems like Solaris 5.1, + IRIX 6.2, and SCO OSR5.0.4, "set speed ?" will list speeds up to + 460800 or 921600. In C-Kermit 7.0 and later: + + 1. If a symbol for a particular speed (say B230400 for 230400 bps) + appears in whatever header file defines acceptable serial speeds + (e.g. or or , etc), the + corresponding speed will appear in C-Kermit's "set speed ?" list. + 2. The fact that a given speed is listed in the header files and + appears in C-Kermit's list does not mean the driver will accept + it. For example, a computer might have some standard serial ports + plus some add-on ones with different drivers that accept a + different repertoire of speeds. + 3. The fact that a given speed is accepted by the driver does not + guarantee the underlying hardware can accept it. + + When Kermit is given a "set speed" command for a particular device, + the underlying system service is called to set the speed; its return + code is checked and the SET SPEED command fails if the return code + indicates failure. Regardless of the system service return status, the + device's speed is then read back and if it does not match the speed + that was requested, an error message is printed and the command fails. + + Even when the command succeeds, this does not guarantee successful + operation at a particular speed, especially a high one. That depends + on electricity, information theory, etc. How long is the cable, what + is its capacitance, how well is it shielded, etc, not to mention that + every connection has two ends and its success depends on both of them. + (With the obvious caveats about internal modems, is the cable really + connected, interrupt conflicts, etc etc etc). + + Note, in particular, that there is a certain threshold above which + modems can not "autobaud" -- i.e. detect the serial interface speed + when you type AT (or whatever else the modem's recognition sequence + might be). Such modems need to be engaged at a lower speed (say 2400 + or 9600 or even 115200 -- any speed below their autobaud threshold) + and then must be given a modem-specific command (which can be found in + the modem manual) to change their interface speed to the desired + higher speed, and then the software must also be told to change to the + new, higher speed. + + For additional information, read [548]Section 9.5 of the Installation + Instructions, plus any platform-specific notes in [549]Section 3 + above. + ________________________________________________________________________ + + 7. COMMUNICATIONS AND DIALING + + [ [550]Top ] [ [551]Contents ] [ [552]Next ] [ [553]Previous ] + + 7.1. Serial Ports and Modems + + If you SET LINE to a serial port modem-control device that has nothing + plugged in to it, or has a modem connected that is powered off, and + you have not given a prior SET MODEM TYPE or SET CARRIER-WATCH OFF + command, the SET LINE command is likely to hang. In most cases, you + can Ctrl-C out. If not, you'll have to kill C-Kermit from another + terminal. + + Similarly, if you give a SET MODEM TYPE HAYES (or USR, or any other + modem type besides DIRECT, NONE, or UNKNOWN) and then SET LINE to an + empty port, the subsequent close (implicit or explicit) is liable to + hang or even crash (through no fault of Kermit's -- the hanging or + crashing is inside a system call such as cfsetospeed() or close()). + + The SET CARRIER-WATCH command works as advertised only if the + underlying operating system and device drivers support this feature; + in particular only if a read() operation returns immediately with an + error code if the carrier signal goes away or, failing that, if + C-Kermit can obtain the modem signals from the device driver (you can + tell by giving a "set line" command to a serial device, and then a + "show communications" command -- if modem signals are not listed, + C-Kermit won't be able to detect carrier loss, the WAIT command will + not work, etc). Of course, the device itself (e.g. modem) must be + configured appropriately and the cables convey the carrier and other + needed signals, etc. + + If you dial out from Unix system, but then notice a lot of weird + character strings being stuck into your session at random times + (especially if they look like +++ATQ0H0 or login banners or prompts), + that means that getty is also trying to control the same device. + You'll need to dial out on a device that is not waiting for a login, + or else disable getty on the device. + + As of version 7.0, C-Kermit makes explicit checks for the Carrier + Detect signal, and so catches hung-up connections much better than 6.0 + and earlier. However, it still can not be guaranteed to catch every + ever CD on-to-off transition. For example, when the HP-UX version of + C-Kermit is in CONNECT mode on a dialed connection and CARRIER-WATCH + ON or AUTO, and you turn off the modem, HP-UX is stuck in a read() + that never returns. (C-Kermit does not pop back to its prompt + automatically, but you can still escape back.) + + If, on the other hand, you log out from the remote system, and it + hangs up, and CD drops on the local modem, C-Kermit detects this and + pops back to the prompt as it should. (Evidently there can be a + difference between CD and DSR turning off at the same time, versus CD + turning off while DSR stays on; experimentation with &S0/&S1/&S2 on + your modem might produce the desired results). + + When Unix C-Kermit exits, it closes (and must close) the + communications device. If you were dialed out, this will most likely + hang up the connection. If you want to get out of Kermit and still use + Kermit's communication device, you have several choices: + + 1. Shell out from Kermit or suspend Kermit, and refer to the device + literally (as in "term -blah -blah < /dev/cua > /dev/cua"). + 2. Shell out from Kermit and use the device's file descriptor which + Kermit makes available to you in the \v(ttyfd) variable. + 3. Use C-Kermit's REDIRECT command. + 4. Use C-Kermit new EXEC /REDIRECT command. + + If you are having trouble dialing: + + 1. Make sure the dialout line is configured correctly. More about + this below. + 2. Make sure all necessary patches are installed for your operating + system. + 3. If you can't dial on a "bidirectional" line, then configure it for + outbound-only (remove the getty) and try again. (The mechanisms -- + if any -- for grabbing bidirectional lines for dialout vary wildly + among Unix implementations and releases, and C-Kermit -- which + runs on well over 300 different Unix variations -- makes no effort + to keep up with them; the recommended method for coping with this + situation is to wrap C-Kermit in a shell script that takes the + appropriate actions.) + 4. Make sure C-Kermit's SET DIAL and SET MODEM parameters agree with + the modem you are actually using -- pay particular attention to + SET DIAL SPEED-MATCHING. + 5. If MODEM HANGUP-METHOD is set to RS232-SIGNAL, change it to + MODEM-COMMAND. Or vice-versa. + 6. Try SET DIAL HANGUP OFF before the DIAL command. Also, SET DIAL + DISPLAY ON to watch what's happening. See [554]Section 8 of the + [555]Installation Instructions. + 7. Read pages 50-67 of [556]Using C-Kermit. + 8. As a last resort, don't use the DIAL command at all; SET CARRIER + OFF and CONNECT to the modem and dial interactively, or write a + script program to dial the modem. + + Make sure your dialout line is correctly configured for dialing out + (as opposed to login). The method for doing this is different for each + kind of Unix system. Consult your system documentation for configuring + lines for dialing out (for example, Sun SparcStation IPC users should + read the section "Setting up Modem Software" in the Desktop SPARC Sun + System & Network Manager's Guide; HP-9000 workstation users should + consult the manual Configuring HP-UX for Peripherals, etc). + + Symptom: DIAL works, but a subsequent CONNECT command does not. + Diagnosis: the modem is not asserting Carrier Detect (CD) after the + connection is made, or the cable does not convey the CD signal. Cure: + Reconfigure the modem, replace the cable. Workaround: SET CARRIER OFF + (at least in System-V based Unix versions). + + For Berkeley-Unix-based systems (4.3BSD and earlier), Kermit includes + code to use LPASS8 mode when parity is none, which is supposed to + allow 8-bit data and Xon/Xoff flow control at the same time. However, + as of edit 174, this code is entirely disabled because it is + unreliable: even though the host operating system might (or might not) + support LPASS8 mode correctly, the host access protocols (terminal + servers, telnet, rlogin, etc) generally have no way of finding out + about it and therefore render it ineffective, causing file transfer + failures. So as of edit 174, Kermit once again uses rawmode for 8-bit + data, and so there is no Xon/Xoff flow control during file transfer or + terminal emulation in the Berkeley-based versions (4.3 and earlier, + not 4.4). + + Also on Berkeley-based systems (4.3 and earlier), there is apparently + no way to configure a dialout line for proper carrier handling, i.e. + ignore carrier during dialing, require carrier thereafter, get a fatal + error on any attempt to read from the device after carrier drops (this + is handled nicely in System V by manipulation of the CLOCAL flag). The + symptom is that carrier loss does not make C-Kermit pop back to the + prompt automatically. This is evident on the NeXT, for example, but + not on SunOS, which supports the CLOCAL flag. This is not a Kermit + problem, but a limitation of the underlying operating system. For + example, the cu program on the NeXT doesn't notice carrier loss + either, whereas cu on the Sun does. + + On certain AT&T Unix systems equipped with AT&T modems, DIAL and + HANGUP don't work right. Workarounds: (1) SET DIAL HANGUP OFF before + attempting to dial; (2) If HANGUP doesn't work, SET LINE, and then SET + LINE to totally close and reopen the device. If all else + fails, SET CARRIER OFF. + + C-Kermit does not contain any particular support for AT&T DataKit + devices. You can use Kermit software to dial in to a DataKit line, but + C-Kermit does not contain the specialized code required to dial out + from a DataKit line. If the Unix system is connected to DataKit via + serial ports, dialout should work normally (e.g. set line /dev/ttym1, + set speed 19200, connect, and then see the DESTINATION: prompt, from + which you can connect to another computer on the DataKit network or to + an outgoing modem pool, etc). But if the Unix system is connected to + the DataKit network through the special DataKit interface board, then + SET LINE to a DataKit pseudodevice (such as /dev/dk031t) will not work + (you must use the DataKit "dk" or "dkcu" program instead). In C-Kermit + 7.0 and later, you can make Kermit connections "though" dk or dkcu + using "set line /pty". + + In some BSD-based Unix C-Kermit versions, SET LINE to a port that has + nothing plugged in to it with SET CARRIER ON will hang the program (as + it should), but it can't be interrupted with Ctrl-C. The interrupt + trap is correctly armed, but apparently the Unix open() call cannot be + interrupted in this case. When SET CARRIER is OFF or AUTO, the SET + LINE will eventually return, but then the program hangs + (uninterruptibly) when the EXIT or QUIT command (or, presumably, + another SET LINE command) is given. The latter is probably because of + the attempt to hang up the modem. (In edit 169, a timeout alarm was + placed around this operation.) + + With SET DIAL HANGUP OFF in effect, the DIAL command might work only + once, but not again on the same device. In that case, give a CLOSE + command to close the device, and then another SET LINE command to + re-open the same device. Or rebuild your version of Kermit with the + -DCLSOPN compile-time switch. + + The DIAL command says "To cancel: Type your interrupt character + (normally Ctrl-C)." This is just one example of where program messages + and documentation assume your interrupt character is Ctrl-C. But it + might be something else. In most (but not necessarily all) cases, the + character referred to is the one that generates the SIGINT signal. If + Ctrl-C doesn't act as an interrupt character for you, type the Unix + command "stty -a" or "stty all" or "stty everything" to see what your + interrupt character is. (Kermit could be made to find out what the + interrupt character is, but this would require a lot of + platform-dependent coding and #ifdefs, and a new routine and interface + between the platform-dependent and platform-independent parts of the + program.) + + In general, the hangup operation on a serial communication device is + prone to failure. C-Kermit tries to support many, many different kinds + of computers, and there seems to be no portable method for hanging up + a modem connection (i.e. turning off the RS-232 DTR signal and then + turning it back on again). If HANGUP, DIAL, and/or Ctrl-\H do not work + for you, and you are a programmer, look at the tthang() function in + ckutio.c and see if you can add code to make it work correctly for + your system, and send the code to the address above. (NOTE: This + problem has been largely sidestepped as of edit 188, in which Kermit + first attempts to hang up the modem by "escaping back" via +++ and + then giving the modem's hangup command, e.g. ATH0, when DIAL + MODEM-HANGUP is ON, which is the default setting.) + + Even when Kermit's modem-control software is configured correctly for + your computer, it can only work right if your modem is also configured + to assert the CD signal when it is connected to the remote modem and + to hang up the connection when your computer drops the DTR signal. So + before deciding Kermit doesn't work with your modem, check your modem + configuration AND the cable (if any) connecting your modem to the + computer -- it should be a straight-through modem cable conducting the + signals FG, SG, TD, RD, RTS, CTS, DSR, DTR, CD, and RI. + + Many Unix systems keep aliases for dialout devices; for example, + /dev/acu might be an alias for /dev/tty00. But most of these Unix + systems also use UUCP lockfile conventions that do not take this + aliasing into account, so if one user assigns (e.g.) /dev/acu, then + another user can still assign the same device by referring to its + other name. This is not a Kermit problem -- Kermit must follow the + lockfile conventions used by the vendor-supplied software (cu, tip, + uucp). + + The SET FLOW-CONTROL KEEP option should be given *before* any + communication (dialing, terminal emulation, file transfer, + INPUT/OUTPUT/TRANSMIT, etc) is attempted, if you want C-Kermit to use + all of the device's preexisting flow-control related settings. The + default flow-control setting is XON/XOFF, and it will take effect when + the first communication-related command is given, and a subsequent SET + FLOW KEEP command will not necessarily know how to restore *all* of + the device's original flow-control settings. + + 7.2. Network Connections + + C-Kermit tries to use the 8th bit for data when parity is NONE, and + this generally works on real Unix terminal (tty) devices, but it often + does not work when the Unix system is accessed over a network via + telnet or rlogin protocols, including (in many cases) through terminal + servers. For example, an Encore computer with Annex terminal servers + only gives a 7-bit path if the rlogin protocol is selected in the + terminal server but it gives the full 8 bits if the proprietary RDP + protocol is used. + + If file transfer does not work through a host to which you have + rlogin'd, use "rlogin -8" rather than "rlogin". If that doesn't work, + tell both Kermit programs to "set parity space". + + The Encore TELNET server does not allow long bursts of input. When you + have a TELNET connection to an Encore, tell C-Kermit on the Encore to + SET RECEIVE PACKET-LENGTH 200 or thereabouts. + ________________________________________________________________________ + + 8. HARDWARE FLOW CONTROL + + [ [557]Top ] [ [558]Contents ] [ [559]Next ] [ [560]Previous ] + + SET FLOW RTS/CTS is available in Unix C-Kermit only when the + underlying operating system provides an Application Program Interface + (API) for turning this feature on and off under program control, which + turns out to be a rather rare feature among Unix systems. To see if + your Unix C-Kermit version supports hardware flow control, type "set + flow ?" at the C-Kermit prompt, and look for "rts/cts" among the + options. Other common situations include: + + 1. The API is available, so "set flow rts/cts" appears as a valid + C-Kermit command, but it doesn't do anything because the device + driver (part of the operating system) was never coded to do + hardware flow control. This is common among System V R4 + implementations (details below). + 2. The API is not available, so "set flow rts/cts" does NOT appear as + a valid C-Kermit command, but you can still get RTS/CTS flow + control by selecting a specially named device in your SET LINE + command. Examples: + + NeXTSTEP: /dev/cufa instead of /dev/cua, /dev/cufb instead of + /dev/cub (68040 only; "man zs" for further info). + + IRIX: /dev/ttyf2 instead of /dev/ttyd2 or /dev/ttym2 ("man 7 + serial"). + 3. The API is available, doesn't work, but a workaround as in (2) can + be used. + 4. The API is available, but Kermit doesn't know about it. In these + cases, you can usually use an stty command to enable RTS/CTS on + the device, e.g. "stty crtscts" or "stty ctsflow", "stty rtsflow", + before starting Kermit, and then tell Kermit to SET FLOW KEEP. + 5. No API and no special device drivers. Hardware flow control is + completely unavailable. + + System V R4 based Unixes are supposed to supply a file, + which gives Kermit the necessary interface to command the terminal + driver to enable/disable hardware flow control. Unfortunately, but + predictably, many implementations of SVR4 whimsically place this file + in /usr/include/sys rather than /usr/include (where SVID clearly + specifies it should be; see SVID, Third Edition, V1, termiox(BA_DEV). + Thus if you build C-Kermit with any of the makefile entries that + contain -DTERMIOX or -DSTERMIOX (the latter to select + ), C-Kermit will have "set flow rts/cts" and possibly + other hardware flow-control related commands. BUT... That does not + necessarily mean that they will work. In some cases, the underlying + functions are simply not coded into the operating system. + + WARNING: When hardware flow control is available, and you enable in + Kermit on a device that is not receiving the CTS signal, Kermit can + hang waiting for CTS to come up. This is most easily seen when the + local serial port has nothing plugged in to it, or is connected to an + external modem that is powered off. + ________________________________________________________________________ + + 9. TERMINAL CONNECTION AND KEY MAPPING + + [ [561]Top ] [ [562]Contents ] [ [563]Next ] [ [564]Previous ] + + C-Kermit is not a terminal emulator. Refer to page 147 of [565]Using + C-Kermit, 2nd Edition: "Most versions of C-Kermit -- Unix, VMS, + AOS/VS, VOS, etc -- provide terminal connection without emulation. + These versions act as a 'semitransparent pipe' between the remote + computer and your terminal, terminal emulator, console driver, or + window, which in turn emulates (or is) a specific kind of terminal." + The environment in which you run C-Kermit is up to you. + + If you are an X Windows user, you should be aware of an alternative to + xterm that supports VT220 emulation, from Thomas E. Dickey: + + [566]http://dickey.his.com/xterm/xterm.html + + Unix C-Kermit's SET KEY command currently can not be used with keys + that generate "wide" scan codes or multibyte sequences, such as + workstation function or arrow keys, because Unix C-Kermit does not + have direct access to the keyboard. + + However, many Unix workstations and/or console drivers provide their + own key mapping feature. With xterm, for example, you can use + 'xmodmap' ("man xmodmap" for details); here is an xterm mapping to map + the Sun keyboard to DEC VT200 values for use with VT-terminal oriented + applications like VMS EVE: + + keycode 101=KP_0 + keycode 119=KP_1 + keycode 120=KP_2 + keycode 121=KP_3 + keycode 98=KP_4 + keycode 99=KP_5 + keycode 100=KP_6 + keycode 75=KP_7 + keycode 76=KP_8 + keycode 77=KP_9 + keycode 52=KP_F1 + keycode 53=KP_F2 + keycode 54=KP_F3 + keycode 57=KP_Decimal + keycode 28=Left + keycode 29=Right + keycode 30=KP_Separator + keycode 105=KP_F4 + keycode 78=KP_Subtract + keycode 8=Left + keycode 10=Right + keycode 32=Up + keycode 33=Down + keycode 97=KP_Enter + + Users of Linux consoles can use loadkeys ("man dumpkeys loadkeys + keytables" for details. The format used by loadkeys is compatible with + that used by Xmodmap, although it is not definitely certain that the + keycodes are compatible for different keyboard types (e.g. Sun vs HP + vs PC, etc). + ________________________________________________________________________ + + 10. FILE TRANSFER + + [ [567]Top ] [ [568]Contents ] [ [569]Next ] [ [570]Previous ] + + If uploads (or downloads) fail immediately, give the CAUTIOUS command + to Kermit and try again. If they still fail, then try SET PREFIXING + ALL. If they still fail, try SET PARITY SPACE. If they still fail, try + ROBUST. + + If reception (particularly of large files and/or binary files) begins + successfully but then fail constently after a certain amount of bytes + have been sent, check: + + * Your ulimit ("ulimit -a") + * The amount of available space on the target disk ("df ." or "df -k + .") + * Your personal disk quota (platform- and site-dependent) + * The maximum file size on the receiver's file system (e.g. 2GB in + old verions the Linux VFS file system, and/or in applications that + have not been recoded to use new "large file" APIs). + * If it's an NFS-mounted disk (if so, try uploading to a local disk) + * Is there an "idle limit" on the receiving end? + + If none of these seem to explain it, then the problem is not size + related, but reflects some clash between the file contents and the + characteristics of the connection, in which case follow the + instructions in the first paragraph of this section. + + Suppose two copies of Kermit are receiving files into the same + directory, and the files have the same name, e.g. "foo.bar". Whichever + one starts first opens an output file called "foo.bar". The second one + sees there is already a foo.bar file, and so renames the existing + foo.bar to foo.bar.~1~ (or whatever). When the first file has been + received completely, Kermit goes to change its modification time and + permissions to those given by the file sender in the Attribute packet. + But in Unix, the APIs for doing this take a filename, not a file + descriptor. Since the first Kermit's file has been renamed, and the + second Kermit is using the original name, the first Kermit changes the + modtime and permissions of the second Kermit's file, not its own. + Although there might be a way to work around this in the code, e.g. + using inode numbers to keep track of which file is which, this would + be tricky and most likely not very portable. It's better to set up + your application to prevent such things from happening, which is easy + enough using the script language, filename templates, etc. + + Suppose you start C-Kermit with a command-line argument to send or + receive a file (e.g. "kermit -r") and then type Ctrl-\c immediately + afterwards to escape back and initiate the other end of the transfer, + BUT your local Kermit's escape character is not Ctrl-\. In this case, + the local Kermit passes the Ctrl-\ to the remote system, and if this + is Unix, Ctrl-\ is likely to be its SIGQUIT character, which causes + the current program to halt and dump core. Well, just about the first + thing C-Kermit does when it starts is to disable the SIGQUIT signal. + However, it is still possible for SIGQUIT to cause Kermit to quit and + dump core if it is delivered while Kermit is being loaded or started, + before the signal can be disabled. There's nothing Kermit itself can + do about this, but you can prevent it from happening by disabling + SIGQUIT in your Unix session. The command is usually something like: + + stty quit undef + + Unix C-Kermit does not reject incoming files on the basis of size. + There appears to be no good (reliable, portable) way to determine in + advance how much disk space is available, either on the device, or + (when quotas or other limits are involved) to the user. + + Unix C-Kermit discards all carriage returns from incoming files when + in text mode. + + If C-Kermit has problems creating files in writable directories when + it is installed setuid or setgid on BSD-based versions of Unix such as + NeXTSTEP 3.0, it probably needs to be rebuilt with the -DSW_ACC_ID + compilation switch. + + If you SET FILE DISPLAY FULLSCREEN, and C-Kermit complains "Sorry, + terminal type not supported", it means that the terminal library + (termcap or termlib) that C-Kermit was built with does not know about + a terminal whose name is the current value of your TERM environment + variable. If this happens, but you want to have the fullscreen file + transfer display, EXIT from C-Kermit and set a Unix terminal type from + among the supported values that is also supported by your terminal + emulator, or else have an entry for your terminal type added to the + system termcap and/or terminfo database. + + If you attempt to suspend C-Kermit during local-mode file transfer and + then continue it in the background (via bg), it will block for "tty + output" if you are using the FULLSCREEN file transfer display. This is + apparently a problem with curses. Moving a local-mode file transfer + back and forth between foreground and background works correctly, + however, with the SERIAL, CRT, BRIEF, or NONE file transfer displays. + + If C-Kermit's command parser no longer echoes, or otherwise acts + strangely, after returning from a file transfer with the fullscreen + (curses) display, and the curses library for your version of Unix + includes the newterm() function, then try rebuilding your version of + C-Kermit with -DCK_NEWTERM. Similarly if it echoes doubly, which might + even happen during a subsequent CONNECT session. If rebuilding with + -DCK_NEWTERM doesn't fix it, then there is something very strange + about your system's curses library, and you should probably not use + it. Tell C-Kermit to SET FILE DISPLAY CRT, BRIEF, or anything else + other than FULLSCREEN, and/or rebuild without -DCK_CURSES, and without + linking with (termlib and) curses. Note: This problem seemed to have + escalated in C-Kermit 7.0, and -DCK_NEWTERM had to be added to many + builds that previously worked without it: Linux, AIX 4.1, DG/UX, etc. + In the Linux case, it is obviously because of changes in the (n)curses + library; the cause in the other cases is not known. + + C-Kermit creates backup-file names (such as "oofa.txt.~1~") based on + its knowledge of the maximum filename length on the platform where it + is running, which is learned at compile time, based on MAXNAMLEN or + equivalent symbols from the system header files. But suppose C-Kermit + is receiving files on a Unix platform that supports long filenames, + but the incoming files are being stored on an NFS-mounted file system + that supports only short names. NFS maps the external system to the + local APIs, so C-Kermit has no way of knowing that long names will be + truncated. Or that C-Kermit is running on a version of Unix that + supports both long-name and short-name file systems simultaneously + (such as HP-UX 7.00). This can cause unexpected behavior when creating + backup files, or worse. For example, you are sending a group of files + whose names are differentiated only by characters past the point at + which they would be truncated, each file will overwrite the previous + one upon arrival. + ________________________________________________________________________ + + 11. EXTERNAL FILE TRANSFER PROTOCOLS + + [ [571]Top ] [ [572]Contents ] [ [573]Next ] [ [574]Previous ] + + SECTION CONTENTS + + 11.1. [575]C-Kermit as an External Protocol + 11.2. [576]Invoking External Protocols from C-Kermit + + Unix C-Kermit can be used in conjunction with other communications + software in various ways. C-Kermit can be invoked from another + communications program as an "external protocol", and C-Kermit can + also invoke other communication software to perform external + protocols. + + This sort of operation makes sense only when you are dialing out from + your Unix system (or making a network connection from it). If the Unix + system is the one you have dialed in to, you don't need any of these + tricks. Just run the desired software on your Unix system instead of + Kermit. When dialing out from a Unix system, the difficulty is getting + two programs to share the same communication device in spite of the + Unix UUCP lockfile mechanism, which would normally prevent any + sharing, and preventing the external protocol from closing (and + therefore hanging up) the device when it exits back to the program + that invoked it. + + 11.1. C-KERMIT AS AN EXTERNAL PROTOCOL + + [ [577]Top ] [ [578]Contents ] [ [579]Section Contents ] [ [580]Next ] + + (This section deleted; see [581]Using C-Kermit, 2nd Ed, Chapter 14.) + + "pcomm" is a general-purpose terminal program that provides file + transfer capabilities itself (X- and YMODEM variations) and the + ability to call on external programs to do file transfers (ZMODEM and + Kermit, for example). You can tell pcomm the command to send or + receive a file with an external protocol: + Send Receive + ZMODEM sz filename rz + Kermit kermit -s filename kermit -r + + pcomm runs external programs for file transfer by making stdin and + stdout point to the modem port, and then exec-ing "/bin/sh -c xxx" + (where xxx is the appropriate command). However, C-Kermit does not + treat stdin and stdout as the communication device unless you instruct + it: + + + Send Receive + Kermit kermit -l 0 -s filename kermit -l 0 -r + + The "-l 0" option means to use file descriptor 0 for the communication + device. + + In general, any program can pass any open file descriptor to C-Kermit + for the communication device in the "-l" command-line option. When + Kermit is given a number as the argument to the "-l" option, it simply + uses it as a file descriptor, and it does not attempt to close it upon + exit. + + Here's another example, for Seyon (a Linux communication program). + First try the technique above. If that works, fine; otherwise... If + Seyon does not give you a way to access and pass along the file + descriptor, but it starts up the Kermit program with its standard i/o + redirected to its (Seyon's) communications file descriptor, you can + also experiment with the following method, which worked here in brief + tests on SunOS. Instead of having Seyon use "kermit -r" or "kermit -s + filename" as its Kermit protocol commands, use something like this + (examples assume C-Kermit 6.0): + + For serial connections: + + kermit -YqQl 0 -r <-- to receive + kermit -YqQl 0 -s filename(s) <-- to send one or more files + + For Telnet connections: + + kermit -YqQF 0 -r <-- to receive + kermit -YqQF 0 -s filename(s) <-- to send one or more files + + Command line options: + + Y - skip executing the init file + Q - use fast file transfer settings (default in 8.0) + l 0 - transfer files using file descriptor 0 for a serial connection + F 0 - transfer files using file descriptor 0 for a Telnet connection + q - quiet - no messages + r - receive + s - send + + 11.2. INVOKING EXTERNAL PROTOCOLS FROM C-KERMIT + + [ [582]Top ] [ [583]Contents ] [ [584]Section Contents ] [ + [585]Previous ] + + (This section is obsolete, but not totally useless. See Chapter 14 + of [586]Using C-Kermit, 2nd Edition). + + After you have opened a communication link with C-Kermit's SET LINE + (SET PORT) or SET HOST (TELNET) command, C-Kermit makes its file + descriptor available to you in the \v(ttyfd) variable so you can pass + it along to other programs that you RUN from C-Kermit. Here, for + example, C-Kermit runs itself as an external protocol: + + C-Kermit>set modem type hayes + C-Kermit>set line /dev/acu + C-Kermit>set speed 2400 + C-Kermit>dial 7654321 + Call complete. + C-Kermit>echo \v(ttyfd) + 3 + C-Kermit>run kermit -l \v(ttyfd) + + Other programs that accept open file descriptors on the command line + can be started in the same way. + + You can also use your shell's i/o redirection facilities to assign + C-Kermit's open file descriptor (ttyfd) to stdin or stdout. For + example, old versions of the Unix ZMODEM programs, sz and rz, when + invoked as external protocols, expect to find the communication device + assigned to stdin and stdout with no option for specifying any other + file descriptor on the sz or rz command line. However, you can still + invoke sz and rz as exterior protocols from C-Kermit if your current + shell ($SHELL variable) is ksh (the Korn shell) or bash (the + Bourne-Again shell), which allows assignment of arbitrary file + descriptors to stdin and stdout: + + C-Kermit> run rz <&\v(ttyfd) >&\v(ttyfd) + + or: + + C-Kermit> run sz oofa.zip <&\v(ttyfd) >&\v(ttyfd) + + In version 5A(190) and later, you can use C-Kermit's REDIRECT command, + if it is available in your version of C-Kermit, to accomplish the same + thing without going through the shell: + + C-Kermit> redirect rz + + or: + + C-Kermit> redirect sz oofa.zip + + A complete set of rz,sz,rb,sb,rx,sx macros for Unix C-Kermit is + defined in the file ckurzsz.ini. It automatically chooses the best + redirection method (but is redundant since C-Kermit 6.0, which now has + built-in support for external protocols via its SET PROTOCOL command). + + Note that external protocols can be used on C-Kermit SET LINE or SET + HOST connections only if they operate through standard input and + standard output. If they open their own connections, Kermit can't + redirect them over its own connection. + ________________________________________________________________________ + + 12. SECURITY + + [ [587]Top ] [ [588]Contents ] [ [589]Next ] [ [590]Previous ] + + As of version 7.0, C-Kermit supports a wide range of security options + for authentication and encryption: Kerberos 4, Kerberos 5 / GSSAPI, + SSL/TLS, and SRP. See the separate [591]security document for details. + ________________________________________________________________________ + + 13. MISCELLANEOUS USER REPORTS + + [ [592]Top ] [ [593]Contents ] [ [594]Next ] [ [595]Previous ] + +Date: Thu, 12 Mar 92 1:59:25 MEZ +From: Walter Mecky +Subject: Help.Unix.sw +To: svr4@pcsbst.pcs.com, source@usl.com + +PRODUCT: Unix +RELEASE: Dell SVR4 V2.1 (is USL V3.0) +MACHINE: AT-386 +PATHNAME: /usr/lib/libc.so.1 + /usr/ccs/lib/libc.a +ABSTRACT: Function ttyname() does not close its file descriptor +DESCRIPTION: + ttyname(3C) opens /dev but never closes it. So if it is called + often enough the open(2) in ttyname() fails. Because the broken + ttyname() is in the shared lib too all programs using it can + fail if they call it often enough. One important program is + uucico which calls ttyname for every file it transfers. + + Here is a little test program if your system has the bug: + +#include +#include +main() { + int i = 0; + while (ttyname(0) != NULL) + i++; + perror("ttyname"); + printf("i=%d\n", i); +} + + If this program runs longer than some seconds you don't have the bug. + + WORKAROUND: None FIX: Very easy if you have source code. + + Another user reports some more explicit symptoms and recoveries: + +> What happens is when invoking ckermit we get one of the following +> error messages: +> You must set line +> Not a tty +> No more processes. +> One of the following three actions clears the peoblem: +> shutdown -y -g0 -i6 +> kill -9 the ttymon with the highest PID +> Invoke sysadm and disable then enable the line you want to use. +> Turning off respawn of sac -t 300 and going to getty's and uugetty's +> does not help. +> +> Also C-Kermit reports "?timed out closing /dev/ttyxx". +> If this happens all is well. + +------------------------------ + + (Note: the following problem also occurs on SGI and probably many + other Unix systems): + + From: James Spath + To: Info-Kermit-Request@cunixf.cc.columbia.edu + Date: Wed, 9 Sep 1992 20:20:28 -0400 + Subject: C-Kermit vs uugetty (or init) on Sperry 5000 + + We have successfully compiled the above release on a Unisys/Sperry + 5000/95. We used the sys5r3 option, rather than sys5r2 since we have + VR3 running on our system. In order to allow dialout access to + non-superusers, we had to do "chmod 666 /dev/tty###, where it had been + -rw--w--w- (owned by uucp), and to do "chmod +w /usr/spool/locks". We + have done text and binary file transfers through local and remote + connections. + + The problem concerning uucp ownership and permissions is worse than I + thought at first. Apparently init or uugetty changes the file + permissions after each session. So I wrote the following C program to + open a set of requested tty lines. I run this for any required + outgoing line prior to a Kermit session. + + ------ cut here ------- +/* opentty.c -- force allow read on tty lines for modem i/o */ +/* idea from: restrict.c -- System 5 Admin book Thomas/Farrow p. 605 */ +/* /jes jim spath {spath@jhunix.hcj.jhu.edu } */ +/* 08-Sep-92 NO COPYRIGHT. */ +/* this must be suid to open other tty lines */ + +/* #define DEBUG */ +#define TTY "/dev/tty" +#define LOK "/usr/spool/locks/LCK..tty" +#include + +/* allowable lines: */ +#define TOTAL_LINES 3 +static char allowable[TOTAL_LINES][4] = { "200", "201", "300" }; +static int total=TOTAL_LINES; +int allow; + +/* states: */ +#define TTY_UNDEF 0 +#define TTY_LOCK 1 +#define TTY_OKAY 2 + +main(argc, argv) +int argc; char *argv[]; { + char device[512]; + char lockdev[512]; + int i; + if (argc == 1) { + fprintf(stderr, "usage: open 200 [...]\n"); + } + while (--argc > 0 && (*++argv) != NULL ) { +#ifdef DEBUG + fprintf(stderr, "TRYING: %s%s\n", TTY, *argv); +#endif + sprintf(device, "%s%s", TTY, *argv); + sprintf(lockdev, "%s%s", LOK, *argv); + allow = TTY_UNDEF; i = 0; + while (i <= total) { /* look at all defined lines */ +#ifdef DEBUG + fprintf(stderr, "LOCKFILE? %s?\n", lockdev); +#endif + if (access(lockdev, 00) == 0) { + allow=TTY_LOCK; + break; + } +#ifdef DEBUG + fprintf(stderr, "DOES:%s==%s?\n", allowable[i], *argv); +#endif + if (strcmp(allowable[i], *argv) == 0) + allow=TTY_OKAY; + i++; + } +#ifdef DEBUG + fprintf(stderr, "allow=%d\n", allow); +#endif + switch (allow) { + case TTY_UNDEF: + fprintf (stderr, "open: not allowed on %s\n", *argv); + break; + case TTY_LOCK: + fprintf (stderr, "open: device locked: %s\n", lockdev); + break; + case TTY_OKAY: + /* attempt to change mode on device */ + if (chmod (device, 00666) < 0) + fprintf (stderr, "open: cannot chmod on %s\n", device); + break; + default: + fprintf (stderr, "open: FAULT\n"); + } + } + exit (0); +} + ________________________________________________________________________ + + 14. THIRD-PARTY DRIVERS + + [ [596]Top ] [ [597]Contents ] [ [598]Next ] [ [599]Previous ] + + Unix versions, especially those for PCs (SCO, Unixware, etc) might be + augmented by third-party communication-board drivers from Digiboard, + Stallion, etc. These can sometimes complicate matters for Kermit + considerably since Kermit has no way of knowing that it is going + through a possibly nonstandard driver. Various examples are listed in + the earlier sections of this document; search for Stallion, Digiboard, + etc. Additionally: + + * The Stallion Technologies EasyConnection serial board driver does + not always report the state of DSR as low. From Stallion (October + 1997): "Unfortunately, this is a bug in our driver. We have + implemented all of the other TIOMC functions, eg DTR, DCD, RTS and + CTS, but not DSR. Our driver should report the actual state of DSR + on those of our cards that have a DSR signal. That the driver + always reports DSR as not asserted (0), is a bug in the driver. + The driver should be either reporting the state of DSR correctly + on those cards that support DSR or as always asserted (1) on those + cards that do not have a DSR signal. This will be fixed in a + future version of our drivers; at this time I cannot say when this + will be." And later, "As far as I can tell, we don't support the + termios/termiox ioctls that relate specifically to DSR and RI; all + the rest are supported. This will, as I mentioned earlier, be + fixed in the next release of our ATA software." + - World Wide Escalation Support, Stallion Technologies, Toowong + QLD, [600]support@stallion.oz.au. + + Later (December 1997, from the same source): + + * We have now released a new version of the ATA software, version + 5.4.0. This version fixes the problem with the states of the DSR + and RI signals and how they were being reported by the driver. + This is the problem that you reported in October. The DSR signal + is reported correctly on those cards that support the DSR signal, + such as the early revision of the EasyIO card and the + EasyConnection 8D4 panel, and as always asserted on those cards + that do not support the DSR signal in the hardware. The new driver + is available from our Web site, [601]www.stallion.com, in the + /drivers/ata5/UnixWare directory. + + [ [602]Top ] [ [603]Contents ] [ [604]C-Kermit Home ] [ [605]C-Kermit + 8.0 Overview ] [ [606]Kermit Home ] + _________________________________________________________________ + + C-Kermit 8.0 Unix Hints and Tips / [607]The Kermit Project / + [608]Columbia University / [609]kermit@columbia.edu + +References + + 1. http://www.columbia.edu/kermit/ + 2. http://www.columbia.edu/ + 3. http://www.columbia.edu/kermit/ckubwr.html + 4. mailto:kermit-support@columbia.edu + 5. http://www.columbia.edu/kermit/ckermit.html + 6. http://www.columbia.edu/kermit/ckuins.html + 7. http://www.columbia.edu/kermit/ckututor.html + 8. http://www.columbia.edu/kermit/ckubwr.html#x1 + 9. http://www.columbia.edu/kermit/ckubwr.html#x2 + 10. http://www.columbia.edu/kermit/ckubwr.html#x3 + 11. http://www.columbia.edu/kermit/ckubwr.html#x4 + 12. http://www.columbia.edu/kermit/ckubwr.html#x5 + 13. http://www.columbia.edu/kermit/ckubwr.html#x6 + 14. http://www.columbia.edu/kermit/ckubwr.html#x7 + 15. http://www.columbia.edu/kermit/ckubwr.html#x8 + 16. http://www.columbia.edu/kermit/ckubwr.html#x9 + 17. http://www.columbia.edu/kermit/ckubwr.html#x10 + 18. http://www.columbia.edu/kermit/ckubwr.html#x11 + 19. http://www.columbia.edu/kermit/ckubwr.html#x12 + 20. http://www.columbia.edu/kermit/ckubwr.html#x13 + 21. http://www.columbia.edu/kermit/ckubwr.html#x14 + 22. http://www.columbia.edu/kermit/ckubwr.html#x3.3 + 23. http://www.columbia.edu/kermit/ckubwr.html#x3.18 + 24. http://www.columbia.edu/kermit/ckubwr.html#x3.19 + 25. http://www.columbia.edu/kermit/ckubwr.html#x3.1 + 26. http://www.columbia.edu/kermit/ckubwr.html#x3.2 + 27. http://www.columbia.edu/kermit/ckubwr.html#x3.7 + 28. http://www.columbia.edu/kermit/ckubwr.html#x3.6 + 29. http://www.columbia.edu/kermit/ckubwr.html#x3.13 + 30. http://www.columbia.edu/kermit/ckubwr.html#top + 31. http://www.columbia.edu/kermit/ckubwr.html#contents + 32. http://www.columbia.edu/kermit/ckubwr.html#x2 + 33. http://www.columbia.edu/kermit/ckubwr.html#x1.1 + 34. http://www.columbia.edu/kermit/ckubwr.html#x1.2 + 35. http://www.columbia.edu/kermit/ckubwr.html#x1.3 + 36. http://www.columbia.edu/kermit/ckubwr.html#x1.4 + 37. http://www.columbia.edu/kermit/ckubwr.html#x3.3 + 38. http://www.columbia.edu/kermit/ckubwr.html#x3.1 + 39. http://www.columbia.edu/kermit/ckubwr.html#x3.2 + 40. http://www.columbia.edu/kermit/ckubwr.html#x3.7 + 41. http://www.columbia.edu/kermit/ckcbwr.html + 42. mailto:kermit-support@columbia.edu + 43. http://www.columbia.edu/kermit/ckubwr.html#top + 44. http://www.columbia.edu/kermit/ckubwr.html#contents + 45. http://www.columbia.edu/kermit/ckubwr.html#x1.2 + 46. http://www.columbia.edu/kermit/ck60manual.html + 47. http://www.columbia.edu/kermit/ckermit70.html + 48. http://www.columbia.edu/kermit/ckermit80.html + 49. http://www.columbia.edu/kermit/ckubwr.html#top + 50. http://www.columbia.edu/kermit/ckubwr.html#contents + 51. http://www.columbia.edu/kermit/ckubwr.html#x1 + 52. http://www.columbia.edu/kermit/ckubwr.html#x1.3 + 53. http://www.columbia.edu/kermit/ckubwr.html#x1.1 + 54. http://www.columbia.edu/kermit/support.html + 55. http://www.columbia.edu/kermit/ckubwr.html#top + 56. http://www.columbia.edu/kermit/ckubwr.html#contents + 57. http://www.columbia.edu/kermit/ckubwr.html#x1 + 58. http://www.columbia.edu/kermit/ckubwr.html#x1.4 + 59. http://www.columbia.edu/kermit/ckubwr.html#x1.2 + 60. http://www.columbia.edu/kermit/ckubwr.html#top + 61. http://www.columbia.edu/kermit/ckubwr.html#contents + 62. http://www.columbia.edu/kermit/ckubwr.html#x1 + 63. http://www.columbia.edu/kermit/ckubwr.html#x1.3 + 64. http://www.columbia.edu/kermit/ckubwr.html#top + 65. http://www.columbia.edu/kermit/ckubwr.html#contents + 66. http://www.columbia.edu/kermit/ckubwr.html#x3 + 67. http://www.columbia.edu/kermit/ckubwr.html#x1 + 68. http://www.columbia.edu/kermit/ckubwr.html#top + 69. http://www.columbia.edu/kermit/ckubwr.html#contents + 70. http://www.columbia.edu/kermit/ckubwr.html#x4 + 71. http://www.columbia.edu/kermit/ckubwr.html#x2 + 72. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 73. http://www.columbia.edu/kermit/ckubwr.html#x3.1 + 74. http://www.columbia.edu/kermit/ckubwr.html#x3.2 + 75. http://www.columbia.edu/kermit/ckubwr.html#x3.3 + 76. http://www.columbia.edu/kermit/ckubwr.html#x3.4 + 77. http://www.columbia.edu/kermit/ckubwr.html#x3.5 + 78. http://www.columbia.edu/kermit/ckubwr.html#x3.6 + 79. http://www.columbia.edu/kermit/ckubwr.html#x3.7 + 80. http://www.columbia.edu/kermit/ckubwr.html#x3.8 + 81. http://www.columbia.edu/kermit/ckubwr.html#x3.9 + 82. http://www.columbia.edu/kermit/ckubwr.html#x3.10 + 83. http://www.columbia.edu/kermit/ckubwr.html#x3.11 + 84. http://www.columbia.edu/kermit/ckubwr.html#x3.12 + 85. http://www.columbia.edu/kermit/ckubwr.html#x3.13 + 86. http://www.columbia.edu/kermit/ckubwr.html#x3.14 + 87. http://www.columbia.edu/kermit/ckubwr.html#x3.15 + 88. http://www.columbia.edu/kermit/ckubwr.html#x3.16 + 89. http://www.columbia.edu/kermit/ckubwr.html#x3.17 + 90. http://www.columbia.edu/kermit/ckubwr.html#x3.18 + 91. http://www.columbia.edu/kermit/ckubwr.html#x3.19 + 92. http://www.columbia.edu/kermit/ckubwr.html#x3.20 + 93. http://www.faqs.org/ + 94. http://aplawrence.com/Unixart/newtounix.html + 95. http://www.columbia.edu/kermit/x3 + 96. mailto:kermit-support@columbia.edu + 97. http://www.columbia.edu/kermit/support.html + 98. http://www.columbia.edu/kermit/ckubwr.html#top + 99. http://www.columbia.edu/kermit/ckubwr.html#contents + 100. http://www.columbia.edu/kermit/ckubwr.html#x3 + 101. http://www.columbia.edu/kermit/ckubwr.html#x3.1 + 102. http://www.pcunix.com/ + 103. http://www.columbia.edu/kermit/ckubwr.html#x3.0.1 + 104. http://www.columbia.edu/kermit/ckubwr.html#x3.0.2 + 105. http://www.columbia.edu/kermit/ckubwr.html#x3.0.3 + 106. http://www.columbia.edu/kermit/ckubwr.html#x3.0.4 + 107. http://www.columbia.edu/kermit/ckubwr.html#x3.0.5 + 108. http://www.columbia.edu/kermit/ckubwr.html#x3.0.6 + 109. http://www.columbia.edu/kermit/ckubwr.html#top + 110. http://www.columbia.edu/kermit/ckubwr.html#contents + 111. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 112. http://www.columbia.edu/kermit/ckubwr.html#x3.0.2 + 113. http://www.columbia.edu/kermit/ckubwr.html#top + 114. http://www.columbia.edu/kermit/ckubwr.html#contents + 115. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 116. http://www.columbia.edu/kermit/ckubwr.html#x3.0.3 + 117. http://www.columbia.edu/kermit/ckubwr.html#x3.0.1 + 118. http://www.linmodems.org/ + 119. http://www.microsoft.com/hwdev/platform/PCdesign/LR/default.asp + 120. http://www.columbia.edu/kermit/ckubwr.html#top + 121. http://www.columbia.edu/kermit/ckubwr.html#contents + 122. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 123. http://www.columbia.edu/kermit/ckubwr.html#x3.0.4 + 124. http://www.columbia.edu/kermit/ckubwr.html#x3.0.2 + 125. http://www.idir.net/~gromitkc/winmodem.html + 126. http://www.digi.com/ + 127. http://www.columbia.edu/kermit/ckubwr.html#top + 128. http://www.columbia.edu/kermit/ckubwr.html#contents + 129. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 130. http://www.columbia.edu/kermit/ckubwr.html#x3.0.5 + 131. http://www.columbia.edu/kermit/ckubwr.html#x3.0.3 + 132. http://www.columbia.edu/kermit/ckubwr.html#top + 133. http://www.columbia.edu/kermit/ckubwr.html#contents + 134. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 135. http://www.columbia.edu/kermit/ckubwr.html#x3.0.6 + 136. http://www.columbia.edu/kermit/ckubwr.html#x3.0.4 + 137. http://www.columbia.edu/kermit/ckubwr.html#top + 138. http://www.columbia.edu/kermit/ckubwr.html#contents + 139. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 140. http://www.columbia.edu/kermit/ckubwr.html#x3.0.5 + 141. http://www.columbia.edu/kermit/ckubwr.html#top + 142. http://www.columbia.edu/kermit/ckubwr.html#contents + 143. http://www.columbia.edu/kermit/ckubwr.html#x3 + 144. http://www.columbia.edu/kermit/ckubwr.html#x3.2 + 145. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 146. http://www.columbia.edu/kermit/ckubwr.html#x3.1.1 + 147. http://www.columbia.edu/kermit/ckubwr.html#x3.1.2 + 148. http://www.columbia.edu/kermit/ckubwr.html#x3.1.3 + 149. http://www.columbia.edu/kermit/ckubwr.html#x3.1.4 + 150. http://www.columbia.edu/kermit/ckubwr.html#x3.1.5 + 151. http://www.emerson.emory.edu/services/aix-faq/ + 152. http://www.faqs.org/faqs/by-newsgroup/comp/comp.unix.aix.html + 153. http://www.cis.ohio-state.edu/hypertext/faq/usenet/aix-faq/top.html + 154. http://aixpdslib.seas.ucla.edu/ + 155. http://www.rootvg.net (AIX history)/ + 156. ftp://rtfm.mit.edu/pub/usenet/news.answers/aix-faq/part1 + 157. ftp://mirrors.aol.com/pub/rtfm/usenet-by-hierarchy/comp/unix/aix + 158. news:comp.unix.aix + 159. http://www.columbia.edu/kermit/ckubwr.html#top + 160. http://www.columbia.edu/kermit/ckubwr.html#contents + 161. http://www.columbia.edu/kermit/ckubwr.html#x3.1 + 162. http://www.columbia.edu/kermit/ckubwr.html#x3.1.2 + 163. http://www.columbia.edu/kermit/ckubwr.html#top + 164. http://www.columbia.edu/kermit/ckubwr.html#contents + 165. http://www.columbia.edu/kermit/ckubwr.html#x3.1 + 166. http://www.columbia.edu/kermit/ckubwr.html#x3.1.3 + 167. http://www.columbia.edu/kermit/ckubwr.html#x3.1.1 + 168. http://www.columbia.edu/kermit/security.html#servers + 169. http://www.columbia.edu/kermit/ckubwr.html#top + 170. http://www.columbia.edu/kermit/ckubwr.html#contents + 171. http://www.columbia.edu/kermit/ckubwr.html#x3.1 + 172. http://www.columbia.edu/kermit/ckubwr.html#x3.1.4 + 173. http://www.columbia.edu/kermit/ckubwr.html#x3.1.2 + 174. http://service.software.ibm.com/rs6000/ + 175. http://www.columbia.edu/kermit/ckubwr.html#top + 176. http://www.columbia.edu/kermit/ckubwr.html#contents + 177. http://www.columbia.edu/kermit/ckubwr.html#x3.1 + 178. http://www.columbia.edu/kermit/ckubwr.html#x3.1.5 + 179. http://www.columbia.edu/kermit/ckubwr.html#x3.1.3 + 180. http://www.columbia.edu/kermit/ckubwr.html#top + 181. http://www.columbia.edu/kermit/ckubwr.html#contents + 182. http://www.columbia.edu/kermit/ckubwr.html#x3.1 + 183. http://www.columbia.edu/kermit/ckubwr.html#x3.1.4 + 184. http://www.columbia.edu/kermit/ckubwr.html#top + 185. http://www.columbia.edu/kermit/ckubwr.html#contents + 186. http://www.columbia.edu/kermit/ckubwr.html#x3 + 187. http://www.columbia.edu/kermit/ckubwr.html#x3.3 + 188. http://www.columbia.edu/kermit/ckubwr.html#x3.1 + 189. http://www.columbia.edu/kermit/ckubwr.html#x3.2.0 + 190. http://www.columbia.edu/kermit/ckubwr.html#x3.2.1 + 191. http://www.columbia.edu/kermit/ckubwr.html#x3.2.2 + 192. http://www.columbia.edu/kermit/ckubwr.html#x3.2.3 + 193. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4 + 194. http://www.columbia.edu/kermit/ckubwr.html#x3.2.5 + 195. news:comp.sys.hp.hpux + 196. http://www.columbia.edu/kermit/ckubwr.html#top + 197. http://www.columbia.edu/kermit/ckubwr.html#contents + 198. http://www.columbia.edu/kermit/ckubwr.html#x3.2 + 199. http://www.columbia.edu/kermit/ckubwr.html#x3.2.1 + 200. http://www.columbia.edu/kermit/ckubwr.html#top + 201. http://www.columbia.edu/kermit/ckubwr.html#contents + 202. http://www.columbia.edu/kermit/ckubwr.html#x3.2 + 203. http://www.columbia.edu/kermit/ckubwr.html#x3.2.2 + 204. http://www.columbia.edu/kermit/ckubwr.html#x3.2.0 + 205. ftp://kermit.columbia.edu/kermit/f/makefile + 206. http://www.columbia.edu/kermit/ckubwr.html#top + 207. http://www.columbia.edu/kermit/ckubwr.html#contents + 208. http://www.columbia.edu/kermit/ckubwr.html#x3.2 + 209. http://www.columbia.edu/kermit/ckubwr.html#x3.2.3 + 210. http://www.columbia.edu/kermit/ckubwr.html#x3.2.1 + 211. http://www.columbia.edu/kermit/ckubwr.html#top + 212. http://www.columbia.edu/kermit/ckubwr.html#contents + 213. http://www.columbia.edu/kermit/ckubwr.html#x3.2 + 214. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4 + 215. http://www.columbia.edu/kermit/ckubwr.html#x3.2.2 + 216. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.1 + 217. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.2 + 218. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.3 + 219. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.4 + 220. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.5 + 221. http://www.columbia.edu/kermit/ckubwr.html#top + 222. http://www.columbia.edu/kermit/ckubwr.html#contents + 223. http://www.columbia.edu/kermit/ckubwr.html#x3.2 + 224. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.2 + 225. http://www.columbia.edu/kermit/ckubwr.html#x3.2.2 + 226. http://www.columbia.edu/kermit/ckubwr.html#top + 227. http://www.columbia.edu/kermit/ckubwr.html#contents + 228. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4 + 229. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.3 + 230. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.1 + 231. http://www.columbia.edu/kermit/ckubwr.html#top + 232. http://www.columbia.edu/kermit/ckubwr.html#contents + 233. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4 + 234. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.4 + 235. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.2 + 236. http://www.columbia.edu/kermit/ckubwr.html#top + 237. http://www.columbia.edu/kermit/ckubwr.html#contents + 238. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4 + 239. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.5 + 240. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.3 + 241. http://www.columbia.edu/kermit/ckubwr.html#top + 242. http://www.columbia.edu/kermit/ckubwr.html#contents + 243. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4 + 244. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.4 + 245. http://www.columbia.edu/kermit/ckubwr.html#top + 246. http://www.columbia.edu/kermit/ckubwr.html#contents + 247. http://www.columbia.edu/kermit/ckubwr.html#x3.2 + 248. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4 + 249. http://www.columbia.edu/kermit/ckubwr.html#top + 250. http://www.columbia.edu/kermit/ckubwr.html#contents + 251. http://www.columbia.edu/kermit/ckubwr.html#x3 + 252. http://www.columbia.edu/kermit/ckubwr.html#x3.4 + 253. http://www.columbia.edu/kermit/ckubwr.html#x3.2 + 254. http://www.columbia.edu/kermit/ckubwr.html#x3.3.1 + 255. http://www.columbia.edu/kermit/ckubwr.html#x3.3.2 + 256. http://www.columbia.edu/kermit/ckubwr.html#x3.3.3 + 257. http://www.columbia.edu/kermit/ckubwr.html#x3.3.4 + 258. http://www.columbia.edu/kermit/ckubwr.html#x3.3.5 + 259. http://www.columbia.edu/kermit/ckubwr.html#x3.3.6 + 260. news:comp.os.linux.misc + 261. news:comp.os.linux.answers + 262. http://www.tldp.org/ + 263. http://www.tldp.org/FAQ/Linux-FAQ.html + 264. http://www.tldp.org/HOWTO/Serial-HOWTO.html + 265. http://tldp.org/HOWTO/Modem-HOWTO.html + 266. ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO + 267. ftp://tsx-11.mit.edu/pub/linux/docs/HOWTO + 268. http://www.tldp.org/HOWTO/ + 269. http://www.tldp.org/hmirrors.html + 270. http://www.redhat.com/apps/support/ + 271. http://www.debian.org/support + 272. http://www.slackware.com/support/ + 273. http://www.caldera.com/support/ + 274. http://www.suse.com/support/ + 275. http://www.mandrake.com/support/ + 276. http://www.turbolinux.com/support/ + 277. http://www.linmodems.org/ + 278. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 279. http://linux.dreamtime.org/decnet/ + 280. mailto:kermit-support@columbia.edu + 281. http://www.linmodems.org/ + 282. http://www.columbia.edu/kermit/ckubwr.html#x3.0.2 + 283. http://www.columbia.edu/kermit/security.html#servers + 284. http://www.columbia.edu/kermit/sshclient.html + 285. http://www.columbia.edu/kermit/ckubwr.html#top + 286. http://www.columbia.edu/kermit/ckubwr.html#contents + 287. http://www.columbia.edu/kermit/ckubwr.html#x3 + 288. http://www.columbia.edu/kermit/ckubwr.html#x3.3.2 + 289. http://www.columbia.edu/kermit/ckubwr.html#top + 290. http://www.columbia.edu/kermit/ckubwr.html#contents + 291. http://www.columbia.edu/kermit/ckubwr.html#x3.3 + 292. http://www.columbia.edu/kermit/ckubwr.html#x3.3.3 + 293. http://www.columbia.edu/kermit/ckubwr.html#x3.3.1 + 294. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 295. http://www.columbia.edu/kermit/ckubwr.html#x6 + 296. http://www.columbia.edu/kermit/ckubwr.html#x7 + 297. http://www.columbia.edu/kermit/ckubwr.html#x8 + 298. http://www.columbia.edu/kermit/ckuins.html#x10 + 299. http://www.columbia.edu/kermit/ckuins.html#x11 + 300. http://www.columbia.edu/kermit/ckuins.html + 301. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 302. http://linuxwww.db.erau.edu/mail_archives/linux-kernel/Mar_98/1441.html + 303. http://www.columbia.edu/kermit/ckubwr.html#top + 304. http://www.columbia.edu/kermit/ckubwr.html#contents + 305. http://www.columbia.edu/kermit/ckubwr.html#x3.3 + 306. http://www.columbia.edu/kermit/ckubwr.html#x3.3.4 + 307. http://www.columbia.edu/kermit/ckubwr.html#x3.3.2 + 308. http://www.columbia.edu/kermit/ckubwr.html#x3.0.5 + 309. http://www.columbia.edu/kermit/ckfaq.html#term + 310. http://dickey.his.com/xterm/xterm.html + 311. http://dickey.his.com/xterm/xterm.html + 312. ftp://kermit.columbia.edu/kermit/f/xmodmap.txt + 313. http://www.columbia.edu/kermit/ckubwr.html#top + 314. http://www.columbia.edu/kermit/ckubwr.html#contents + 315. http://www.columbia.edu/kermit/ckubwr.html#x3.3 + 316. http://www.columbia.edu/kermit/ckubwr.html#x3.3.5 + 317. http://www.columbia.edu/kermit/ckubwr.html#x3.3.3 + 318. http://www.columbia.edu/kermit/ckubwr.html#top + 319. http://www.columbia.edu/kermit/ckubwr.html#contents + 320. http://www.columbia.edu/kermit/ckubwr.html#x3.3 + 321. http://www.columbia.edu/kermit/ckubwr.html#x3.3.6 + 322. http://www.columbia.edu/kermit/ckubwr.html#x3.3.4 + 323. http://www.columbia.edu/kermit/ckermit.html + 324. mailto:kermit-support@columbia.edu + 325. http://www.redhat.com/support/errata/RHBA-2001-153.html + 326. news:comp.protocols.kermit.misc + 327. http://www.columbia.edu/kermit/ckubwr.html#top + 328. http://www.columbia.edu/kermit/ckubwr.html#contents + 329. http://www.columbia.edu/kermit/ckubwr.html#x3.3 + 330. http://www.columbia.edu/kermit/ckubwr.html#x3.3.5 + 331. http://www.columbia.edu/kermit/ckubwr.html#top + 332. http://www.columbia.edu/kermit/ckubwr.html#contents + 333. http://www.columbia.edu/kermit/ckubwr.html#x3 + 334. http://www.columbia.edu/kermit/ckubwr.html#x3.5 + 335. http://www.columbia.edu/kermit/ckubwr.html#x3.3 + 336. http://www.columbia.edu/kermit/ckubwr.html#top + 337. http://www.columbia.edu/kermit/ckubwr.html#contents + 338. http://www.columbia.edu/kermit/ckubwr.html#x3 + 339. http://www.columbia.edu/kermit/ckubwr.html#x3.6 + 340. http://www.columbia.edu/kermit/ckubwr.html#x3.4 + 341. news:comp.os.qnx + 342. http://www.columbia.edu/kermit/gkermit.html + 343. http://www.columbia.edu/kermit/ckuins.html#x10 + 344. http://www.columbia.edu/kermit/ckuins.html + 345. http://www.columbia.edu/kermit/ckubwr.html#top + 346. http://www.columbia.edu/kermit/ckubwr.html#contents + 347. http://www.columbia.edu/kermit/ckubwr.html#x3 + 348. http://www.columbia.edu/kermit/ckubwr.html#x3.7 + 349. http://www.columbia.edu/kermit/ckubwr.html#x3.5 + 350. http://www.columbia.edu/kermit/ckubwr.html#x3.6.1 + 351. http://www.columbia.edu/kermit/ckubwr.html#x3.6.2 + 352. http://www.columbia.edu/kermit/ckubwr.html#x3.6.3 + 353. http://www.columbia.edu/kermit/ckubwr.html#x3.6.4 + 354. http://www.columbia.edu/kermit/ckubwr.html#x3.10 + 355. http://aplawrence.com/SCOFAQ/ + 356. http://www.zenez.com/cgi-bin/scoprogfaq/faq.pl + 357. http://www.zenez.com/cgi-bin/scouw7faq/faq.pl + 358. http://zenez.pcunix.com/cgi-bin/scouw7faq/faq.pl + 359. http://pcunix.com/Unixart/modems.html + 360. http://www.freebird.org/faq/ + 361. http://www.freebird.org/faq/developer.html + 362. http://support.caldera.com/caldera + 363. http://stage.caldera.com/ta/ + 364. http://aplawrence.com/newtosco.html + 365. http://www.columbia.edu/kermit/ckubwr.html#x3.0.5 + 366. http://www.columbia.edu/kermit/ckfaq.html#term + 367. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 368. http://www.columbia.edu/kermit/ckubwr.html#top + 369. http://www.columbia.edu/kermit/ckubwr.html#contents + 370. http://www.columbia.edu/kermit/ckubwr.html#x3.6 + 371. http://www.columbia.edu/kermit/ckubwr.html#x3.6.1 + 372. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 373. http://www.columbia.edu/kermit/ckubwr.html#top + 374. http://www.columbia.edu/kermit/ckubwr.html#contents + 375. http://www.columbia.edu/kermit/ckubwr.html#x3.6 + 376. http://www.columbia.edu/kermit/ckubwr.html#x3.6.3 + 377. http://www.columbia.edu/kermit/ckubwr.html#x3.6.1 + 378. http://www.digi.com/ + 379. ftp://ftp.fu-berlin.de/pub/unix/driver/fas + 380. http://www.columbia.edu/kermit/ckubwr.html#x14 + 381. http://www.sco.com/ + 382. ftp://ftp.sco.com/ + 383. http://www.columbia.edu/kermit/ckubwr.html#top + 384. http://www.columbia.edu/kermit/ckubwr.html#contents + 385. http://www.columbia.edu/kermit/ckubwr.html#x3.6 + 386. http://www.columbia.edu/kermit/ckubwr.html#x3.6.4 + 387. http://www.columbia.edu/kermit/ckubwr.html#x3.6.2 + 388. http://www.columbia.edu/kermit/ckubwr.html#x3.10 + 389. http://www.columbia.edu/kermit/ckubwr.html#top + 390. http://www.columbia.edu/kermit/ckubwr.html#contents + 391. http://www.columbia.edu/kermit/ckubwr.html#x3.6 + 392. http://www.columbia.edu/kermit/ckubwr.html#x3.6.3 + 393. http://www.columbia.edu/kermit/ckubwr.html#top + 394. http://www.columbia.edu/kermit/ckubwr.html#contents + 395. http://www.columbia.edu/kermit/ckubwr.html#x3 + 396. http://www.columbia.edu/kermit/ckubwr.html#x3.8 + 397. http://www.columbia.edu/kermit/ckubwr.html#x3.6 + 398. http://www.columbia.edu/kermit/ckubwr.html#x3.7.1 + 399. http://www.columbia.edu/kermit/ckubwr.html#x3.7.2 + 400. http://www.columbia.edu/kermit/ckubwr.html#x3.7.3 + 401. http://www.columbia.edu/kermit/ckubwr.html#x3.7.4 + 402. http://www.columbia.edu/kermit/ckubwr.html#x3.7.5 + 403. news:comp.unix.solaris + 404. http://access1.sun.com/ + 405. http://docs.sun.com/ + 406. http://www.sunhelp.com/ + 407. http://www.wins.uva.nl/pub/solaris/solaris2/ + 408. http://www.wins.uva.nl/cgi-bin/sfaq.cgi + 409. ftp://ftp.wins.uva.nl/pub/solaris + 410. http://www.science.uva.nl/pub/solaris/solaris2.html + 411. http://www.stokely.com/ + 412. http://www.stokely.com/unix.sysadm.resources/faqs.sun.html + 413. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 414. http://www.columbia.edu/kermit/ckubwr.html#top + 415. http://www.columbia.edu/kermit/ckubwr.html#contents + 416. http://www.columbia.edu/kermit/ckubwr.html#x3 + 417. http://www.columbia.edu/kermit/ckubwr.html#x3.7 + 418. http://www.columbia.edu/kermit/ckubwr.html#x3.7.2 + 419. http://www.columbia.edu/kermit/ckubwr.html#top + 420. http://www.columbia.edu/kermit/ckubwr.html#contents + 421. http://www.columbia.edu/kermit/ckubwr.html#x3.7 + 422. http://www.columbia.edu/kermit/ckubwr.html#x3.7.3 + 423. http://www.columbia.edu/kermit/ckubwr.html#x3.7.1 + 424. http://www.columbia.edu/kermit/ckubwr.html#top + 425. http://www.columbia.edu/kermit/ckubwr.html#contents + 426. http://www.columbia.edu/kermit/ckubwr.html#x3.7 + 427. http://www.columbia.edu/kermit/ckubwr.html#x3.7.4 + 428. http://www.columbia.edu/kermit/ckubwr.html#x3.7.2 + 429. http://www.columbia.edu/kermit/ckubwr.html#top + 430. http://www.columbia.edu/kermit/ckubwr.html#contents + 431. http://www.columbia.edu/kermit/ckubwr.html#x3.7 + 432. http://www.columbia.edu/kermit/ckubwr.html#x3.7.5 + 433. http://www.columbia.edu/kermit/ckubwr.html#x3.7.3 + 434. news:comp.os.vms + 435. http://www.columbia.edu/kermit/ckubwr.html#top + 436. http://www.columbia.edu/kermit/ckubwr.html#contents + 437. http://www.columbia.edu/kermit/ckubwr.html#x3.7 + 438. http://www.columbia.edu/kermit/ckubwr.html#x3.7.6 + 439. http://www.columbia.edu/kermit/ckubwr.html#x3.7.4 + 440. http://www.columbia.edu/kermit/ckubwr.html#top + 441. http://www.columbia.edu/kermit/ckubwr.html#contents + 442. http://www.columbia.edu/kermit/ckubwr.html#x3.7 + 443. http://www.columbia.edu/kermit/ckubwr.html#x3.7.5 + 444. http://www.columbia.edu/kermit/ckubwr.html#top + 445. http://www.columbia.edu/kermit/ckubwr.html#contents + 446. http://www.columbia.edu/kermit/ckubwr.html#x3 + 447. http://www.columbia.edu/kermit/ckubwr.html#x3.9 + 448. http://www.columbia.edu/kermit/ckubwr.html#x3.7 + 449. http://www.stokely.com/ + 450. http://access1.sun.com/ + 451. http://www.ludd.luth.se/~bear/project/sun/sun.hardware.txt + 452. ftp://ftp.netcom.com/pub/ru/rubicon/sun.hdwr.ref + 453. ftp://ftp.intnet.net/pub/SUN/Sun-Hardware-Ref + 454. http://www.columbia.edu/kermit/ckubwr.html#top + 455. http://www.columbia.edu/kermit/ckubwr.html#contents + 456. http://www.columbia.edu/kermit/ckubwr.html#x3 + 457. http://www.columbia.edu/kermit/ckubwr.html#x3.10 + 458. http://www.columbia.edu/kermit/ckubwr.html#x3.8 + 459. news:comp.unix.ultrix + 460. news:comp.sys.dec + 461. http://www.columbia.edu/kermit/ckubwr.html#top + 462. http://www.columbia.edu/kermit/ckubwr.html#contents + 463. http://www.columbia.edu/kermit/ckubwr.html#x3 + 464. http://www.columbia.edu/kermit/ckubwr.html#x3.11 + 465. http://www.columbia.edu/kermit/ckubwr.html#x3.9 + 466. http://www.freebird.org/ + 467. http://www.freebird.org/faq/ + 468. news:comp.unix.unixware.misc + 469. news:comp.unix.sco.misc + 470. http://www.columbia.edu/kermit/ckubwr.html#x3.0 + 471. ftp://kermit.columbia.edu/kermit/f/ckutio.c + 472. http://www.columbia.edu/kermit/ckubwr.html#top + 473. http://www.columbia.edu/kermit/ckubwr.html#contents + 474. http://www.columbia.edu/kermit/ckubwr.html#x3 + 475. http://www.columbia.edu/kermit/ckubwr.html#x3.12 + 476. http://www.columbia.edu/kermit/ckubwr.html#x3.10 + 477. http://www.columbia.edu/kermit/ckubwr.html#top + 478. http://www.columbia.edu/kermit/ckubwr.html#contents + 479. http://www.columbia.edu/kermit/ckubwr.html#x3 + 480. http://www.columbia.edu/kermit/ckubwr.html#x3.13 + 481. http://www.columbia.edu/kermit/ckubwr.html#x3.11 + 482. http://www.columbia.edu/kermit/ckubwr.html#top + 483. http://www.columbia.edu/kermit/ckubwr.html#contents + 484. http://www.columbia.edu/kermit/ckubwr.html#x3 + 485. http://www.columbia.edu/kermit/ckubwr.html#x3.14 + 486. http://www.columbia.edu/kermit/ckubwr.html#x3.12 + 487. http://www.columbia.edu/kermit/ckubwr.html#top + 488. http://www.columbia.edu/kermit/ckubwr.html#contents + 489. http://www.columbia.edu/kermit/ckubwr.html#x3 + 490. http://www.columbia.edu/kermit/ckubwr.html#x3.15 + 491. http://www.columbia.edu/kermit/ckubwr.html#x3.13 + 492. news:comp.sys.sgi.misc + 493. news:comp.sys.sgi.admin + 494. http://www.sgi.com/ + 495. http://www-viz.tamu.edu/~sgi-faq/ + 496. ftp://viz.tamu.edu/pub/sgi/faq/ + 497. http://www.columbia.edu/kermit/ckuins.html + 498. http://freeware.sgi.com/Installable/gcc-2.95.2.html + 499. http://freeware.sgi.com/Installable/gcc-2.95.2.html + 500. http://www.columbia.edu/kermit/ckubwr.html#top + 501. http://www.columbia.edu/kermit/ckubwr.html#contents + 502. http://www.columbia.edu/kermit/ckubwr.html#x3 + 503. http://www.columbia.edu/kermit/ckubwr.html#x3.16 + 504. http://www.columbia.edu/kermit/ckubwr.html#x3.14 + 505. news:comp.sys.be + 506. http://www.columbia.edu/kermit/ckubwr.html#top + 507. http://www.columbia.edu/kermit/ckubwr.html#contents + 508. http://www.columbia.edu/kermit/ckubwr.html#x3 + 509. http://www.columbia.edu/kermit/ckubwr.html#x3.17 + 510. http://www.columbia.edu/kermit/ckubwr.html#x3.15 + 511. http://www.columbia.edu/kermit/ckubwr.html#top + 512. http://www.columbia.edu/kermit/ckubwr.html#contents + 513. http://www.columbia.edu/kermit/ckubwr.html#x3 + 514. http://www.columbia.edu/kermit/ckubwr.html#x3.18 + 515. http://www.columbia.edu/kermit/ckubwr.html#x3.16 + 516. http://www.columbia.edu/kermit/ckubwr.html#top + 517. http://www.columbia.edu/kermit/ckubwr.html#contents + 518. http://www.columbia.edu/kermit/ckubwr.html#x3 + 519. http://www.columbia.edu/kermit/ckubwr.html#x3.19 + 520. http://www.columbia.edu/kermit/ckubwr.html#x3.17 + 521. http://www.columbia.edu/kermit/ckubwr.html#top + 522. http://www.columbia.edu/kermit/ckubwr.html#contents + 523. http://www.columbia.edu/kermit/ckubwr.html#x3 + 524. http://www.columbia.edu/kermit/ckubwr.html#x3.20 + 525. http://www.columbia.edu/kermit/ckubwr.html#x3.18 + 526. http://www.keyspan.com/products/usb/adapter/ + 527. http://www.columbia.edu/kermit/ckuins.html + 528. http://cerebus.sandiego.edu/~jerry/UnixTips/ + 529. http://www.columbia.edu/kermit/ckubwr.html#top + 530. http://www.columbia.edu/kermit/ckubwr.html#contents + 531. http://www.columbia.edu/kermit/ckubwr.html#x3 + 532. http://www.columbia.edu/kermit/ckubwr.html#x3.19 + 533. http://www.uni-giessen.de/faq/archiv/coherent-faq.general/msg00000.html + 534. http://www.columbia.edu/kermit/ckubwr.html#top + 535. http://www.columbia.edu/kermit/ckubwr.html#contents + 536. http://www.columbia.edu/kermit/ckubwr.html#x5 + 537. http://www.columbia.edu/kermit/ckubwr.html#x3 + 538. http://www.columbia.edu/kermit/ckccfg.html + 539. http://www.columbia.edu/kermit/ckubwr.html#top + 540. http://www.columbia.edu/kermit/ckubwr.html#contents + 541. http://www.columbia.edu/kermit/ckubwr.html#x6 + 542. http://www.columbia.edu/kermit/ckubwr.html#x4 + 543. http://www.columbia.edu/kermit/ckuins.html + 544. http://www.columbia.edu/kermit/ckubwr.html#top + 545. http://www.columbia.edu/kermit/ckubwr.html#contents + 546. http://www.columbia.edu/kermit/ckubwr.html#x7 + 547. http://www.columbia.edu/kermit/ckubwr.html#x5 + 548. http://www.columbia.edu/kermit/ckuins.html#9.5 + 549. http://www.columbia.edu/kermit/ckubwr.html#x3 + 550. http://www.columbia.edu/kermit/ckubwr.html#top + 551. http://www.columbia.edu/kermit/ckubwr.html#contents + 552. http://www.columbia.edu/kermit/ckubwr.html#x8 + 553. http://www.columbia.edu/kermit/ckubwr.html#x6 + 554. http://www.columbia.edu/kermit/ckuins.html#x8 + 555. http://www.columbia.edu/kermit/ckuins.html + 556. http://www.columbia.edu/kermit/ck60manual.html + 557. http://www.columbia.edu/kermit/ckubwr.html#top + 558. http://www.columbia.edu/kermit/ckubwr.html#contents + 559. http://www.columbia.edu/kermit/ckubwr.html#x9 + 560. http://www.columbia.edu/kermit/ckubwr.html#x7 + 561. http://www.columbia.edu/kermit/ckubwr.html#top + 562. http://www.columbia.edu/kermit/ckubwr.html#contents + 563. http://www.columbia.edu/kermit/ckubwr.html#x10 + 564. http://www.columbia.edu/kermit/ckubwr.html#x8 + 565. http://www.columbia.edu/kermit/ck60manual.html + 566. http://dickey.his.com/xterm/xterm.html + 567. http://www.columbia.edu/kermit/ckubwr.html#top + 568. http://www.columbia.edu/kermit/ckubwr.html#contents + 569. http://www.columbia.edu/kermit/ckubwr.html#x11 + 570. http://www.columbia.edu/kermit/ckubwr.html#x9 + 571. http://www.columbia.edu/kermit/ckubwr.html#top + 572. http://www.columbia.edu/kermit/ckubwr.html#contents + 573. http://www.columbia.edu/kermit/ckubwr.html#x12 + 574. http://www.columbia.edu/kermit/ckubwr.html#x10 + 575. http://www.columbia.edu/kermit/ckubwr.html#x11.1 + 576. http://www.columbia.edu/kermit/ckubwr.html#x11.2 + 577. http://www.columbia.edu/kermit/ckubwr.html#top + 578. http://www.columbia.edu/kermit/ckubwr.html#contents + 579. http://www.columbia.edu/kermit/ckubwr.html#x11 + 580. http://www.columbia.edu/kermit/ckubwr.html#x11.2 + 581. http://www.columbia.edu/kermit/ck60manual.html + 582. http://www.columbia.edu/kermit/ckubwr.html#top + 583. http://www.columbia.edu/kermit/ckubwr.html#contents + 584. http://www.columbia.edu/kermit/ckubwr.html#x11 + 585. http://www.columbia.edu/kermit/ckubwr.html#x11.1 + 586. http://www.columbia.edu/kermit/ck60manual.html + 587. http://www.columbia.edu/kermit/ckubwr.html#top + 588. http://www.columbia.edu/kermit/ckubwr.html#contents + 589. http://www.columbia.edu/kermit/ckubwr.html#x13 + 590. http://www.columbia.edu/kermit/ckubwr.html#x11 + 591. http://www.columbia.edu/kermit/security.html + 592. http://www.columbia.edu/kermit/ckubwr.html#top + 593. http://www.columbia.edu/kermit/ckubwr.html#contents + 594. http://www.columbia.edu/kermit/ckubwr.html#x14 + 595. http://www.columbia.edu/kermit/ckubwr.html#x12 + 596. http://www.columbia.edu/kermit/ckubwr.html#top + 597. http://www.columbia.edu/kermit/ckubwr.html#contents + 598. http://www.columbia.edu/kermit/ckubwr.html#x15 + 599. http://www.columbia.edu/kermit/ckubwr.html#x14 + 600. mailto:support@stallion.oz.au + 601. http://www.stallion.com/ + 602. http://www.columbia.edu/kermit/ckubwr.html#top + 603. http://www.columbia.edu/kermit/ckubwr.html#contents + 604. http://www.columbia.edu/kermit/ckermit.html + 605. http://www.columbia.edu/kermit/ck80.html + 606. http://www.columbia.edu/kermit/index.html + 607. http://www.columbia.edu/kermit/index.html + 608. http://www.columbia.edu/ + 609. mailto:kermit@columbia.edu diff --git a/ckuins.txt b/ckuins.txt new file mode 100644 index 0000000..86448a3 --- /dev/null +++ b/ckuins.txt @@ -0,0 +1,3519 @@ + +C-Kermit 8.0 Unix Installation Instructions + + [ [1]Contents ] [ [2]C-Kermit ] [ [3]Kermit Home ] + + Frank da Cruz + The Kermit Project + Columbia University + + As of C-Kermit version: 8.0.211, 10 April 2004 + This file last updated: Tue Apr 13 10:14:33 2004 (New York City + time) + + IF YOU ARE READING A PLAIN-TEXT version of this document, note that + this file is a plain-text dump of a Web page. You can visit the + original (and possibly more up-to-date) Web page here: + +[4]http://www.columbia.edu/kermit/ckuins.html + __________________________________________________________________________ + +CONTENTS + + [5]OVERVIEW + + 1. [6]INTERNET QUICK START + 2. [7]INSTALLING FROM PACKAGES + 3. [8]INSTALLING PREBUILT BINARIES + 4. [9]BUILDING FROM SOURCE CODE + 5. [10]INSTALLING THE KERMIT FILES + 6. [11]INSTALLING UNIX C-KERMIT FROM DOS-FORMAT DISKETTES + 7. [12]CHECKING THE RESULTS + 8. [13]REDUCING THE SIZE OF THE EXECUTABLE PROGRAM IMAGE + 9. [14]UNIX VERSIONS + 10. [15]DIALING OUT AND COORDINATING WITH UUCP + 11. [16]RUNNING UNIX C-KERMIT SETUID OR SETGID + 12. [17]CONFIGURING UNIX WORKSTATIONS + 13. [18]BIZARRE BEHAVIOR AT RUNTIME + 14. [19]CRASHES AND CORE DUMPS + 15. [20]SYSLOGGING + 16. [21]BUILDING SECURE VERSIONS OF C-KERMIT 8.0 + 17. [22]INSTALLING C-KERMIT AS AN SSH SERVER SUBSYSTEM + __________________________________________________________________________ + +OVERVIEW + + [ [23]Top ] [ [24]Contents ] [ [25]Next ] + + WARNING: This document contains notes that have been accumulating + since the early 1980s. Many of the products and Unix versions + mentioned here have not been heard of in a long while, but that + does not necessarily mean they are not still running in some + obscure nook. + + This file contains Unix-specific information. A lot of it. Unlike most + other packages, C-Kermit tries very hard to be portable to every Unix + variety (and every release of each one) known to exist, including many + that are quite old, as well as to other platforms like VMS, AOS/VS, + VOS, OS-9, the BeBox, the Amiga, etc. + + Since C-Kermit gets so deeply into the file system, i/o system, and + other areas that differ radically from one Unix platform to the next, + this means that a lot can go wrong when you try to install C-Kermit on + (for example) a new release of a particular variety of Unix, in which + certain things might have changed that C-Kermit depended upon. + + This file concentrates on installation. For a description of general + configuration options for C-Kermit, please read the [26]Configurations + Options document. For troubleshooting after installation, see the + [27]General Hints and Tips and [28]Unix-Specific Hints and Tips + documents. The latter, in particular, contains lots of information on + lots of specific Unix platforms. If you want to work on the source + code, see the [29]C-Kermit Program Logic Manual + + You may install C-Kermit: + + * From an "[30]install package", if one is available. + * As a [31]prebuilt binary, if available, plus accompanying text + files. + * By building from [32]source code. + __________________________________________________________________________ + +1. INTERNET QUICK START + + [ [33]Top ] [ [34]Contents ] [ [35]Next ] [ [36]Previous ] + + If your Unix computer is on the Internet and it has a C compiler, + here's how to download, build, and install C-Kermit directly from the + "tarballs" or Zip archives: + + 1. Make a fresh directory and cd to it. + 2. Download the C-Kermit source code: + [37]ftp://kermit.columbia.edu/kermit/archives/cku211.tar.Z + (compress format) or + [38]ftp://kermit.columbia.edu/kermit/archives/cku211.tar.gz + (gunzip format). + 3. Uncompress the compressed tar file with "uncompress" or "gunzip", + according to which type of compressed file you downloaded. (If you + don't understand this, you could download a (much larger) + uncompressed tar archive directly: + [39]ftp://kermit.columbia.edu/kermit/archives/cku211.tar + 4. Now type "tar xvf cku211.tar" to unpack the individual files from + the tar archive. + 5. Type "rm cku211.tar" to get rid of the tar archive, which is no + longer needed. + 6. Read the comments at the top of the makefile to find out which + target to use and then type the appropriate "make" command, such + as "make linux", "make solaris8", etc. + 7. This produces a binary in your current directory called "wermit". + Start it by typing "./wermit" and [40]try it out to make sure it + works. Then read [41]Section 5 for how to install it, or simply + copy the wermit binary to the desired public directory, rename it + to kermit, and give it the needed permissions (and, if it is going + to be used to dial out, give it the same group and owner and + permissions as the cu, tip, or minicom program). + + For secure installations, see [42]Sections 5 and [43]16. + __________________________________________________________________________ + +2. INSTALLING FROM PACKAGES + + [ [44]Top ] [ [45]Contents ] [ [46]Next ] [ [47]Previous ] + + Various Unix varieties -- Linux, Solaris, AIX, etc -- now incorporate + the idea of "install packages", and many users expect to find all new + applications in this format. A selection of install packages might be + available for any given release of C-Kermit, but there is a tradeoff + between convenience and safety. Unix presents several notable problems + to the builder of install packages: + + a. Since C-Kermit is portable to many non-Unix platforms (VMS, VOS, + AOS/VS, etc), some of the files in the C-Kermit distribution do + not fit into the Unix application model. In particular, C-Kermit + includes some plain text files (described in [48]Section 5) and + Unix has no standard place to put such files. Typical Unix package + managers do not allow for them. Where should they go, and how will + the user know where to find them? + b. Installation of any program that will be used to make modem calls + requires some important decisions from the installer regarding + security and privilege. + + Item (b) is discussed at length in [49]Sections 10 and [50]11 of this + document, but the package-related aspects are also given here. The + basic problem is that Unix dialout devices and the UUCP "lock files" + that regulate contention for them (described in [51]Section 10) are + usually protected against "world". Therefore, the install procedure + must either run as root in order to give the Kermit binary the + required permissions, group, and/or owner, or else the dialout devices + and associated directories must be open for group or world reading and + writing. Otherwise, the Kermit program just installed WILL NOT WORK + for dialing out. + + Thus, a well-crafted installation procedure should present the options + and allow the installer to choose the method, if any, for regulating + access to the dialout devices: + + a. Check the permissions of the lockfile directory and the dialout + devices. If they do not allow group or world R/W access, then: + b. "Your UUCP lockfile directory and/or dialout devices require + privilege to access. You must either change their permissions or + install Kermit with privileges." + c. "If you wish to install Kermit with privileges, it will be given + the same owner, group, and permissions as the cu program so it can + use the dialout devices." + d. If they choose (c) but the user is not root, give a message that + the install procedure can be run only by root and then quit. + + It should go without saying, of course, that any binaries that are to + be included in an install package should be built fresh on the exact + platform (e.g. Red Hat 8.0 on Intel) for which the package is + targeted; prebuilt binaries ([52]next section) from other sites are + likely to have library mismatches. [53]CLICK HERE for more about + building C-Kermit install packages. + + The Kermit Project does not have the resources or the expertise to + make install packages for every platform. Most install packages, + therefore, are contributed by others, and they do not necessarily + follow the guidelines given above. Pay attention to what they do. + + If you are an end user who has obtained a C-Kermit install package for + a particular platform, you should be aware that some additional steps + might needed if you want to use Kermit to dial out. Read [54]Section + 10 for details. + __________________________________________________________________________ + +3. INSTALLING PREBUILT BINARIES + + [ [55]Top ] [ [56]Contents ] [ [57]Next ] [ [58]Previous ] + + Hundreds of prebuilt C-Kermit binaries are available on the CDROM in + the BINARY tree [NOTE: The C-Kermit CDROM is still for version 7.0], + and at our ftp site in the [59]kermit/bin area (with names starting + with "ck"), also accessible on the [60]C-Kermit website. To install a + prebuilt binary: + + a. Rename the binary to "wermit". + b. Make sure it works; some tests are suggested in [61]Section 7. + c. Follow steps (b) through (e) in [62]Section 4. + d. Install related files as described in [63]Section 5. + + But first... Please heed the following cautions: + + a. If you pick the wrong binary, it won't work (or worse). + b. Even when you pick the appropriate binary, it still might not work + due to shared-library mismatches, etc. (see [64]Section 4.0). + c. Don't expect a binary built on or for version n of your OS to work + on version n - x (where x > 0). However, it is usually safe to run + a binary built on (or for) an older OS release on a newer one. + + Therefore, it is better to build your own binary from source code + ([65]next section) if you can. But since it is increasingly for Unix + systems (not to mention VMS and other OS's) to be delivered without C + compilers, it is often impractical. In such cases, try the most + appropriate prebuilt binary or binaries, and if none of them work, + [66]contact us and we'll see what we can do to help. + __________________________________________________________________________ + +4. BUILDING FROM SOURCE CODE + + [ [67]Top ] [ [68]Contents ] [ [69]Next ] [ [70]Previous ] + + Also see: [71]Section 8 and [72]Section 9. + + C-Kermit is designed to be built and used on as many platforms as + possible: Unix and non-Unix, old and new (and ancient), ANSI C and + K&R. The Unix version does not use or depend on any external tools for + building except the "make" utility, the C compiler, and the linker. It + does not use any automated configuration tools such as configure, + autoconf, automake, libtool, etc. Everything in C-Kermit has been + built by hand based on direct experience or reports or contributions + from users of each platform. + + The [73]C-Kermit makefile contains the rules for building the program + for each of the hundreds of different kinds of Unix systems that + C-Kermit attempts to support. It covers all Unix variations since + about 1980 -- pretty much everything after Unix V6. Separate makefiles + are used for [74]Plan 9 and [75]2.x BSD. + + Prerequisites: + + * The C compiler, linker, and make program must be installed. + * The C libraries and header files must be installed (*). + * The C-Kermit source code and makefile in your current directory. + * The C-Kermit text files ([76]Section 5) in your current directory. + + * This is becoming problematic in this new age of "selective + installs" e.g. of Linux packages. C-Kermit builds will often fail + because replying "no" to some obscure Linux installation option + will result in missing libraries or header files. Ditto on + platforms like AIX and Solaris that don't come with C compilers, + and then later have gcc installed, but are still missing crucial + libraries, like libm (math). + + Plus: + + * For TCP/IP networking support, the sockets library and related + header files must be installed. + * The math library for floating-point arithmetic support (can be + deselected by adding -DNOFLOAT to CFLAGS and removing -lm from + LIBS). + * Many and varied security libraries for building a secure version + (Kerberos, SSL/TLS, SRP, Zlib,...) These are required only if you + select a secure target. + * For the curses-based fullscreen file-ransfer display, the curses + or ncurses header file(s) and library, and probably also the + termcap and/or termlib library. Note that the names and locations + of these files and libraries are likely to change capriciously + with every new release of your Unix product. If you discover that + the C-Kermit build procedure fails because your curses and/or + termxxx headers or libraries are not named or located as expected, + please [77]let us know. In the meantime, work around by installing + symlinks. + * IMPORTANT: Modern Linux distributions might give you the choice + during installation of whether to install the "ncurses development + package" (perhaps called "ncurses-devel"). If you did not install + it, you won't be able to build C-Kermit with curses support + included. In this case, either go back and install ncurses, or + else choose (or create) a non-curses makefile target for your + platform. To install the ncurses developers tools in Red Hat + Linux, do: + +mount redhat cdrom +goto RedHat/RPMS +rpm -ivh ncurses-devel*.rpm +or to have the exact name ls ncurse* and load as +rpm -ivh filename +then leave the cdrom and unmount it. + + * In AIX you might have to go back and install any or all of: + +bos.adt.base +bos.adt.include +bos.adt.lib +bos.adt.libm +bos.adt.utils + + from the first installation CD. + + The makefile might need to be renamed from ckuker.mak to makefile. + Directions: + + a. Type "make xxx" where xxx is the name of the makefile target most + appropriate to your platform, e.g. "make linux", "make aix43", + etc. Read the [78]comments at the top of the makefile for a + complete list of available targets (it's a long list). + b. Test the resulting 'wermit' file (see [79]Section 7 for + suggestions). If it's OK, proceed; otherwise [80]notify us. + + NOTE: steps (c) through (e) can be accomplished using the + [81]makefile 'install' target as described in [82]Section 5.4. + c. Rename the 'wermit' file to 'kermit', copy it to the desired + binary directory (such as /usr/local/bin or /opt/something), and + if it is to be used for dialing out, give it the same owner, + group, and permissions as the 'cu' program (IMPORTANT: read + [83]Sections 10 and [84]11 for details). + d. Install the man page, ckuker.nr, with your other man pages. + e. Install the accompanying text files (see [85]Section 5). + f. If you want C-Kermit to also offer a Telnet command-line + personality, make a symbolic link as follows: + +cd directory-where-kermit-binary-is +ln -s kermit telnet + + If you want C-Kermit to be the default Telnet client, make sure + the directory in which you created the symlink is in the PATH + ahead of the where the regular Telnet client is. + g. If you want C-Kermit to also offer an FTP command-line + personality, make a symlink called "ftp" as in (f). + h. If you want C-Kermit to also offer an FTTP command-line + personality, make a symlink called "http" as in (f). + i. If you want to offer an Internet Kermit Service, follow the + directions in the [86]IKSD Administrator's Guide. + ________________________________________________________________________ + + 4.0. Special Considerations for C-Kermit 8.0 + + [ [87]Top ] [ [88]Contents ] [ [89]Next ] + + Also see: [90]C-Kermit Configuration Options + + SECTION CONTENTS + +4.1. [91]The Unix Makefile +4.2. [92]The C-Kermit Initialization File +4.3. [93]The 2.x BSD Makefile +4.4. [94]The Plan 9 Makefile +4.5. [95]Makefile Failures + + (Also see the [96]Configurations Options document, [97]Section 8). + + Lots of new features have been added in versions 7.0 and 8.0 that + require access to new symbols, APIs, libraries, etc, and this will no + doubt cause problems in compiling, linking, or execution on platforms + where 6.0 and earlier built without incident. This section contains + what we know as of the date of this file. + + The first category concerns the new Kermit Service Daemon (IKSD; see + the [98]IKSD Administrator's Guide for details): + + The wtmp File + When C-Kermit is started as an IKSD (under inetd), it makes + syslog and wtmp entries, and also keeps its own ftpd-like log. + The code assumes the wtmp log is /var/log/wtmp on Linux and + /usr/adm/wtmp elsewhere. No doubt this assumption will need + adjustment. Use -DWTMPFILE=path to override at compile time + (there is also a runtime override). See [99]iksd.html for + details. + + UTMP, utsname(), etc + C-Kermit 7.0 gets as much info as it can about its job -- + mainly for IKSD logging -- from utmp. But of course utmp + formats and fields differ, and for that matter, there can be + two different header files, and . Look for + HAVEUTMPX and HAVEUTHOST in [100]ckufio.c and let me know of + any needed adjustments. + + Password lookup + IKSD needs to authenticate incoming users against the password + list. In some cases, this requires the addition of -lcrypt + (e.g. in Unixware 2.x). In most others, the crypt functions are + in the regular C library. If you get "crypt" as an unresolved + symbol at link time, add -lcrypt to LIBS. If your site has + local replacement libraries for authentication, you might need + a special LIBS clause such as "LIBS=-L/usr/local/lib -lpwent". + + These days most Unix systems take advantage of shadow password + files or Plugable Authentication Modules (PAM). If your system + uses shadow passwords you must add -DCK_SHADOW to the CFLAGS + list. If your system requires PAM you must add -DCK_PAM to the + CFLAGS and -lpam -ldl to LIBS. + + getusershell() + This is called by the IKSD at login time to see if a user has + been "turned off". But many Unix platforms lack this function. + In that case, you will get unresolved symbol reports at link + time for _getusershell, _endusershell; to work around, add + -DNOGETUSERSHELL. + + initgroups() + This is called by IKSD after successful authentication. But + some platforms do not have this function, so obviously it can't + be called there, in which case add -DNOINITGROUPS. + + setreuid(), setreuid(), setregid() not found or "deprecated" + Find out what your Unix variety wants you to use instead, and + make appropriate substitutions in routine zvpass(), module + [101]ckufio.c, and [102]let us know. + + printf() + IKSD installs a printf() substitute to allow redirection of + printf-like output to the connection. However, this can + conflict with some curses libraries. In this case, separate + binaries must be built for IKSD and non-IKSD use. + + If you encounter difficulties with any of the above, and you are not + interested in running C-Kermit as an IKSD, then simply add NOIKSD to + CFLAGS and rebuild. Example: + +make sco286 +(get lots of errors) +make clean +make sco286 "KFLAGS=-DNOIKSD" + + Some non-IKSD things to watch out for: + + Return type of main() + The main() routine is in [103]ckcmai.c. If you get complaints + about "main: return type is not blah", define MAINTYPE on the + CC command line, e.g.: + +make xxx "KFLAGS=-DMAINTYPE=blah + + (where blah is int, long, or whatever). If the complaint is + "Attempt to return a value from a function of type void" then + add -DMAINISVOID: + +make xxx "KFLAGS=-DMAINISVOID=blah + + DNS Service Records + This feature allows a remote host to redirect C-Kermit to the + appropriate socket for the requested service; e.g. if C-Kermit + requests service "telnet" and the host offers Telnet service on + port 999 rather than the customary port 23. If you get + compile-time complaints about not being able to find + , , or , add -DNO_DNS_SRV to + CFLAGS. If you get link-time complaints about unresolved + symbols res_search or dn_expand, try adding -lresolve to LIBS. + + \v(ipaddress) + If "echo \v(ipaddress)" shows an empty string rather than your + local IP address, add -DCKGHNLHOST to CFLAGS and rebuild. + + + If this file can't be found at compile time, add -DNOREDIRECT + to CFLAGS. This disables the REDIRECT and PIPE commands and + anything else that needs the wait() system service. + + syslog() + C-Kermit can now write syslog records. Some older platforms + might not have the syslog facility. In that case, add + -DNOSYSLOG. Others might have it, but require addition of + -lsocket to LIBS (SCO OSR5 is an example). See [104]Section 15. + + putenv() + If "_putenv" comes up as an undefined symbol, add -DNOPUTENV to + CFLAGS and rebuild. + + "Passing arg1 of 'time' from incompatible pointer" + This is a mess. See the mass of #ifdefs in the appropriate + module, [105]ckutio.c or [106]ckufio.c. + + gettimeofday() + Wrong number of arguments. On most platforms, gettimeofday() + takes two arguments, but on a handful of others (e.g. Motorola + System V/88 V4, SNI Reliant UNIX 5.43, etc) it takes one. If + your version of gettimeofday() is being called with two args + but wants one, add -DGTODONEARG. + + "Assignment makes pointer from integer without a cast" + This warning might appear in [107]ckutio.c or [108]ckufio.c. + (or elsewhere), and usually can be traced to the use of a + system or library function that returns a pointer but that is + not declared in the system header files even though it should + be. Several functions are commonly associated with this error: + + + getcwd(): Add -DDCLGETCWD to CFLAGS and rebuild. + + popen() : Add -DDCLPOPEN to CFLAGS and rebuild. + + fdopen(): Add -DDCLFDOPEN to CFLAGS and rebuild. + + "Operands of = have incompatible types" + "Incompatible types in assignment" + If this comes from [109]ckcnet.c and comes from a statement + involving inet_addr(), try adding -DINADDRX to CFLAGS. If that + doesn't help, then try adding -DNOMHHOST. + + Complaints about args to get/setsockopt(), getpeername(), + getsockname() + These are all in [110]ckcnet.c. Different platforms and OS's + and versions of the same OS change this all the time: int, + size_t, unsigned long, etc. All the affected variables are + declared according to #ifdefs within ckcnet.c, so find the + declarations and adjust the #ifdefs accordingly. + + size_t + In case of complaints about "unknown type size_t", add + -DSIZE_T=int (or other appropriate type) to CFLAGS. + + 'tz' undefined + Use of undefined enum/struct/union 'timezone' + Left of 'tv_sec' specifies undefined struct/union 'timeval' And + similar complaints in [111]ckutio.c: Add -DNOGFTIMER and/or + -DNOTIMEVAL. + + Symlinks + The new built-in DIRECTORY command should show symlinks like + "ls -l" does. If it does not, check to see if your platform has + the lstat() and readlink() functions. If so, add -DUSE_LSTAT + and -DCKSYMLINK to CFLAGS and rebuild. On the other hand, if + lstat() is unresolved at link time, add -DNOLSTAT to CFLAGS. If + readlink() is also unresolved, add -DNOSYMLINK. + + realpath() + Link-time complains about realpath() -- find the library in + which it resides and add it to LIBS (example for Unixware 7.1: + "-lcudk70") or add -DNOREALPATH to CFLAGS and rebuild. If built + with realpath() but debug log file is truncated or mangled, + ditto (some realpath() implementations behave differently from + others). If built with realpath() and seemingly random core + dumps occur during file path resolution, ditto. + + Failure to locate header file + Usually happens on Linux systems that have the C compiler + installed, but not the ncurses package (see comments about + selective installs above). Go back and install ncurses, or use + "make linuxnc" (Linux No Curses). + + "Can't find shared library libc.so.2.1" + "Can't find shared library libncurses.so.3.0", etc... + You are trying to run a binary that was built on a computer + that has different library versions than your computer, and + your computer's loader is picky about library version numbers. + Rebuild from source on your computer. + + Time (struct tm) related difficulties: + Errors like the following: + +"ckutio.c", line 11994: incomplete struct/union/enum tm: _tm +"ckutio.c", line 11995: error: cannot dereference non-pointer type +"ckutio.c", line 11995: error: assignment type mismatch +"ckutio.c", line 11997: warning: using out of scope declaration: localtime +"ckutio.c", line 11997: error: unknown operand size: op "=" +"ckutio.c", line 11997: error: assignment type mismatch +"ckutio.c", line 11998: error: undefined struct/union member: tm_year +"ckutio.c", line 12000: error: undefined struct/union member: tm_mon +"ckutio.c", line 12001: error: undefined struct/union member: tm_mday +"ckutio.c", line 12002: error: undefined struct/union member: tm_hour +"ckutio.c", line 12003: error: undefined struct/union member: tm_min +"ckutio.c", line 12004: error: undefined struct/union member: tm_sec + + are due to failure to include the appropriate time.h header + files. Unix platforms generally have one or more of the + following: , , and . Any + combination of these might be required. Defaults are set up for + each makefile target. The defaults can be corrected on the CC + command line by adding the appropriate definition from the + following list to CFLAGS: + +-DTIMEH Include +-DNOTIMEH Don't include +-DSYSTIMEH Include +-DNOSYSTIMEH Don't include +-DSYSTIMEBH Include +-DNOSYSTIMEBH Don't include + + Note that is relatively scarce in the System V + and POSIX environments; the only platform of recent vintage + where it was/is used is OSF/1 and its derivatives (Digital Unix + and Tru64 Unix). + + Struct timeval and/or timezone not declared: + In some cases, merely including the appropriate time.h header + files is still not enough. POSIX.1 does not define the timeval + struct, and so the items we need from the header are protected + against us by #ifndef _POSIX_SOURCE or somesuch. In this case, + we have to declare the timeval (and timezone) structs + ourselves. To force this, include -DDCLTIMEVAL in CFLAGS. + + Warnings about dn_expand() Argument #4 + WARNING: argument is incompatible with prototyp. It's the old + char versus unsigned char stupidity again. Try to find a + compiler switch like GCC's "-funsigned-char". Failing that, add + -DCKQUERYTYPE=xxx to CFLAGS, where xxx is whatever 'man + dn_expand' tells you the type of the 4th argument should be + (presumably either char or unsigned char; in the latter case + use CHAR to avoid confusion caused by multiple words. + + Switch Table Overflow (in [112]ckcuni.c) + Add -DNOUNICODE to CFLAGS. + + Compile-time warnings about ck_out() or tgetstr() or tputs(): + Easy solution: Add -DNOTERMCAP to CFLAGS. But then you lose the + SCREEN function. Real solution: Try all different combinations + of the following CFLAGS: + +-DTPUTSARGTYPE=char -DTPUTSFNTYPE=int +-DTPUTSARGTYPE=int -DTPUTSFNTYPE=void + + Until the warnings go away, except maybe "ck_outc: return with + a value in a function returning void", and in that case also + add -DTPUTSISVOID. + + "Passing arg 1 of to tputs() makes pointer from integer without a + cast": + Add -DTPUTSARG1CONST to CFLAGS. + + "Undefined symbol: dup2" + Add -DNOZEXEC to CFLAGS. + + "header file 'termcap.h' not found" + Add -DNOHTERMCAP to CFLAGS. + + Other difficulties are generally of the "where is curses.h and what is + it called this week?" variety (most easily solved by making symlinks + in the include and lib directories), or overzealous complaints + regarding type mismatches in function calls because of the totally + needless and silly signed versus unsigned char conflict (*), etc. In + any case, please send any compilation or linking warnings or errors to + the author, preferably along with fixes. + + * C-Kermit does not use the signed property of chars at all + anywhere, ever. So if all chars and char *'s can be made unsigned + at compile time, as they can in gcc with "-funsigned-char", they + should be. + + IMPORTANT: If you find any of these hints necessary for a particular + make target (or you hit upon others not listed here), PLEASE SEND A + REPORT TO: + +[113]kermit-support@columbia.edu + ________________________________________________________________________ + + 4.1. The Unix Makefile + + [ [114]Top ] [ [115]Contents ] [ [116]Section Contents ] [ [117]Next ] + [ [118]Previous ] + + If your distribution does not contain a file with the name "makefile" + or "Makefile", then rename the file called ckuker.mak to makefile: + +mv ckuker.mak makefile + + Then type "make xxx", where xxx is the platform you want to build + C-Kermit for. These are listed in the [119]comments at the top of the + makefile. For example, to build C-Kermit for Linux, type: + +make linux + + Here are some typical examples: + + Target Description + linux Linux, any version on any hardware platform + openbsd OpenBSD, any version on any hardware platform + aix43 AIX 4.3 + aix43g AIX 4.3, built with gcc + solaris9 Solaris 9 + solaris9g Solaris 9 built with gcc + hpux1100 HP-UX 11-point-anything + + The makefile is quite long, and at least two versions of Unix, SCO + Xenix/286 and 2.x BSD, cannot cope with its length. An attempt to + "make sco286" gives the message "Make: Cannot alloc mem for env.. + Stop". Solution: edit away some or all of the nonrelevant material + from the makefile. (A separate version of the makefile is provided for + BSD 2.x: ckubs2.mak but C-Kermit 8.0 can't be built for BSD 2.x -- it + has simply grown too large.) + + Some make programs reportedly cannot handle continued lines (lines + ending in backslash (\)). If you have a problem with the makefile, try + editing the makefile to join the continued lines (remove the + backslashes and the following linefeed). + + Other makefile troubles may occur because tabs in the makefile have + somehow been converted to spaces. Spaces and tabs are distinct in Unix + makefiles. + + Similarly, carriage returns might have been added to the end of each + line, which also proves confusing to most Unix versions of make. + + Check to see if there are comments about your particular version in + its makefile target itself. In a text editor such as EMACS or VI, + search for the make entry name followed by a colon, e.g. "linux:" (if + you really are building C-Kermit for Linux, do this now). + + Check to see if there are comments about your particular version in + the [120]ckubwr.txt file ([121]CLICK HERE for the Web version). + + If you have trouble with building [122]ckwart.c, or running the + resulting wart preprocessor program on [123]ckcpro.w: + + 1. Just "touch" the [124]ckcpro.c file that comes in the distribution + and then give the "make" command again, or: + 2. Compile ckwart.c "by hand": cc -o wart ckwart.c, or: + 3. Try various other tricks. E.g. one Linux user reported that that + adding the "static" switch to the rule for building wart fixed + everything: + +wart: ckwart.$(EXT) + $(CC) -static -o wart ckwart.$(EXT) $(LIBS) + + If your compiler supports a compile-time option to treat ALL chars + (and char *'s, etc) as unsigned, by all means use it -- and send me + email to let me know what it is (I already know about gcc + -funsigned-char). + + To add compilation options (which are explained later in this + document) to your makefile target without editing the makefile, + include "KFLAGS=..." on the make command line, for example: + +make linux KFLAGS=-DNODEBUG +make bsd "KFLAGS=-DKANJI -DNODEBUG -DNOTLOG -DDYNAMIC -UTCPSOCKET" + + Multiple options must be separated by spaces. Quotes are necessary if + the KFLAGS= clause includes spaces. The KFLAGS are added to the end of + the CFLAGS that are defined in the selected makefile target. For + example, the "bsd" entry includes -DBSD4 -DTCPSOCKET, so the second + example above compiles Kermit with the following options: + +-DBSD4 -DTCPSOCKET -DKANJI -DNODEBUG -DNOTLOG -DDYNAMIC -UTCPSOCKET + + (Notice how "-UTCPSOCKET" is used to negate the effect of the + "-DTCPSOCKET" option that is included in the makefile target.) + + WARNING: Be careful with KFLAGS. If you build C-Kermit, change some + files, and then run make again using the same make entry but + specifying different KFLAGS than last time, make won't detect it and + you could easily wind up with inconsistent object modules, e.g. some + of them built with a certain option, others not. When in doubt, "make + clean" first to make sure all your object files are consistent. + Similarly, if you change CFLAGS, LIBS, or any other items in the + makefile, or you rebuild using a different makefile target, "make + clean" first. + + If you create a new makefile target, use static linking if possible. + Even though this makes your C-Kermit binary bigger, the resulting + binary will be more portable. Dynamically linked binaries tend to run + only on the exact configuration and version where they were built; on + others, invocation tends to fail with a message like: + +Can't find shared library "libc.so.2.1" + ________________________________________________________________________ + + 4.2. The C-Kermit Initialization File + + [ [125]Top ] [ [126]Contents ] [ [127]Section Contents ] [ [128]Next ] + [ [129]Previous ] + + (This section is obsolete.) Read [130]Section 5 about the + initialization file. + ________________________________________________________________________ + + 4.3. The 2.x BSD Makefile + + [ [131]Top ] [ [132]Contents ] [ [133]Section Contents ] [ [134]Next ] + [ [135]Previous ] + + This section is obsolete. C-Kermit 6.0 was the last release that + could be built on PDP-11 based BSD versions. + ________________________________________________________________________ + + 4.4. The Plan 9 Makefile + + [ [136]Top ] [ [137]Contents ] [ [138]Section Contents ] [ [139]Next ] + [ [140]Previous ] + + Use the separate makefile [141]ckpker.mk. NOTE: The Plan 9 version of + C-Kermit 8.0 has not yet been built. There should be no impediment to + building it. However, even when built successfully, certain key + features are missing, notably TCP/IP networking. + ________________________________________________________________________ + + 4.5. Makefile Failures + + [ [142]Top ] [ [143]Contents ] [ [144]Section Contents ] [ + [145]Previous ] + + First, be sure the source files are stored on your current disk and + directory with the right names (in lowercase). Second, make sure that + the makefile itself does not contain any lines with leading spaces: + indented lines must all start with horizontal TAB, and no spaces. + + Then make sure that your Unix PATH is defined to find the appropriate + compiler for your makefile target. For example, on SunOS systems, + "make sunos41" builds C-Kermit for the BSD environment, and assumes + that /usr/ucb/cc will be used for compilation and linking. If your + PATH has /usr/5bin ahead of /usr/ucb, you can have problems at compile + or link time (a commonly reported symptom is the inability to find + "ftime" during linking). Fix such problems by redefining your Unix + PATH, or by specifying the appropriate "cc" in CC= and CC2= statements + in your makefile target. + + During edits 166-167, considerable effort went into making C-Kermit + compilable by ANSI C compilers. This includes prototyping all of + C-Kermit's functions, and including the ANSI-defined system header + files for system and library functions, as defined in K&R, second + edition: , , (except in NeXTSTEP this + is ), and . If you get warnings about any of + these header files not being found, or about argument mismatches + involving pid_t, uid_t, or gid_t, look in ckcdeb.h and make + amendments. C-Kermit assumes it is being compiled by an ANSI-compliant + C compiler if __STDC__ is defined, normally defined by the compiler + itself. You can force ANSI compilation without defining __STDC__ + (which some compilers won't let you define) by including -DCK_ANSIC on + the cc command line. + + On the other hand, if your compiler defines __STDC__ but still + complains about the syntax of Kermit's function prototypes, you can + disable the ANSI-style function prototyping by including -DNOANSI on + the command line. + + For SCO OpenServer, UNIX, ODT, and XENIX compilations, be sure to pick + the most appropriate [146]makefile target, and be sure you have + installed an SCO development system that is keyed to your exact SCO + operating system release, down to the minor version (like 2.3.1). + + Also note that SCO distributes some of its libraries in encrypted + form, and they must be decrypted before C-Kermit can be linked with + them. If not, you might see a message like: + +ld: file /usr/lib/libsocket.a is of unknown type: magic number = 6365 + + To decrypt, you must supply a key (password) that came with your + license. Call SCO for further info. + + If your compiler uses something other than int for the pid (process + id) data type, put -DPID_T=pid_t or whatever in your CFLAGS. + + If you get complaints about unknown data types uid_t and gid_t, put + -DUID_T=xxx -DGID_T=yyy in your CFLAGS, where xxx and yyy are the + appropriate types. + + If your compilation fails because of conflicting or duplicate + declarations for sys_errlist, add -DUSE_STRERROR or -DNDSYSERRLIST to + CFLAGS. + + If your compilation dies because getpwnam() is being redeclared (or + because of "conflicting types for getwpnam"), add -DNDGPWNAM to your + CFLAGS. If that doesn't work, then add -DDCGPWNAM to your CFLAGS (see + ckufio.c around line 440). + + If the compiler complains about the declaration of getpwnam() during + an ANSI C compilation, remove the declaration from ckufio.c or change + the argument in the prototype from (char *) to (const char *). + + If you get complaints that getpwuid() is being called with an improper + type, put -DPWID_T=xx in your CFLAGS. + + If you get compile-time warnings that t_brkc or t_eofc (tchars + structure members, used in BSD-based versions) are undefined, or + structure-member- related warnings that might be traced to this fact, + add -DNOBRKC to CFLAGS. + + If you get a linker message to the effect that _setreuid or _setregid + is not defined, add -DNOSETREU to CFLAGS, or add -DCKTYP_H=blah to + CFLAGS to make C-Kermit read the right -kind-of-file to pick + up these definitions. + + If you get a message that _popen is undefined, add -DNOPOPEN to + CFLAGS. + + If you get a complaint at compile time about an illegal + pointer-integer combination in ckufio.c involving popen(), or at link + time that _popen is an undefined symbol, add the declaration "FILE + *popen();" to the function zxcmd() in ckufio.c (this declaration is + supposed to be in ). If making this change does not help, + then apparently your Unix does not have the popen() function, so you + should add -DNOPOPEN to your make entry, in which case certain + functions involving "file" i/o to the standard input and output of + subprocesses will not be available. + + If your linker complains that _getcwd is undefined, you can add a + getcwd() function to ckufio.c, or add it to your libc.a library using + ar: + +#include + +char * +getcwd(buf,size) char *buf; int size; { +#ifndef NOPOPEN +#ifdef DCLPOPEN + FILE *popen(); +#endif + FILE *pfp; + + if (!buf) return(NULL); + if (!(pfp = popen("pwd","r"))) return(NULL); + fgets(buf,size-2,pfp); + pclose(pfp); + buf[strlen(buf)-1] = '\0'; + return((char *)buf); +#else + buf[0] = '\0'; + return(NULL); +#endif /* NOPOPEN */ +} + +#ifdef NOPOPEN +FILE *popen(s,t) char *s,*t; { + return(NULL); +} +#endif /* NOPOPEN */ + + If you get complaints about NPROC having an invalid value, add a valid + definition for it (depends on your system), as in the cray entry. + + If you get some symbol that's multiply defined, it probably means that + a variable name used by Kermit is also used in one of your system + libraries that Kermit is linked with. For example, under PC/IX some + library has a variable or function called "data", and the variable + "data" is also used extensively by Kermit. Rather than edit the Kermit + source files, just put a -D in the make entry CFLAGS to change the + Kermit symbol at compile time. In this example, it might be + -Ddata=xdata. + + Some symbol is defined in your system's header files, but it produces + conflicts with, or undesired results from, Kermit. Try undefining the + symbol in the makefile target's CFLAGS, for example -UFIONREAD. + + Some well-known symbol is missing from your system header files. Try + defining in the makefile target's CFLAGS, for example -DFREAD=1. + + You get many warnings about pointer mismatches. This probably means + that Kermit is assuming an int type for signal() when it should be + void, or vice-versa. Try adding -DSIG_I (for integer signal()) or + -DSIG_V (for void) to CFLAGS. Or just include KFLAGS=-DSIG_V (or + whatever) in your "make" command, for example: + +make bsd KFLAGS=-DSIG_V + + You get many messages about variables that are declared and/or set but + never used. It is difficult to avoid these because of all the + conditional compilation in the program. Ignore these messages. + + Some of C-Kermit's modules are so large, or contain so many character + string constants, or are so offensive in some other way, that some C + compilers give up and refuse to compile them. This is usually because + the -O (optimize) option is included in the make entry. If this + happens to you, you can (a) remove the -O option from the make entry, + which will turn off the optimizer for ALL modules; or (b) compile the + offending module(s) by hand, including all the switches from make + entry except for -O, and then give the appropriate "make" command + again; or (c) increase the value of the -Olimit option, if your + compiler supports this option; or (d) change the [147]makefile target + to first compile each offending module explicitly without + optimization, then compile the others normally (with optimization), + for example: + +#Fortune 32:16, For:Pro 2.1 (mostly like 4.1bsd) +ft21: + @echo 'Making C-Kermit $(CKVER) for Fortune 32:16 For:Pro 2.1...' + $(MAKE) ckuusx.$(EXT) "CFLAGS= -DNODEBUG -DBSD4 -DFT21 -DNOFILEH \ + -SYM 800 \ -DDYNAMIC -DNOSETBUF -DCK_CURSES $(KFLAGS) -DPID_T=short" + $(MAKE) ckuxla.$(EXT) "CFLAGS= -DNODEBUG -DBSD4 -DFT21 -DNOFILEH \ + -SYM 800 \ -DDYNAMIC -DNOSETBUF -DCK_CURSES $(KFLAGS) -DPID_T=short" + $(MAKE) ckudia.$(EXT) "CFLAGS= -DNODEBUG -DBSD4 -DFT21 -DNOFILEH \ + -SYM 800 \ -DDYNAMIC -DNOSETBUF -DCK_CURSES $(KFLAGS) -DPID_T=short" + $(MAKE) wermit "CFLAGS= -O -DNODEBUG -DBSD4 -DFT21 -DNOFILEH -SYM 800 \ + -DDYNAMIC -DNOSETBUF -DCK_CURSES $(KFLAGS) -DPID_T=short" \ + "LNKFLAGS= -n -s" "LIBS= -lcurses -ltermcap -lv -lnet" + + As an extreme example, some compilers (e.g. gcc on the DG AViiON) have + been known to dump core when trying to compile ckwart.c with + optimization. So just do this one "by hand": + +cc -o wart ckwart.c + + or: + +touch ckcpro.c + + and then give the "make" command again. + + Speaking of wart, it is unavoidable that some picky compilers might + generate "statement unreachable" messages when compiling ckcpro.c. + Unreachable statements can be generated by the wart program, which + generates ckcpro.c automatically from [148]ckcpro.w, which translates + lex-like state/input constructions into a big switch/case + construction. + + Some function in Kermit wreaks havoc when it is called. Change all + invocations of the function into a macro that evaluates to the + appropriate return code that would have been returned by the function + had it been called and failed, for example: -Dzkself()=0. Obviously + not a good idea if the function is really needed. + + If you have just installed SunOS 4.1.2 or 4.1.3, you might find that + C-Kermit (and any other C program) fails to link because of unresolved + references from within libc. This is because of a mistake in Sun's + /usr/lib/shlib.etc files for building the new libc. Change the libc + Makefile so that the "ld" lines have "-ldl" at the end. Change the + README file to say "mv xccs.multibyte. xccs.multibyte.o" and follow + that instruction. + __________________________________________________________________________ + +5. INSTALLING THE KERMIT FILES + + [ [149]Top ] [ [150]Contents ] [ [151]Next ] [ [152]Previous ] + + SECTION CONTENTS + +5.1. [153]The C-Kermit Initialization File +5.2. [154]Text Files +5.3. [155]Installing the Kermit Files +5.4. [156]The Makefile Install Target + + The C-Kermit executable does not need any external files to run. + Unlike, say, the cu program, which on most platforms is useless unless + you (as root) edit the /usr/spool/uucp/Systems and + /usr/spool/uucp/Devices files to supply whatever obscure and + undocumented syntax is required to match some supposedly user-friendly + mnemonic to the real pathname of whatever device you want to use, + Kermit runs on its own without needing any external configuration + files, and lets you refer to device (and network hosts and services) + by their own natural undisguised names. + + Nevertheless, a number of external files can be installed along with + the C-Kermit executable if you wish. These include configuration and + customization files that are read by Kermit as well as documentation + files to be read by people. All of this material is (a) optional, and + (b) available on the Kermit website: + +[157]http://www.columbia.edu/kermit/ + + and usually in a more pleasant form, perhaps also with updated + content. So if your computer is on the Internet, there is no need to + install anything but the Kermit executable if users know how to find + the Kermit website (and if they don't, Kermit's "help" command tells + them). + + 5.1. The C-Kermit Initialization File + + In C-Kermit 7.0 and earlier, the standard initialization file was a + key C-Kermit component because: + + a. It "loaded" the dialing and network directories. + b. It defined all the macros and variables for the services + directory. + c. It defined macros for quickly changing Kermit's file-transfer + performance tuning. + + The standard initialization file is quite long (more than 600 lines) + and requires noticeable processing time (the slower the computer, the + more noticeable), yet few people actually use the services directory, + whose definition takes up most of its bulk. Meanwhile, in C-Kermit + 8.0, many of the remaining functions of the standard initialization + file are now built in; for example, the FAST, CAUTIOUS, and ROBUST + commands. + + More to the point, many of the settings that could be made only in the + initialization and customization files can now be picked up from + environment variables. The first group identifies initialization and + directory files: + + CKERMIT_INI + The path of your Kermit initialization file, if any. This + overrides the built-in search for $HOME/.kermrc. + + K_CHARSET + The character set used for encoding local text files. + Equivalent to SET FILE CHARACTER-SET. + + K_DIAL_DIRECTORY + The full pathname of one or more Kermit dialing directory + files. Equivalent to SET DIAL DIRECTORY. + + K_NET_DIRECTORY + The full pathname of one or more Kermit network directory + files. Equivalent to SET NETWORK DIRECTORY. + + K_INFO_DIRECTORY + K_INFO_DIR + The full pathname of a directory containing Kermit (if any) + containing ckubwr.txt and other Kermit text files. Overrides + Kermit's built-in search for this directory. + + The next group is related to dialing modems: + + K_COUNTRYCODE + The telephonic numeric country code for this location, e.g. 1 + for North America or 39 for Italy. It is recommended that this + one be set for all users, system-wide. Not only is it used to + process portable-format dialing directory entries, but it is + also compared against Kermit's built-in list of "tone + countries" to see if tone dialing can be used. Equivalent to + Kermit's SET DIAL COUNTRY-CODE command. + + K_AREACODE + The telephonic numeric area code for this location, e.g. 212 + for Manhattan, New York, USA. Recommend this one also be set + system-wide, so shared portable-format dialing directories will + work automatically for everybody. Equivalent to Kermit's SET + DIAL AREA-CODE command. + + K_DIAL_METHOD + TONE or PULSE. Equivalent to Kermit's SET DIAL METHOD command. + If a dial method is not set explicitly (or implicitly from the + country code), Kermit does not specify a dialing method, and + uses the modem's default method, which tends to be pulse. + + K_INTL_PREFIX + The telephonic numeric international dialing prefix for this + location. Equivalent to Kermit's SET DIAL INTL-PREFIX command. + + K_LD_PREFIX + The telephonic numeric long-distance dialing prefix for this + location. Equivalent to Kermit's SET DIAL LD-PREFIX command. + + K_PBX_ICP + The telephonic numeric PBX internal call prefix for this + location. Equivalent to Kermit's SET DIAL PBX-INSIDE-PREFIX + command. + + K_PBX_OCP + The telephonic numeric PBX external call prefix for this + location. Equivalent to Kermit's SET DIAL PBX-OUTSIDE-PREFIX + command. + + K_PBX_XCH + The telephonic numeric PBX exchange (first part of the + subscriber number). Equivalent to Kermit's SET DIAL + PBX-EXCHANGE command. + + K_TF_AREACODE + A list of one or more telephonic numeric toll-free area codes. + + K_TF_PREFIX + The telephonic numeric toll-free dialing prefix, in case it is + different from the long-distance prefix. Equivalent to Kermit's + SET DIAL TF-PREFIX command. + + The final group includes well-known environment variables that are + also used by Kermit: + + CDPATH + Where the CD command should look for relative directory names. + + SHELL + The path of your Unix shell. Used by the RUN (!) command to + choose the shell to execute its arguments. + + USER + Your Unix username. + + EDITOR + The name or path of your preferred editor (used by the EDIT + command). Equivalent to SET EDITOR. + + BROWSER + The name or path of your preferred web browser (used by the + BROWSE command). Equivalent to Kermit's SET BROWSER command. + + Does this mean the initialization file can be abolished? I think so. + Here's why: + + * Kermit already does everything most people want it to do without + one. + * Important site-specific customizations can be done with global + environment variables. + * There is no longer any need for everybody to have to use the + standard initialization file. + * This means that your initialization file, if you want one, can + contain your own personal settings, definitions, and preferences, + rather than 600 lines of "standard" setups. + * If you still want the services directory, you can either TAKE the + standard initialization file (which must be named anything other + than $HOME/.kermrc to avoid being executed automatically every + time you start Kermit), or you can make it a kerbang script and + execute it "directly" (the [158]makefile install target does this + for you by putting ckermit.ini in the same directory as the Kermit + binary, adding the appropriate Kerbang line to the top, and giving + it execute permission). + + In fact, you can put any number of kerbang scripts in your PATH to + start up C-Kermit in different ways, to have it adopt certain + settings, make particular connections, execute complicated scripts, + whatever you want. + + 5.2. Text Files + + These are entirely optional. Many of them are to be found at the + Kermit website in HTML form (i.e. as Web pages with clickable links, + etc), and very likely also more up to date. Plain-text files that + correspond to Web pages were simply "dumped" by Lynx from the website + to plain ASCII text. The format is whatever Lynx uses for this + purpose. If you wish, you can install them on your computer as + described in the [159]next section. + + [160]COPYING.TXT + Copyright notice, permissions, and disclaimer. + + [161]ckermit.ini + The standard initialization file, intended more for reference + (in most cases) than actual use; see [162]Section 5.1. + + [163]ckermod.ini + A sample customization file. + + [164]ckermit70.txt + Supplement to [165]Using C-Kermit for version 7.0. Available on + the Kermit website as: + [166]http://www.columbia.edu/kermit/ckermit70.html + + [167]ckermit80.txt + Supplement to [168]Using C-Kermit for version 8.0. Available on + the Kermit website as: + [169]http://www.columbia.edu/kermit/ckermit80.html + + [170]ckcbwr.txt + The general C-Kermit hints and tips ("beware") file. Available + on the Kermit website as: + [171]http://www.columbia.edu/kermit/ckcbwr.html + + [172]ckubwr.txt + The Unix-specific C-Kermit hints and tips file. Available on + the Kermit website as: + [173]http://www.columbia.edu/kermit/ckubwr.html + + [174]ckuins.txt + Unix C-Kermit Installation Instructions (this file). Available + on the Kermit website as: + [175]http://www.columbia.edu/kermit/ckuins.html + + [176]ckccfg.txt + C-Kermit compile-time configuration options. Available on the + Kermit website as: + [177]http://www.columbia.edu/kermit/ckccfg.html + + [178]ckcplm.txt + The C-Kermit program logic manual. Available on the Kermit + website as: + [179]http://www.columbia.edu/kermit/ckcplm.html + + [180]ca_certs.pem + Certificate Authority certificates for secure connections (see + [181]Section 16). + + 5.3. Installing the Kermit Files + + There is an "install" target in the [182]makefile that you can use if + you wish. However, since every site has its own layout and + requirements, it is often better to install the Kermit files by hand. + You don't have to use the makefile install target to install C-Kermit. + This is especially true since not all sites build C-Kermit from + source, and therefore might not even have the makefile. But you should + read this section in any case. + + If your computer already has an older version of C-Kermit + installed, you should rename it (e.g. to "kermit6" or "kermit7") so + in case you have any trouble with the new version, the old one is + still available. + + In most cases, you need to be root to install C-Kermit, if only to + gain write access to directories in which the binary and manual page + are to be copied. The C-Kermit binary should be installed in a + directory that is in the users' PATH, but that is not likely to be + overwritten when you install a new version of the operating system. A + good candidate would be the /usr/local/bin/ directory, but the + specific choice is site dependent. Example (assuming the appropriate + Kermit binary is stored in your current directory as "wermit", e.g. + because you just built it from source and that's the name the makefile + gave it): + +mv wermit /usr/local/bin/kermit +chmod 755 /usr/local/bin/kermit + + or (only after you finish reading this section!) simply: + +make install + + IMPORTANT: IF C-KERMIT IS TO BE USED FOR DIALING OUT, you must also do + something to give it access to the dialout devices and lockfile + directories. The 'install' target does not attempt to set Kermit's + owner, group, and permissions to allow dialing out. This requires + privileges, open eyes, and human decision-making. Please read + [183]Sections 10 and [184]11 below, make the necessary decisions, and + then implement them by hand as described in those sections. + + You should also install the man page, which is called ckuker.nr, in + the man page directory for local commands, such as /usr/man/man1/, + renamed appropriately, e.g. to kermit.1. This is also taken care of by + "make install". + + Optionally, the text files listed in the [185]previous section can be + placed in a publicly readable directory. Suggested directory names + are: + +/usr/local/doc/kermit/ +/usr/local/lib/kermit/ +/usr/share/lib/kermit/ +/opt/kermit/doc/ + + (or any of these without the "/kermit"). Upon startup, C-Kermit checks + the following environment variables whose purpose is to specify the + directory where the C-Kermit text files are, in the following order: + +K_INFO_DIRECTORY +K_INFO_DIR + + If either of these is defined, C-Kermit checks for the existence of + the ckubwr.txt file (Unix C-Kermit Hints and Tips). If not found, it + checks the directories listed above (both with and without the + "/kermit") plus several others to see if they contain the ckubwr.txt + file. If found, various C-Kermit messages can refer the user to this + directory. + + Finally, if you want to put the source code files somewhere for people + to look at, you can do that too. + + 5.4. The Makefile Install Target + + The makefile "install" target does almost everything for you if you + give it the information it needs by setting the variables described + below. You can use this target if: + + * You downloaded the [186]complete C-Kermit archive and built + C-Kermit from source; or: + * You downloaded an [187]individual C-Kermit binary and the + [188]C-Kermit text-file archive, and your computer has a "make" + command. + + Here are the parameters you need to know: + + BINARY + Name of the binary you want to install as "kermit". Default: + "wermit". + + prefix + (lower case) If you define this variable, its value is + prepended to all the following xxxDIR variables (8.0.211 and + later). + + DESTDIR + If you want to install the Kermit files in a directory + structure like /opt/kermit/bin/, /opt/kermit/doc/, + /opt/kermit/src/, then define DESTIR as the root of this + structure; for example, /opt/kermit. The DESTDIR string should + not end with a slash. By default, DESTDIR is not defined. If it + is defined, but the directory does not exist, the makefile + attempts to create it, which might require you to be root. Even + so, this can fail if any segments in the path except the last + one do not already exist. WARNING: If the makefile creates any + directories, it gives them a mode of 755, and the default owner + and group. Modify these by hand if necessary. + + BINDIR + Directory in which to install the Kermit binary (and the + standard C-Kermit initialization file, if it is found, as a + Kerbang script). If DESTDIR is defined, BINDIR must start with + a slash. BINDIR must not end with a slash. If DESTDIR is + defined, BINDIR is a subdirectory of DESTDIR. If BINDIR does + not exist, the makefile attempts to create it as with DESTDIR. + Default: /usr/local/bin. + + MANDIR + Directory in which to install the C-Kermit manual page as + "kermit" followed by the manual-chapter extension (next item). + Default: /usr/man/man1. If MANDIR is defined, the directory + must already exist. + + MANEXT + Extension for the manual page. Default: 1 (digit one). + + SRCDIR + Directory in which to install the C-Kermit source code. If + DESTDIR is defined, this is a subdirectory of DESTDIR. Default: + None. + + CERTDIR + For secure builds only: Directory in which to install the + ca_certs.pem file. This must be the verification directory used + by programs that use the SSL libraries at your site. Default: + none. Possibilities include: /usr/local/ssl, /opt/ssl, + /usr/lib/ssl, . . . If CERTDIR is defined, the directory + must already exist. + + INFODIR + Directory in which to install the C-Kermit text files. If + DESTDIR is defined, this is a subdirectory of DESTDIR. Default: + None. If INFODIR is defined but does not exist, the makefile + attempts to create it, as with DESTDIR. + + Examples: + + make install + Installs "wermit" as /usr/local/bin/kermit with permissions + 755, the default owner and group, and no special privileges. + The manual page is installed as /usr/man/man1/kermit.1. Text + files are not copied anywhere, nor are the sources. + + make MANDIR= install + Just like "make install" but does not attempt to install the + manual page. + + make DESTDIR=/opt/kermit BINDIR=/bin SRCDIR=/src INFODIR=/doc install + Installs the Kermit binary "wermit" as /opt/kermit/bin/kermit, + puts the source code in /opt/kermit/src, and puts the text + files in /opt/kermit/doc, creating the directories if they + don't already exist, and puts the man page in the default + location. + + make BINDIR=/usr/local/bin CERTDIR=/usr/local/ssl install + Installs the Kerberized Kermit binary "wermit" as + /usr/local/bin/kermit, puts the CA Certificates file in + /usr/local/ssl/, and the man page in the normal place. + + For definitive information, see the makefile. The following is + excerpted from the 8.0.211 makefile: + +# The following symbols are used to specify library and header file locations +# Redefine them to the values used on your system by: +# . editing this file +# . defining the values on the command line +# . defining the values in the environment and use the -e option +# +prefix = /usr/local +srproot = $(prefix) +sslroot = $(prefix) +manroot = $(prefix) + +K4LIB=-L/usr/kerberos/lib +K4INC=-I/usr/kerberos/include +K5LIB=-L/usr/kerberos/lib +K5INC=-I/usr/kerberos/include +SRPLIB=-L$(srproot)/lib +SRPINC=-I$(srproot)/include +SSLLIB=-L$(sslroot)/ssl/lib +SSLINC=-I$(sslroot)/ssl/include +... +WERMIT = makewhat +BINARY = wermit +DESTDIR = +BINDIR = $(prefix)/bin +MANDIR = $(manroot)/man/man1 +MANEXT = 1 +SRCDIR = +INFODIR = +CERTDIR = + __________________________________________________________________________ + +6. INSTALLING UNIX C-KERMIT FROM DOS-FORMAT DISKETTES + + [ [189]Top ] [ [190]Contents ] [ [191]Next ] [ [192]Previous ] + + This section is obsolete. We don't distribute C-Kermit on diskettes + any more because (a)there is no demand, and (b) it no longer fits. + + If you received a DOS-format diskette containing a binary executable + C-Kermit program plus supporting text files, be sure to chmod +x the + executable before attempting to run it. + + In version 5A(190) and later, all the text files on the C-Kermit + DOS-format diskettes are in Unix format: LF at the end of each line + rather than CRLF. This means that no conversions are necessary when + copying to your Unix file system, and that all the files on the + diskette, text and binary, can be copied together. The following + comments apply to the DOS-format diskettes furnished with version + 5A(189) and earlier or to other DOS-format diskettes you might have + obtained from other sources. + + If you have received C-Kermit on MS-DOS format diskettes (such as + those distributed by Columbia University), you should make sure that + your DOS-to-Unix conversion utility (such as "dosread") both: (1) + changes line terminators in all files from carriage-return linefeed + (CRLF) to just linefeed (LF) (such as "dosread -a") and remove any + Ctrl-Z's, and (2) that all filenames are converted from uppercase to + lowercase. If these conversions were not done, you can use the + following shell script on your Unix system to do them: + +---(cut here)--- +#!/bin/sh +# +# Shell script to convert C-Kermit DOS-format files into Unix format. +# Lowercases the filenames, strips out carriage returns and Ctrl-Z's. +# +x=$1 # the name of the source directory +y=$2 # the name of the target directory if [ $# -lt 2 ]; then + echo "usage: $0 source-directory target-directory" + exit 1 +fi +if cd $1 ; then + echo "Converting files from $1 to $2" +else + echo "$0: cannot cd to $1" + exit 1 +fi +for i in *; do + j=`echo $i | tr 'A-Z' 'a-z'` + echo $x/$i =\> $y/$j + tr -d '\015\032' < $i > $y/$j +done +---(cut here)--- + + Cut out this shell script, save it as "convert.sh" (or any other name + you prefer), then "chmod +x convert.sh". Then, create a new, empty + directory to put the converted files in, and then "convert.sh /xxx + /yyy" where /xxx is the name of the directory where the PC-format + files are, and /yyy is the name of the new, empty directory. The + converted files will appear in the new directory. + __________________________________________________________________________ + +7. CHECKING THE RESULTS + + [ [193]Top ] [ [194]Contents ] [ [195]Next ] [ [196]Previous ] + + First some quick checks for problems that can be easily corrected by + recompiling with different options: + + DIRECTORY listing is garbage + Permissions, size, and date are random garbage (but the + filenames are correct) in a C-Kermit DIRECTORY listing. On some + platforms, the lstat() function is present but simply doesn't + work; try adding -DNOLSTAT to CFLAGS and rebuild. If that + doesn't fix it, also add -DNOLINKBITS. If it's still not fixed, + remove -DNOLSTAT and -DNOLINKBITS and add -DNOSYMLINK. + + curses + When you make a connection with C-Kermit and transfer files + using the fullscreen (curses) file-transfer display, and then + get the C-Kermit> prompt back afterwards, do characters echo + when you type them? If not, the curses library has altered the + buffering of /dev/tty. Try rebuilding with KFLAGS=-DCK_NEWTERM. + If it already has -DCK_NEWTERM in CFLAGS, try removing it. If + that doesn't help, then rebuild with -DNONOSETBUF (yes, two + NO's). If none of this works (and you can't fix the code), then + either don't use the fullscreen display, or rebuild with + -DNOCURSES. + + Ctrl-L or any SCREEN command crashes C-Kermit: + Rebuild with -DNOTERMCAP. + + No prompt after CONNECT: + After escaping back from CONNECT mode, does your C-Kermit> + prompt disappear? (Yet, typing "?" still produces a command + list, etc) In that case, add -DCKCONINTB4CB to CFLAGS and + rebuild. + + Here is a more thorough checklist can use to tell whether your version + of C-Kermit was built correctly for your Unix system, with hints on + how to fix or work around problems: + + a. Start C-Kermit (usually by typing "./wermit" in the directory + where you ran the makefile). Do you see the C-Kermit> prompt? If + not, C-Kermit incorrectly deduced that it was running in the + background. The test is in conbgt() in [197]ckutio.c. If you can + fix it for your system, please send in the fix (Hint: read about + "PID_T" below). Otherwise, you can force C-Kermit to foreground + mode by starting it with the -z command line option, as in "kermit + -z", or giving the interactive command SET BACKGROUND OFF. + b. When you type characters at the C-Kermit prompt, do they echo + immediately? If not, something is wrong with concb() and probably + the other terminal mode settings routines in [198]ckutio.c. Be + sure you have used the most appropriate make entry. + c. At the C-Kermit> prompt, type "send ./?". C-Kermit should list all + the files in the current directory. If not, it was built for the + wrong type of Unix file system. Details below. In the meantime, + try SET WILDCARD-EXPANSION SHELL as a workaround. + d. CD to a directory that contains a variety of files, symlinks, and + subdirectories and give a DIRECTORY command at the C-Kermit> + prompt. Do the permissions, size, and date appear correct? If not + see [199]Section 4.0. + e. Assuming your platform supports long file names, create a file + with a long name in your current directory, e.g.: + +$ touch thisisafilewithaveryveryveryveryveryveryveryverylooooooooongname + + (you might need to make it longer than this, perhaps as long as + 257 or even 1025 characters). + Check with ls to see if your version of Unix truncated the name. + Now start C-Kermit and type "send thisis". Does Kermit + complete the name, showing the same name as ls did? If not, wrong + filesystem. Read on. + f. Make sure that Kermit has the maximum path length right. Just type + SHOW FILE and see what it says about this. If it is too short, + there could be some problems at runtime. To correct, look in + [200]ckcdeb.h to see how the symbol CKMAXPATH is set and make any + needed adjustments. + g. Send a file to your new Kermit program from a different Kermit + program that is known to work. Is the date/timestamp of the new + file identical to the original? If not, adjustments are needed in + zstrdt() in [201]ckufio.c. + h. Go to another computer (Computer B) from which you can send files + to C-Kermit. Connect Computer B to the computer (A) where you are + testing C-Kermit. Then: + i. Send a file from B to A. Make sure it transferred OK and was + created with the the right name. + j. Send a file from B to A, specifying an "as-name" that is very, + very long (longer than the maximum name length on computer A). + Check to make sure that the file was received OK and that its name + was truncated to Computer A's maximum length. If not, check the + MAXNAMLEN definition in [202]ckufio.c. + k. Tell C-Kermit on Computer A to "set receive pathnames relative" + and then send it a file from Computer B specifying an as-name that + contains several directory segments: + +send foo dir1/dir2/dir3/foo + + Check to make sure that dir1/dir2/dir3/foo was created in Computer + A's current directory (i.e. that three levels of directories were + created). + l. Repeat step k, but make each path segment in the pathname longer + than Computer A's maximum name length. Make sure each directory + name, and the final filename, were truncated properly. + m. Type Ctrl-C (or whatever your Unix interrupt character is) at the + prompt. Do you get "^C..." and a new prompt? If instead, you get a + core dump (this shouldn't happen any more) "rm core" and then + rebuild with -DNOCCTRAP added to your CFLAGS. If it did work, then + type another Ctrl-C. If this does the same thing as the first one, + then Ctrl-C handling is OK. Otherwise, the SIGINT signal is either + not getting re-armed (shouldn't happen) or is being masked off + after the first time it is caught, in which case, if your Unix is + POSIX-based, try rebuilding C-Kermit with -DCK_POSIX_SIG. + n. Type Ctrl-Z (or whatever your Unix suspend character is) to put + C-Kermit in the background. Did it work? If nothing happened, then + (a)your version of Unix does not support job control, or (b) your + version of C-Kermit was probably built with -DNOJC. If your + session became totally frozen, then you are probably running + C-Kermit on a Unix version that supports job control, but under a + shell that doesn't. If that's not the case, look in the congm() + and psuspend() routines in [203]ckutio.c and see if you can figure + out what's wrong. If you can't, rebuild with -DNOJC. + o. Give a SET LINE command for a dialout device, e.g. "set line + /dev/tty00". If you got some kind of permission or access denied + message, go read [204]Section 10 and then come back here. + p. After giving a successful SET LINE command, type "show comm" to + see the communication parameters. Do they make sense? + q. Type "set speed ?" and observe the list of available speeds. Is it + what you expected? If not, see [205]Section 2) of the + [206]Configurations Options document. + r. Give a SET SPEED command to change the device's speed. Did it + work? (Type "show comm" again to check.) + s. Try dialing out: SET MODEM TYPE , SET LINE , SET SPEED , DIAL . If + it doesn't work, keep reading. After dialing, can you REDIAL? + t. If your version was built with TCP/IP network support, try the + TELNET command. + u. Transfer some files in remote mode on incoming asynchronous serial + (direct or modem) connections, and on incoming network (telnet, + rlogin, terminal server) connections. If you get lots of errors, + try different SET FLOW settings on the remote Kermit program. + v. Establish a serial connection from C-Kermit to another computer + (direct or dialed) and transfer some files. If you have network + support, do the same with a network connection. + w. If your version was built with fullscreen file transfer display + support, check that it works during local-mode file transfer. + Also, check C-Kermit's operation afterwards: is the echoing funny? + etc etc. If there are problems, see [207]Section 4. + x. If your version was built with script programming language + support, TAKE the ckedemo.ksc file to give it a workout. + y. Does C-Kermit interlock correctly with UUCP-family programs (cu, + tip, uucp, etc)? If not, read the section [208]DIALING OUT AND + COORDINATING WITH UUCP below. + z. Modem signals... Give a SET LINE command to a serial device and + then type the SHOW MODEM command. If it says "Modem signals + unavailable in this version of Kermit", then you might want to + look at the ttgmdm() routine in [209]ckutio.c and add the needed + code -- if indeed your version of Unix provides a way to get modem + signals (some don't; e.g. modem signals are a foreign concept to + POSIX, requiring politically incorrect workarounds). + aa. If it says "Modem signals unavailable", then it is likely that the + API for getting modem signals is provided, but it doesn't actually + do anything (e.g. ioctl(ttyfd,TIOCMGET,&x) returns EINVAL). + ab. In any case, it still should be able to manipulate the DTR signal. + To test, SET LINE , SET MODEM NONE, and HANGUP. The DTR light + should go out momentarily. If it doesn't, see if you can add the + needed code for your system to the tthang() routine in + [210]ckutio.c. + ac. If your version of Kermit has the SET FLOW RTS/CTS command, check + to see if it works: give Kermit this command, set your modem for + RTS/CTS, transfer some files (using big packet and window sizes) + and watch the RTS and CTS lights on the modem. If they go on and + off (and Kermit does not get packet errors), then it works. If + your version of Kermit does not have this command, but your + version of Unix does support hardware flow control, take a look at + the tthflow() command in [211]ckutio.c and see if you can add the + needed code (see the section on [212]HARDWARE FLOW CONTROL below). + (And please [213]send back any added code, so that others can + benefit from it and it can be carried forward into future + releases.) + ad. If C-Kermit starts normally and issues its prompt, echoing is + normal, etc, but then after returning from a CONNECT session, the + prompt no longer appears, try rebuilding with -DCKCONINTB4CB. + ae. (8.0.206 or later) Type some commands at the C-Kermit prompt. Can + you use the Up-arrow and Down-arrow keys on your keyboard to + access Kermit's command history? If not, and you're a programmer, + take a look at the USE_ARROWKEYS sections of ckucmd.c. + __________________________________________________________________________ + +8. REDUCING THE SIZE OF THE EXECUTABLE PROGRAM IMAGE + + [ [214]Top ] [ [215]Contents ] [ [216]Next ] [ [217]Previous ] + + Also see: [218]C-Kermit Configuration Options + + a. Many of C-Kermit's options and features can be deselected at + compile time. The greatest savings at the least sacrifice in + functionality is to disable the logging of debug information by + defining NODEBUG during compilation. See the [219]Configurations + Options document for further information. + b. Use shared libraries rather than static linking. This is the + default on many Unix systems anyway. However, executables built + for dynamic linking with shared libraries are generally not + portable away from the machine they were built on, so this is + recommended if the binary is for your use only. + c. Most Unix systems have a "strip" command to remove symbol table + information from an executable program image. "man strip" for + further information. The same effect can be achieved by including + "-s" among the link flags when building C-Kermit. + d. SCO, Interactive, and some other Unix versions have an "mcs" + command. "mcs -d wermit" can be used to delete the contents of the + ".comment" section from the executable program image. + e. Many modern optimizers can be instructed to optimize for space + rather than execution efficiency. Check the CFLAGS in the makefile + target, adjust as desired. + __________________________________________________________________________ + +9. UNIX VERSIONS + + [ [220]Top ] [ [221]Contents ] [ [222]Next ] [ [223]Previous ] + + SECTION CONTENTS + +9.1 [224]Standards + 9.1.1. [225]POSIX + 9.1.2. [226]ANSI C + 9.1.3. [227]Other Standards +9.2. [228]Library Issues +9.3. [229]Unix File System Peculiarities +9.4. [230]Hardware Flow Control +9.5. [231]Terminal Speeds +9.6. [232]Millisecond Sleeps +9.7. [233]Nondestructive Input Buffer Peeking +9.8. [234]Other System-Dependent Features +9.9. [235]Terminal Interruption + + There are several major varieties of Unix: Bell Laboratories Seventh + Edition, AT&T System V, Berkeley Standard Distribution (BSD), and + POSIX. Each has many, many subvarieties and descendents, and there are + also hybrids that exhibit symptoms of two or more varieties, plus + special quirks of their own. + + Seventh edition versions of C-Kermit include the compile-time option + -DV7 in the CFLAGS string in the makefile target. Various V7-based + implementations are also supported: -DCOHERENT, -DMINIX, etc. + + AT&T-based versions of Unix Kermit include the compile-time option + -DATTSV (standing for AT∓T Unix System V). This applies to System + III and to System V up to and including Release 2. For System V + Release 3, the flag -DSVR3 should be used instead (which also implies + -DATTSV). This is because the data type of signal() and several other + functions was changed between SVR2 and SVR3. For System V Release 4, + include -DSVR4 because of changes in UUCP lockfile conventions; this + also implies -DSVR3 and -DATTSV. + + For BSD, the flag -BSDxx must be included, where xx is the BSD version + number, for example BSD4 (for version 4.2 or later, using only 4.2 + features), -DBSD41 (for BSD 4.1 only), -DBSD43 (for 4.3), -DBSD29 (BSD + 2.9 for DEC PDP-11s). -DBSD44 is for 4.4BSD, which is the basis of + FreeBSD, NetBSD, OpenBSD, BSDI, and Mac OS X, and which contains many + POSIX features, and has little relation to 4.3BSD and earlier. + + For POSIX, include the flag -DPOSIX. POSIX defines a whole new set of + terminal i/o functions that are not found in traditional AT&T or + Berkeley implementations, and also defines the symbol _POSIX_SOURCE, + which is used in many system and library header files, mainly to + disable non-POSIX (i.e. useful) features. + + Note (circa 1997): In order to enable serial speeds higher than 38400 + bps, it is generally necessary to add -DPOSIX (among other things), + since the older terminal APIs can not accommodate the new speeds -- + out o' bits. But this often also means wholesale conversion to POSIX + APIs. In general, just try adding -DPOSIX and then see what goes + wrong. Be wary of features disappearing: when _POSIX_SOURCE is + defined, all sorts of things that were perfectly OK before suddenly + become politically incorrect -- like reading modem signals, doing + hardware flow control, etc. POSIX was evidently not designed with + serial communication in mind! + + Case in point: In UnixWare 7.0, #define'ing POSIX causes strictness + clauses in the header files to take effect. These prevent + from defining the timeval and timezone structs, which are needed for + all sorts of things (like select()). Thus, if we want the high serial + speeds, we have to circumvent the POSIX clauses. + + Similarly in SCO OpenServer R5.0.4 where, again, we must use the POSIX + APIs to get at serial speeds higher than 38400, but then doing so + removes hardware flow control -- just when we need it most! In cases + like this, dirty tricks are the only recourse (search for SCO_OSR504 + in [236]ckutio.c for examples). + + For reasons like this, Unix implementations tend to be neither pure + AT&T nor pure BSD nor pure POSIX, but a mixture of two or more of + these, with "compatibility features" allowing different varieties of + programs to be built on the same computer. In general, Kermit tries + not to mix and match but to keep a consistent repertoire throughout. + However, there are certain Unix implementations that only work when + you mix and match. For example, the Silicon Graphics IRIX operating + system (prior to version 3.3) is an AT&T Unix but with a BSD file + system. The only way you can build Kermit successfully for this + configuration is to include -DSVR3 plus the special option -DLONGFN, + meaning "pretend I was built with -DBSDxx when it's time to compile + file-related code". See the "iris" makefile target. + ________________________________________________________________________ + + 9.1. Standards + + [ [237]Top ] [ [238]Section Contents ] [ [239]Contents ] [ [240]Next ] + + SUBSECTION CONTENTS + +9.1.1. [241]POSIX +9.1.2. [242]ANSI C +9.1.3. [243]Other Standards + + In edits 166-167 (1988-89), C-Kermit was heavily modified to try to + keep abreast of new standards while still remaining compatible with + old versions of C and Unix. There are two new standards of interest: + ANSI C (as described in Kernighan and Ritchie, "The C Programming + Language", Second Edition, Prentice Hall, 1988) and POSIX.1 (IEEE + Standard 1003.1 and ISO/IEC 9945-1, 1990, "Portable Operating System + Interface"). These two standards have nothing to do with each other: + you can build C-Kermit with a non-ANSI compiler for a POSIX system, or + for a non-POSIX system with with an ANSI compiler. + + 9.1.1. POSIX + + POSIX.1 defines a repertoire of system functions and header files for + use by C language programs. Most notably, the ioctl() function is not + allowed in POSIX; all ioctl() functions have been replaced by + device-specific functions like tcsetattr(), tcsendbreak(), etc. + + Computer systems that claim some degree of POSIX compliance have made + some attempt to put their header files in the right places and give + them the right names, and to provide system library functions with the + right names and calling conventions. Within the header files, + POSIX-compliant functions are supposed to be within #ifdef + _POSIX_SOURCE..#endif conditionals, and non-POSIX items are not within + these conditionals. + + If Kermit is built with neither -D_POSIX_SOURCE nor -DPOSIX, the + functions and header files of the selected version of Unix (or VMS, + etc) are used according to the CFLAGS Kermit was built with. + + If Kermit is built with -D_POSIX_SOURCE but not -DPOSIX, then one of + the -DBSD or -DATTSV flags (or one that implies them) must also be + defined, but it still uses only the POSIX features in the system + header files. This allows C-Kermit to be built on BSD or AT&T systems + that have some degree of POSIX compliance, but still use BSD or AT&T + specific features. + + The dilimma is this: it is often necessary to define _POSIX_SOURCE to + get at new or modern features, such as high serial speeds and the APIs + to deal with them. But defining _POSIX_SOURCE also hides other APIs + that Kermit needs, for example the ones dealing with modem signals + (others are listed just below). Thus all sorts of hideous contortions + are often required to get a full set of features. + + The POSIX standard does not define anything about uucp lockfiles. + "make posix" uses NO (repeat, NO) lockfile conventions. If your + POSIX-compliant Unix version uses a lockfile convention such as + HDBUUCP (see below), use the "posix" entry, but include the + appropriate lockfile option in your KFLAGS on the "make" command line, + for example: + +make posix "KFLAGS=-DHDBUUCP" + + POSIX.1 also lacks certain other features that Kermit needs. For + example: + + * There is no defined way for an application to do wildcard matching + of filenames. Kermit uses the inode in the directory structure, + but POSIX.1 does not include this concept. (Later POSIX revisions + include functions named (I think) glob() and fnmatch(), but these + functions are not yet in Kermit, and might not be appropriate in + any case.) + * There is no POSIX mechanism for sensing or controlling modem + signals, nor to enable RTS/CTS or other hardware flow control. + * There is no select() for multiplexing i/o, and therefore no + TCP/IP. + * There is no way to check if characters are waiting in a + communications device (or console) input buffer, short of trying + to read them -- no select(), ioctl(fd,FIONREAD,blah), rdchk(), + etc. This is bad for CONNECT mode and bad for sliding windows. + * No way to do a millisecond sleep (no nap(), usleep(), select(), + etc). + * There is no popen(). + + So at this point, there cannot be one single fully functional POSIX + form of C-Kermit unless it also has "extensions", as do Linux, QNX, + etc. + + More on POSIX (quoting from a newsgroup posting by Dave Butenhof): + + Standards tend to look at themselves as "enabling". So POSIX + standards say that, in order to use POSIX functions, a program must + define some macro that will put the development environment in + "POSIX mode". For the ancient POSIX 1003.1-1990, the symbol is + _POSIX_SOURCE. For recent revisions, it's _POSIX_C_SOURCE with an + appropriate value. POSIX 1003.1-1996 says that, to use its features + in a portable manner, you must define _POSIX_C_SOURCE=199506L + before including any header files. + + But for Solaris, or Digital Unix, the picture is different. POSIX + is one important but small part of the universe. Yet POSIX + unconditionally and unambiguously REQUIRES that, when + _POSIX_C_SOURCE=199506L, ALL of the functions and definitions + required by the standard, and NO others (except in specific + restricted namespaces, specifically "_" followed by an uppercase + letter or "__" followed by a lowercase letter) shall be visible. + That kinda puts a cramp on BSD and SVID support, because those + require names that are not in the "protected" POSIX namespaces. + It's ILLEGAL to make those symbols visible, unless you've done + something else that's beyond the scope of POSIX to allow the system + to infer that you didn't really mean it. + + In most cases, you should just compile, with no standards-related + macros defined. The system will make available every interface and + definition that isn't incompatible with the "main stream". There + may indeed be cases where two standards cross, and you really can't + use both together. But, in general, they play nicely together as + long as you don't do anything rash -- like telling the system that + it's not allowed to let them. + + In the area of threads, both Solaris and Digital Unix support + incompatible thread APIs. We have POSIX and DCE, they have POSIX + and UI. The nasty areas are in the _r routines and in some aspects + of signal behavior. You cannot compile a single source file that + uses both semantics. That's life. It sounds as if Solaris defaults + to the UI variants, but allows you to define this + _POSIX_THREAD_SEMANTICS to get around it. We default to POSIX, and + allow you to define _PTHREAD_USE_D4 (automatically defined by the + cc "-threads" switch) to select the DCE thread variants. That + default, because you're operating outside of any individual + standard, is really just a marketing decision. + ______________________________________________________________________ + + 9.1.2. ANSI C + + [ [244]Top ] [ [245]Contents ] [ [246]Section Contents ] [ + [247]Subsection Contents ] [ [248]Next ] [ [249]Previous ] + + The major difference between ANSI C and earlier C compilers is + function prototyping. ANSI C allows function arguments to be checked + for type agreement, and (when possible) type coercion in the event of + a mismatch. For this to work, functions and their arguments must be + declared before they are called. The form for function declarations is + different in ANSI C and non-ANSI C (ANSI C also accepts the earlier + form, but then does not do type checking). + + As of edit 167, C-Kermit tries to take full advantage of ANSI C + features, especially function prototyping. This removes many bugs + introduced by differing data types used or returned by the same + functions on different computers. ANSI C features are automatically + enabled when the symbol __STDC__ is defined. Most ANSI C compilers, + such as GNU CC and the new DEC C compiler define this symbol + internally. + + On the downside, ANSI C compilation increases the + administrative/bureacratic burden, spewing out countless unneeded + warnings about mismatched types, especially when we are dealing with + signed and unsigned characters, requiring casts everywhere to shut up + the mindless complaints -- there is no use for signed chars in Kermit + (or probably anywhere else). Some compilers, mercifully, include a + "treat all chars as unsigned" option, and when available it should be + used -- not only to stop the warnings, but also to avoid unhelpful + sign extension on high-bit characters. + + To force use of ANSI C prototypes, include -DCK_ANSIC on the cc + command line. To disable the use of ANSI prototypes, include -DNOANSI. + ______________________________________________________________________ + + 9.1.3. Other Standards + + [ [250]Top ] [ [251]Contents ] [ [252]Section Contents ] [ + [253]Subsection Contents ] [ [254]Next ] [ [255]Previous ] + + As the years go by, standards with-which-all-must-comply continue to + pile up: AES, XPG2, XPG3, XPG4, FIPS 151-2, successive generations of + POSIX, OSF/1, X/Open, Spec 1170, UNIX95, Open Group UNIX98, ISO/IEC + 9945 parts 1-4, ISO 9899, 88Open, OS 99, Single Unix Specification + (SUS, [256]IEEE 1003.1-2001, not to mention "mature standards" like + V7, 4.2/4.3BSD, System V R3 and R4 (SVID2 and SVID3), 4.4BSD (the + basis for BSDI, OpenBSD, NetBSD, FreeBSD, Mac OS X etc), /usr/group, + plus assorted seismic pronouncements of the neverending series of + ephemeral corporate consortia, not to mention the libc-vs-glibc + turmoil in the Linux arena and who knows what else. + + None of these standards simplifies life for portable applications like + C-Kermit -- each one is simply one more environment to support (or + circumvent, as in many cases these standards do more harm than good by + denying access to facilities we need, e.g. as noted in above in + [257]9.1.1). + ________________________________________________________________________ + + 9.2. Library Issues + + [ [258]Top ] [ [259]Contents ] [ [260]Section Contents ] [ + [261]Subsection Contents ] [ [262]Next ] [ [263]Previous ] + + On most modern platforms, applications are -- and often must be -- + dynamically linked. This has numerous advantages (smaller executables, + ability to patch a library and thereby patch all applications that use + it, etc), but also causes some headaches: most commonly, the library + ID built into the executable at link time does not match the ID of the + corresponding library on the target system, and so the loader refuses + to let the application run. + + This problem only gets worse over time. In the Linux and *BSD world, + we also have totally different libraries (each with their own names + and numbering systems) that cover the same territory; for example, + curses vs ncurses, libc versus glibc. Combinations proliferate and any + given Unix computer might have any combination. For this reason it is + becoming increasingly difficult to produce a "Linux binary" for a + given architecture (e.g. PC or Alpha). There has to be a separate + binary for (at least) every combination of curses vs ncurses and libc + vs glibc. + + In such cases, the best advice is for every user to build C-Kermit + from source code on the system where it will run. Too bad most + commercial Unix vendors have stopped including C compilers with the + operating system! + ________________________________________________________________________ + + 9.3. Unix File System Peculiarities + + [ [264]Top ] [ [265]Contents ] [ [266]Section Contents ] [ [267]Next ] + [ [268]Previous ] + + Normally, including a BSD, System-V, POSIX, or DIRENT flag in the make + entry selects the right file system code. But some versions of Unix + are inconsistent in this regard, and building in the normal way either + gives compiler or linker errors, or results in problems at runtime, + typically failure to properly expand wildcard file specifications when + you do something like "send *.*", or failure to recognize long + filenames, as in "send filewithaveryveryveryveryverylongname". + + C-Kermit is supposed to know about all the various styles of Unix file + systems, but it has to be told which one to use when you build it, + usually in the makefile target CFLAGS as shown below, but you might + also have to add something like -I/usr/include/bsd to CFLAGS, or + something like -lbsd to LIBS. + + C-Kermit gives you the following CFLAGS switches to adapt to your file + system's peculiarities: + +-DDIRENT - #include +-DSDIRENT - #include +-DNDIR - #include +-DXNDIR - #include +-DRTU - #include "/usr/lib/ndir.h", only if NDIR and XNDIR not defined. +-DSYSUTIMH - #include for setting file creation dates. +-DUTIMEH - #include for setting file creation dates. + + (Note, RTU should only be used for Masscomp RTU systems, because it + also selects certain other RTU-specific features.) + + If none of these is defined, then is used. IMPORTANT: If + your system has the file /usr/include/dirent.h then be sure to add + -DDIRENT to your makefile target's CFLAGS. "dirent" should be used in + preference to any of the others, because it supports all the features + of your file system, and the others probably don't. + + Having selected the appropriate directory header file, you might also + need to tell Kermit how to declare the routines and variables it needs + to read the directory. This happens most commonly on AT&T System-V + based UNIXes, particularly System V R3 and earlier, that provide long + file and directory names (longer than 14 characters). Examples include + certain releases of HP-UX, DIAB DNIX, older versions of Silicon + Graphics IRIX, and perhaps also MIPS. In this case, try adding + -DLONGFN to your makefile target. + + Another problem child is . Most Unix C-Kermit versions + need to #include this file from within [269]ckufio.c and + [270]ckutio.c, but some not only do not need to include it, but MUST + not include it because (a) it doesn't exist, or (b) it has already + been included by some other header file and it doesn't protect itself + against multiple inclusion, or (c) some other reason that prevents + successful compilation. If you have compilation problems that seem to + stem from including this file, then add the following switch to CFLAGS + in your makefile target: + +-DNOFILEH + + There are a few odd cases where must be included in one + of the cku[ft]io.c files, but not the other. In that case, add the + aforementioned switch, but go into the file that needs + and add something like this: + +#ifdef XXX /* (where XXX is a symbol unique to your system) */ +#undef NOFILEH +#endif /* XXX */ + + before the section that includes . + + Kermit's SEND command expands wildcard characters "?" and "*" itself. + Before version 5A, commands like "send *" would send all regular + (non-directory) files, including "hidden files" (whose names start + with "."). In version 5A, the default behavior is to match like the + Bourne shell or the ls command, and not include files whose names + start with dot. Such files can still be sent if the dot is included + explicitly in the SEND command: "send .oofa, send .*". To change back + to the old way and let leading wildcard characters match dot files, + include the following in your CFLAGS: + +-DMATCHDOT + + (In C-Kermit 6.0, there is also a command to control this at runtime.) + + Complaints about data-type mismatches: + + * If you get compile-time complaints about data type mismatches for + process-ID related functions like getpid(), add -DPID_T=pid_t. + * If you get compile-time complaints about data type mismatches for + user ID related functions like getuid(), add -DUID_T=uid_t. + * If you get compile-time complaints about data type mismatches for + user-ID related functions like getgid(), add -DGID_T=gid_t. + * If you get compile-time complaints about data type mismatches for + getpwuid(), add -DPWID_T=uid_t (or whatever it should be). + + File creation dates: C-Kermit attempts to set the creation date/time + of an incoming file according to the date/time given in the file's + attribute packet, if any. If you find that the dates are set + incorrectly, you might need to build Kermit with the -DSYSUTIMEH flag, + to tell it to include . If that doesn't help, look at the + code in zstrdt() in [271]ckufio.c. + ________________________________________________________________________ + + 9.4. Hardware Flow Control + + [ [272]Top ] [ [273]Contents ] [ [274]Section Contents ] [ [275]Next ] + [ [276]Previous ] + + Hardware flow control is a problematic concept in many popular Unix + implementations. Often it is lacking altogether, and when available, + the application program interface (API) to it is inconsistent from + system to system. Here are some examples: + + a. POSIX does not support hardware flow control. + b. RTS/CTS flow control support MIGHT be available for System V R3 + and later if /usr/include/termiox.h exists (its successful + operation also depends on the device driver, and the device + itself, not to mention the cable, etc, actually supporting it). If + your SVR3-or-later Unix system does have this file, add: + +-DTERMIOX + + to your CFLAGS. If the file is in /usr/include/sys instead, add: + +-DSTERMIOX + + Note that the presence of this file does not guarantee that + RTS/CTS will actually work -- that depends on the device-driver + implementation (reportedly, many Unix versions treat + hardware-flow-control related ioctl's as no-ops). + c. Search ("grep -i") through /usr/include/*.h and + /usr/include/sys/*.h for RTS or CTS and see what turns up. For + example, in SunOS 4.x we find "CRTSCTS". Figuring out how to use + it is another question entirely! In IBM AIX RS/6000 3.x, we have + to "add" a new "line discipline" (and you won't find uppercase RTS + or CTS symbols in the header files). + d. NeXTSTEP and IRIX, and possibly others, support hardware flow + control, but do not furnish an API to control it, and thus on + these systems Kermit has no command to select it -- instead, a + special device name must be used. (NeXTSTEP: /dev/cufa instead of + /dev/cua; IRIX: /dev/ttyf00) + + See the routine tthflow() in [277]ckutio.c for details. If you find + that your system offers hardware flow control selection under program + control, you can add this capability to C-Kermit as follows: + + a. See if it agrees with one of the methods already used in + tthflow(). if not, add new code, appropriately #ifdef'd. + b. Add -DCK_RTSCTS to the compiler CFLAGS in your makefile target or + define this symbol within the appropriate #ifdefs in + [278]ckcdeb.h. + + To illustrate the difficulties with RTS/CTS, here is a tale from Jamie + Watson , who added the RTS/CTS code for the RS/6000, + about his attempts to do the same for DEC ULTRIX: + + "The number and type of hardware signals available to/from a serial + port vary between different machines and different types of serial + interfaces on each machine. This means that, for example, there are + virtually no hardware signals in or out available on the DECsystem + 3000/3100 series; on the DECsystem 5000/2xx series all modem + signals in/out are present on both built-in serial ports; on the + DECsystem 5100 some ports have all signals and some only have some; + and so on... It looks to me as if this pretty well rules out any + attempt to use hardware flow control on these platforms, even if we + could figure out how to do it. The confusion on the user level + about whether or not it should work for any given platform or port + would be tremendous. And then it isn't clear how to use the + hardware signals even in the cases where the device supports them." + ________________________________________________________________________ + + 9.5. Terminal Speeds + + [ [279]Top ] [ [280]Contents ] [ [281]Section Contents ] [ [282]Next ] + [ [283]Previous ] + + The allowable speeds for the SET SPEED command are defined in + [284]ckcdeb.h. If your system supports speeds that are not listed in + "set speed ?", you can add definitions for them to ckcdeb.h. + + Then if the speed you are adding is one that was never used before in + Kermit, such as 921600, you'll also need to add the appropriate + keywords to spdtab[] in [285]ckuus3.c, and the corresponding case to + ttsspd() in [286]ckutio.c. + ________________________________________________________________________ + + 9.6. Millisecond Sleeps + + [ [287]Top ] [ [288]Contents ] [ [289]Section Contents ] [ [290]Next ] + [ [291]Previous ] + + There is no standard for millisecond sleeps, but at least five + different functions have appeared in various Unix versions that can be + used for this purpose: nap() (mostly in System V), usleep() (found at + least in SunOS and NeXT OS), select() (found in 4.2BSD and later, and + part of any TCP/IP sockets library), nanosleep(), and sginap(). If you + have any of these available, pick one (in this order of preference, if + you have more than one): + +-DSELECT: Include this in CFLAGS if your system has the select() function. +-DNAP: Include this in CFLAGS if your system has the nap() function. +-USLEEP: Include this in CFLAGS if your system has the usleep() function. + + NOTE: The nap() function is assumed to be a function that puts the + process to sleep for the given number of milliseconds. If your + system's nap() function does something else or uses some other units + of time (like the NCR Tower 32, which uses clock-ticks), do not + include -DNAP. + + Reportedly, all versions of System V R4 for Intel-based computers, and + possibly also SVR3.2, include nap() as a kernel call, but it's not in + the library. To include code to use it via syscall(3112,x), without + having to include Xenix compatibility features, include the following + compile-time option: + +-DNAPHACK + ________________________________________________________________________ + + 9.7. Nondestructive Input Buffer Peeking + + [ [292]Top ] [ [293]Contents ] [ [294]Section Contents ] [ [295]Next ] + [ [296]Previous ] + + Some AT&T Unix versions have no way to check if input is waiting on a + tty device, but this is a very important feature for Kermit. Without + it, sliding windows might not work very well (or at all), and you also + have to type your escape character to get Kermit's attention in order + to interrupt a local-mode file transfer. If your system offers an + FIONREAD ioctl, the build procedure should pick that up automatically + and use it, which is ideal. + + If your system lacks FIONREAD but has a select() function, this can be + used instead. If the build procedure fails to include it (SHOW + FEATURES will list SELECT), then you can add it to your CFLAGS: + +-DSELECT + + Conversely, if the build procedure tries to use select() when it + really is not there, add: + +-DNOSELECT + + Note: select() is not part of System V nor of POSIX, but it has been + added to various System-V- and POSIX-based systems as an extension. + + Some System-V variations (SCO Xenix/UNIX/ODT and DIAB DNIX) include a + rdchk() function that can be used for buffer peeking. It returns 0 if + no characters are waiting and 1 if characters are waiting (but unlike + FIONREAD, it does not tell the actual number). If your system has + rdchk(), add: + +-DRDCHK: Include this in CFLAGS if your system has the rdchk() function. + + Otherwise, if your version of Unix has the poll() function (and the + /usr/include/poll.h file) -- which appears to be a standard part of + System V going back to at least SVR3, include: + +-DCK_POLL + ________________________________________________________________________ + + 9.8. Other System-Dependent Features + + [ [297]Top ] [ [298]Contents ] [ [299]Section Contents ] [ [300]Next ] + [ [301]Previous ] + + Systems with might have the symbol IEXTEN defined. This is + used to turn "extended features" in the tty device driver on and off, + such as Ctrl-O to toggle output flushing, Ctrl-V to quote input + characters, etc. + + In most Unix implementations, it should be turned off during Kermit + operation, so if [302]ckutio.c finds this symbol, it uses it. This is + necessary, at least, on BSDI. On some systems, however, IEXTEN is + either misdefined or misimplemented. The symptom is that CR, when + typed to the command processor, is echoed as LF, rather than CRLF. + This happens (at least) on Convex/OS 9.1. The solution is to add the + following symbol to the makefile target's CFLACS: + +-DNOIEXTEN + + However, in at least one Unix implementation, QNX 4.21, IEXTEN must be + set before hardware flow control can be used. + + In edits 177 and earlier, workstation users noticed a "slow screen + writing" phenomenon during interactive command parsing. This was + traced to a setbuf() call in [303]ckutio.c that made console (stdout) + writes unbuffered. This setbuf() call has been there forever, and + could not be removed without some risk. Kermit's operation was tested + on the NeXT in edit 178 with the setbuf() call removed, and the + slow-writing symptom was cured, and everything else (command parsing, + proper wakeup on ?, ESC, Ctrl-U, and other editing characters, + terminal emulation, remote-mode and local-mode file transfer, etc) + seemed to work as well as or better than before. In subsequent edits, + this change was made to many other versions too, with no apparent ill + effects. To remove the setbuf() call for your version of Kermit, add: + +-DNOSETBUF + + Later reports indicate that adding -DNOSETBUF has other beneficial + effects, like cutting down on swapping when Kermit is run on + workstations with small memories. But BEWARE: on certain small Unix + systems, notably the AT&T 6300 and 3B1 (the very same ones that + benefit from NOSETBUF), NOSETBUF seems to conflict with CK_CURSES. The + program builds and runs OK, but after once using the curses display, + echoing is messed up. In this case, we use a System-V specific + variation in the curses code, using newterm() to prevent System V from + altering the buffering. See makefile entries for AT&T 6300 and 3B1. + + The Unix version of C-Kermit includes code to switch to file + descriptor zero (stdin) for remote-mode file transfer. This code is + necessary to prevent Kermit from giving the impression that it is + "idle" during file transfers, which, at some sites, can result in the + job being logged out in the middle of an active file transfer by + idle-job monitors. + + However, this feature can interfere with certain setups; for example, + there is a package which substitutes a pty/tty pair for /dev/tty and + sets file descriptor 0 to be read-only, preventing Kermit from sending + packets. Or... When a Unix shell is invoked under the PICK + environment, file descriptor 0 is inoperative. + + To remove this feature and allow Kermit to work in such environments, + add the compile-time option: + +-DNOFDZERO + + On some versions of Unix, earlier releases of C-Kermit were reported + to render a tty device unusable after a hangup operation. Examples + include IBM AIX on the RT PC and RS/6000. A typical symptom of this + phenomenon is that the DIAL command doesn't work, but CONNECTing to + the device and dialing manually do work. A further test is to SET DIAL + HANGUP OFF, which should make dialing work once by skipping the + pre-dial hangup. However, after the connection is broken, it can't be + used any more: subsequent attempts to DIAL the same device don't work. + The cure is usually to close and reopen the device as part of the + hangup operation. To do this, include the following compile-time + option: + +-DCLSOPN + + Similarly, there is a section of code in ttopen(), which does another + close(open()) to force the O_NDELAY mode change. On some systems, the + close(open()) is required to make the mode change take effect, and + apparently on most others it does no harm. But reportedly on at least + one System V R4 implementation, and on SCO Xenix 3.2, the + close(open()) operation hangs if the device lacks carrier, EVEN THOUGH + the CLOCAL characteristic has just been set to avoid this very + problem. If this happens to you, add this to your CFLAGS: + +-DNOCOTFMC + + or, equivalently, in your KFLAGS on the make command line. It stands + for NO Close(Open()) To Force Mode Change. + + C-Kermit renames files when you give a RENAME command and also + according to the current SET FILE COLLISION option when receiving + files. The normal Unix way to rename a file is via two system calls: + link() and unlink(). But this leaves open a window of vulnerability. + Some Unix systems also offer an atomic rename(oldname,newname) + function. If your version of Unix has this function, add the following + to your CFLAGS: + +-DRENAME + + C-Kermit predefines the RENAME for several Unix versions in + [304]ckcdeb.h (SVR4, SUNOS41, BSD44, AIXRS, etc). You can tell if + rename() is being used if the SHOW FEATURES command includes RENAME in + the compiler options list. If the predefined RENAME symbol causes + trouble, then add NORENAME to your CFLAGS. Trouble includes: + + a. Linker complains that _rename is an unresolved symbol. + b. Linking works, but Kermit's RENAME command doesn't work (which + happens because older versions of rename() might have their + arguments reversed). + + If rename() is not used, then Kermit uses link()/unlink(), which is + equivalent except it is not atomic: there is a tiny interval in which + some other process might "do something" to one of the files or links. + + Some Unix systems (Olivetti X/OS, Amdahl UTS/V, ICL SVR3, etc) define + the S_ISREG and S_ISDIR macros incorrectly. This is compensated for + automatically in [305]ckufio.c. Other systems might have this same + problem. If you get a compile-time error message regarding S_ISREG + and/or S_ISDIR, add the following to your CFLAGS: + +-DISDIRBUG + + Finally, here's a symbol you should NEVER define: + +-DCOMMENT + + It's used for commenting out blocks of code. If for some reason you + find that your compiler has COMMENT defined, then add -UCOMMENT to + CFLAGS or KFLAGS! Similarly, some header files have been known to + define COMMENT, in which case you must add "#undef COMMENT" to each + C-Kermit source module, after all the #includes. + ________________________________________________________________________ + + 9.9. Terminal Interruption + + [ [306]Top ] [ [307]Contents ] [ [308]Section Contents ] [ [309]Next ] + [ [310]Previous ] + + When C-Kermit enters interactive command mode, it sets a Control-C + (terminal keyboard interrupt = SIGINT) trap to allow it to return to + the command prompt whenever the user types Control-C (or whatever is + assigned to be the interrupt character). This is implemented using + setjmp() and longjmp(). On some systems, depending on the machine + architecture and C compiler and who knows what else, you might get + "Memory fault (coredump)" or "longjmp botch" instead of the desired + effect (this should not happen in 5A(190) and later). In that case, + add -DNOCCTRAP to your CFLAGS and rebuild the program. + + Job control -- the ability to "suspend" C-Kermit on a Unix system by + typing the "susp" character (normally Ctrl-Z) and then resume + execution later (with the "fg" command) -- is a tricky business. + C-Kermit must trap suspend signals so it can put the terminal back + into normal mode when you suspend it (Kermit puts the terminal into + various strange modes during interactive command parsing, CONNECT, and + file transfer). Supporting code is compiled into C-Kermit + automatically if includes a definition for the SIGTSTP + signal. HOWEVER... some systems define this signal without supporting + job control correctly. You can build Kermit to ignore SIGTSTP signals + by including the -DNOJC option in CFLAGS. (You can also do this at + runtime by giving the command SET SUSPEND OFF.) + + NOTE: As of version 5A(190), C-Kermit makes another safety check. + Even if job control is available in the operating system (according + to the numerous checks made in congm()), it will still disable the + catching of SIGTSTP signals if SIGTSTP was set to SIG_IGN at the + time C-Kermit was started. + + System V R3 and earlier systems normally do not support job control. + If you have an SVR3 system that does, include the following option in + your CFLAGS: + +-DSVR3JC + + On systems that correctly implement POSIX signal handling, signals can + be handled more reliably than in Bell, Berkeley, or AT&T Unixes. On + systems (such as QNX) that are "strictly POSIX", POSIX signal handling + *must* be used, otherwise no signal will work more than once. If you + have POSIX-based system and you find that your version of Kermit + responds to Ctrl-C (SIGINT) or Ctrl-Z (SIGTSTP) only once, then you + should add the following option to your CFLAGS: + +-DCK_POSIX_SIG + + But be careful; some POSIX implementations, notably 4.4BSD, include + POSIX signal handling symbols and functions as "stubs" only, which do + nothing. Look in for sigsetjmp and siglongjmp and read the + comments. + __________________________________________________________________________ + +10. DIALING OUT AND COORDINATING WITH UUCP + + [ [311]Top ] [ [312]Contents ] [ [313]Next ] [ [314]Previous ] + + NOTE: Red Hat Linux 7.2 and later include a new API that allows + serial-port arbitration by non-setuid/gid programs. This API has + not yet been added to C-Kermit. If C-Kermit is to be used for + dialing out on Red Hat 7.2 or later, it must still be installed as + described in this section and the next. + + The short version: + + In order for C-Kermit to be able to dial out from your Unix + computer, you need to give it the same owner, group, and + permissions as your other dialout programs, such as cu, tip, + minicom, uucp, seyon, etc. + + The long version: + + Make sure your dialout line is correctly configured for dialing out + (as opposed to login). The method for doing this is different for each + kind of Unix. Consult your system documentation for configuring lines + for dialing out (for example, Sun SPARCstation IPC users should read + the section "Setting up Modem Software" in the Desktop SPARC Sun + System and Network Manager's Guide, or the Terminals and Modems + section of the HP manual, "Configuring HP-UX for Peripherals" (e.g. + /usr/sbin/sam => Peripheral Devices => Terminals and Modems => Add + Modem). + + Unlike most other multiuser, multitasking operating systems, Unix + allows multiple users to access the same serial device at the same + time, even though there is no earthly reason why two users should do + this. When they do, user A will read some of the incoming characters, + and user B will read the others. In all likelihood, neither user will + see them all. Furthermore, User B can hang up User A's call, etc. + + Rather than change Unix to enforce exclusive access to serial devices + such as ttys, Unix developers chose instead to use a "lock file". Any + process that wants to open a tty device should first check to see if a + file of a certain name exists, and if so, not to open the device. If + the file does not exist, the process creates the file and then opens + the device. When the process closes the device, it destroys the + lockfile. This procedure was originated for use with Unix's UUCP, CU, + and TIP programs, and so these lockfiles are commonly called "UUCP + lockfiles" (UUCP = Unix-to-Unix Copy Program). + + As you can imagine, this method is riddled with pitfalls: + + * If a process does not observe the prevailing lockfile convention, + then it can interfere with other "polite" processes. And in fact, + very few Unix applications or commands handle lockfiles at all; an + original design goal of Unix was that "everything is a file", and + countless utilities operate on files directly (by opening them) or + indirectly through redirection of standard i/o, without creating + or looking for lockfiles. + * If a process crashes while it has the device open, the lockfile is + left behind, preventing further processes from using the device. + * Various versions of Unix use different names for the lockfiles, + put them in different directories, with different owners and + groups and permissions, and specify their contents differently. + * On a given platform, the lockfile conventions may change from one + Unix release to the next (for example, SunOS 4.0 to 4.1) or, in + the case of Linux, across different distributions. + * The same tty device might have more than one name, and most + lockfile conventions don't allow for this. Similarly for symbolic + links. + + In an attempt to address the problem of "stale" lockfiles, most UUCP + implementations put the PID (Process ID) of the creating process in + the lockfile. Thus, another process that wants to open the + corresponding device can check not only for the lockfile itself, but + also can check the PID for validity. But this doesn't work well + either: + + * PIDs are stored in diverse formats that change with every new + release (short, integer, long, or string in any of various + formats). If the reading program does not follow the same + convention as the writing program, it can diagnose a valid PID to + be invalid, and therefore not honor the lock. + * PIDs recycle. If the lockfile was created by PID 1234, which later + crashed without removing the lockfile, and then a new process 1234 + exists a the time the lockfile is checked, the lockfile will be + improperly taken as valid, and access to the device denied + unnecessarily. + + Several techniques address the problem of multiple names for the same + device: + + * Multiple lockfiles. For example, if the user opens a device + through a symlink, a lockfile is created for both the symlink name + and the true name (obtained from readlink()). However, when + multiple drivers are installed for the same device (e.g. /dev/cua, + /dev/cufa, etc), this approach won't work unless all applications + *know* all the different names for the same device and make + lockfiles for all of them, which is obviously not practical. + * Lockfiles whose names are not based on the device name. These + lockfiles generally have names like LK.inode/major/minor, where + inode, major, and minor are numbers, which will always be the same + for any physical device, no matter what its name. This form of + lockfile is used in System V R4 and its derivatives, such as + Solaris, UnixWare, etc. If lockfiles must be used (as opposed to, + say, kernel-based locks), this would seem to be the most effective + form. + + Most versions of Unix were not designed to accommodate third-party + communications software; thus vendors of these Unix products feel no + compunction about changing lockfile conventions from release to + release, since they also change their versions of the cu, uucp, tip, + etc, programs at the same time to match. And since the source code to + these programs might not be published, it is difficult for makers of + third-party products like C-Kermit to find out what the new + conventions are. It also forces release of new versions of C-Kermit + whenever the OS vendor makes a change like this. + + Some Unix vendors have taken a small step to simplify communications + application development for their products: the inclusion of lockfile + routines in the standard system C runtime libraries to shield the + application from the details of lockfile management (IBM AIX is an + example). When such routines are used, communications applications do + not need modification when lockfile conventions change (although they + will need recompiling if the routines are statically linked into the + application). In the AIX example, the simple function calls ttylock(), + ttyunlock(), and ttylocked() replace hundreds of lines of ugly code in + C-Kermit that attempts to keep pace with every release of every Unix + product over the last 20 years. Inclusion of ttylock() code occurs + when: + +-DUSETTYLOCK + + is included in the CFLAGS. + + If such routines are available, they should be used. The rest of this + section applies when they are not. + + To fit in with UUCP and other Unix-based communication software, + C-Kermit must have the same idea as your system's uucp, cu, and tip + programs about what the UUCP lock directory is called, what the + lockfile itself is called, and what its contents should be. In most + cases, C-Kermit preprocessor flags create the appropriate + configuration at compile time if the appropriate makefile target was + used (see [315]ckutio.c). The following CFLAGS options can be used to + override the built-in configuration: + + -DLCKDIR + Tells Kermit that the UUCP lock directory is + /usr/spool/uucp/LCK. + + -DACUCNTRL + Tells Kermit to use the BSD 4.3 acucntrl() program to turn off + getty (login) on the line before using it, and restore getty + when done. + + -DHDBUUCP + Include this if your system uses Honey DanBer UUCP, in which + the lockfile directory and format are relatively standardized. + + -DLOCK_DIR=\\\"/xxx/yyy\\\" + Gives the lock directory name explicitly. The triple quoting is + necessary. For example: + +CFLAGS= -DBSD4 -DLOCK_DIR=\\\"/usr/local/locks\\\" -DNODEBUG + + (NOTE: The triple quoting assumes this is a "top-level" make + entry, and not a make entry that calls another one.) + + -DLFDEVNO The lockfile name uses the tty device inode and major and + minor + numbers: LK.dev.maj.min, as in Sys V R4, e.g. LK.035.044.008. + + When the LK.inode.major.minor form is used, a single lockfile is + enough. Otherwise, a single lockfile rarely suffices. For example, in + Linux, it is common to have a /dev/modem symbolic link to an actual + dialout device, like /dev/cua0 or /dev/ttyS0, whose purpose is to hide + the details of the actual driver from the user. So if one user opens + /dev/modem, a lockfile called LCK..modem is created, which does not + prevent another user from simulataneously opening the same device by + its real name. + + On SCO Unix platforms, we have a slightly different problem: the same + device is, by convention, known by "lowercase" and "uppercase" names, + depending on whether it has modem control. So by convention, + communications programs are supposed to create the lockfiles based on + the lowercase name. But some programs don't follow this convention. In + HP-UX, we have several different names for each serial device. And so + on. + + For this reason, on platforms where the LK.inode.major.minor form is + not used, C-Kermit also creates a secondary lockfile (which is simply + a link to the first) if: + + a. The given device name is a symbolic link. The secondary link is + based on the device's real name. + b. On SCO: The device name is not a symbolic link, but it contains + uppercase letters. The primary link is based on the lowercase + name; the secondary link is based on the name that was given. + c. On HP-UX: The device name starts with "cu". The primary link is + based on the name that was given; the secondary link is based on + the corresponding "ttyd" device, e.g. "LCK..cua0p0" and + "LCK..ttyd0p0". + + NOTE: symlinks are not handled in HP-UX. + + Honey DanBer (HDB) UUCP, which is becoming increasingly popular, has + two characteristics: + + a. Lockfiles are kept in /usr/spool/locks/ (usually). + b. A lockfile contains the process id (pid) in ASCII, rather than as + an int. + + Non-HDB selections assume the lockfile contains the pid in int form + (or, more precisely, in PID_T form, where PID_T is either int or + pid_t, depending on your system's C library and header files). (b), by + the way, is subject to interpretation: the numeric ASCII string may or + may not be terminated by a newline, it may or may not have leading + spaces (or zeros), and the number of leading spaces or zeros can + differ, and the differences can be significant. + + Even if you build the program with the right lockfile option, you can + still have problems when you try to open the device. Here are the + error messages you can get from SET LINE, and what they mean: + + a. "Timed out, no carrier." This one is not related to lockfiles. It + means that you have SET CARRIER ON xx, where xx is the number of + seconds to wait for carrier, and carrier did not appear within xx + seconds. Solution: SET CARRIER AUTO or OFF. + b. "Sorry, access to lock denied." Kermit has been configured to use + lockfiles, but (a)the lockfile directory is write-protected + against you, or (b) it does not exist. The "access to lock denied" + message will tell you the reason. If the directory does not exist, + check to make sure Kermit is using the right name. Just because + version n of your Unix used a certain lockfile directory is no + gurantee that version n.1 does not use a different one. + Workaround: ask the system administrator to install a symbolic + link from the old name to the new name. Other solutions: (see + below) + c. "Sorry, access to tty device denied." The tty device that you + specified in your SET LINE command is read/write protected against + you. Solution: (see below) + d. "Sorry, device is in use." The tty device you have specified is + currently being used by another user. A prefatory message gives + you an "ls -l" listing of the lockfile, which should show the + username of the person who created it, plus a message "pid = nnn" + to show you the process id of the user's program. Solutions: try + another device, wait until the other user is finished, ask the + other user to hurry up, or ask the system manager for help. + e. "Sorry, can't open connection: reason". The device cannot be + opened for some other reason, which is listed. + f. "sh: /usr/lib/uucp/acucntrl: not found". This means your Kermit + program was built with the -DACUCNTRL switch, but your computer + system does not have the BSD 4.3 acucntrl program. Solution: + install the acucntrl program if you have it, or rebuild Kermit + without the -DACUCNTRL switch. + + There are two solutions for problems (b) and (c), both of which + involve intervention by your Unix system administrator (superuser): + + a. Have the superuser change the permission of the lockfile directory + and to the tty devices so that everyone on the system has + read/write permission. + +su% chmod 777 /usr/spool/locks (or whatever the path is) +su% chmod 666 /dev/ttyXX + + One risk here is that people can write lots of junk into the + lockfile directory, delete other people's files in the lockfile + directory, and intercept other people's data as it goes in and out + of the tty device. The major danger here would be intercepting a + privileged password. Of course, any user could write a short, + ordinary, unprivileged program to do exactly the same thing if the + tty device was world read/writeable. The other risk as that + telephone calls are not controlled -- anybody on your system can + make them, without having to belong to any particular group, and + this could run up your phone bill. + b. Use groups to regulate access. Normally the lockfile directory and + and the dialout devices will have the same group (such as uucp). + If so, then put everybody who's allowed to dial out into that + group, and make sure that the lockfile directory and the tty + devices have group read AND write permission. Example: + +su% chmod 770 /usr/spool/locks (or whatever the path is) +su% chmod 660 /dev/ttyXX + + User whatever tool is available on your platform to add users to + the appropropriate group (e.g. edit the /etc/group file). + c. Have the superuser change Kermit to run setuid and/or setgid to + the owner and/or group of the lockfile directory and the tty + devices if necessary), typically uucp (see [316]next section), but + NOT root. Example: + +su% chown uucp kermit - or - chgrp uucp kermit +su% chmod u+s kermit (setuid) - or - chmod g+s kermit (setgid) + + and then make sure the lockfile directory, and the tty devices, + have owner (setuid) and/or group (setgid) write permission. For + example: + +su% chmod o+rwx /usr/spool/uucp +su% chown uucp /dev/ttyXX ; chmod 600 /dev/ttyXX + + In some cases, the owner and group must be distinct; the key point + is that read/write access is required to both the UUCP lockfile + directory and the tty itself. + + If you make C-Kermit setuid or setgid to root, it refuses to run: + +Fatal: C-Kermit setuid to root! + + Example: + +crw-r----- 1 uucp uucp 5, 67 Feb 11 06:23 /dev/cua3 +drwxrwxr-x 3 root uucp 1024 Feb 11 06:22 /var/lock + + requires suid uucp to get read/write access on /dev/cua3 and sgid to + get read/write access on /var/lock (since you can't set Kermit's uid + or gid to root). + + The reason Kermit can't be setuid or setgid to root has to do with + the fact that some Unix OS's can't switch user or group IDs in that + case. Unfortunately, the prohibition against making Kermit setuid + or setgid to root means that Unix C-Kermit can't be used to make + rlogin connections by non-root users. (The rlogin port is + privileged, which is why the regular rlogin command is setuid root + -- which is safe because the rlogin program never has to create or + access files like Kermit does.) + + For the lockfile mechanism to achieve its desired purpose -- + prevention of access to the same tty device by more than one process + at a time -- ALL programs on a given computer that open, read or + write, and close tty devices must use the SAME lockfile conventions. + Unfortunately, this is often not the case. Here is a typical example + of how this can go wrong: In SunOS 4.0 and earler, the lockfile + directory was /usr/spool/uucp; in 4.1 it was changed to + /var/spool/locks in the quest for political correctness. Consequently, + any third-party programs (such as C-Kermit) that were not modified to + account for this change, recompiled, and reinstalled, did not use the + same lockfiles as uucp, tip, etc, and so the entire purpose of the + lockfile is defeated. + + What if your Unix system does not have UUCP installed? For example, + you have a Unix workstation, and you do not use uucp, cu, or tip, or + UUCP was not even supplied with your version of Unix (QNX is an + example). In this case, you have two choices: + + a. If there may be more than one person running Kermit at the same + time, competing for the same tty device, then create a special + lockfile directory just for Kermit, for example, + /usr/spool/kermit, and make sure you have read/write access to it. + Then add the following to your makefile target CFLAGS, as shown + earlier: + +-DLOCK_DIR=\\\"/usr/spool/kermit\\\" + + b. If you are the only user on your workstation, and no other + processes will ever be competing with Kermit for the dialout tty + device, then add -DNOUUCP to your makefile target's CFLAGS and + rebuild Kermit. + __________________________________________________________________________ + +11. RUNNING UNIX C-KERMIT SETUID OR SETGID + + [ [317]Top ] [ [318]Contents ] [ [319]Next ] [ [320]Previous ] + + Even if you don't intend to run C-Kermit setuid, somebody else might + come along and chown and chmod it after it has been built. You should + be sure that it is built correctly to run setuid on your system. For + POSIX and AT&T Unix based versions, you don't have to do anything + special. + + For 4.2 and 4.3 BSD-based Unix versions, you normally need not add + anything special to the makefile. The program assumes that the + setreuid() and setregid() functions are available, without which we + cannot switch back and forth between real and effective uids. If + "make" complains that _setreuid or _setregid is/are not defined, add + -DNOSETREU to CFLAGS. In this case it is very likely (but not certain) + that you cannot protect ttys and lockfiles against people and have + them run Kermit setuid. + + If make does not complain about this, you should find out whether your + BSD version (4.3 or other systems like SunOS 4.x that claim to include + BSD 4.3 compatibility) includes the saved-setuid feature (see long + notes under edit 146 in ckc178.upd). If it does, then add -DSAVEDUID + to CFLAGS. + + IMPORTANT NOTE: Most Unix system documentation will not give you + the required information. To determine whether your Unix system + supplies the the saved-original-effective-user/group-id feature, + use the ckuuid.c program. Read and follow the instructions in the + comments at the beginning. + + C-Kermit for 4.4BSD-based systems automatically use sete[ug]id(). See + [321]ckutio.c. + + If you have a version of Unix that is not BSD-based, but which + supplies the setreuid() and setregid() functions, and these are the + only way to switch between real and effective uid, add -DSETREUID to + your makefile target. + + WARNING: There are two calls to access() in [322]ckufio.c, by which + Kermit checks to see if it can create an output file. These calls + will not work correctly when (a)you have installed C-Kermit setuid + or setgid on a BSD-based Unix system, and (b) the + saved-original-effective-uid/gid feature is not present, and (c) + the access() function always checks what it believes to be the real + ID rather than the effective ID. This is the case, for example, in + Olivetti X/OS and in NeXTSTEP. In such cases, you can force correct + operation of access() calls by defining the symbol SW_ACC_ID at + compile time in CFLAGS. + + If you have a version of Unix that does not allow a process to switch + back and forth between its effective and real user and group ids + multiple times, you probably should not attempt to run Kermit setuid, + because once having given up its effective uid or gid (which it must + do in order to transfer files, fork a shell, etc) it can never get it + back, and so it can not use the original effective uid or gid to + create or delete uucp lockfiles. In this case, you'll either have to + set the permissions on your lockfile directory to make them publicly + read/writable, or dispense with locking altogether. + + MORAL: Are you thoroughly sickened and/or frightened by all that you + have just read? You should be. What is the real answer? Simple. Serial + devices -- such as ttys and magnetic tapes -- in Unix should be opened + with exclusive access only, enforced by the Unix kernel. Shared access + has no conceivable purpose, legitimate or otherwise, except by + privileged system programs such as getty. The original design dates + from the late 1960s, when Unix was developed for laboratory use under + a philosophy of trust by people within shouting distance of each other + -- but even then, no useful purpose was served by this particular form + of openness; it was probably more of a political statement. Since the + emergence of Unix from the laboratory into the commercial market, we + have seen every vestige of openness -- but this one -- stripped away. + I'd like to see some influential Unix maker take the bold step of + making the simple kernel change required to enforce exclusive access + to serial devices. (Well, perhaps not so simple when bidirectionality + must also be a goal -- but then other OS's like VMS solved this + problem decades ago.) + __________________________________________________________________________ + +12. CONFIGURING UNIX WORKSTATIONS + + [ [323]Top ] [ [324]Contents ] [ [325]Next ] [ [326]Previous ] + + On desktop workstations that are used by only the user at the console + keyboard, C-Kermit is always used in local mode. But as delivered, + C-Kermit runs in remote mode by default. To put it in local mode at + startup, you can put a SET LINE command in your .mykermrc. + + You can also build C-Kermit to start up in local mode by default. To + do this, include the following in the CFLAGS in your makefile target: + +-DDFTTY=\\\"/dev/ttyxx\\\" + + where ttyxx is the name of the device you will be using for + communications. Presently there is no way of setting the default modem + type at compile time, so use this option only for direct lines. + + C-Kermit does not work well on certain workstations if it is not run + from within a terminal window. For example, you cannot start C-Kermit + on a NeXT by launching it directly from NeXTstep. Similarly for Sun + workstations in the Open Windows environment. Run Kermit in a terminal + window. + __________________________________________________________________________ + +13. BIZARRE BEHAVIOR AT RUNTIME + + [ [327]Top ] [ [328]Contents ] [ [329]Next ] [ [330]Previous ] + + See the "beware file", + + [331]ckubwr.txt, for hints about runtime misbehavior. This section + lists some runtime problems that can be cured by rebuilding C-Kermit. + + The program starts, but there is no prompt, and certain operations + don't work (you see error messages like "Kermit command error in + background execution"). This is because Kermit thinks it is running in + the background. See conbgt() in [332]ckutio.c. Try rebuilding Kermit + with: + + -DPID_T=pid_t + + added to your CFLAGS. If that doesn't help, find out the actual data + type for pids (look in types.h or similar file) and use it in place of + "pid_t", for example: + + -DPID_T=short + + Unexplainable and inappropriate error messages ("Sockets not supported + on this device", etc) have been traced in at least one case to a lack + of agreement between the system header files and the actual kernel. + This happened because the GNU C compiler (gcc) was being used. gcc + wants to have ANSI-C-compliant header files, and so part of the + installation procedure for gcc is (or was) to run a shell script + called "fixincludes", which translates the system's header files into + a separate set of headers that gcc likes. So far so good. Later, a new + version of the operating system is installed and nobody remembers to + run fixincludes again. From that point, any program compiled with gcc + that makes use of header files (particularly ioctl.h) is very likely + to misbehave. Solution: run fixincludes again, or use your system's + regular C compiler, libraries, and header files instead of gcc. + __________________________________________________________________________ + +14. CRASHES AND CORE DUMPS + + [ [333]Top ] [ [334]Contents ] [ [335]Next ] [ [336]Previous ] + + If C-Kermit constitently dumps core at the beginning of a file + transfer, look in SHOW FEATURES for CKREALPATH. If found, rebuild with + -DNOREALPATH and see if that fixes the problem (some UNIXes have + realpath() but it doesn't work). + + Total failure of the Kermit program can occur because of bad memory + references, bad system calls, or problems with dynamic memory + allocation. First, try to reproduce the problem with debugging turned + on: run Kermit with the -d command-line option (for example, "wermit + -d") and then examine the resulting debug.log file. The last entry + should be in the vicinity of the crash. In VMS, a crash automatically + produces a "stack dump" which shows the routine where the crash + occurs. In some versions of Unix, you can get a stack dump with "adb" + -- just type "adb wermit core" and then give the command "$c", then + Ctrl-D to quit (note: replace "wermit" by "kermit" or by the full + pathname of the executable that crashed if it is not in the current + directory). Or use gdb to get a backtrace, etc. + + In edit 186, one implementation, UNISYS 5000/95 built with "make + sys5r3", has been reported to run out of memory very quickly (e.g. + while executing a short initialization file that contains a SET DIAL + DIRECTORY command). Debug logs show that malloc calls are failing, + reason unknown. For this and any other implementation that gives error + messages about "malloc failure" or "memory allocation failure", + rebuild the program *without* the -DDYNAMIC CFLAGS definition, for + example: + +make sys5r3 KFLAGS=-UDYNAMIC + + As of edit 169, C-Kermit includes a malloc() debugging package which + you may link with the Kermit program to catch runtime malloc errors. + See the makefile entries for sunos41md and nextmd for examples of how + to select malloc debugging. Once you have linked Kermit with the + malloc debugger, it will halt with an informative message if a + malloc-related error occurs and, if possible, dump core. For this + reason, malloc-debugging versions of Kermit should be built without + the "-s" link option (which removes symbols, preventing analysis of + the core dump). You have several ways to track down the malloc error: + Analyze the core dump with adb. Or reproduce the problem with "log + debug" and then look at the code around the last debug.log entry. If + you have gcc, build the program with "-g" added to CFLAGS and then + debug it with gdb, e.g. + +gdb wermit +break main +run +.. set other breakpoints or watchpoints +continue + + Watchpoints are especially useful for finding memory leaks, but they + make the program run about a thousand times slower than usual, so + don't set them until the last possible moment. When a watchpoint is + hit, you can use the "where" command to find out which C-Kermit source + statement triggered it. + + If you have the Pure Software Inc "Purify" product, see the sunos41cp + makefile entry for an example of how to use it to debug C-Kermit. + __________________________________________________________________________ + +15. SYSLOGGING + + [ [337]Top ] [ [338]Contents ] [ [339]Next ] [ [340]Previous ] + + "Syslogging" means recording selected in the system log via the Unix + syslog() facility, which is available in most Unix versions. + Syslogging is not done unless C-Kermit is started with: + +--syslog:n + + on the command-line, where n is a number greater than 0 to indicate + the level of syslogging. See [341]Section 4.2 of the [342]IKSD + Administrator's Guide for details. + + Obviously you can't depend on users to include --syslog:3 (or + whatever) on the command line every time they start C-Kermit, so if + you want certain kinds of records to be recorded in the system log, + you can build C-Kermit with forced syslogging at the desired level, + e.g.: + +make linux KFLAGS=-DSYSLOGLEVEL=2 + + Levels 2 and 3 are the most likely candidates for this treatment. + Level 2 forces logging of all successful dialout calls (e.g. for + checking against or phone bills), and level 3 records all connections + (SET LINE or SET HOST / TELNET / RLOGIN, etc) so you can see who is + connecting out from your system, and to where. + + Level 2 and 3 records are equivalent to those in the connection log; + see the [343]C-Kermit 7.0 Supplement) for a detailed description of + the connection log. + __________________________________________________________________________ + +16. BUILDING SECURE VERSIONS OF C-KERMIT 8.0 + + [ [344]Top ] [ [345]Contents ] [ [346]Next ] [ [347]Previous ] + + C-Kermit 7.0 and later may be built with Kerberos(TM) and/or SRP(TM) + (Secure Remote Password) and/or SSL/TLS security for strong + authentication and encryption of Internet connections. These security + methods require external libraries that, in their binary forms, are + restricted from export by USA law. See the [348]Kermit Security + Reference) for details. C-Kermit binaries themselves are likewise + restricted; the C-Kermit binaries that are available for public + download on the Internet are not allowed to contain the security + options. + + Sample makefile entries are provided for Linux and many other + operating systems. A list of secure makefile entries is included in + the Makefile. Complete instructions on building C-Kermit 8.0 with MIT + Kerberos; Secure Remote Password; and/or OpenSSL can be found in the + [349]Kermit Security Reference. + + C-Kermit 8.0 comes with a current list of Certificate Authority + certificates, including one for the Kermit Project that can be used + for authentication to Columbia's [350]Internet Kermit Service (IKSD). + You can use C-Kermit 7.0 or later to access Columbia's IKSD securely + by installing the Kermit Project certificate in + /usr/local/ssl/cert.pem (or the appropriate location based upon the + installation of OpenSSL on your system). You can find a copy of the + certificates file at: + +[351]ftp://kermit.columbia.edu/kermit/c-kermit/ca_certs.pem + __________________________________________________________________________ + +17. INSTALLING C-KERMIT AS AN SSH SERVER SUBSYSTEM + + [ [352]Top ] [ [353]Contents ] [ [354]Previous ] + + This requires C-Kermit 8.0.206 or later and an SSH v2 server. If you + list C-Kermit as a Subsystem in the SSH v2 server configuration file + (as, for example, SFTP is listed), users can make SSH connections + direct to a Kermit server as explained here: + +[355]http://www.columbia.edu/kermit/skermit.html + + The name and location of the SSH server configuration file depends on + your platform, which SSH product(s) you have, etc. C-Kermit itself + must be referred to in this file as "kermit-sshsub". On the host, + install the C-Kermit 8.0.211 binary in the normal way. Then, in the + same directory as the C-Kermit binary, make a symbolic link: + +ln -s kermit kermit-sshsub + + (Note: the "make install" makefile target does this for you.) Then in + the sshd configuration file, add a line: + +Subsystem kermit /some/path/kermit-sshsub + + (where /some/path is the fully specified directory where the symlink + is.) This is similar to the line that sets up the SFTP susbsystem. + Example: + +Subsystem sftp /usr/local/libexec/sftp-server +Subsystem kermit /usr/local/bin/kermit-sshsub + + The mechanics might vary for other SSH servers; "man sshd" for + details. The method shown here is used because the OpenSSH server does + not permit the subsystem invocation to include command-line options. + C-Kermit would have no way of knowing that it should enter Server mode + if it were not called by a special name. + + [ [356]Top ] [ [357]Contents ] [ [358]C-Kermit Home ] [ [359]C-Kermit + 8.0 Overview ] [ [360]Kermit Home ] + _________________________________________________________________ + + + C-Kermit 8.0 Unix Installation Instructions / The Kermit Project / + Columbia University / 10 April 2004 + +References + + 1. http://www.columbia.edu/kermit/ckuins.html#contents + 2. http://www.columbia.edu/kermit/ckermit.html + 3. http://www.columbia.edu/kermit/index.html + 4. http://www.columbia.edu/kermit/ckuins.html + 5. http://www.columbia.edu/kermit/ckuins.html#x0 + 6. http://www.columbia.edu/kermit/ckuins.html#x1 + 7. http://www.columbia.edu/kermit/ckuins.html#x2 + 8. http://www.columbia.edu/kermit/ckuins.html#x3 + 9. http://www.columbia.edu/kermit/ckuins.html#x4 + 10. http://www.columbia.edu/kermit/ckuins.html#x5 + 11. http://www.columbia.edu/kermit/ckuins.html#x6 + 12. http://www.columbia.edu/kermit/ckuins.html#x7 + 13. http://www.columbia.edu/kermit/ckuins.html#x8 + 14. http://www.columbia.edu/kermit/ckuins.html#x9 + 15. http://www.columbia.edu/kermit/ckuins.html#x10 + 16. http://www.columbia.edu/kermit/ckuins.html#x11 + 17. http://www.columbia.edu/kermit/ckuins.html#x12 + 18. http://www.columbia.edu/kermit/ckuins.html#x13 + 19. http://www.columbia.edu/kermit/ckuins.html#x14 + 20. http://www.columbia.edu/kermit/ckuins.html#x15 + 21. http://www.columbia.edu/kermit/ckuins.html#x16 + 22. http://www.columbia.edu/kermit/ckuins.html#x16 + 23. http://www.columbia.edu/kermit/ckuins.html#top + 24. http://www.columbia.edu/kermit/ckuins.html#contents + 25. http://www.columbia.edu/kermit/ckuins.html#x1 + 26. http://www.columbia.edu/kermit/ckccfg.html + 27. http://www.columbia.edu/kermit/ckcbwr.html + 28. http://www.columbia.edu/kermit/ckubwr.html + 29. http://www.columbia.edu/kermit/ckcplm.html + 30. http://www.columbia.edu/kermit/ckuins.html#x2 + 31. http://www.columbia.edu/kermit/x3 + 32. http://www.columbia.edu/kermit/ckuins.html#x4 + 33. http://www.columbia.edu/kermit/ckuins.html#top + 34. http://www.columbia.edu/kermit/ckuins.html#contents + 35. http://www.columbia.edu/kermit/ckuins.html#x2 + 36. http://www.columbia.edu/kermit/ckuins.html#x0 + 37. ftp://kermit.columbia.edu/kermit/archives/cku211.tar.Z + 38. ftp://kermit.columbia.edu/kermit/archives/cku211.tar.gz + 39. ftp://kermit.columbia.edu/kermit/archives/cku211.tar + 40. http://www.columbia.edu/kermit/ckuins.html#x7 + 41. http://www.columbia.edu/kermit/ckuins.html#x5 + 42. http://www.columbia.edu/kermit/ckuins.html#x5 + 43. http://www.columbia.edu/kermit/ckuins.html#x16 + 44. http://www.columbia.edu/kermit/ckuins.html#top + 45. http://www.columbia.edu/kermit/ckuins.html#contents + 46. http://www.columbia.edu/kermit/ckuins.html#x3 + 47. http://www.columbia.edu/kermit/ckuins.html#x1 + 48. http://www.columbia.edu/kermit/ckuins.html#x5 + 49. http://www.columbia.edu/kermit/ckuins.html#X10 + 50. http://www.columbia.edu/kermit/ckuins.html#x11 + 51. http://www.columbia.edu/kermit/ckuins.html#x10 + 52. http://www.columbia.edu/kermit/ckuins.html#x3 + 53. http://www.columbia.edu/kermit/ck80packages.html + 54. http://www.columbia.edu/kermit/ckuins.html#x10 + 55. http://www.columbia.edu/kermit/ckuins.html#top + 56. http://www.columbia.edu/kermit/ckuins.html#contents + 57. http://www.columbia.edu/kermit/ckuins.html#x4 + 58. http://www.columbia.edu/kermit/ckuins.html#x2 + 59. ftp://kermit.columbia.edu/kermit/bin/ + 60. http://www.columbia.edu/kermit/ck80binaries.html + 61. http://www.columbia.edu/kermit/ckuins.html#x7 + 62. http://www.columbia.edu/kermit/ckuins.html#build + 63. http://www.columbia.edu/kermit/ckuins.html#x5 + 64. http://www.columbia.edu/kermit/ckuins.html#x4 + 65. http://www.columbia.edu/kermit/ckuins.html#x4 + 66. mailto:kermit@columbia.edu + 67. http://www.columbia.edu/kermit/ckuins.html#top + 68. http://www.columbia.edu/kermit/ckuins.html#contents + 69. http://www.columbia.edu/kermit/ckuins.html#x5 + 70. http://www.columbia.edu/kermit/ckuins.html#x3 + 71. http://www.columbia.edu/kermit/ckuins.html#x8 + 72. http://www.columbia.edu/kermit/ckuins.html#x9 + 73. ftp://kermit.columbia.edu/kermit/c-kermit/makefile + 74. ftp://kermit.columbia.edu/kermit/c-kermit/ckpker.mk + 75. ftp://kermit.columbia.edu/kermit/c-kermit/ckubsd.mak + 76. http://www.columbia.edu/kermit/ckuins.html#x5 + 77. mailto:kermit-support@columbia.edu + 78. ftp://kermit.columbia.edu/kermit/c-kermit/makefile + 79. http://www.columbia.edu/kermit/ckuins.html#x7 + 80. mailto:kermit-support@columbia.edu + 81. ftp://kermit.columbia.edu/kermit/c-kermit/makefile + 82. http://www.columbia.edu/kermit/ckuins.html#x5.4 + 83. http://www.columbia.edu/kermit/ckuins.html#x10 + 84. http://www.columbia.edu/kermit/ckuins.html#x11 + 85. http://www.columbia.edu/kermit/ckuins.html#x5 + 86. http://www.columbia.edu/kermit/iksd.html + 87. http://www.columbia.edu/kermit/ckuins.html#top + 88. http://www.columbia.edu/kermit/ckuins.html#contents + 89. http://www.columbia.edu/kermit/ckuins.html#x4.1 + 90. http://www.columbia.edu/kermit/ckccfg.html + 91. http://www.columbia.edu/kermit/ckuins.html#x4.1 + 92. http://www.columbia.edu/kermit/ckuins.html#x4.2 + 93. http://www.columbia.edu/kermit/ckuins.html#x4.3 + 94. http://www.columbia.edu/kermit/ckuins.html#x4.4 + 95. http://www.columbia.edu/kermit/ckuins.html#x4.5 + 96. http://www.columbia.edu/kermit/ckccfg.html + 97. http://www.columbia.edu/kermit/ckccfg.html#x8 + 98. http://www.columbia.edu/kermit/iksd.html + 99. http://www.columbia.edu/kermit/iksd.html + 100. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c + 101. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c + 102. mailto:kermit-support@columbia.edu + 103. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c + 104. http://www.columbia.edu/kermit/ckuins.html#x15 + 105. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 106. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c + 107. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 108. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c + 109. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.c + 110. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.c + 111. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 112. ftp://kermit.columbia.edu/kermit/c-kermit/ckcuni.c + 113. mailto:kermit-support@columbia.edu + 114. http://www.columbia.edu/kermit/ckuins.html#top + 115. http://www.columbia.edu/kermit/ckuins.html#contents + 116. http://www.columbia.edu/kermit/ckuins.html#x4 + 117. http://www.columbia.edu/kermit/ckuins.html#x4.2 + 118. http://www.columbia.edu/kermit/ckuins.html#x4.0 + 119. ftp://kermit.columbia.edu/kermit/c-kermit/makefile + 120. ftp://kermit.columbia.edu/kermit/c-kermit/ckubwr.txt + 121. http://www.columbia.edu/kermit/ckubwr.html + 122. ftp://kermit.columbia.edu/kermit/c-kermit/ckwart.c + 123. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.w + 124. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.c + 125. http://www.columbia.edu/kermit/ckuins.html#top + 126. http://www.columbia.edu/kermit/ckuins.html#contents + 127. http://www.columbia.edu/kermit/ckuins.html#x4 + 128. http://www.columbia.edu/kermit/ckuins.html#x4.3 + 129. http://www.columbia.edu/kermit/ckuins.html#x4.1 + 130. http://www.columbia.edu/kermit/ckuins.html#x5 + 131. http://www.columbia.edu/kermit/ckuins.html#top + 132. http://www.columbia.edu/kermit/ckuins.html#contents + 133. http://www.columbia.edu/kermit/ckuins.html#x4 + 134. http://www.columbia.edu/kermit/ckuins.html#x4.4 + 135. http://www.columbia.edu/kermit/ckuins.html#x4.2 + 136. http://www.columbia.edu/kermit/ckuins.html#top + 137. http://www.columbia.edu/kermit/ckuins.html#contents + 138. http://www.columbia.edu/kermit/ckuins.html#x4 + 139. http://www.columbia.edu/kermit/ckuins.html#x4.5 + 140. http://www.columbia.edu/kermit/ckuins.html#x4.3 + 141. ftp://kermit.columbia.edu/kermit/c-kermit/ckpker.mk + 142. http://www.columbia.edu/kermit/ckuins.html#top + 143. http://www.columbia.edu/kermit/ckuins.html#contents + 144. http://www.columbia.edu/kermit/ckuins.html#x4 + 145. http://www.columbia.edu/kermit/ckuins.html#x4.4 + 146. ftp://kermit.columbia.edu/kermit/c-kermit/makefile + 147. ftp://kermit.columbia.edu/kermit/c-kermit/makefile + 148. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.w + 149. http://www.columbia.edu/kermit/ckuins.html#top + 150. http://www.columbia.edu/kermit/ckuins.html#contents + 151. http://www.columbia.edu/kermit/ckuins.html#x6 + 152. http://www.columbia.edu/kermit/ckuins.html#x4 + 153. http://www.columbia.edu/kermit/ckuins.html#x5.1 + 154. http://www.columbia.edu/kermit/ckuins.html#x5.2 + 155. http://www.columbia.edu/kermit/ckuins.html#x5.3 + 156. http://www.columbia.edu/kermit/ckuins.html#x5.4 + 157. http://www.columbia.edu/kermit/ + 158. http://www.columbia.edu/kermit/ckuins.html#x5.4 + 159. http://www.columbia.edu/kermit/ckuins.html#x5.3 + 160. ftp://kermit.columbia.edu/kermit/c-kermit/COPYING.TXT + 161. ftp://kermit.columbia.edu/kermit/c-kermit/ckermit.ini + 162. http://www.columbia.edu/kermit/ckuins.html#x5.1 + 163. ftp://kermit.columbia.edu/kermit/c-kermit/ckermod.ini + 164. ftp://kermit.columbia.edu/kermit/c-kermit/ckermit70.txt + 165. http://www.columbia.edu/kermit/ck60manual + 166. http://www.columbia.edu/kermit/ckermit70.html + 167. ftp://kermit.columbia.edu/kermit/c-kermit/ckermit80.txt + 168. http://www.columbia.edu/kermit/ck60manual + 169. http://www.columbia.edu/kermit/ckermit80.html + 170. ftp://kermit.columbia.edu/kermit/c-kermit/ckcbwr.txt + 171. http://www.columbia.edu/kermit/ckcbwr.html + 172. ftp://kermit.columbia.edu/kermit/c-kermit/ckubwr.txt + 173. http://www.columbia.edu/kermit/ckubwr.html + 174. ftp://kermit.columbia.edu/kermit/c-kermit/ckuins.txt + 175. http://www.columbia.edu/kermit/ckuins.html + 176. ftp://kermit.columbia.edu/kermit/c-kermit/ckccfg.txt + 177. http://www.columbia.edu/kermit/ckccfg.html + 178. ftp://kermit.columbia.edu/kermit/c-kermit/ckcplm.txt + 179. http://www.columbia.edu/kermit/ckcplm.html + 180. ftp://kermit.columbia.edu/kermit/c-kermit/ca_certs.pem + 181. http://www.columbia.edu/kermit/ckuins.html#x16" + 182. ftp://kermit.columbia.edu/kermit/c-kermit/makefile + 183. http://www.columbia.edu/kermit/ckuins.html#x? + 184. http://www.columbia.edu/kermit/ckuins.html#x11 + 185. http://www.columbia.edu/kermit/ckuins.html#x5.2 + 186. http://www.columbia.edu/kermit/ckermit.html#download + 187. http://www.columbia.edu/kermit/ck80binaries.html + 188. http://www.columbia.edu/kermit/ckermit.html#download + 189. http://www.columbia.edu/kermit/ckuins.html#top + 190. http://www.columbia.edu/kermit/ckuins.html#contents + 191. http://www.columbia.edu/kermit/ckuins.html#x7 + 192. http://www.columbia.edu/kermit/ckuins.html#x5 + 193. http://www.columbia.edu/kermit/ckuins.html#top + 194. http://www.columbia.edu/kermit/ckuins.html#contents + 195. http://www.columbia.edu/kermit/ckuins.html#x8 + 196. http://www.columbia.edu/kermit/ckuins.html#x6 + 197. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 198. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 199. http://www.columbia.edu/kermit/ckuins.html#x4.0 + 200. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h + 201. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c + 202. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c + 203. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 204. http://www.columbia.edu/kermit/ckuins.html#x10 + 205. http://www.columbia.edu/kermit/ckccfg.html#x2 + 206. http://www.columbia.edu/kermit/ckccfg.html + 207. http://www.columbia.edu/kermit/ckuins.html#x4 + 208. http://www.columbia.edu/kermit/ckuins.html#x10 + 209. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 210. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 211. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 212. http://www.columbia.edu/kermit/ckuins.html#x9.4 + 213. mailto:kermit-support@columbia.edu + 214. http://www.columbia.edu/kermit/ckuins.html#top + 215. http://www.columbia.edu/kermit/ckuins.html#contents + 216. http://www.columbia.edu/kermit/ckuins.html#x9 + 217. http://www.columbia.edu/kermit/ckuins.html#x7 + 218. http://www.columbia.edu/kermit/ckccfg.html + 219. http://www.columbia.edu/kermit/ckccfg.html + 220. http://www.columbia.edu/kermit/ckuins.html#top + 221. http://www.columbia.edu/kermit/ckuins.html#contents + 222. http://www.columbia.edu/kermit/ckuins.html#x10 + 223. http://www.columbia.edu/kermit/ckuins.html#x8 + 224. http://www.columbia.edu/kermit/ckuins.html#x9.1 + 225. http://www.columbia.edu/kermit/ckuins.html#x9.1.1 + 226. http://www.columbia.edu/kermit/ckuins.html#x9.1.2 + 227. http://www.columbia.edu/kermit/ckuins.html#x9.1.3 + 228. http://www.columbia.edu/kermit/ckuins.html#x9.2 + 229. http://www.columbia.edu/kermit/ckuins.html#x9.3 + 230. http://www.columbia.edu/kermit/ckuins.html#x9.4 + 231. http://www.columbia.edu/kermit/ckuins.html#x9.5 + 232. http://www.columbia.edu/kermit/ckuins.html#x9.6 + 233. http://www.columbia.edu/kermit/ckuins.html#x9.7 + 234. http://www.columbia.edu/kermit/ckuins.html#x9.8 + 235. http://www.columbia.edu/kermit/ckuins.html#x9.9 + 236. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 237. http://www.columbia.edu/kermit/ckuins.html#top + 238. http://www.columbia.edu/kermit/ckuins.html#x9 + 239. http://www.columbia.edu/kermit/ckuins.html#contents + 240. http://www.columbia.edu/kermit/ckuins.html#x9.2 + 241. http://www.columbia.edu/kermit/ckuins.html#x9.1.1 + 242. http://www.columbia.edu/kermit/ckuins.html#x9.1.2 + 243. http://www.columbia.edu/kermit/ckuins.html#x9.1.3 + 244. http://www.columbia.edu/kermit/ckuins.html#top + 245. http://www.columbia.edu/kermit/ckuins.html#contents + 246. http://www.columbia.edu/kermit/ckuins.html#x9 + 247. http://www.columbia.edu/kermit/ckuins.html#x9.1 + 248. http://www.columbia.edu/kermit/ckuins.html#x9.1.3 + 249. http://www.columbia.edu/kermit/ckuins.html#x9.1.1 + 250. http://www.columbia.edu/kermit/ckuins.html#top + 251. http://www.columbia.edu/kermit/ckuins.html#contents + 252. http://www.columbia.edu/kermit/ckuins.html#x9 + 253. http://www.columbia.edu/kermit/ckuins.html#x9.1 + 254. http://www.columbia.edu/kermit/ckuins.html#x9.2 + 255. http://www.columbia.edu/kermit/ckuins.html#x9.1.2 + 256. http://www.opengroup.org/onlinepubs/007904975/ + 257. http://www.columbia.edu/kermit/ckuins.html#x9.1.1 + 258. http://www.columbia.edu/kermit/ckuins.html#top + 259. http://www.columbia.edu/kermit/ckuins.html#contents + 260. http://www.columbia.edu/kermit/ckuins.html#x9 + 261. http://www.columbia.edu/kermit/ckuins.html#x9.1 + 262. http://www.columbia.edu/kermit/ckuins.html#x9.3 + 263. http://www.columbia.edu/kermit/ckuins.html#x9.1 + 264. http://www.columbia.edu/kermit/ckuins.html#top + 265. http://www.columbia.edu/kermit/ckuins.html#contents + 266. http://www.columbia.edu/kermit/ckuins.html#x9 + 267. http://www.columbia.edu/kermit/ckuins.html#x9.4 + 268. http://www.columbia.edu/kermit/ckuins.html#x9.2 + 269. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c + 270. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 271. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c + 272. http://www.columbia.edu/kermit/ckuins.html#top + 273. http://www.columbia.edu/kermit/ckuins.html#contents + 274. http://www.columbia.edu/kermit/ckuins.html#x9 + 275. http://www.columbia.edu/kermit/ckuins.html#x9.5 + 276. http://www.columbia.edu/kermit/ckuins.html#x9.3 + 277. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 278. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h + 279. http://www.columbia.edu/kermit/ckuins.html#top + 280. http://www.columbia.edu/kermit/ckuins.html#contents + 281. http://www.columbia.edu/kermit/ckuins.html#x9 + 282. http://www.columbia.edu/kermit/ckuins.html#x9.6 + 283. http://www.columbia.edu/kermit/ckuins.html#x9.4 + 284. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h + 285. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus3.c + 286. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 287. http://www.columbia.edu/kermit/ckuins.html#top + 288. http://www.columbia.edu/kermit/ckuins.html#contents + 289. http://www.columbia.edu/kermit/ckuins.html#x9 + 290. http://www.columbia.edu/kermit/ckuins.html#x9.7 + 291. http://www.columbia.edu/kermit/ckuins.html#x9.5 + 292. http://www.columbia.edu/kermit/ckuins.html#top + 293. http://www.columbia.edu/kermit/ckuins.html#contents + 294. http://www.columbia.edu/kermit/ckuins.html#x9 + 295. http://www.columbia.edu/kermit/ckuins.html#x9.8 + 296. http://www.columbia.edu/kermit/ckuins.html#x9.6 + 297. http://www.columbia.edu/kermit/ckuins.html#top + 298. http://www.columbia.edu/kermit/ckuins.html#contents + 299. http://www.columbia.edu/kermit/ckuins.html#x9 + 300. http://www.columbia.edu/kermit/ckuins.html#x9.9 + 301. http://www.columbia.edu/kermit/ckuins.html#x9.7 + 302. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 303. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 304. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h + 305. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c + 306. http://www.columbia.edu/kermit/ckuins.html#top + 307. http://www.columbia.edu/kermit/ckuins.html#contents + 308. http://www.columbia.edu/kermit/ckuins.html#x9 + 309. http://www.columbia.edu/kermit/ckuins.html#x10 + 310. http://www.columbia.edu/kermit/ckuins.html#x9.8 + 311. http://www.columbia.edu/kermit/ckuins.html#top + 312. http://www.columbia.edu/kermit/ckuins.html#contents + 313. http://www.columbia.edu/kermit/ckuins.html#x11 + 314. http://www.columbia.edu/kermit/ckuins.html#x9 + 315. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 316. http://www.columbia.edu/kermit/ckuins.html#x11 + 317. http://www.columbia.edu/kermit/ckuins.html#top + 318. http://www.columbia.edu/kermit/ckuins.html#contents + 319. http://www.columbia.edu/kermit/ckuins.html#x12 + 320. http://www.columbia.edu/kermit/ckuins.html#x10 + 321. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 322. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c + 323. http://www.columbia.edu/kermit/ckuins.html#top + 324. http://www.columbia.edu/kermit/ckuins.html#contents + 325. http://www.columbia.edu/kermit/ckuins.html#x13 + 326. http://www.columbia.edu/kermit/ckuins.html#x11 + 327. http://www.columbia.edu/kermit/ckuins.html#top + 328. http://www.columbia.edu/kermit/ckuins.html#contents + 329. http://www.columbia.edu/kermit/ckuins.html#x14 + 330. http://www.columbia.edu/kermit/ckuins.html#x12 + 331. ftp://kermit.columbia.edu/kermit/c-kermit/ckubwr.txt + 332. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c + 333. http://www.columbia.edu/kermit/ckuins.html#top + 334. http://www.columbia.edu/kermit/ckuins.html#contents + 335. http://www.columbia.edu/kermit/ckuins.html#x15 + 336. http://www.columbia.edu/kermit/ckuins.html#x13 + 337. http://www.columbia.edu/kermit/ckuins.html#top + 338. http://www.columbia.edu/kermit/ckuins.html#contents + 339. http://www.columbia.edu/kermit/ckuins.html#x16 + 340. http://www.columbia.edu/kermit/ckuins.html#x14 + 341. http://www.columbia.edu/kermit/iksd.html#x4.2 + 342. http://www.columbia.edu/kermit/iksd.html + 343. http://www.columbia.edu/kermit/ckermit2.html + 344. http://www.columbia.edu/kermit/ckuins.html#top + 345. http://www.columbia.edu/kermit/ckuins.html#contents + 346. http://www.columbia.edu/kermit/ckuins.html#x17 + 347. http://www.columbia.edu/kermit/ckuins.html#x15 + 348. http://www.columbia.edu/kermit/security.html + 349. http://www.columbia.edu/kermit/security80.html + 350. http://www.columbia.edu/kermit/cuiksd.html + 351. ftp://kermit.columbia.edu/kermit/c-kermit/ca_certs.pem + 352. http://www.columbia.edu/kermit/ckuins.html#top + 353. http://www.columbia.edu/kermit/ckuins.html#contents + 354. http://www.columbia.edu/kermit/ckuins.html#x16 + 355. http://www.columbia.edu/kermit/skermit.html + 356. http://www.columbia.edu/kermit/ckuins.html#top + 357. http://www.columbia.edu/kermit/ckuins.html#contents + 358. http://www.columbia.edu/kermit/ckermit.html + 359. http://www.columbia.edu/kermit/ck80.html + 360. http://www.columbia.edu/kermit/index.html diff --git a/ckututor.txt b/ckututor.txt new file mode 100644 index 0000000..9448126 --- /dev/null +++ b/ckututor.txt @@ -0,0 +1,1959 @@ + +C-KERMIT 8.0 UNIX MANUAL PAGE AND TUTORIAL + + Frank da Cruz, Christine M. Gianone + [1]The Kermit Project, [2]Columbia University + + [ [3]PDF version ] [ [4]Nroff version ] + + This document is intended to give the beginner sufficient + information to make basic (if not advanced) use of C-Kermit 8.0. + Although it might be rather long for a Unix manual page (about 1600 + lines), it's still far shorter than the C-Kermit manual, which + should be consulted for advanced topics such as customization, + character-sets, scripting, etc. We also attempt to provide a clear + structural overview of C-Kermit's many capabilities, functional + areas, states, and modes and their interrelation, that should be + helpful to beginners and veterans alike, as well as to those + upgrading to the new release. + + Most recent update: 24 October 2002 + ________________________________________________________________________ + + CONTENTS + * [5]DESCRIPTION + * [6]SYNOPSIS + * [7]OPTIONS + * [8]COMMAND LANGUAGE + * [9]INITIALIZATION FILE + * [10]MODES OF OPERATION + * [11]MAKING CONNECTIONS + * [12]TRANSFERRING FILES WITH KERMIT + * [13]KERMIT CLIENT/SERVER CONNECTIONS + * [14]KERMIT'S BUILT-IN FTP AND HTTP CLIENTS + * [15]INTERNET KERMIT SERVICE + * [16]SECURITY + * [17]ALTERNATIVE COMMAND-LINE PERSONALITIES + * [18]LICENSE + * [19]OTHER TOPICS + * [20]DOCUMENTATION AND UPDATES + * [21]FILES + * [22]AUTHORS + _________________________________________________________________ + + DESCRIPTION [ [23]Top ] [ [24]Contents ] [ [25]Next ] + + [26]C-Kermit is an all-purpose communications software package from + the [27]Kermit Project at [28]Columbia University that: + + * Is portable to many platforms, Unix and non-Unix alike. + * Can make both serial and network connections. + * Can conduct interactive terminal sessions over its connection. + * Can transfer text or binary files over the same connection. + * Can convert text-file character sets in terminal mode or file + transfer. + * Is customizable in every aspect of its operation. + + C-Kermit is a modem program, a Telnet client, an Rlogin client, an FTP + client, an HTTP client, and on selected platforms, also an X.25 + client. It can make its own secure Internet connections using + IETF-approved security methods including Kerberos IV, Kerberos V, + SSL/TLS, and SRP and it can also make SSH (Secure Shell) connections + through your external SSH client application. It can be the far-end + file-transfer or client/server partner of your desktop Kermit client. + It can also accept incoming dialed and network connections. It can + even be installed as an Internet service on its own standard TCP + socket, 1649 [[29]RFC2839, [30]RFC2840]. + + And perhaps most important, everything you can do "by hand" + (interactively) with C-Kermit, can be "scripted" (automated) using its + built-in cross-platform transport-independent script programming + language, which happens to be identical to its interactive command + language. + + This manual page offers an overview of C-Kermit 8.0 for Unix ("Unix" + is an operating system family that includes AIX, DG/UX, FreeBSD, + HP-UX, IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Open Server, Open Unix, + QNX, Solaris, SunOS, System V R3, System V R4, Tru64 Unix, Unixware, + Xenix, and many others). For thorough coverage, please consult the + published C-Kermit manual and supplements (see [31]DOCUMENTATION + below). For further information about C-Kermit, Kermit software for + other platforms, and Kermit manuals, visit the Kermit Project website: + + [32]http://www.columbia.edu/kermit/ + + This is a longer-than-average manual page, and yet it barely scratches + the surface. Don't be daunted. C-Kermit is a large and complex + package, evolving over decades of practice and experience, but that + doesn't mean it's hard to learn or use. Its most commonly used + functions are explained here with pointers to additional information + elsewhere. + + [ [33]Kermit Home ] [ [34]C-Kermit Home ] [ [35]C-Kermit FAQ ] + ________________________________________________________________________ + + SYNOPSIS [ [36]Top ] [ [37]Contents ] [ [38]Next ] [ [39]Previous ] + + Usage: kermit [filename] [-x arg [-x arg]...[-yyy]..] [ {=,--,+} text + ] ] + Or: kermit URL + + * -x is an option requiring an argument; + * -y is an option with no argument. + + If the first command-line argument is the name of a file, + interactive-mode commands are executed from the file. The '=' (or + "--") argument tells Kermit not to parse the remainder of the command + line, but to make the words following '=' available as \%1, \%2, ... + \%9. The "+" argument is like "=" but for use in "kerbang scripts" + (explained [40]below). A second command-line format allows the one and + only argument to be a [41]Telnet, FTP, HTTP, or IKSD URL. + + Order of execution: + + 1. [42]The command file (if any). + 2. [43]The initialization file, if any, unless suppressed with -Y. + 3. [44]The customization file (if it is executed by the + initialization file). + 4. [45]The command-line URL (if any, and if so, execution stops + here). + 5. [46]Command-line options (if any). + 6. [47]Interactive commands. + + Some command-line options can cause actions (such as -s to send a + file); others just set parameters. If any action options are included + on the command line, Kermit exits when finished unless also given the + -S ("stay") option. If no action options are given, no initialization + or command files contained an EXIT or QUIT command, and no fatal + errors occurred, Kermit issues its prompt and waits for you to type + commands. + + Bear in mind that C-Kermit can be built with selected features + disabled, and also that certain features are not available on all + platforms. For example, C-Kermit can't be built with TCP/IP support + on a platform that does not have TCP/IP header files and libraries + (and even if Kermit does include TCP/IP support, it can't be used + to make TCP/IP connections on a computer that does not have a + TCP/IP stack installed). If your version of C-Kermit lacks a + feature mentioned here, use its SHOW FEATURES command to see what + might have been excluded. + + C-Kermit has three kinds of commands: regular single-letter + command-line options, extended-format command-line options, and + interactive commands. + + [ [48]Kermit Home ] [ [49]C-Kermit Home ] [ [50]C-Kermit FAQ ] + ________________________________________________________________________ + + OPTIONS [ [51]Top ] [ [52]Contents ] [ [53]Next ] [ [54]Previous ] + + Like most Unix commands, C-Kermit can be be given options on the + command line. But C-Kermit also can be used interactively by giving it + [55]commands composed of words, which are more intuitive than cryptic + command-line options, and more flexible too. In other words, you don't + have to use C-Kermit's command-line options, but they are available if + you want to. (By the same token, you don't have to use its interactive + commands either -- you can use either or both in any combination.) + + C-Kermit is generally installed in the PATH as "kermit", and therefore + is invoked by typing the word "kermit" (lowercase) at the shell + prompt, and then pressing the Return or Enter key. If you wish to + include command-line options, put them after the word "kermit" but + before pressing Return or Enter, separated by spaces, for example: + + $ kermit -s ckermit.tar.gz + + ('$' is the shell prompt; "kermit -s ckermit.tar.gz" is what you type, + followed by Return or Enter.) + + Here is a list of C-Kermit's single-letter command-line options, which + start with a single dash (-), in ASCII ("alphabetical") order. + Alphabetic case is significant (-A is not the same as -a). The Action? + column contains Y for action options and N for non-action options. + Option Action? Description + -0 N (digit zero) 100% transparent Connect state for "in-the-middle" + operation: 8 bits, no parity, no escape character, everything passes + through. + -8 N (digit eight) Connection is 8-bit clean (this is the default in + C-Kermit 8.0). Equivalent to the EIGHTBIT command, which in turn is a + shortcut for SET TERMINAL BYTESIZE 8, SET COMMAND BYTESIZE 8, SET + PARITY NONE. + -9 arg N (digit nine) Make a connection to an FTP server. Equivalent + to the FTP OPEN command. + Argument: IP-address-or-hostname[:optional-TCP-port]. + NOTE: C-Kermit also has a separate FTP command-line personality, with + regular FTP-like command-line syntax. [56]More about this below. + -A N Kermit is to be started as an Internet service (IKSD) (only from + inetd.conf). + -B N Kermit is running in Batch or Background (no controlling + terminal). To be used in case Kermit doesn't automatically sense its + background status. Equivalent to the SET BACKGROUND ON command. + -C arg N Interactive-mode Commands to be executed. + Argument: Commands separated by commas, list in doublequotes. + -D arg N Delay before starting to send in Remote mode. Equivalent to + the SET DELAY command. + Argument: Number of seconds. + -E N Exit automatically when connection closes. Equivalent to SET EXIT + ON-DISCONNECT ON. + -F arg N Use an open TCP connection. + Argument: Numeric file descriptor of open TCP connection. + Also see: -j, -J. + -G arg Y Get file(s) from server, send contents to standard output, + which normally would be piped to another process. + Argument: Remote file specification, in quotes if it contains + metacharacters. + Also see: -g, -k. + -H N Suppress program startup Herald and greeting. + -I N Tell Kermit it has a reliable connection, to force streaming to + be used where it normally would not be. Equivalent to the SET RELIABLE + ON command. + -J arg N "Be like Telnet." Like -j but implies -E. + Argument: IP hostname/address optionally followed by service. + NOTE: C-Kermit also has a separate Telnet command-line personality, + with regular Telnet-like command-line syntax. [57]More about this + below. + -L N Recursive directory descent for files in -s option. + -M arg N My user name (for use with Telnet, Rlogin, FTP, etc). + Equivalent to the SET LOGIN USER command. + Argument: Username string. + -O Y (Uppercase letter O) Be a server for One command only. Also see: + -x. + -P N Don't convert file (Path) names of transferred files. Equivalent + to SET FILE NAMES LITERAL. + -Q N Quick Kermit protocol settings. Equivalent to the FAST command. + This is the default in C-Kermit 7.0 and later. + -R N Remote-only (this just makes IF REMOTE true). + -S N Stay (enter command parser after action options). + -T N Force Text mode for file transfer; implies -V. Equivalent to SET + TRANSFER MODE MANUAL, SET FILE TYPE TEXT. + -V N Disable automatic per-file text/binary switching. Equivalent to + SET TRANSFER MODE MANUAL. + -Y N Skip (don't execute) the initialization file. + -a arg N As-name for file(s) in -s, -r, or -g. + Argument: As-name string (alternative filename). When receiving files, + this can be a directory name. + -b arg N Speed for serial device. Equivalent to SET SPEED. + Argument: Numeric Bits per second for serial connections. + -c Y Enter Connect state before transferring files. + -d N Create a debug.log file with detailed debugging information (a + second -d adds timestamps). Equivalent to LOG DEBUG but takes effect + sooner. + -e arg N Maximum length for incoming Kermit file-transfer packets. + Equivalent to SET RECEIVE PACKET-LENGTH. + Argument: Length in bytes. + -f Y Send a FINISH command to a Kermit server. + -g arg N Get file(s) from a Kermit server. + Argument: File specification on other computer, in quotes if it + contains metacharacters. Equivalent to GET. + Also see: -a, -G, -r. + -h Y Print Help text for single-letter command-line options (pipe thru + 'more' to prevent scrolling). + -i N Force binary (Image) mode for file transfer; implies -V. + Equivalent to SET TRANSFER MODE MANUAL, SET FILE TYPE BINARY. + -j arg N Make a TCP/IP connection. + Argument: IP host name/address and optional service name or number. + Equivalent to the TELNET command. + Also see: -J, -F. + -k Y Receive file(s) to standard output, which normally would be piped + to another process. + Also see: -r, -G. + -l arg N (Lowercase letter L) Make a connection on the given serial + communications device. Equivalent to the SET LINE (SET PORT) command. + Argument: Serial device name, e.g. /dev/ttyS0. + -m arg N Modem type for use with the -l device. Equivalent to the SET + MODEM TYPE command. + Argument: Modem name as in SET MODEM TYPE command, e.g. "usrobotics". + -n Y Enter Connect state after transferring files (historical). + -p arg N Parity. Equivalent to the SET PARITY command. + Argument: One of the following: e(ven), o(dd), m(ark), n(one), + s(pace). + -q N Quiet (suppress most messages). Equivalent to SET QUIET ON. + -r Y Receive file(s). Equivalent to the RECEIVE command. + Argument: (none, but see -a) + -s arg N Send file(s). + Argument: One or more local file specifications. Equivalent to the + SEND command. + Also see: -a. + -t N (Historical) Xon (Ctrl-Q) Turnaround character for half-duplex + connections (used on serial linemode connections to old mainframes). + Equivalent to SET DUPLEX HALF, SET HANDSHAKE XON. + -v arg N Window size for Kermit protocol (ignored when streaming). + Equivalanet to SET WINDOW-SIZE. + Argument: Number, 1 to 32. + -w N Incoming files Write over existing files. Equivalent to SET FILE + COLLISION OVERWRITE. + -x Y Enter server mode. Equivalent to the SERVER command. Also see: + -O. + -y arg N Alternative initialization file. + Argument: Filename. + -z N Force foreground behavior. To be used in case Kermit doesn't + automatically sense its foreground status. Equivalent to the SET + BACKGROUND OFF command. + + Extended command-line options (necessary because single-letter ones + are about used up) start with two dashes (--), with words rather than + single letters as option names. If an extended option takes an + argument, it is separated from the option word by a colon (:). + Extended options include: + Option Description + --bannerfile:filename File to display upon startup or IKSD login. + --cdfile:filename File to be sent for display to the client when + server changes directory (filename is relative to the changed-to + directory). + --cdmessage:{on,off} Enable/disable the server CD message feature. + --help Prints usage message for extended options. + --helpfile:filename Designates a file containing custom text to + replace the top-level HELP command. + --nointerrupts Disables keyboard interrupts. + --noperms Disables the Kermit protocol file Permissions attribute, to + prevent transmission of file permissions (protection) from sender to + receiver. + + Plus several other [58]IKSD-Only options. + + See the [59]file-transfer section for examples of command-line + invocation. + ________________________________________________________________________ + + COMMAND LANGUAGE [ [60]Top ] [ [61]Contents ] [ [62]Next ] [ [63]Previous ] + + * [64]Command Files, Macros, and Scripts + * [65]Command List + + C-Kermit's interactive command language is the subject of a + [66]622-page book and another several hundred pages of updates, far + too much for a manual page. But it's not hard to get started. At the + shell prompt, just type "kermit" to get C-Kermit's interactive command + prompt: + + $ kermit + (/current/directory) C-Kermit> + + Begin by typing "help" (and then press the Return or Enter key) for a + top-level overview, read it, and go from there. Your second command + should probably be "intro" (introduction). Note the prompt shows your + current directory (unless you tell Kermit to prompt you with something + else). + + Interactive commands are composed mainly of regular English words, + usually in the form of imperative sentences, such as: + + send oofa.txt + + which tells Kermit to send (transfer) the file whose name is oofa.txt, + or: + + set transfer mode automatic + + which sets Kermit's "transfer mode" to "automatic" (whatever that + means). + + While typing commands, you can abbreviate, ask for help (by pressing + the "?" key anywhere in a command), complete keywords or filenames + (with the Tab or Esc key), and edit your typing with Backspace or + Delete, Ctrl-W, Ctrl-U, etc. You can also recall previous commands, + save your command history, and who knows what else. Give the INTRO + command for details. + + C-Kermit has hundreds of commands, and they can be issued in infinite + variety and combinations, including commands for: + + * Making connections (SET LINE, DIAL, TELNET, SSH, FTP, CONNECT, + ...) + * Breaking connections (HANGUP, CLOSE) + * Transferring files (SEND, GET, RECEIVE, MOVE, RESEND, ...) + * Establishing preferences (SET) + * Displaying preferences (SHOW) + * Managing local files (CD, DELETE, MKDIR, DIRECTORY, RENAME, TYPE, + ...) + * Managing remote files (RCD, RDEL, RMKDIR, RDIR, ...) + * Using local files (FOPEN, FCLOSE, FREAD, FWRITE) + * Programming (TAKE, DEFINE, IF, FOR, WHILE, SWITCH, DECLARE, ...) + * Interacting with the user (ECHO, ASK, ...) + * Interacting with a remote computer (INPUT, OUTPUT, ...) + * Interacting with local programs (RUN, EXEC, PTY, ...) + * Logging things (LOG SESSION, LOG PACKETS, LOG DEBUG, ...) + + And of course QUIT or EXIT to get out and HELP to get help, and for + programmers: loops, decision making, variables, arrays, associative + arrays, integer and floating point arithmetic, macros, built-in and + user-defined functions, string manipulation, pattern matching, block + structure, scoping, recursion, and all the rest. To get a list of all + C-Kermit's commands, type a question mark (?) at the prompt. To get a + description of any command, type HELP followed by the name of the + command, for example: + + help send + + The command interruption character is Ctrl-C (hold down the Ctrl key + and press the C key). + + The command language "escape character", used to introduce variable + names, function invocations, and so on, is backslash (\). If you need + to include a literal backslash in a command, type two of them, e.g.: + + get c:\\k95\\k95custom.ini + + Command Files, Macros, and Scripts + + A file containing Kermit commands is called a Kermit command file or + Kermit script. It can be executed with Kermit's TAKE command: + + (/current/dir) C-Kermit> take commandfile + + (where "commandfile" is the name of the command file). Please don't + pipe a command file into Kermit's standard input (which might or might + not work); if you have Kermit commands in a file, tell Kermit to TAKE + the file. + + In Unix only, a Kermit command file can also be executed directly by + including a "kerbang" line as the first line of the file: + + #!/usr/local/bin/kermit + + + That is, a top line that starts with "#!", followed immediately by the + full path of the Kermit executable, and then, if the Kermit script is + to be given arguments on the command line, a space and a plus sign. + The script file must also have execute permission: + + chmod +x commandfile + + Except for the " +" part, this is exactly the same as you would do for + a shell script, a Perl script, etc. Here's a simple but useless + example script that regurgitates its arguments (up to three of them): + + #!/usr/local/bin/kermit + + if defined \%1 echo "Argument 1: \%1" + if defined \%2 echo "Argument 2: \%2" + if defined \%3 echo "Argument 3: \%3" + if defined \%4 echo "etc..." + exit + + If this file is stored in your current directory as "commandfile", + then: + + ./commandfile one two three four five + + prints: + + Argument 1: one + Argument 2: two + Argument 3: three + etc... + + This illustrates the basic structure of a standalone Kermit script: + the "kerbang line", then some commands. It should end with "exit" + unless you want the Kermit prompt to appear when it is finished. \%1 + is the first argument, \%2 the second, and so on. + + You can also create your own commands by defining named macros + composed of other Kermit commands (or macros). Here's a simple + example: + + define mydial { + set modem type usrobotics + set port /dev/ttyS0 + if fail end 1 + set speed 57600 + dial \%1 + if success connect + } + + This shows how you can combine many commands into one command, + "mydial" in this case (you can use any name you like, provided it does + not clash with the name of a built-in command). When this macro + definition is in effect, you can type commands like: + + mydial 7654321 + + and it executes all the commands in macro definition, substituting the + first operand ("7654321") for the formal parameter ("\%1") in the + definition. This saves you from having to type lots of commands every + time you want to make a modem call. + + One way to have the macro definition in effect is to type the + definition at the Kermit prompt. Another way is to store the + definition in a file and TAKE the file. If you want the the definition + to be in effect automatically every time you start Kermit, put the + definition in your initialization or customization file (explained + [67]below). + + Here's a somewhat more ambitious example: + + define mydelete { + local trash + assign trash \v(home)trashcan/ + if not defined \%1 end 1 "Delete what?" + if wild \%1 end 1 "Deleting multiple files is too scary" + if not exist \%1 end 1 "I can't find \%1" + if not directory \m(trash) { + mkdir \m(trash) + if fail end 1 "No trash can" + } + rename /list \%1 \m(trash) + } + define myundelete { + local trash + assign trash \v(home)trashcan/ + if not defined \%1 end 1 "Undelete what?" + if wild \%1 end 1 "Undeleting multiple files is too hard" + if not directory \m(trash) end 1 "No trash can" + if not exist \m(trash)\%1 end 1 "I can't find \%1 in trash can" + rename /list \m(trash)\%1 . + } + + These macros are not exactly production quality (they don't handle + filenames that include path segments, they don't handle multiple + files, etc), but you get the idea: you can pass arguments to macros, + they can check them and make other kinds of decisions, and the + commands themselves are relatively intuitive and intelligible. + + If you put the above lines into your initialization or customization + file, you'll have MYDELETE and MYUNDELETE commands available every + time you start Kermit, at least as long as you don't suppress + execution of the initialization file. (Exercise for the reader: Make + these macros generally useful: remove limitations, add trashcan + display, browsing, emptying, etc.) + + Kerbang scripts execute without the initialization file. This to keep + them portable and also to make them start faster. If you want to write + Kerbang scripts that depend on the initialization file, include the + command + + take \v(home).kermrc + + at the desired spot in the script. By the way, \v(xxx) is a built-in + variable (xxx is the variable name, "home" in this case). To see what + built-in variables are available, type "show variables" at the + C-Kermit prompt. To see what else you can show, type "show ?". \m(xxx) + is a user defined variable (strictly speaking, it is a macro used as a + variable). + + Command List + + C-Kermit has more than 200 top-level commands, and some of these, such + as SET, branch off into hundreds of subcommands of their own, so it's + not practical to describe them all here. Instead, here's a concise + list of the most commonly used top-level commands, grouped by + category. To learn about each command, type "help" followed by the + command name, e.g. "help set". Terms such as Command state and Connect + state are explained in subsequent sections. + + Optional fields are shown in [ italicized brackets ]. filename means + the name of a single file. filespec means a file specification that is + allowed to contain wildcard characters like '*' to match groups of + files. options are (optional) switches like /PAGE, /NOPAGE, /QUIET, + etc, listed in the HELP text for each command. Example: + + send /recursive /larger:10000 /after:-1week /except:*.txt * + + which can be read as "send all the files in this directory and all the + ones underneath it that are larger than 10000 bytes, no more than one + week old, and whose names don't end with ".txt". + + Basic Commands + HELP Requests top-level help. + HELP command Requests help about the given command. + INTRODUCTION Requests a brief introduction to C-Kermit. + LICENSE Displays the C-Kermit software copyright and license. + VERSION Displays C-Kermit's version number. + EXIT [ number ] Exits from Kermit with the given status code. + Synonyms: QUIT, E, Q. + TAKE filename [ parameters... ] Executes commands from the + given file. + LOG item [ filename ] Keeps a log of the given item in the + given file. + [ DO ] macro [ parameters... ] Executes commands from the + given macro. + SET parameter value Sets the given parameter to the given + value. + SHOW category Shows settings in a given category. + STATUS Tells whether previous command succeeded or failed. + DATE [ date-and/or-time ] Shows current date-time or interprets + given date-time. + RUN [ extern-command [ parameters... ] Runs the given external + command. Synonym: !. + EXEC [ extern-command [ params... ] Kermit overlays itself with + the given command. + SUSPEND Stops Kermit and puts it in the background. Synonym: Z. + + Local File Management + TYPE [ options ] filename Displays the contents of the given + file. + MORE [ options ] filename Equivalent to TYPE /PAGE (pause after + each screenful). + CAT [ options ] filename Equivalent to TYPE /NOPAGE. + HEAD [ options ] filename Displays the first few lines of a + given file. + TAIL [ options ] filename Displays the last few lines of a + given file. + GREP [ options ] pattern filespec Displays lines from files + that match the pattern. Synonym: FIND. + DIRECTORY [ options ] [ filespec ] Lists files (built-in, many + options). + LS [ options ] [ filespec ] Lists files (runs external "ls" + command). + DELETE [ options ] [ filespec ] Deletes files. Synonym: RM. + PURGE [ options ] [ filespec ] Removes backup (*.~n~) files. + COPY [ options ] [ filespecs... ] Copies files. Synonym: CP. + RENAME [ options ] [ filespecs... ] Renames files. Synonym: MV. + CHMOD [ options ] [ filespecs... ] Changes permissions of + files. + TRANSLATE filename charsets filename ] Converts file's + character set. Synonym: XLATE. + CD Changes your working directory to your home directory. + CD directory Changes your working directory to the one given. + CDUP Changes your working directory one level up. + PWD Displays your working directory. + BACK Returns to your previous working directory. + MKDIR [ directory ] Creates a directory. + RMDIR [ directory ] Removes a directory. + + Making Connections + SET LINE [ options ] devicename Opens the named serial + port. Synonym: SET PORT. + OPEN LINE [ options ] devicename Same as SET LINE. Synonym: + OPEN PORT. + SET MODEM TYPE [ name ] Tells Kermit what kind of modem is on + the port. + DIAL [ number ] Tells Kermit to dial the given phone number + with the modem. + REDIAL Redials the most recently dialed phone number. + ANSWER Waits for and answers an incoming call on the modem. + AUTHENTICATE [ parameters... ] Performs secure authentication + on a TCP/IP connection. + SET NETWORK TYPE { TCP/IP, X.25, ... } Selects network type for + subsequent SET HOST commands. + SET HOST [ options ] host [ port ] Opens a network connection + to the given host and port. + SET HOST [ options ] * port Waits for an incoming TCP/IP + connection on the given port. + TELNET [ options ] host Opens a Telnet connection to the host + and enters Connect state. + RLOGIN [ options ] host Opens an Rlogin connection to the host + and enters Connect state. + IKSD [ options ] host Opens a connection to an Internet Kermit + Service. + SSH [ options ] host Opens an SSH connection to the host and + enters Connect state. + FTP OPEN host [ options ] Opens an FTP connection to the host. + HTTP [ options ] OPEN host Opens an HTTP connection to the + host. + PTY external-command Runs the command on a pseudoterminal as if + it were a connection. + PIPE external-command Runs the command through a pipe as if it + were a connection. + + Using Connections + CONNECT [ options ] Enters Connect + (terminal) state. Synonym: C. + REDIRECT command Redirects the given external command over the + connection. + TELOPT command Sends a Telnet protocol command (Telnet + connections only). + Ctrl-\C "Escapes back" from Connect state to Command state. + Ctrl-\B (In Connect state) Sends a BREAK signal (serial or + Telnet). + Ctrl-\! (In Connect state) Enters inferior shell; "exit" to + return. + Ctrl-\? (In Connect state) Shows a menu of other escape-level + options. + Ctrl-\Ctrl-\ (In Connect state) Type two Ctrl-Backslashes to + send one of them. + SET ESCAPE [ character ] Changes Kermit's Connect-state escape + character. + + Closing Connections + HANGUP Hangs up the currently open serial-port or network + connection. + CLOSE Closes the currently open serial-port or network + connection. + SET LINE (with no devicename) Closes the currently + open serial-port or network connection. + SET HOST (with no hostname) Closes the currently open + serial-port or network connection. + FTP CLOSE Closes the currently open FTP connection. + HTTP CLOSE Closes the currently open HTTP connection. + EXIT Also closes all connections. Synonym: QUIT. + SET EXIT WARNING OFF Suppresses warning about open connections + on exit or close. + + File Transfer + SEND [ options ] filename [ as-name ] Sends the given file. + Synonym: S. + SEND [ options ] filespec Sends all files that match. + RESEND [ options ] filespec Resumes an interupted SEND from the + point of failure. + RECEIVE [ options ] [ as-name ] Waits passively for files to + arrive. Synonym: R. + LOG TRANSACTIONS [ filename ] Keeps a record of file transfers. + FAST Use fast file-transfer settings (default). + CAUTIOUS Use cautious and less fast file-transfer settings. + ROBUST Use ultra-conservative and slow file-transfer settings. + STATISTICS [ options ] Gives statistics about the most recent + file transfer. + WHERE After transfer: "Where did my files go?". + TRANSMIT [ options ] [ filename ] Sends file without protocol. + Synonym: XMIT. + LOG SESSION [ filename ] Captures remote text or files without + protocol. + SET PROTOCOL [ name... ] Tells Kermit to use an external + file-transfer protocol. + FTP { PUT, MPUT, GET, MGET, ... } FTP client commands. + HTTP { PUT, GET, HEAD, POST, ... } HTTP client commands. + + Kermit Server + ENABLE, DISABLE Controls which features + can be used by clients. + SET SERVER Sets parameters prior to entering Server state. + SERVER Enters Server state. + + Client of Kermit or FTP Server + [ REMOTE ] LOGIN [ user password ] Logs in to a Kermit server + or IKSD that requires it. + [ REMOTE ] LOGOUT Logs out from a Kermit server or IKSD. + SEND [ options ] filename [ as-name ] Sends the given file to + the server. Synonyms: S, PUT. + SEND [ options ] filespec Sends all files that match. + RESEND [ options ] filespec Resumes an interupted SEND from the + point of failure. + GET [ options ] remote-filespec Asks the server to send the + given files. Synonym: G. + REGET [ options ] remote-filespec Resumes an interrupted GET + from the point of failure. + REMOTE CD [ directory ] Asks server to change its working + directory. Synonym: RCD. + REMOTE PWD [ directory ] Asks server to display its working + directory. Synonym: RPWD. + REMOTE DIRECTORY [ filespec... ] Asks server to send a + directory listing. Synonym: RDIR. + REMOTE DELETE [ filespec... ] Asks server to delete files. + Synonym: RDEL. + REMOTE [ command... ] (Many other commands: "remote ?" for a + list). + MAIL [ options ] filespec Sends file(s) to be delivered as + e-mail (Kermit only). + FINISH Asks the server to exit server state (Kermit only). + BYE Asks the server to log out and close the connection. + + Script Programming + DEFINE, DECLARE, UNDEFINE, UNDECLARE, ASSIGN, EVALUATE, + SEXPRESSION, ARRAY, SORT, INPUT, OUTPUT, IF, FOR, WHILE, + SWITCH, GOTO, ECHO, ASK, GETC, GETOK, ASSERT, WAIT, SLEEP, + FOPEN, FREAD, FWRITE, FCLOSE, STOP, END, RETURN, LEARN, SHIFT, + TRACE, VOID, INCREMENT, DECREMENT, ... For these and many more + you'll need to consult the [68]manual and supplements, and/or + visit the [69]Kermit Script Library, which also includes a + brief tutorial. Hint: HELP LEARN to find out how to get Kermit + to write simple scripts for you. + + Many of Kermit's commands have synonyms, variants, relatives, and so + on. For example, MSEND is a version of SEND that accepts a list of + file specifications to be sent, rather than just one file + specification, and MPUT is a synonym of MSEND. MOVE means to SEND and + then DELETE the source file if successful. MMOVE is like MOVE, but + accepts a list of filespecs, and so on. These are described in the + [70]full documentation. + + Use question mark to feel your way through an unfamiliar command, as + in this example (the part you type is underlined): + + C-Kermit> remote ? One of the following: + assign delete help login print rename space + cd directory host logout pwd rmdir type + copy exit kermit mkdir query set who + C-Kermit> remote set ? One of the following: + attributes file retry transfer + block-check receive server window + C-Kermit> remote set file ? One of the following: + character-set incomplete record-length + collision names type + C-Kermit> remote set file names ? One of the following: + converted literal + C-Kermit> remote set file names literal + C-Kermit> + + This is called menu on demand: you get a menu when you want one, but + menus are not forced on you even when know what you're doing. Note + that you can also abbreviate most keywords, and you can complete them + with the Tab or Esc key. Also note that ? works for filenames too, and + that you can use it in the middle of a keyword or filename, not just + at the beginning. For example, "send x?" lists all the files in the + current directory whose names start with 'x'. + + [ [71]Kermit Home ] [ [72]C-Kermit Home ] [ [73]C-Kermit FAQ ] + ________________________________________________________________________ + + INITIALIZATION FILE [ [74]Top ] [ [75]Contents ] [ [76]Next ] [ [77]Previous + ] + + In its default configuration, C-Kermit executes commands from a file + called .kermrc in your home directory when it starts, unless it is + given the -Y or -y command-line option. Custom configurations might + substitute a shared system-wide initialization file. The SHOW FILE + command tells what initialization file, if any, was used. The standard + initialization file "chains" to an individual customization file, + .mykermc, in the home directory, in which each user can establish + her/his own preferences, define macros, and so on. + + Since execution of the initialization file (at least the standard one) + makes C-Kermit take longer to start, it might be better not to have an + initialization file, especially now that Kermit's default startup + configuration is well attuned to modern computing and networking -- in + other words, you no longer have do anything special to make Kermit + transfers go fast. So instead of having an initialization file that is + executed every time Kermit starts, you might consider making one or + more kerbang scripts (with names other that .kermrc) that do NOT + include an "exit" command, and invoke those when you need the + settings, macro definitions, and/or scripted actions they contain, and + invoke C-Kermit directly when you don't. + + To put it another way... We still distribute the standard + initialization file since it's featured in the manual and backwards + compatibility is important to us. But there's no harm in not using it + if you don't need the stuff that's in it (services directory, dialing + directory, network directory, and associated macro definitions). On + the other hand, if there are settings or macros you want in effect + EVERY time you use Kermit, the initialization file (or the + customization file it chains to) is the place to put them, because + that's the only place Kermit looks for them automatically each time + you start it. + + [ [78]Kermit Home ] [ [79]C-Kermit Home ] [ [80]C-Kermit FAQ ] + ________________________________________________________________________ + + MODES OF OPERATION [ [81]Top ] [ [82]Contents ] [ [83]Next ] [ [84]Previous ] + + Kermit is said to be in Local mode if it has made a connection to + another computer, e.g. by dialing it or establishing a Telnet + connection to it. The other computer is remote, so if you start + another copy of Kermit on the remote computer, it is said to be in + Remote mode (as long as it has not made any connections of its own). + The local Kermit communicates over the communications device or + network connection, acting as a conduit between the the remote + computer and your keyboard and screen. The remote Kermit is the + file-transfer partner to the local Kermit and communicates only + through its standard input and output. + + At any moment, a Kermit program can be in any of the following states. + It's important to know what they are and how to change from one to the + other. + + Command state + + In this state, Kermit reads commands from: + + + Your keyboard; or: + + A file, or: + + A macro definition. + + You can exit from Command state back to Unix with the EXIT or + QUIT command (same thing). You can enter Connect state with any + of various commands (CONNECT, DIAL, TELNET, etc). You can enter + file transfer state with commands like SEND, RECEIVE, and GET. + You can enter Server state with the SERVER command. The TAKE + command tells Kermit to read and execute commands from a file. + The (perhaps implied) DO command tells Kermit to read and + execute commands from a macro definition. While in Command + state, you can interrupt any command, macro, or command file by + typing Ctrl-C (hold down the Ctrl key and press the C key); + this normally brings you back to the prompt. + + Shell state + + You can invoke an inferior shell or external command from the + Kermit command prompt by using the PUSH, RUN (!), EDIT, or + BROWSE command. While the inferior shell or command is active, + Kermit is suspended and does nothing. Return to Kermit Command + state by exiting from the inferior shell or application. + + Connect state + + In this state, which can be entered only when in Local mode + (i.e. when Kermit has made a connection to another computer), + Kermit is acting as a terminal to the remote computer. Your + keystrokes are sent to the remote computer and characters that + arrive over the communication connection are displayed on your + screen. This state is entered when you give a CONNECT, DIAL, + TELNET, RLOGIN, or IKSD command. You can return to command + state by logging out of the remote computer, or by typing: + + Ctrl-\c + + That is: Hold down the Ctrl key and press the backslash key, + then let go of the Ctrl key and press the C key. This is called + escaping back. Certain other escape-level commands are also + provided; type Ctrl-\? for a list. For example, you can enter + Shell state with: + + Ctrl-\! + + To send a Ctrl-\ to the host while in Connect state, type two + of them in a row. See HELP CONNECT and HELP SET ESCAPE for more + info. + + Local file-transfer state + + In this state, Kermit is sending packets back and forth with + the other computer in order to transfer a file or accomplish + some other file-related task. And at the same time, it is + displaying its progress on your screen and watching your + keyboard for interruptions. In this state, the following + single-keystroke commands are accepted: + + X Interrupt the current file and go on to the next (if any). + Z Interrupt the current file and skip all the rest. + E Like Z but uses a "stronger" protocol (use if X or Z don't + work). + Ctrl-C Interrupt file-transfer mode (use if Z or E don't + work). + + Kermit returns to its previous state (Command or Connect) when + the transfer is complete or when interrupted successfully by X, + Z, E, or Ctrl-C (hold down the Ctrl key and press the C key). + + Remote file-transfer state + + In this state, Kermit is exchanging file-transfer packets with + its local partner over its standard i/o. It leaves this state + automatically when the transfer is complete. In case you find + your local Kermit in Connect state and the remote one in + File-transfer state (in which it seems to ignore your + keystrokes), you can usually return it to command state by + typing three Ctrl-C's in a row. If that doesn't work, return + your local Kermit to Command state (Ctrl-\ C) and type + "e-packet" and then press the Return or Enter key; this forces + a fatal Kermit protocol error. + + Remote Server state + + This is like Remote File-transfer state, except it never + returns automatically to Command state. Rather, it awaits + further instructions from the client program; that is, from + your Local Kermit program. You can return the Remote Server to + its previous state by issuing a "finish" command to the client, + or if you are in Connect state, by typing three Ctrl-C's in a + row. You can tell the server job to log out and break the + connection by issuing a "bye" command to the client. + + Local Server state + + Like Remote-Server state, but in local mode, and therefore with + its file-transfer display showing, and listening for single-key + commands, as in Local File-transfer state. Usually this state + is entered automatically when a remote Kermit program gives a + GET command. + + C-Kermit, Kermit 95, and MS-DOS Kermit all can switch automatically + from Connect state to Local File-transfer state when you initiate a + file transfer from the remote computer by starting Kermit and telling + it to send or get a file, in which case, Connect state is + automatically resumed after the file transfer is finished. + + Note that C-Kermit is not a terminal emulator. It is a communications + application that you run in a terminal window (e.g. console or Xterm). + The specific emulation, such as VT100, VT220, Linux Console, or Xterm, + is provided by the terminal window in which you are running C-Kermit. + Kermit 95 and MS-DOS Kermit, on the other hand, are true terminal + emulators. Why is C-Kermit not a terminal emulator? [85]CLICK HERE to + read about it. + + [ [86]Kermit Home ] [ [87]C-Kermit Home ] [ [88]C-Kermit FAQ ] + ________________________________________________________________________ + + MAKING CONNECTIONS [ [89]Top ] [ [90]Contents ] [ [91]Next ] [ [92]Previous ] + + Here is how to make different kinds of connections using interactive + Kermit commands (as noted above, you can also make connections with + command-line options). Note that you don't have to make connections + with Kermit. It can also be used on the far end of a connection as the + remote file transfer and management partner of your local + communications software. + + Making a Telnet Connection + + At the C-Kermit command prompt, simply type: + + telnet foo.bar.com ; Substitute desired host name or address. + telnet xyzcorp.com 3000 ; You can also include a port number. + + If the connection is successful, Kermit automically enters + Connect state. When you logout from the remote host, Kermit + automatically returns to its prompt. More info: HELP TELNET, + HELP SET TELNET, HELP SET TELOPT. Also see the [93]IKSD section + below. + + Making an Rlogin connection + + This is just like Telnet, except you have to be root to do it + because Rlogin uses a privileged TCP port: + + rlogin foo.bar.com ; Substitute desired host name or address. + + More info: HELP RLOGIN. + + Making an SSH Connection + + Unlike Telnet and Rlogin, SSH connections are not built-in, but + handled by running your external SSH client through a + pseudoterminal. Using C-Kermit to control the SSH client gives + you all of Kermit's features (file transfer, character-set + conversion, scripting, etc) over SSH. + + ssh foo.bar.com ; Substitute desired host name or address. + + More info: HELP SSH, HELP SET SSH. + + Dialing with a Modem + + If it's an external modem, make sure it is connected to a + usable serial port on your computer with a regular + (straight-through) modem cable, and to the telephone jack with + a telephone cable, and that it's turned on. Then use these + commands: + + set modem type usrobotics ; Or other supported type + set line /dev/ttyS0 ; Specify device name + set speed 57600 ; Or other desired speed + set flow rts/cts ; Most modern modems support this + set dial method tone ; (or pulse) + dial 7654321 ; Dial the desired number + + Type "set modem type ?" for a list of supported modem types. If + you omit the SET MODEM TYPE command, the default type is + "generic-high-speed", which should work for most modern + AT-command-set modems. If the line is busy, Kermit redials + automatically. If the call does not succeed, use "set dial + display on" and try it again to watch what happens. If the call + succeeds, Kermit enters Connect state automatically and returns + to its prompt automatically when you log out from the remote + computer or the connection is otherwise lost. + + You can also dial from a modem that is accessible by Telnet, + e.g. to a reverse terminal server. In this case the command + sequence is: + + set host ts.xxx.com 2000 ; Terminal-server and port + set modem type usrobotics ; Or other supported type + set dial method tone ; (or pulse) + dial 7654321 ; Dial the desired number + + If the terminal server supports the Telnet Com Port Option, + [94]RFC 2217, you can also give serial-port related commands + such as SET SPEED, SET PARITY, and so on, and Kermit relays + them to the terminal server using the protocol specified in the + RFC. + + More info: HELP SET MODEM, HELP SET LINE, HELP SET SPEED, HELP + SET FLOW, HELP DIAL, HELP SET DIAL, HELP SET MODEM, HELP SET + CARRIER-WATCH, SHOW COMMUNICATIONS, SHOW MODEM, SHOW DIAL. + + Direct Serial Port + + Connect the two computers, A and B, with a null modem cable (or + two modem cables interconnected with a null-modem adapter or + modem eliminator). From Computer A: + + set modem type none ; There is no modem + set line /dev/ttyS0 ; Specify device name + set carrier-watch off ; If DTR and CD are not cross-connected + set speed 57600 ; Or other desired speed + set flow rts/cts ; If RTS and CTS are cross-connected + set flow xon/xoff ; If you can't use RTS/CTS + set parity even ; (or "mark" or "space", if necessary) + set stop-bits 2 ; (rarely necessary) + connect ; Enter Connect (terminal) state + + This assumes Computer B is set up to let you log in. If it + isn't, you can run a copy of Kermit on Computer B and follow + approximately the same directions. More info: As above plus + HELP CONNECT. + + With modems or direct serial connections, you might also have to "set + parity even" (or "mark" or "space") if it's a 7-bit connection. + + Of the connection types listed above, only one can be open at a time. + However, any one of these can be open concurrently with an [95]FTP or + HTTP session. Each connection type can be customized to any desired + degree, scripted, logged, you name it. See the manual. + + NOTE: On selected platforms, C-Kermit also can make X.25 connections. + See the manual for details. + + [ [96]Kermit Home ] [ [97]C-Kermit Home ] [ [98]C-Kermit FAQ ] + ________________________________________________________________________ + + TRANSFERRING FILES WITH KERMIT [ [99]Top ] [ [100]Contents ] [ [101]Next ] [ + [102]Previous ] + + * [103]Downloading Files + * [104]Uploading Files + * [105]Kermit Transfers the Old-Fashioned Way + * [106]If File Transfer Fails + * [107]Advanced Kermit File Transfer Features + * [108]Non-Kermit File Transfer + + There is a [109]widespread and persistent belief that Kermit is a slow + protocol. This is because, until recently, it used conservative tuning + by default to make sure file transfers succeeded, rather than failing + because they overloaded the connection. Some extra commands (or + command-line options, like -Q) were needed to make it go fast, but + nobody bothered to find out about them. Also, it takes two to tango: + most non-Kermit-Project Kermit protocol implementations really ARE + slow. The best file-transfer partners for C-Kermit are: another copy + of [110]C-Kermit (7.0 or later) and [111]Kermit 95. These combinations + work well and they work fast by default. MS-DOS Kermit is good too, + but you have to tell it to go fast (by giving it the FAST command). + + Furthermore, all three of these Kermit programs support "autodownload" + and "autoupload", meaning that when they are in Connect state and a + Kermit packet comes in from the remote, they automatically switch into + file transfer mode. + + And plus, C-Kermit and K95 also switch automatically between text and + binary mode for each file, so there is no need to "set file type + binary" or "set file type text", or to worry about files being + corrupted because they were transferred in the wrong mode. + + What all of these words add up to is that now, when you use up-to-date + Kermit software from the Kermit Project, file transfer is not only + fast, it's ridiculously easy. You barely have to give any commands at + all. + + Downloading Files + + Let's say you have [112]Kermit 95, [113]C-Kermit, or + [114]MS-DOS Kermit on your desktop computer, with a connection + to a Unix computer that has C-Kermit installed as "kermit". To + download a file (send it from Unix to your desktop computer), + just type the following command at your Unix shell prompt: + + kermit -s oofa.txt + + (where oofa.txt is the filename). If you want to send more than + one file, you can put as many filenames as you want on the + command line, and they can be any combination of text and + binary: + + kermit -s oofa.txt oofa.zip oofa.html oofa.tar.gz + + and/or you can use wildcards to send groups of files: + + kermit -s oofa.* + + If you want to send a file under an assumed name, use: + + kermit -s friday.txt -a today.txt + + This sends the file friday.txt but tells the receiving Kermit + that its name is today.txt. In all cases, as noted, when the + file transfer is finished, your desktop Kermit returns + automatically to Connect state. No worries about escaping back, + re-connecting, text/binary mode switching. Almost too easy, + right? + + Uploading Files + + To upload files (send them from your desktop computer to the + remote Unix computer) do the same thing, but use the -g (GET) + option instead of -s: + + kermit -g oofa.txt + + This causes your local Kermit to enter server mode; then the + remote Kermit program requests the named file and the local + Kermit sends it and returns automatically to Connect state when + done. + + If you want to upload multiple files, you have have use shell + quoting rules, since these aren't local files: + + kermit -g "oofa.txt oofa.zip oofa.html oofa.tar.gz" + kermit -g "oofa.*" + + If you want to upload a file but store it under a different + name, use: + + kermit -g friday.txt -a today.txt + + Kermit Transfers the Old-Fashioned Way + + If your desktop communications software does not support + autoupload or autodownload, or it does not include Kermit + server mode, the procedure requires more steps. + + To download a file, type: + + kermit -s filename + + on the host as before, but if nothing happens automatically in + response to this command, you have to switch your desktop + communications software into Kermit Receive state. This might + be done by escaping back using keyboard characters or hot keys + (Alt-x is typical) and/or with a command (like RECEIVE) or a + menu. When the file transfer is complete, you have to go back + to Connect state, Terminal emulation, or whatever terminology + applies to your desktop communications software. + + To upload a file, type: + + kermit -r + + on the host (rather than "kermit -g"). This tells C-Kermit to + wait passively for a file to start arriving. Then regain the + attention of your desktop software (Alt-x or whatever) and + instruct it to send the desired file(s) with Kermit protocol. + When the transfer is finished, return to the Connect or + Terminal screen. + + If File Transfer Fails + + Although every aspect of Kermit's operation can be finely + tuned, there are also three short and simple "omnibus tuning" + commands you can use for troubleshooting: + + FAST + Use fast file-transfer settings. This has been the + default since C-Kermit 7.0 now that most modern computers + and connections support it. If transfers fail with fast + settings, try . . . + + CAUTIOUS + Use cautious but not paranoid settings. File transfers, + if they work, will go at medium speed. If not, try . . . + + ROBUST + Use the most robust, resilient, conservative, safe, and + reliable settings. File transfers will almost certainly + work, but they will be quite slow (of course this is a + classic tradeoff; ROBUST was C-Kermit's default tuning in + versions 6.0 and earlier, which made everybody think + Kermit protocol was slow). If ROBUST doesn't do the + trick, try again with SET PARITY SPACE first in case it's + not an 8-bit connection. + + Obviously the success and performance of a file transfer also + depends on C-Kermit's file transfer partner. Up-to-date, real + [115]Kermit Project partners are recommended because they + contain the best Kermit protocol implementations and because + [116]we can support them in case of trouble. + + If you still have trouble, consult Chapter 10 of [117]Using + C-Kermit, or send email to [118]kermit-support@columbia.edu. + + Advanced Kermit File-Transfer Features + + Obviously there is a lot more to Kermit file transfer, + including all sorts of interactive commands, preferences, + options, logging, debugging, troubleshooting, and anything else + you can imagine but that's what the [119]manual and updates are + for. Here are a few topics you can explore if you're interested + by Typing HELP for the listed commands: + + Logging transfers: + LOG TRANSACTIONS (HELP LOG) + + Automatic per-file text/binary mode switching: + SET TRANSFER MODE { AUTOMATIC, MANUAL } (HELP SET + TRANSFER). + + Cross-platform recursive directory tree transfer: + SEND /RECURSIVE, GET /RECURSIVE (HELP SEND, HELP GET). + + File collision options: + SET FILE COLLISION { OVERWRITE, BACKUP, DISCARD, ... } + (HELP SET FILE). + + Update mode (only transfer files that changed since last time): + SET FILE COLLISION UPDATE (HELP SET FILE). + + Filename selection patterns: + (HELP WILDCARD). + + Flexible file selection: + SEND (or GET) /BEFORE /AFTER /LARGER /SMALLER /TYPE + /EXCEPT, ... + + Character-set conversion: + SET { FILE, TRANSFER } CHARACTER-SET, ASSOCIATE, ... + + File/Pathname control: + SET { SEND, RECEIVE } PATHNAMES, SET FILE NAMES. + + Atomic file movement: + SEND (or GET) /DELETE /RENAME /MOVE-TO + + Transferring to/from standard i/o of other commands: + SEND (or GET) /COMMAND + + Recovery of interrupted transfer from point of failure: + RESEND, REGET (HELP RESEND, HELP REGET). + + Non-Kermit File Transfer + + You can also use C-Kermit to transfer files with FTP or HTTP + Internet protocols; [120]see below. + + On a regular serial or Telnet connection where the other + computer doesn't support Kermit protocol at all, you have + several options. For example, if your desktop communications + software supports Zmodem, use "rz" and "sz" on the host rather + than Kermit. But if Kermit is your desktop software, and you + are using it to make calls or network connections to other + computers that don't support Kermit protocol (or that don't + have a good implementation of it), then if your computer also + has external X, Y, or Zmodem programs that are redirectable, + Kermit can use them as external protocols. HELP SET PROTOCOL + for details. + + You can also capture "raw" data streams from the other computer + with LOG SESSION (HELP LOG and HELP SET SESSION-LOG for + details), and you can upload files without any protocol at all + with TRANSMIT (HELP TRANSMIT, HELP SET TRANSMIT). + + [ [121]Kermit Home ] [ [122]C-Kermit Home ] [ [123]C-Kermit FAQ ] + ________________________________________________________________________ + + KERMIT CLIENT/SERVER CONNECTIONS [ [124]Top ] [ [125]Contents ] [ [126]Next ] + [ [127]Previous ] + + On any kind of connection you can make with Kermit -- serial, TCP/IP, + X.25, etc -- you can set up a convenient client/server relationship + between your Kermit client (the one that made the connection) and the + Kermit program on the far end of the connection (the remote Kermit) by + putting the remote Kermit in server mode. This is normally done by + giving it a SERVER command, or by starting it with the -x command-line + option. In some cases ([128]Internet Kermit Service, SSH connections + to a Kermit subsystem, or specially configured hosts), there is + already a Kermit server waiting on the far end. Here is a quick + synopsis of the commands you can give to the client for interacting + with the server: + + SEND [ switches ] filename + Sends the named file to the server. The filename can include + wildcards. Lots of switches are available for file selection, + etc. Type HELP SEND at the client prompt for details. + + GET [ switches ] filename + Asks the server to send the named file. The filename can + include wildcards. Type HELP GET at the client prompt for + details. + + BYE + Terminates the server and closes your connection to it. + + FINISH + Terminates the server. If you started the server yourself, this + leaves the remote host at its shell prompt. If it was a + dedicated server (such as IKSD or an SSH subsystem), FINISH is + equivalent to BYE. + + SET LOCUS { LOCAL, REMOTE, AUTO } + (C-Kermit 8.0.201 and later, K95 1.1.21 and later) This tells + the client whether file-management commands like CD, PWD, + DIRECTORY, DELETE, MKDIR, etc, should be executed locally or by + the server. In this type of connection, the default is LOCAL. + Use SET LOCUS REMOTE if you want Kermit to behave like an FTP + client, in which case these commands are executed remotely, and + their local versions must have an L prefix: LCD, LPWD, + LDIRECTORY, etc. When LOCUS is LOCAL, then the remote versions + must have an R prefix: RCD, RPWD, RDIRECTORY, etc. HELP SET + LOCUS for details. SHOW COMMAND to see current locus. + + The following commands are affected by SET LOCUS: + + CD, LCD, RCD + Change (working, current) directory. HELP CD for details. + + CDUP, LCDUP, RCDUP + CD one level up. + + DIRECTORY, LDIRECTORY, RDIRECTORY + Produce a directory listing. Many options are available for local + listings. HELP DIRECTORY for details. + + DELETE, LDELETE, RDELETE + Deletes files or directories. Many options available, HELP DELETE. + + RENAME, LRENAME, RRENAME + Renames files or directories. Many options available, HELP RENAME. + + MKDIR, LMKDIR, RMKDIR + Creates a directory. HELP MKDIR. + + RMDIR, LRMDIR, RRMDIR + Removes a directory. HELP RMDIR. There are dozens -- maybe hundreds -- + of other commands, described in the built-in help, on the website, + and/or in the published or online manuals. But even if you don't have + access to documentation, you can "set locus remote" and then use + pretty much the same commands you would use with any FTP client. + + [ [129]Kermit Home ] [ [130]C-Kermit Home ] [ [131]C-Kermit FAQ ] + ________________________________________________________________________ + + KERMIT'S BUILT-IN FTP AND HTTP CLIENTS [ [132]Top ] [ [133]Contents ] [ + [134]Next ] [ [135]Previous ] + + Kermit's FTP client is like the regular Unix FTP client that you're + used to, but with some differences: + + * It has lots more commands and features. + * You can have an FTP session and a regular Kermit serial or Telnet + session open at the same time. + * FTP sessions can be fully automated. + + By default Kermit's FTP client tries its best to present the same user + interface as a regular FTP client: PUT, GET, DIR, CD, BYE, etc, should + work the same, even though some of these commands have different + meaning in Kermit-to-Kermit connections; for example, CD, DIR, RENAME, + etc, in Kermit act locally, whereas in FTP they are commands for the + server. This might cause some confusion, but as in all things Kermit, + you have total control: + + * The [136]SET LOCUS command lets you specify where file management + commands should be executed -- locally or remotely -- for any kind + of connection. + * Any FTP command can be prefixed with the word "FTP" to remove any + ambiguity. + + Pending publication of the next edition of the manual, the Kermit FTP + client is thoroughly documented at the Kermit Project website: + + [137]http://www.columbia.edu/kermit/ftpclient.html + + You also can use HELP FTP and HELP SET FTP to get descriptions of + Kermit's FTP-related commands. + + The HTTP client is similar to the FTP one, except you prefix each + command with HTTP instead of FTP: HTTP OPEN, HTTP GET, HTTP PUT, HTTP + CLOSE, etc. Type HELP HTTP for details, or visit the to view the + [138]manual supplements. HTTP connections can be open at the same time + as regular serial or Telnet connections and FTP connections. So Kermit + can manage up to three types connections simultaneously. + + [ [139]Kermit Home ] [ [140]C-Kermit Home ] [ [141]C-Kermit FAQ ] [ + [142]FTP Client ] [ [143]HTTP Client ] + ________________________________________________________________________ + + INTERNET KERMIT SERVICE [ [144]Top ] [ [145]Contents ] [ [146]Next ] [ + [147]Previous ] + + C-Kermit can be configured and run as an Internet service (called + IKSD), similar to an FTP server (FTPD) except you can (but need not) + interact with it directly, plus it does a lot more than an FTP server + can do. The TCP port for IKSD is 1649. It uses Telnet protocol. + C-Kermit can be an Internet Kermit Server, or it can be a client of an + IKSD. You can make connections from C-Kermit to an IKSD with any of + the following commands: + + telnet foo.bar.edu 1649 + telnet foo.bar.edu kermit ; if "kermit" is listed in /etc/services + iksd foo.bar.edu + + The IKSD command is equivalent to a TELNET command specifying port + 1649. For more information about making and using connections to an + IKSD, see: + + [148]http://www.columbia.edu/kermit/cuiksd.html + + You can run an Internet Kermit Service on your own computer too (if + you are the system administrator). For instructions, see: + + [149]http://www.columbia.edu/kermit/iksd.html + + [ [150]Kermit Home ] [ [151]C-Kermit Home ] [ [152]C-Kermit FAQ ] + ________________________________________________________________________ + + SECURITY [ [153]Top ] [ [154]Contents ] [ [155]Next ] [ [156]Previous ] + + All of C-Kermit's built-in TCP/IP networking methods (Telnet, Rlogin, + IKSD, FTP, and HTTP) can be secured by one or more of the following + IETF-approved methods: + + * MIT Kerberos IV + * MIT Kerberos V + * SSL/TLS + * Stanford SRP + + For complete instructions see: + + [157]http://www.columbia.edu/kermit/security.html + + And as noted previously, you can also make SSH connections with + C-Kermit if you already have an SSH client installed. + + [ [158]Kermit Home ] [ [159]C-Kermit Home ] [ [160]C-Kermit FAQ ] + ________________________________________________________________________ + + ALTERNATIVE COMMAND-LINE PERSONALITIES [ [161]Top ] [ [162]Contents ] [ + [163]Next ] [ [164]Previous ] + + When invoked as "kermit" or any other name besides any of the special + ones, C-Kermit has the command-line options described above in the + [165]OPTIONS section. However, if you invoke C-Kermit using any of the + following names: + + telnet Telnet client + ftp FTP client + http HTTP client + https Secure HTTP client + + Kermit's command-line personality changes to match. This can be done + (among other ways) with symbolic links (symlinks). For example, if you + want C-Kermit to be your regular Telnet client, or the Telnet helper + of your Web browser, you can create a link like the following in a + directory that lies in your PATH ahead of the regular telnet program: + + ln -s /usr/local/bin/kermit telnet + + Now when you give a "telnet" command, you are invoking Kermit instead, + but with its Telnet command-line personality so, for example: + + telnet xyzcorp.com + + Makes a Telnet connection to xyzcorp.com, and Kermit exits + automatically when the connection is closed (just like the regular + Telnet client). Type "telnet -h" to get a list of Kermit's + Telnet-personality command-line options, which are intended to be as + compatible as possible with the regular Telnet client. + + Similarly for FTP: + + ln -s /usr/local/bin/kermit ftp + + And now type "ftp -h" to see its command-line options, and use command + lines just like you would give your regular FTP client: + + ftp -n xyzcorp.com + + but with additional options allowing an entire session to be specified + on the command line, as explained in the C-Kermit [166]FTP client + documentation. + + And similarly for HTTP: + + ln -s /usr/local/bin/kermit http + ./http -h + ./http www.columbia.edu -g kermit/index.html + + Finally, if Kermit's first command-line option is a Telnet, FTP, IKSD, + or HTTP URL, Kermit automatically makes the appropriate kind of + connection and, if indicated by the URL, takes the desired action: + + kermit telnet:xyzcorp.com ; Opens a Telnet session + kermit telnet://olga@xyzcorp.com ; Ditto for user olga + kermit ftp://olga@xyzcorp.com/public/oofa.zip ; Downloads a file + kermit kermit://kermit.columbia.edu/kermit/f/READ.ME ; Ditto for IKSD + kermit iksd://kermit.columbia.edu/kermit/f/READ.ME ; (This works too) + kermit http://www.columbia.edu/kermit/index.html ; Grabs a web page + kermit https://wwws.xyzcorp.com/secret/plan.html ; Grabs a secure web pag +e + + [ [167]Kermit Home ] [ [168]C-Kermit Home ] [ [169]C-Kermit FAQ ] + ________________________________________________________________________ + + LICENSE [ [170]Top ] [ [171]Contents ] [ [172]Next ] [ [173]Previous ] + + C-Kermit has an unusual license, but a fair and sensible one given + that the Kermit Project must support itself out of revenue: it's not a + BSD license, not GPL, not Artistic, not commercial, not shareware, not + freeware. It can be summed up like this: if you want C-Kermit for your + own use, you can download and use it without cost or license (but we'd + appreciate it if you would purchase the manual). But if you want to + sell C-Kermit or bundle it with a product or otherwise distribute it + in a commercial setting EXCEPT WITH AN OPEN-SOURCE OPERATING SYSTEM + DISTRIBUTION such as Linux, FreeBSD, NetBSD, or OpenBSD, you must + license it. To see the complete license, give the LICENSE command at + the prompt, or see the COPYING.TXT file distributed with C-Kermit 7.0 + or later, or download it from + [174]ftp://kermit.columbia.edu/kermit/c-kermit/COPYING.TXT. Send + licensing inquiries to [175]kermit@columbia.edu. + + [ [176]Kermit Home ] [ [177]C-Kermit Home ] [ [178]C-Kermit FAQ ] + ________________________________________________________________________ + + OTHER TOPICS [ [179]Top ] [ [180]Contents ] [ [181]Next ] [ [182]Previous ] + + There's way more to C-Kermit than we've touched on here -- + troubleshooting, customization, character sets, dialing directories, + sending pages, script writing, and on and on, all of which are covered + in the manual and updates and supplements. For the most up-to-date + information on documentation (or updated documentation itself) visit + the Kermit Project website: + + [183]http://www.columbia.edu/kermit/ + + There you will also find [184]Kermit software packages for other + platforms: different Unix varieties, Windows, DOS, VMS, IBM + mainframes, and many others: 20+ years' worth. + + [ [185]Kermit Home ] [ [186]C-Kermit Home ] [ [187]C-Kermit FAQ ] + ________________________________________________________________________ + + DOCUMENTATION AND UPDATES [ [188]Top ] [ [189]Contents ] [ [190]Next ] [ + [191]Previous ] + + The manual for C-Kermit is: + + 1. Frank da Cruz and Christine M. Gianone, [192]Using C-Kermit, + Second Edition, Digital Press / Butterworth-Heinemann, Woburn, MA, + 1997, 622 pages, ISBN 1-55558-164-1. This is a printed book. It + covers C-Kermit 6.0. + 2. The C-Kermit 7.0 Supplement: + [193]http://www.columbia.edu/kermit/ckermit70.html + 3. The C-Kermit 8.0 Supplement: + [194]http://www.columbia.edu/kermit/ckermit80.html + + The C-Kermit home page is here: + + [195]http://www.columbia.edu/kermit/ckermit.html + + Visit this page to learn about new versions, Beta tests, and other + news; to read case studies and tutorials; to download source code, + install packages, and [196]prebuilt binaries for many platforms. Also + visit: + + [197]http://www.columbia.edu/kermit/scriptlib.html + The Kermit script library and tutorial + + [198]http://www.columbia.edu/kermit/newfaq.html + The Kermit FAQ (Frequently Asked Questions about Kermit) + + [199]http://www.columbia.edu/kermit/ckfaq.html + The C-Kermit FAQ (Frequently Asked Questions about C-Kermit) + + [200]http://www.columbia.edu/kermit/security.html + The Kermit security reference. + + [201]http://www.columbia.edu/kermit/telnet.html + C-Kermit Telnet client documentation. + + [202]http://www.columbia.edu/kermit/studies.html + Case studies. + + [203]http://www.columbia.edu/kermit/ckcbwr.html + General C-Kermit Hints and Tips. + + [204]http://www.columbia.edu/kermit/ckubwr.html + Unix C-Kermit Hints and Tips. + + [205]http://www.columbia.edu/kermit/ckvbwr.html + VMS C-Kermit Hints and Tips. + + [206]http://www.columbia.edu/kermit/ckuins.html + Unix C-Kermit Installation Instructions + + [207]http://www.columbia.edu/kermit/ckvins.html + VMS C-Kermit Installation Instructions + + [208]http://www.columbia.edu/kermit/support.html + Technical support. + + [209]http://www.columbia.edu/kermit/k95tutorial.html + Kermit 95 tutorial (this document). + + [210]comp.protocols.kermit.misc + The Kermit newsgroup (unmoderated). + + [ [211]Kermit Home ] [ [212]C-Kermit Home ] [ [213]C-Kermit FAQ ] + ________________________________________________________________________ + + FILES [ [214]Top ] [ [215]Contents ] [ [216]Next ] [ [217]Previous ] + + [218]COPYING.TXT + C-Kermit license. + + [219]~/.kermrc + Initialization file. + + [220]~/.mykermrc + Customization file. + + ~/.kdd + Kermit dialing directory (see manual). + + ~/.knd + Kermit network directory (see manual). + + ~/.ksd + Kermit services directory (see manual). + + [221]ckuins.html + Installation instructions for Unix. + + [222]ckcbwr.html + General C-Kermit bugs, hints, tips. + + [223]ckubwr.html + Unix-specific C-Kermit bugs, hints, tips. + + [224]ckcplm.html + C-Kermit program logic manual. + + [225]ckccfg.html + C-Kermit compile-time configuration options. + + ssh + (in your PATH) SSH connection helper. + + rz, sz, etc. + (in your PATH) external protocols for XYZmodem. + + /var/spool/locks (or whatever) + UUCP lockfile for dialing out (see [226]installation + instructions). + + [ [227]Kermit Home ] [ [228]C-Kermit Home ] [ [229]C-Kermit FAQ ] + ________________________________________________________________________ + + AUTHORS [ [230]Top ] [ [231]Contents ] [ [232]Previous ] + + Frank da Cruz and Jeffrey E Altman + The Kermit Project - Columbia Univerity + 612 West 115th Street + New York NY 10025-7799 + USA + + 1985-present, with contributions from hundreds of others all over the + world. + _________________________________________________________________ + + + C-Kermit 8.0 Unix Manual Page and Tutorial / + [233]kermit@columbia.edu / 24 October 2002 + +References + + 1. http://www.columbia.edu/kermit/ + 2. http://www.columbia.edu/ + 3. http://www.columbia.edu/kermit/ckututor.pdf + 4. ftp://kermit.columbia.edu/kermit/test/text/ckuker.nr + 5. http://www.columbia.edu/kermit/ckututor.html#description + 6. http://www.columbia.edu/kermit/ckututor.html#synopsis + 7. http://www.columbia.edu/kermit/ckututor.html#options + 8. http://www.columbia.edu/kermit/ckututor.html#commands + 9. http://www.columbia.edu/kermit/ckututor.html#initfile + 10. http://www.columbia.edu/kermit/ckututor.html#modes + 11. http://www.columbia.edu/kermit/ckututor.html#connections + 12. http://www.columbia.edu/kermit/ckututor.html#transfer + 13. http://www.columbia.edu/kermit/ckututor.html#server + 14. http://www.columbia.edu/kermit/ckututor.html#ftp + 15. http://www.columbia.edu/kermit/ckututor.html#iksd + 16. http://www.columbia.edu/kermit/ckututor.html#security + 17. http://www.columbia.edu/kermit/ckututor.html#personae + 18. http://www.columbia.edu/kermit/ckututor.html#license + 19. http://www.columbia.edu/kermit/ckututor.html#other + 20. http://www.columbia.edu/kermit/ckututor.html#documentation + 21. http://www.columbia.edu/kermit/ckututor.html#files + 22. http://www.columbia.edu/kermit/ckututor.html#authors + 23. http://www.columbia.edu/kermit/ckututor.html#top + 24. http://www.columbia.edu/kermit/ckututor.html#contents + 25. http://www.columbia.edu/kermit/ckututor.html#synopsis + 26. http://www.columbia.edu/kermit/ckermit.html + 27. http://www.columbia.edu/kermit/ + 28. http://www.columbia.edu/ + 29. ftp://ftp.isi.edu/in-notes/rfc2839.txt + 30. ftp://ftp.isi.edu/in-notes/rfc2840.txt + 31. http://www.columbia.edu/kermit/ckututor.html#documentation + 32. http://www.columbia.edu/kermit/ + 33. http://www.columbia.edu/kermit/ + 34. http://www.columbia.edu/kermit/ckermit.html + 35. http://www.columbia.edu/kermit/ckfaq.html + 36. http://www.columbia.edu/kermit/ckututor.html#top + 37. http://www.columbia.edu/kermit/ckututor.html#contents + 38. http://www.columbia.edu/kermit/ckututor.html#options + 39. http://www.columbia.edu/kermit/ckututor.html#synopsis + 40. http://www.columbia.edu/kermit/ckututor.html#kerbang + 41. http://www.columbia.edu/kermit/ckututor.html#personae + 42. http://www.columbia.edu/kermit/ckututor.html#kerbang + 43. http://www.columbia.edu/kermit/ckututor.html#initfile + 44. http://www.columbia.edu/kermit/ckututor.html#initfile + 45. http://www.columbia.edu/kermit/ckututor.html#personae + 46. http://www.columbia.edu/kermit/ckututor.html#options + 47. http://www.columbia.edu/kermit/ckututor.html#commands + 48. http://www.columbia.edu/kermit/ + 49. http://www.columbia.edu/kermit/ckermit.html + 50. http://www.columbia.edu/kermit/ckfaq.html + 51. http://www.columbia.edu/kermit/ckututor.html#top + 52. http://www.columbia.edu/kermit/ckututor.html#contents + 53. http://www.columbia.edu/kermit/ckututor.html#commands + 54. http://www.columbia.edu/kermit/ckututor.html#description + 55. http://www.columbia.edu/kermit/ckututor.html#commands + 56. http://www.columbia.edu/kermit/ckututor.html#personae + 57. http://www.columbia.edu/kermit/ckututor.html#personae + 58. http://www.columbia.edu/kermit/ckututor.html#iksd + 59. http://www.columbia.edu/kermit/ckututor.html#transfer + 60. http://www.columbia.edu/kermit/ckututor.html#top + 61. http://www.columbia.edu/kermit/ckututor.html#contents + 62. http://www.columbia.edu/kermit/ckututor.html#initfile + 63. http://www.columbia.edu/kermit/ckututor.html#options + 64. http://www.columbia.edu/kermit/ckututor.html#kerbang + 65. http://www.columbia.edu/kermit/ckututor.html#cmdlist + 66. http://www.columbia.edu/kermit/ckututor.html#documentation + 67. http://www.columbia.edu/kermit/ckututor.html#initfile + 68. http://www.columbia.edu/kermit/ckututor.html#documentation + 69. http://www.columbia.edu/kermit/ckscripts.html + 70. http://www.columbia.edu/kermit/ckututor.html#documentation + 71. http://www.columbia.edu/kermit/ + 72. http://www.columbia.edu/kermit/ckermit.html + 73. http://www.columbia.edu/kermit/ckfaq.html + 74. http://www.columbia.edu/kermit/ckututor.html#top + 75. http://www.columbia.edu/kermit/ckututor.html#contents + 76. http://www.columbia.edu/kermit/ckututor.html#modes + 77. http://www.columbia.edu/kermit/ckututor.html#commands + 78. http://www.columbia.edu/kermit/ + 79. http://www.columbia.edu/kermit/ckermit.html + 80. http://www.columbia.edu/kermit/ckfaq.html + 81. http://www.columbia.edu/kermit/ckututor.html#top + 82. http://www.columbia.edu/kermit/ckututor.html#contents + 83. http://www.columbia.edu/kermit/ckututor.html#connections + 84. http://www.columbia.edu/kermit/ckututor.html#initfile + 85. http://www.columbia.edu/kermit/ckfaq.html#term + 86. http://www.columbia.edu/kermit/ + 87. http://www.columbia.edu/kermit/ckermit.html + 88. http://www.columbia.edu/kermit/ckfaq.html + 89. http://www.columbia.edu/kermit/ckututor.html#top + 90. http://www.columbia.edu/kermit/ckututor.html#contents + 91. http://www.columbia.edu/kermit/ckututor.html#transfer + 92. http://www.columbia.edu/kermit/ckututor.html#modes + 93. http://www.columbia.edu/kermit/ckututor.html#iksd + 94. ftp://ftp.isi.edu/in-notes/rfc2217.txt + 95. http://www.columbia.edu/kermit/ckututor.html#ftp + 96. http://www.columbia.edu/kermit/ + 97. http://www.columbia.edu/kermit/ckermit.html + 98. http://www.columbia.edu/kermit/ckfaq.html + 99. http://www.columbia.edu/kermit/ckututor.html#top + 100. http://www.columbia.edu/kermit/ckututor.html#contents + 101. http://www.columbia.edu/kermit/ckututor.html#server + 102. http://www.columbia.edu/kermit/ckututor.html#connections + 103. http://www.columbia.edu/kermit/ckututor.html#download + 104. http://www.columbia.edu/kermit/ckututor.html#upload + 105. http://www.columbia.edu/kermit/ckututor.html#oldfashioned + 106. http://www.columbia.edu/kermit/ckututor.html#trouble + 107. http://www.columbia.edu/kermit/ckututor.html#advanced + 108. http://www.columbia.edu/kermit/ckututor.html#nonkermit + 109. http://www.columbia.edu/kermit/kermit.html#notslow + 110. http://www.columbia.edu/kermit/ckermit.html + 111. http://www.columbia.edu/kermit/k95.html + 112. http://www.columbia.edu/kermit/k95.html + 113. http://www.columbia.edu/kermit/ckermit.html + 114. http://www.columbia.edu/kermit/mskermit.html + 115. http://www.columbia.edu/kermit/ + 116. http://www.columbia.edu/kermit/support.html + 117. http://www.columbia.edu/kermit/ckmanual.html + 118. mailto:kermit-support@columbia.edu + 119. http://www.columbia.edu/kermit/ckututor.html#documentation + 120. http://www.columbia.edu/kermit/ckututor.html#ftp + 121. http://www.columbia.edu/kermit/ + 122. http://www.columbia.edu/kermit/ckermit.html + 123. http://www.columbia.edu/kermit/ckfaq.html + 124. http://www.columbia.edu/kermit/ckututor.html#top + 125. http://www.columbia.edu/kermit/ckututor.html#contents + 126. http://www.columbia.edu/kermit/ckututor.html#ftp + 127. http://www.columbia.edu/kermit/ckututor.html#transfer + 128. http://www.columbia.edu/kermit/ckututor.html#iksd + 129. http://www.columbia.edu/kermit/ + 130. http://www.columbia.edu/kermit/ckermit.html + 131. http://www.columbia.edu/kermit/ckfaq.html + 132. http://www.columbia.edu/kermit/ckututor.html#top + 133. http://www.columbia.edu/kermit/ckututor.html#contents + 134. http://www.columbia.edu/kermit/ckututor.html#iksd + 135. http://www.columbia.edu/kermit/ckututor.html#transfer + 136. http://www.columbia.edu/kermit/ckututor.html#server + 137. http://www.columbia.edu/kermit/ftpclient.html + 138. http://www.columbia.edu/kermit/ckututor.html#documentation + 139. http://www.columbia.edu/kermit/ + 140. http://www.columbia.edu/kermit/ckermit.html + 141. http://www.columbia.edu/kermit/ckfaq.html + 142. http://www.columbia.edu/kermit/ckermit3.html#x3 + 143. http://www.columbia.edu/kermit/ckermit3.html#x2.2 + 144. http://www.columbia.edu/kermit/ckututor.html#top + 145. http://www.columbia.edu/kermit/ckututor.html#contents + 146. http://www.columbia.edu/kermit/ckututor.html#security + 147. http://www.columbia.edu/kermit/ckututor.html#ftp + 148. http://www.columbia.edu/kermit/cuiksd.html + 149. http://www.columbia.edu/kermit/iksd.html + 150. http://www.columbia.edu/kermit/ + 151. http://www.columbia.edu/kermit/ckermit.html + 152. http://www.columbia.edu/kermit/ckfaq.html + 153. http://www.columbia.edu/kermit/ckututor.html#top + 154. http://www.columbia.edu/kermit/ckututor.html#contents + 155. http://www.columbia.edu/kermit/ckututor.html#personae + 156. http://www.columbia.edu/kermit/ckututor.html#iksd + 157. http://www.columbia.edu/kermit/security.html + 158. http://www.columbia.edu/kermit/ + 159. http://www.columbia.edu/kermit/ckermit.html + 160. http://www.columbia.edu/kermit/ckfaq.html + 161. http://www.columbia.edu/kermit/ckututor.html#top + 162. http://www.columbia.edu/kermit/ckututor.html#contents + 163. http://www.columbia.edu/kermit/ckututor.html#license + 164. http://www.columbia.edu/kermit/ckututor.html#iksd + 165. http://www.columbia.edu/kermit/ckututor.html#options + 166. http://www.columbia.edu/kermit/ckermit3.html#x3.1.2 + 167. http://www.columbia.edu/kermit/ + 168. http://www.columbia.edu/kermit/ckermit.html + 169. http://www.columbia.edu/kermit/ckfaq.html + 170. http://www.columbia.edu/kermit/ckututor.html#top + 171. http://www.columbia.edu/kermit/ckututor.html#contents + 172. http://www.columbia.edu/kermit/ckututor.html#other + 173. http://www.columbia.edu/kermit/ckututor.html#personae + 174. ftp://kermit.columbia.edu/kermit/c-kermit/COPYING.TXT + 175. mailto:kermit@columbia.edu + 176. http://www.columbia.edu/kermit/ + 177. http://www.columbia.edu/kermit/ckermit.html + 178. http://www.columbia.edu/kermit/ckfaq.html + 179. http://www.columbia.edu/kermit/ckututor.html#top + 180. http://www.columbia.edu/kermit/ckututor.html#contents + 181. http://www.columbia.edu/kermit/ckututor.html#documentation + 182. http://www.columbia.edu/kermit/ckututor.html#license + 183. http://www.columbia.edu/kermit/ + 184. http://www.columbia.edu/kermit/howtoget.html + 185. http://www.columbia.edu/kermit/ + 186. http://www.columbia.edu/kermit/ckermit.html + 187. http://www.columbia.edu/kermit/ckfaq.html + 188. http://www.columbia.edu/kermit/ckututor.html#top + 189. http://www.columbia.edu/kermit/ckututor.html#contents + 190. http://www.columbia.edu/kermit/ckututor.html#files + 191. http://www.columbia.edu/kermit/ckututor.html#other + 192. http://www.columbia.edu/kermit/ckmanual.html + 193. http://www.columbia.edu/kermit/ckermit70.html + 194. http://www.columbia.edu/kermit/ckermit80.html + 195. http://www.columbia.edu/kermit/ckermit.html + 196. http://www.columbia.edu/kermit/ck80binaries.html + 197. http://www.columbia.edu/kermit/scriptlib.html + 198. http://www.columbia.edu/kermit/newfaq.html + 199. http://www.columbia.edu/kermit/ckfaq.html + 200. http://www.columbia.edu/kermit/security.html + 201. http://www.columbia.edu/kermit/telnet.html + 202. http://www.columbia.edu/kermit/studies.html + 203. http://www.columbia.edu/kermit/ckcbwr.html + 204. http://www.columbia.edu/kermit/ckubwr.html + 205. http://www.columbia.edu/kermit/ckvbwr.html + 206. http://www.columbia.edu/kermit/ckuins.html + 207. http://www.columbia.edu/kermit/ckvins.html + 208. http://www.columbia.edu/kermit/support.html + 209. http://www.columbia.edu/kermit/k95tutorial.html + 210. news:comp.protocols.kermit.misc + 211. http://www.columbia.edu/kermit/ + 212. http://www.columbia.edu/kermit/ckermit.html + 213. http://www.columbia.edu/kermit/ckfaq.html + 214. http://www.columbia.edu/kermit/ckututor.html#top + 215. http://www.columbia.edu/kermit/ckututor.html#contents + 216. http://www.columbia.edu/kermit/ckututor.html#authors + 217. http://www.columbia.edu/kermit/ckututor.html#documentation + 218. ftp://kermit.columbia.edu/kermit/c-kermit/COPYING.TXT + 219. ftp://kermit.columbia.edu/kermit/c-kermit/ckermit.ini + 220. ftp://kermit.columbia.edu/kermit/c-kermit/ckermod.ini + 221. http://www.columbia.edu/kermit/ckuins.html + 222. http://www.columbia.edu/kermit/ckcbwr.html + 223. http://www.columbia.edu/kermit/ckubwr.html + 224. http://www.columbia.edu/kermit/ckcplm.html + 225. http://www.columbia.edu/kermit/ckccfg.html + 226. http://www.columbia.edu/kermit/ckuins.html + 227. http://www.columbia.edu/kermit/ + 228. http://www.columbia.edu/kermit/ckermit.html + 229. http://www.columbia.edu/kermit/ckfaq.html + 230. http://www.columbia.edu/kermit/ckututor.html#top + 231. http://www.columbia.edu/kermit/ckututor.html#contents + 232. http://www.columbia.edu/kermit/ckututor.html#files + 233. mailto:kermit@columbia.edu -- 2.11.0