IPDIAL sends files to a remote destination via modem, ISDN or x25. 

It reads files from a queue - normally spool/2dial - determines the phone
number to call, calls, optionally logs on, sets up the transmission, sends the
file(s), logs off and drops the connection. 

For several files in one queue, it will attempt to send all files for a single
destintion first before cutting the call and starting on subsequent

If the number is busy or the call does not complete, the number is retried
after 10 minutes. This can be modified by the 'interval' parameter.

Once connected and ready for sending, each file can be sent plain Ascii,
x/y/zmodem or kermit.

For Dutch users, the program can also be used to send between newspapers using
the VC protocol.

A parameter files is used to describe (amongst others) : 
    - how to logon and setup the link   
    - how to start each file transmission
    - how to end each file
    - how to send subsequent files in the same transmission
    - how to logoff 
    - how to disconnect 

The DZ FipHd field is read which should contain the tph number to dial unless
the -n switch is ON for ignore dialno if not there.

The contents of the file are not altered.

The modem setup, dial strings plus the remote computer's logon/off strings are
held in a parameter file. The Syntax of this file are :

    ; comment
    setup:      (setup string)
    dial:       (dial and connect string)
    logon:      (logon and file setup string)
    filestart:  (start a file string)
    nextfile:   (start a subsequent file string)
    fileend:    (finish a file string)
    logoff:     (logoff and kill comms string)
    disconn:    (disconnect string)

The strings are in uucp-like format where the syntax is :

    (send1string) (space) (receive1string) (spc) (s2) (spc) (r2) etc
ie you send1, wait 5secs for r1, send s2 wait 5secs for r2 etc.

To send a space, use \s or dbl quote that string.
To wait a second - send a tilde (or redefine to your Wait chr)
All keywords - setup, logon etc -  are optional - if one does not exist, it is
Embedded spaces may be specified by enclosing within double quotes.

Null fields can be specified by two consequetive double quotes - "". If a wait
is required howver ALWAYS SPECIFY BEFORE the dbl quotes eg: ~~~"" for a 3
second wait with nothing returned.

The sections are done in the following order :
stage 1-    setup
stage 2-        dial
stage 3-            logon
stage 4-                file start
stage 5-                file end
stage 4/5 continued         (other file starts/end if required)
                        if next file is specified, it is used otherwise file start
stage 6-            logoff
stage 7-        disconn

Note that when using Zmodem or Kermit transfers, 'fileend' is ignored.

