COMMENT - Standard C-Kermit initialization file
;
; For C-Kermit Version: 8.0
;
; Filename:
;   .kermrc     (UNIX, OS-9, Aegis)
;   CKERMIT.INI (OS/2, VMS, OpenVMS, AOS/VS, Atari ST, Commodore Amiga)
;   ckermit.ini (Stratus VOS)
;   K95.INI     (Kermit 95 -- but this big version is not used there)
;   K2.INI      (Kermit/2  -- but ditto)
;
; Authors:
;   Frank da Cruz, Christine M. Gianone, Jeffrey Altman
;   Columbia University, New York, NY 10025-7799, USA
;
; This is the standard and recommended C-Kermit 8.0 initialization file.  To
; override settings or definitions made in this file, to add new settings or
; definitions, or to make any other desired customizations, create a separate,
; personal customization file called:
;
;   .mykermrc     (UNIX, OS-9, Aegis, BeBox, Plan 9)
;   CKERMOD.INI   (OS/2, VMS, OpenVMS, AOS/VS, Atari ST, Commodore Amiga)
;   ckermod.ini   (VOS)
;
; You can also define the customization filename in an environment
; variable (logical name in VMS), CKERMOD, which takes precedence over
; the names shown above.
;
; WHAT THIS FILE DOES:
;
; . Defines your default dialing directory name:
;     .kdd for UNIX, OS-9 and Aegis; CKERMIT.KDD for other operating systems.
;        You can override this with the environment variable K_DIAL_DIRECTORY
; . Defines your default network directory name:
;     .knd for UNIX, OS-9 and Aegis; CKERMIT.KND for other operating systems.
;        You can override this with the environment variable K_NET_DIRECTORY
; . Defines your default services directory name:
;     .ksd for UNIX, OS-9 and Aegis; CKERMIT.KSD for other operating systems.
;        You can override this with environment variable K_SERVICE_DIRECTORY.
; . Defines your customization file name (name given above)
; . Performs system-dependent setups for UNIX, VMS, OS/2, etc.
; . Defines VTPRINT macros for use with K95, MS-DOS Kermit, etc.
; . If you have a services directory, all the macros needed to use it are
;     defined.  If you don't have a services directory, the macros are not
;     defined and Kermit starts faster.
; . Executes your personal customization file, if you have one.
;   NOTE: Your customization file is NOT executed by Kermit itself; it is
;   executed by this file.
;
; In UNIX, with C-Kermit 7.0 and later, you can store this file with a name
; other than .kermrc, and it will not be executed automatically, but, if you
; give this file execute permission, you can execute directly because of the
; "kerbang line" at the top, whenever you want all of the above actions to
; occur.  The kerbang line must reflect the actual full path of the Kermit
; 7.0-or-later executable.
;
; C-Kermit 6.0 is documented in the book "Using C-Kermit", 2nd Edition,
; by Frank da Cruz and Christine M. Gianone, 1997, Digital Press /
; Butterworth-Heinemann, ISBN 1-55558-164-1.  New features of subsequent
; versions are documented at the Kermit website:
; http://www.columbia.edu/kermit/
;
; Everything after this point depends on the script programming language.
; The CHECK command terminates this command file immediately if the script
; programming language (IF command) is not configured.
;
set take error on		; This makes CHECK quit if no script language.
check if			; Do we have an IF command?  If not, quit now.
set take error off		; Back to normal.

local _sd _servicedir _xp       ; Declare local variables.

COMMENT - C-Kermit version 6.0 or later required.
;

asg _xp \v(xprogram)
if not def _xp asg _xp \v(program)
if not equal "\m(_xp)" "C-Kermit" -
  stop 1 \v(cmdfile): This initialization file is only for C-Kermit.
echo Executing \v(cmdfile) for \v(system)...
if < \v(version) 60000 -
  stop 1 \v(cmdfile): C-Kermit 6.0 or later required.

forward \v(system)		; First do system-dependent items...

:unknown			; Should not happen
Stop 1 Error: System type unknown!

:Aegis				; Apollo Aegis and
:UNIX				; UNIX, all versions
asg _myinit -
  \v(home).mykermrc		; Customization filename
if remote forward COMMON        ; Skip local-mode items if "-R"
asg _dialdir -
  \v(home).kdd			; C-Kermit dialing directory
asg _netdir -
  \v(home).knd			; C-Kermit network directory
asg _servicedir -
  \v(home).ksd			; C-Kermit services directory
forward COMMON                  ; End of UNIX section

:OS9/68K			; OS-9
asg _myinit -
  \v(home).mykermrc		; Customization filename
