packages icon
 XT(1)                                                   UNIX
 (printed 7/8/97)

 Name         xt - communications program using telnet

 Syntax         xt [ [-nhostname] | [-sscript] ]

 Description          Xt  connects  to  a  remote host  using   the   telnet
 protocol. It  can  manage          an interactive session or be called from
 cron(C).  It has  various  means          for  transferring  files  between
 computers,  and  can  be  partially or         totally under the control of
 scripts.

         Xt starts up by reading the file .xtrc, which is sought for in this
         order:  in  "XT_PATH",  in the  current  directory,  in  your  HOME
 directory,         or  in  a default directory  defined  at  compile  time.
 This startup file           may  contain  any of  the  valid  SET  commands
 described  below.  Xt  then          displays  the  current  settings,  and
 presents an <XT> prompt, unless the         -s option was used.

    Options         -nhostname Connect  to  the  specified  hostname,  which
 may be  given  as  a                     Fully Qualified Domain Name (e.g.,
 who.excitement.com)  or  as                        an   IP   octet   (e.g.,
 198.207.210.2).  If a telnet command                    issued from a shell
 prompt can reach a site, then xt can                    reach it too.

         -sscript   Execute the specified script after program startup.

         The two options are mutually exclusive.

    Environment          The  environment may  contain  a  variable   called
 "XT_PATH",   consisting   of           colon  separated absolute  paths  to
 directories.    If    this     variable is     set             to,     say,
 "/usr/joe/xt:/usr/lib/xt", then those two directories are the         first
 places searched for any scripts.


    Command Mode         When entering characters in command mode (that  is,
 at  the  <XT>  prompt),         control characters echo as ^x, where "x" is
 the control character that         was entered. Backspacing (using whatever
 key  is defined in  the  current          environment) backspaces over both
 positions of the displayed control         character, as expected.

         An "interpreted" key can be added in a manner similar  to  that  of
 vi(C);           simply   type  ^V  followed by  the  character  to  insert
 (backspace, delete,         carriage return, or newline).

         The following commands are available at the <XT> command prompt:

         c         cis              Respond to an ENQ signal  for  a CIS  B-
 Plus  protocol                           transfer. This command is used for
 both uploading and                          downloading from CompuServe.

         n hostname         nethost hostname Establish a  telnet  connection
 to hostname, then enter                          terminal mode.

         s  file          script  file       Execute  file,  which  contains
 appropriate  xt  script                           commands. Enters terminal
 mode when the script is com-                          plete.

         set [options]    Display or set the  parameters  used  by  xt.  See
 below.

         t         term             Enter terminal mode.

         x         q          exit          quit              Exit  program.
 Return to invoking program/shell.

         ?            help               Displays   a   brief   summary   of
 xt commands,  the SET                          options, and terminal-escape
 commands.

         [Note: a  compile-time  option  can  disable  the  following  three
 options  to          prevent any access to shells or other programs outside
 of xt.]

         ! command      Execute the specified command as a child process. If
                         command  is  omitted,  execute  a local interactive
 shell.                         (A space is required between the !  and  the
 command.)

         !!             Re-execute the last shell command string.

         $ command      Execute  a  shell  command  with  stdin  and  stdout
 redirected                          to  the telnet socket. This effectively
 puts the computer                        into  a  "host"  mode.   (A  space
 is required between the $                        and the command.)

    Using the SET Command         The  SET command is  used to  display  and
 set/reset  xt's  tunable parame-         ters. Any of these commands may be
 placed in the .xtrc file which is         read upon starting up xt.

         Used alone, SET displays xt's current parameters.

         The following parameters can be set (note that except in  the  case
 of          names,  these commands are case-insensitive, and that there are
 alterna-         tive forms of the commands shown on the XT help screen):

         set  auto  on|off Sets  the  auto-capture  feature.  When  entering
 terminal                           mode,  capturing commences  without  the
 necessity to                         manually request it.

         set cfile name  Set the name of the capture file.

         set cis on|off  Set response to a CompuServe file transfer  request
                         (<ENQ>).  An  "on"  value  specifies  that  when in
 terminal                         mode, an <ENQ> character will launch a CIS
 B-Plus  pro-                          tocol transfer. This parameter should
 be set "off"                         when not connecting to CompuServe,  as
 line noise may                         cause a bogus file transfer request.

         set cr on|off   In  uploads  using  B-Plus protocol,  setting  this
 option                          "on"  will  insert  a carriage-return after
 each newline                         in an ASCII file. If  you  expect your
 ASCII  upload  to                          be  captured  by  DOS  users, it
 is best  to set  cr  "on".                           If  your ASCII  upload
 is meant  strictly for Unix users,                         then you may set
 cr  "off".   The B-Plus  protocol imple-                          mentation
 used  by xt will always strip end-of-line                         carriage-
 returns from incoming ASCII files.

         set dir name    Set the current working directory.




         set menu on|off By default, a one-line menu is displayed above  the
                         <XT> prompt to remind the user of options most fre-
                         quently chosen  at  this  point:  "[t]erminal  mode
 [q]uit                         [s]cript [?]help".  Setting the option "off"
 turns off                         this display.

         set nl on|off   If this option is set "on", then newlines are  sent
 as                          carriage-returns.  If this option is set "off",
 then                          newlines  are  sent  as  newlines  (carriage-
 returns are  in                          any  case always sent as carriage-
 returns).  This                         option applies  to  input from  the
 keyboard,  or  from a                         disk file using the "XCAPE F"
 facility or a script                         "type"  command  (See  below).
 This   option  has  no effect                          on  B-Plus  protocol
 transmissions, and has no effect on                         incoming data.

         set xcape char         set escape char Set the XCAPE character (see
 below)  to  char.  This                          should be set to some non-
 printing  character  (other                          than   backspace, tab,
 newline,   of  course).   The  charac-                          ter  may be
 entered by depressing the  Control  key  first                          and
 then      typing a     letter,     or     by typing     a     caret     (^)
                         followed by a letter.

    Terminal Mode         In terminal mode,  all  characters  typed  at  the
 keyboard  are  sent to  the          telnet connection, except that newline
 characters  (0x0A)  are  translated          to   carriage-returns   (0x0D)
 when you  have  "set  nl  'on'"; all  characters          received from the
 telnet connection are displayed on the local terminal         screen.

         XCAPE is a key that will, when typed in terminal mode, introduce an
 xt          "escape"  command.  Don't confuse XCAPE  with the <ESCAPE> key.
 The         default definition for XCAPE is ASCII 1, or Control-A.  It  can
 be  rede-          fined at run time with the "set escape C" command (or it
 can be rede-         fined in the .xtrc startup script).

         When the XCAPE key is typed  in  terminal mode,  the  program  will
 examine          the  next  key  pressed.  If  this key has been "bound" to
 perform  a certain          function,  that   function will   be performed;
 otherwise,   the   second   char-          acter  is  sent  to  the  telnet
 connection. Thus, to send the XCAPE charac-         ter through  the telnet
 connection, it is necessary to press the key         TWICE.

         Thus the ESCAPE key itself would be a terrible  choice  for  XCAPE,
         because it  is  used so often by other programs: if you were logged
 into         a remote system and running, say, vi,  it  would  be  a  great
 annoyance to         have to hit ESCAPE twice to get it transmitted once.

         The following keys (case insensitive) are  bound at  startup  time.
 Others          may  be  added through the binding commands available in xt
 scripts.

         Command  Function     Description

         XCAPE /  Help         Display the table of bound keys         XCAPE
 ?  Help         Display the table of bound keys

         XCAPE  f    File           Send   a   file   through   the   telnet
 connection (ASCII                               transfer).

         XCAPE s  Script       Xt will request  the  name  of  a  script  to
 execute.





         XCAPE y  Capture Yes  Open the capture file in  APPEND  mode  (text
                                  received    over   the telnet   connection
 accumulates                               at the end of the file).  If  the
 file is already                               open, a message is printed to
 that effect.

         XCAPE n  Capture No   Close the capture file. If it wasn't open,  a
                               message of regret is printed.

         XCAPE x  eXit         Exit terminal mode back to <XT> command mode.

         XCAPE q  Quit         Quit xt altogether.

    Scripts         The xt script language is intended to be closely similar
 to   the Unix           Bourne  shell  language.  Unfortunately,  it  isn't
 identical to the Bourne         shell, so it has the same problem that  the
 awk(C) program does for         those experienced in the C language: an awk
 script LOOKS like C, but it         isn't, really; and in the same way,  an
 xt  script  LOOKS  like  a  Bourne          shell  script,  but  isn't.  So
 the operation of the Bourne shell, if         you're familiar with  it,  is
 useful  as  an  analogy  in  understanding  the         xt script language,
 but only as an analogy.

         An xt script consists of lists of commands. Commands  are  set  off
 from          each  other  within  a  list  by  either  a newline ('0) or a
 semicolon (;),         as is the case with the Bourne shell. The  semicolon
 and the  newline          have  identical  effect  as  command  separators,
 so (anticipating a bit         here) you could say either

           if counter morethan 5           then             transmit "bye^M"
             quit           endif

         or

           if counter morethan 5; then transmit "bye^M"; quit; endif

         and  the result  will  be  the  same either  way.   The newline and
 the semi-          colon  are  treated the same way as in the Bourne shell,
 except that  a          newline cannot  be  quoted  so  as  to  remove  its
 interpretation  as a com-         mand terminator (in other words, a quoted
 string cannot contain a new-         line).

         Commands  are  composed  of  words  separated  by  spaces  or   tab
 characters,         and a word can be one of the following:

         *  One of the xt script language keywords, which are listed  below,
 with            appropriate explanations.

         *  A number, meaning a sequence consisting only of digits,  with an
            optional leading minus sign to indicate a negative number.

         *  A literal string of  characters  surrounded  by double-quotation
 marks             ('"'); such a string can be no longer than 80 characters.
 A double-            quotation mark can be imbedded within  the  string  by
 preceding   it                with a   backslash  ('              backslash
 is disregarded  and the  double-quotation  mark  is  treated  as
 part of  the string. Mismatched quotation marks result in a syntax
 error.

         *  The name of a user variable, which can have either a string or a
             numeric  value.  The name of a user variable must begin with an
            alphabetic character.

         *  The name of a shell environment variable, preceded by  a  dollar
 sign            ('$'). The xt script language examines the Unix environment
 for the            specified variable  and,  if  such  a  variable  exists,
 substitutes the            value of that variable. The result is treated as
 if it were a quoted            literal string, and, therefore,  should  not
 be  more than 80 charac-            ters long, or else it will be truncated
 to its first 80 characters.               Similarly,  such  an  environment
 variable should not contain a new-            line.

         *   An  expression  surrounded  by  back-quotation   marks   ('`').
 This sort of            expression operates similarly to the Bourne shell's
 command-substi-            tution mechanism:  the  contents  of  the  back-
 quotes  are  passed to the            Bourne shell, and the standard output
 of the back-quoted command is            treated as if  it  were  a  quoted
 literal  string.  Therefore,  the            command's output should not be
 more than 80 characters  long, nor              contain  a  newline.  Also,
 the contents  of  the back-quotes  cannot  be              longer  than  80
 characters, nor contain a newline.

         *  An expression introduced by a pound-sign (or number-sign:  '#'),
            which is treated as a comment. All characters from the '#' until
 the              end  of  the  physical  line  are ignored.  This   comment
 mechanism is the            same as in the Bourne shell.

         *  A limitation of the script language is that  only  one character
             string  can  be  passed as  an  argument  to  any of the script
 commands.               The  bind_function,  bind_script,  and  bind_string
 commands  thus  need            to use a decimal digit to represent the key
 that is to be bound. The            ASCII value of the the key is employed.
 As  an  example,  Control-C is            identified as 3, Control-Z is 26,
 the ESCAPE key is 27, a space is             32,  the  number  "1"  is  49;
 letters are case-insensitive so that iden-            tifying the bound key
 as "65" or as "97" will always bind both "a"            and "A" to the same
 command.

         Quoted literal strings (and the two other mechanisms that act  like
         quoted literal strings, shell environment variables and back-quoted
         shell commands) may be up to 80 characters long.  All  other  words
 must          be  no  longer  than  16  characters,  and  are treated case-
 independently          (which  is  to  say,  uppercase   is   the   same as
 lowercase);  note,  though,          that  the  names  of shell environment
 variables are case-dependent          (uppercase  must match  uppercase and
 lowercase must match lowercase),         because they are case-dependent in
 the shell.

         Any word  not  recognizable  within  the  foregoing  categories  is
 treated  as          the  name  of  a  new  user  variable. Such a word, if
 longer than 16 charac-         ters, is considered to be a syntax error.

         User variables are created with the 'assign'  script  keyword,  and
 may          have  either  numeric  or  string  values.  The type of a user
 variable is         determined by how it's created; if it's assigned  to  a
 string,  it's  a         string variable, and if it's assigned to a number,
 it's a numeric vari-         able. The value of any user  variable  can  be
 changed with another         'assign' command, and numeric variables can be
 changed   to   string   vari-           ables   and    vice-versa.    Shell
 environment variables  cannot  be  changed         within an xt script, but
 the value of a shell environment variable can         be assigned to a user
 variable, and  the value  of  the  user  variable can         thereafter be
 changed.

         Scripts are contained in  ASCII  text  disk  files, one  script  to
 a file. A         script can invoke another script as a subroutine with the
 'call' key-         word; up to 5 scripts can be nested in this way at  any
 single time.

         With all this  said,  the following  list  of  xt  script  language
 commands          should  be comprehensible. The format "<something>" means
 that a token,         or word-type, of the "something" type is meant rather
 than the literal         sequence 'something'.

    Script Language Commands         Note that all the  commands  are  case-
 insensitive!

         affirm             Syntax: affirm

             Reads a string from the  terminal,  and  returns  TRUE  if  the
 string              begins with 'y' or 'Y'; otherwise, returns FALSE.  Used
 in evaluat-             ing conditional expressions.  The  string  must  be
 terminated by a             newline or carriage-return.

             Example:

               echo -n "Continue (y/n)? "               if  affirm
 then                   continue                 else                  break
               endif

         assign                 Syntax:   assign    <varname>    eq <number>
                     assign <varname> eq "string"                     assign
 <varname> eq "string" ["string"|<varname>] ...                       assign
 <varname1>  eq  <varname2>                     assign <varname> eq <script-
 command>

             Assigns to user variable <varname> the value following "eq"; if
              that  value is a number, then <varname> becomes a numeric user
 vari-             able; if that value is a string, then <varname> becomes a
 string              user variable. If <varname> does not already exist as a
 user vari-             able, it  is created.  Variable  space is  allocated
 dynamically,  but              running out of memory space for variables is
 unlikely. All vari-             ables are global across  scripts  that  run
 at the  same  time  via  the              'call' keyword, and all variables
 vanish when a script, called              directly  from  xt  as opposed to
 called  from  another  script, exits.              In other words, variable
 values  are not  static  except  during   'call'                 execution.
 Variable names cannot be longer than 8 characters. Suc-             cessive
 'assigns' are permissible, and the type of the variable             changes
 according  to  the  type  of  the  value  following  "eq".  A user
 variable is destroyed with the 'unassign' keyword.

             If a variable is assigned the value of a script  command,  then
 it               becomes  a  numeric  variable  with  value  TRUE or FALSE,
 depending on             the status returned by the script  command.  If  a
 variable  is               assigned  the value of a back-quoted command, it
 becomes a string             variable  with  the  value  of  the  first  80
 characters  of  the  back-               quoted  command.  If a variable is
 assigned equal to an environment             variable, it becomes a  string
 variable with the value of the first             80 characters of the value
 of the environment variable.

             If the third form given above is used, then the various strings
 are               concatenated.  A  string  variable  can be created from a
 numerical             variable with 'assign "" numvar' or 'assign "" 678'.

             Examples:

               assign numvar eq  5                 assign  strvar  eq  "This
 variable is a string"               assign strvar eq "This" " variable is a
 " 7 " word string"               assign mydir eq $HOME               assign
 numvar2   eq numvar                   assign   strvar2  eq strvar
 assign numvar eq true               assign today eq `date`; echo "today  is
 " today

         beep             Syntax: beep

             Sends a Control-G to the terminal. Useful for alerting the user
              that some event has occurred, for example the end of a lengthy
 file             transfer operation.

         bind_function             Syntax: bind_function code "function"

             Bind the character identified by the number specified  by  code
 to             the xt builtin function "function".

             The "function" may be one of the following (case is ignored):

               CAPTEND Turn off terminal mode capture                CAPTYES
 Turn  on  terminal mode capture               DIVCHAR Send file through the
 telnet  connection                 DOSCRPT  Execute  script  file  (prompts
 interactively)               EMITSTR Emit string               ENDCHAR Exit
 terminal mode                HLPCHAR  Display  terminal  mode  key bindings
                 QUITCHR  Quit  program                 SCRPCHR  Prompt  for
 script file

             Example:

               bind_function 26 "quitchr"

             This binds Control-Z to quit the XT program.

         bind_script             Syntax: bind_script code "scriptname"

             Bind the character identified by the number specified  by  code
 to             execute the script named by "scriptname".

              Upon  termination  of the  script,   the program will   resume
 terminal             mode, unless the "quit" script function was executed.

             Examples:

               bind_script 18 "/usr/lib/xt/.rz"

             This binds Control-R to execute the script /usr/lib/xt/.rz. The
 .rz             script supplied with the source code contains:

               tty  "on"                 echo  -n  "What  files  are  to  be
 received?  "                 read  FILES                 transmit  "sz -y "
               transmit FILES               transmit "^M"               echo
 "Starting ZMODEM Receive (rz -y)"               pipe "rz -y"

             Pressing XCAPE ^R will ask for some file name(s), and  start an
 sz               command  on  the  remote  system,  and  an rz on the local
 system to             receive the file(s).

               bind_script 19 "/usr/lib/xt/.sz"

             This binds Control-S to execute the script /usr/lib/xt/.sz. The
 .sz             script supplied with the source code contains:

               tty "on"               echo -n "What files are to be sent?  "
                read FILES               echo "Starting ZMODEM send (sz -y "
 FILES ")"               pipe "sz -y " FILES

             Pressing XCAPE ^S will ask  for  some file  name(s),  and  then
 launch               sz  on the current system.  Sz will itself start an rz
 process on             the remote system.

         bind_string             Syntax: bind_string code "string"

             Bind the character identified by the number specified  by  code
 to             emit the string specified by "string".

             The string is sent to the telnet  connection untranslated;  eg,
 it is             not examined for embedded terminal mode escapes.

             Example:

               bind_string 49 "pwd^M"

             This binds "1" to send  the  sequence to  report  your  current
 direc-             tory on a remote system.

         break             Syntax: break

             Exits from the immediately enclosing 'while' loop. Identical to
 the              C language 'break', and to the Bourne shell 'break' except
 that the             xt script language 'break'  does  not take  a  numeric
 argument.

         call             Syntax: call "scriptname"

             Suspends execution of the current script, and attempts to  load
 and               run the  specified  scriptname.  The scriptname must be a
 quoted             literal string. There is no xt analogue  of  the  Bourne
 shell "exec"              command; all subscripts in xt are treated as sub-
 routines. All             variables are global across subscripts, so  if  a
 subscript  changes               the value  of a variable, then that change
 will remain in effect             after return to the parent script.  Shell
 environment variables can-             not be changed by any xt script.

         capture                 Syntax:   capture   "on"
 capture "off"

             Turns the file-capture  function  on  or  off.  Note  that  the
 arguments               must  be  quoted  literal  strings.  Note also that
 when the script              exits  into  terminal mode,  the  file-capture
 function is  turned off.              If you have 'set auto "on"', then you
 will begin capturing immedi-             ately upon entering, or  returning
 to,  terminal  mode. If not, then             you must manually type "XCAPE
 Y" to start capturing when entering             terminal mode.

         continue             Syntax: continue

             Resumes execution  at  the  top  of  the immediately  enclosing
 'while'                 loop.    Identical  to the  C  language  'continue'
 instruction, and to             the Bourne shell  'continue' command except
 that no numeric argument             is accepted.

         debug              Syntax:  debug  "on"                       debug
 "off"

              If  the  'debug'   option   is   on,   then   xt   will   make
 many parenthetical             comments about what it's doing while it runs
 the script. These  com-               ments  can  sometimes be  helpful  in
 debugging script logic. Note that             the argument must be a quoted
 literal string.

             While debugging  a  script  containing a  password,  turn  this
 option               off,  then on again, to reduce the excitement-level of
 any col-             leagues collected circa your screen.

             See, below, the Debugging Section.

         decr             Syntax: decr <numeric-variable>

             Decrements the value of the specified numeric user  variable by
 1.                Useful  in  controlling  loop execution. If the specified
 variable             isn't  numeric,  or  doesn't  exist,  a  syntax  error
 results.

         echo                 Syntax:   echo   "string"    <variable>    ...
                     echo -n "string" <variable> ...

             This command sends its arguments to the  user's  terminal.  The
 number               of arguments is optional, except that the total result
 may not             exceed 80 characters. Variables  and back-quoted  shell
 commands are             expanded as necessary.

             If the "-n" switch is present, then no  carriage-return/newline
             sequence is appended to the output.

             Examples:

               echo "The time and date are now " `date`                 echo
 "My  terminal type  is "  $TERM                 echo "My terminal type is "
 $TERM " today."

             Note that whitespace isn't echoed unless it's part of a  quoted
             literal string.

         exit             Syntax: exit

             Terminates execution of the current script. If a script reaches
 its              end, it exits automatically, so 'exit' is useful mainly to
 ter-             minate a script prematurely.

         false             Syntax: false

             Same as the Unix 'false' command. Does  nothing,  but returns a
 FALSE             status value. Useful within conditional expressions.

             Example:

                if  waitfor  "CONNECT"  30  eq  false                   then
                 quit               endif

             Note that above example could be rewritten using  the  negating
             modifier "!":

                 if   !   waitfor   "CONNECT"    30                     then
                 quit               endif

             and note too that the "!" must be separated from  its  argument
 by             whitespace.

         file             Syntax: file <script-command>

             The standard output of the specified script command is  sent to
 the               current capture file. If the "capture" option is not set,
 then an               error  message  is  displayed, but  script  execution
 continues.

             Examples:

               file echo "--------- CUT HERE ----------"

             Sends the output of the 'echo' command to the  current  capture
 file,             provided that the "capture" option is now "on".

               file echo `date`

             Sends a timestamp to the current capture  file,  provided  that
 the               "capture"  option  is now "on". The same thing could have
 been done             with

               file shell "date"

         host             Syntax: host "hostname"

             Open a telnet connection  to a  hostname,  given  either  as  a
 domain                name  or  a  dotted  quad.  If  there  is  a  current
 telnet connection             open,  it  will  be  terminated with  extreme
 prejudice.


         if             Syntax: if <list1>; then  <list2>;  [ else  <list3>;
 ] endif

             If <list1> evaluates as TRUE, performs <list2>;  otherwise,  if
              <list3> is specified, performs <list3>; then resumes execution
             immediately following 'endif'. To accommodate those whose minds
             wander while writing scripts, 'fi' is an acceptable synonym for
             'endif'.

              Each  list  may  consist  of  any  number of  script  commands
 separated  by               semicolons or newlines. The value of <list1> is
 determined by             inclusively OR'ing the value of each directive in
 the list, so that             if any of the directives in <list1> evaluates
 as TRUE, then so will              <list1>.  <list1>  is performed  in  its
 entirety  regardless  of the               value  of  any  of its component
 commands.

             The keywords 'then', 'else', and  'endif'  (or  'fi')  must  be
 immedi-                ately  preceded  by  command  separators,  either  a
 semicolon or a new-             line, just as is the  case  in  the  Bourne
 shell.

             For conditional evaluation in 'if' and  'while'  constructions,
 the               following  comparators  are  available in addition to the
 script             directives mentioned elsewhere:

               <varname1> eq "string"               <varname1>  eq  <number>
                <varname1>  eq  <varname2>               <varname1>
 "string"

             evaluates as TRUE if the value of user variable  <varname1>  is
 the               same as that of a specified string or numeric constant or
 of a             specified second  variable  name.  If  the  variable  name
 <varname1>   is                 not followed  by  anything  else,  then the
 expression evaluates as             TRUE if the variable is numeric and has
 a  non-zero  value, or if the             variable is a string variable and
 has a non-zero  length;  otherwise,               the expression  evaluates
 as FALSE. Comparing a string variable to a             numeric variable, or
 vice-versa, causes a syntax error.

             If a conditional expression consists only of a  quoted  literal
             string, the expression evaluates as TRUE if the string's length
 is                     non-zero,     and     otherwise     evaluates     to
 FALSE. Because environment               variables  and  back-quoted  shell
 commands are treated as  if  their               output/value  were  quoted
 literal  strings,  this  allows  direct  test-               ing of a shell
 command   or   of   an   environment for   non-zero    length.
 Nonexistent environment   variables  are  treated  as  if they  exist  with
             the value "" (a string of zero length).

               <varname1> neq "string"               <varname1> neq <number>
               <varname1> neq <varname2>

             evaluates as TRUE if the value of user variable  <varname1>  is
 not              equal to that of a specified string or numeric constant or
 of  a               specified  second  variable  name.  Comparing  a string
 variable to  a             numeric variable, or vice-versa, causes a syntax
 error.

                <varname1>  lessthan   "string"                   <varname1>
 lessthan <number>               <varname1> lessthan <varname2>

             evaluates as TRUE if the value of user variable  <varname1>  is
 less              than that of a specified string or numeric constant or of
 a speci-               fied  second variable  name.  String  variables  are
 compared lexically             according to ASCII value.

                <varname1>  morethan   "string"                   <varname1>
 morethan <number>               <varname1> morethan <varname2>

             operates identically to 'lessthan', except in reverse.

             The value of  any  conditional  expression  may be  negated  by
 preceding               it  with  an  exclamation point followed by a space
 or tab.

             Examples:

               if counter eq 0; then break; endif;               if var1  eq
 var2;  then  echo  "identical"; endif               if counter morethan 20;
 then break; endif;               if counter lessthan 0; then break;  endif;
               if ! counter; then echo "counter is " counter; endif

             To perform a list if any of a set of conditions exist:

               if counter morethan 5;                  counter eq  brkvalue;
 # a second comparator               then break;               endif;

               i.e.,   perform   the   'break'   directive if   the    value
 of numeric user              variable 'counter' is greater than the numeric
 constant 5, or if             the value of 'counter' is equal  to  that  of
 the user numeric vari-             able 'brkvalue'.

         incr             Syntax: incr <numeric-variable>

             Increments the value of the specified numeric user  variable by
 1.              The opposite of 'decr'.

         pause             Syntax: pause <number>

             Suspends execution  for  the  specified  <number>  of  SECONDS.
 Identical             to Unix "sleep."

         pipe             Syntax: pipe "<shell-command>"

             The standard input and standard output of the  specified  shell
 com-               mand  are  connected  to  the telnet connection, and the
 command is             executed. This is the equivalent of the command mode
 "$" command.

             Examples:

               pipe "echo

             sends a DELETE character to the telnet connection.

               pipe "rz"

              performs  a  file  receive  via ZMODEM, assuming  that   Chuck
 Forsberg's             'rz/sz' programs reside on your system.

         quit             Syntax: quit

             Exits  the  script  and  terminates  xt  entirely.  The  user's
 terminal               will  be  restored  to the  state  it was in when xt
 was invoked.

         read             Syntax: read <variable-name>

             Takes a string from the user's keyboard and places it into  the
              specified  user  variable. Any previous value of the specified
 vari-             able is discarded.

         seen             Syntax: seen "string" <number>

             Evaluates as TRUE if "string"  has  occurred  within  the  last
 <number>               characters received during the most recent 'waitfor'
 command. Only             up to 2048 characters are remembered  at  any one
 time   during 'wait-                 for'  processing.  If no  <number>  is
 specified, then all the charac-             ters received during  the  most
 recent  'waitfor'  command  are  exam-             ined, up to a maximum of
 2048. The 'seen' buffer is reset  at  the               beginning  of  each
 'waitfor' command.  This  is  useful to  tell which              of several
 strings has been received.

             Example:

                  if    waitfor    "string1"    20                      then
                 echo     "Received     'string1'."                     else
                 if  seen "string2"                  then
 echo   "Received   'string2'   instead."                   endif
 endif

         set             Syntax: set <xt-set-option> <value>

             This command is the same as the command-mode xt 'set'  command,
 such             as "set bps 1200", "set cis on", and so forth, except that
 a string              <value>  must  be  enclosed  within  double-quotation
 marks.

             Examples:

               set cis "on"               set  cfile "newfilename"
 set auto "on"               set bps 2400

         shell             Syntax: shell "<shell-command>"

             The shell command enclosed within the double-quotation marks is
              executed.  This is similar to the xt command-mode "!" command.
             Remember that if the  shell  command  contains double-quotation
 marks,             they must be escaped with backslashes.

         timeout             Syntax: timeout <number>

              If  <number> is  greater  than zero,  starts  a  timer   which
 will cause                 the MOST  DEEPLY  NESTED  script  to  exit  when
 <number> of MINUTES              expire.  If  <number> is  zero,  then  any
 pending timeout is cancelled.              If <number> is negative, nothing
 happens.

             Expiration  of  the  specified timeout causes  the  most deeply
 nested               script  to  exit,  not to  terminate xt.  To cause the
 program to quit             if a timeout expires, use a subscript.

             Example:

               'script1' contains:

                 call       "script2"                       if       expired
                 then                          quit                    endif
                 # more commands


               'script2' contains:

                 assign expired eq 1                 timeout 5      #  limit
 of 5 minutes                 while ! waitfor "login:" 30                 do
                     xmitbrk                   done                   assign
 expired eq 0                 exit

             When 'script2' exits, the numeric variable  'expired'  will  be
 set  to               1  if  'script2'  timed out, and will be 0 otherwise.
 'script1' can             act on this information accordingly.

         transmit             Syntax: transmit "string"

             Sends a string to the telnet connection.   Within  the  string,
 any              alphabetic character preceded by a caret (^) is translated
 to the             corresponding Control-character.

             Example:

               transmit "date^M"

             sends the string "date" to the telnet connection, followed by a
             carriage-return character.

         true             Syntax: true

              Does  nothing,  but  always  evaluates  as   TRUE. Useful   in
 conditional             expressions. The opposite of 'false'.

         tty             Syntax: tty "on"                     tty "off"

             Ordinarily, during script execution, characters  received  from
 the                   telnet    connection   are   echoed   to   the user's
 terminal screen. This             happens only during 'waitfor' and  'type'
 execution, so  it  may  be  a               bit choppy. This echoing can be
 turned off with

               tty "off"

             and turned back on with

               tty "on"

             Note that "on" and "off" must be enclosed in quotation marks.

         type             Syntax: type "<filename>"

             Sends the specified ASCII file to the telnet  connection.  This
 is             the same as the xt terminal-mode "send ASCII file" escape.

         unassign             Syntax: unassign <variablename>

             Erases the specified user variable. The variable may be  either
              numeric or string type. The variable name must not be enclosed
 in             quotation marks, because variable names are considered to be
 xt             script keywords, and not literal strings.

         waitfor             Syntax: waitfor "string" <number>

             Scans input from the telnet connection for an occurrence of the
              specified  string,  which must be enclosed in quotation marks.
 The             scanning continues for the specified  <number>  of  SECONDS
 or until             the specified string is identified in the telnet input
 stream,             whichever comes first. This command evaluates  as  TRUE
 if  the  speci-               fied  string is  found,  and  as FALSE if the
 specified <number> of              SECONDS  elapses  and the  string  isn't
 found  within  that  time.  The             default time, if no <number> is
 specified, is roughly 30 seconds.

             String matching  is  performed  on  a  case-insensitive  basis.
 Within             the string, any alphabetic character preceded by a caret
 (^) is             translated to the corresponding Control-character.

             Examples:

               assign counter eq 1               while ! waitfor "login:" 15
               do                 xmitbrk; incr counter; if counter morethan
 5                   then                       quit                   endif
               done

             If in a CompuServe Forum the "prompt character" has been set by
 the              user to be a backspace, this test will log off if the main
 prompt             is not seen in the next sixty seconds:

                if   !   waitfor   "forum   !^H"   60                   then
                 transmit "bye^M"; quit               endif

             If the 'cis' option has been set to "on", either  in the  .xtrc
             startup script, or by a direct 'set' command from command mode,
 or             with

               set cis "on"

             within a current script, and if during  'waitfor'  processing a
 CIS               B-Plus  protocol  file transfer request is received, then
 the B-Plus               protocol  transfer  is   performed,   the <number>
 argument   is   reset  to               its original  value, and  'waitfor'
 processing continues. This allows               automatic  B-Plus  protocol
 file transfers from within a script.

         while             Syntax: while <list1>; do <list2>; done

             Operates similarly to the 'if' command, except  that <list2> is
 exe-             cuted repeatedly so long as <list1> evaluates as TRUE. All
 the  con-               ditional  comparators  and  rules  for  comparisons
 that apply  for  the              'if' command also apply to 'while'. (Note
 that 'while' loops can  be               nested  within  'if'  commands and
 vice-versa.)

    File Transfers          When  transferring  files using  CompuServe   B-
 Plus protocol,  the format of         the file is specified by the host. An
 ASCII mode will force xt to per-          form  TEXT  mode  translation;  a
 BINARY  mode  will  not  do  any  translation.          This means that, in
 either direction, a BINARY mode will send bytes  "as          is",  whereas
 in ASCII  mode, an incoming file will always be stripped of         end-of-
 line  carriage-returns,  while  an  ASCII  file   being uploaded   may   or
         may  not have  carriage-returns added after each newline, depending
 on         the "on" or "off" setting of the "cr" option.

         When using a CompuServe B-Plus download command, xt will  check  if
 the          file  name  you specify already exists on your system, and ask
 for an OK         to overwrite the file, or for an alternative name. In the
 CompuServe          case,  there  will  also  be  an  option  to "Resume" a
 download. If the CRC         checksum of the bytes that you already have in
 the  file matches          CompuServe's  checksum  on  the the same initial
 bytes in its version of         the file, file transfer will  proceed  from
 that  point  onwards.  This          saves  connect  time when a very large
 download has been interrupted dur-         ing a prior session.

         Script-driven file transfers using the CompuServe  B-Plus  protocol
 are          more  or less  built into the xt script language, since during
 'waitfor'         processing, a  file  transfer  request  from  the  telnet
 connection will         trigger a B-Plus transfer if the "cis" mode is set.
 The  difficulty   in           performing   such transfers   isn't in   the
 transfer itself, but rather in         the maneuvering required to get into
 position to transfer  the  correct          file,  and  is  something  that
 probably  only  experienced  script  writers          should  wrestle with.
 However, if we assume that in the midst of a         script, you've reached
 a point where you can issue a "download" command         to CompuServe, for
 instance a "Disposition"  prompt  during  a  File          Library "BROWSE"
 command,  and  you  want  to  download  the  present file,         which is
 "XCALL.C"  on  CompuServe,   and   "xcall.c" does   not   exist   in   your
         current working directory,  you'd  use  the  following  sequence of
 script         commands to do it:

           set cis on    #  can't do  auto file  B-Plus  transfer  otherwise
             transmit   "dow^M"               pause 2       # wait  for  CIS
 to display protocol menu           transmit "2^M"  # B-Plus is number 2  on
 that  menu            transmit "xcall.c^M" # "file name for your computer:"
           waitfor "Disposition"

         During the final "waitfor" processing, the CompuServe ENQ character
         will     be recognized    and    the    transfer    will    proceed
 automatically. Then             'waitfor'     will     continue waiting for
 the "Disposition"  prompt, after         which your script can proceed. The
 same sort of thing can be done with         file uploads, but  once  again,
 the    difficulty    isn't    with the    transfer,            but   rather
 with setting things up so that the transfer will  be          requested  at
 the correct place.

         A shell script, cisdownload provided  with  the  distribution,  can
         automatically retrieve a single file from a CompuServe library.

         For   XMODEM,   YMODEM,   and ZMODEM   transfers,    we    strongly
 recommend that          you  obtain  Chuck  Forsberg's excellent, shareware
 utility called "RZSZ",         which can handle XMODEM, XMODEM-1K,  YMODEM,
 and ZMODEM  transfers and         which can be used from within xt with the
 'pipe' command, or from com-         mand mode  with  the  '$'  command, or
 using the examples under the         bind_script command above.

    Debugging         There are three varieties of  debugging  in  xt.   The
 script  command  (set          debug  "on" or set debug "off") will control
 echoing of each line of a         script to the screen.

         If the program was compiled with LOG set to 1 in xt.h,  all  screen
 out-          put  will  be captured in a file called xt.log in the current
 directory,          providing  that  it  exists  before entering  xt,   and
 providing  that output          is  not being diverted to a current capture
 file. The xt.log file is         overwritten each time xt is run.

         If  you  forgot  to  turn  on  capturing,  if   the   program   was
 compiled with          LOG set to 1, and if xt.log exists, all is not lost:
 your session is         recorded in xt.log.

         Note that capturing to files  is turned  off  when exiting terminal
 mode,         and this includes running the built-in B+ protocol.

         Finally, in the xtb+.c module, there is a CIS_DEBUG definition line
         which is normally commented out. If this definition is uncommented,
         then a B+ transfer will record every byte in a file called xtb+log.
         This  file  is  created  if needed, in  the  current directory, and
 overwrit-         ten on each run of xt.

 Exit Codes         0  Successful, uneventful completion.

         1  Error in command-line arguments.

         2  Failure in forking to execute a command or run a shell.

         6  No environment variable TERM has been set.

         7  No entry for the current TERM setting in the terminfo database.

 Copyright         Xt and its source files and  sample  scripts  and  manual
 page are Copy-         right 1995, 1997 by Jean-Pierre Radley.

         Permission is granted to the public to use this code in any manner,
         without any  warranty,  implied  or  otherwise,  of  fitness  for a
 particular         purpose.

         By  virtue  of  a  restriction  previously  placed  upon  all  code
 derivative          from  xcomm,  the xt  code and associated files may not
 be sold by anyone         to anyone, nor incorporated into any product that
 is not also free.          It's OK to transfer them for free.

 Authors         This manual page was written by Fred Buck (1989) and  Jean-
 Pierre  Radley          (1990-1997).   Xt  itself is  the  product  of many
 synergistic wise minds.          See the README document.

 Version         This edition of the manual is for XT version 1.2 JPRadley 8
 July 1997.