In the parameter file several other options are :

    waitchr:\176    wait one sec chr        default: tilde (0176)
    dialchr:\174    'insert the dialno here' chr    default: pipe  (0174)
    syschr:$    system precedent chr        default: dollar (0044)
            This is used for Filename '$f' in filestart parameter.
            or $g for 6chr filename or '$s' for sequence number.
        NOTE you will need to move the SYSCHR out of the way if you
        want to use the \$Z for seqno etc. ie syschr:%
    timeout:10  timeout wait is 10 secs     default: 5 secs
    bits:7      No of databits          default: 8
    parity:even/none/odd/space/mark         default: none
        Use this to force all the data transmitted to this parity
        type. eg if the client wants a 7 bit odd parity transmission
        but the channel is opened as an 8 bit no parity pipe.
        Note the data is ONLY parity-ised for talking to the remote
        ie  setup/dial/disconn are NOT changed
            logon/filestart/nextfile/filend/logoff ARE changed
    speed:1200  the transmission speed      default: none
            If you are using modems which cannot flow control and
            are not using kermit or zmodem, often pacing the line
            at a speed lower than the CONNECT eg speed:1100 for 
            a 1200 bps line.
    commerror:NO\sCARRIER   break in comms      default: none
            This is advisable for large files sent without a
            protocol (ie no kermit or zmodem). If the remote system
            sends/echos copy back then this will also release
            the buffers.
    interval:   Interval between attempts to send.  default: 600secs (10 mins)
    errdest:    Destination to send file to if it can NOT be sent
                            default: none
    msgerr:     Destination to send a message if file can NOT be sent
                            default: none
    msgok:      Destination to send a message if file can NOT be sent
                            default: none
    sendprog:   Sending program string if not vanilla ascii
    nocomplain: Do not complain if files do NOT exist in the input queue
    kermit:     Send the text using Kermit Protocol
    xmodem:     Send the text using Xmodem Protocol
    ymodem:     Send the text using Ymodem Protocol
    zmodem:     Send the text using Zmodem Protocol
    remname:    to change the filename on the remote system eg: remname:$g.xy
    forcename:u/l to force the remote name upper or lower case.
    max-take-size:  Split the outgoing file into takes with this maximum.
            default is Do NOT split.
    take-end:   Text (in FipSeq) to add at the end of a take
            but NOT the end of file.    default: none
            Note that FipHdr D1 holds the take number.
    take-start: Text (in FipSeq) to add at the begining of a take
            but NOT the first file.     default: none
    maxattempts:    There is the limit on the number of attempts. File are
        sent to woops if this is exceeded. Default is 5 goes.
        Set to zero for NO limit.
        The biggest maxattempts is 100 - use 0 for no limit.
    disconnect-attempts: Sometimes some modems do NOT disconnect the firsttime
        Use this to specify the number of attempts at disconnecting - default:1
    error-queue: Folder for files which have tried 'maxattampts' times
            The default is 'woops'
    zap-on-error: Just delete the file if we have tried 'maxattempts' times.
            Default is that the file is moved to 'woops' or the 'error-queue'
    onefile:    Send a single file then cut the call and redial
        Normally ipdial scans its queue for all files for that phone no.
    waitque:    Wait period after the queue is empty before disconnecting
            in case a new file arrives. default: 0 secs
            The maximum wait is 100 seconds.
    endwait:    Wait period before disconnection after all
            data has been sent. default 1 sec for PSTN, 5 for x25
            The maximum wait is 100 seconds.
    logfile:(dest)  Send to this destination the log of what happened during
            transmission. This destination defaults to LOGDIAL (uppercase).
            It must be an entry in tables/sys/USERS.
            If the log is to be sent to another destination, specify
            as the parameter to 'logfile:'
            eg logfile:nytdone  sends the file to Dest 'nytdone'
            default: no log created.
    logeachfile:(dest) Send a Success/failed msg to this destination for each
            There is no default.
            This log file is just a FipHdr with the following extra fields :
                DR-File Sent OK     DR:ok or DR:error
                DG-Will Retry later DG:retrying or DG:stopped
                DT-Some message text    DT:No connection
                DO-Number of last attempt   DO:5
                HT-Date and Time    HT:25 Nov 98 15:35:25
            default: no log created.
            The DR and DG messages can be changed by using :
            eg: log-dr-ok:File \VN sent to Remote Number \DZ (\$h:\$n)
    msgeachfile:(FipSeq) Additional information to add to the FipHdr of the
            msg. This should be in FipHdr format and be in FipSeq. It can be
            used to pass FipHdr fields in the outgoing file into the log file.
            eg  msgeachfile:    DF:logdial\nSS:\SS\n
            default: nothing added
    in-start:   Start of incoming file string in FipSeq
            use this with -I allow incoming files.
            default: none
            example     in-start:\001
    in-end:     End of incoming file string in FipSeq
            use this with -I allow incoming files.
            default: none
            example     in-end:NNNN\r\n
    in-dest:    Fip Destination for incoming files.
            use this with -I allow incoming files
            This is the Fip Hdr 'DU' and there should be an entry
            in the tables/sys/USERS parameter file of the same name.
            default: dial_incoming
    in-source:  Source for incoming files.
            This is the Fip Hdr 'SU'.
            default: VC
    in-fiphdr:  Extra Fip Hdr fields to be added to any
            incoming file.          default: none
    in-before:  String (in FipSeq) to be placed at the top
            of any incoming file.       default: none
    in-after:   String (in FipSeq) to be placed at the end
            of any incoming file.       default: none
    in-no-archive:  Do NOT archive the incoming file in the daily archive
            Use this when the incoming file is being passed on to
            'ipdskwir' or another process which will also 
            set the archive flag.

Example :
    setup:\r\r~+++ OK\r ath\r OK\r ~at&f\r OK\r ~atf0%b9600\r OK\r
    dial:~atdt9|\r\n    CONNECT
    logon:li\r\n    LOGON
    logoff:lo\r\n LOGOFF lo\r\n
    disconn:~~+++ OK\r ~+++ OK\r ath\r OK\r 

That is for setup, we want to :
    send CR CR , wait a second, send +++
    wait for OK CR
    send ath CR
    wait for OK CR
    send at&f CR
    wait for OK CR
    send atf0%b9600 CR
    wait for OK CR

    1. If you have any spaces in the sting to send/receive, you MUST quote :
            filestart:~~"\001ABC\$Z \PR \CA \$W\r\n\DI\r\n\002"
    2. If you are using FipSeq System Variables - \$Z, \$D etc, then you must
        move 'syschr' to another character as it defaults to a dollar !!

