--- /dev/null
+
+ 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
+ <eay@cryptosoft.com>.
+
+ 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.
+
+ <FORM ACTION="http://www.xyzcorp.com/cgi-bin/form.cgi" METHOD="POST">
+ <INPUT NAME="Red">
+ <INPUT NAME="White">
+ <INPUT NAME="Blue">
+ </FORM>
+
+ 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<Tab>
+
+ 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<Tab>
+
+ Kermit prints:
+
+ cat "this "<Beep>
+
+ 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<Tab>
+
+ "*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<Tab>
+
+ 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 <d e [f g {h i} j k] l m> 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 <k l> 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 <k l> 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