|
|
1.1 ! root 1: @comment[ -*-Text-*- ] ! 2: @Part(CKUNIX,root="KER:KUSER") ! 3: @string(-ckversion="@q<4C(057)>") ! 4: @define(exx=example,above 2,below 1) ! 5: @Chapter<UNIX KERMIT> ! 6: ! 7: @Begin<Description,Leftmargin +12,Indent -12,spread 0> ! 8: @i(Program:)@\Frank da Cruz, Bill Catchings, Jeff Damens, Columbia ! 9: University; Herm Fischer, Encino CA; contributions by ! 10: many others. ! 11: ! 12: @i(Language:)@\C ! 13: ! 14: @i(Documentation:)@\Frank da Cruz, Herm Fischer ! 15: ! 16: @i(Version:)@\@value(-ckversion) ! 17: ! 18: @i(Date: )@\July 26, 1985 ! 19: @end<Description> ! 20: ! 21: C-Kermit is a completely new implementation of Kermit, written modularly and ! 22: transportably in C. The protocol state transition table is written in ! 23: @i'wart', a (non-@|proprietary) lex-@|like preprocessor for C. ! 24: System-@|dependent primitive functions are isolated into separately compiled ! 25: modules so that the program should be easily portable among Unix systems and ! 26: also to non-@|Unix systems that have C compilers. This document applies to ! 27: Unix implementations of C-Kermit, and in most ways also to the VMS ! 28: implementation. ! 29: ! 30: @subheading<Unix Kermit Capabilities At A Glance:> ! 31: @begin<format,leftmargin +2,above 1,below 1> ! 32: @tabclear()@tabset(3.5inches,4.0inches) ! 33: Local operation:@\Yes ! 34: Remote operation:@\Yes ! 35: Login scripts:@\Yes ! 36: Transfer text files:@\Yes ! 37: Transfer binary files:@\Yes ! 38: Wildcard send:@\Yes ! 39: File transfer interruption:@\Yes ! 40: Filename collision avoidance:@\Yes ! 41: Can time out:@\Yes ! 42: 8th-bit prefixing:@\Yes ! 43: Repeat count prefixing:@\Yes ! 44: Alternate block checks:@\Yes ! 45: Terminal emulation:@\Yes ! 46: Communication settings:@\Yes ! 47: Transmit BREAK:@\Yes ! 48: Support for dialout modems:@\Yes ! 49: IBM mainframe communication:@\Yes ! 50: Transaction logging:@\Yes ! 51: Session logging:@\Yes ! 52: Debug logging:@\Yes ! 53: Packet logging:@\Yes ! 54: Act as server:@\Yes ! 55: Talk to server:@\Yes ! 56: Advanced server functions:@\Yes ! 57: Local file management:@\Yes ! 58: Command/Init files:@\Yes ! 59: UUCP and multiuser line locking:@\Yes ! 60: File attributes packets:@\No ! 61: Command macros:@\No ! 62: Raw file transmit:@\No ! 63: @end<format> ! 64: ! 65: @index(C-Kermit)@index(Unix Kermit) ! 66: C-Kermit provides traditional Unix command line operation as well as ! 67: interactive command prompting and execution. The command line options ! 68: provide access to a minimal subset of C-Kermit's capabilities; the ! 69: interactive command set is far richer. ! 70: ! 71: On systems with dialout modems, C-Kermit can use its command file and login ! 72: script facilities to replicate the file transfer functionality of ! 73: UUCP among heterogeneous operating systems, including the use of scheduled ! 74: (e.g. late night) unattended operation. ! 75: ! 76: @section(The Unix File System) ! 77: ! 78: Consult your Unix manual for details about the file system under your version ! 79: of Unix. For the purposes of Kermit, several things are worth briefly noting. ! 80: Unix files generally have lowercase names, possibly containing one or more dots ! 81: or other special characters. Unix directories are tree-@|structured. ! 82: Directory levels are separated by slash (@qq[/]) characters. For example, ! 83: @example(/usr/foo/bar) ! 84: denotes the file @q(bar) in the directory @q(/usr/foo). Wildcard or ! 85: "meta" characters allow groups of files to be specified. @qq(*) ! 86: matches any string; @qq(?) matches any single character. ! 87: ! 88: When C-Kermit is invoked with file arguments specified on the Unix command ! 89: line, the Unix shell (Bourne Shell, C-Shell, etc) expands the meta characters ! 90: itself, and in this case a wider variety is available. For example, ! 91: @example(kermit -s ~/ck[uvm]*.{upd,bwr}]) ! 92: is expanded by the Berkeley C-Shell into a list of all the files in the ! 93: user's home directory (@q[~/]) that start with the characters "@q(ck)", ! 94: followed by a single character @qq(u), @qq(v), or @qq(m), followed by zero ! 95: or more characters, followed by a dot, followed by one of the strings ! 96: @qq(upd) or @qq(bwr). Internally, the C-Kermit program itself expands only ! 97: the @qq(*) and @qq(?) meta characters. ! 98: ! 99: Unix files are linear streams of 8-bit bytes. Text files consist of 7-bit ! 100: ASCII characters, with the high-@|order bit off (0), and lines separated by the ! 101: Unix newline character, which is linefeed (LF, ASCII 10). This distinguishes ! 102: Unix text files from those on most other ASCII systems, in which lines are ! 103: separated by a carriage-@|return linefeed sequence (CRLF, ASCII 13 followed by ! 104: ASCII 10). Binary files are likely to contain data in the high bits of the ! 105: file bytes, and have no particular line or record structure. ! 106: ! 107: When transferring files, C-Kermit will convert between upper and lower ! 108: case filenames and between LF and CRLF line terminators automatically, ! 109: unless told to do otherwise. When binary files must be transferred, the ! 110: program must be instructed not to perform LF/CRLF conversion (@q[-i] on the ! 111: command line or "set file type binary" interactively; see below). ! 112: ! 113: @section(File Transfer) ! 114: ! 115: If C-Kermit is in local mode, the screen (stdout) is continously updated to ! 116: show the progress of the file transer. A dot is printed for every four data ! 117: packets, other packets are shown by type: ! 118: @begin(description,leftmargin +6, indent -2, spread 0) ! 119: I@\Exchange Parameter Information ! 120: ! 121: R@\Receive Initiate ! 122: ! 123: S@\Send Initiate ! 124: ! 125: F@\File Header ! 126: ! 127: G@\Generic Server Command ! 128: ! 129: C@\Remote Host Command ! 130: ! 131: N@\Negative Acknowledgement (NAK) ! 132: ! 133: E@\Fatal Error ! 134: ! 135: T@\Indicates a timeout occurred ! 136: ! 137: Q@\Indicates a damaged, undesired, or illegal packet was received ! 138: ! 139: @q<%>@\Indicates a packet was retransmitted ! 140: @end(description) ! 141: You may type certain "interrupt" commands during file transfer: ! 142: @begin(description,leftmargin +16,indent -12,spread 0) ! 143: Control-F:@\Interrupt the current File, and go on to the next (if any). ! 144: ! 145: Control-B:@\Interrupt the entire Batch of files, terminate the transaction. ! 146: ! 147: Control-R:@\Resend the current packet ! 148: ! 149: Control-A:@\Display a status report for the current transaction. ! 150: @end(description) ! 151: These interrupt characters differ from the ones used in other Kermit ! 152: implementations to avoid conflict with commonly used Unix shell interrupt ! 153: characters. With Version 7, System III, and System V implementations of ! 154: Unix, interrupt commands must be preceeded by the 'connect' escape character ! 155: (e.g. normally-@q[\]). ! 156: ! 157: @begin(quotation) ! 158: @i(CAUTION:)@index(Warning)@index<File Warning> ! 159: If Control-F or Control-B is used to cancel an incoming file, ! 160: and a file of the same name previously existed, @i(and) the "file warning" ! 161: feature is not enabled, then the previous copy of the file will disappear. ! 162: @end(quotation) ! 163: ! 164: @i(EMERGENCY EXIT:)@index<Emergency Exit> ! 165: When running Unix Kermit in remote mode, if you have started a protocol ! 166: operation (sending or receiving a file, server command wait, etc), you will ! 167: not be able to regain control of the terminal until the protocol operation ! 168: has run its course (completed or timed out). In particular, you cannot stop ! 169: the protocol by typing the normal Unix interrupt characters, since the ! 170: terminal has been put in "raw mode". If you need to regain control quickly ! 171: -- for instance, because the protocol is stuck -- you can type the following ! 172: sequence of four characters directly to the Unix Kermit program ("connect" ! 173: first if necessary): ! 174: @display<Control-A Control-C Control-C Carriage-Return> ! 175: This will cause the program to exit and restore the terminal to normal. ! 176: ! 177: @section(Command Line Operation) ! 178: ! 179: The C-Kermit command line syntax has been changed from that of earlier ! 180: releases of Unix Kermit to conform to the @ux(Proposed Syntax Standards for ! 181: Unix System Commands) put forth by Kathy Hemenway and Helene Armitage of ! 182: AT&T Bell Laboratories in @i(Unix/World), Vol.1, No.3, 1984. The rules that ! 183: apply are: ! 184: ! 185: @begin(itemize,spread 0) ! 186: Command names must be between 2 and 9 characters ("kermit" is 6). ! 187: ! 188: Command names must include lower case letters and digits only. ! 189: ! 190: An option name is a single character. ! 191: ! 192: Options are delimited by '@q(-)'. ! 193: ! 194: Options with no arguments may be grouped (bundled) behind one delimiter. ! 195: ! 196: Option-arguments cannot be optional. ! 197: ! 198: Arguments immediately follow options, separated by whitespace. ! 199: ! 200: The order of options does not matter. ! 201: ! 202: '@q(-)' preceded and followed by whitespace means standard input. ! 203: @end(itemize) ! 204: A group of bundled options may end with an option that has an argument. ! 205: ! 206: The following notation is used in command descriptions: ! 207: @begin(description,leftmargin +8,indent -8) ! 208: @i(fn)@\A Unix file specification, possibly containing the "wildcard" ! 209: characters `@q[*]' or `@q[?]' (`@q[*]' matches all character strings, `@q[?]' ! 210: matches any single character). ! 211: ! 212: @i(fn1)@\A Unix file specification which may not contain `@q[*]' or `@q[?]'. ! 213: ! 214: @i(rfn)@\A remote file specification in the remote system's own syntax, which ! 215: may denote a single file or a group of files. ! 216: ! 217: @i(rfn1)@\A remote file specification which should denote only a single file. ! 218: ! 219: @i(n)@\A decimal number between 0 and 94. ! 220: ! 221: @i(c)@\A decimal number between 0 and 127 representing the value of an ! 222: ASCII character. ! 223: ! 224: @i(cc)@\A decimal number between 0 and 31, or else exactly 127, ! 225: representing the value of an ASCII control character. ! 226: ! 227: @q([ ])@\Any field in square braces is optional. ! 228: ! 229: @q({x,y,z})@\Alternatives are listed in curly braces. ! 230: @end(description) ! 231: ! 232: C-Kermit command line options may specify either actions or settings. If ! 233: C-Kermit is invoked with a command line that specifies no actions, then it ! 234: will issue a prompt and begin interactive dialog. ! 235: Action options specify either protocol transactions or terminal connection. ! 236: ! 237: @begin<description,leftmargin +8,indent -8> ! 238: @q(-s )@i(fn)@\Send the specified file or files. If @i(fn) contains ! 239: wildcard (meta) characters, the Unix shell expands it into a list. If @i(fn) ! 240: is '@q[-]' then kermit sends from standard input, which must ! 241: come from a file: ! 242: @example(kermit -s - < foo.bar) ! 243: or a parallel process: ! 244: @example(ls -l | kermit -s -) ! 245: You cannot use this mechanism to send ! 246: terminal typein. If you want to send a file whose name is @qq(-) ! 247: you can precede it with a path name, as in ! 248: @example(kermit -s ./-) ! 249: ! 250: @q(-r)@\Receive a file or files. Wait passively for files to arrive. ! 251: ! 252: @q(-k)@\Receive (passively) a file or files, sending them to standard ! 253: output. This option can be used in several ways: ! 254: @begin(description,leftmargin +4,indent -4) ! 255: @q(kermit -k)@\Displays the incoming files on your screen; to be used only ! 256: in "local mode" (see below). ! 257: ! 258: @q(kermit -k > )@i(fn1)@\Sends the incoming file or files to the named file, ! 259: @i(fn1). If more than one file arrives, all are concatenated together ! 260: into the single file @i(fn1). ! 261: ! 262: @q(kermit -k | command)@\Pipes the incoming data (single or multiple ! 263: files) to the indicated command, as in ! 264: @example'kermit -k | sort > sorted.stuff' ! 265: @end(description) ! 266: ! 267: @q(-a )@i(fn1)@\If you have specified a file transfer option, you may specify ! 268: an alternate name for a single file with the @q(-a) option. For example, ! 269: @example'kermit -s foo -a bar' ! 270: sends the file @q(foo) telling the receiver that its name is @q(bar). ! 271: If more than one file arrives or is sent, only the first file is ! 272: affected by the @q(-a) option: ! 273: @example'kermit -ra baz' ! 274: stores the first incoming file under the name @q(baz). ! 275: ! 276: @q(-x)@\Begin server operation. May be used in either local or remote mode. ! 277: @end(description) ! 278: ! 279: Before proceeding, a few words about remote and local operation are ! 280: necessary. C-Kermit is "local" if it is running on PC or workstation that ! 281: you are using directly, or if it is running on a multiuser system and ! 282: transferring files over an external communication line -- not your job's ! 283: controlling terminal or console. C-Kermit is remote if it is running on a ! 284: multiuser system and transferring files over its own controlling terminal's ! 285: communication line, connected to your PC or workstation. ! 286: ! 287: If you are running C-Kermit on a PC, it is in local mode by default, ! 288: with the "back port" designated for file transfer and terminal connection. ! 289: If you are running C-Kermit on a multiuser (timesharing) system, it is ! 290: in remote mode unless you explicitly point it at an external line for ! 291: file transfer or terminal connection. The following command sets ! 292: C-Kermit's "mode": ! 293: ! 294: @begin(description,leftmargin +8,indent -8) ! 295: @q(-l )@i(dev)@\Line -- Specify a terminal line to use for file ! 296: transfer and terminal connection, as in ! 297: @example'kermit -l /dev/ttyi5' ! 298: @end(description) ! 299: ! 300: When an external line is being used, you might also need some additional ! 301: options for successful communication with the remote system: ! 302: ! 303: @begin(description,leftmargin +8,indent -8) ! 304: @q(-b )@i(n)@\Baud -- Specify the baud rate for the line given in the ! 305: @q(-l) option, as in ! 306: @example'kermit -l /dev/ttyi5 -b 9600' ! 307: This option should always be included with the @q(-l) option, since the ! 308: speed of an external line is not necessarily what you expect. ! 309: ! 310: @q(-p )@i(x)@\Parity -- e,o,m,s,n (even, odd, mark, space, or none). If parity ! 311: is other than none, then the 8th-bit prefixing mechanism will be ! 312: used for transferring 8-bit binary data, provided the opposite ! 313: Kermit agrees. The default parity is none. ! 314: ! 315: @q(-t)@\Specifies half duplex, line turnaround with XON as the handshake ! 316: character. ! 317: @end(description) ! 318: ! 319: The following commands may be used only with a C-Kermit which is local -- ! 320: either by default or else because the -l option has been specified. ! 321: ! 322: @begin(description,leftmargin +8,indent -8) ! 323: @q(-g )@i(rfn)@\Actively request a remote server to send the named file ! 324: or files; @i(rfn) is a file specification in the remote host's own syntax. If ! 325: @i(fn) happens to contain any special shell characters, like '@q(*)', ! 326: these must be quoted, as in ! 327: @example'kermit -g x\*.\?' ! 328: ! 329: @q(-f)@\Send a 'finish' command to a remote server. ! 330: ! 331: @q(-c)@\Establish a terminal connection over the specified or default ! 332: communication line, before any protocol transaction takes place. ! 333: Get back to the local system by typing the escape character ! 334: (normally Control-Backslash) followed by the letter 'c'. ! 335: ! 336: @q(-n)@\Like @q(-c), but @i(after) a protocol transaction takes place; ! 337: @q(-c) and @q(-n) may both be used in the same command. The use of @q(-n) ! 338: and @q(-c) is illustrated below. ! 339: @end(description) ! 340: On a timesharing system, the @q(-l) and @q(-b) options will also have to ! 341: be included with the @q(-r), @q(-k), or @q(-s) options if the other ! 342: Kermit is on a remote system. ! 343: ! 344: Several other command-line options are provided: ! 345: @begin(description,leftmargin +8,indent -8) ! 346: @q(-i)@\Specifies that files should be sent or received exactly "as is" ! 347: with no conversions. This option is necessary for transmitting ! 348: binary files. It may also be used to slightly boost efficiency ! 349: in Unix-to-Unix transfers of text files by eliminating CRLF/newline ! 350: conversion. ! 351: ! 352: @q(-w)@\Write-Protect -- Avoid filename collisions for incoming files. ! 353: ! 354: @q(-q)@\Quiet -- Suppress screen update during file transfer, for instance ! 355: to allow a file transfer to proceed in the background. ! 356: ! 357: @q(-d)@\Debug -- Record debugging information in the file @q(debug.log) in ! 358: the current directory. Use this option if you believe the program ! 359: is misbehaving, and show the resulting log to your local ! 360: kermit maintainer. ! 361: ! 362: @q(-h)@\Help -- Display a brief synopsis of the command line options. ! 363: @end(description) ! 364: The command line may contain no more than one protocol action option. ! 365: ! 366: Files are sent with their own names, except that lowercase letters are raised ! 367: to upper, pathnames are stripped off, certain special characters like (`@q[~]') ! 368: and (`@q[#]') are changed to `@q(X)', and if the file name begins with a ! 369: period, an `@q(X)' is inserted before it. Incoming files are stored under ! 370: their own names except that uppercase letters are lowered, and, if @q(-w) was ! 371: specified, a "generation number" is appended to the name if it has the same ! 372: name as an existing file which would otherwise be overwritten. If the @q(-a) ! 373: option is included, then the same rules apply to its argument. The file ! 374: transfer display shows any transformations performed upon filenames. ! 375: ! 376: During transmission, files are encoded as follows: ! 377: @begin(itemize) ! 378: Control characters are converted to prefixed printables. ! 379: ! 380: Sequences of repeated characters are collapsed via repeat counts, if ! 381: the other Kermit is also capable of repeated-@|character compression. ! 382: ! 383: If parity is being used on the communication line, data characters with ! 384: the 8th (parity) bit on are specially prefixed, provided the other Kermit ! 385: is capable of 8th-bit prefixing; if not, 8-bit binary files cannot be ! 386: successfully transferred. ! 387: ! 388: Conversion is done between Unix newlines and carriage-@|return-@|linefeed ! 389: sequences unless the @q(-i) option was specified. ! 390: @end(itemize) ! 391: ! 392: @subheading(Command Line Examples:) ! 393: ! 394: @exx(kermit -l /dev/ttyi5 -b 1200 -cn -r) ! 395: This command connects you to the system on the other end of @q(ttyi5) at ! 396: 1200 baud, where you presumably log in and run Kermit with a 'send' ! 397: command. After you escape back, C-Kermit waits for a file (or files) to ! 398: arrive. When the file transfer is completed, you are again connected to ! 399: the remote system so that you can logout. ! 400: ! 401: @exx(kermit -l /dev/ttyi4 -b 1800 -cntp m -r -a foo) ! 402: This command is like the preceding one, except the remote system in this ! 403: case uses half duplex communication with mark parity. The first file ! 404: that arrives is stored under the name @q(foo). ! 405: ! 406: @exx(kermit -l /dev/ttyi6 -b 9600 -c | tek) ! 407: This example uses Kermit to connect your terminal to the system at the ! 408: other end of @q(ttyi6). The C-Kermit terminal connection does not ! 409: provide any particular terminal emulation, so C-Kermit's standard i/o is ! 410: piped through a (hypothetical) program called tek, which performs (say) ! 411: Tektronix emulation. ! 412: ! 413: @exx(kermit -l /dev/ttyi6 -b 9600 -nf) ! 414: This command would be used to shut down a remote server and then connect ! 415: to the remote system, in order to log out or to make further use of it. ! 416: The @q(-n) option is invoked @i(after) @q(-f) (@q[-c] would have been invoked ! 417: before). ! 418: ! 419: @exx(kermit -l /dev/ttyi6 -b 9600 -qg foo.\* &) ! 420: This command causes C-Kermit to be invoked in the background, getting a group ! 421: of files from a remote server (note the quoting of the `@q[*]' character). No ! 422: display occurs on the screen, and the keyboard is not sampled for ! 423: interruption commands. This allows other work to be done while file ! 424: transfers proceed in the background. ! 425: ! 426: @exx(kermit -l /dev/ttyi6 -b 9600 -g foo.\* > foo.log < /dev/null &) ! 427: This command is like the previous one, except the file transfer display has ! 428: been redirected to the file @q(foo.log). Standard input is also redirected, to ! 429: prevent C-Kermit from sampling it for interruption commands. ! 430: ! 431: @exx(kermit -iwx) ! 432: This command starts up C-Kermit as a server. Files are transmitted with ! 433: no newline/@|carriage-@|return-@|linefeed conversion; the @q(-i) option is ! 434: necessary for binary file transfer and useful for Unix-@|to-@|Unix transfers. ! 435: Incoming files that have the same names as existing files are given new, unique ! 436: names. ! 437: ! 438: @exx(kermit -l /dev/ttyi6 -b 9600) ! 439: This command sets the communication line and speed. Since no action is ! 440: specified, C-Kermit issues a prompt and enters an interactive dialog with ! 441: you. Any settings given on the command line remain in force during the ! 442: dialog, unless explicitly changed. ! 443: ! 444: @exx(kermit) ! 445: This command starts up Kermit interactively with all default settings. ! 446: ! 447: The next example shows how Unix Kermit might be used to send an entire ! 448: directory tree from one Unix system to another, using the tar program as ! 449: Kermit's standard input and output. On the orginating system, in this case the ! 450: remote, type (for instance):@label(-uxtar) ! 451: ! 452: @exx(tar cf - /usr/fdc | kermit -is -) ! 453: This causes tar to send the directory @q(/usr/fdc) (and all its files and all ! 454: its subdirectories and all their files...) to standard output instead of to a ! 455: tape; kermit receives this as standard input and sends it as a binary file. ! 456: On the receiving system, in this case the local one, type (for instance): ! 457: ! 458: @exx(kermit -il /dev/ttyi5 -b 9600 -k | tar xf -) ! 459: Kermit receives the tar archive, and sends it via standard output to its own ! 460: copy of tar, which extracts from it a replica of the original directory tree. ! 461: ! 462: A final example shows how a Unix compression utility might be used to speed ! 463: up Kermit file transfers: ! 464: @begin(example) ! 465: compress file | kermit -is - (@i(sender)) ! 466: kermit -ik | uncompress (@i(receiver)) ! 467: @end(example) ! 468: ! 469: @subheading(Exit Status Codes:) ! 470: ! 471: Unix Kermit returns an exit status of zero, except when a fatal error is ! 472: encountered, where the exit status is set to one. With background ! 473: operation (e.g., `@q(&)' at end of invoking command line) driven by scripted ! 474: interactive commands (redirected standard input and/or take files), ! 475: any failed interactive command (such as failed dial or script attempt) ! 476: causes the fatal error exit. ! 477: ! 478: ! 479: @section(Interactive Operation) ! 480: ! 481: C-Kermit's interactive command prompt is "@q(C-Kermit>)". In response to this ! 482: prompt, you may type any valid command. C-Kermit executes the command and ! 483: then prompts you for another command. The process continues until you ! 484: instruct the program to terminate. ! 485: ! 486: Commands begin with a keyword, normally an English verb, such as "send". ! 487: You may omit trailing characters from any keyword, so long as you specify ! 488: sufficient characters to distinguish it from any other keyword valid in that ! 489: field. Certain commonly-@|used keywords (such as "send", "receive", "connect") ! 490: have special non-@|unique abbreviations ("s" for "send", "r" for "receive", ! 491: "c" for "connect"). ! 492: ! 493: Certain characters have special functions during typein of interactive ! 494: commands: ! 495: @Begin(Description,leftmargin +8,indent -4) ! 496: @q(?)@\Question mark, typed at any point in a command, will produce a ! 497: message explaining what is possible or expected at that point. Depending on ! 498: the context, the message may be a brief phrase, a menu of keywords, or a list ! 499: of files. ! 500: ! 501: @q(ESC)@\(The Escape or Altmode key) -- Request completion of the current ! 502: keyword or filename, or insertion of a default value. The result will be a ! 503: beep if the requested operation fails. ! 504: ! 505: @q(DEL)@\(The Delete or Rubout key) -- Delete the previous character from the ! 506: command. You may also use BS (Backspace, Control-H) for this function. ! 507: ! 508: @q(^W)@\(Control-W) -- Erase the rightmost word from the command line. ! 509: ! 510: @q(^U)@\(Control-U) -- Erase the entire command. ! 511: ! 512: @q(^R)@\(Control-R) -- Redisplay the current command. ! 513: ! 514: @q(SP)@\(Space) -- Delimits fields (keywords, filenames, numbers) within ! 515: a command. HT (Horizontal Tab) may also be used for this purpose. ! 516: ! 517: @q(CR)@\(Carriage Return) -- Enters the command for execution. LF (Linefeed) ! 518: or FF (formfeed) may also be used for this purpose. ! 519: ! 520: @q(\)@\(Backslash) -- Enter any of the above characters into the command, ! 521: literally. To enter a backslash, type two backslashes in a row (@q[\\]). ! 522: A backslash at the end of a command line causes the next line to be treated ! 523: as a continuation line; this is useful for readability in command files, ! 524: especially in the 'script' command. ! 525: @End(Description) ! 526: You may type the editing characters (@q[DEL], @q[^W], etc) repeatedly, to ! 527: delete all the way back to the prompt. No action will be performed until the ! 528: command is entered by typing carriage return, linefeed, or formfeed. If you ! 529: make any mistakes, you will receive an informative error message and a new ! 530: prompt -- make liberal use of `@q[?]' and ESC to feel your way through the ! 531: commands. One important command is "help" -- you should use it the first time ! 532: you run C-Kermit. ! 533: ! 534: A command line beginning with a percent sign @qq(%) is ignored. Such ! 535: lines may be used to include illustrative commentary in Kermit command dialogs. ! 536: ! 537: Interactive C-Kermit accepts commands from files as well as from the ! 538: keyboard. When you enter interactive dialog, C-Kermit looks for the file ! 539: @q(.kermrc) in your home or current directory (first it looks in the home ! 540: directory, then in the current one) and executes any commands it finds there. ! 541: These commands must be in interactive format, not Unix command-@|line format. ! 542: A "take" command is also provided for use at any time during an interactive ! 543: session. Command files may be nested to any reasonable depth. ! 544: ! 545: Here is a brief list of C-Kermit interactive commands: ! 546: @begin(format,spread 0) ! 547: @tabclear()@tabset(1.5inches,2.0inches,2.5inches) ! 548: @>!@\ Execute a Unix shell command, or start a shell. ! 549: @>bye@\ Terminate and log out a remote Kermit server. ! 550: @>close@\ Close a log file. ! 551: @>connect@\ Establish a terminal connection to a remote system. ! 552: @>cwd@\ Change Working Directory. ! 553: @>dial@\ Dial a telephone number. ! 554: @>directory@\ Display a directory listing. ! 555: @>echo@\ Display arguments literally. ! 556: @>exit@\ Exit from the program, closing any open files. ! 557: @>finish@\ Instruct a remote Kermit server to exit, but not log out. ! 558: @>get@\ Get files from a remote Kermit server. ! 559: @>help@\ Display a help message for a given command. ! 560: @>log@\ Open a log file -- debugging, packet, session, transaction. ! 561: @>quit@\ Same as 'exit'. ! 562: @>receive@\ Passively wait for files to arrive. ! 563: @>remote@\ Issue file management commands to a remote Kermit server. ! 564: @>script@\ Execute a login script with a remote system. ! 565: @>send@\ Send files. ! 566: @>server@\ Begin server operation. ! 567: @>set@\ Set various parameters. ! 568: @>show@\ Display values of 'set' parameters. ! 569: @>space@\ Display current disk space usage. ! 570: @>statistics@\ Display statistics about most recent transaction. ! 571: @>take@\ Execute commands from a file. ! 572: @end(format) ! 573: ! 574: The 'set' parameters are: ! 575: @begin(format,spread 0) ! 576: @tabclear()@tabset(1.5inches,2.0inches,2.5inches) ! 577: @>block-check@\ Level of packet error detection. ! 578: @>delay@\ How long to wait before sending first packet. ! 579: @>duplex@\ Specify which side echoes during 'connect'. ! 580: @>escape-character@\ Prefix for "escape commands" during 'connect'. ! 581: @>file@\ Set various file parameters. ! 582: @>flow-control@\ Communication line full-duplex flow control. ! 583: @>handshake@\ Communication line half-duplex turnaround character. ! 584: @>incomplete@\ Disposition for incompletely received files. ! 585: @>line@\ Communication line device name. ! 586: @>modem-dialer@\ Type of modem-dialer on communication line. ! 587: @>parity@\ Communication line character parity. ! 588: @>prompt@\ The C-Kermit program's interactive command prompt. ! 589: @>receive@\ Parameters for inbound packets. ! 590: @>send@\ Parameters for outbound packets. ! 591: @>speed@\ Communication line speed. ! 592: @end(format) ! 593: ! 594: The 'remote' commands are: ! 595: @begin(format,spread 0) ! 596: @tabclear()@tabset(1.5inches,2.0inches,2.5inches) ! 597: @>cwd@\ Change remote working directory. ! 598: @>delete@\ Delete remote files. ! 599: @>directory@\ Display a listing of remote file names. ! 600: @>help@\ Request help from a remote server. ! 601: @>host@\ Issue a command to the remote host in its own command language. ! 602: @>space@\ Display current disk space usage on remote system. ! 603: @>type@\ Display a remote file on your screen. ! 604: @>who@\ Display who's logged in, or get information about a user. ! 605: @end(format) ! 606: ! 607: Most of these commands are described adequately in the Kermit User Guide. ! 608: Special aspects of certain Unix Kermit commands are described below. ! 609: ! 610: @heading<The 'send' command> ! 611: ! 612: Syntax: @q<send >@i(fn)@q<@ @ - >@i<or>@q< -@ @ >@q<send >@i(fn1)@q< >@i<rfn1> ! 613: ! 614: Send the file or files denoted by @i(fn) to the other Kermit, which should be ! 615: running as a server, or which should be given the 'receive' command. Each file ! 616: is sent under its own name (as described above, or as specified by the 'set ! 617: file names' command). If the second form of the 'send' command is used, i.e. ! 618: with @i(fn1) denoting a single Unix file, @i(rfn1) may be specified as a name ! 619: to send it under. The 'send' command may be abbreviated to 's', even though ! 620: 's' is not a unique abbreviation for a top-level C-Kermit command. ! 621: ! 622: The wildcard (meta) characters `@q[*]' and `@q[?]' are accepted in @i(fn). If ! 623: `@q[?]' is to be included, it must be prefixed by `@q[\]' to override its ! 624: normal function of providing help. `@q[*]' matches any string, `@q[?]' matches ! 625: any single character. Other notations for file groups, like `@q([a-z]og)', are ! 626: not available in interactive commands (though of course they are available on ! 627: the command line). When @i(fn) contains `@q[*]' or `@q[?]' characters, there ! 628: is a limit to the number of files that can be matched, which varies from system ! 629: to system. If you get the message "Too many files match" then you'll have to ! 630: make a more judicious selection. If @i(fn) was of the form ! 631: @example(usr/longname/anotherlongname/*) ! 632: then C-Kermit's string space will fill up rapidly -- try doing a cwd (see ! 633: below) to the path in question and reissuing the command. ! 634: ! 635: @i<Note> -- C-Kermit sends only from the current or specified directory. ! 636: It does not traverse directory trees. If the source directory contains ! 637: subdirectories, they will be skipped. Conversely, C-Kermit does not create ! 638: directories when receiving files. If you have a need to do this, you can ! 639: pipe tar through C-Kermit, as shown in the example on page @pageref(-uxtar), ! 640: or under System III/V Unix you can use cpio. ! 641: ! 642: @i<Another Note> -- C-Kermit does not skip over "invisible" files that match ! 643: the file specification; Unix systems usually treat files whose names start ! 644: with a dot (like @q(.login), @q(.cshrc), and @q(.kermrc)) as invisible. ! 645: Similarly for "temporary" files whose names start with "@q(#)". ! 646: ! 647: @heading<The 'receive' command> ! 648: ! 649: Syntax: @q<receive@ @ - >@i<or>@q< -@ @ receive >@i<fn1> ! 650: ! 651: Passively wait for files to arrive from the other Kermit, which must be given ! 652: the 'send' command -- the 'receive' command does not work in conjunction with a ! 653: server (use 'get' for that). If @i(fn1) is specified, store the first incoming ! 654: file under that name. The 'receive' command may be abbreviated to 'r'. ! 655: ! 656: ! 657: @heading<The 'get' command:> ! 658: ! 659: Syntax:@q< get >@i<rfn> ! 660: @begin(example) ! 661: @i<or>: get ! 662: @i(rfn) ! 663: @i(fn1) ! 664: @end(example) ! 665: Request a remote Kermit server to send the named file or files. Since a ! 666: remote file specification (or list) might contain spaces, which normally ! 667: delimit fields of a C-Kermit command, an alternate form of the command is ! 668: provided to allow the inbound file to be given a new name: type 'get' alone ! 669: on a line, and you will be prompted separately for the remote and local ! 670: file specifications, for example ! 671: @Begin(Example) ! 672: C-Kermit>@ux(get) ! 673: Remote file specification: @ux(profile exec) ! 674: Local name to store it under: @ux(profile.exec) ! 675: @End(Example) ! 676: As with 'receive', if more than one file arrives as a result of the 'get' ! 677: command, only the first will be stored under the alternate name given by ! 678: @i(fn1); the remaining files will be stored under their own names if possible. ! 679: If a `@q[?]' is to be included in the remote file specification, you must ! 680: prefix it with `@q[\]' to suppress its normal function of providing help. ! 681: ! 682: If you have started a multiline 'get' command, you may escape from its ! 683: lower-@|level prompts by typing a carriage return in response to the prompt, ! 684: e.g. ! 685: @Begin(Example) ! 686: C-Kermit>@ux(get) ! 687: Remote file specification: @ux(foo) ! 688: Local name to store it under: @i<(Type a carriage return here)> ! 689: (cancelled) ! 690: C-Kermit> ! 691: @End(Example) ! 692: ! 693: @heading(The 'server' command:) ! 694: ! 695: The 'server' command places C-Kermit in "server mode" on the currently selected ! 696: communication line. All further commands must arrive as valid Kermit packets ! 697: from the Kermit on the other end of the line. The Unix Kermit server can ! 698: respond to the following commands: ! 699: @begin(format,spread 0,above 1,below 1) ! 700: @tabclear()@tabset(2.25inches) ! 701: @u<Command>@\@ux<Server Response> ! 702: get@\ Sends files ! 703: send@\ Receives files ! 704: bye@\ Attempts to log itself out ! 705: finish@\ Exits to level from which it was invoked ! 706: remote directory@\ Sends directory lising ! 707: remote delete@\ Removes files ! 708: remote cwd@\ Changes working directory ! 709: remote type@\ Sends files to your screen ! 710: remote space@\ Reports about its disk usage ! 711: remote who@\ Shows who's logged in ! 712: remote host@\ Executes a Unix shell command ! 713: remote help@\ Lists these capabilities ! 714: @end(format) ! 715: Note that the Unix Kermit server cannot always respond to a BYE command. ! 716: It will attempt to do so using "@q<kill()>", but this will not work ! 717: on all systems or under all conditions. ! 718: ! 719: If the Kermit server is directed at an external line (i.e. it is in ! 720: "local mode") then the console may be used for other work if you have ! 721: 'set file display off'; normally the program expects the ! 722: console to be used to observe file transfers and enter status queries or ! 723: interruption commands. The way to get C-Kermit into background operation from ! 724: interactive command level varies from system to system (e.g. on Berkeley Unix ! 725: you would halt the program with @q(^Z) and then use the C-Shell 'bg' command to ! 726: continue it in the background). The more common method ! 727: is to invoke the program with the desired command line arguments, including ! 728: "@q(-q)", and with a terminating "@q(&)". ! 729: ! 730: When the Unix Kermit server is given a 'remote host' command, it executes it ! 731: using the shell invoked upon login, e.g. the Bourne shell or the Berkeley ! 732: C-Shell. ! 733: ! 734: @Heading(The 'remote', 'bye', and 'finish' commands:) ! 735: ! 736: C-Kermit may itself request services from a remote Kermit server. In ! 737: addition to 'send' and 'get', the following commands may also be sent from ! 738: C-Kermit to a Kermit server: ! 739: ! 740: @begin(description,leftmargin +8,indent -4) ! 741: remote cwd [@i(directory)]@\If the optional remote directory specification is ! 742: included, you will be prompted on a separate line for a password, which will ! 743: not echo as you type it. ! 744: @end(description) ! 745: @begin(description,leftmargin +28, indent -24,spread 0,above 1) ! 746: remote delete rfn@\delete remote file or files. ! 747: ! 748: remote directory [@i(rfn)]@\directory listing of remote files. ! 749: ! 750: remote host @i(command)@\command in remote host's own command language. ! 751: ! 752: remote space@\disk usage report from remote host. ! 753: ! 754: remote type [@i(rfn)]@\display remote file or files on the screen. ! 755: ! 756: remote who [@i(user)]@\display information about who's logged in. ! 757: ! 758: remote help@\display remote server's capabilities. ! 759: @end(description) ! 760: @begin(description,leftmargin +8,indent -4) ! 761: bye @i(and) finish:@\When connected to a remote Kermit server, these commands ! 762: cause the remote server to terminate; 'finish' returns it to Kermit or system ! 763: command level (depending on the implementation or how the program was invoked); ! 764: 'bye' also requests it to log itself out. ! 765: @end(description) ! 766: @heading(The 'log' and 'close' commands:) ! 767: ! 768: Syntax: @q<log {debugging, packets, session, transactions} >[ @i(fn1) ] ! 769: ! 770: C-Kermit's progress may be logged in various ways. The 'log' command ! 771: opens a log, the 'close' command closes it. In addition, all open logs ! 772: are closed by the 'exit' and 'quit' commands. A name may be specified for ! 773: a log file; if the name is omitted, the file is created with a default ! 774: name as shown below. ! 775: ! 776: @begin(description,leftmargin +4,indent -4) ! 777: log debugging@\This produces a voluminous log of the internal workings of ! 778: C-Kermit, of use to Kermit developers or maintainers in tracking down suspected ! 779: bugs in the C-Kermit program. Use of this feature dramatically slows down the ! 780: Kermit protocol. Default name: @q(debug.log). ! 781: ! 782: log packets@\This produces a record of all the packets that go in and out of ! 783: the communication port. This log is of use to Kermit maintainers who are ! 784: tracking down protocol problems in either C-Kermit or any Kermit that ! 785: C-Kermit is connected to. Default name: @q(packet.log). ! 786: ! 787: log session@\This log will contain a copy of everything you see on your screen ! 788: during the 'connect' command, except for local messages or interaction with ! 789: local escape commands. Default name: @q(session.log). ! 790: ! 791: log transactions@\The transaction log is a record of all the files that were ! 792: sent or received while transaction logging was in effect. It includes time ! 793: stamps and statistics, filename transformations, and records of any ! 794: errors that may have occurred. The transaction log allows you to have ! 795: long unattended file transfer sessions without fear of missing some ! 796: vital screen message. Default name: @q(transact.log). ! 797: @end(description) ! 798: The 'close' command explicitly closes a log, e.g. 'close debug'. ! 799: ! 800: @i<Note:> Debug and Transaction logs are a compile-time option; C-Kermit may ! 801: be compiled without these logs, in which case it will run faster, it will ! 802: take up less space on the disk, and the commands relating to them will not ! 803: be present. ! 804: ! 805: @Heading(Local File Management Commands:) ! 806: ! 807: Unix Kermit allows some degree of local file management from interactive ! 808: command level: ! 809: @begin(description,leftmargin +4,indent -4) ! 810: directory [@i(fn)]@\ ! 811: Displays a listing of the names, modes, sizes, and dates of files ! 812: matching @i(fn) (which defaults to `@q[*]'). Equivalent to `@q(ls -l)'. ! 813: ! 814: cwd [directory-name]@\ ! 815: Changes Kermit's working directory to the one given, or to the ! 816: default directory if the directory name is omitted. This command affects only ! 817: the Kermit process and any processes it may subsequently create. ! 818: ! 819: space@\ ! 820: Display information about disk space and/or quota in the current ! 821: directory and device. ! 822: ! 823: @q(! )[@i(command)]@\ ! 824: The command is executed by the Unix shell. If no command is specified, then an ! 825: interactive shell is started; exiting from the shell, e.g. by typing Control-D, ! 826: will return you to C-Kermit command level. C-Kermit attempts to use your ! 827: preferred, customary shell. Use the `@q(!)' command to provide file management ! 828: or other functions not explicitly provided by C-Kermit commands. The `@q(!)' ! 829: command has certain peculiarities: ! 830: @begin(itemize,spread 0) ! 831: At least one space must separate the '!' from the shell command. ! 832: ! 833: A 'cd' command executed in this manner will have no effect -- use the ! 834: C-Kermit 'cwd' command instead. ! 835: @end(itemize) ! 836: @end(description) ! 837: ! 838: @heading(The 'set' and 'show' Commands:) ! 839: ! 840: Since Kermit is designed to allow diverse systems to communicate, it is ! 841: often necessary to issue special instructions to allow the program to adapt ! 842: to peculiarities of the another system or the communication path. These ! 843: instructions are accomplished by the 'set' command. The 'show' command may ! 844: be used to display current settings. Here is a brief synopsis of settings ! 845: available in the current release of C-Kermit: ! 846: ! 847: @begin(description,leftmargin +4,indent -4) ! 848: block-check {1, 2, 3}@\ Determines the level of per-packet error detection. ! 849: "1" is a single-@|character 6-bit checksum, folded to include the values of all ! 850: bits from each character. "2" is a 2-character, 12-bit checksum. "3" is a ! 851: 3-character, 16-bit cyclic redundancy check (CRC). The higher the block check, ! 852: the better the error detection and correction and the higher the resulting ! 853: overhead. Type 1 is most commonly used; it is supported by all Kermit ! 854: implementations, and it has proven adequate in most circumstances. Types 2 or ! 855: 3 would be used to advantage when transferring 8-bit binary files over noisy ! 856: lines. ! 857: ! 858: delay @i(n)@\How many seconds to wait before sending the first packet after a ! 859: 'send' command. Used in remote mode to give you time to escape back to your ! 860: local Kermit and issue a 'receive' command. Normally 5 seconds. ! 861: ! 862: duplex {full, half}@\For use during 'connect'. Specifies which side is doing ! 863: the echoing; 'full' means the other side, 'half' means C-Kermit must echo ! 864: typein itself. ! 865: ! 866: escape-character @i(cc)@\For use during 'connect' to get C-Kermit's attention. ! 867: The escape character acts as a prefix to an 'escape command', for instance to ! 868: close the connection and return to C-Kermit or Unix command level. ! 869: The normal escape character is Control-Backslash (28). ! 870: The escape character is also used in System III/V implementations ! 871: to prefix interrupt commands during file transfers. ! 872: ! 873: file {display, names, type, warning}@\ ! 874: Establish various file-related parameters: ! 875: @begin(description,leftmargin +4,indent -4) ! 876: display {on, off}@\Normally 'on'; when in local mode, display progress of file ! 877: transfers on the screen (stdout), and listen to the keyboard (stdin) ! 878: for interruptions. If off (-q on command line) none of this is ! 879: done, and the file transfer may proceed in the background oblivious ! 880: to any other work concurrently done at the console terminal. ! 881: ! 882: names {converted, literal}@\ ! 883: Normally converted, which mean that outbound filenames have path ! 884: specifications stripped, lowercase letters raised to upper, ! 885: tildes and extra periods changed to X's, and an X inserted in ! 886: front of any name that starts with period. Incoming files have ! 887: uppercase letters lowered. Literal means that none of these ! 888: conversions are done; therefore, any directory path appearing in a ! 889: received file specification must exist and be write-accessible. ! 890: When literal naming is being used, the sender should not use path ! 891: names in the file specification unless the same path exists on the ! 892: target system and is writable. ! 893: ! 894: type {binary, text}@\Normally text, which means that conversion is done between ! 895: Unix newline characters and the carriage-@|return/@|linefeed sequences ! 896: required by the canonical Kermit file transmission format, and in ! 897: common use on non-@|Unix systems. Binary means to transmit file ! 898: contents without conversion. Binary (`@q(-i)' in command line notation) ! 899: is necessary for binary files, and desirable in all Unix-@|to-@|Unix ! 900: transactions to cut down on overhead. ! 901: ! 902: warning {on, off}@\Normally off, which means that incoming files will silently ! 903: overwrite existing files of the same name. When on (`@q(-w)' on command line) ! 904: Kermit will check if an arriving file would overwrite an existing file; if so, ! 905: it will construct a new name for the arriving file, of the form @q(foo~)@i(n), ! 906: where foo is the name they share and @i(n) is a "generation number"; if @i(foo) ! 907: exists, then the new file will be called @q(foo~1). If @q(foo) and @q(foo~1) ! 908: exist, the new file will be @q(foo~2), and so on. If the new name would be ! 909: longer than the maximum length for a filename, then characters would be deleted ! 910: from the end first, for instance, @q(thelongestname) on a system with a limit ! 911: of 14 characters would become @q(thelongestn~1). ! 912: @begin(quotation) ! 913: @i(CAUTION:) If Control-F or Control-B is used to cancel an incoming file, ! 914: and a file of the same name previously existed, @i(and) the "file warning" ! 915: feature is not enabled, then the previous copy of the file will disappear. ! 916: @end(quotation) ! 917: @end(description) ! 918: ! 919: flow-control {none, xon/xoff}@\Normally xon/xoff for full duplex flow control. ! 920: Should be set to 'none' if the other system cannot do xon/xoff flow control, or ! 921: if you have issued a 'set handshake' command. If set to xon/xoff, then ! 922: handshake should be set to none. This setting applies during both terminal ! 923: connection and file transfer. ! 924: ! 925: incomplete {discard, keep}@\Disposition for incompletely received files. ! 926: If an incoming file is interrupted or an error occurs during transfer, ! 927: the part that was received so far is normally discarded. If you "set ! 928: incomplete keep" then such file fragments will be kept. ! 929: ! 930: handshake {xon, xoff, cr, lf, bell, esc, none}@\Normally none. Otherwise, ! 931: half-duplex communication line turnaround handshaking is done, which means Unix ! 932: Kermit will not reply to a packet until it has received the indicated handshake ! 933: character or has timed out waiting for it; the handshake setting applies only ! 934: during file transfer. If you set handshake to other than none, then flow ! 935: should be set to none. ! 936: ! 937: line [device-name]@\ ! 938: The device name for the communication line to be used for file transfer and ! 939: terminal connection, e.g. @q(/dev/ttyi3). If you specify a device name, ! 940: Kermit will be in local mode, and you should remember to issue any other ! 941: necessary 'set' commands, such as 'set speed'. If you omit the device name, ! 942: Kermit will revert to its default mode of operation. If you specify ! 943: @q(/dev/tty), Kermit will enter remote mode (useful when logged in through ! 944: the "back port" of a system normally used as a local-mode workstation). When ! 945: Unix Kermit enters local mode, it attempts to synchronize with other programs ! 946: (like uucp) that use external communication lines so as to prevent two ! 947: programs using the same line at once; before attempting to lock the specified ! 948: line, it will close and unlock any external line that was previously in use. ! 949: The method used for locking is the "uucp lock file", explained in more detail ! 950: later. ! 951: ! 952: modem-dialer {direct, hayes, racalvadic, ventel, ...}@\ The type of modem ! 953: dialer on the communication line. "Direct" indicates either there is no ! 954: dialout modem, or that if the line requires carrier detection to open, then ! 955: 'set line' will hang waiting for an incoming call. "Hayes", "Ventel", and the ! 956: others indicate that 'set line' (or the -l argument) will prepare for a ! 957: subsequent 'dial' command for the given dialer. Support for new dialers is ! 958: added from time to time, so type 'set modem ?' for a list of those supported ! 959: in your copy of Kermit. See the description of the 'dial' command ! 960: ! 961: parity {even, odd, mark, space, none}@\Specify character parity for use in ! 962: packets and terminal connection, normally none. If other than none, C-Kermit ! 963: will seek to use the 8th-bit prefixing mechanism for transferring 8-bit binary ! 964: data, which can be used successfully only if the other Kermit agrees; if not, ! 965: 8-bit binary data cannot be successfully transferred. ! 966: ! 967: prompt [string]@\The given string will be substituted for "@q(C-Kermit)>" as ! 968: this program's prompt. If the string is omitted, the prompt will revert to ! 969: "@q(C-Kermit>)". If the string is enclosed in doublequotes, the quotes will ! 970: be stripped and any leading and trailing blanks will be retained. ! 971: ! 972: send @i<parameter>@\ ! 973: Establish parameters to use when sending packets. These will be in effect ! 974: only for the initial packet sent, since the other Kermit may override these ! 975: parameters during the protocol parameter exchange (unless noted below). ! 976: @begin(description,leftmargin +4,indent -4) ! 977: end-of-packet @i(cc)@\Specifies the control character needed by the other ! 978: Kermit to recognize the end of a packet. C-Kermit sends this character at the ! 979: end of each packet. Normally 13 (carriage return), which most Kermit ! 980: implementations require. Other Kermits require no terminator at all, still ! 981: others may require a different terminator, like linefeed (10). ! 982: ! 983: packet-length @i(n)@\Specify the maximum packet length to send. Normally 90. ! 984: Shorter packet lengths can be useful on noisy lines, or with systems or front ! 985: ends or networks that have small buffers. The shorter the packet, the higher ! 986: the overhead, but the lower the chance of a packet being corrupted by noise, ! 987: and the less time to retransmit corrupted packets. This command overrides ! 988: the value requested by the other Kermit during protocol initiation. ! 989: ! 990: pad-character @i(cc)@\Designate a character to send before each packet. ! 991: Normally, none is sent. Outbound padding is sometimes necessary for ! 992: communicating with slow half duplex systems that provide no other means of ! 993: line turnaround control. It can also be used to send special characters ! 994: to communications equipment that needs to be put in "transparent" or ! 995: "no echo" mode, when this can be accomplished in by feeding it a certain ! 996: control character. ! 997: ! 998: padding @i(n)@\How many pad characters to send, normally 0. ! 999: ! 1000: start-of-packet @i(cc)@\The normal Kermit packet prefix is Control-A (1); this ! 1001: command changes the prefix C-Kermit puts on outbound packets. The only ! 1002: reasons this should ever be changed would be: Some piece of equipment somewhere ! 1003: between the two Kermit programs will not pass through a Control-A; or, some ! 1004: piece of of equipment similarly placed is echoing its input. In the latter ! 1005: case, the recipient of such an echo can change the packet prefix for outbound ! 1006: packets to be different from that of arriving packets, so that the echoed ! 1007: packets will be ignored. The opposite Kermit must also be told to change the ! 1008: prefix for its inbound packets. ! 1009: ! 1010: timeout @i(n)@\Specifies the number of seconds you want the other Kermit ! 1011: to wait for a packet before timing it out and requesting retransmission. ! 1012: @end(description) ! 1013: ! 1014: receive @i<parameter>@\ ! 1015: Establish parameters to request the other Kermit to use when sending packets. ! 1016: @begin(description,leftmargin +4,indent -4) ! 1017: end-of-packet @i(cc)@\Requests the other Kermit to terminate its packets with ! 1018: the specified character. ! 1019: ! 1020: packet-length @i(n)@\Specify the maximum packet length to that you want the ! 1021: other Kermit to send. Normally 90. ! 1022: ! 1023: pad-character @i(cc)@\C-Kermit normally does not need to have incoming packets ! 1024: preceded with pad characters. This command allows C-Kermit to request the ! 1025: other Kermit to use @i(cc) as a pad character. Default @i(cc) is NUL, ASCII 0. ! 1026: ! 1027: padding @i(n)@\How many pad characters to ask for, normally 0. ! 1028: ! 1029: start-of-packet @i(cc)@\Change the prefix C-Kermit looks for on inbound ! 1030: packets to correspond with what the other Kermit is sending. ! 1031: ! 1032: timeout @i(n)@\Normally, each Kermit partner sets its packet timeout interval ! 1033: based on what the opposite Kermit requests. This command allows you to ! 1034: override the normal procedure and specify a timeout interval for Unix Kermit to ! 1035: use when waiting for packets from the other Kermit. If you specify 0, then no ! 1036: timeouts will occur, and Unix Kermit will wait forever for expected packets to ! 1037: arrive. ! 1038: @end(description) ! 1039: ! 1040: speed {0, 110, 150, 300, 600, 1200, 1800, 2400, 4800, 9600}@\The baud rate for ! 1041: the external communication line. This command cannot be used to change the ! 1042: speed of your own console terminal. Many Unix systems are set up in such a way ! 1043: that you must give this command after a 'set line' command before you can use ! 1044: the line. 'set baud' is a synomym for 'set speed'. ! 1045: @end(description) ! 1046: ! 1047: @heading(The 'show' Command:) ! 1048: ! 1049: Syntax: @q<show {parameters, versions}> ! 1050: ! 1051: The "show" command with the default argument of "parameters" displays ! 1052: the values of all the 'set' parameters described above. If you type ! 1053: "show versions", then C-Kermit will display the version numbers and ! 1054: dates of all its internal modules. You should use the "show versions" ! 1055: command to ascertain the vintage of your Kermit program before reporting ! 1056: problems to Kermit maintainers. ! 1057: ! 1058: @heading(The 'statistics' Command:) ! 1059: ! 1060: The statistics command displays information about the most recent Kermit ! 1061: protocol transaction, including file and communication line i/o, timing ! 1062: and efficiency, as well as what encoding options were in effect (such as ! 1063: 8th-bit prefixing, repeat-@|count compression). ! 1064: ! 1065: @heading(The 'take' and 'echo' Commands:) ! 1066: ! 1067: Syntax: @q<take >@i<fn1>@* ! 1068: @ @ @ @ @ @q<echo >@i<[text to be echoed]> ! 1069: ! 1070: The 'take' command instructs C-Kermit to execute commands from the named ! 1071: file. The file may contain any interactive C-Kermit commands, including ! 1072: 'take'; command files may be nested to any reasonable depth. The 'echo' ! 1073: command may be used within command files to issue greetings, announce ! 1074: progress, ring the terminal bell, etc. ! 1075: ! 1076: The 'echo' command should not be confused with the Unix 'echo' command, which ! 1077: can be used to show how meta characters would be expanded. The Kermit echo ! 1078: command simply displays its text argument (almost) literally at the terminal; ! 1079: the argument may contain octal escapes of the form @qq(\ooo), ! 1080: where @q(o) is an octal digit (0-7), and there may be 1, 2, or 3 such digits, ! 1081: whose value specify an ASCII character, such as @qq(\007) (or @qq(\07) or ! 1082: just @qq(\7)) for beep, @qq(\012) for newline, etc. Of course, each ! 1083: backslash must be must be entered twice in order for it to be passed along ! 1084: to the echo command by the Kermit command parser. ! 1085: ! 1086: Take-command files are in exactly the same syntax as interactive commands. ! 1087: Note that this implies that if you want to include special characters like ! 1088: question mark or backslash that you would have to quote with backslash when ! 1089: typing interactive commands, you must quote these characters the same way ! 1090: in command files. Long lines may be continued by ending them with a single ! 1091: backslash. ! 1092: ! 1093: Command files may be used in lieu of command macros, which have not been ! 1094: implemented in this version of C-Kermit. For instance, if you commonly ! 1095: connect to a system called 'B' that is connected to ttyh7 at 4800 baud, ! 1096: you could create a file called @q(b) containing the commands ! 1097: @begin(example) ! 1098: % C-Kermit command file to connect to System B thru /dev/ttyh7 ! 1099: set line /dev/ttyh7 ! 1100: set speed 4800 ! 1101: % Beep and give message ! 1102: echo \\007Connecting to System B... ! 1103: connect ! 1104: @end(example) ! 1105: and then simply type 'take b' (or 't b' since no other commands begin with ! 1106: the letter 't') whenever you wish to connect to system B. Note the ! 1107: comment lines and the beep inserted into the 'echo' command. ! 1108: ! 1109: @index<IBM> ! 1110: For connecting to IBM mainframes, a number of 'set' commands are required; ! 1111: these, too, are conveniently collected into a 'take' file like this one: ! 1112: @begin(example) ! 1113: % Sample C-Kermit command file to set up current line ! 1114: % for IBM mainframe communication ! 1115: % ! 1116: set parity mark ! 1117: set handshake xon ! 1118: set flow-control none ! 1119: set duplex half ! 1120: @end(example) ! 1121: ! 1122: Note that no single command is available to wipe out all of these settings ! 1123: and return C-Kermit to its default startup state; to do that, you can either ! 1124: restart the program, or else make a command file that executes the necessary ! 1125: 'set' commands: ! 1126: @begin(example) ! 1127: % Sample C-Kermit command file to restore normal settings ! 1128: % ! 1129: set parity none ! 1130: set handshake none ! 1131: set flow-control xon/xoff ! 1132: set duplex full ! 1133: @end(example) ! 1134: ! 1135: An implicit 'take' command is executed upon your @q(.kermrc) file upon ! 1136: C-Kermit's initial entry into interactive dialog. The @q(.kermrc) file should ! 1137: contain 'set' or other commands you want to be in effect at all times. ! 1138: For instance, you might want override the default action when incoming files ! 1139: have the same names as existing files -- in that case, put the command ! 1140: @example(set file warning on) ! 1141: in your @q(.kermrc) file. On some non-Unix systems that run C-Kermit, this ! 1142: file might have a different name, such as @q<kermit.ini>. ! 1143: @begin(quotation) ! 1144: @i(NOTE:) The initialization file is currently @i(not) processed if Kermit is ! 1145: invoked with an action command from the command line. The same effect can be ! 1146: achieved, however, by defining an alias or shell procedure that starts up ! 1147: Kermit with the desired command line options. ! 1148: @end(quotation) ! 1149: ! 1150: Commands executed from take files are not echoed at the terminal. If you ! 1151: want to see the commands as well as their output, you could feed the ! 1152: command file to C-Kermit via redirected stdin, as in ! 1153: @example('kermit < cmdfile') ! 1154: Errors encountered during execution of take files (such as failure to complete ! 1155: dial or script operations) cause termination of the current take file, popping ! 1156: to the level that invoked it (take file, interactive level, or the shell). ! 1157: When kermit is executed in the background, errors during execution of a take ! 1158: file are fatal. ! 1159: ! 1160: @heading(The 'connect' Command:) ! 1161: ! 1162: The connect command links your terminal to another computer as if it were ! 1163: a local terminal to that computer, through the device specified in the most ! 1164: recent 'set line' command, or through the default device if your system ! 1165: is a PC or workstation. All characters you type at your keyboard ! 1166: are sent out the communication line, all characters arriving at the ! 1167: communication port are displayed on your screen. Current settings of speed, ! 1168: parity, duplex, and flow-@|control are honored. If you have issued a 'log ! 1169: session' command, everything you see on your screen will also be recorded ! 1170: to your session log. This provides a way to "capture" files from systems ! 1171: that don't have Kermit programs available. ! 1172: ! 1173: To get back to your own system, you must type the escape character, which is ! 1174: Control-@|Backslash (@q[^\]) unless you have changed it with the 'set escape' ! 1175: command, followed by a single-@|character command, such as 'c' for "close ! 1176: connection". Single-@|character commands include: ! 1177: @begin(description,leftmargin +8,indent -6,spread 0.4) ! 1178: c@\Close the connection ! 1179: ! 1180: b@\Send a BREAK signal ! 1181: ! 1182: 0@\(zero) send a null ! 1183: ! 1184: s@\Give a status report about the connection ! 1185: ! 1186: h@\Hangup the phone ! 1187: ! 1188: @q[^\]@\Send Control-Backslash itself (whatever you have defined the ! 1189: escape character to be, typed twice in a row sends one copy of it). ! 1190: @end(description) ! 1191: Uppercase and control equivalents for these letters are also accepted. A ! 1192: space typed after the escape character is ignored. Any other character will ! 1193: produce a beep. ! 1194: ! 1195: The connect command simply displays incoming characters on the screen. It is ! 1196: assumed any screen control sequences sent by the host will be handled by ! 1197: the firmware in your terminal or PC. If terminal emulation is desired, ! 1198: then the connect command can invoked from the Unix command line (@q(-c) or ! 1199: @q(-n)), piped through a terminal emulation filter, e.g. ! 1200: @example(kermit -l /dev/acu -b 1200 -c | tek) ! 1201: 'c' is an acceptable non-unique abbreviation for 'connect'. ! 1202: ! 1203: @heading(The 'dial' command:) ! 1204: ! 1205: Syntax: @q(dial )@i(telephone-number-string) ! 1206: ! 1207: @index<Modems>@index<Dialout Modems> ! 1208: This command controls dialout modems; you should have already issued a "set ! 1209: line" and "set speed" command to identify the terminal device, and a "set ! 1210: modem" command to identify the type of modem to be used for dialing. In the ! 1211: "dial" command, you supply the phone number and the Kermit program feeds it to ! 1212: the modem in the appropriate format and then interprets dialer return codes and ! 1213: modem signals to inform you whether the call was completed. The ! 1214: telephone-@|number-@|string may contain imbedded modem-@|dialer commands, such ! 1215: as comma for Hayes pause, or `@q(&)' for Ventel dialtone wait and `@q(%)' for ! 1216: Ventel pause (consult your modem manual for details). ! 1217: ! 1218: At the time of this writing, support is included for the following modems: ! 1219: @begin(itemize,spread 0) ! 1220: Cermetek Info-Mate 212A ! 1221: ! 1222: DEC DF03-AC ! 1223: ! 1224: DEC DF100 Series ! 1225: ! 1226: DEC DF200 Series ! 1227: ! 1228: General DataComm 212A/ED ! 1229: ! 1230: Hayes Smartmodem 1200 and compatibles ! 1231: ! 1232: Penril ! 1233: ! 1234: Racal Vadic ! 1235: ! 1236: US Robotics 212A ! 1237: ! 1238: Ventel ! 1239: @end(itemize) ! 1240: Support for new modems is added to the program from time to time; you ! 1241: can check the current list by typing "@q<set modem ?>". ! 1242: ! 1243: The device used for dialing out is the one selected in the most recent "set ! 1244: line" command (or on a workstation, the default line if no "set line" command ! 1245: was given). The "dial" command calls locks the path (see the section on line ! 1246: locking below) and establishes a call on an exclusive basis. If it is desired ! 1247: to dial a call and then return to the shell (such as to do kermit activities ! 1248: depending on standard in/out redirection), it is necessary to place the dialed ! 1249: call under one device name (say, "@q</dev/cua0>") and then escape to the shell ! 1250: @i<within Kermit> on a linked device which is separate from the dialed line ! 1251: (say, "@q</dev/cul0>"). This is the same technique used by uucp (to allow ! 1252: locks to be placed separately for dialing and conversing). ! 1253: ! 1254: Because modem dialers have strict requirements to override the carrier-@|detect ! 1255: signal most Unix implementations expect, the sequence for dialing is more rigid ! 1256: than most other C-Kermit procedures. ! 1257: ! 1258: Example one: ! 1259: @begin(example) ! 1260: @ux<kermit -l /dev/cul0 -b 1200> ! 1261: C-Kermit>@ux<set modem-dialer hayes> @i(hint: abbreviate) set m h ! 1262: C-Kermit>@ux<dial 9,5551212> ! 1263: Connected! ! 1264: C-Kermit>@ux<connect> @i(hint: abbreviate) c ! 1265: @i(logon, request remote server, etc.) ! 1266: C-Kermit> ... ! 1267: C-Kermit>@ux<quit> @i(hint: abbreviate) q ! 1268: @end(example) ! 1269: this disconnects modem, and unlocks line. ! 1270: ! 1271: Example two: ! 1272: @begin(example) ! 1273: @u(kermit) ! 1274: C-Kermit>@ux(set modem-dialer ventel) ! 1275: C-Kermit>@ux(set line /dev/cul0) ! 1276: C-Kermit>@ux(dial 9&5551212%) ! 1277: Connected! ! 1278: C-Kermit> ... ! 1279: @end(example) ! 1280: Example three: ! 1281: @begin(example) ! 1282: kermit ! 1283: C-Kermit>@ux(take my-dial-procedure) ! 1284: Connected! ! 1285: ! 1286: @i(file my-dial-procedure): ! 1287: set modem hayes ! 1288: set line /dev/tty99 ! 1289: dial 5551212 ! 1290: connect ! 1291: @end(example) ! 1292: For Hayes @index<Hayes Modem> dialers, two important switch settings are #1 and ! 1293: #6. #1 should be up so that the DTR is only asserted when the line is 'open'. ! 1294: #6 should be up so carrier-@|detect functions properly. Switches #2 (English ! 1295: versus digit result codes) and #4 (Hayes echoes modem commands) may be in ! 1296: either position. ! 1297: ! 1298: For any dialers in general, this Kermit program requires that the modem provide ! 1299: the "carrier detect" signal when a call is in progress, and remove that signal ! 1300: when the call completes or the line drops. If a switch setting is available to ! 1301: force carrier detect, it should not be in that setting. Secondly, this Kermit ! 1302: program requires that the modem track the computer's "data terminal ready" ! 1303: signal (DTR). If a switch setting is available to simulate DTR asserted within ! 1304: the modem, then it should not be in that setting. Otherwise the modem will be ! 1305: unable to hang up at the end of a call or when interrupts are received by ! 1306: Kermit. ! 1307: ! 1308: If you want to interrupt a dial command in progress (for instance, because ! 1309: you just realize that you gave it the wrong number), type a Control-C to ! 1310: get back to command level. ! 1311: ! 1312: @heading(The 'script' Command:) ! 1313: ! 1314: Syntax: @q(script )@i(expect send [expect send] . . .) ! 1315: ! 1316: "expect" has the syntax: @i(expect[-send-expect[-send-expect[...]]]) ! 1317: ! 1318: This command facilitates logging into a remote system and/or invoking ! 1319: programs or other facilities after login on a remote system. ! 1320: ! 1321: This login script facility operates in a manner similar to that commonly ! 1322: used by the Unix uucp System's "@q(L.sys)" file entries. A login script ! 1323: is a sequence of the form: ! 1324: @example(@i<expect send [expect send] . . .>) ! 1325: where @i(expect) is a prompt or message to be issued by the remote site, and ! 1326: @i(send) is the string (names, numbers, etc) to return. The send may also be ! 1327: the keyword EOT, to send Control-D, or BREAK, to send a break signal. Letters ! 1328: in send may be prefixed by `@q[~]' to send special characters. These are: ! 1329: @begin(description,leftmargin +8,indent -4,spread 0) ! 1330: @q(~b)@\backspace ! 1331: ! 1332: @q(~s)@\space ! 1333: ! 1334: @q(~q)@\`@q[?]'(trapped by Kermit's command interpreter) ! 1335: ! 1336: @q(~n)@\linefeed ! 1337: ! 1338: @q(~r)@\carriage return ! 1339: ! 1340: @q(~t)@\tab ! 1341: ! 1342: @q(~')@\single quote ! 1343: ! 1344: @q(~~)@\tilde ! 1345: ! 1346: @q(~")@\double quote ! 1347: ! 1348: @q(~x)@\XON (Control-Q) ! 1349: ! 1350: @q(~c)@\don't append a carriage return ! 1351: ! 1352: @q(~)@i(o[o[o]])@ @ an octal character ! 1353: ! 1354: @q(~d)@\delay approx 1/3 second during send ! 1355: ! 1356: @q(~w)@i([d[d]])@ @ wait specified interval during expect, then time out ! 1357: @end(description) ! 1358: As with some uucp systems, sent strings are followed by @q(~r) unless they have ! 1359: a @q(~c). ! 1360: ! 1361: Only the last 7 characters in each expect are matched. A null @i(expect), ! 1362: e.g. @q(~0) or two adjacent dashes, causes a short delay before proceeding ! 1363: to the next send sequence. A null expect always succeeds. ! 1364: ! 1365: As with uucp, if the expect string does not arrive, the script attempt ! 1366: fails. If you expect that a sequence might not arrive, as with uucp, ! 1367: conditional sequences may be expressed in the form: ! 1368: @example(@i<-send-expect[-send-expect[...]]>) ! 1369: where dashed sequences are followed as long as previous expects fail. ! 1370: Timeouts for expects can be specified using @q(~w); @q(~w) with no ! 1371: arguments waits 15 seconds. ! 1372: ! 1373: @i(Expect/send) transactions can be easily be debugged by logging ! 1374: transactions. This records all exchanges, both expected and actual. ! 1375: ! 1376: Note that `@q[\]' characters in login scripts, as in any other C-Kermit ! 1377: interactive commands, must be doubled up. A line may be ended with a ! 1378: single `@q[\]' for continuation. ! 1379: ! 1380: Example one: ! 1381: ! 1382: Using a modem, dial a UNIX host site. Expect "login" (...gin), and if it ! 1383: doesn't come, simply send a null string with a @q(~r). (Some Unixes ! 1384: require either an EOT or a BREAK instead of the null sequence, depending ! 1385: on the particular site's "logger" program.) After providing user id ! 1386: and password, respond "x" to a question-mark prompt, expect the Bourne ! 1387: shell "@q($)" prompt (and send return if it doesn't arrive). Then cd to ! 1388: directory kermit, and run the program called "wermit", entering the ! 1389: interactive connect state after wermit is loaded. ! 1390: @begin(example) ! 1391: set modem-dialer ventel ! 1392: set line /dev/tty77 ! 1393: set baud 1200 ! 1394: dial 9&5551212 ! 1395: script gin:--gin:--gin: smith ssword: mysecret ~q x $--$ \ ! 1396: cd~skermit $ wermit ! 1397: connect ! 1398: @end(example) ! 1399: ! 1400: Example two: ! 1401: ! 1402: @index(TELENET) ! 1403: Using a modem, dial the Telenet network. This network expects three ! 1404: returns with slight delays between them. These are sent following ! 1405: null expects. The single return is here sent as a null string, with ! 1406: a return appended by default. Four returns are sent to be safe before ! 1407: looking for the prompt. Then the Telenet id and password are entered. ! 1408: Then telenet is instructed to connect to a host site (c 12345). The ! 1409: host has a data switch, and to "which system" it responds "myhost". ! 1410: This is followed by a TOPS-20 logon, and a request to load Kermit, ! 1411: set even parity, and enter the server mode. Files ! 1412: are then exchanged. The commands are in a take file; note the continuation ! 1413: of the 'script' command onto several lines using the `@q[\]' terminator. ! 1414: @begin(example) ! 1415: set modem-dialer hayes ! 1416: set line /dev/cul0 ! 1417: set baud 1200 ! 1418: dial 9,5551212 ! 1419: set parity even ! 1420: script ~0 ~0 ~0 ~0 ~0 ~0 ~0 ~0 @@--@@--@@ id~saa001122 = 002211 @@ \ ! 1421: c~s12345 ystem-c~s12345-ystem myhost @@ joe~ssecret @@ kermit \ ! 1422: > set~sparity~seven > server ! 1423: send some.stuff ! 1424: get some.otherstuff ! 1425: bye ! 1426: quit ! 1427: @end(example) ! 1428: Since these commands may be executed totally in the background, they ! 1429: can also be scheduled. A typical shell script, which might be scheduled ! 1430: by cron, would be as follows (csh used for this example): ! 1431: ! 1432: @begin(example) ! 1433: # ! 1434: #keep trying to dial and log onto remote host and exchange files ! 1435: #wait 10 minutes before retrying if dial or script fail. ! 1436: # ! 1437: cd someplace ! 1438: while ( 1 ) ! 1439: kermit < /tonight.cmd >> nightly.log & ! 1440: if ( ! $status ) break ! 1441: sleep 600 ! 1442: end ! 1443: @end(example) ! 1444: File @q(tonight.cmd) might have two takes in it, for example, one to take ! 1445: a file with the set modem, set line, set baud, dial, and script, and ! 1446: a second take of a file with send/get commands for the remote server. ! 1447: The last lines of @q(tonight.cmd) should be a bye and a quit. ! 1448: ! 1449: @heading(The 'help' Command:) ! 1450: ! 1451: @begin(example,leftmargin 0) ! 1452: @r(Syntax:) help ! 1453: @ @ @ @i(or): help @i(keyword) ! 1454: @ @ @ @i(or): help {set, remote} @i(keyword) ! 1455: @end(example) ! 1456: ! 1457: Brief help messages or menus are always available at interactive command ! 1458: level by typing a question mark at any point. A slightly more verbose form ! 1459: of help is available through the 'help' command. The 'help' command with ! 1460: no arguments prints a brief summary of how to enter commands and how to ! 1461: get further help. 'help' may be followed by one of the top-level C-Kermit ! 1462: command keywords, such as 'send', to request information about a command. ! 1463: Commands such as 'set' and 'remote' have a further level of help. Thus you ! 1464: may type 'help', 'help set', or 'help set parity'; each will provide a ! 1465: successively more detailed level of help. ! 1466: ! 1467: ! 1468: @heading(The 'exit' and 'quit' Commands:) ! 1469: ! 1470: These two commands are identical. Both of them do the following: ! 1471: ! 1472: @begin(itemize,spread 0) ! 1473: Attempt to insure that the terminal is returned to normal. ! 1474: ! 1475: Relinquish access to any communication line assigned via 'set line'. ! 1476: ! 1477: Relinquish any uucp and multiuser locks on the communications line. ! 1478: ! 1479: Hang up the modem, if the communications line supports data terminal ready. ! 1480: ! 1481: Close any open log files. ! 1482: @end(itemize) ! 1483: After exit from C-Kermit, your default directory will be the same as when ! 1484: you started the program. The 'exit' command is issued implicitly whenever ! 1485: C-Kermit halts normally, e.g. after a command line invocation, or after certain ! 1486: kinds of interruptions. ! 1487: ! 1488: @section(UUCP Lock Files) ! 1489: ! 1490: Unix has no standard way of obtaining exclusive access to an external ! 1491: communication line. When you issue the 'set line' command to Unix Kermit, Unix ! 1492: would normally grant you access to the line even if some other process is ! 1493: making use of it. The method adopted by most Unix systems to handle this ! 1494: situation is the "UUCP lock file". UUCP, the Unix-@|to-@|Unix Copy program, ! 1495: creates a file in its directory (usually @q(/usr/spool/uucp), on some systems ! 1496: @q</etc/locks>) with a name like @q(LCK..)@i(name), where @i(name) is the ! 1497: device name, for instance @q(tty07). ! 1498: ! 1499: Unix Kermit uses UUCP lock files in order to avoid conflicts with UUCP, ! 1500: tip, or other programs that follow this convention. Whenever you attempt ! 1501: to access an external line using the 'set line' command or `@q(-l)' on the ! 1502: command line, Kermit looks ! 1503: in the UUCP directory for a lock file corresponding to that device. For ! 1504: instance, if you 'set line /dev/ttyi6' then Kermit looks for the file ! 1505: @example(/usr/spool/uucp/LCK..ttyi6) ! 1506: If it finds this file, it gives you an error message and a directory ! 1507: listing of the file so that you can see who is using it, e.g. ! 1508: @begin(example) ! 1509: -r--r--r-- 1 fdc 4 May 7 13:02 /usr/spool/uucp/LCK..ttyi6 ! 1510: @end(example) ! 1511: In this case, you would look up user fdc to find out how soon the line ! 1512: will become free. ! 1513: ! 1514: This convention requires that the uucp directory be publicly readable ! 1515: and writable. If it is not, the program will issue an appropriate warning ! 1516: message, but will allow you to proceed at your own risk (and the risk of ! 1517: anyone else who might also be using the same line). ! 1518: ! 1519: If no lock file is found, Unix Kermit will attempt create one, thus preventing ! 1520: anyone who subsequently tries to run Kermit, UUCP, tip, or similar programs on ! 1521: the same line from gaining access until you release the line. If Kermit could ! 1522: not create the lock file (for instance because the uucp directory is ! 1523: write-@|protected), then you will receive a warning message but will be allowed ! 1524: to proceed at your -- and everyone else's -- risk. When Kermit terminates ! 1525: normally, your lock file is removed. ! 1526: ! 1527: Even when the lock directory is writable and readable, the locking mechanism ! 1528: depends upon all users using the same name for the same device. If a device ! 1529: has more than one path associated with it, then a lock can be circumvented by ! 1530: using an alias. ! 1531: ! 1532: When a lock-@|creating program abruptly terminates, e.g. because it crashes or ! 1533: is killed via shell command, the lock file remains in the uucp directory, ! 1534: spuriously indicating that the line is in use. If the lock file is owned by ! 1535: yourself, you may remove it. Otherwise, you'll have to get the owner or the ! 1536: system manager to remove it, or else wait for a system task to do so; uucp ! 1537: supports a function (uuclean) which removes these files after a predetermined ! 1538: age -- uucp sites tend to run this function periodically via crontab. ! 1539: ! 1540: Locking is not needed, or used, if communications occur over the user's ! 1541: login terminal line (normally @q[/dev/tty]). ! 1542: ! 1543: It may be seen that line locking is fraught with peril. It is included in Unix ! 1544: Kermit only because other Unix communication programs rely on it. While it ! 1545: is naturally desirable to assure exclusive access to a line, it is also ! 1546: undesirable to refuse access to a vacant line only because of a spurious lock ! 1547: file, or because the uucp directory is not appropriately protected. ! 1548: ! 1549: @section(C-Kermit under Berkeley or System III/V Unix:) ! 1550: ! 1551: C-Kermit may be interrupted at command level or during file transfer by typing ! 1552: Control-C. The program will perform its normal exit function, restoring the ! 1553: terminal and releasing any lock. If a protocol transaction was in progress, an ! 1554: error packet will be sent to the opposite Kermit so that it can terminate ! 1555: cleanly. ! 1556: ! 1557: C-Kermit may be invoked in the background ("@q(&)" on shell commmand line). ! 1558: If a background process is "killed", the user will have to manually ! 1559: remove any lock file and may need to restore the modem. This is because ! 1560: the kill signal (@q<kill(@i[x],9)>) cannot be trapped by Kermit. ! 1561: ! 1562: During execution of a system command ('directory', 'cwd', or `@q(!)'), C-Kermit ! 1563: can often be returned to command level by typing a single Control-C. (With ! 1564: System III/V, the usual interrupt function (often the DEL key) is replaced by ! 1565: Control-C.) ! 1566: ! 1567: Under Berkeley Unix only: C-Kermit may also be interrupted by @q(^Z) to put the ! 1568: process in the background. In this case the terminal is not restored. You ! 1569: will have to type Control-J followed by "reset" followed by another Control-J ! 1570: to get your terminal back to normal. ! 1571: ! 1572: Control-C, Control-Z, and Control-@q(\) lose their normal functions during ! 1573: terminal connection and also during file transfer when the controlling tty ! 1574: line is being used for packet i/o. ! 1575: ! 1576: If you are running C-Kermit in "quiet mode" in the foreground, then ! 1577: interrupting the program with a console interrupt like Control-C will not ! 1578: restore the terminal to normal conversational operation. This is because ! 1579: the system call to enable console interrupt traps will cause the program to ! 1580: block if it's running in the background, and the primary reason for quiet ! 1581: mode is to allow the program to run in the background without blocking, so ! 1582: that you can do other work in the foreground. ! 1583: ! 1584: If C-Kermit is run in the background ("&" on shell commmand line), then ! 1585: the interrupt signal (Control-C) (and System III/V quit signal) are ! 1586: ignored. This prevents an interrupt signal intended for a foreground ! 1587: job (say a compilation) from being trapped by a background Kermit session. ! 1588: ! 1589: ! 1590: @section(C-Kermit on the DEC Pro-3xx with Pro/Venix Version 1) ! 1591: ! 1592: The DEC Professional 300 series are PDP-11/23 based personal computers. Venix ! 1593: Version 1 is a Unix v7 derivative. It should not be confused with Venix ! 1594: Version 2, which is based on ATT System V; these comments apply to Venix ! 1595: Version 1 only. C-Kermit runs in local mode on the Pro-3@i(xx) when invoked ! 1596: from the console; the default device is @q(/dev/com1.dout). When connected to ! 1597: a remote system (using C-Kermit's 'connect' command), Pro/Venix itself (not ! 1598: Kermit) provides VT52 terminal emulation. Terminal operation at high speeds ! 1599: (like 9600 baud) requires xon/xoff flow control, which unfortunately interferes ! 1600: with applications such as the EMACS that use Control-Q and Control-S as ! 1601: commands. ! 1602: ! 1603: When logging in to a Pro-3xx (or any workstation) through the "back port", ! 1604: it may be necessary to give the command "set line /dev/tty" in order to get ! 1605: C-Kermit to function correctly in remote mode (on a system in which it ! 1606: normally expects to be operating in local mode). ! 1607: ! 1608: @section(C-Kermit under VAX/VMS) ! 1609: ! 1610: Version 4C of C-Kermit can be built using VAX-11 C to run under VMS. Most ! 1611: of the descriptions in this manual hold true, but it should be noted that ! 1612: as of this writing the VMS support is not thoroughly tested, and no explicit ! 1613: support exists for the various types of VMS files and their attributes. ! 1614: ! 1615: The C-Kermit init file for VMS is called @q<KERMIT.INI>. ! 1616: ! 1617: ! 1618: @section(C-Kermit on the Macintosh) ! 1619: ! 1620: The "protocol kernel" of C-Kermit is also used by Columbia's Macintosh Kermit. ! 1621: The user and system interface is entirely different, and is covered in a ! 1622: separate document. ! 1623: ! 1624: @section(C-Kermit Restrictions and Known Bugs) ! 1625: ! 1626: @begin(enumerate) ! 1627: @ux(Editing characters): ! 1628: The program's interactive command interrupt, delete, and kill characters are ! 1629: Control-C, Delete (or Backspace), and Control-U, respectively. There is ! 1630: currently no way to change them to suit your taste or match those used by ! 1631: your shell, in case those are different. ! 1632: ! 1633: @ux(High baud rates): ! 1634: There's no way to specify baud rates higher than 9600 baud. Most Unix ! 1635: systems don't supply symbols for them (unless you use EXTA, EXTB), and even ! 1636: when they do, the program has no way of knowing whether a specific port's ! 1637: serial i/o controller supports those rates. ! 1638: ! 1639: @ux(Modem controls): ! 1640: If a connection is made over a communication line (rather than on the ! 1641: controlling terminal line), and that line has modem controls, (e.g. data ! 1642: terminal ready and carrier detection implementation), returning to the shell ! 1643: level will disconnect the conversation. In that case, one should use ! 1644: interactive mode commands, and avoid use of piped shell-@|level operation ! 1645: (also see 'set modem-dialer' and 'dial' commands.) ! 1646: ! 1647: @ux(Login Scripts): The present login scripts implementation follows ! 1648: the Unix conventions of uucp's "@q(L.sys)" file, rather than the normal ! 1649: Kermit "INPUT/@|OUTPUT" style, so there's no way to arbitrarily mingle ! 1650: script output with Kermit commands (e.g. changing parity or duplex in ! 1651: the middle of a script). ! 1652: ! 1653: @begin(multiple) ! 1654: @ux(Dial-out vs dial-in communications lines): ! 1655: C-Kermit requires a dial-out or dedicated line for the "set line" or "-l" ! 1656: options. Most systems have some lines dedicated to dial-in, which they enable ! 1657: "loggers" on, and some lines available for dial-out. Where a line ! 1658: must be shared between dial-in and dial-out, several options are ! 1659: available (though they are, strictly speaking, outside the pervue of ! 1660: C-Kermit). ! 1661: ! 1662: A simple shell program can be used to change directionality of the line if ! 1663: your Unix has the enable(8) and disable(8) commands. In that case, the shell ! 1664: program could "grep" a "who" to see if anybody is logged onto the desired ! 1665: line; if not, it could "disable" the line. The shell program will need to be ! 1666: set-uID'ed to root. The shell program can be called from kermit prior to a ! 1667: dial command, e.g., "@q(! mydisable.shellprog)". Prior to the final "quit" ! 1668: from C-Kermit, another shell program could be executed to "enable" the line ! 1669: again. This program also needs to be set-uID'ed to root. ! 1670: ! 1671: If your Unix lacks the enable(8) and disable(8) commands, another common ! 1672: technique works if your system supports the @q(/etc/ttys) file. A shell ! 1673: program could call up an awk program to find the line in the file and set the ! 1674: enable byte to 0 (to directly disable the line). Likewise, it can be ! 1675: reenabled by a counterpart at the end. It may be necessary to pause for 60 ! 1676: seconds after modifying that file before the logger sees it and actually ! 1677: disables the line. ! 1678: @end(multiple) ! 1679: ! 1680: @begin(multiple) ! 1681: @ux(Using C-Kermit on Local Area Networks): ! 1682: C-Kermit can successfully operate at speeds up to 9600 baud over LANs, ! 1683: provided the network buffers are big enough to accommodate Kermit packets ! 1684: (which are almost always less than 100 characters long). ! 1685: ! 1686: When computers are connected to LAN's through asynchronous terminal ! 1687: interfaces, then the connection should be configured to do XON/XOFF flow ! 1688: control between the network interface and the computer, rather than passing ! 1689: these signals through transparently. This can help prevent Kermit from ! 1690: overrunning the LAN's buffers if they are small (or if the LAN is congested), ! 1691: and will can also prevent the LAN from overrunning a slow Kermit's buffers. ! 1692: ! 1693: If the network hardware cannot accept 100 characters at a time, and flow ! 1694: control cannot be done between the network and the computer, then Kermit's ! 1695: "set send/receive packet-length" command can be used to shorten the packets. ! 1696: @end(multiple) ! 1697: ! 1698: @ux(Resetting terminal after abnormal termination or kill): When C-Kermit ! 1699: terminates abnormally (say, for example, by a kill ! 1700: command issued by the operator) the user may need to reset the terminal state. ! 1701: If commands do not seem to be accepted at the shell prompt, try ! 1702: Control-J "stty sane" Control-J (use "reset" on Berkeley Unix). ! 1703: That should take the terminal out of "raw mode" if it was stuck there. ! 1704: ! 1705: @ux(Remote host commands may time-out on lengthy activity): ! 1706: Using "remote host" to instruct the C-Kermit server to invoke Unix ! 1707: functions (like "make") that might take a long time to produce output can cause ! 1708: timeout conditions. ! 1709: ! 1710: @ux(XOFF deadlocks): ! 1711: When connecting back to C-Kermit after a transaction, or after finishing ! 1712: the server, it may be necessary to type a Control-Q to clear up an XOFF ! 1713: deadlock. There's not much the program can do about this... ! 1714: ! 1715: @ux(PC/IX Login Scripts -- Unfound Bug): ! 1716: Though login scripts appear to work properly on most processors, in the ! 1717: case of the PC/XT with PC/IX, it appears that longer scripts ! 1718: need to be broken up into shorter scripts (invoked sequentially from ! 1719: the take file). This is because the portion of the script handler ! 1720: which checks if an operation timed out seems to leave the processor ! 1721: in a strange state (i.e. hung). ! 1722: @end(enumerate) ! 1723: ! 1724: @section(How to Build C-Kermit for a Unix System) ! 1725: ! 1726: The C-Kermit files, as distributed from Columbia, all begin with the prefix ! 1727: "ck". You should make a directory for these files and then cd to it. A ! 1728: makefile is provided to build C-Kermit for various Unix systems (there are ! 1729: separate makefiles for VMS and the Macintosh). As distributed, the makefile ! 1730: has the name "@q(ckuker.mak)". You should rename it to "@q(makefile)" and then ! 1731: type "make xxx", where xxx is the symbol for your system, for instance "make ! 1732: bsd" to make C-Kermit for 4.x BSD Unix. The result will be a program called ! 1733: "wermit". You should test this to make sure it works; if it does, then you can ! 1734: rename it to "kermit" and install it for general use. See the makefile for a ! 1735: list of the systems supported and the corresponding "make" arguments. ! 1736: ! 1737: @section(Adapting C-Kermit to Other Systems) ! 1738: ! 1739: C-Kermit is designed for portability. The level of portability is indicated ! 1740: in parentheses after the module name: "C" means any system that has a C ! 1741: compiler that conforms to the description in "The C Programming Language" by ! 1742: Kernighan & Ritchie (Prentice-Hall, 1978). "Cf" is like "C", but also ! 1743: requires "standard" features like printf and fprintf, argument passing via ! 1744: argv/argc, and so on, as described in Kernighan & Ritchie. "Unix" means the ! 1745: module should be useful under any Unix implementation; it requires features ! 1746: such as fork() and pipes. Anything else means that the module is particular ! 1747: to the indicated system. C-Kermit file names are of the form: ! 1748: ! 1749: @q[ck<@i(system)><@i(what)>.<@i(type)>] ! 1750: ! 1751: where the part before the dot is no more than 6 characters long, the part ! 1752: after the dot no more than 3 characters long, and: ! 1753: ! 1754: @q[<@i(type)>] is the file type: ! 1755: @begin(description,leftmargin +8,indent -6,spread 0) ! 1756: c:@\C language source ! 1757: ! 1758: h:@\Header file for C language source ! 1759: ! 1760: w:@\Wart preprocessor source, converted by Wart (or Lex) to a C program ! 1761: ! 1762: nr:@\Nroff/Troff text formatter source ! 1763: ! 1764: mss:@\Scribe text formatter source ! 1765: ! 1766: doc:@\Documentation ! 1767: ! 1768: hlp:@\Help text ! 1769: ! 1770: bld:@\Instructions for building the program ! 1771: ! 1772: bwr:@\A "beware" file - list of known bugs ! 1773: ! 1774: upd:@\Program update log ! 1775: ! 1776: mak:@\Makefile ! 1777: @end(description) ! 1778: ! 1779: @q[<@i(system)>] is a single character to tell what system the file applies to: ! 1780: @begin(description,leftmargin +8,indent -6,spread 0) ! 1781: a:@\Descriptive material, documentation ! 1782: ! 1783: c:@\All systems with C compilers ! 1784: ! 1785: d:@\MS-DOS ! 1786: ! 1787: m:@\Macintosh ! 1788: ! 1789: u:@\Unix ! 1790: ! 1791: v:@\VAX/VMS ! 1792: ! 1793: w:@\Wart ! 1794: @end(description) ! 1795: ! 1796: @q[<@i(what)>] is mnemonic (up to 3 characters) for what's in the file: ! 1797: @begin(description,leftmargin +8,indent -6,spread 0) ! 1798: aaa:@\A "read-me" file, like this one ! 1799: ! 1800: cmd:@\Command parsing ! 1801: ! 1802: con:@\Connect command ! 1803: ! 1804: deb:@\Debug/Transaction Log formats, Typedefs ! 1805: ! 1806: dia:@\Modem/Dialer control ! 1807: ! 1808: fio:@\System-depdendent File I/O ! 1809: ! 1810: fns:@\Protocol support functions ! 1811: ! 1812: fn2:@\More protocol support functions ! 1813: ! 1814: ker:@\General C-Kermit definitions, information, documentation ! 1815: ! 1816: mai:@\Main program ! 1817: ! 1818: pro:@\Protocol ! 1819: ! 1820: scr:@\Script command ! 1821: ! 1822: tio:@\System-dependent terminal i/o & control and interrupt handing ! 1823: ! 1824: usr:@\User interface ! 1825: ! 1826: us2:@\More user interface ! 1827: ! 1828: us3:@\Still more user interface ! 1829: @end(description) ! 1830: ! 1831: Examples: ! 1832: ! 1833: @begin(description,spread 0) ! 1834: @q(ckufio.c)@\File i/o for Unix ! 1835: ! 1836: @q(ckmtio.c)@\Terminal i/o for Macintosh ! 1837: ! 1838: @q(ckuker.mss)@\Scribe source for for Kermit User Guide chapter ! 1839: ! 1840: @q(ckuker.nr)@\Nroff source file for Unix C-Kermit man page ! 1841: @end(description) ! 1842: ! 1843: The following material discusses each of the C-Kermit modules briefly. ! 1844: @begin(description,leftmargin +4, indent -4) ! 1845: @q<ckcmai.c, ckcker.h, ckcdeb.h (Cf)>:@\This is the main program. It contains ! 1846: declarations for global variables and ! 1847: a small amount of code to initialize some variables and invoke the command ! 1848: parser. In its distributed form, it assumes that command line arguments are ! 1849: passed to it via argc and argv. Since this portion of code is only several ! 1850: lines long, it should be easy to replace for systems that have different ! 1851: styles of user interaction. The header files define symbols and macros used ! 1852: by the various modules of C-Kermit. @q(ckcdeb.h) is the only header file ! 1853: that is included by all the C-Kermit modules, so it contains not only the ! 1854: debug format definitions, but also any compiler-@|dependent typedefs. ! 1855: ! 1856: @q<ckwart.c (Cf), ckcpro.w (C)>:@\The ckcpro module embodies the Kermit ! 1857: protocol state table and the code to accomplish state switching. It is written ! 1858: in "wart", a language which may be regarded as a subset of the Unix "lex" ! 1859: lexical analyzer generator. Wart implements enough of lex to allow the ckprot ! 1860: module to function. Lex itself was not used because it is proprietary. ! 1861: The protocol module @q(ckcpro.w) is read by wart, and a ! 1862: system-@|independent C program is produced. The syntax of a Wart program is ! 1863: illustrated by @q(ckcpro.w), and is described in @q(ckwart.doc). ! 1864: ! 1865: @q<ckcfns.c (C)>:@\The module contains all the Kermit protocol support ! 1866: functions -- packet formation, encoding, decoding, block check calculation, ! 1867: filename and data conversion, protocol parameter negotiation, and high-@|level ! 1868: interaction with the communication line and file system. To accommodate small ! 1869: systems, this module has been split into two -- @q(ckcfns.c) and @q(ckcfn2.c). ! 1870: ! 1871: @q(ckutio.c):@\This module contains the system-@|dependent primitives for ! 1872: communication line i/o, timers, and interrupts for the various versions of ! 1873: Unix. Certain important variables are defined in this module, which determine ! 1874: whether C-Kermit is by default remote or local, what the default communication ! 1875: device is, and so forth. The tio module maintains its own private database of ! 1876: file descriptors and modes for the console terminal and the file transfer ! 1877: communication line so that other modules (like ckcfns or the terminal connect ! 1878: module) need not be concerned with them. The variations among Unix ! 1879: implementations with respect to terminal control and timers are accommodated ! 1880: via conditional compilation. ! 1881: ! 1882: @q(ckufio.c):@\This module contains system-dependent primitives for file i/o, ! 1883: wildcard (meta character) expansion, file existence and access checking, and ! 1884: system command execution for the various versions of Unix. It maintains an ! 1885: internal database of i/o "channels" (file pointers in this case) for the files ! 1886: C-Kermit cares about -- the input file (the file which is being sent), the ! 1887: output file (the file being received), the various logs, the screen, and so ! 1888: forth. This module varies little among Unix implementations except for the ! 1889: wildcard expansion code; the directory structure of 4.2bsd Unix is different ! 1890: from that of other Unix systems. Again, variation among Unix systems is ! 1891: selected using conditional compilation. ! 1892: ! 1893: @begin(multiple) ! 1894: @q(ckuusr.h, ckuusr.c, ckuus2.c, ckuus3.c) (Unix):@\This is the "user ! 1895: interface" for C-Kermit. It includes the command parser, ! 1896: the screen output functions, and console input functions. The command ! 1897: parser comes in two pieces -- the traditional Unix command line decoder ! 1898: (which is quite small and compact), and the interactive keyword parser ! 1899: (which is rather large). This module is fully replacable; its interface to ! 1900: the other modules is very simple, and is explained at the beginning of the ! 1901: source file. The ckuusr module also includes code to execute any commands ! 1902: directly which don't require the Kermit protocol -- local file management, ! 1903: etc. The module is rated "Unix" because it makes occasional use of the ! 1904: @q[system()] function. ! 1905: ! 1906: Note that while @q(ckuusr) is logically one module, it has been split up into ! 1907: three C source files, plus a header file for the symbols they share in common. ! 1908: This is to accommodate small systems that cannot handle big modules. ! 1909: @q(ckuusr.c) has the command line and top-@|level interactive command parser; ! 1910: @q(ckuus2.c) has the help command and strings; @q(ckuus3) has the set ! 1911: and remote commands along with the logging, screen, and "interrupt" functions. ! 1912: @end(multiple) ! 1913: ! 1914: @q(ckucmd.c, ckucmd.h) (Cf):@\This is an interactive command parsing package ! 1915: developed for C-Kermit. It is written portably enough to be usable on any ! 1916: system that has a C compiler that supports functions like printf. The file ! 1917: name parsing functions depend upon primitives defined in the fio module; if ! 1918: these primitives cannot be supplied for a certain system, then the filename ! 1919: parsing functions can be deleted, and the package will still be useful for ! 1920: parsing keywords, numbers, arbitrary text strings, and so forth. The style of ! 1921: interaction is the same as that found on the DECSYSTEM-20. ! 1922: ! 1923: @q(ckucon.c) (Unix):@\This is the connect module. As supplied, it should ! 1924: operate in any Unix environment, or any C-based environment that provides the ! 1925: fork() function. The module requires access to global variables that specify ! 1926: line speed, parity, duplex, flow control, etc, and invokes functions from the ! 1927: tio module to accomplish the desired settings and input/output, and functions ! 1928: from the fio module to perform session logging. No terminal emulation is ! 1929: performed, but since standard i/o is used for the console, this may be piped ! 1930: through a terminal emulation filter. The ckucon function may be entirely ! 1931: replaced, so long as the global settings are honored by its replacement. PC ! 1932: implementations of C-Kermit may require the ck?con module to do screen control, ! 1933: escape sequence interpretation, etc, and may also wish to write special code to ! 1934: get the best possible performance. ! 1935: ! 1936: @q(ckudia.c) (Unix):@\This is the dialer module. As supplied, it handles ! 1937: Hayes, Ventel, Penril, Racal-Vadic, and several other modems. ! 1938: ! 1939: @q(ckuscr.c) (Unix):@\This is the login script module. As supplied, it handles ! 1940: uucp-@|style scripts. ! 1941: @end(description) ! 1942: ! 1943: Moving C-Kermit to a new system entails: ! 1944: @begin(enumerate) ! 1945: Creating a new @q<ck?tio> module in C, assembler, or whatever language is ! 1946: most appropriate for system programming on the new system. If the system ! 1947: is Unix-like, then support may be added within the @q<ckutio.c> module itself ! 1948: using conditional compilation. ! 1949: ! 1950: Creating a new @q<ck?fio> module, as above. ! 1951: ! 1952: If the system is not Unix-like, then a new @q<ckuusr> module may be required, ! 1953: as well as a different invocation of it from @q<ckcmai>. ! 1954: ! 1955: If the distributed connect module doesn't work or performs poorly, then ! 1956: it may be replaced. For instance, interrupt-@|driven i/o may be required, ! 1957: especially if the system doesn't have forks. ! 1958: @end(enumerate) ! 1959: Those who favor a different style of user/program interaction from that ! 1960: provided in @q(ckuusr.c) may replace the entire module, for instance with one ! 1961: that provides a mouse/@|window/@|icon environment, a menu/@|function-@|key ! 1962: environment, etc. ! 1963: ! 1964: A few guidelines should be followed to maintain portability: ! 1965: @begin(itemize) ! 1966: Keep variable and function names to 6 characters or less. Don't use ! 1967: identifiers that are distinguished from one another only by alphabetic ! 1968: case. ! 1969: ! 1970: Keep modules small. For instance, on a PDP-11 it is necessary to keep ! 1971: the code segment of each module below 8K in order to allow the segment ! 1972: mapping to occur which is necessary to run programs larger than 64K on a ! 1973: non-@|I-and-D-@|space machine. ! 1974: ! 1975: Keep strings short; many compilers have restrictive maximum lengths; 128 ! 1976: is the smallest maximum string constant length we've encountered so far. ! 1977: ! 1978: Keep (f,s)printf formats short. If these exceed some compiler dependent ! 1979: maximum (say, 128) memory will be overwritten and the program will probably ! 1980: core dump. ! 1981: ! 1982: Do not introduce system dependencies into @q(ckcpro.w) or @q(ckcfn*.c). ! 1983: ! 1984: If a variable is a character, declare as CHAR, not int, to prevent the ! 1985: various sign extension and byte swapping foulups that occur when characters ! 1986: are placed in integer variables. ! 1987: ! 1988: Remember that different systems may use different length words for different ! 1989: things. Don't assume an integer can be used as a pointer, etc. ! 1990: ! 1991: Don't declare static functions; these can wreak havoc with systems that do ! 1992: segment mapping. ! 1993: ! 1994: In conditional compilations expressions, use @q(#ifdef) and @q(#ifndef) and ! 1995: not @q(#if), which is not supported by some compilers. Also, don't use any ! 1996: operators in these expressions; many compilers will fail to understand ! 1997: expressions like @w<@q(#ifdef FOO | BAR)>. ! 1998: ! 1999: Don't define multiline macros. ! 2000: @End(Itemize) ! 2001: In general, remember that this program will have to be compilable by old ! 2002: compilers and runnable on small systems.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.