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.