One point to note if you are using the TTY ports is that they INVARIABLY need
to be setup using the STTY parameter file in tables/stty. Ths syntax of the
file is covered in the Unix manual pages. The name of the file in tables/stty
is :
        STTY_NAME_PORT  (all uppercase)
        where NAME is the name of the parameter table which will be ..
            either "DIAL" or the "-z" default or the contents of the DF field
        where PORT is the TTY name ie for ttya : TTYA; for ttyx16 : TTYX16
For tuning, start off with one of the existing tty files in tables/stty. Note
that stty for the SunOS4 loads a port using '(stty params) > /dev/ttya'.
However the arrow is reversed on Solaris, DEC OSF and rs6000 : '(stty params) <
/dev/tty4'.  On NT, the parameters are the same as for the 'mode' command.

For testing a new destination, it is rare to get it right first time!
There is a 'verbose' flag, -L, which will display the whole dialogue as it
happens. You can run the program manually from any terminal or window. eg
    ipdial -s black2 -p 1210 -L 
or to also save the results in a log file :
    ipdial -s black2 -p 1210 -L | tee LOGFILE
Be careful in the latter case, that you are in a personal queue and not a
tables or spool queue and that the name of the log file - LOGFILE in this case
does not exist.

For Dutch users, the program can also be used to send VC type traffic. The
editorial system which is sending VC traffic needs the status of each
transmission. To do this when a file is sent (or rejected) a status or update
file is sent back to the sender. Use 'logeachfile:' to send the status message
back, the actual messages can be translated using the 'log-dr-ok' etc keywords.
Remember to add input switch -I to allow incomings :
    ipdial -s tiptermserv -p 1015 -I -Y -z VC

Where sections of FipHdr fields are required or changes to the output style,
 keywords : fixed, partial, combie, optional, repeat, newdate and/or style.
(see The SysA
dmin manual for more information).

    They are normally specified :
        fixed:QZ    1234543
        partial:QT  ST,3,2,U,<,>
        combie:QY   ep|na,(0000000)a
        option:QE   ep,11,7,s
        repeat:QK   XK,-,3
    or  repeat:QP   PK,,4,#X
        style:QS    XN,%.03d

Input Parameters :
    Mandatory :
    -s : Spider name or TTY device name     default: none
    -p : Spider port number             default: none
    Optional :
    -n : do not look for nor check the tph number   default: DZ field is tph
    -z : default parameter table to setup comms if not overwritten by
        the 'DF' FIP header field.  default: tables/dial/DIAL
    -q : input queue to scan            default: spool/2dial
    -d : do NOT delete the files after sending  default: delete
    -D : disconnect from the port after each transmission   default: -
        While 'ipdial' always disconnects from the modem, this also
        drops any TCP connection too. So this will disconnect from the
        terminal server too.
    -I : allow incoming files           default: no
        there must be an 'in-start' and 'in-end' in the parameter file
    -l : do NOT log any files sent          default: log outgoings
    -L : Display all in/out for the session     default: no
        except text
    -O : done queue for sent files          default: none
        Normally files are deleted after sending.
    -t : inter-file wait when sending more than one file. default: 1 sec
    -T : log the trace of each transaction      default: do not
        This generates a one line log of each file sent is stored in
        log/remote_trace with a name of 'date_(DF)'.
    -w : file wait is seconds           default: 0 - no wait
        This is for files arriving over the network.
    -x : wakeup string for terminal server      default: none
    -X : Turn Telnet Transparency OFF       default: ON
        For terminal servers, is the port set to transparency ?
    -U : Raw or Telnet NO-escape mode       default: telnet transparency ON
        For terminal servers, is the port set to transparency ? 
    -y : Banner string to strip from terminal server.default: SpiderBanner
    -Y : There is no banner to strip        default: as above
    -V : old style VC traffic           default: no
    -1 : Single pass then stop          default: keep spooling
    -v : Print the version number and exit

TODO-how to setup VC
There should be a file called tables/route/('SU') to describe the routing for
this file.

Version Control
;026q   30nov99 added takes
    ;b 29nov00 improved logeachmsg
    ;c 04jan01 added parity:
    ;d/e/f 22jan01 for failures - check maxAttempts before checking time
    ;g 26feb01 enabled 'errdest'
    ;h/i/j/k 20mar01 added ignore RecvError0 if in Disconnect
    ;m 29oct01 added disconnect-attempts
    ;n 14mar02 added remote-trace
    ;o-q 01jan03 MACOSX
;025    17nov99 added redun_balance
;024    27aug99 added -D to Disconnect from Spider
;023    29mar99 LINUX - not tty

(copyright) 2017 and previous years FingerPost Ltd.