if remote forward COMMON
asg _dialdir -
  \v(home).kdd			; C-Kermit dialing directory
asg _netdir -
  \v(home).knd			; C-Kermit network directory
asg _servicedir -
  \v(home).ksd			; C-Kermit services directory
else set file display crt
forward COMMON			; End of OS-9 section

:VMS				; VMS and OpenVMS
forward COMMON

:OS/2				; Kermit 95
:WIN32
echo This initialization file is not for use with K95.
forward COMMON                  ; End of OS/2 section

:AOS/VS				; Data General AOS/VS
set window 1			; Sliding windows don't work
set file char dg-international	; File character-set
set xfer char latin1		; Transfer character-set
set file display crt            ; File transfer fisplay
def cli push			; Escape to CLI
def reset -			; Macro to reset DG DASHER terminal
 run write [!ascii 236 306 301]
forward COMMON                  ; End of AOS/VS section

:Amiga				; Commodore Amiga
def cls echo \27[H\27[2J	; CLS command to clear the screen
set file char latin1		; Use Latin Alphabet 1 for file transfer
set xfer char latin1		; ...
forward COMMON                  ; End of Amiga section

:Atari_ST			; Atari ST
def cls echo \27H\27J		; Clear screen a`la VT52
set server display on		; Show file xfer display in server mode too
set server timeout 15		; Nonzero required for ^C interruption!
forward COMMON                  ; End of Atari ST section

:Macintosh			; Apple Macintosh
set server display on		; Show file xfer display in server mode too.
forward COMMON

:Stratus_VOS                    ; Stratus VOS
asg _myinit \v(home)ckermod.ini
if remote forward COMMON
asg _dialdir \v(home)ckermit.kdd
asg _netdir \v(home)ckermit.knd
asg _servicedir \v(home)ckermit.ksd
forward COMMON                  ; End of Stratus VOS section

:COMMON				; For all systems

; Define macros that are useful when running C-Kermit in remote mode.
; These macros serve no purpose on local-mode-only versions such as
; OS/2, Macintosh, Amiga, and Atari ST Kermit, so we skip defining them
; for those systems.
;
if not = 0 \findex(\v(system),WIN32:OS/2:Macintosh:Amiga:Atari_ST) -
  forward files

; VTPRINT macro.  Print a file on your PC's local printer.

def VTPRINT echo \27[5i, type \%1, echo \27[4i
; or if your printer needs a formfeed to force the page out:
; def VTPRINT  def echo \27[5i, type \%1, echo \12\27[4i

; Macros for host-initiated file transfer using APC:
;   NOT NEEDED ANY MORE because of autodownload/autoupload.
;   Remove the following FORWARD command to reinstate these definitions:

:FILES

; Get customization and directory file names.  Environment variables take
; precedence, so you do not have to edit this file to change these filenames.
;
if def \$(CKERMOD) assign _myinit \$(CKERMOD)
if not def _myinit assign _myinit \v(home)CKERMOD.INI

if remote forward CUSTOM ; Skip all this if -R given on command line

if def \$(K_NET_DIRECTORY) assign _netdir \$(K_NET_DIRECTORY)
if not def _netdir assign _netdir \v(home)CKERMIT.KND

if def \$(K_DIAL_DIRECTORY) assign _dialdir \$(K_DIAL_DIRECTORY)
if not def _dialdir assign _dialdir \v(home)CKERMIT.KDD

CHECK DIAL			; Is there a DIAL command?
xif fail { 			; No.
    echo DIAL disabled
    forward CUSTOM
}

CHECK NETWORK
xif success {
    xif exist \m(_netdir) {
	set net directory \m(_netdir)
	echo { Network directory is \m(_netdir) }
    }
}

if eq "\v(name)" "telnet" forward CUSTOM

xif exist \m(_dialdir) {
    set dial directory \m(_dialdir)
    echo { Dial directory is \m(_dialdir) }
}

COMMENT - Services directory

if def \$(K_SERVICE_DIRECTORY) assign _servicedir \$(K_SERVICE_DIRECTORY)
if not def _servicedir assign _servicedir \v(home)CKERMIT.KSD

; If no services directory is found skip all the big macro definitions and
; go straight to the bottom, where we execute the customization file.

if not exist \m(_servicedir) forward custom

echo { Services directory is \m(_servicedir)}

def MAX_SVCS 200               ; Adjust this if you have more entries
define _sd 0                   ; Assume no services directory
open read \m(_servicedir)      ; Try to open services directory file
xif success {
    declare \&d[\m(MAX_SVCS)]  ; It's open, declare directory array
    for \%i 1 \m(MAX_SVCS) 1 { ; Read the lines into the array
	read \&d[\%i]
	if fail break
    }
    close read
    xif > \%i  \m(MAX_SVCS) {
	echo Too many entries in services directory
	echo { Maximum is \m(MAX_SVCS).}
	echo { Change definition of MAX_SVCS in \v(cmdfile) to allow more. }
	echo { Services directory disabled.}
    } else {
        asg \&d[0] \feval(\%i - 1)
        define _sd 1
    }
}

xif not \m(_sd) {
    def access echo { Services directory not available.}
    asg list \m(access)
} else {
    def FIND {
	set case off
	for \%i 1 \&d[0] 1 {
	    if eq {\%1} {\fsubstr(\&d[\%i],1,\flen(\%1))} break
	}
	if not > \%i \&d[0] return \&d[\%i]
    }
    def LIST {
	xif > \v(argc) 1 {
	    do find \%1
	    if def \v(return) echo \v(return)
	    else echo \%1: Not found
	} else {
	    echo \&d[0] items in services directory:
	    for \%i 1 \&d[0] 1 { echo \fcont(\&d[\%i]) }
	}
    }
    def SPLIT { asg _word1 \%1, asg _word2 \%2 }
    def DOACCESS {               ; (Used internally by ACCESS macro)
	do \%5 \%6 \%7 \%8 \%9   ; Do the connection macro
	if fail end 1
        split \%3                ; Get words from \%3
	asg \%3 \m(_word1)
	asg \%2 \m(_word2)
	do \%3 \%4 {\%1} \%2     ; Login macro, userid, password, prompt
    }
    def ACCESS {
	if not defined \%1 end 1 access what?        ; Check service
	do find \%1                                  ; Look it up
	if success doaccess {\%2} \v(return)         ; OK, try it
	else end 1 "\%1" not in services directory   ; Not found
	if fail end 1                                ; DOACCESS failed?
	xif eq \v(cmdlevel) 1 {
	    echo
	    echo ACCESS: Login succeeded - CONNECTing...
            show escape
            output \13
	    connect /quietly
        }
    }
}

:CONNECTION ; Macros for making connections

COMMENT - SERIAL macro.  Arguments:
; \%1 = device name
; \%2 = speed
;
def SERIAL {
    if < \v(argc) 3                         ; All arguments given?
      end 1 Usage: SERIAL device speed      ; No.
    set line \%1                            ; OK, try to SET LINE.
    if failure -                            ; If this failed,
      end 1 Can't open device: \%1          ; print message and quit.
    set speed \%2                           ; Try to set the speed.
    if fail end 1 Unsupported speed: \%2    ; Failed.
    echo Connection successful.             ; Succeeded.
}

COMMENT - NET macro.  Arguments:
; \%1 = network type
; \%2 = host name or address
;
def NET {
    if < \v(argc) 3 end 1 Usage: NET network host
    set network type \%1
    if fail end 1 unsupported network: \%1
    set login user                ; Don't send user ID.
    set host \%2
    if fail end 1 Can't reach host: \%2
    echo Connection successful.
}

COMMENT - CALL macro.  Arguments:
;
; \%1 = modem type
; \%2 = device name
; \%3 = speed
; \%4 = phone number
;
def CALL {
    if < \v(argc) 5 -         ; All arguments present?
      end 1 Usage: CALL modem device speed number
    xif not equal {\v(modem)} {\%1} { ; Set modem type
        set modem \%1
        if fail end 1 unknown modem type: \%1
    }
    xif not equal {\v(line)} {\%2} { ; Communication device
        set line \%2
        if fail end 1 can't open device: \%2
    }
    xif not equal {\v(speed)} {\%3} { ; Communication speed
        set speed \%3
        if fail end 1 unsupported speed: \%3
    }
    dial \%4                  ; Dial the number
    if fail end 1 Can't place call: \%4
    end 0 Connection successful.
}

COMMENT - TCPCALL macro.  Arguments:
;
; \%1 = server name:port
; \%2 = modem type
; \%3 = phone number
;
def TCPCALL {
    if < \v(argc) 4 -         ; All arguments present?
      end 1 Usage: TCPCALL server[:port] modem number
    set net type tcp/ip       ; Which network to use
    if fail end 1 unsupported network: tcp/ip
    set host \%1              ; Access server and port
    if fail end 1 can't access server \%1
    set modem \%2             ; Set modem type
    if fail end 1 unknown modem type: \%2
    dial \%3                  ; Dial the number
    if fail end 1 Can't place call: \%3
    end 0 Connection successful.
}

COMMENT - SPRINT macro.  Arguments:
; \%1 = Service name or address
;
def SPRINT {
    if < \v(argc) 2 end 1 Usage: \%0 service
    set input timeout proceed
    output @D\13
    input 10 TERMINAL=
    if fail end 1 No terminal prompt
    out D1\13
    inp 10 @
    if fail end 1 No atsign prompt
    output c \%1\13
    input 10 CONNECTED
    if fail end 1 Can't access \%1 from SprintNet
}

COMMENT - ULOGIN macro.  For logging into systems where user ID is required
; but there is no password.  Arguments:
; \%1 = UNIX user ID
;
define ULOGIN {
    if < \v(argc) 2 end 1 Usage: \%0 userid
    set input timeout proceed     ; Handle timeouts ourselves
    set case on                   ; Case is important in UNIX
    minput 5 login: Username: {User ID:} {User Name:}
    out \%1\13                    ; Send username, carriage return
    end 0
}

COMMENT - VMSLOGIN macro.  Arguments:
; \%1 = VMS user ID
; \%2 = Password.  If password not supplied, it is prompted for.
; \%3 = System prompt.  If omitted a default is supplied.
;
define VMSLOGIN {
    if < \v(argc) 2 end 1 Usage: \%0 userid [ password [ prompt ] ]
    while not defined \%2 {
        askq \%2 { \%1's password: }
    }
    set parity none               ; Set communication parameters
    set duplex full
    set handshake none
    set input timeout proceed     ; Handle timeouts ourselves
    in 5 Username:                ; Is prompt already there?
    xif fail {                    ; No.
        for \%i 1 3 1 {           ; Try 3 times to get it.
            out \13               ; Send carriage return
            in 5 Username:        ; Look for prompt
            if success break      ; Success, go log in
        }
        if > \%i 3 end 1 No Username prompt
    }
    out \%1\13                    ; Send username, carriage return
    inp 5 Password:               ; Wait 5 sec for this prompt
    if fail end 1 No password prompt
    pause                         ; Wait a sec
    out \%2\13                    ; Send password
    xif not emulation {           ; No emulator built in?
        set input echo off        ; Protect terminal from this
        minput 10 {\27Z} {\27[c} {\27[0c} ; Get terminal ID query
        xif success {                     ; Got one
            output \27[\?1c               ; Send VT100 terminal ID
            in 2 \27[6n                   ; Screen dimension query?
            if succ out \27[\v(rows);\v(cols)R ; Send dimensions
        }
        set input echo on         ; Echo input again
    }
    if not def \%3 -              ; If we were not given a prompt
      asg \%3 {\v(prompt)}        ; use the SET LOGIN PROMPT value
    if not def \%3 -              ; If we still don't have a prompt
      asg \%3 {\13$\32}           ; use this one as the default
    reinp 0 \%3                   ; Did we INPUT the prompt already?
    if fail inp 60 \%3            ; No, look now.
    if fail end 1
}

COMMENT - UNIXLOGIN macro.  Arguments:
; \%1 = UNIX user ID
; \%2 = Password.  If password not supplied, it is prompted for.
; \%3 = System prompt.  If omitted a default is supplied.
;
define UNIXLOGIN {
    local \%m \%i
    if < \v(argc) 2 -
      end 1 Usage: \%0 userid [ password [ prompt ] ]
    while not defined \%2 {
        askq \%2 { \%1's password: }
    }
    set input echo on
    set parity none               ; Set communication parameters.
    set duplex full
    set handshake none
    set input timeout proceed     ; Handle timeouts ourselves
    set case on                   ; Case is important in UNIX
    def \%m 10                    ; Waiting time for INPUT
    for \%i 1 5 1 {
        minput \%m login: {ssword:} {Password for \%1:}
	if success break
	output \B\13
        \%m ::= 6-\%1
    }
    if > \%i 5 end 1 {No response from host}
    xif = \v(minput) 1 {	  ; Have username prompt
	output \%1\13		  ; Send username
        minput 5 {ssword:} {ssword for \%1:} ; Wait for password prompt
	if fail end 1 {No password prompt}
    }
    pause                         ; Wait a sec
    out \%2\13                    ; Send password
    if not def \%3 -              ; If we were not given a prompt
      asg \%3 {\v(prompt)}        ; use the SET LOGIN PROMPT value
    if not def \%3 -              ; If we still don't have a prompt
      asg \%3 {\10$ }             ; use this one as the default
    reinp 0 \%3                   ; Did we INPUT the prompt already?
    if fail inp 60 \%3            ; No, look now.
    if fail end 1
}

COMMENT - VMLINELOGIN macro.  Arguments:
; \%1 = User ID
; \%2 = Password
;
define VMLINELOGIN {
    if < \v(argc) 2 -
      end 1 Usage: \%0 userid [ password ]
    while not defined \%2 {
        askq \%2 { \%1's password: }
    }
    set parity mark               ; Set communication parameters
    set flow none
    set handshake xon
    set duplex half
    set input timeout quit        ; Don't bother with IF FAILURE
    input 10 BREAK KEY            ; Look for BREAK KEY prompt
    pause 1                       ; Wait a second
    output \B                     ; Send BREAK
    input 10 .\17, output logon \%1\13    ; Now log in
    input 10 .\17, output \%2\13          ; Send password
    input 10 .\17, output \13             ; Send carriage return
    input 10 .\17, output \13             ; Send another one
    end 0
}

COMMENT - VMFULLOGIN macro.  Arguments:
; \%1 = User ID
; \%2 = Password
;
define VMFULLOGIN {
    if < \v(argc) 2 -
      end 1 Usage: \%0 userid [ password ]
    while not defined \%2 {
        askq \%2 { \%1's password: }
    }
    set input timeout quit      ; Quit if INPUT fails
    set parity even             ; Set communication parameters
    set duplex full
    set handshake none
    set flow xon/xoff
    out \13                     ; Send carriage return
    inp 5 TERMINAL TYPE:        ; Get terminal-type prompt
    out vt-100\13               ; Just send "vt-100"
    inp 20 RUNNING              ; Get RUNNING message
    pau 1                       ; Wait one second
    out \%1\9\%2\13             ; Send user ID, tab, password
    out \13\13                  ; Two more carriage returns
    end 0
}

COMMENT - CISLOGIN macro.  Arguments:
; \%1 = CompuServe User ID
; \%2 = Password
; \%3 = Prompt
;
define CISLOGIN {
    if < \v(argc) 2 -
      end 1 Usage: \%0 userid [ password [ prompt ] ]
    while not defined \%2 {
        askq \%2 { \%1's password: }
    }
    set terminal bytesize 7     ; No 8-bit characters
    set input timeout quit      ; Skip the IF FAILURE's
    output \13                  ; Send initial carriage return
    input 5 Host Name:          ; Look for Host Name prompt
    output cis\13               ; Send "cis" and carriage return
    input 5 User ID:            ; Look for User ID prompt
    output \%1\13               ; Send ID and carriage return
    input Password:             ; Look for Password prompt
    output \%2\13               ; Send password and CR
    if not def \%3 asg \%3 \v(prompt)
    if not def \%3 asg \%3 {CompuServe Information Service}
    input 30 \%3
    end 0
}

COMMENT - DOWLOGIN macro.  Arguments:
; \%1 = Dow Jones Password
;
define DOWLOGIN {
    while not defined \%1 {              ; Get password
        askq \%1 { Dow Jones password: }
    }
    set input timeout proceed
    input 20 SERVICE PLEASE\?\?\?\?      ; Look for Dow prompt
    if fail end 1 No service prompt
    out djnr\13                          ; Select DJNR
    input 10 @@@@@@@@                        ; Get password prompt
    if fail end 1 No password prompt
    pause 1                              ; Wait a second, then...
    output \%1\13                        ; send password and CR
    input 30 ENTER QUERY                 ; Get DJNR query prompt
    if fail end 1 No main query prompt
    pause 1
}

COMMENT - DJNRSPRINT macro: Log in to Dow Jones via SprintNet.
;
def djnrsprint sprint dow, if success dowlogin

COMMENT - NOLOGIN macro.  Does nothing.  Use when login not required.
;
def nologin comment

:CUSTOM ; Customization file

; In VMS and OpenVMS, allow for system-wide site customizations

xif equal "\v(system)" "VMS" {
    xif exist CKERMIT_INI:CKERMIT.SYS {
	echo Executing CKERMIT_INI:CKERMIT.SYS
	take CKERMIT_INI:CKERMIT.SYS
    }
}

; Execute user's personal customization file

xif exist \m(_myinit)  {		; If it exists,
    echo Executing \m(_myinit)...	; print message,
    take \m(_myinit)			; and TAKE the file.
}

; Finish up with traditional greeting.

if < \v(ntime) 43200 echo Good Morning!
  else if < \v(ntime) 61200 echo Good Afternoon!
  else echo Good Evening.

End ; of C-Kermit 8.0 initialization file.
