ckermit2.txt
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:668k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

  1. where "xxx" is the connection type, e.g.
  2.   SET FLOW /REMOTE NONE
  3.   SET FLOW /DIRECT RTS/CTS
  4. If you leave out the switch, SET FLOW works as before, choosing the flow
  5. control method to be used on the current connection:
  6.   SET FLOW XON/XOFF
  7. Thus, whenever you make a connection with SET PORT, SET LINE, DIAL, SET HOST,
  8. TELNET, RLOGIN, etc, an appropriate form of flow control is selected
  9. automatically.  You can override the automatic selection with a subsequent
  10. SET FLOW command, such as SET FLOW NONE (no switch included).
  11. The flow control is changed automatically too when you give a SET MODEM TYPE
  12. command.  For example, suppose your operating system (say Linux) supports
  13. hardware flow control (RTS/CTS).  Now suppose you give the following
  14. commands:
  15.   set line /dev/ttyS2    ; Automatically sets flow to NONE
  16.   set modem type usr     ; Automatically sets flow to RTS/CTS
  17.   set modem type rolm    ; Doesn't support RTS/CTS so now flow is XON/XOFF
  18. IMPORTANT: This new feature tends to make the order of SET LINE/HOST and
  19. SET FLOW commands matter, where it didn't before.  For example, in VMS:
  20.   SET FLOW KEEP
  21.   SET LINE TTA0:
  22. the SET LINE undoes the SET FLOW KEEP command; the sequence now must be:
  23.   SET FLOW /DIRECT KEEP
  24.   SET LINE TTA0:
  25. or:
  26.   SET LINE TTA0:
  27.   SET FLOW KEEP
  28. 2.14. Trapping Connection Establishment and Loss
  29. If you define a macro called ON_OPEN, it is executed any time that a SET LINE,
  30. SET PORT, SET HOST, TELNET, RLOGIN or similar command succeeds in opening a
  31. connection.  The argument is the host or device name (as shown by SHOW
  32. COMMUNICATIONS, and the same as v(line)).  This macro can be used for all
  33. sorts of things, like automatically setting connection- or host-specific
  34. parameters when the connection is opened.  Example:
  35.   def ON_OPEN {
  36.       switch %1 {
  37.         :abccorp.com, set reliable off, break
  38.         :xyzcorp.com, set receive packet-length 1000, break
  39.         etc etc...
  40.       }
  41.   }
  42. If you define a macro called ON_CLOSE, it will be executed any time that
  43. a SET LINE, SET PORT, SET HOST, TELNET, RLOGIN or any other kind of connection
  44. that C-Kermit has made is closed, either by the remote or by a local CLOSE,
  45. HANGUP, or EXIT command or other local action, such as when a new connection
  46. is opened before an old one was explicitly closed.
  47. As soon as C-Kermit notices the connection has been closed, the ON_CLOSE macro
  48. is invoked at (a) the top of the command parsing loop, or (b) when a
  49. connection is closed implicitly by a command such as SET LINE that closes any
  50. open connection prior to making a new connection, or (c) when C-Kermit closes
  51. an open connection in the act of exiting.
  52. The ON_CLOSE macro was inspired by the neverending quest to unite Kermit and
  53. SSH (*).  In this case using the "tunnel" mechanism:
  54.   def TUNNEL {                                ; %1 = host to tunnel to
  55.       local %p
  56.       if not def %1 stop 1
  57.       assign tunnelhost %1                   ; Make global copy
  58.       undef on_close
  59.       set macro error off
  60.       close connection                        ; Ignore any error
  61.       open !read tunnel start %1
  62.       read %p                                ; Get port number
  63.       if fail stop 1 Tunnel failure: %1
  64.       close read
  65.       if fail stop 1 Tunnel failure: %1      ; See Section 4.2.8.1
  66.       assign on_close {                       ; Set up close handler
  67.           echo Closing tunnel: m(tunnelhost)
  68.           !tunnel stop m(tunnelhost)
  69.           undef on_close
  70.       }
  71.       set host localhost:%p /telnet
  72.       if success end 0
  73.       undef on_close
  74.       stop 1 Connection failure: %1
  75.   }
  76. In this case, when the connection stops, we also need to shut down the tunnel,
  77. even if it is at a later time after TUNNEL has finished executing.  This way
  78. we can escape back, reconnect, transfer files, and so on until the connection
  79. is broken by logging out from the remote, or by explicitly closing it, or by
  80. EXITing from C-Kermit, at which time the tunnel is shut down.
  81. When the connection is closed, no matter how, the ON_CLOSE macro executes
  82. and then undefines (destroys) itself, since we don't want to be closing
  83. tunnels in the future when we close subsequent connections.
  84. Other such tricks can be imagined, including ending ON_CLOSE with a STOP
  85. command to force the command stack to be peeled all the way back to the top,
  86. for example in a deeply nested script that depends on the connection being
  87. open:
  88.   def on_close { stop 1 CONNECTION LOST }
  89. When C-Kermit invokes the ON_CLOSE macro, it supplies one argument (%1):
  90. the reason the connection was closed as a number, one of the following:
  91.   2 - Fatal failure to negotiate a required item on a network connection.
  92.   1 - Closed by C-Kermit command.
  93.   0 - All others (normally closed by remote).
  94. which may be used for any purpose; for example, to add a comment to the
  95. connection log:
  96.   def on_close {
  97.       local %m
  98.       if not open cx end 0
  99.       switch %1 {
  100.         :0, .%m = Closed by remote, break
  101.         :1, .%m = Closed by me, break
  102.         :2, .%m = Network protocol negotiation failure, break
  103.       }
  104.       if def %m writeln cx {# %m}
  105.   }
  106. (*) SSH can not be included in C-Kermit due to licensing, patent, and
  107.     USA export law restrictions.  Furthermore, the 'ssh' client that is
  108.     distributed for UNIX can not be run by C-Kermit's PIPE command because
  109.     it does not use standard i/o.
  110. 2.15. Contacting Web Servers with the HTTP Command
  111. C-Kermit 7.0 (at this writing, the UNIX version only) supports direct contact
  112. and interaction with Web servers via HTTP 1.0 protocol.  To make a connection,
  113. use Kermit's normal method for making a TCP/IP connection, but specify the
  114. HTTP port:
  115.   SET HOST <host> http [ <switches> ]
  116. where <host> is the IP hostname or address, and http is the name of the
  117. TCP port for the Web server.  Relevant switches include:
  118. /RAW
  119.   Treat the connection as a transparent binary pipe.  This switch may be
  120.   required if a port other than 'http' is used.
  121. /SSL
  122.   Make an secure private connection with SSL (only if SSL support is included
  123.   in your version of Kermit).  In this case the port name might need to be
  124.   https rather than http, e.g. "set host secureserver.xyxcorp.com https /ssl".
  125. /TLS
  126.   Make an secure private connection with TLS (only if TLS support is included
  127.   in your version of Kermit).  In this case the port name would be https
  128.   rather than http.
  129. Then you can issue an HTTP command.  In most cases, the server closes the
  130. connection when the command is complete.  Example:
  131.   SET HOST www.columbia.edu http
  132.   IF FAIL EXIT 1 Can't contact server
  133.   HTTP GET kermit/index.html
  134. At this point the connection is closed, since that's how HTTP 1.0 works.  If
  135. you want to perform additional operations, you must establish a new connection
  136. with another SET HOST command.
  137. The HTTP command acts as a client to the Web server, except instead of
  138. displaying the results like a Web browser would, it stores them.  Any HTTP
  139. command can (but need not) include any or all of the following switches:
  140. /AGENT:<user-agent>
  141.   Identifies the client to the server; "C-Kermit" or "Kermit-95"
  142.   by default.
  143. /HEADER:<header-line>
  144.   Used for specifying any optional headers.  A list of headers is provided
  145.   using braces for grouping:
  146.     /HEADER:{{<tag>:<value>}{<tag>:<value>}...}
  147.   For a listing of valid <tag> value and <value> formats see RFC 1945:
  148.   "Hypertext Transfer Protocol -- HTTP/1.0".  A maximum of eight headers
  149.   may be specified.
  150. /USER:<name>
  151.   In case a page requires a username for access.
  152. /PASSWORD:<password>
  153.   In case a page requires a password for access.
  154. /ARRAY:<arrayname>
  155.   Tells Kermit to store the response headers in the given array, one line per
  156.   element.  The array need not be declared in advance.  Example:
  157.     http /array:c get kermit/index.html
  158.     show array c
  159.     Dimension = 9
  160.     1. Date: Fri, 26 Nov 1999 23:12:22 GMT
  161.     2. Server: Apache/1.3.4 (Unix)
  162.     3. Last-Modified: Mon, 06 Sep 1999 22:35:58 GMT
  163.     4. ETag: "bc049-f72-37d441ce"
  164.     5. Accept-Ranges: bytes
  165.     6. Content-Length: 3954
  166.     7. Connection: close
  167.     8. Content-Type: text/html
  168. As you can see, the header lines are like MIME e-mail header lines:
  169. identifier, colon, value.  The /ARRAY switch is the only method available
  170. to a script to process the server responses for a POST or PUT command.
  171. The HTTP commands are:
  172. HTTP [ <switches> ] GET <remote-filename> [ <local-filename> ]
  173.   Retrieves the named file.  If a <local-filename> is given, the file is
  174.   stored locally under that name; otherwise it is stored with its own name.
  175. HTTP [ <switches> ] HEAD <remote-filename> <local-filename>
  176.   Like GET except without actually getting the file; instead it gets only
  177.   the headers, storing them into the given file, whose name must be given,
  178.   one line per header item, as shown above in the /ARRAY: switch description.
  179. HTTP [ <switches> ] INDEX <remote-directory> [ <local-filename> ]
  180.   Retrieves the file listing for the given server directory.
  181.   NOTE: This command is not supported by most Web servers.
  182. HTTP [ <switches> ] POST [ /MIME-TYPE:<type> ] <local-file> <remote-file>
  183.   Used to send a response as if it were sent from a form.  The data to be
  184.   posted must be read from a file.
  185. HTTP [ <switches> ] PUT [ /MIME-TYPE:<type> ] <local-file> <remote-file>
  186.   Uploads a local file to a server file.
  187. HTTP [ <switches> ] DELETE <remote-filename>
  188.   Instructs the server to delete the specified filename.
  189. (3) TERMINAL CONNECTION
  190. 3.1. CONNECT Command Switches
  191. The following switches (see section 1.5) were added to the CONNECT command
  192. in 7.0:
  193.   /QUIETLY
  194.     Don't print the "Connecting to..." or "Back at..." messages.
  195.     CQ is an invisible command synonym for CONNECT /QUIETLY.
  196.   /TRIGGER:string
  197.     Specify a trigger or triggers (Section 3.2) effective for this CONNECT
  198.     command only, temporarily overriding any current SET TERMINAL TRIGGER
  199.     values (Section 3.2).
  200. Note: Other switches might also be available; type "connect ?" for a list,
  201. "help connect" for a description of each.
  202. 3.2. Triggers
  203. Triggers were added for UNIX, VMS, AOS/VS, and K95 in C-Kermit 7.0.
  204. SET TERMINAL TRIGGER string
  205.   Tells C-Kermit to look for the given string during all subsequent CONNECT
  206.   sessions, and if seen, to return to command mode automatically, as if you
  207.   had escaped back manually.  If the string includes any spaces, you must
  208.   enclose it in braces.  Example:
  209.     SET TERMINAL TRIGGER {NO CARRIER}
  210. Comparisons are made after character-set translation.
  211. If a string is to include a literal brace character, precede it with a
  212. backslash:
  213.     ; My modem always makes this noise when the connection is lost:
  214.     SET TERMINAL TRIGGER |||ppp{{{{UUUUUUU
  215. If you want Kermit to look for more than one string simultaneously, use the
  216. following syntax:
  217.     SET TERMINAL TRIGGER {{string1}{string2}...{stringn}}
  218. In this case, C-Kermit will return to command mode automatically if any of
  219. the given strings is encountered.  Up to 8 strings may be specified.
  220. If the most recent return to command mode was caused by a trigger, the new
  221. variable, v(trigger), shows the trigger value; otherwise v(trigger) is
  222. empty.
  223. The SHOW TRIGGER command displays the SET TERMINAL TRIGGER values as well as
  224. the v(trigger) value.
  225. 3.3. Transparent Printing
  226. As noted in the manual, C-Kermit's CONNECT command on UNIX is not a terminal
  227. emulator, but rather a "semitransparent pipe" between the terminal or emulator
  228. you are using to access C-Kermit, and the remote host to which C-Kermit is
  229. connected.  The "semitransparent" qualifier is because of character-set
  230. translation as well as several actions taken by the emulator in response to
  231. the characters or strings that pass through it, such as APCs, Kermit packets
  232. (autodownload), triggers, etc.
  233. The UNIX version of C-Kermit 7.0 adds another such action: Transparent
  234. printing, also called Controller printing (as distinct from Autoprint or line
  235. or screen print).  It is intended mainly for use on UNIX workstation consoles
  236. (as opposed to remote logins), but with some care can also be used when
  237. accessing C-Kermit remotely.
  238. Transparent printing is related to APC by sharing C-Kermit's built-in ANSI
  239. escape-sequence parser to detect "printer on" and "printer off" sequences from
  240. the host.  When the printer-on sequence is received, all subsequent arriving
  241. characters -- including NUL, control characters, and escape sequences --
  242. are sent to the SET PRINTER device instead of to your screen until
  243. the printer-off sequence is received, or you escape back, whichever happens
  244. first.  These bytes are not translated or modified or filtered in any way
  245. by Kermit (except for possibly stripping of the 8th bit, as noted below), but
  246. if filtering or translation is desired, this can be accomplished by your
  247. SET PRINTER selection (e.g. by choosing a pipeline of filters).
  248. By default, your SET PRINTER device is your default UNIX printer, but
  249. it can also be a file, a command, or the null device (which causes all printer
  250. material to be discarded).  See "Using C-Kermit", 2nd Ed., p.41 for details.
  251. Transparent printing is controlled by the command:
  252. SET TERMINAL PRINT { ON, OFF }
  253.   When ON, transparent-print sequences are obeyed, and printing occurs on the
  254.   system where C-Kermit is running.  When OFF, transparent print sequences are
  255.   ignored and passed through to your actual terminal or emulator, along with
  256.   the data they enclose.  OFF is the default, for compatibility with earlier
  257.   C-Kermit releases.  As noted in the manual, when the current SET PRINTER
  258.   device is a file, transparent-print material is appended to it; the file is
  259.   not overwritten.
  260. SET TERMINAL BYTESIZE { 7, 8 }
  261. SET PARITY { EVEN, ODD, MARK, SPACE, NONE }
  262.   If the terminal bytesize is 7, or PARITY is not NONE, the 8th bit of each
  263.   byte is stripped prior to printing.
  264. The transparent-print escape sequences are:
  265. <ESC>[5i
  266.   Printer On.  Send all subsequent incoming bytes to the printer without
  267.   any kind of filtering, translation, or alteration.  Note: <ESC> stands for
  268.   ASCII character number 27 (decimal), Escape.
  269. <ESC>[4i
  270.   Printer Off.  Resume displaying incoming bytes on the screen.
  271. These are the same sequences used by DEC VT100 and higher terminals and other
  272. ANSI X3.64 and ISO 6429 compatible terminals.  There is no provision for
  273. selecting other printer-control sequences.
  274. Restrictions:
  275.  1. You must SET TERM TRANSPARENT-PRINT ON before you can use this feature.
  276.  2. Only the 7-bit forms of the escape sequences are supported.  The 8-bit
  277.     CSI C1 control is not recognized.
  278.  3. Autoprint is not supported, since this requires a full-fledged terminal
  279.     emulator with direct access to the screen.
  280.  4. The start-print and stop-print sequences pass through to the screen (there
  281.     is no way to avoid this without causing unacceptable delays or deadlocks
  282.     in CONNECT mode).  Thus if your terminal or emulator also supports
  283.     transparent printing via these same sequences, an empty file will be sent
  284.     to its printer.  Normally this has no effect.
  285. Point (4) is similar to the situation with autodownload and APC -- when you
  286. have several Kermit clients in a chain, you should take care that these
  287. features are enabled in only one of them.
  288. Example 1:
  289.   set printer {|lpr -Plaser}  ; Specify the printer (if not default).
  290.   set term print on           ; Enable transparent printing.
  291.   set term byte 8             ; Enable 8-bit characters.
  292.   connect                     ; Enter CONNECT mode.
  293. Example 2:
  294.   set printer /home/users/olga/printer.log  ; Send printer material to a file.
  295. Example 3:
  296.   set printer {| grep -v ^Received | lpr}   ; Filter out some lines
  297. Then use "pcprint" or "vtprint" commands on the host to initiate transparent
  298. print operations.  See "Using C-Kermit", 2nd Ed., p.406 for details.
  299. Here is a sample "pcprint" shell script for UNIX:
  300. #!/bin/sh
  301. echo -n '<ESC>[5i'
  302. if [ $# -eq 0 ]; then
  303.   cat
  304. else
  305.   cat $*
  306. fi
  307. echo -n '<FF><ESC>[4i'
  308. # (end)
  309. (Replace "<ESC>" by the actual ASCII Escape character and "<FF>" by the
  310. ASCII Formfeed character).
  311. If you always want transparent printing enabled, put "set term print on"
  312. in your C-Kermit customization file (~/.mykermrc in UNIX).  The "set term
  313. bytesize" selection, however, is a property of each separate connection.
  314. 3.4. Binary and Text Session Logs
  315. C-Kermit 7.0 corrects an oversight in earlier releases, in which binary
  316. session logs (SET SESSION-LOG BINARY) translated character sets and performed
  317. various formatting transformations (e.g. "newline mode") before writing
  318. characters to the session log.  In C-Kermit 7.0, binary-mode session logging
  319. writes characters as they come in, before anything (other that parity-bit
  320. stripping) is done to them.  Text-mode session logging records the characters
  321. after processing.
  322. (4) FILE TRANSFER
  323. Every file is transferred either in text mode (which implies record-format
  324. and character-set translation) or binary mode (in which each byte is sent
  325. literally without any kind of conversion).  The mode in which a file is
  326. transferred is controlled by (a) the default mode, in the absence of any
  327. other indications; (b) the SET FILE TYPE command; (c) various automatic
  328. mechanisms based on client/server negotiations, directory information or
  329. filename patterns, etc.
  330. The default FILE TYPE was changed from TEXT to BINARY in C-Kermit 7.0
  331. because:
  332.  . Transferring a text file in binary mode does less damage than
  333.    transferring a binary file in text mode.
  334.  . Only binary-mode transfers can be recovered from the point of failure.
  335.  . The automatic transfer-mode mechanisms switch to text mode on a per-file
  336.    basis anyway, so only those files that are not covered by the automatic
  337.    mechanisms are affected.
  338.  . All file transfers on the Web are done in binary mode, so people are
  339.    accustomed to it and expect it.
  340. 4.0. BUG FIXES, MINOR CHANGES, AND CLARIFICATIONS
  341. 4.0.0. Filenames with Spaces
  342. Filenames that contain spaces are a major nuisance to a program like Kermit,
  343. whose command language is line- and word-oriented, in which words are
  344. separated by spaces and a filename is assumed to be a "word".  In general
  345. (unless noted otherwise in the description of a particular command), there is
  346. only one way to refer to such files in Kermit commands, and that is to enclose
  347. the name in braces:
  348.   send {this file}
  349. Tells Kermit to send the file whose name is "this file" (two words, no
  350. quotes).  Of course, various circumlocutions are also possible, such as:
  351.   define %a this file
  352.   send %a
  353. BUT, perhaps contrary to expectation, you can't use "32" to represent the
  354. space:
  355.   send this32file
  356. does not work.  Why?  Because the Kermit parser, which must work on many
  357. operating systems including Windows, has no way of knowing what you mean by
  358. "this32file".  Do you mean a file whose name is "this file" in the current
  359. directory?  Or do you mean a file whose name is "32file" in the "this"
  360. subdirectory of the current directory?  Guessing won't do here; Kermit must
  361. behave consistently and deterministically in all cases on all platforms.
  362. Note that you can't use Esc or Tab within {...} for filename completion,
  363. or question mark to get a filename list.  However, you can include wildcards;
  364. for example:
  365.   send {* *}
  366. sends all files whose name contains a space.
  367. All things considered, it is best to avoid spaces in file and directory names
  368. if you can.  Also see Section 5.4 on this topic.
  369. 4.0.1. Packet out of Window
  370. C-Kermit 6.0 could send packets "out of window" if the window size was
  371. greater than 1 and ACKs had arrived out of order.  Fixed in 6.1.
  372. 4.0.2. MOVE after ADD SEND-LIST
  373. ADD SEND-LIST followed by MOVE did not delete original files; fixed in 6.1.
  374. Carrier loss was not detected during transfer; in 7.0 C-Kermit checks for
  375. this (but results can not be guaranteed).  In any case, the protocol will
  376. eventually time out if the connection is lost.
  377. 4.0.3. GET and RECEIVE As-Names
  378. In 5A(190) through 6.0.192, the GET and RECEIVE as-name did not properly
  379. override the RECEIVE PATHNAMES setting.  In 7.0 it does.
  380. 4.0.4. New Brief Statistics Listing
  381. Version 7.0 adds a /BRIEF switch to the STATISTICS command, to display a short
  382. file-transfer statistics report.  /BRIEF is now the default.  Use /VERBOSE to
  383. see the full display, which is about 25 lines long.
  384. 4.0.5. Improved FAST Command
  385. The preinstalled definition of the FAST macro did not take enough factors into
  386. account.  Now it sets packet lengths and window sizes appropriate to the
  387. configuration.  Furthermore, in IRIX only, it might restrict the SEND packet
  388. length to 4000, to work around a bug in the IRIX Telnet server, depending on
  389. the IRIX version (see ckubwr.txt, IRIX section).  To see the built-in
  390. definition of the FAST macro, type "show macro fast".  To change it, simply
  391. define it to be whatever you want -- it's just a macro, like any other.
  392. 4.0.6. The SET SEND BACKUP Command
  393. Version 7.0 adds SET SEND BACKUP { ON, OFF }.  This tells whether backup
  394. files should be sent.  Backup files are the ones created by Kermit (and EMACS,
  395. and possibly other applications) to preserve old copies of files when creating
  396. new ones with the same name.  Kermit does this when receiving a file and its
  397. FILE COLLISION setting is BACKUP (or RENAME, in which case it the new file
  398. gets the backup name).  On most platforms, the backup name is formed by adding:
  399.   .~n~
  400. to the end of the filename, where "n" is a number.  For example, if the
  401. original file is oofa.txt, a backup file might be called:
  402.   oofa.txt.~1~
  403. (or oofa.txt.~2~, etc).  If you SET SEND BACKUP OFF, this tells Kermit not to
  404. send files that have backup names.  Normally, SET SEND BACKUP is ON (as shown
  405. by SHOW PROTOCOL), and backup files are sent if their names match the SEND
  406. file specification.
  407. Also see PURGE, SET FILE COLLISION, SEND /NOBACKUP, DIRECTORY /[NO]BACKUP.
  408. 4.0.7. The SET { SEND, RECEIVE } VERSION-NUMBERS Command
  409. VMS Only.  Normally when sending files, VMS C-Kermit strips the version
  410. number.  For example, if the file is FOO.BAR;34, the name is sent as FOO.BAR
  411. (without the ";34").  If you want to keep version numbers on when sending
  412. files, use SET SEND VERSION-NUMBERS ON.  The effect depends on the receiver.
  413. Normally when receiving files, and an incoming filename includes a VMS-style
  414. version number (such as FOO.BAR;34) VMS C-Kermit strips it before trying to
  415. create the new file; this way the new file receives the next highest version
  416. number in the customary manner for VMS.  If you want version numbers on
  417. incoming filenames to be used in creating the new files, use SET RECEIVE
  418. VERSION-NUMBERS ON.
  419. Normally these commands would be effective only when VMS C-Kermit is
  420. exchanging files with a non-VMS Kermit program, since VMS-to-VMS transfers use
  421. labeled mode unless you have gone out of your way to defeat it.
  422. Example: You want to send all versions of all files in the current directory
  423. from a VMS C-Kermit client to a UNIX C-Kermit server.  Use:
  424.   set send version-numbers on
  425.   send *.*;*
  426. The resulting Unix files will have VMS-style version numbers as part of their
  427. name, for example "foo.bar;1", "foo.bar;2", etc.
  428. Now suppose you want to send these files from Unix to another VMS system and
  429. preserve the version numbers.  Again we have a Unix C-Kermit server and VMS
  430. C-Kermit client.  Give these commands to the client:
  431.   set receive version-numbers on
  432.   get *
  433. 4.0.8. The SET { SEND, RECEIVE } { MOVE-TO, RENAME-TO } Commands
  434. These commands are persistent global versions of the /MOVE-TO: and
  435. /RENAME-TO: switches of the SEND, GET, and RECEIVE commands.  They should
  436. normally be used only when setting up a dedicated transaction-processing
  437. application, in which each file is to be moved or renamed immediately after,
  438. and only if, it is transferred successfully, so that (for example) an
  439. independent, concurrent process can notice when new files appear and process
  440. them immediately without having to guess whether they are complete.
  441. 4.0.9. SET FILE INCOMPLETE AUTO
  442. SET FILE INCOMPLETE { KEEP, DISCARD }, which tells whether to keep or discard
  443. incompletely received files, has a new option, AUTO, which is also the
  444. default.  It means KEEP the incomplete file if the transfer is in binary mode,
  445. otherwise DISCARD it.  This reduces the chances that a subsequent recovery
  446. operation (RESEND, REGET, etc) could produce a corrupt file, since recovery
  447. works only for binary-mode transfers.
  448. 4.1. FILE-TRANSFER FILENAME TEMPLATES
  449. File-transfer filename templates allow files to be renamed automatically by
  450. the file sender, the receiver, or both, during transfer of groups of files.
  451. 4.1.1. Templates in the As-Name
  452. Prior to C-Kermit 6.1 and Kermit 95 1.1.12 the only options that could be
  453. used to affect the names of files being transferred were SET FILENAMES
  454. { LITERAL, CONVERTED } and SET { SEND, RECEIVE } PATHNAMES { ON, OFF }, plus
  455. the "as-name" feature of the SEND (MOVE, etc) and RECEIVE commands.
  456. Previously, the as-name could be used only for a single file.  For example:
  457.   SEND FOO BAR
  458. would send the file FOO under the name BAR, but:
  459.   SEND *.TXT anything
  460. was not allowed, since it would give the same name to each file that was sent.
  461. When receiving:
  462.   RECEIVE FOO
  463. would rename the first incoming file to FOO before storing it on the disk,
  464. but subsequent files would not be renamed to FOO, since this would result in
  465. overwriting the same file repeatedly.  Instead, they were stored under the
  466. names they arrived with.
  467. Beginning in C-Kermit 6.1 and Kermit 95 1.1.12, it is possible to
  468. specify as-names in SEND, RECEIVE, and related commands even for file
  469. groups.  This is accomplished by using replacement variables in the as-name,
  470. along with optional material such character-string functions and/or constant
  471. strings.  An as-name containing replacement variables is called a filename
  472. template.
  473. The key to filename templates is the new variable:
  474.   v(filename)
  475. During file transfer it is replaced by the name of each file currently being
  476. transferred (after transfer, it is the name of the last file transferred).
  477. So, for example:
  478.   send *.txt v(filename).new
  479. sends each file with its own name, but with ".new" appended to it.  Of course
  480. if the name already contains periods, this could confuse the file receiver, so
  481. you can also achieve fancier effects with constructions like:
  482.   send *.txt freplace(v(filename),.,_).new
  483. which replaces all periods in the original filename by underscores, and then
  484. appends ".new" to the result.  So, for example, oofa.txt would be sent as
  485. oofa_txt.new.
  486. Another new variable that is useful in this regard is v(filenumber), which
  487. is the ordinal number of the current file in the file group, so you can also:
  488.   send *.txt FILEflpad(v(filenum),2,0)
  489. resulting in a series of files called FILE00, FILE01, FILE02, etc.  (At the
  490. end of the transfer, v(filenum) tells the number of files that were
  491. transferred).
  492. If you specify a constant as-name when sending a file group:
  493.   send *.txt thisnameonly
  494. Kermit complains and asks you to include replacement variables in the
  495. as-name.  You should generally use v(filename) or v(filenumber) for this
  496. purpose, since other variables (with the possible exception of date/time
  497. related variables) do not change from one file to the next.  But Kermit
  498. accepts any as-name at all that contains any kind of variables for file
  499. group, even if the variable will not change.  So:
  500.   send *.txt %a
  501. is accepted, but all files are sent with the same name (the value of %a, if
  502. it has one and it is constant).  If the variable has no value at all, the
  503. files are sent under their own names.
  504. Of course, the value of %a in the previous example need not be constant:
  505.   define %a FILEflpad(v(filenum),2,0)_at_v(time)
  506.   send *.txt %a
  507. The RECEIVE command, when given without an as-name, behaves as always, storing
  508. all incoming files under the names they arrive with, subject to SET FILE NAME
  509. and SET RECEIVE PATHNAMES modifications (Section 4.10).
  510. However, when an as-name is given in the RECEIVE command, it is applied to
  511. all incoming files rather than to just the first.  If it does not contain
  512. replacement variables, then the current FILE COLLISION setting governs the
  513. result.  For example:
  514.   receive foo
  515. will result in incoming files named foo, foo.~1~, foo.~2~, and so on, with the
  516. default FILE COLLISION setting of BACKUP.  If it does contain replacement
  517. variables, of course they are used.
  518. When receiving files, the v(filename) variable refers to the name that was
  519. received in the incoming file-header packet, BEFORE any processing by SET
  520. FILE NAMES or SET RECEIVE PATHNAMES.  Since the filenames in file-header
  521. packets are usually in uppercase, you would need to convert them explicitly
  522. if you want them in lowercase, e.g.:
  523.   receive flower(v(filename)).new
  524. 4.1.2. Templates on the Command Line
  525. On the command-line, use templates as shown above as the -a option argument,
  526. bearing in mind the propensity of UNIX and perhaps other shells to treat
  527. backslash as a shell escape character.  So in UNIX (for example):
  528.   kermit -s oofa.* -a x.\v(filenum)
  529. By the way, this represents a change from 6.0 and earlier releases in
  530. which the as-name (-a argument or otherwise) was not evaluated by the command
  531. parser.  Thus, for example, in VMS (where the shell does not care about
  532. backslashes), it was possible to:
  533.   kermit -s oofa.txt -a c:tmpoofa.txt
  534. Now backslashes in the as-name must be quoted not only for the shell (if
  535. necessary) but also for Kermit itself:
  536.   kermit -s oofa.txt -a c:\tmp\oofa.txt      ; Kermit only
  537.   kermit -s oofa.txt -a c:\\tmp\\oofa.txt  ; Shell and Kermit
  538. You can also use the fliteral() function for this:
  539.   kermit -s oofa.txt -a fliteral(c:tmpoofa.txt)      ; Kermit only
  540.   kermit -s oofa.txt -a \fliteral(c:\tmp\oofa.txt)   ; Shell and Kermit
  541. 4.1.3. Post-Transfer Renaming
  542. Filename templates are now also useful in SET { SEND, RECEIVE } RENAME-TO and
  543. in the /RENAME-TO: switch, that can be given to the SEND, GET, or RECEIVE
  544. commands; this is similar to an as-name, but is effective on a per-file basis
  545. if and only if the file was transferred successfully.
  546. MOVE-TO and RENAME-TO address a requirement commonly stated for transaction
  547. processing and similar systems.  Suppose, for example, a central system "X"
  548. accepts connections from multiple clients simultaneously; a process on X waits
  549. for a file to appear and then processes the file.  This process must have a
  550. way of knowing when the file has been completely and successfully transferred
  551. before it starts to process it.  This can be accomplished easily using
  552. C-Kermit's SET { SEND, RECEIVE } { MOVE-TO, RENAME-TO } command or /MOVE-TO:
  553. or /RENAME-TO: switches, described in Sections 4.7.1-3.
  554. Here's an example for the client side, in which files to be sent are placed in
  555. a certain directory (/usr/olga/tosend in this example) by another process when
  556. they are ready to go.  This might be in a hospital or big doctor's office,
  557. where medical insurance claims are entered at a number of workstations, and
  558. then deposited in the "tosend" directory, from which they are sent to a claims
  559. clearinghouse.  We assume the connection is already made and a Kermit server
  560. is on the other end.
  561.   local srcdir findir              ; Declare local (automatic) variables
  562.   assign srcdir /usr/olga/tosend   ; Local source directory (files to send)
  563.   assign findir /usr/olga/sent     ; Where to move files after they are sent
  564.   log transactions                 ; Keep a log of transfers
  565.   cd m(srcdir)                    ; Change to the source directory
  566.   while true {                     ; Loop forever...
  567.       send /move-to:m(findir) *   ; Send all files
  568.       sleep 60                     ; Sleep a minute
  569.   }                                ; Go back and do it again
  570. Note how simple this is.  Once each file is sent, it is moved so it won't be
  571. sent again (you could also use SEND /RENAME-TO: or even SEND /DELETE).  If a
  572. transfer fails, the file is not moved and so we try again to send it next time
  573. around.  If there are no files to send, the SEND command does nothing but a
  574. message is printed; you can avoid the message by checking first to see if any
  575. files are in the directory:
  576.   while true {                     ; Loop forever...
  577.       if > ffiles(*) 0 -          ; If there are any files
  578.         send /move-to:m(findir) * ; send them.
  579.       sleep 60                     ; Sleep a minute.
  580.   }                                ; Go back and do it again.
  581. It's even simpler on the server side (here again we assume the connection
  582. is already in place):
  583.   local rcvdir findir              ; Declare local (automatic) variables
  584.   assign rcvdir /usr/ivan/tmp      ; Temporary receiving directory
  585.   assign findir /usr/ivan/new      ; Where to move files after reception
  586.   log transactions                 ; Keep a log of transfers
  587.   cd m(rcvdir)                    ; Change to the source directory
  588.   set receive move-to m(findir)   ; Declare move-to directory.
  589.   server                           ; Enter server mode.
  590. A separate process (e.g. the medical claim-form decoder) can look for files
  591. appearing in the /usr/ivan/new directory and process them with every
  592. confidence that they have been completely received.
  593. Note that the use of MOVE-TO can result in moved files overwriting one another
  594. (the application would normally avoid this by assigning each transaction a
  595. unique, e.g. based on customer number and claim number).  But if filename
  596. collisions are a possibility in your application, RENAME-TO might be a better
  597. choice; you can use any variables you like in the template to ensure
  598. uniqueness of the RENAME-TO filename; for example:
  599.   SET RECEIVE RENAME-TO v(filename)_v(ndate)_v(ntime)_v(userid)_v(pid)
  600. 4.2. FILE-TRANSFER PIPES AND FILTERS
  601. 4.2.1. INTRODUCTION
  602. Beginning in C-Kermit 6.1 and Kermit 95 1.1.12, it is possible to send from a
  603. command, or "pipe", as well as from a file, and to receive to a pipe or
  604. command.  In a typical example, we might want to transfer an entire directory
  605. tree from one UNIX system to another (but without using the methods described
  606. in Sections 4.3, 4.10, 4.11, and 4.15).  We could do this in multiple steps as
  607. follows:
  608.   1. Create a tar archive of the desired directory tree
  609.   2. Compress the tar archive
  610.   3. Transfer it in binary mode to the other computer
  611.   4. Decompress it
  612.   5. Extract the directory tree from the tar archive
  613. But this is inconvenient and it requires a temporary file, which might be
  614. larger than we have room for.
  615. The new pipe-transfer feature lets you do such things in a single step,
  616. and without intermediate files.
  617. Additional new features, also discussed here, let you specify pre- and post-
  618. processing filters for outbound and incoming files, and give you a way to
  619. insert the output from shell or system commands into C-Kermit commands.
  620. The file-transfer related features are available only with Kermit protocol,
  621. not with any external protocols, nor with K95's built-in XYZMODEM protocols
  622. (because XYZMODEM recovers from transmission errors by rewinding the source
  623. file, and you can't rewind a pipe).
  624. This section begins by discussing the simple and straightforward use of these
  625. features in UNIX, in which pipes and input/output redirection are a
  626. fundamental component and therefore "just work", and then goes on to discuss
  627. their operation in Windows and OS/2, where matters are much more complicated.
  628. 4.2.1.1. TERMINOLOGY
  629. Standard Input
  630.   This is a precise technical term denoting the normal source of input for
  631.   a command or program, which is the keyboard of your terminal by default,
  632.   but which can be redirected to a file or pipe.
  633. Stdin
  634.   Abbreviation for Standard Input.
  635. Standard Output
  636.   A precise technical term denoting the normal destination for output from a
  637.   command or program, which is your terminal screen by default, but which can
  638.   be redirected to a file.
  639. Stdout
  640.   Abbreviation for Standard Output.
  641. Stdio
  642.   Abbreviation for Standard Input / Standard Output.
  643. I/O
  644.   Abbreviation for Input / Output.
  645. Shell
  646.   Text-based system command processor, such as the UNIX shell, DOS
  647.   COMMAND.COM, etc.
  648. Pipe
  649.   A mechanism by which the standard output of one program is sent to
  650.   the standard input of another.
  651. Pipeline
  652.   A series of programs connected by pipes.
  653. 4.2.1.2. NOTATION
  654. In command descriptions, "<command>" is replaced by a shell or system command
  655. or pipeline.  The command names specified in these commands are interpreted by
  656. your shell, just as if you were typing them at the shell prompt, and so if
  657. they are in your PATH, they will be found in the expected manner.  Therefore
  658. you don't have to specify complete pathnames for commands that are programs
  659. (but it shouldn't hurt if you do).
  660. The normal notation for I/O redirection is as follows:
  661.   <  Read Stdin from the given file.
  662.   >  Send Stdout to the given file.
  663.   |  Send Stdout from the command on the left to the command on the right.
  664. Examples:
  665. sort < foo > bar
  666.   Sorts the lines in file "foo" and writes the results to file "bar"
  667. grep -c "some text" *.txt | grep -v ":0" | sort | pr -3 | lpr
  668.   This is a command pipeline composed of 5 commands:
  669.   grep -c "some text" *.txt
  670.     Looks in all files whose names end with ".txt" for the string "some text"
  671.     and writes to Stdout the names of each file followed by a colon and the
  672.     number of occurrences in each.
  673.   grep -v ":0"
  674.     Prints to Stdout the lines from Stdin that do NOT contain the string ":0",
  675.     in this case, it removes the names of files that do not contain "some
  676.     text".
  677.   sort
  678.     Sorts the lines from Stdin alphabetically to Stdout.
  679.   pr -3
  680.     Arranges the lines from Stdin in three columns.
  681.   lpr
  682.     Prints its Stdin on the default printer.
  683. Note that the Kermit features described here work only with commands that use
  684. Stdio.  If you attempt to use them with commands whose input and output can
  685. not be redirected, Kermit will most likely get stuck.  Kermit has no way of
  686. telling how an external command works, nor what the syntax of the shell is, so
  687. it's up to you to make sure you use these features only with redirectable
  688. commands.
  689. The quoting rules of your shell apply to the <command>.  Thus in UNIX, where
  690. C-Kermit tries to use your preferred shell for running commands, shell
  691. "metacharacters" within commands must be escaped if they are to be taken
  692. literally, using the methods normal for your shell.  For example, the UNIX tr
  693. (translate) command must have its arguments in quotes:
  694.   tr "[a-z]" "[A-Z]"
  695. otherwise the shell is likely to replace them by all filenames that match,
  696. which is probably not what you want.  This is also true when using your shell
  697. directly, and has nothing to do with Kermit.
  698. 4.2.1.3. SECURITY
  699. Some sites might not wish to allow access to system commands or external
  700. programs from within Kermit.  Such access, including all the features
  701. described here, can be disabled in various ways:
  702.  1. When building from source code, include -DNOPUSH among the CFLAGS.
  703.  2. At runtime, give the NOPUSH command.
  704.  3. For server mode, give the DISABLE HOST command.
  705.  4. Implicit use of pipes can be disabled as described in section 4.2.4.
  706. Note: 3 and 4 are not necessary if you have done 1 or 2.
  707. 4.2.2. Commands for Transferring from and to Pipes
  708. SEND /COMMAND sends data from a command or command pipeline, and RECEIVE
  709. /COMMENT writes data to a command or pipeline.  The GET /COMMAND command
  710. asks a server to send material, and then writes the incoming material to a
  711. command or pipeline.  These features, along with switches (like "/COMMAND",
  712. described in section 4.7) are new to C-Kermit 6.1.  The following synonyms
  713. are also provided:
  714.   CSEND    = SEND /COMMAND
  715.   CRECEIVE = RECEIVE /COMMAND
  716.   CGET     = GET /COMMAND
  717. None of these commands can be used if a SEND or RECEIVE FILTER (respectively,
  718. Section 4.2.3) is in effect, or if a NOPUSH command (Section 4.2.1.3) has been
  719. given, or if the current protocol is not Kermit.
  720. 4.2.2.1. Sending from a Command
  721. SEND /COMMAND <command> [ <as-name> ]
  722. SEND /AS-NAME:<as-name> /COMMAND <command>
  723. CSEND <command> [ <as-name> ]
  724.   These three forms are the same.  They work like the SEND command, but
  725.   instead of sending a file, it sends the standard output of the given
  726.   <command>, either under the command's own name, or else with the given
  727.   <as-name>.  If the <command> contains spaces, it must be enclosed in braces.
  728.   Braces should also be used for the <as-name> if it contains spaces.  If
  729.   braces are included around either the <command> or the <as-name>, they are
  730.   removed after parsing but before use.  As with SEND, the transfer is in text
  731.   or binary mode according the current FILE TYPE setting, unless you override
  732.   the global transfer mode by including a /TEXT or /BINARY switch.  The
  733.   <command> must require no input.
  734. When sending from a command or pipeline, C-Kermit has no way of knowing
  735. in advance how much data will be sent, and so it can not send the size
  736. to the other Kermit in the Attribute packet, and so the receiving Kermit
  737. has no way of displaying "percent done" or a progress bar (thermometer).
  738. Examples that make sense in text mode (illustrated by common UNIX commands):
  739.   SEND /COMMAND finger
  740.   CSEND finger
  741.     sends the current "finger" listing (who's logged in) under the
  742.     name "finger".  The two forms "send /command" and "csend" are
  743.     equivalent; we won't bother showing them both in the rest of the
  744.     examples.
  745.   SEND /COMMAND:{finger}
  746.   CSEND {finger}
  747.     Same as previous example (braces are removed from "{finger}").
  748.   SEND /COMMAND:{ finger }
  749.   CSEND { finger }
  750.     Same as previous example, but note that the spaces are kept.  This
  751.     does not prevent the shell from running the "finger" program, but
  752.     its output is sent under the name " finger " (with a leading and
  753.     trailing space).
  754.   SEND /COMMAND:finger /AS-NAME:userlist
  755.   CSEND finger userlist
  756.     sends the current finger listing under the name "userlist".
  757.   SEND /COMMAND:{finger | sort -r} /AS-NAME:userlist
  758.   CSEND {finger | sort -r} userlist
  759.     sends the current finger listing, sorted in reverse order, under the
  760.     name "userlist".  The braces are needed to distinguish the <command>
  761.     from the <as-name>.
  762.   SEND /COMMAND:{finger | sort -r} /AS-NAME:{userlist}
  763.   CSEND {finger | sort -r} {userlist}
  764.     Same as previous example (braces are removed from "{userlist}").
  765.   SEND /COMMAND:{finger | sort -r} /AS-NAME:{freplace(v(filename),32,_)}
  766.   CSEND {finger | sort -r} {freplace(v(filename),32,_)}
  767.     Like the previous example, but sends the output of the <command> under
  768.     the name of the command, but with all spaces (32) replaced by underscores,
  769.     so the as-name is "finger_|_sort_-r".
  770.   Examples that make sense in binary mode (three equivalent forms are shown):
  771.   SEND /COMMAND /BINARY {tar cf - . | gzip -c} mydir.tar.gz
  772.   SEND /COMMAND /BINARY /AS-NAME:mydir.tar.gz {tar cf - . | gzip -c}
  773.   CSEND /BINARY {tar cf - . | gzip -c} mydir.tar.gz
  774.     Makes a tar archive of the current directory, compresses it with the GNU
  775.     gzip program, and sends it as "mydir.tar.gz".  The other Kermit can, of
  776.     course, just store it as a file, or it can use CRECEIVE to uncompress and
  777.     dearchive it as part of the transfer process.
  778. When using a "pipeline" of commands in the <command> field, obviously,
  779. the first command must not require any input, and the last command should
  780. produce some output, and all intermediate commands should get some input and
  781. produce some output.
  782. 4.2.2.2. Receiving to a Command
  783. RECEIVE /COMMAND <command>
  784. CRECEIVE <command>
  785.   This is like RECEIVE, except incoming material is written to the standard
  786.   input of the given command, in text or binary mode according to the normal
  787.   rules for file reception.  Be sure to include a redirector to a file (if the
  788.   command normally writes to standard output), or the output of the command
  789.   won't go anywhere.  The <command> may contain spaces; braces are not needed,
  790.   but they are removed if used.
  791. WARNING: C-Kermit has no way of knowing anything about the <command>, or even
  792. whether it is a command.  Thus this command will always cause C-Kermit to
  793. enter protocol mode, as long as some text is specified in the <command> field.
  794. However, if the text does not correspond to a command, the transfer will
  795. eventually fail with a message such as "Error writing data" or "Failure to
  796. close file".
  797. Examples for text mode (in UNIX):
  798.   RECEIVE /COMMAND sort -r > reverse.txt
  799.   CRECEIVE sort -r > reverse.txt
  800.     The text that is received is sorted in reverse order and stored in
  801.     the file "reverse.txt".  The two forms shown are equivalent.
  802.   RECEIVE /COMMAND {sort -r > reverse.txt}
  803.   CRECEIVE {sort -r > reverse.txt}
  804.     The same as the previous example; if braces are included, they are
  805.     simply removed.
  806.   RECEIVE /COMMAND {sort -r > flower(v(filename)).reverse}
  807.   CRECEIVE {sort -r > flower(v(filename)).reverse}
  808.     Same but stores result under the incoming filename, lowercased, and
  809.     with ".reverse" appended to it.
  810.   RECEIVE /COMMAND sort
  811.   CRECEIVE sort
  812.     Does nothing useful, since the output of sort has nowhere to go.
  813.   RECEIVE /COMMAND sort -r | pr -3 | lpr -Plaserjet
  814.   CRECEIVE sort -r | pr -3 | lpr -Plaserjet
  815.     The text that is received is sorted in reverse order, arranged into
  816.     three columns, and sent to the "laserjet" printer.
  817.   Examples for binary mode:
  818.   RECEIVE /COMMAND:{gunzip -c | tar xf -}
  819.   CRECEIVE {gunzip -c | tar xf -}
  820.     Assuming the data that is received is a compressed tar archive,
  821.     uncompresses the archive and passes it to tar for extraction.  In this
  822.     case the braces are needed because otherwise the final "-" would be
  823.     taken as a command continuation character (see "Using C-Kermit", 2nd
  824.     Edition, p.33).
  825. GET /COMMAND <remote-file> <command>
  826. GET /COMMAND /AS-NAME:<command> <remote-file>
  827. CGET <remote-file> <command>
  828.   This command tells the Kermit client to send a GET request for the given
  829.   remote file to a Kermit server.  Unlike GET, however, the incoming material
  830.   is written to a command, rather than to a file.  If the <remote-file> or the
  831.   <command> contain spaces, they must be enclosed in braces.  The same
  832.   cautions about the <command> apply as for CRECEIVE.  Examples (for UNIX):
  833.   GET /COMMAND oofa.txt sort -r > oofa.new
  834.   GET /COMMAND {oofa.txt} {sort -r > oofa.new}
  835.   CGET oofa.txt sort -r > oofa.new
  836.   CGET {oofa.txt} {sort -r > oofa.new}
  837.     These four are equivalent.  Each of them requests the server to send
  838.     its "oofa.txt" file, and as it arrives, it is sorted in reverse order
  839.     and written to "oofa.new".
  840.   GET /COMMAND {profile exec a} lpr
  841.   GET /COMMAND {profile exec a} {lpr}
  842.   GET /COMMAND /AS-NAME:lpr {profile exec a}
  843.   GET /COMMAND /AS-NAME:{lpr} {profile exec a}
  844.   GET /COMMAND /AS:lpr {profile exec a}
  845.   CGET {profile exec a} lpr
  846.   CGET {profile exec a} {lpr}
  847.     Here the remote filename contains spaces so it MUST be enclosed in
  848.     braces.  As it arrives it is sent to the lpr program for printing.
  849.     Braces are optional around "lpr" since it contains no spaces.
  850.   GET /COMMAND *.txt {cat >> new.txt}
  851.   GET /AS-NAME:{cat >> new.txt} /COMMAND *.txt
  852.   CGET *.txt {cat >> new.txt}
  853.     This gets all the ".txt" files from the server and concatenates them
  854.     all into a single "new.txt" file on the client.
  855.   GET /COMMAND *.txt {echo v(filename)>>new.txt;cat>>new.txt}
  856.   CGET *.txt {echo v(filename)>>new.txt;cat>>new.txt}
  857.     As above, but inserts each file's name before its contents.
  858. 4.2.3. Using File-Transfer Filters
  859. The commands described in section 4.2.2 let you send the output of a command,
  860. or receive data into a command.  But what if you want to specify preprocessing
  861. for files that you send, or postprocessing of files that you receive, even
  862. when multiple files are involved?  For this you need a way to specify send and
  863. receive filters.  The commands are SET SEND FILTER and SET RECEIVE FILTER;
  864. SHOW PROTOCOL displays the current settings.
  865. 4.2.3.1. The SEND Filter
  866. SET SEND FILTER [ <command> ]
  867.   This command specifies a <command> to be run on any file that you SEND (or
  868.   MOVE, MSEND, etc).  It also applies to files sent when in server mode, in
  869.   response to GET commands, but not to the results of REMOTE commands like
  870.   REMOTE DIRECTORY, REMOTE TYPE, REMOTE HOST, etc.  The <command> may be, but
  871.   need not be, enclosed in braces; if it is, the braces are stripped before
  872.   use.  The output of this command is sent, rather than the file itself.  The
  873.   current FILE TYPE setting (TEXT or BINARY) applies to the output of the
  874.   command.  The <command> must contain at least one instance of v(filename),
  875.   for which the name of the actual file is substituted.  If the <command> is
  876.   omitted, the send filter is removed and files are sent in the normal manner.
  877. The SET SEND FILTER sets up a "global" filter -- that is, one that applies to
  878. all subsequent file-sending commands until you change or remove it.  You can
  879. also specify a "local" filter to be used in a specific file-sending command by
  880. using the /FILTER switch (see section 1.5); for example:
  881.   SEND /FILTER:<command> [ <other-switches> ] <filename>
  882. Besides v(filename), you can include any other script programming notation in
  883. the send filter: variable names, array references, calls to built-in string or
  884. other functions, and so on.  These are evaluated during file transfer, NOT
  885. during parsing, and they are evaluated separately for each file.
  886. When the SEND or MOVE (SEND /DELETE) command is used with a send filter, the
  887. output from the filter is sent under the file's original name unless you
  888. specify an "as-name" or template.  The Attribute packet (if any) contains the
  889. original file's attributes (size, creation date, etc).  So (for example) if
  890. the filter changes the file's size, the progress thermometer might be wrong.
  891. (We can't send the size of the output from the filter, because it is not known
  892. until the transfer is finished.)  If you prefer that the size not be sent, use
  893. "set attributes size off".
  894. You can not use send filters with RESEND (SEND /RECOVER) or PSEND
  895. (SEND /START).
  896. Examples for text mode:
  897.   SET SEND FILTER sort -r v(filename)     ; Braces may be omitted
  898.   SET SEND FILTER {sort -r v(filename)}   ; Braces may be included
  899.   SEND *.txt
  900.     This sends every file in the current directory whose name ends with
  901.     ".txt" under its own name, but with its lines sorted in reverse order.
  902.   SEND /FILTER:{sort -r v(filename)} *.txt
  903.     Same as above, but the filter applies only to this SEND command.
  904.     Braces are required in this case.
  905.   SET SEND FILTER {sort -r v(filename)}
  906.   SEND oofa.txt reverse.txt
  907.     Sends the oofa.txt file with its lines sorted in reverse order under
  908.     the name "reverse.txt".
  909.   SET SEND FILTER {sort -r v(filename)}
  910.   SEND oofa.* v(filename).reverse
  911.     Sends all the oofa.* files with their lines sorted in reverse order;
  912.     each file is sent under its own name but with ".reverse" appended to it.
  913.   SET SEND FILTER {tr "[a-z]" "[A-Z]" < v(filename)}
  914.   SEND *.txt
  915.     Sends all ".txt" files under their own names, but uppercasing their
  916.     contents.
  917. Note that the SEND FILTER applies not only to files that are sent with
  918. SEND, MOVE, MSEND, etc, but also to files sent by the C-Kermit server in
  919. response to GET requests.
  920. Examples for binary mode:
  921.   SET SEND FILTER {gzip -c v(filename)}
  922.   SEND /BINARY oofa.txt oofa.txt.gz
  923.     Sends the oofa.txt file, compressed by gzip, as oofa.txt.gz.
  924.   SEND /BINARY /FILTER:{gzip -c v(filename)} oofa.txt oofa.txt.gz
  925.     As above, but the filter applies only to this SEND command.
  926.   SET SEND FILTER {gzip -c v(filename)}
  927.   SEND /BINARY oofa.* fupper(replace(v(filename),.,_)).GZ
  928.     Sends all the oofa.* files, compressed by gzip, each under its own name,
  929.     but with the name uppercased, all periods within the name converted to
  930.     underscores, and ".GZ" appended to it.  So, for example, "oofa.txt"
  931.     is sent as "OOFA_TXT.GZ".
  932. In the gzip examples, note that the amount of data that is sent is normally
  933. less than the original file size because gzip compresses the file.  But Kermit
  934. sends the original file size ahead in the attribute packet anyway (unless you
  935. tell it not too).  Thus the transfer will probably appear to terminate early,
  936. e.g. when the receiver's file-transfer display thermometer is only at 40%.
  937. If this annoys you, tell Kermit to "set attribute length off".  On the other
  938. hand, you can use the final position of the thermometer as a measure of the
  939. effectiveness of compression.
  940. 4.2.3.2. The RECEIVE Filter
  941. SET RECEIVE FILTER [ <command> ]
  942.   This command specifies that the given <command> will be run on any file
  943.   that is received before it is written to disk.  The <command> may be, but
  944.   need not be, enclosed in braces; if it is the braces are stripped before
  945.   use.  The following two commands are equivalent:
  946.     SET RECEIVE FILTER sort -r > v(filename)
  947.     SET RECEIVE FILTER {sort -r > v(filename)}
  948.   The RECEIVE filter <command> may contain a "v(filename)" sequence to be
  949.   replaced by the incoming filename from the file header packet, but it is not
  950.   required.  However you must use it whenever your filter would normally write
  951.   to Stdout, otherwise its output will be lost.
  952.   The RECEIVE filter <command> may contain one or more "v(filename)"
  953.   sequence to be replaced by the incoming filename from the file header
  954.   packet, but it is not required.  However you must use it whenever your
  955.   filter would normally write to Stdout, otherwise its output will be lost.
  956. RECEIVE /FILTER:<command> and GET /FILTER:<command> can also be used to
  957. specify a filter to be used for only one file-transfer operation.
  958. UNIX examples for text mode:
  959.   SET RECEIVE FILTER lpr
  960.   RECEIVE
  961.     All the files that are received are sent to the default UNIX print
  962.     spooler.
  963.   RECEIVE /FILTER:lpr
  964.     Same as above, except the lpr filter is used only with this
  965.     RECEIVE command.
  966.   RECEIVE lpr
  967.     This is probably not what you want; it creates a file called lpr.
  968.   SET RECEIVE FILTER {sort -r > v(filename)}
  969.   RECEIVE
  970.     Stores each incoming file with its lines sorted in reverse order,
  971.     under its own name.
  972.   RECEIVE /FILTER:{sort -r > v(filename)}
  973.     As above, but the filter is used only for this RECEIVE command.
  974.   SET RECEIVE FILTER sort -r > v(filename)
  975.   RECEIVE reverse.txt
  976.     Stores each incoming file with its lines sorted in reverse order,
  977.     under the name "reverse.txt".  The actual result depends on the
  978.     FILE COLLISION setting.  If it is OVERWRITE and multiple files arrive,
  979.     then each incoming file destroys the previous one.  If it is BACKUP
  980.     (the default), filename conflicts are resolve by adding "version numbers"
  981.     to the filenames: reverse.txt, reverse.txt.~1~, reverse.txt.~2~, etc.
  982.   SET RECEIVE FILTER sort -r > v(filename)
  983.   RECEIVE v(filename).reverse
  984.     Stores each incoming file with its lines sorted in reverse order,
  985.     under the name it arrived with, but with ".reverse" appended to it.
  986.   SET RECEIVE FILTER sort -r > v(filename)
  987.   RECEIVE flower(v(filename)).reverse
  988.     Like the previous example, but ensures that the filename is lowercase.
  989. Examples for binary mode:
  990.   SET RECEIVE FILTER gunzip -c > v(filename)
  991.   RECEIVE
  992.     This receives one or more presumably compressed file and uncompresses
  993.     each one into a file having the same name it was sent with.  For example,
  994.     if the file is sent with the name OOFA.TXT.GZ, it is stored with that
  995.     name, even after decompression.
  996.   SET RECEIVE FILTER gunzip -c > v(filename)
  997.   RECEIVE flower(fsubstring(v(filename),1,flength(v(filename))-3))
  998.     Like the previous example, but the resulting filename has its rightmost
  999.     three characters removed from it and the remainder is lowercased.  So if
  1000.     the incoming filename is OOFA.TXT.GZ, it is stored as oofa.txt after
  1001.     decompression.
  1002. Of course you don't want to type such long hideous commands, so we have also
  1003. introduced several new functions:
  1004. fstripx(string[,character])
  1005.    This function removes the rightmost segment of the string that starts with
  1006.    the given character.  If no character is given, period (.) is used.  Thus
  1007.    it is most conveniently used for stripping the extension from a filename
  1008.    (or the decimal portion from a floating-point number written in US/UK
  1009.    style).  Examples:
  1010.      fstripx(OOFA.TXT.GZ)             => OOFA.TXT
  1011.      fstripx(OOFA.TXT.GZ,.)           => OOFA.TXT
  1012.      fstripx(OOFA.TXT.GZ,X)           => OOFA.T
  1013.      fstripx(fstripx(OOFA.TXT.GZ))   => OOFA
  1014.      fstripx($100.00)                 => $100
  1015. fstripn(string,number)
  1016.    Removes the rightmost <number> characters from the string.  Examples:
  1017.      fstripn(OOFA.TXT.GZ)             => OOFA.TXT.GZ
  1018.      fstripn(OOFA.TXT.GZ,3)           => OOFA.TXT
  1019.      fstripn(OOFA.TXT.GZ,7)           => OOFA
  1020. fstripb(string[,c1[,c2]])
  1021.    Strips enclosing matching braces, brackets, parentheses, or quotes from
  1022.    the string.  The second argument, c1, specifies which kind of enclosure
  1023.    to look for; if not specified, any enclosing (), [], <>, {}, "", '', or
  1024.    `' are removed.  If c1 is specified and c2 is not, then if c1 is an
  1025.    opening brace, bracket, or parenthesis, the matching closing one is
  1026.    supplied automatically as c2.  If both c1 and c2 are specified, then to
  1027.    be stripped the string must begin with c1 and end with c2.  If the
  1028.    string is not enclosed in the indicated manner, the result is the
  1029.    original string.  Examples:
  1030.      fstripb("abc")                   => abc
  1031.      fstripb([abc])                   => abc
  1032.      fstripb([abc)                    => [abc
  1033.      fstripb(<abc>)                   => abc
  1034.      fstripb(<abc>,[)                 => <abc>
  1035.      fstripb((abc))                   => abc
  1036.      fstripb((abc),[)                 => (abc)
  1037.      fstripb((abc),{(})               => abc
  1038.      fstripb(+abc+)                   => +abc+
  1039.      fstripb(+abc+,+)                 => abc
  1040.      fstripb(+abc+,+,^)               => +abc+
  1041.      fstripb(+abc^,+,^)               => abc
  1042.      fstripb('abc')                   => abc
  1043.      fstripb(`abc')                   => abc
  1044.      fstripb(``abc'')                 => `abc'
  1045.      fstripb(fstripb(``abc''))       => abc
  1046.    Notice the special syntax required for including a literal parenthesis
  1047.    in the argument list.  As the last two examples illustrate, fstripb()
  1048.    strips only one level at at a time; nesting can be used to strip a small
  1049.    fixed number of levels; loops can be used to strip larger or indeterminate
  1050.    numbers of levels.
  1051. flop(string[,char])
  1052.    Removes the leftmost segment of the string that ends with the given
  1053.    character.  If no character is given, period (.) is used.  Examples:
  1054.      flop(OOFA.TXT.GZ)               => TXT.GZ
  1055.      flop(OOFA.TXT.GZ,.)             => TXT.GZ
  1056.      flop(OOFA.TXT.GZ,X)             => T.GZ
  1057. To remove the leftmost <number> characters, just use fsubstring(s,<number>+1).
  1058. To return the rightmost <number> characters, use fright(s,<number>).
  1059. So the hideous example:
  1060.   receive flower(fsubstring(v(filename),1,flength(v(filename))-3))
  1061. can now be written as:
  1062.   receive flower(fstripx(v(filename)))
  1063. That is, the filename stripped of its extension and then lowercased.  This
  1064. is not only shorter and less hideous, but also does not depend on the
  1065. length of the extension being 3.
  1066. Note that when a receive filter is in effect, this overrides your FILE
  1067. COLLISION setting, since Kermit has no way of knowing what the final
  1068. destination filename will be (because it does not know, and can not be
  1069. expected to know, the syntax of every version of every command shell on
  1070. every platform on the planet).
  1071. 4.2.4. Implicit Use of Pipes
  1072. If you wish, C-Kermit can also examine incoming filenames to see if they
  1073. start with "!", and if so, the subsequent text is treated as a command to
  1074. read from or write to.  For example, if a Kermit client is given the following
  1075. command:
  1076.   get {!finger | sort}
  1077. the server on the other end, if it supports this feature, will run the
  1078. "finger" program, pipe its standard output to the "sort" program, and send
  1079. sort's standard output back to you.  Similarly, if you:
  1080.   send oofa.txt !sort -r > oofa.new
  1081. or, equivalently:
  1082.   send oofa.txt {!sort -r > oofa.new}
  1083. or:
  1084.   send /as-name:{!sort -r > oofa.new} oofa.txt
  1085. this has the receiver send the contents of the incoming oofa.txt file to
  1086. the sort program, which sorts the text in reverse order and stores the
  1087. result in oofa.new.
  1088. This use of the exclamation mark should be familiar to UNIX users as the
  1089. "bang" feature that lets you run an external application or command from
  1090. within another application.
  1091. Kermit's "bang" feature is disabled by default, since it is not unheard for
  1092. filenames to actually begin with "!".  So if you want to use this feature,
  1093. you must enable it with the following command:
  1094. SET TRANSFER PIPES { ON, OFF }
  1095.   ON enables the recognition of "!" notation in incoming filenames during
  1096.   file transfer as an indicator that the remaining text is the name of a
  1097.   command.  OFF, the default, disables this feature and uses the text as
  1098.   a filename in the normal fashion.  This command does NOT affect SEND
  1099.   /COMMAND, GET /COMMAND, CSEND, etc.
  1100. So using a combination of CSEND (SEND /COMMAND) and the "bang" feature, you
  1101. can transfer a directory tree all in one command (assuming the remote
  1102. Kermit supports pipe transfers and has them enabled):
  1103.   CSEND {tar cf - . | gzip -c} {!gunzip -c | tar xf -}
  1104. or:
  1105.   SEND /COMMAND:{tar cf - . | gzip -c} /as:{!gunzip -c | tar xf -}
  1106. Pay close attention to the syntax.  Braces are needed around the <command>
  1107. because it contains spaces; braces are needed around the <as-name> because
  1108. it ends with "-".  The <as-name> must begin with "!" or receiving Kermit will
  1109. not recognize it as a command.  The CSEND command must NOT begin with "!"
  1110. unless you are running a command whose name really does start that character.
  1111. Similarly, you have a Kermit server send a directory tree to be unpacked
  1112. on the client end:
  1113.   CGET {!tar cf - . | gzip -c} {gunzip -c | tar xf -}
  1114. or:
  1115.   GET /COMMAND {!tar cf - . | gzip -c} /as:{gunzip -c | tar xf -}
  1116. Notice how, in this case, the bang is required in the remote command, to
  1117. distinguish it from a filename, but not in the local command, since by
  1118. definition of CGET (or GET /COMMAND), it is known to be a command.
  1119. SEND and RECEIVE FILTERs supersede the bang feature.  For example, if a
  1120. file arrives under the name "!gunzip -c | tar xf -", but the receiving Kermit
  1121. also has been given a command like:
  1122.   set receive filter sort -r > v(filename)
  1123. then the incoming data will be sorted rather than gunzipped.
  1124. Finally, if SET TRANSFER PIPES is ON (and in this case, this must be done in
  1125. your C-Kermit initialization file), you can send from a pipe on the C-Kermit
  1126. command line:
  1127.   kermit -s "!finger | sort -r" -a userlist
  1128. In this case the "filename" contains spaces and so must be quoting using
  1129. your shell's quoting rules.
  1130. 4.2.5. Success and Failure of Piped Commands
  1131. Commands or programs started by Kermit as a result of CSEND or CRECEIVE
  1132. commands, CGET, SEND /COMMAND, REDIRECT commands (see section 4.2.8.2),
  1133. implicit use of pipes, RUN commands, and so forth, should return their exit
  1134. status codes to the Kermit command that caused them to be run, and
  1135. therefore IF SUCCESS and IF FAILURE tests after these commands should work
  1136. as expected.  For example:
  1137.   CSEND blah < filename
  1138. should fail if there is no command called "blah" or if there is no file called
  1139. "filename".  However, this is not foolproof and sometimes C-Kermit might think
  1140. a command succeeded when it failed, or vice versa.  This is most likely to
  1141. happen when the highly system-dependent methods that Kermit must use to
  1142. determine a command's exit status code do not supply the right information.
  1143. It can also happen because some commands might define success and failure
  1144. differently from what you expect, or because you are using a pipeline composed
  1145. of many commands, and one of them fails to pass failing exit status codes up
  1146. the chain.  The most likely culprit is the shell itself, which in most cases
  1147. must be interposed between Kermit and any external program to be run.
  1148. In any case, you can examine the following variable to find out the exit
  1149. status code returned to Kermit by the process most recently run by any command
  1150. that runs external commands or programs, including CSEND, CRECEIVE, REDIRECT,
  1151. RUN, etc:
  1152.   v(pexitstat)
  1153. In UNIX, Windows and OS/2, the value should be -2 if no command has been run
  1154. yet, 0 if the most recent command succeeded, -1, -3, or -4 if there was an
  1155. internal error, and a positive number returned by the command itself if the
  1156. command failed.  If the number is in the range 1-127, this is the program's
  1157. exit status code.  If it is 128 or greater, this is supposed to indicate that
  1158. the command or program was interrupted or terminated from outside itself.
  1159. In Windows 95 and 98, the return values of the default shell are unreliable;
  1160. various third-party shells can be used to work around this deficiency.
  1161. In VMS, it is the actual exit status code of the command that was run.  This
  1162. is an odd number if the command succeeded, and an even number if it failed.
  1163. You can see the associated message as follows:
  1164.   run write sys$output f$message(v(pexitstat))
  1165. Or, more conveniently, use the new Kermit function:
  1166.   echo ferrstring(v(pexitstat))
  1167. which converts a system error code (number) to the corresponding message.
  1168. 4.2.6. Cautions about Using Pipes to Transfer Directory Trees
  1169. Although utilities such as tar and zip/unzip might be available on different
  1170. platforms (such as UNIX and Windows), this does not necessarily mean you can
  1171. use them successfully to transfer directory trees between unlike platforms.
  1172. For example:
  1173.   CSEND {tar cf - . | gzip -c} {!gunzip -c | tar xf -}
  1174. when used from UNIX to Windows will have satisfactory results for binary
  1175. files, but not for text files.  UNIX text files have lines ending with
  1176. Linefeed (LF) only, whereas Windows text files have lines ending in Carriage
  1177. Return and Linefeed (CRLF).  Thus any text files that were in the archive
  1178. formed by the first tar command will be unpacked by the second tar command
  1179. in their original form, and will display and print incorrectly in Windows
  1180. (except in applications that have been explicitly coded to handle UNIX-format
  1181. text files).  On the other hand if you told gzip to use "text mode" to do
  1182. record format conversion (assuming there was a way to tell it, as there is
  1183. with most "zip" programs), this would destroy any binary files in the archive.
  1184. Furthermore, if the archive contains text files that are written in languages
  1185. other than English, the "special" (accented and/or non-Roman) characters are
  1186. NOT translated, and are therefore likely show up as gibberish on the target
  1187. system.  For example, West European languages are usually encoded in ISO Latin
  1188. Alphabet 1 in UNIX, but in PC code page 850 on the PC.  Capital A with acute
  1189. accent is code point 193 (decimal) Latin-1, but 181 in CP850.  So A-acute in
  1190. the UNIX file becomes Middle Box Bottom on the PC, and similarly for all the
  1191. other special characters, and for all other languages -- Greek, Russian,
  1192. Hebrew, Japanese, etc.
  1193. So when transferring text files between unlike platforms, you should use
  1194. direct Kermit file transfers so Kermit can apply the needed record-format and
  1195. character-set transformations.  Use pipelines containing archivers like tar or
  1196. zip only if all the files are binary or the two systems use the same record
  1197. format and character set for text files.
  1198. Also see sections 4.3, 4.10, 4.11, and 4.15 for how to transfer directory
  1199. trees between both like and unlike systems directly with Kermit.
  1200. 4.2.7. Pipes and Encryption
  1201. Of course pipelines could be used for encrypted file transfers, assuming
  1202. proper precautions could be taken concerning the transmission of the key.
  1203. But there is rarely a good way to do this.  To illustrate using UNIX crypt:
  1204.   csend {crypt key < filename} {!crypt key > filename}
  1205. Or, more ambitiously:
  1206.   csend {tar cf - . | gzip -c | crypt key} {!crypt key | gunzip -c | tar xf -}
  1207. transmits the key in the file header packet as part of the (clear-text) remote
  1208. command, defeating the entire purpose of encrypting the file data.
  1209. But if you are connected in terminal mode to the remote computer and type:
  1210.   creceive {crypt key > filename}
  1211. at the remote Kermit prompt, you have also transmitted the key in clear text
  1212. over the communications link.
  1213. At present, the only secure way to use CSEND and CRECEIVE with an encryption
  1214. filter is to have a human operator at both ends, so the key does not have to
  1215. be transmitted.
  1216. Theoretically it would be possible to use PGP software (Pretty Good Privacy,
  1217. by Phil Zimmerman, Phil's Pretty Good Software) to avoid key transmission
  1218. (since PGP uses separate public and private key and "lets you communicate
  1219. securely with people you've never met, with no secure channels needed for
  1220. prior exchange of keys"), but the specific method has yet to be worked out.
  1221.   HINT: See the PGP User's Guide, e.g. at:
  1222.   http://www.telstra.com.au/docs/PGP/
  1223.   Especially the topic "Using PGP as a UNIX-Style Filter":
  1224.   http://www.telstra.com.au/docs/PGP/pgpdoc2/pgpdoc2_17.html
  1225. In any case, better and more convenient security options are now available:
  1226. Kerberos authentication and encryption (described in the kerberos.txt file)
  1227. and the new ability to run C-Kermit "though" other communication programs,
  1228. described in Section 2.7.
  1229. 4.2.8. Commands and Functions Related to Pipes
  1230. 4.2.8.1. The OPEN !READ and OPEN !WRITE Commands
  1231. These are described in "Using C-Kermit", and are generally useful with reading
  1232. output from commands that produce more than one line on their standard output,
  1233. or writing multiple lines into commands that accept them on their standard
  1234. input.
  1235. In C-Kermit 7.0 CLOSE !READ is accepted as a synonym for CLOSE READ, and
  1236. CLOSE !WRITE for CLOSE WRITE.
  1237. Testing the success and failure of these commands, however, can be a bit
  1238. tricky.  Consider:
  1239.   open !read lalaskjfsldkfjsldkfj
  1240. (where "lalaskjfsldkfjsldkfj" is neither a valid command nor the name of a
  1241. program or script that can be run).  OPEN !READ, in UNIX at least, translates
  1242. this into execl(shellpath,shellname,"-c",command).  This means it starts your
  1243. preferred shell (e.g. from the SHELL environment variable) and asks it to
  1244. execute the given command.  It must be this way, because your command can be a
  1245. either an internal shell command (which only your shell can execute) or an
  1246. external command, which only your shell knows how to find (it knows your PATH
  1247. and interprets, etc).  Therefore unless OPEN !READ can't start your shell,
  1248. it always succeeds.
  1249. Continuing with the nonexistent-command example:
  1250.   C-Kermit>open !read lalaskjfsldkfjsldkfj
  1251.   C-Kermit>status
  1252.    SUCCESS
  1253.   C-Kermit>read line
  1254.   C-Kermit>status
  1255.    SUCCESS
  1256.   C-Kermit>echo "m(line)"
  1257.   "bash: lalaskjfsldkfjsldkfj: command not found"
  1258.   C-Kermit>close read
  1259.   C-Kermit>status
  1260.    FAILURE
  1261.   C-Kermit>
  1262. In other words, the failure can not be detected on OPEN, since the OPEN
  1263. command succeeds if it can start your shell.  It can't be detected on READ,
  1264. since all this does is read output from the shell, which in this case happens
  1265. to be an error message.  However, failure IS detected upon close, since this
  1266. is the occasion upon which the shell gives Kermit its exit status code.
  1267. For an illustration of this situation, see Section 2.14.
  1268. 4.2.8.2. The REDIRECT Command
  1269. A second method of I/O redirection is offered by the REDIRECT command.
  1270. This is a rather advanced and tricky feature that is presently supported
  1271. only in UNIX C-Kermit, in OS-9 C-Kermit, and in Kermit 95.  Syntax:
  1272. REDIRECT <command>
  1273.   Runs the given <command>, sending its standard output to the current
  1274.   communications channel (SET LINE, SET PORT, or SET HOST connection),
  1275.   and reading its standard input from the same connection.  Works only in
  1276.   local mode -- i.e. a connection is required -- and then only if the given
  1277.   command uses Standard I/O.
  1278. Example:
  1279.   redirect finger
  1280. runs the local "finger" command and sends its output over the connection as
  1281. plain text, where presumably there is a process set up to read it.  Another
  1282. example:
  1283.   redirect finger | sort -r
  1284. shows the use of a pipeline.
  1285. Note: REDIRECT differs from CSEND/CRECEIVE in two important ways: (1) it does
  1286. not use the Kermit protocol, and (2) it uses a bidirectional pipe rather than
  1287. a one-way pipe.
  1288. The primary use of the REDIRECT command is to run external protocols, such as
  1289. sz/rz in UNIX for ZMODEM, when they work over Standard I/O(*).  Example:
  1290.   set host xyzcorp.com
  1291.   (login, etc)
  1292.   redirect sz oofa.zip
  1293. lets you make a Telnet connection with C-Kermit and then do a ZMODEM transfer
  1294. over it.  ZMODEM protocol messages go both ways over the same connection
  1295. simultaneously.
  1296. It is possible to use C-Kermit on UNIX as your PPP dialer and then to REDIRECT
  1297. the connection to the PPP software, but C-Kermit 7.0 offers a better approach
  1298. to PPP dialing in its new EXEC command (Section 1.23).
  1299. In theory, you can also redirect an interactive process.  For example, suppose
  1300. you tell Kermit 95 to wait for an incoming TCP/IP connection:
  1301.   set host * 3000
  1302. and then tell C-Kermit on UNIX to:
  1303.   set host kermit95hostname 3000
  1304.   redirect ksh
  1305. and then tell Kermit 95 to CONNECT: now you are talking to the UNIX K-shell;
  1306. you can give commands (pwd, ls, etc) and see the results.  In practice, the
  1307. K-shell's terminal modes are messed up because (a) it is not going through the
  1308. Unix terminal driver, and (b) it is "smart" and knows it is being redirected,
  1309. and so acts in a decidedly inhospitable manner (other applications like EMACS,
  1310. vi, etc, simply refuse to run if their standard i/o has been redirected).
  1311. (*) Only pre-1988 versions of the publicly-distributed sz/rz programs use
  1312.     Standard I/O; those released later than that do not use Standard I/O and
  1313.     therefore do not work with REDIRECT.  However, Omen Technology does offer
  1314.     an up-to-date redirectable version called crzsz, which must be licensed
  1315.     for use.
  1316. 4.2.8.3. Receiving Mail and Print Jobs
  1317. As of 7.0, and in UNIX only, files that are sent to C-Kermit as mail (when
  1318. the other Kermit uses a MAIL or SEND /MAIL command) or to be printed (via
  1319. REMOTE PRINT or SEND /PRINT) are now piped directly to the mail or print
  1320. program, rather than written to temporary files and then mailed or printed and
  1321. then deleted.  This has the advantages of (a) not requiring a temporary file,
  1322. and (b) allowing mail to have a proper subject in place of the filename.
  1323. Temporary files were bad not only because they required (a) space, and (b)
  1324. writeability of the current directory, but also because using them could
  1325. result in wiping out an existing file.  See section 4.7 for more about SEND
  1326. /MAIL and SEND /PRINT.
  1327. 4.2.8.4. Pipe-Related Functions
  1328. The fcommand(<command>) function runs the given shell or system command and
  1329. returns the command's standard output as its value (with any newline
  1330. characters stripped from the end), unless the result is too long, in which
  1331. case it returns the empty string.  The maximum length for the result is at
  1332. least 1022 bytes, and it might be longer on some platforms.  Examples (UNIX):
  1333.   C-Kermit> echo "fcommand(date)"
  1334.   "Fri Apr 18 13:31:42 1997"
  1335.   C-Kermit> echo "fcommand(finger | wc -l)" ; how many users logged in?
  1336.   "      83"
  1337.   C-Kermit> evaluate fcommand(finger | wc -l) * 2
  1338.   166
  1339.   C-Kermit> echo Welcome to fcommand(tty) on fcommand(date)
  1340.   Welcome to /dev/ttyre on Fri Apr 18 13:31:42 1997
  1341.   C-Kermit> echo "fcommand(ls oofa.*)"
  1342.   "oofa.c
  1343.   oofa.h
  1344.   oofa.o"
  1345.   C-Kermit> cd /directory-with-thousands-of-files
  1346.   C-Kermit> echo "fcommand(ls -l)" ; This would be too long
  1347.   ""
  1348.   C-Kermit>
  1349. If a command's output would be too long, you can use the other, more laborious
  1350. method of reading from a command: OPEN !READ <command>, READ each line,
  1351. CLOSE !READ.
  1352. The frawcommand(<command>) function is identical to fcommand(<command>),
  1353. except it does not remove trailing newline characters:
  1354.   C-Kermit> echo "frawcommand(date)"
  1355.   "Fri Apr 18 13:31:42 1997
  1356.   "
  1357.   C-Kermit> echo "frawcommand(ls oofa.*)"
  1358.   "oofa.c
  1359.   oofa.h
  1360.   oofa.o
  1361.   "
  1362.   C-Kermit>
  1363. Use frawcommand() if you want to retain the final line terminators, or if
  1364. the command's output is "binary".  But remember that if the result of this
  1365. (or any other) function contains any NUL (ASCII code 0) characters, the first
  1366. NUL will terminate the result string because this is how C strings work
  1367. (it's "C-Kermit", remember?).
  1368. These functions are useful not only locally, but also in the client/server
  1369. arena.  If you need to get the results from a system command on the server
  1370. end into a variable on the client end, just do:
  1371.   [ remote ] query kermit command(date)
  1372. The result is in the local v(query) variable; see "Using C-Kermit", 2nd Ed.,
  1373. pp.359-360 for details.
  1374. 4.3. Automatic Per-File Text/Binary Mode Switching
  1375. When transferring files between like systems (e.g. UNIX-to-UNIX), binary mode
  1376. can be used for all files unless character-set translation is needed, and in
  1377. fact Kermit programs of recent vintage recognize each others' platforms and
  1378. switch to binary mode automatically when it is appropriate (e.g. DOS to OS/2,
  1379. or UNIX to UNIX).  (Exception: LABELED mode is chosen for VMS-to-VMS and
  1380. OS/2-to-OS/2 transfers so complex file formats can be preserved.)
  1381. On a client/server connection between like systems, the transfer mode is
  1382. currently determined by the file sender, rather than always by the client.
  1383. If the client is sending, it controls the transfer mode.  If a GET command is
  1384. sent to the server, the server sends all files in binary mode if its TRANSFER
  1385. CHARACTER-SET is TRANSPARENT; otherwise it uses text mode for text files
  1386. (according to its text-pattern list) and binary mode for binary files.  Of
  1387. course, the client can control the server's transfer character-set with the
  1388. REMOTE SET TRANSFER CHARACTER-SET command.
  1389. When transferring files between unlike systems, however, (e.g. UNIX-to-DOS),
  1390. some files (such as executable program images) must be transferred in binary
  1391. mode but others (such as plain-text files) must be transferred in text mode so
  1392. their record format and character sets can be appropriately converted.  If a
  1393. binary file is transferred in text mode, it is ruined.  If a text file is
  1394. transferred in binary mode, then at the very least, its format can be
  1395. incorrect; at worst it is also corrupted because its character set was not
  1396. converted (in extreme cases the corruption is total, e.g. because one system
  1397. is ASCII-based and the other EBCDIC).
  1398. 4.3.1. Exceptions
  1399. VMS C-Kermit, when sending files to a non-VMS system, switches to text or
  1400. binary mode automatically for each file, based on the record format in the
  1401. file's directory entry; thus the mechanisms described in this section do not
  1402. apply to VMS C-Kermit, yet the effect is the same: automatic text/binary mode
  1403. switching when VMS C-Kermit is sending files.  See the VMS Appendix of "Using
  1404. C-Kermit" for details.
  1405. Kermit versions that support LABELED or IMAGE transfer mode are likewise
  1406. not affected by this feature when one of those modes is selected (normally
  1407. used only when transferring between like systems).
  1408. Kermit versions that support file-transfer pipes and filters are not affected
  1409. by this feature when pipes or filters are used, since the output of a pipe or
  1410. filter (such as gzip) is likely to require transfer in a different mode than
  1411. the original file.
  1412. Finally, SEND /TEXT or SEND /BINARY will force files to be sent in the
  1413. indicated mode, overriding all automatic transfer-mode-choosing mechanisms.
  1414. 4.3.2. Overview
  1415. Suppose you give C-Kermit a command like:
  1416.   SEND *.*
  1417. And suppose the pattern *.* matches a mixture of text files (such as program
  1418. source code) and binary files (such os object modules or executable programs).
  1419. C-Kermit 6.0 and earlier (except on VMS) send all files in the same mode:
  1420. whatever you said in your most recent SET FILE TYPE command, or else whatever
  1421. mode was chosen automatically according to the rules on page 236 of "Using
  1422. C-Kermit", 2nd Ed.
  1423. But when text and binary files are mixed in the same group, and the files are
  1424. being transferred to an unlike system (e.g. UNIX to IBM Mainframe), this
  1425. results in corruption of either all the text files or all the binary files.
  1426. Stream-oriented file systems such as in UNIX and DOS do not record any
  1427. information about the file to tell us whether the file should be transferred
  1428. in binary or text mode, making it impossible to select the transfer mode
  1429. for each file in a group automatically with any certainty.
  1430. However, we can use some fairly-well established file naming conventions for
  1431. this purpose.  C-Kermit 7.0 lets you provide lists of filename patterns that
  1432. are used to separately determine the file type for each individual file being
  1433. transfered.  A pattern is a string, possibly containing the special characters
  1434. "*" (asterisk, which matches any string of zero of more characters) and/or "?"
  1435. (question mark, which matches any single character).  For example "a*b"
  1436. matches all files whose names start with "a" and end with "b", such as "ab",
  1437. "arb", "ababababab", etc, but not "abba".  And "a?b" matches any file whose
  1438. name starts with "a", ends with "b", and is exactly 3 characters long.
  1439.   NOTE: When typing commands at the C-Kermit prompt, you must
  1440.   prefix "?" with  to override its normal function of giving help.
  1441. (Also see section 4.9 for additional pattern-matching notations that might
  1442. be available in your version of C-Kermit.)
  1443. When you have specified filename recognition patterns, C-Kermit can transfer
  1444. the ones whose names match any of the binary-mode patterns in binary mode, and
  1445. those with names that match any of the text-mode patterns in text mode, and
  1446. those whose names match neither in the prevailing mode you have chosen, or
  1447. that was chosen automatically via peer recognition.
  1448. 4.3.3. Commands
  1449. SET FILE PATTERNS { ON, OFF, AUTO }
  1450.   This tells Kermit whether to do per-file filename pattern-matching to
  1451.   determine text or binary mode.  The normal and default setting is AUTO,
  1452.   which means to use pattern lists to switch transfer mode only when it is
  1453.   certain that the other Kermit program supports automatic notification of
  1454.   transfer mode (via Attribute packets) on a per-file basis (this information
  1455.   is obtained automatically during protocol startup negotiation).  ON means to
  1456.   always determine the transfer mode from the filename and pattern list when
  1457.   sending files.  Use OFF to disable this feature (without resetting your
  1458.   pattern lists).  Also note that if you have selected LABELED file transfer
  1459.   (SET FILE TYPE LABELED), this takes precedence over filename-matching
  1460.   patterns and all files are sent in labeled mode.
  1461. SET TRANSFER MODE MANUAL
  1462.   Disables the use of filename patterns, no matter what the FILE PATTERNS
  1463.   setting.
  1464. REMOTE SET TRANSFER MODE MANUAL
  1465.   Client command to disable automatic transfer mode, and therefore also
  1466.   filename patterns, in the server.  Synonym: REMOTE SET XFER MODE MANUAL.
  1467. { GET, SEND, etc } { /BINARY, /TEXT }
  1468.   Including a /BINARY or /TEXT (or, where supported, /IMAGE or /LABELED)
  1469.   switch with a file-transfer command changes the transfer mode to manual
  1470.   for that command only, and therefore disables patterns that that command.
  1471. SET FILE BINARY-PATTERNS [ <pattern> [ <pattern> [ <pattern> ... ] ] ]
  1472.   A list of zero or more patterns, separated by spaces (not commas).  Letters
  1473.   in a pattern are case-sensitive if the underlying filenames are case
  1474.   sensitive (as in UNIX), and case-insensitive otherwise (as in Windows).  If
  1475.   a file's name is matched by any pattern in the list and SET FILE PATTERNS is
  1476.   ON, the file is sent in binary mode.  Examples:
  1477.     SET FILE BINARY-PATTERNS *.gz *.Z *.tar *.zip *.o *.so *.a *.out ; UNIX
  1478.     SET FILE BINARY-PATTERNS *.EXE *.ZIP *.OBJ *.COM ; DOS or OS/2 or Windows
  1479.   If a pattern contains spaces, enclose it in braces.
  1480. SET FILE TEXT-PATTERNS [ <pattern> [ <pattern> [ <pattern> ... ] ] ]
  1481.   Like SET FILE BINARY-PATTERNS, but the patterns choose text files rather
  1482.   than binary ones.  Examples:
  1483.     SET FILE TEXT-PATTERNS *.TXT *.KSC *.HTM* *.BAT ; DOS, Windows, OS/2
  1484. ADD BINARY-PATTERNS [ <pattern> [ <pattern> [ <pattern> ... ] ] ]
  1485.   Adds one or more patterns to the BINARY-PATTERN list.
  1486. ADD TEXT-PATTERNS [ <pattern> [ <pattern> [ <pattern> ... ] ] ]
  1487.   Adds one or more patterns to the TEXT-PATTERN list.
  1488. REMOVE BINARY-PATTERNS [ <pattern> [ <pattern> [ <pattern> ... ] ] ]
  1489.   Removes one or more patterns from the BINARY-PATTERN list.  The given
  1490.   patterns are matched with the ones in the BINARY-PATTERNS list with
  1491.   case sensitivity if the underlying file system has case-sensitive names
  1492.   (as do UNIX and OS-9), otherwise with case independence.
  1493. REMOVE TEXT-PATTERNS [ <pattern> [ <pattern> [ <pattern> ... ] ] ]
  1494.   Removes one or more patterns from the TEXT-PATTERN list.
  1495. SHOW PATTERNS
  1496.   Displays the current pattern selections.
  1497. Whenever you give a SET FILE BINARY-PATTERNS or SET FILE TEXT-PATTERNS
  1498. command, the previous list is replaced.  If you give one of these commands
  1499. without a pattern list, the previous list is removed.
  1500. When patterns are active and files are being sent, text patterns (if any) are
  1501. applied first (but only if not RESENDing and not sending in LABELED mode),
  1502. then binary patterns, so if the same pattern appears in both lists, binary
  1503. mode is chosen.
  1504. 4.3.4. Examples
  1505. Here's an example that might be used when sending files from UNIX:
  1506.   set file type binary
  1507.   set file text-patterns *.c *.h *.w *.txt makefile
  1508.   set file binary-patterns *.o
  1509.   msend makefile wermit wart ck*.[cwho] ck*.txt
  1510. Note that "wermit" and "wart" do not match any patterns so they are sent in
  1511. the prevailing mode, which is binary.  Also note the use of "makefile" as a
  1512. pattern that does not contain any wildcard characters (there is no other
  1513. convention to distinguish among "wermit" and "wart", which are binary
  1514. executables, and "makefile", which is a text file, purely by their names).
  1515. Most C-Kermit implementations have a default pattern list built in, which
  1516. includes patterns that are almost certain to succeed in picking the right
  1517. transfer mode.  Others are omitted due to ambiguity.  For example ".hlp", and
  1518. ".ini" are generally binary types in Windows but text types everywhere else.
  1519.   NOTE: ".doc", used for decades to denote plain-text documentation
  1520.   files, now more often than not denotes a Microsoft Word Document, so
  1521.   ".doc" is now considered a binary type since it does less harm to
  1522.   transfer a plain-text document in binary mode than it does to transfer
  1523.   an MS Word file in text mode (except when IBM mainframes are involved!)
  1524.   ANOTHER NOTE: ".com" files are binary in DOS-like operating systems,
  1525.   but they are text (DCL command procedures) in VMS.  VMS C-Kermit sends
  1526.   .COM files in text mode; K95 sends them in binary mode.  If you download
  1527.   a .COM file from VMS to DOS or Windows, and then upload it to another
  1528.   VMS system, be sure to use SEND /TEXT to preserve its textness.
  1529. You can see the default pattern list by starting C-Kermit without its
  1530. initialization file (e.g. "kermit -Y") and using the SHOW PATTERNS command.
  1531. If you will be depending on this feature, be sure to examine the list
  1532. carefully in conjunction with the applications that you use.
  1533. The default pattern list does not take "backup files" into account because
  1534. (a) people usually don't want to transfer them; and (b) it would make the
  1535. pattern lists more than twice as long.  For example, we would need to include
  1536. both *.txt and *.txt.~[0-9]*~ for ".txt" files, and similarly for all the
  1537. others.  Instead, you can use SEND /NOBACKUP (or SET SEND BACKUP OFF) to
  1538. skip over all backup files.
  1539. Put your most commonly-used safe pattern declarations in your C-Kermit
  1540. customization file (ckermod.ini, .mykermrc, k95custom.ini, etc).
  1541. As noted, SET FILE PATTERNS is ON by default.  Sometimes, however, it is
  1542. desirable, or necessary, to force files to be sent in a particular mode, and
  1543. often this must be done from the command line (e.g. when using Kermit as a
  1544. download helper in a Web browser like Lynx).  The -V command-line options is
  1545. equivalent to SET FILE PATTERNS OFF and SET TRANSFER MODE MANUAL.  Example:
  1546.   kermit -Vis oofa.txt
  1547. forces oofa.txt to be sent in binary mode, even though ".txt" might match a
  1548. text pattern.
  1549. 4.4. File Permissions
  1550. "Permissions" refers to a code associated with a file that specifies who is
  1551. allowed to access it, and in what manner.  For example, the owner, the members
  1552. of one or more groups, the system administrator, and everybody else, might be
  1553. allowed various combinations of Read, Write, Append, Execute, or Listing
  1554. access.
  1555. The permission code goes by different names on different platforms.  In UNIX,
  1556. it might be called the filemode.  In VMS, it is called the file protection
  1557. (or protection mask).
  1558. The comments in this section presently apply only to the UNIX and VMS versions
  1559. of C-Kermit, to which these features were added in version 7.0; the DOS,
  1560. Windows, and OS/2 file systems embody no notions of protection, and so MS-DOS
  1561. Kermit and Kermit 95 do not send file permissions, and ignore them when
  1562. received.
  1563. The permissions for a received file are determined by a combination of the
  1564. file transfer mode (VMS-to-VMS transfers only), whether a file of the same
  1565. name exists already, whether permissions of the file are received in the file
  1566. attribute packet, and the setting of ATTRIBUTES PROTECTION.
  1567. The default for ATTRIBUTES PROTECTION is ON.  If no attributes are received,
  1568. the effect is the same as if attributes PROTECTION were OFF.
  1569. For VMS-to-VMS transfers, the default LABELED mode simply copies the
  1570. protection code from source to destination.
  1571. 4.4.1. When ATTRIBUTES PROTECTION is OFF
  1572. If no file of the same name exists, system defaults determine the permissions
  1573. of the new file.  Otherwise, the actions taken depend on the current FILE
  1574. COLLISION setting: BACKUP, OVERWRITE, RENAME, etc, as documented in "Using
  1575. C-Kermit".  But now the new file (if it is created at all) automatically
  1576. inherits the permissions (mode bits) of the existing file in a way that is
  1577. appropriate for the platform.
  1578. 4.4.1.1. Unix
  1579. All mode bits are inherited except the directory bit, since the
  1580. incoming file can not possibly be a directory.  (In any case, it is not
  1581. possible to receive a file that has the same name as an existing directory
  1582. unless FILE COLLISION is set to RENAME).
  1583. 4.4.1.2. VMS
  1584. Files with the same name as an existing file, transferred in modes other than
  1585. LABELED between VMS systems, inherit the protection of the prior version.
  1586. 4.4.2 When ATTRIBUTES PROTECTION is ON
  1587. File permissions can be conveyed as part of the file transfer process, in
  1588. accordance with the Kermit protocol definition.  If the file sender puts
  1589. system-dependent and/or system-independent versions of the file protection
  1590. (permissions) into the Attribute (A) packet, the file receiver can set the new
  1591. file's permissions from them.  Otherwise, the permissions are set the same as
  1592. for ATTRIBUTES PROTECTION OFF.
  1593. When the incoming A packet contains system-dependent permissions, the file
  1594. receiver checks to see if the sender has the same system ID (e.g. both the
  1595. sending and receiving systems are UNIX, or both are VMS); if so, it decodes
  1596. and uses the system-dependent permissions; otherwise it uses the generic ones
  1597. (if any) and applies them to the owner field, setting the other fields
  1598. appropriately as described in the following sections.
  1599. Setting the incoming file's protection from the A packet is controlled by SET
  1600. ATTRIBUTES PROTECTION (or PERMISSION), which is ON by default, and its status
  1601. is displayed by SHOW ATTRIBUTES.
  1602. The main benefit of this feature is to not have to "chmod +x" an executable
  1603. file after transfer from UNIX to UNIX.  Its cross-platform benefits are less
  1604. evident, perhaps to retain the status of the Unix 'x' bit on a VMS system,
  1605. for subsequent transfer back to a Unix system.
  1606. 4.4.2.1. System-Specific Permissions
  1607. System-specific file permissions are used when the two Kermit programs
  1608. recognize each other as running on the same type of system.  For example,
  1609. both are running under some form of UNIX (it doesn't matter which UNIX
  1610. variation -- HP-UX, Solaris, AIX, etc -- all use the same scheme for file
  1611. permissions); or both are running under VMS (even if one is on an Alpha and
  1612. the other on a VAX, and/or one is old and the other is new).
  1613. 4.4.2.1.1. UNIX
  1614. UNIX supports three categories of users, File Owner, Group, and World,
  1615. and three types of file access permission: Read, Write, and Execute.  Thus,
  1616. a UNIX file's permissions are expressed in 9 bits.
  1617. The system-dependent permission string for UNIX is a 3-digit octal string, the
  1618. low-order 9 bits of the st_mode member of the stat struct; we deliberately
  1619. chop off the "file format" bits because they are not permissions, nor do we
  1620. convey the setuid/setgid bits, lock bit, sticky bit, etc.
  1621. 4.4.2.1.2. VMS
  1622. VMS supports four categories of users, System, File Owner, Group, and World,
  1623. and four types of file access permission: Read, Write, Execute, and Delete.
  1624. Thus, a VMS file's permissions are expressed in 16 bits.
  1625. The system-dependent protection string for VMS is a 4-digit hexadecimal
  1626. string, corresponding to the internal-format protection word of the file
  1627. (RWED for each of World,Group,Owner,System).  A new file normally gets all 16
  1628. protection bits from the original file of the same name.
  1629. Note: VMS-to-VMS transfers take place in LABELED mode when the two C-Kermits
  1630. recognize each other's platform as VMS (unless you have disabled LABELED-mode
  1631. transfers).  In this case, all of a file's attributes are preserved in the
  1632. transfer and the protection mask (and other information) is taken from the
  1633. file's internal information, and this takes precedence over any information
  1634. in the Attribute packets.  You can defeat the automatic switching into
  1635. LABELED mode (if you want to) with SET TRANSFER MODE MANUAL.
  1636. 4.4.2.2. System-Independent Permissions
  1637. The system-independent ("generic") protection is used when the system IDs of
  1638. the two Kermit programs do not agree (e.g. one is UNIX, the other is VMS).
  1639. The generic protection attribute includes the following permissions (not all
  1640. are applicable to every file system): Read, Write, Append, Execute, Delete,
  1641. Search.  The generic permissions are derived from the owner permissions of
  1642. the source file, thus, a Unix 'w' permission becomes VMS Write,Delete.
  1643. The Owner field of the new file's permissions is set from the incoming
  1644. generic protection attribute.
  1645. In UNIX, the Group and World permissions are set according to your umask,
  1646. except that execute permission is NOT set in these fields if it was not also
  1647. set in the generic protection (and consequently, is set in the Owner field).
  1648. In VMS, the System, Group, and World permissions are set according to the
  1649. process default file permission (as shown in VMS by SHOW PROTECTION), except
  1650. that no permissions are allowed in these fields that are not included in the
  1651. generic permissions.
  1652. Note that the VMS and UNIX interpretations of Execute permission are not
  1653. identical.  In UNIX, a file (binary executable, shell script, etc) may not
  1654. be executed unless it has Execute permission, and normally files that are
  1655. not intended for execution do not have Execute permission.  In VMS, Read
  1656. permission implicitly supplies Execute capability.  Generally files that have
  1657. Read permission also have explicit Execute permission, but files (binary
  1658. executables, DCL command procedures) that have Read permission and not
  1659. Execute permission can still be executed.
  1660. 4.5. File Management Commands
  1661. 4.5.1. The DIRECTORY Command
  1662. Prior to C-Kermit 7.0, the DIRECTORY command always ran an external system
  1663. command (such as "ls" on UNIX) or program to product the directory listing.
  1664. This had certain advantages, mostly that you could include system-dependent
  1665. options for customized listings, e.g. on UNIX:
  1666.   dir -lt c* | more
  1667. or in VMS:
  1668.   directory /size/date/protection/except=*.obj oofa.*;0
  1669. This approach, however, carries some disadvantages: C-Kermit can't return
  1670. SUCCESS or FAILURE status for (e.g.) "dir foo" according to whether the file
  1671. "foo" exists; and it runs an inferior process, which might be a problem in
  1672. some environments for resource and/or security reasons, and won't work at all
  1673. in a "nopush" environment (e.g. one in which C-Kermit is configured to forbid
  1674. access to exterior commands and programs, e.g. in a VMS "captive account").
  1675. In C-Kermit 7.0 on VMS and UNIX, and in K95 1.1.18 and later, the DIRECTORY
  1676. command is internal to Kermit.  It can be run in a "nopush" environment and
  1677. returns SUCCESS or FAILURE status appropriately.  In UNIX it prints all dates
  1678. and times in a consistent way (unlike ls).  In VMS it prints precise file
  1679. sizes, rather than "blocks".  It offers several formatting and other options,
  1680. but it is not necessarily more flexible than the corresponding external
  1681. commands or programs (the UNIX "ls" program, the VMS "directory" command).
  1682. The syntax is:
  1683.   DIRECTORY [ switch [ switch [ ... ] ] ] [ filespec ]
  1684. If no filespec is given, all files in the current directory are listed.
  1685. Optional switches include all the standard file-selection switches presented
  1686. in Section 1.5.4, plus:
  1687. /ALL
  1688.   Show both regular files and directories; this is the default.
  1689. /ARRAY:x
  1690.   Instead of displaying a directory listing, put the files that would have
  1691.   been shown (based on the filespec and other selection switches) in the
  1692.   given array.  The array need not (and should not) be predeclared; if the
  1693.   array already exists, it is destroyed and reused.  The array name can be a
  1694.   single letter, like "a", or any fuller form, such as "&a", "&a", "&a[]",
  1695.   etc.  If the /ARRAY switch is included, the following other switches are
  1696.   ignored: /BRIEF, /VERBOSE, /HEADING, /PAGE, /ENGLISHDATE, /ISODATE,
  1697.   /XFERMODE, /MESSAGE, /SORT, /REVERSE, /ASCENDING.  In other words, only
  1698.   file selection switches are meaningful with /ARRAY: /FILES, /DIRECTORIES,
  1699.   /ALL, /DOTFILES, /NOBACKUP, /RECURSIVE, /SMALLER, /LARGER, /AFTER,
  1700.   /BEFORE, /EXCEPT, etc.  The resulting array has the number of files (n) as
  1701.   its 0th element, and the filenames in elements 1 through n.  Example:
  1702.     dir /array:&a /files /nobackup /after:19990101 /larger:10000 [ab]*
  1703.     show array &a
  1704. /FILES
  1705.   Only show regular files.
  1706. /DIRECTORIES
  1707.   Only show directories.
  1708. /BACKUP
  1709.   In UNIX, OS-9, K-95, and other versions that support SET FILE COLLISION
  1710.   BACKUP and create backup files by appending .~n~ to the filename (where
  1711.   "n" is a number), /BACKUP means to include these files in directory
  1712.   listings.  This is the default.
  1713. /NOBACKUP
  1714.   This is the opposite of /BACKUP: that is, do not include backup files in
  1715.   the listing.
  1716. /BRIEF
  1717.   List filenames only; use a compact format, as many filenames as will fit
  1718.   across the screen (based on the longest name).  A brief listing is always
  1719.   sorted alphabetically.
  1720. /VERBOSE
  1721.   List one file per line, and include date, size, and (in UNIX only)
  1722.   permissions of each file.  This is the opposite of /BRIEF, and is the
  1723.   default.
  1724. /PAGE
  1725.   Pause at the end of each screenful and give a "more?" prompt, even if
  1726.   SET COMMAND MORE-PROMPTING is OFF.
  1727. /NOPAGE
  1728.   Don't pause at the end of each screenful and give a "more?" prompt, even if
  1729.   SET COMMAND MORE-PROMPTING is ON.  If neither /PAGE or /NOPAGE is given,
  1730.   paging is according to the prevailing COMMAND MORE-PROMPTING setting (which
  1731.   can be displayed with SHOW COMMAND).
  1732. /ENGLISHDATE
  1733.   Show dates in dd-mmm-yyyy format; mmm is the first three letters of the
  1734.   English month name.
  1735. /ISODATE
  1736.   Show dates in yyyy-mm-dd format; mm is the month number, 1-12.
  1737.   This is the opposite of /ENGLISHDATE, and is the default.
  1738. /HEADINGS
  1739.   Print a heading before the listing and a summary at the end.
  1740. /NOHEADINGS
  1741.   Don't print a heading before the listing or a summary at the end.
  1742.   This is the opposite of /HEADINGS, and is the default.
  1743. /XFERMODE
  1744.   Only in Kermit programs that support SET FILE PATTERNS.  If this switch is
  1745.   included, and the filename matches any FILE BINARY-PATTERN (Section 4.3),
  1746.   "(B)" is printed after the filename; otherwise, if it matches a FILE
  1747.   TEXT-PATTERN, "(T)" is printed.
  1748. /NOXFERMODE
  1749.   Don't display transfer-mode indicators.  This is the opposite of /XFERMODE
  1750.   and is the default.
  1751. /RECURSIVE
  1752.   Show files not only in the given directory, but also in its subdirectories
  1753.   (if any), their subdirectories, etc.
  1754. /NORECURSIVE
  1755.   Don't show files in subdirectories.  This is the opposite of /RECURSIVE,
  1756.   and is the default.
  1757. /MESSAGE:text
  1758.   This lets you specify a short text string to be appended to the end of
  1759.   each directory listing line (a space is supplied automatically).  If the
  1760.   text contains any spaces, enclose it in braces, e.g. /MESSAGE:{two words}.
  1761. /NOMESSAGE
  1762.   Don't append any message to the end of each directory listing line
  1763.   (default).
  1764. /SORT:[{NAME,SIZE,DATE}]
  1765.   Sort the listing by name, size, or date.  If the /SORT switch is given
  1766.   but the "sort-by" keyword is omitted, the listing is sorted by name.
  1767.   /SORT:NAME /ASCENDING (alphabetic sort by name) is the default.
  1768. /NOSORT
  1769.   Don't sort the listing.  Files are listed in whatever order they are
  1770.   supplied by the operating system, e.g. inode order in UNIX.
  1771. /REVERSE
  1772.   If the /SORT switch is given, reverse the order of the sort.
  1773.   Synonym: /DESCENDING.
  1774. /ASCENDING
  1775.   If the /SORT switch is given, sort the listing in normal order.
  1776.   This is the opposite of /REVERSE and is the default.
  1777. Note that most of the DIRECTORY-specific switches come in pairs, in which
  1778. one member of a pair (e.g.  /NOHEADINGS) is the opposite of the other
  1779. (e.g. /HEADINGS).
  1780. If you always want to use certain options, you can set them with the SET
  1781. OPTIONS DIRECTORY command (Section 1.5.5).  Use SHOW OPTIONS to list the
  1782. options currently in effect.  To make the desired options apply every time you
  1783. run C-Kermit, put a SET OPTIONS DIRECTORY command in your C-Kermit
  1784. customization file, specifying the desired options.  Options set in this
  1785. manner apply to every subsequent DIRECTORY command.  Of course, if you include
  1786. switches in a DIRECTORY command, these override any defaults, built-in or
  1787. custom.  Example:
  1788.   DIRECTORY            ; Use "factory defaults"
  1789.   SET OPTIONS DIRECTORY /SORT:SIZE /REVERSE /HEADINGS  ; Customize defaults
  1790.   DIRECTORY            ; Use customized defaults
  1791.   DIR /SORT:NAME       ; Override customized default SORT key
  1792.   SET OPT DIR /RECURS  ; Add /RECURSIVE to customized defaults
  1793.   DIR /ASCEND          ; Override customized default SORT order
  1794. Notes:
  1795.  . Only a single sort key is supported; there is presently no way to
  1796.    have multiple sort keys.
  1797.  . If the /BRIEF switch is given, all other switches (except /[NO]RECURSIVE,
  1798.    /[NO]DOTFILES, /DIRECTORIES, /FILES, and /ALL) are ignored.
  1799.  . /SORT:<anything> gives incorrect results if any files have lengths
  1800.    greater than 10 digits (i.e. that are more than 9999999999 bytes long, i.e.
  1801.    if they are 10GB or more in size) because the overlong length field causes
  1802.    the date and name fields to be misaligned.
  1803.  . /SORT:NAME is redundant in VMS since VMS returns filenames in alphabetic
  1804.    order anyway.
  1805.  . /SORT:NAME ignores alphabetic case on platforms where case does not matter
  1806.    in filenames, but this works only for unaccented Roman letters A-Z.
  1807.  . /SORT:NAME is currently based on code values, and so works fine for ASCII,
  1808.    but will probably produce unexpected results for files with non-ASCII or
  1809.    8-bit characters in their names.  (Locale-based sorting raises rather
  1810.    significant issues of portability, size, performance, etc.)
  1811.  . /SORT:DATE works right only for ISO-format dates, not English ones.
  1812.  . /SORT:SIZE sorts the size field lexically.  On some platforms
  1813.    (e.g. Windows), the size of a directory file is listed as "<DIR>" rather
  1814.    than as a number; in this case, the "<DIR>" files are gathered at the end
  1815.    (or beginning, depending on the sort order) of the listing.
  1816.  . /RECURSIVE is accepted but ignored in AOS/VS.  Use the normal
  1817.    system-specific filespec notation, e.g. "dir #.txt".
  1818.  . /RECURSIVE has no affect when a full, absolute pathname is given; e.g.
  1819.    "dir /recursive /tmp/foo" (where "foo" is a regular file) only shows the
  1820.    "/tmp/foo" file.  If you want to see all "foo" files in the /tmp tree,
  1821.    do "cd /tmp" and then "dir /recursive foo".
  1822.  . If a file size of -1 is shown, or date-time of 0000-00-00 00:00:00, this
  1823.    means the file was located, but access to information about the file was
  1824.    denied to C-Kermit.
  1825.  . In VMS, if FOO.DIR;1 is a directory within your current directory,
  1826.    "directory foo" and "directory [.foo]" list the files in the [.FOO]
  1827.    subdirectory, but "directory foo.dir" lists the directory file itself;
  1828.    similarly for "*.dir" versus "[.*]", etc.
  1829.  . In UNIX, if "foo" is a directory within your current directory,
  1830.    "directory foo" lists the files in the foo directory.  If you want to
  1831.    list the foo directory file itself, put an asterisk at the end:
  1832.    "dir foo*".
  1833. Hint: How to find the biggest files in a directory tree:
  1834.   cd xxx ; (root of tree)
  1835.   directory /sort:size /recursive /reverse /dotfiles /page
  1836. Another hint: If you often use several different directory-listing formats,
  1837. define macro shortcuts for them:
  1838.   DEFINE WD DIRECTORY /SORT:DATE /REVERSE %*  ; Reverse chronological order
  1839.   DEFINE SD DIRECTORY /SORT:SIZE /REVERSE %*  ; Reverse order of size
  1840.   DEFINE ND DIRECTORY /SORT:NAME /ASCEND %*   ; Alphabetical by name
  1841.   DEFINE DL DIR /DIR /SORT:NAME /ASCEND %*    ; Alphabetical directory list
  1842. Put these definitions in your C-Kermit customization file.  Note that "%*"
  1843. (Section 7.5) in these definitions lets you include other switches in your
  1844. macro invocations, e.g.:
  1845.   wd /headings *.txt
  1846. Of course you can still access your external directory listing program by
  1847. using RUN or "!", e.g. in VMS:
  1848.   run directory /size/date/protection/except=*.obj oofa.*;0
  1849. or:
  1850.   !dir /size/date/prot/exc=*.obj oofa.*;0
  1851. In UNIX, use "!ls" or just "ls" (which is a special synonym for "!ls").
  1852. 4.5.2. The CD and BACK Commands
  1853. In 7.0, the CD command has a new friend, the BACK command.  BACK
  1854. means "CD to my previous current directory".  A second BACK brings you back
  1855. to where you were before the first one; thus successive BACK commands switch
  1856. back and forth between two directories.
  1857. 4.5.2.1. Parsing Improvements
  1858. The CD command, as well as other commands that parse a directory name, were
  1859. changed in 7.0 to provide all the expected functions: completion on Tab
  1860. or Esc, directory-name lists on ?, etc.  Other affected commands include
  1861. SET SERVER GET-PATH, SET TEMP-DIRECTORY, SET FILE DOWNLOAD-DIRECTORY, and
  1862. SPACE.  CD and REMOTE CD also now work with logical names.
  1863. In VMS, the situation is a bit complicated since a directory name can look
  1864. like "DEV:", "[FOO.BAR]", "DEV:[FOO.BAR]", "[FOO]BAR.DIR;1", etc.  Completion
  1865. and ?-help might not always work, but they do in many cases.  Examples:
  1866.   cd ?           Lists all subdirectories of the current directory
  1867.   cd []?         Ditto
  1868.   cd k?          Ditto, but only those starting with K
  1869.   cd [foo]?      Lists all subdirectories of the [FOO] directory
  1870.   cd [-]?        Lists all subdirectories of the superior directory
  1871.   cd [--]?       Lists all subdirectories of the directory 2 levels up
  1872.   cd [...]?      Lists all directories below the current one
  1873.   cd [foo.?      Does not work.
  1874. C-Kermit allows all of the following in VMS:
  1875.   cd bar         CD to subdirectory BAR of the current directory
  1876.   cd .bar        Ditto
  1877.   cd [.bar]      Ditto
  1878.   cd bar.dir     etc...
  1879.   cd bar.dir;
  1880.   cd bar.dir;1
  1881.   cd [foo.bar]
  1882.   cd bar.baz     This can go more than 1 level deep...
  1883.   cd dir:        (where logical name DIR is defined as [FOO.BAR])
  1884. As well as the following:
  1885.   cd ..          Go up one level as in UNIX
  1886.   cd .           The current directory
  1887.   cd             My login directory
  1888. Note that "cd -" (go up one level) does not work as expected, because "-" is
  1889. Kermit's command continuation character.  However, "cd [-]", and "cd {-}" have
  1890. the desired effect (and so does "cd ..", which is easier to type).
  1891. 4.5.2.2. The CDPATH
  1892. The CD command in the UNIX, Windows, OS/2, and VMS versions of C-Kermit, as of
  1893. version 6.1 / 1.1.12, searches the CDPATH for the given directory, if it is not
  1894. absolute and if a CDPATH environment variable is defined.  Example (in UNIX
  1895. ksh or bash):
  1896.   $ export CDPATH=$HOME:$HOME/kermit:/tmp
  1897. Now if you give a "cd xxx" command, no matter what your current directory is,
  1898. if the "xxx" directory is not a subdirectory of your current directory, then
  1899. the xxx subdirectory of your home directory is used or if that does not exist,
  1900. then the xxx subdirectory of the kermit subdirectory of your home directory is
  1901. used or if that does not exist, then /tmp/xxx is used.  This is how the ksh
  1902. "cd" command works, and now the C-Kermit CD command works the same way.
  1903. In VMS, you can define CDPATH to be a list of directories that contain actual
  1904. directory delimiters, and/or logical names representing directories, using
  1905. commas to separate them, e.g.:
  1906.   $ define cdpath [HOME],[SOMEOTHERDIR],[HOME.MISC]
  1907. or:
  1908.   $ define cdpath SYS$LOGIN:,DISK1:[HOME],DISK2:[SCRATCH.IVAN]
  1909. Example:
  1910.   $ define cdpath SYS$LOGIN:,[IVAN],[OLAF],[OLGA.MISC]
  1911.   $ kermit
  1912.   DISK1:[OLGA] C-Kermit> cd blah
  1913. tries the BLAH subdirectory of the user's login directory, then [OLGA.BLAH],
  1914. [IVAN.BLAH], [OLAF.BLAH], and [OLGA.MISC.BLAH], in that order, using the first
  1915. one it finds, failing if it finds none.
  1916. In C-Kermit 7.0, you may also set the CDPATH from the Kermit prompt:
  1917. SET CD PATH <path>
  1918.   Allows the CD PATH to be set from within C-Kermit.
  1919. SHOW CD shows the CD path and all other information relevant to the CD command.
  1920. 4.5.2.3. CD Messages
  1921. Whenever you change directory, you can have C-Kermit display a "Read Me" file
  1922. from the new directory automatically.  The commands are:
  1923. SET CD MESSAGE { ON, OFF, FILE <list> }
  1924.   ON enables this feature; OFF (the default) disables it.  File lets you
  1925.   specify the name of the "Read Me" file.  A list of names to look for can be
  1926.   given in the following format:
  1927.     {{name1}{name2}{name3}{...}}
  1928.   e.g. SET SERVER CD-MESSAGE FILE {{./.readme}{README.TXT}{READ.ME}}
  1929.   The default list of CD-message files is system dependent.
  1930. SHOW CD shows your current directory, previous directory, CD path, and CD
  1931. message info.
  1932. 4.5.3. Creating and Removing Directories
  1933. The MKDIR command now allows you to create multiple directories at once:
  1934.   C-Kermit> mkdir a/b/c/d
  1935. creates the directory a in the current directory (if it doesn't exist
  1936. already), and then creates a subdirectory b of the a directory (if it didn't
  1937. exist already), and so on.
  1938. If you use MKDIR to try to create a directory that already exists, C-Kermit
  1939. will print a warning ("?Directory already exists"), but the MKDIR command
  1940. will still succeed.  If you want to avoid the warning message, use
  1941. IF DIRECTORY first to check if the directory already exists.
  1942. The RMDIR command, however, will not remove more than one directory, nor
  1943. will it remove a directory that contains any files.  (There is, as yet, no
  1944. RMDIR /RECURSIVE command, although one might be added later.)
  1945. In VMS, these commands (like CD) are more forgiving of your syntax than is the
  1946. DCL command shell; "mkdir oofa" is equivalent to "mkdir [.oofa]" and so on.
  1947. Also in VMS, you'll find that C-Kermit's RMDIR command is easier than deleting
  1948. a directory in DCL, since it automatically first gives it owner delete
  1949. permission if you are the owner.
  1950. 4.5.4. The DELETE and PURGE Commands
  1951. The DELETE command now offers a selection of switches, and has a new
  1952. companion, the PURGE command.  First, DELETE:
  1953. DELETE [ switches... ] filespec
  1954.   Deletes the file or files that match the filespec, which may contain
  1955.   wildcards (Section 4.9).
  1956. Optional switches include the standard file-selection switches presented in
  1957. Section 1.5.4, plus:
  1958. /ASK
  1959.   Before deleting each file, ask permission interactively.  Answers are
  1960.   Yes or OK (delete the file), No (don't delete it), or Quit (stop executing
  1961.   the DELETE command).
  1962. /NOASK
  1963.   Don't ask permission to delete each file.
  1964. /LIST
  1965.   List each file and show whether it was deleted.  Synonyms: /LOG, /VERBOSE.
  1966. /NOLIST
  1967.   Don't list files while deleting them.  Synonyms: /NOLOG, /QUIET.
  1968. /HEADING
  1969.   Print a heading and summary line.
  1970. /NOHEADING
  1971.   Don't print a heading and summary line.
  1972. /PAGE
  1973.   When listing, pause at the end of each screenful and give the "More?"
  1974.   prompt.  If you reply "n" (no), the DELETE command terminates.
  1975. /SIMULATE
  1976.   Do everything implied by the given switches and filespec, except do not
  1977.   actually delete any files.  This lets you preview which files would be
  1978.   deleted; implies /LIST.
  1979. Now the PURGE command:
  1980. PURGE [ switches... ] [ filespec ]
  1981.   (VMS only) Runs the DCL PURGE command.  Switches and filespec, if any,
  1982.   are passed directly to DCL without parsing or verification.  Deletes
  1983.   excess versions of the given (or all) files.  The rest of this section
  1984.   does not apply to VMS.
  1985. PURGE [ switches... ] [ filespec ]
  1986.   (UNIX only) Deletes "backup files" that match the filespec, which may
  1987.   contain wildcards (Section 4.9).  If no filespec is given, all backup
  1988.   files in the current directory are selected (subject to modification by
  1989.   any switches).  Do not include backup notation in the filespec.
  1990. Explanation:
  1991. To avoid destroying preexisting files when a new file arrives that has the
  1992. same name, C-Kermit backs up the old file by appending a "backup number" to
  1993. its name.  In UNIX, the backup suffix consists of a period, a tilde, a number,
  1994. and another tilde.  For example, if a file called oofa.txt exists and a new
  1995. oofa.txt file arrives, the original is renamed to oofa.txt.~1~.  If another
  1996. oofa.txt file arrives, the existing one is renamed to oofa.txt.~2~.  And so
  1997. on.  This system is compatible with the one used by EMACS.  Thus over time, if
  1998. you receive a lot of files with C-Kermit or edit them with EMACS, backup files
  1999. can build up.  The new PURGE command lets you clean out accumulated backup
  2000. files:
  2001. Optional switches include the standard file-selection switches presented in
  2002. Section 1.5.4, plus all the switches listed above for the DELETE command,
  2003. plus:
  2004. /KEEP:n
  2005.   Retains the 'n' most recent (highest-numbered) backup files for each file.
  2006.   For example, if oofa.txt, oofa.txt.~1~, oofa.txt.~2~, oofa.txt.~10~,
  2007.   oofa.txt.~12~, and oofa.txt.~100~ exist, "purge /keep:2 oofa.txt" deletes
  2008.   oofa.txt.~1~, oofa.txt.~2~, and oofa.txt.~10~, and keeps oofa.txt,
  2009.   oofa.txt.~12~, and oofa.txt.~100~.  If /KEEP is given without a number,
  2010.   one (the highest numbered) backup file is kept.
  2011. CAUTION: The PURGE command should be used only when *.~*~ files truly are
  2012. backup files.  This is the case for EMACS, and it is the DEFAULT for C-Kermit.
  2013. However, if C-Kermit's FILE COLLISION has been set to RENAME, newly received
  2014. files will look like backup files.  In that case, don't use the PURGE command
  2015. or you'll be removing new files rather than old ones.  (Use SHOW FILE to find
  2016. the FILE COLLISION setting.)
  2017. The PURGE command is presently available only in UNIX.  The command succeeds
  2018. if it deleted any files, or if it deleted no files but there were no errors.
  2019. It fails if it deleted no files and there were errors (i.e. deletion was
  2020. attempted but failed).  In VMS, backup file versions are handled automatically
  2021. by the OS, and a PURGE command can be used at the VMS prompt to clean them up.
  2022. If you want certain switches to be supplied automatically with each DELETE or
  2023. PURGE command, you can set them with SET OPTIONS (Section 1.5.5) and you can
  2024. display any such settings with SHOW OPTIONS.  Of course you can override them
  2025. on a per-command basis by including switches in your PURGE or DELETE command.
  2026. Also see SET FILE COLLISION, SHOW FILE, SEND /NOBACKUP, SET SEND BACKUP, and
  2027. DIRECTORY /[NO]BACKUP.