home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archives / ckv192.zip / ckudia.c < prev    next >
C/C++ Source or Header  |  1996-12-28  |  176KB  |  5,907 lines

  1. #include "ckcsym.h"
  2. #ifndef NOLOCAL
  3. #ifndef NODIAL
  4. #ifndef NOICP
  5.  
  6. char *dialv = "Dial Command, 6.0.091, 6 Sep 96";
  7.  
  8. #ifndef NOOLDMODEMS        /* Unless instructed otherwise, */
  9. #define OLDMODEMS          /* keep support for old modems. */
  10. #endif /* NOOLDMODEMS */
  11.  
  12. #ifndef M_OLD           /* Hide old modem keywords in SET MODEM table. */
  13. #define M_OLD 0            /* Define as to CM_INV to make them invisible. */
  14. #endif /* M_OLD */ 
  15.  
  16. /*  C K U D I A     --  Module for automatic modem dialing. */
  17.  
  18. /*
  19.   Copyright (C) 1985, 1996, Trustees of Columbia University in the City of New
  20.   York.  The C-Kermit software may not be, in whole or in part, licensed or
  21.   sold for profit as a software product itself, nor may it be included in or
  22.   distributed with commercial products or otherwise distributed by commercial
  23.   concerns to their clients or customers without written permission of the
  24.   Office of Kermit Development and Distribution, Columbia University.  This
  25.   copyright notice must not be removed, altered, or obscured.
  26. */
  27.  
  28. /*
  29.   Authors:
  30.  
  31.   Original (version 1, 1985) author: Herm Fischer, Encino, CA.
  32.   Contributed to Columbia University in 1985 for inclusion in C-Kermit 4.0.
  33.   Author and maintainer since 1985: Frank da Cruz, Columbia University,
  34.   fdc@columbia.edu.
  35.  
  36.   Contributions by many others throughout the years, including: Jeffrey
  37.   Altman, Mark Berryman, Fernando Cabral, John Chmielewski, Joe Doupnik,
  38.   Richard Hill, Larry Jacobs, Eric Jones, Tom Kloos, Bob Larson, Peter Mauzey,
  39.   Joe Orost, Kevin O'Gorman, Kai Uwe Rommel, Dan Schullman, Warren Tucker, and
  40.   others too numerous to list here (but see acknowledgements in ckcmai.c).
  41. */
  42.  
  43. /*
  44.   Entry points:
  45.     ckdial(char * number)   Dial a number or answer a call
  46.     dialhup()               Hang up a dialed connection
  47.     mdmhup()                Use modem commands to hang up
  48.  
  49.   All other routines are static.
  50.   Don't call dialhup() or mdmhup() without first calling ckdial().
  51. */
  52.  
  53. /*
  54.   This module calls externally defined system-dependent functions for
  55.   communications i/o, as described in CKCPLM.DOC, the C-Kermit Program Logic
  56.   Manual, and thus should be portable to all systems that implement those
  57.   functions, and where alarm() and signal() work as they do in UNIX.
  58.  
  59.   TO ADD SUPPORT FOR ANOTHER MODEM, do the following, all in this module:
  60.  
  61.   1. Define a modem-type number symbol (n_XXX) for it, the next highest one.
  62.  
  63.   2. Adjust MAX_MDM to the new number of modem types.
  64.  
  65.   3. Create a MDMINF structure for it.  NOTE: The wake_str should include
  66.      all invariant setup info, e.g. enable result codes, BREAK transparency,
  67.      modulation negotiation, etc.  See ckcker.h for MDMINF struct definition.
  68.  
  69.   4. Add the address of the MDMINF structure to the modemp[] array,
  70.      according to the numerical value of the modem-type number.
  71.  
  72.   5. Add the user-visible (SET MODEM) name and corresponding modem number
  73.      to the mdmtab[] array, in alphabetical order by modem-name string.
  74.  
  75.   6. Read through the code and add any modem-specific sections as necessary.
  76.      For most modern Hayes-compatible modems, no specific code will be
  77.      needed.
  78.  
  79.   NOTE: The MINIDIAL symbol is used to build this module to include support
  80.   for only a minimum number of standard and/or generally useful modem types,
  81.   namely Hayes, CCITT V.25bis, "Unknown", and None.  When adding support for
  82.   a new modem type, keep it outside of the MINIDIAL sections.
  83. */
  84.  
  85. #include "ckcdeb.h"
  86. #ifndef MAC
  87. #include <signal.h>
  88. #endif /* MAC */
  89. #include "ckcasc.h"
  90. #include "ckcker.h"
  91. #include "ckucmd.h"
  92. #include "ckcnet.h"
  93. #include "ckuusr.h"
  94.  
  95. #ifdef OS2ONLY
  96. #define INCL_VIO            /* Needed for ckocon.h */
  97. #include <os2.h>
  98. #include "ckocon.h"
  99. #endif /* OS2ONLY */
  100.  
  101. #ifdef NT
  102. #include "cknwin.h"
  103. #endif /* NT */
  104. #ifdef OS2
  105. #include "ckowin.h"
  106. #endif /* OS2 */
  107.  
  108. #ifndef ZILOG
  109. #ifdef NT
  110. #include <setjmpex.h>
  111. #else /* NT */
  112. #include <setjmp.h>
  113. #endif /* NT */
  114. #else
  115. #include <setret.h>
  116. #endif /* ZILOG */
  117.  
  118. #include "ckcsig.h"        /* C-Kermit signal processing */
  119.  
  120. #ifdef MAC
  121. #define signal msignal
  122. #define SIGTYP long
  123. #define alarm malarm
  124. #define SIG_IGN 0
  125. #define SIGALRM 1
  126. #define SIGINT  2
  127. SIGTYP (*msignal(int type, SIGTYP (*func)(int)))(int);
  128. #endif /* MAC */
  129.  
  130. #ifdef AMIGA
  131. #define signal asignal
  132. #define alarm aalarm
  133. #define SIGALRM (_NUMSIG+1)
  134. #define SIGTYP void
  135. SIGTYP (*asignal(int type, SIGTYP (*func)(int)))(int);
  136. unsigned aalarm(unsigned);
  137. #endif /* AMIGA */
  138.  
  139. #ifdef STRATUS
  140. /*
  141.   VOS doesn't have alarm(), but it does have some things we can work with.
  142.   However, we have to catch all the signals in one place to do this, so
  143.   we intercept the signal() routine and call it from our own replacement.
  144. */
  145. #define signal vsignal
  146. #define alarm valarm
  147. SIGTYP (*vsignal(int type, SIGTYP (*func)(int)))(int);
  148. int valarm(int interval);
  149. #ifdef putchar
  150. #undef putchar
  151. #endif /* putchar */
  152. #define putchar(x) conoc(x)
  153. #ifdef getchar
  154. #undef getchar
  155. #endif /* getchar */
  156. #define getchar(x) coninc(0)
  157. #endif /* STRATUS */
  158.  
  159. #ifdef OS2
  160. #ifdef putchar
  161. #undef putchar
  162. #endif /* putchar */
  163. #define putchar(x) conoc(x)
  164. #endif /* OS2 */
  165.  
  166. #ifdef BIGBUFOK /* Only for verions that are not tight on memory */
  167.  
  168. char * dialmsg[] = {            /* DIAL status strings */
  169.  
  170.     /* Keyed to numbers defined in ckcker.h -- keep in sync! */
  171.  
  172.     "DIAL succeeded",                /*  0 */
  173.     "Modem type not specified",            /*  1 */
  174.     "Communication device not specified",   /*  2 */
  175.     "Communication device can't be opened", /*  3 */
  176.     "Speed not specified",            /*  4 */
  177.     "Pre-DIAL hangup failed",            /*  5 */
  178.     "Internal error",                /*  6 */
  179.     "Device input/output error",        /*  7 */
  180.     "DIAL TIMEOUT expired",            /*  8 */
  181.     "Interrupted by user",            /*  9 */
  182.     "Modem not ready",                /* 10 */
  183.     "Partial dial OK",                /* 11 */
  184.     "Dial directory lookup error",        /* 12 */
  185.     NULL,                    /* 13 */
  186.     NULL,                    /* 14 */
  187.     NULL,                    /* 15 */
  188.     NULL,                    /* 16 */
  189.     NULL,                    /* 17 */
  190.     NULL,                    /* 18 */
  191.     NULL,                    /* 19 */
  192.     "Modem command error",            /* 20 */
  193.     "Failure to initialize modem",        /* 21 */
  194.     "Phone busy",                /* 22 */
  195.     "No carrier",                /* 23 */
  196.     "No dialtone",                /* 24 */
  197.     "Incoming call",                /* 25 */
  198.     "No answer",                /* 26 */
  199.     "Disconnected",                /* 27 */
  200.     "Answered by voice",            /* 28 */
  201.     "Access denied / forbidden call",        /* 29 */
  202.     "Blacklisted",                /* 30 */
  203.     "Delayed",                    /* 31 */
  204.     "Fax connection",                /* 32 */
  205.     NULL                    /* 33 */
  206. };
  207. #endif /* BIGBUFOK */
  208.  
  209. #ifndef NOSPL
  210. char modemmsg[80];            /* DIAL response from modem */
  211. #endif /* NOSPL */
  212.  
  213. #ifdef NTSIG
  214. extern int TlsIndex;
  215. #endif /* NTSIG */
  216.  
  217. int                    /* SET DIAL parameters */
  218.   dialhng = 1,                /* DIAL HANGUP, default is ON */
  219.   dialdpy = 0,                /* DIAL DISPLAY, default is OFF */
  220.   mdmspd  = 0,                /* DIAL SPEED-MATCHING (0 = OFF) */
  221.   dialtmo = 0,                /* DIAL TIMEOUT */
  222.   dialatmo = -1,            /* ANSWER TIMEOUT */
  223.   dialksp = 0,                /* DIAL KERMIT-SPOOF, 0 = OFF */
  224. #ifdef NOMDMHUP
  225.   dialmhu = 0;                /* DIAL MODEM-HANGUP, 0 = OFF */
  226. #else
  227.   dialmhu = 1;                /* DIAL MODEM-HANGUP */
  228. #endif /* NOMDMHUP */
  229.  
  230. int
  231.   dialec = 0,                /* DIAL ERROR-CORRECTION */
  232.   dialdc = 0,                /* DIAL COMPRESSION  */
  233.   dialfc = FLO_AUTO,            /* DIAL FLOW-CONTROL */
  234.   dialmth = XYDM_D,            /* DIAL METHOD */
  235.   dialesc = 0;                /* DIAL ESCAPE */
  236.  
  237. int telephony = 0;            /* Command-line '-T' option */
  238.  
  239. long dialmax = 0L,            /* Modem's max interface speed */
  240.   dialcapas  = 0L;            /* Modem's capabilities */
  241.  
  242. int dialsta = DIA_UNK;            /* Detailed return code (ckuusr.h) */
  243.  
  244. int is_rockwell = 0;
  245. int is_hayeshispd = 0;
  246.  
  247. char *dialdir[MAXDDIR];            /* DIAL DIRECTORY filename array */
  248. int   ndialdir = 0;            /* How many dial directories */
  249. char *dialini = NULL;            /* DIAL INIT-STRING, default none */
  250. char *dialmstr = NULL;            /* DIAL MODE-STRING, default none */
  251. char *dialmprmt = NULL;            /* DIAL MODE-PROMPT, default none */
  252. char *dialcmd = NULL;            /* DIAL DIAL-COMMAND, default none */
  253. char *dialnpr = NULL;            /* DIAL PREFIX, ditto */
  254. char *diallac = NULL;            /* DIAL LOCAL-AREA-CODE, ditto */
  255. char *diallcc = NULL;            /* DIAL LOCAL-COUNTRY-CODE, ditto */
  256. char *dialixp = NULL;            /* DIAL INTL-PREFIX */
  257. char *dialixs = NULL;            /* DIAL INTL-SUFFIX */
  258. char *dialldp = NULL;            /* DIAL LD-PREFIX */
  259. char *diallds = NULL;            /* DIAL LD-SUFFIX */
  260. char *dialpxx = NULL;            /* DIAL PBX-EXCHANGE */
  261. char *dialpxi = NULL;            /* DIAL INTERNAL-PREFIX */
  262. char *dialpxo = NULL;            /* DIAL OUTSIDE-PREFIX */
  263. char *dialsfx = NULL;            /* DIAL SUFFIX */
  264. char *dialtfp = NULL;            /* DIAL TOLL-FREE-PREFIX */
  265. extern char * d_name;
  266. extern char * dialtfc[];
  267. extern int ntollfree;
  268. char *dialname  = NULL;            /* Descriptive name for modem */
  269. char *dialdcon  = NULL;            /* DC ON command */
  270. char *dialdcoff = NULL;            /* DC OFF command */
  271. char *dialecon  = NULL;            /* EC ON command */
  272. char *dialecoff = NULL;            /* EC OFF command */
  273. char *dialaaon  = NULL;            /* Autoanswer ON command */
  274. char *dialaaoff = NULL;            /* Autoanswer OFF command */
  275. char *dialhcmd  = NULL;            /* Hangup command */
  276. char *dialhwfc  = NULL;            /* Hardware flow control command */
  277. char *dialswfc  = NULL;            /* (Local) software f.c. command */
  278. char *dialnofc  = NULL;            /* No (Local) flow control command */
  279. char *dialtone  = NULL;            /* Command to force tone dialing */
  280. char *dialpulse = NULL;            /*  ..to force pulse dialing */
  281. char *mdmname   = NULL;
  282.  
  283. #ifndef MINIDIAL
  284. /*
  285.   Telebit model codes:
  286.  
  287.   ATI  Model Numbers           Examples
  288.   ---  -------------           --------
  289.   123                          Telebit in "total Hayes-1200" emulation mode
  290.   960                          Telebit in Conventional Command (Hayes) mode
  291.   961  RA12C                   IBM PC internal original Trailblazer
  292.   962  RA12E                   External original Trailblazer
  293.   963  RM12C                   Rackmount original Trailblazer
  294.   964  T18PC                   IBM PC internal Trailblazer-Plus (TB+)
  295.   965  T18SA, T2SAA, T2SAS     External TB+, T1600, T2000, T3000, WB, and later
  296.   966  T18RMM                  Rackmount TB+
  297.   967  T2MC                    IBM PS/2 internal TB+
  298.   968  T1000                   External T1000
  299.   969  ?                       Qblazer
  300.   970                          Qblazer Plus
  301.   971  T2500                   External T2500
  302.   972  T2500                   Rackmount T2500
  303. */
  304.  
  305. /* Telebit model codes */
  306.  
  307. #define TB_UNK  0            /* Unknown Telebit model */
  308. #define TB_BLAZ 1            /* Original TrailBlazer */
  309. #define TB_PLUS    2            /* TrailBlazer Plus */
  310. #define TB_1000 3            /* T1000 */
  311. #define TB_1500 4            /* T1500 */
  312. #define TB_1600 5            /* T1600 */
  313. #define TB_2000 6            /* T2000 */
  314. #define TB_2500 7            /* T2500 */
  315. #define TB_3000 8            /* T3000 */
  316. #define TB_QBLA 9            /* Qblazer */
  317. #define TB_WBLA 10            /* WorldBlazer */
  318. #define TB__MAX 10            /* Highest number */
  319.  
  320. char *tb_name[] = {            /* Array of model names */
  321.     "Unknown",                /* TB_UNK  */
  322.     "TrailBlazer",            /* TB_BLAZ */
  323.     "TrailBlazer-Plus",            /* TB_PLUS */
  324.     "T1000",                /* TB_1000 */
  325.     "T1500",                /* TB_1500 */
  326.     "T1600",                /* TB_1600 */
  327.     "T2000",                /* TB_2000 */
  328.     "T2500",                /* TB_2500 */
  329.     "T3000",                /* TB_3000 */
  330.     "Qblazer",                /* TB_QBLA */
  331.     "WorldBlazer",            /* TB_WBLA */
  332.     ""
  333. };
  334. #endif /* MINIDIAL */
  335.  
  336. extern int flow, local, mdmtyp, quiet, backgrd, parity, seslog, network;
  337. extern int carrier, duplex, mdmsav;
  338. #ifdef NETCONN
  339. extern int ttnproto;
  340. #endif /* NETCONN */
  341. extern CHAR stchr;
  342. extern long speed;
  343. extern char ttname[], sesfil[];
  344.  
  345. /*  Failure codes  */
  346.  
  347. #define F_TIME        1        /* timeout */
  348. #define F_INT        2        /* interrupt */
  349. #define F_MODEM        3        /* modem-detected failure */
  350. #define F_MINIT        4        /* cannot initialize modem */
  351.  
  352. static
  353. #ifdef OS2
  354.  volatile
  355. #endif /* OS2 */
  356.  int fail_code =  0;            /* Default failure reason. */
  357.  
  358. static int func_code;            /* 0 = dialing, nonzero = answering */
  359. static int partial;
  360. static int mymdmtyp = 0;
  361.  
  362. #define DW_NOTHING      0        /* What we are doing */
  363. #define DW_INIT         1
  364. #define DW_DIAL         2
  365.  
  366. static int dial_what = DW_NOTHING;    /* Nothing at first. */
  367. static int nonverbal = 0;        /* Hayes in numeric response mode */
  368. static MDMINF * mp;
  369. static CHAR escbuf[6];
  370. static long mdmcapas;
  371.  
  372. _PROTOTYP (static VOID dreset, (void) );
  373. _PROTOTYP (static int (*xx_ok), (int,int) );
  374. _PROTOTYP (static int ddinc, (int) );
  375. _PROTOTYP (int dialhup, (void) );
  376. _PROTOTYP (static int getok, (int,int) );
  377. _PROTOTYP (char * ck_time, (void) );
  378. _PROTOTYP (static VOID ttslow, (char *, int) );
  379. #ifdef COMMENT
  380. _PROTOTYP (static VOID xcpy, (char *, char *, unsigned int) );
  381. #endif /* COMMENT */
  382. _PROTOTYP (static VOID waitfor, (char *) );
  383. _PROTOTYP (static VOID dialoc, (char) );
  384. _PROTOTYP (static int didweget, (char *, char *) );
  385. _PROTOTYP (static VOID spdchg, (long) );
  386. #ifndef MINIDIAL
  387. #ifdef OLDTBCODE
  388. _PROTOTYP (static VOID tbati3, (int) );
  389. #endif /* OLDTBCODE */
  390. #endif /* MINIDIAL */
  391. _PROTOTYP (static int dialfail, (int) );
  392. _PROTOTYP (static VOID gethrw, (void) );
  393. _PROTOTYP (static VOID gethrn, (void) );
  394.  
  395. /*
  396.  * Define symbolic modem numbers.
  397.  *
  398.  * The numbers MUST correspond to the ordering of entries
  399.  * within the modemp array, and start at one (1).
  400.  *
  401.  * It is assumed that there are relatively few of these
  402.  * values, and that the high(er) bytes of the value may
  403.  * be used for modem-specific mode information.
  404.  *
  405.  * REMEMBER that only the first eight characters of these
  406.  * names are guaranteed to be unique.
  407.  */
  408.  
  409. #ifdef MINIDIAL                /* Minimum dialer support */
  410.                     /* Only for CCITT, HAYES, and UNK */
  411. #define        n_CCITT         1    /* CCITT/ITU-T V.25bis */
  412. #define        n_HAYES         2    /* Hayes 2400 */
  413. #define        n_UNKNOWN     3    /* Unknown */
  414. #define         n_UDEF           4    /* User-Defined */
  415. #define        MAX_MDM         4    /* Number of modem types */
  416.  
  417. #else                    /* Full-blown dialer support */
  418.  
  419. #define        n_ATTDTDM     1
  420. #define         n_ATTISN         2
  421. #define        n_ATTMODEM     3
  422. #define        n_CCITT         4
  423. #define        n_CERMETEK     5
  424. #define        n_DF03         6
  425. #define        n_DF100         7
  426. #define        n_DF200         8
  427. #define        n_GDC         9
  428. #define        n_HAYES        10
  429. #define        n_PENRIL    11
  430. #define        n_RACAL        12
  431. #define        n_UNKNOWN       13
  432. #define        n_VENTEL    14
  433. #define        n_CONCORD    15
  434. #define        n_ATTUPC    16    /* aka UNIX PC and ATT7300 */
  435. #define        n_ROLM          17      /* Rolm CBX DCM */
  436. #define        n_MICROCOM    18    /* Microcoms in SX command mode */
  437. #define         n_USR           19    /* Modern USRs */
  438. #define         n_TELEBIT       20      /* Telebits of all kinds */
  439. #define         n_DIGITEL       21    /* Digitel DT-22 (CCITT variant) */
  440.  
  441. #define         n_H_1200        22    /* Hayes 1200 */
  442. #define        n_H_ULTRA       23    /* Hayes Ultra and maybe Optima */
  443. #define        n_H_ACCURA      24    /* Hayes Accura and maybe Optima */
  444. #define         n_PPI           25    /* Practical Peripherals */
  445. #define         n_DATAPORT      26    /* AT&T Dataport */
  446. #define         n_BOCA          27    /* Boca */
  447. #define        n_MOTOROLA      28    /* Motorola Fastalk or Lifestyle */
  448. #define        n_DIGICOMM    29    /* Digicomm Connection */
  449. #define        n_DYNALINK      30    /* Dynalink 1414VE */
  450. #define        n_INTEL        31    /* Intel 14400 Faxmodem */
  451. #define        n_UCOM_AT    32    /* Microcoms in AT mode */
  452. #define        n_MULTI        33    /* Multitech MT1432 */
  453. #define        n_SUPRA        34    /* SupraFAXmodem */
  454. #define            n_ZOLTRIX    35    /* Zoltrix */
  455. #define        n_ZOOM        36    /* Zoom */
  456. #define        n_ZYXEL        37    /* ZyXEL */
  457. #define         n_TAPI          38    /* Microsoft Windows dialer */
  458. #define         n_TBNEW         39    /* Newer Telebit models */
  459. #define        n_MAXTECH       40    /* MaxTech XM288EA */
  460. #define         n_UDEF          41    /* User-Defined */
  461. #define         n_RWV32         42    /* Generic Rockwell V.32 */
  462. #define         n_RWV32B        43    /* Generic Rockwell V.32bis */
  463. #define         n_RWV34         44    /* Generic Rockwell V.34 */
  464. #define        n_MWAVE        45    /* IBM Mwave Adapter */
  465. #define         n_TELEPATH      46    /* Gateway Telepath */
  466. #define         n_MICROLINK     47    /* MicroLink modems */
  467. #define         n_CARDINAL      48    /* Cardinal modems */
  468. #define        MAX_MDM        48    /* Number of modem types */
  469.  
  470. #endif /* MINIDIAL */
  471.  
  472. int dialudt = n_UDEF;            /* Number of user-defined type */
  473.  
  474. /* BEGIN MDMINF STRUCT DEFINITIONS */
  475.  
  476. /*
  477.   Declare structures containing modem-specific information.
  478.   REMEMBER that only the first SEVEN characters of these names are
  479.   guaranteed to be unique.
  480.  
  481.   First declare the three types that are allowed for MINIDIAL versions.
  482. */
  483. static
  484. MDMINF CCITT =                /* CCITT / ITU-T V.25bis autodialer */
  485. /*
  486.   According to V.25bis:
  487.   . Even parity is required for giving commands to the modem.
  488.   . Commands might or might not echo.
  489.   . Responses ("Indications") from the modem are terminated by CR and LF.
  490.   . Call setup is accomplished by:
  491.     - DTE raises DTR (V.24 circuit 108)              [ttopen() does this]
  492.     - Modem raises CTS (V.24 circuit 106)            [C-Kermit ignores this]
  493.     - DTE issues a call request command ("CRN")
  494.     - Modem responds with "VAL" ("command accepted")
  495.     - If the call is completed:
  496.         modem responds with "CNX" ("call connected");
  497.         modem turns CTS (106) OFF;
  498.         modem turns DSR (107) ON;
  499.       else:
  500.         modem responds with "CFI <parameter>" ("call failure indication").
  501.   . To clear a call, the DTE turns DTR (108) OFF.
  502.   . There is no mention of the Carrier Detect circuit (109) in the standard.
  503.   . There is no provision for "escaping back" to the modem's command mode.
  504.  
  505.   It is not known whether there exists in real life a pure V.25bis modem.
  506.   If there is, this code has never been tested on it.  See the Digitel entry.
  507. */
  508.     {
  509.     "CCITT / ITU-T V.25bis autodialer",
  510.     "",            /* pulse command */
  511.     "",            /* tone command */
  512.     40,            /* dial_time -- programmable -- */
  513.     ",:",        /* pause_chars -- "," waits for programmable time */
  514.                         /* ":" waits for dial tone */
  515.     10,            /* pause_time (seconds, just a guess) */
  516.     "",            /* wake_str (none) */
  517.     200,        /* wake_rate (msec) */
  518.     "VAL",        /* wake_prompt */
  519.     "",            /* dmode_str (none) */
  520.     "",            /* dmode_prompt (none) */
  521.     "CRN%s\015",        /* dial_str */
  522.     200,        /* dial_rate (msec) */
  523.     0,            /* No esc_time */
  524.     0,            /* No esc_char  */
  525.     "",            /* No hup_str  */
  526.     "",            /* hwfc_str */
  527.     "",            /* swfc_str */
  528.     "",            /* nofc_str */
  529.     "",            /* ec_on_str */
  530.     "",            /* ec_off_str */
  531.     "",            /* dc_on_str */
  532.     "",            /* dc_off_str */
  533.     "",            /* aa_on_str */
  534.     "",            /* aa_off_str */
  535.     "",            /* sb_on_str */
  536.     "",            /* sb_off_str */
  537.     0L,            /* max_speed */
  538.     CKD_V25,        /* capas */
  539.     NULL        /* No ok_fn    */
  540. };
  541.  
  542. static
  543. MDMINF HAYES =                /* Hayes 2400 and compatible modems */
  544.     {
  545.     "Hayes Smartmodem 2400 and compatibles",
  546.     "ATP\015",                /* pulse command */
  547.     "ATT\015",                /* tone command */
  548.     35,                    /* dial_time */
  549.     ",",                /* pause_chars */
  550.     2,                    /* pause_time */
  551. #ifdef OS2
  552.     "ATQ0&S0&C1&D2\015",        /* wake_str */
  553. #else
  554.     "ATQ0\015",                /* wake_str */
  555. #endif /* OS2 */
  556.     0,                    /* wake_rate */
  557.     "OK\015",                /* wake_prompt */
  558.     "",                    /* dmode_str */
  559.     "",                    /* dmode_prompt */
  560.     "ATD%s\015",            /* dial_str, user supplies D or T */
  561.     0,                    /* dial_rate */
  562.     1100,                /* esc_time */
  563.     43,                    /* esc_char */
  564.     "ATQ0H0\015",            /* hup_str */
  565.     "",                    /* hwfc_str */
  566.     "",                    /* swfc_str */
  567.     "",                    /* nofc_str */
  568.     "",                    /* ec_on_str */
  569.     "",                    /* ec_off_str */
  570.     "",                    /* dc_on_str */
  571.     "",                    /* dc_off_str */
  572.     "ATS0=1\015",            /* aa_on_str */
  573.     "ATS0=0\015",            /* aa_off_str */
  574.     "",                    /* sb_on_str */
  575.     "",                    /* sb_off_str */
  576.     2400L,                /* max_speed */
  577.     CKD_AT,                /* capas */
  578.     getok                /* ok_fn */
  579. };
  580.  
  581. /*
  582.   The intent of the "unknown" modem is to allow KERMIT to support
  583.   unknown modems by having the user type the entire autodial sequence
  584.   (possibly including control characters, etc.) as the "phone number".
  585.   The protocol and other characteristics of this modem are unknown, with
  586.   some "reasonable" values being chosen for some of them.  The only way to
  587.   detect if a connection is made is to look for carrier.
  588. */
  589. static
  590. MDMINF UNKNOWN =            /* Information for "Unknown" modem */
  591.     {
  592.     "Unknown",                /* name */
  593.     "",                    /* pulse command */
  594.     "",                    /* tone command */
  595.     30,                    /* dial_time */
  596.     "",                    /* pause_chars */
  597.     0,                    /* pause_time */
  598.     "",                    /* wake_str */
  599.     0,                    /* wake_rate */
  600.     "",                    /* wake_prompt */
  601.     "",                    /* dmode_str */
  602.     NULL,                /* dmode_prompt */
  603.     "%s\015",                /* dial_str */
  604.     0,                    /* dial_rate */
  605.     0,                    /* esc_time */
  606.     0,                    /* esc_char */
  607.     "",                    /* hup_str */
  608.     "",                    /* hwfc_str */
  609.     "",                    /* swfc_str */
  610.     "",                    /* nofc_str */
  611.     "",                    /* ec_on_str */
  612.     "",                    /* ec_off_str */
  613.     "",                    /* dc_on_str */
  614.     "",                    /* dc_off_str */
  615.     "",                    /* aa_on_str */
  616.     "",                    /* aa_off_str */
  617.     "",                    /* sb_on_str */
  618.     "",                    /* sb_off_str */
  619.     0L,                    /* max_speed */
  620.     0,                    /* capas */
  621.     NULL                /* ok_fn */
  622. };
  623.  
  624. #ifndef MINIDIAL
  625. static
  626. MDMINF ATTISN =                /* AT&T ISN Network */
  627.     {
  628.     "",                    /* pulse command */
  629.     "",                    /* tone command */
  630.     "AT&T ISN Network",
  631.     30,                    /* Dial time */
  632.     "",                    /* Pause characters */
  633.     0,                    /* Pause time */
  634.     "\015\015\015\015",            /* Wake string */
  635.     900,                /* Wake rate */
  636.     "DIAL",                /* Wake prompt */
  637.     "",                    /* dmode_str */
  638.     "",                    /* dmode_prompt */
  639.     "%s\015",                /* dial_str */
  640.     0,                    /* dial_rate */
  641.     0,                    /* esc_time */
  642.     0,                    /* esc_char */
  643.     "",                    /* hup_str */
  644.     "",                    /* hwfc_str */
  645.     "",                    /* swfc_str */
  646.     "",                    /* nofc_str */
  647.     "",                    /* ec_on_str */
  648.     "",                    /* ec_off_str */
  649.     "",                    /* dc_on_str */
  650.     "",                    /* dc_off_str */
  651.     "",                    /* aa_on_str */
  652.     "",                    /* aa_off_str */
  653.     "",                    /* sb_on_str */
  654.     "",                    /* sb_off_str */
  655.     0L,                    /* max_speed */
  656.     0,                    /* capas */
  657.     NULL                /* ok_fn */
  658. };
  659.  
  660. static
  661. MDMINF ATTMODEM =    /* information for AT&T switched-network modems */
  662.             /* "Number" following "dial" can include: p's and
  663.              * t's to indicate pulse or tone (default) dialing,
  664.              * + for wait for dial tone, , for pause, r for
  665.              * last number dialed, and, except for 2224B, some
  666.              * comma-delimited options like o12=y, before number.
  667.  
  668.  * "Important" options for the modems:
  669.  *
  670.  *    All:        Except for 2224B, enable option 12 for "transparent
  671.  *            data," o12=y.  If a computer port used for both
  672.  *            incoming and outgoing calls is connected to the
  673.  *            modem, disable "enter interactive mode on carriage
  674.  *            return," EICR.  The Kermit "dial" command can
  675.  *            function with EIA leads standard, EIAS.
  676.  *
  677.  *    2212C:        Internal hardware switches at their default
  678.  *            positions (four rockers down away from numbers)
  679.  *            unless EICR is not wanted (rocker down at the 4).
  680.  *            For EIAS, rocker down at the 1.
  681.  *
  682.  *    2224B:        Front-panel switch position 1 must be up (at the 1,
  683.  *            closed).  Disable EICR with position 2 down.
  684.  *            For EIAS, position 4 down.
  685.  *            All switches on the back panel down.
  686.  *
  687.  *    2224CEO:    All front-panel switches down except either 5 or 6.
  688.  *            Enable interactive flow control with o16=y.
  689.  *            Select normal asynchronous mode with o34=0 (zero).
  690.  *            Disable EICR with position 3 up.  For EIAS, 1 up.
  691.  *            Reset the modem after changing switches.
  692.  *
  693.  *    2296A:        If option 00 (zeros) is present, use o00=0.
  694.  *            Enable interactive flow control with o16=y.
  695.  *            Select normal asynchronous mode with o34=0 (zero).
  696.  *                      (available in Microcom Networking version, but
  697.  *                      not necessarily other models of the 2296A).
  698.  *            Enable modem-port flow control (if available) with
  699.  *             o42=y.  Enable asynchronous operation with o50=y.
  700.  *             Disable EICR with o69=n.  For EIAS, o66=n, using
  701.  *             front panel.
  702.  */
  703.     {
  704.    "AT&T switched-network modems",
  705.     "",                    /* pulse command */
  706.     "",                    /* tone command */
  707.     20,                    /* dial_time */
  708.     ",",                /* pause_chars */
  709.     2,                    /* pause_time */
  710.     "+",                /* wake_str */
  711.     0,                    /* wake_rate */
  712.     "",                    /* wake_prompt */
  713.     "",                    /* dmode_str */
  714.     "",                    /* dmode_prompt */
  715.     "at%s\015",                /* dial_str */
  716.     0,                    /* dial_rate */
  717.     0,                    /* esc_time */
  718.     0,                    /* esc_char */
  719.     "",                    /* hup_str */
  720.     "",                    /* hwfc_str */
  721.     "",                    /* swfc_str */
  722.     "",                    /* nofc_str */
  723.     "",                    /* ec_on_str */
  724.     "",                    /* ec_off_str */
  725.     "",                    /* dc_on_str */
  726.     "",                    /* dc_off_str */
  727.     "",                    /* aa_on_str */
  728.     "",                    /* aa_off_str */
  729.     "",                    /* sb_on_str */
  730.     "",                    /* sb_off_str */
  731.     0L,                    /* max_speed */
  732.     CKD_AT,                /* capas */
  733.     NULL                /* ok_fn */
  734. };
  735.  
  736. static
  737. MDMINF ATTDTDM = /* AT&T Digital Terminal Data Module  */
  738.          /* For dialing: KYBD switch down, others usually up. */
  739.     {
  740.     "AT&T Digital Terminal Data Module",
  741.     "",                    /* pulse command */
  742.     "",                    /* tone command */
  743.     20,                    /* dial_time */
  744.     "",                    /* pause_chars */
  745.     0,                    /* pause_time */
  746.     "",                    /* wake_str */
  747.     0,                    /* wake_rate */
  748.     "",                    /* wake_prompt */
  749.     "",                    /* dmode_str */
  750.     "",                    /* dmode_prompt */
  751.     "%s\015",                /* dial_str */ 
  752.     0,                    /* dial_rate */
  753.     0,                    /* esc_time */
  754.     0,                    /* esc_char */
  755.     "",                    /* hup_str */
  756.     "",                    /* hwfc_str */
  757.     "",                    /* swfc_str */
  758.     "",                    /* nofc_str */
  759.     "",                    /* ec_on_str */
  760.     "",                    /* ec_off_str */
  761.     "",                    /* dc_on_str */
  762.     "",                    /* dc_off_str */
  763.     "",                    /* aa_on_str */
  764.     "",                    /* aa_off_str */
  765.     "",                    /* sb_on_str */
  766.     "",                    /* sb_off_str */
  767.     0L,                    /* max_speed */
  768.     0,                    /* capas */
  769.     NULL                /* ok_fn */
  770. };
  771.  
  772. static
  773. MDMINF DIGITEL =        /* Digitel DT-22 CCITT variant used in Brazil */
  774. /*
  775.   Attempts to adhere strictly to the V.25bis specification do not produce good
  776.   results in real life.  The modem for which this code was developed: (a)
  777.   ignores parity; (b) sometimes terminates responses with LF CR instead of CR
  778.   LF; (c) has a Hayes-like escape sequence; (d) supports a hangup ("HUP")
  779.   command.  Information from Fernando Cabral in Brasilia.
  780. */
  781.     {
  782.     "Digitel DT-22 CCITT dialer",
  783.     "",                /* pulse command */
  784.     "",                /* tone command */
  785.     40,                /* dial_time -- programmable -- */
  786.     ",:",        /* pause_chars -- "," waits for programmable time */
  787.                         /* ":" waits for dial tone */
  788.     10,            /* pause_time (seconds, just a guess) */
  789.     "HUP\015",          /* wake_str (Not Standard CCITT) */
  790.     200,        /* wake_rate (msec) */
  791.     "VAL",        /* wake_prompt */
  792.     "",            /* dmode_str (none) */
  793.     "",            /* dmode_prompt (none) */
  794.     "CRN%s\015",        /* dial_str */
  795.     200,        /* dial_rate (msec) */
  796.     1100,        /* esc_time (Not Standard CCITT) */
  797.     43,            /* esc_char  (Not Standard CCITT) */
  798.     "HUP\015",        /* hup_str  (Not Standard CCITT) */
  799.     "",                    /* hwfc_str */
  800.     "",                    /* swfc_str */
  801.     "",                    /* nofc_str */
  802.     "",                    /* ec_on_str */
  803.     "",                    /* ec_off_str */
  804.     "",                    /* dc_on_str */
  805.     "",                    /* dc_off_str */
  806.     "",                    /* aa_on_str */
  807.     "",                    /* aa_off_str */
  808.     "",                    /* sb_on_str */
  809.     "",                    /* sb_off_str */
  810.     0L,                    /* max_speed */
  811.     CKD_V25,                /* capas */
  812.     getok                /* ok_fn */
  813. };
  814.  
  815. static
  816. MDMINF H_1200 =        /* Hayes 1200 and compatible modems */
  817.     {
  818.     "Hayes Smartmodem 1200 and compatibles",
  819.     "ATP\015",                /* pulse command */
  820.     "ATT\015",                /* tone command */
  821.     35,                    /* dial_time */
  822.     ",",                /* pause_chars */
  823.     2,                    /* pause_time */
  824.     "ATQ0\015",                /* wake_str */
  825.     0,                    /* wake_rate */
  826.     "OK\015",                /* wake_prompt */
  827.     "",                    /* dmode_str */
  828.     "",                    /* dmode_prompt */
  829.     "ATD%s\015",            /* dial_str */
  830.     0,                    /* dial_rate */
  831.     1100,                /* esc_time */
  832.     43,                    /* esc_char */
  833.     "ATQ0H0\015",            /* hup_str */
  834.     "",                    /* hwfc_str */
  835.     "",                    /* swfc_str */
  836.     "",                    /* nofc_str */
  837.     "",                    /* ec_on_str */
  838.     "",                    /* ec_off_str */
  839.     "",                    /* dc_on_str */
  840.     "",                    /* dc_off_str */
  841.     "ATS0=1\015",            /* aa_on_str */
  842.     "ATS0=0\015",            /* aa_off_str */
  843.     "",                    /* sb_on_str */
  844.     "",                    /* sb_off_str */
  845.     1200L,                /* max_speed */
  846.     CKD_AT,                /* capas */
  847.     getok                /* ok_fn */
  848. };
  849.  
  850. static
  851. MDMINF H_ULTRA =            /* Hayes high-speed */
  852.     {
  853.     "Hayes Ultra/Optima/Accura 96/144/288", /* U,O,A */
  854.     "ATP\015",                /* pulse command */
  855.     "ATT\015",                /* tone command */
  856.     35,                    /* dial_time */
  857.     ",",                /* pause_chars */
  858.     2,                    /* pause_time */
  859. #ifdef OS2
  860.     "ATQ0X4N1Y0&S0&C1&D2S37=0S82=128\015", /* wake_str */
  861. #else
  862.     "ATQ0X4N1Y0S37=0S82=128\015",    /* wake_str */
  863. #endif /* OS2 */
  864.     0,                    /* wake_rate */
  865.     "OK\015",                /* wake_prompt */
  866.     "",                    /* dmode_str */
  867.     "",                    /* dmode_prompt */
  868.     "ATD%s\015",            /* dial_str */
  869.     0,                    /* dial_rate */
  870.     1100,                /* esc_time */
  871.     43,                    /* esc_char */
  872.     "ATQ0H0\015",            /* hup_str */ 
  873.     "AT&K3\015",            /* hwfc_str */   /* OK for U,O */
  874.     "AT&K4\015",            /* swfc_str */   /* OK for U,O */
  875.     "AT&K0\015",            /* nofc_str */   /* OK for U,O */
  876.     "AT&Q5S36=7S48=7\015",        /* ec_on_str */  /* OK for U,O */
  877.     "AT&Q0\015",            /* ec_off_str */ /* OK for U,O */
  878.     "ATS46=2\015",            /* dc_on_str */
  879.     "ATS46=0\015",            /* dc_off_str */
  880.     "ATS0=1\015",            /* aa_on_str */
  881.     "ATS0=0\015",            /* aa_off_str */
  882.     "",                    /* sb_on_str */
  883.     "",                    /* sb_off_str */
  884.     115200L,                /* max_speed */  /* (varies) */
  885.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  886.     getok                /* ok_fn */
  887. };
  888.  
  889. static
  890. MDMINF H_ACCURA =            /* Hayes Accura */
  891.     {                    /* GUESSING IT'S LIKE ULTRA & OPTIMA */
  892.     "Hayes Accura",
  893.     "ATP\015",                /* pulse command */
  894.     "ATT\015",                /* tone command */
  895.     35,                    /* dial_time */
  896.     ",",                /* pause_chars */
  897.     2,                    /* pause_time */
  898. #ifdef OS2
  899.     "ATQ0X4N1Y0&S0&C1&D2S37=0S82=128\015", /* wake_str */
  900. #else
  901.     "ATQ0X4N1Y0S37=0S82=128\015",    /* wake_str */
  902. #endif /* OS2 */
  903.     0,                    /* wake_rate */
  904.     "OK\015",                /* wake_prompt */
  905.     "",                    /* dmode_str */
  906.     "",                    /* dmode_prompt */
  907.     "ATD%s\015",            /* dial_str */
  908.     0,                    /* dial_rate */
  909.     1100,                /* esc_time */
  910.     43,                    /* esc_char */
  911.     "ATQ0H0\015",            /* hup_str */ 
  912.     "AT&K3\015",            /* hwfc_str */
  913.     "AT&K4\015",            /* swfc_str */
  914.     "AT&K0\015",            /* nofc_str */
  915.     "AT&Q5S36=7S48=7\015",        /* ec_on_str */
  916.     "AT&Q0\015",            /* ec_off_str */
  917.     "ATS46=2\015",            /* dc_on_str */
  918.     "ATS46=0\015",            /* dc_off_str */
  919.     "ATS0=1\015",            /* aa_on_str */
  920.     "ATS0=0\015",            /* aa_off_str */
  921.     "",                    /* sb_on_str */
  922.     "",                    /* sb_off_str */
  923.     115200L,                /* max_speed */  /* (varies) */
  924.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  925.     getok                /* ok_fn */
  926. };
  927.  
  928. static
  929. MDMINF PPI =                /* Practical Peripherals  */
  930.     {
  931.     "Practical Peripherals V.22bis or higher with V.42 and V.42bis",
  932.     "ATP\015",                /* pulse command */
  933.     "ATT\015",                /* tone command */
  934.     35,                    /* dial_time */
  935.     ",",                /* pause_chars */
  936.     2,                    /* pause_time */
  937. #ifdef COMMENT
  938. /* In newer models S82 (BREAK handling) was eliminated, causing an error. */
  939. #ifdef OS2
  940.     "ATQ0X4N1&S0&C1&D2S37=0S82=128\015", /* wake_str */
  941. #else
  942.     "ATQ0X4N1S37=0S82=128\015",        /* wake_str */
  943. #endif /* OS2 */
  944. #else /* So now we use Y0 instead */
  945. #ifdef OS2
  946.     "ATQ0X4N1&S0&C1&D2Y0S37=0\015",    /* wake_str */
  947. #else
  948.     "ATQ0X4N1Y0S37=0\015",        /* wake_str */
  949. #endif /* OS2 */
  950. #endif /* COMMENT */
  951.     0,                    /* wake_rate */
  952.     "OK\015",                /* wake_prompt */
  953.     "",                    /* dmode_str */
  954.     "",                    /* dmode_prompt */
  955.     "ATD%s\015",            /* dial_str */
  956.     0,                    /* dial_rate */
  957.     1100,                /* esc_time */
  958.     43,                    /* esc_char */
  959.     "ATQ0H0\015",            /* hup_str */
  960.     "AT&K3\015",            /* hwfc_str */
  961.     "AT&K4\015",            /* swfc_str */
  962.     "AT&K0\015",            /* nofc_str */
  963.     "AT&Q5S36=7S48=7\015",        /* ec_on_str */
  964.     "AT&Q0S36=0S48=128\015",        /* ec_off_str */
  965.     "ATS46=2\015",            /* dc_on_str */
  966.     "ATS46=0\015",            /* dc_off_str */
  967.     "ATS0=1\015",            /* aa_on_str */
  968.     "ATS0=0\015",            /* aa_off_str */
  969.     "",                    /* sb_on_str  */
  970.     "",                    /* sb_off_str  */
  971.     115200L,                /* max_speed */
  972.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  973.     getok                /* ok_fn */
  974. };
  975.  
  976. static
  977. MDMINF DATAPORT =            /* AT&T Dataport  */
  978.     {
  979.     "AT&T / Paradyne DataPort V.32 or higher",
  980.     "ATP\015",                /* pulse command */
  981.     "ATT\015",                /* tone command */
  982.     35,                    /* dial_time */
  983.     ",",                /* pause_chars */
  984.     2,                    /* pause_time */
  985.     /*
  986.        Note: S41=0 (use highest modulation) omitted, since it is not
  987.        supported on the V.32 and lower models.  So let's not touch it.
  988.     */
  989. #ifdef OS2
  990.     "ATQ0E1X6&Q0S78=0\015",        /* wake_str */
  991. #else
  992.     "ATQ0E1X6&S0&C1&D2&Q0S78=0\015",    /* wake_str */
  993. #endif /* OS2 */
  994.     0,                    /* wake_rate */
  995.     "OK\015",                /* wake_prompt */
  996.     "",                    /* dmode_str */
  997.     "",                    /* dmode_prompt */
  998.     "ATD%s\015",            /* dial_str */
  999.     0,                    /* dial_rate */
  1000.     1100,                /* esc_time */
  1001.     43,                    /* esc_char */
  1002.     "ATQ0H0\015",            /* hup_str */
  1003.     "AT\\Q3\015",            /* hwfc_str */
  1004.     "AT\\Q1\\X0\015",            /* swfc_str */
  1005.     "AT\\Q0\015",            /* nofc_str */
  1006.     "AT\\N7\015",            /* ec_on_str */
  1007.     "AT\\N0\015",            /* ec_off_str */
  1008.     "AT%C1\015",            /* dc_on_str */
  1009.     "AT%C0\015",            /* dc_off_str */
  1010.     "ATS0=1\015",            /* aa_on_str */
  1011.     "ATS0=0\015",            /* aa_off_str */
  1012.     "",                    /* sb_on_str */
  1013.     "",                    /* sb_off_str */
  1014.     57600L,                /* max_speed */
  1015.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1016.     getok                /* ok_fn */
  1017. };
  1018.  
  1019. static
  1020. MDMINF UCOM_AT =            /* Microcom DeskPorte FAST ES 28.8 */
  1021.     {
  1022.     "Microcom DeskPorte FAST 28.8",
  1023.     "ATP\015",                /* pulse command */
  1024.     "ATT\015",                /* tone command */
  1025.     35,                    /* dial_time */
  1026.     ",",                /* pause_chars */
  1027.     2,                    /* pause_time */
  1028. #ifdef OS2
  1029.     "ATQ0X4\\N0F0&S0&C1&D2\\K5\015",    /* wake_str */
  1030. #else
  1031.     "ATQ0X4F0\\K5\015",            /* wake_str */
  1032. #endif /* OS2 */
  1033.     0,                    /* wake_rate */
  1034.     "OK\015",                /* wake_prompt */
  1035.     "",                    /* dmode_str */
  1036.     "",                    /* dmode_prompt */
  1037.     "ATD%s\015",            /* dial_str */
  1038.     0,                    /* dial_rate */
  1039.     1100,                /* esc_time */
  1040.     43,                    /* esc_char */
  1041.     "ATQ0H0\015",            /* hup_str */
  1042.     "AT\\Q3\015",            /* hwfc_str */
  1043.     "AT\\Q1\015",            /* swfc_str */
  1044.     "AT\\H0\\Q0\015",            /* nofc_str */
  1045.     "AT\\N3\015",            /* ec_on_str */
  1046.     "AT\015",                /* ec_off_str */
  1047.     "AT%C3\015",            /* dc_on_str */
  1048.     "AT%C0\015",            /* dc_off_str */
  1049.     "ATS0=1\015",            /* aa_on_str */
  1050.     "ATS0=0\015",            /* aa_off_str */
  1051.     "AT-J0\015",            /* sb_on_str */
  1052.     "AT-J1\015",            /* sb_off_str */
  1053.     115200L,                /* max_speed */
  1054.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1055.     getok                /* ok_fn */
  1056. };
  1057.  
  1058. static
  1059. MDMINF ZOOM =                /* Zoom Telephonics V.32bis  */
  1060.     {
  1061.     "Zoom Telephonics V.32bis",
  1062.     "ATP\015",                /* pulse command */
  1063.     "ATT\015",                /* tone command */
  1064.     35,                    /* dial_time */
  1065.     ",",                /* pause_chars */
  1066.     2,                    /* pause_time */
  1067. #ifdef OS2
  1068.     "ATQ0E1N1W1X4&S0&C1&D2S82=128S95=47\015", /* wake_str */
  1069. #else
  1070.     "ATQ0E1N1W1X4S82=128S95=47\015",    /* wake_str */
  1071. #endif /* OS2 */
  1072.     0,                    /* wake_rate */
  1073.     "OK\015",                /* wake_prompt */
  1074.     "",                    /* dmode_str */
  1075.     "",                    /* dmode_prompt */
  1076.     "ATD%s\015",            /* dial_str */
  1077.     0,                    /* dial_rate */
  1078.     1100,                /* esc_time */
  1079.     43,                    /* esc_char */
  1080.     "ATQ0H0\015",            /* hup_str */
  1081.     "AT&K3\015",            /* hwfc_str */
  1082.     "AT&K4\015",            /* swfc_str */
  1083.     "AT&K0\015",            /* nofc_str */
  1084.     "AT&Q5S36=7S48=7\015",        /* ec_on_str */
  1085.     "AT&Q0\015",            /* ec_off_str */
  1086.     "ATS46=138\015",            /* dc_on_str */
  1087.     "ATS46=136\015",            /* dc_off_str */
  1088.     "ATS0=1\015",            /* aa_on_str */
  1089.     "ATS0=0\015",            /* aa_off_str */
  1090.     "",                    /* sb_on_str */
  1091.     "",                    /* sb_off_str */
  1092.     57600L,                /* max_speed */
  1093.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1094.     getok                /* ok_fn */
  1095. };
  1096.  
  1097. static
  1098. MDMINF ZYXEL =                /* ZyXEL U-Series */
  1099.     {
  1100.     "ZyXEL U-Series V.32bis or higher",
  1101.     "ATP\015",                /* pulse command */
  1102.     "ATT\015",                /* tone command */
  1103.     35,                    /* dial_time */
  1104.     ",",                /* pause_chars */
  1105.     2,                    /* pause_time */
  1106. #ifdef OS2
  1107.     "ATQ0E1&S0&C1&D2&N0X5&Y1\015",    /* wake_str */
  1108. #else
  1109.     "ATQ0E1&N0X5&Y1\015",        /* wake_str */
  1110. #endif /* OS2 */
  1111.     0,                    /* wake_rate */
  1112.     "OK\015",                /* wake_prompt */
  1113.     "",                    /* dmode_str */
  1114.     "",                    /* dmode_prompt */
  1115.     "ATD%s\015",            /* dial_str */
  1116.     0,                    /* dial_rate */
  1117.     1100,                /* esc_time */
  1118.     43,                    /* esc_char */
  1119.     "ATQ0H0\015",            /* hup_str */
  1120.     "AT&H3\015",            /* hwfc_str */
  1121.     "AT&H4\015",            /* swfc_str */
  1122.     "AT&H0\015",            /* nofc_str */
  1123.     "AT&K3\015",            /* ec_on_str */
  1124.     "AT&K0\015",            /* ec_off_str */
  1125.     "AT&K4\015",            /* dc_on_str */
  1126.     "AT&K3\015",            /* dc_off_str */
  1127.     "ATS0=1\015",            /* aa_on_str */
  1128.     "ATS0=0\015",            /* aa_off_str */
  1129.     "",                    /* sb_on_str */
  1130.     "",                    /* sb_off_str */
  1131.     57600L,                /* max_speed */
  1132.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1133.     getok                /* ok_fn */
  1134. };
  1135.  
  1136. static
  1137. MDMINF ZOLTRIX =            /* Zoltrix */
  1138.     {
  1139.     "Zoltrix V.32bis and V.34 modems with Rockwell ACI chipset",
  1140.     "ATP\015",                /* pulse command */
  1141.     "ATT\015",                /* tone command */
  1142.     35,                    /* dial_time */
  1143.     ",",                /* pause_chars */
  1144.     2,                    /* pause_time */
  1145. #ifdef OS2
  1146.    "ATQ0E1F0W1X4Y0&S0&C1&D2\\K5S82=128S95=41\015", /* wake_str */
  1147. #else
  1148.    "ATQ0E1F0W1X4Y0\\K5S82=128S95=41\015", /* wake_str */
  1149. #endif /* OS2 */
  1150.     0,                    /* wake_rate */
  1151.     "OK\015",                /* wake_prompt */
  1152.     "",                    /* dmode_str */
  1153.     "",                    /* dmode_prompt */
  1154.     "ATD%s\015",            /* dial_str */
  1155.     0,                    /* dial_rate */
  1156.     1100,                /* esc_time */
  1157.     43,                    /* esc_char */
  1158.     "ATQ0H0\015",            /* hup_str */
  1159.     "AT&K3\015",            /* hwfc_str */
  1160.     "AT&K4S32=17S33=19\015",        /* swfc_str */
  1161.     "AT&K0\015",            /* nofc_str */
  1162.     "AT\\N3\015",            /* ec_on_str */
  1163.     "AT\\N1\015",            /* ec_off_str */
  1164.     "ATS46=138%C3\015",            /* dc_on_str */
  1165.     "ATS46=136%C0\015",            /* dc_off_str */
  1166.     "ATS0=1\015",            /* aa_on_str */
  1167.     "ATS0=0\015",            /* aa_off_str */
  1168.     "AT\\N0\015",            /* sb_on_str */
  1169.     "AT&Q0\015",            /* sb_off_str */
  1170.     57600L,                /* max_speed */
  1171.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1172.     getok                /* ok_fn */
  1173. };
  1174.  
  1175. static
  1176. MDMINF MOTOROLA = {            /* Motorola FasTalk II or Lifestyle */
  1177. /*
  1178.   "\E" and "\X" commands removed - Motorola Lifestyle doesn't have them.
  1179.      \E0 = Don't echo while online
  1180.      \X0 = Process Xon/Xoff but don't pass through
  1181. */
  1182.     "Motorola FasTalk II or Lifestyle",    /* Name */
  1183.     "ATP\015",                /* pulse command */
  1184.     "ATT\015",                /* tone command */
  1185.     35,                    /* dial_time */
  1186.     ",",                /* pause_chars */
  1187.     2,                    /* pause_time */
  1188. #ifdef OS2
  1189.     "ATQ0E1X4&S0&C1&D2\\K5\\V1\015",    /* wake_str */
  1190. #else
  1191.     "ATQ0E1X4\\K5\\V1\015",        /* wake_str */
  1192. #endif /* OS2 */
  1193.     0,                    /* wake_rate */
  1194.     "OK\015",                /* wake_prompt */
  1195.     "",                    /* dmode_str */
  1196.     "",                    /* dmode_prompt */
  1197.     "ATD%s\015",            /* dial_str */
  1198.     0,                    /* dial_rate */
  1199.     1100,                /* esc_time */
  1200.     43,                    /* esc_char */
  1201.     "ATQ0H0\015",            /* hup_str */
  1202.     "AT\\Q3\015",            /* hwfc_str */
  1203.     "AT\\Q1\015",            /* swfc_str */
  1204.     "AT\\Q0\015",            /* nofc_str */
  1205.     "AT\\N6\015",            /* ec_on_str */
  1206.     "AT\\N1\015",            /* ec_off_str */
  1207.     "AT%C1\015",            /* dc_on_str */
  1208.     "AT%C0\015",            /* dc_off_str */
  1209.     "ATS0=1\015",            /* aa_on_str */
  1210.     "ATS0=0\015",            /* aa_off_str */
  1211.     "AT\\J0\015",            /* sb_on_str */
  1212.     "AT\\J1\015",            /* sb_off_str */
  1213.     57600L,                /* max_speed */
  1214.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1215.     getok                /* ok_fn */
  1216. };
  1217.  
  1218. static
  1219. MDMINF BOCA =                /* Boca */
  1220.     {
  1221.     "BOCA 14.4 Faxmodem",
  1222.     "ATP\015",                /* pulse command */
  1223.     "ATT\015",                /* tone command */
  1224.     35,                    /* dial_time */
  1225.     ",",                /* pause_chars */
  1226.     2,                    /* pause_time */
  1227. #ifdef OS2
  1228.     "ATQ0E1F1N1W1&S0&C1&D2\\K5S37=11S82=128S95=47X4\015", /* wake_str */
  1229. #else
  1230.     "ATQ0E1F1N1W1\\K5S37=11S82=128S95=47X4\015", /* wake_str */
  1231. #endif /* OS2 */
  1232.     0,                    /* wake_rate */
  1233.     "OK\015",                /* wake_prompt */
  1234.     "",                    /* dmode_str */
  1235.     "",                    /* dmode_prompt */
  1236.     "ATD%s\015",            /* dial_str */
  1237.     0,                    /* dial_rate */
  1238.     1100,                /* esc_time */
  1239.     43,                    /* esc_char */
  1240.     "ATQ0H0\015",            /* hup_str */
  1241.     "AT&K3\015",            /* hwfc_str */
  1242.     "AT&K4\015",            /* swfc_str */
  1243.     "AT&K0\015",            /* nofc_str */
  1244.     "AT\\N3S36=7S48=7\015",        /* ec_on_str */
  1245.     "AT\\N1\015",            /* ec_off_str */
  1246.     "ATS46=138\015",            /* dc_on_str */
  1247.     "ATS46=136\015",            /* dc_off_str */
  1248.     "ATS0=1\015",            /* aa_on_str */
  1249.     "ATS0=0\015",            /* aa_off_str */
  1250.     "",                    /* sb_on_str */
  1251.     "",                    /* sb_off_str */
  1252.     57600L,                /* max_speed */
  1253.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1254.     getok                /* ok_fn */
  1255. };
  1256.  
  1257. static
  1258. MDMINF INTEL =                /* Intel */
  1259.     {
  1260.     "Intel High-Speed Faxmodem",
  1261.     "ATP\015",                /* pulse command */
  1262.     "ATT\015",                /* tone command */
  1263.     35,                    /* dial_time */
  1264.     ",",                /* pause_chars */
  1265.     2,                    /* pause_time */
  1266. #ifdef OS2
  1267.     "ATQ0E1Y0X4&S0&C1&D2\\K1\\V2S25=50\015", /* wake_str */
  1268. #else
  1269.     "ATQ0E1Y0X4\\K1\\V2S25=50\015", /* wake_str */
  1270. #endif /* OS2 */
  1271.     0,                    /* wake_rate */
  1272.     "OK\015",                /* wake_prompt */
  1273.     "ATB1+FCLASS=0\015",        /* dmode_str */ 
  1274.     "OK\015",                /* dmode_prompt */
  1275.     "ATD%s\015",            /* dial_str */
  1276.     0,                    /* dial_rate */
  1277.     1100,                /* esc_time */
  1278.     43,                    /* esc_char */
  1279.     "ATQ0H0\015",            /* hup_str */
  1280.     "AT\\G1\\Q3\015",            /* hwfc_str */
  1281.     "AT\\G1\\Q1\\X0\015",        /* swfc_str */
  1282.     "AT\\G0\015",            /* nofc_str */
  1283.     "AT\\J0\\N3\"H3\015",        /* ec_on_str */
  1284.     "AT\\N1\015",            /* ec_off_str */
  1285.     "AT%C1\015",            /* dc_on_str */
  1286.     "AT%C0\015",            /* dc_off_str */
  1287.     "ATS0=1\015",            /* aa_on_str */
  1288.     "ATS0=0\015",            /* aa_off_str */
  1289.     "",                    /* sb_on_str */
  1290.     "",                    /* sb_off_str */
  1291.     57600L,                /* max_speed */
  1292.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1293.     getok                /* ok_fn */
  1294. };
  1295.  
  1296. static
  1297. MDMINF MULTITECH =            /* Multitech */
  1298.     {
  1299.     "Multitech MT1432 Series MultiModem II",
  1300.     "ATP\015",                /* pulse command */
  1301.     "ATT\015",                /* tone command */
  1302.     35,                    /* dial_time */
  1303.     ",",                /* pause_chars */
  1304.     2,                    /* pause_time */
  1305. #ifdef OS2
  1306.     "ATQ0E1X4&S0&C1&D2&E8&Q0%E1#P0\015", /* wake_str */
  1307. #else
  1308.     "ATQ0E1X4&E8&Q0%E1#P0\015",        /* wake_str */
  1309. #endif /* OS2 */
  1310.     0,                    /* wake_rate */
  1311.     "OK\015",                /* wake_prompt */
  1312.     "",                    /* dmode_str */
  1313.     "",                    /* dmode_prompt */
  1314.     "ATD%s\015",            /* dial_str */
  1315.     0,                    /* dial_rate */
  1316.     1100,                /* esc_time */
  1317.     43,                    /* esc_char */
  1318.     "ATQ0H0\015",            /* hup_str */
  1319.     "AT&E4&E7&E8&E11&E13\015",        /* hwfc_str */
  1320.     "AT&E5&E6&E8&E11&E13\015",        /* swfc_str */
  1321.     "AT&E3&E7&E8&E10&E12\015",        /* nofc_str */
  1322.     "AT&E1\015",            /* ec_on_str */
  1323.     "AT#L0&E0\015",            /* ec_off_str */
  1324.     "AT&E15\015",            /* dc_on_str */
  1325.     "AT&E14\015",            /* dc_off_str */
  1326.     "ATS0=1\015",            /* aa_on_str */
  1327.     "ATS0=0\015",            /* aa_off_str */
  1328.     "AT$BA0\015",            /* sb_on_str (= "baud adjust off") */
  1329.     "AT$BA1\015",            /* sb_off_str */
  1330.     57600L,                /* max_speed */
  1331.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1332.     getok                /* ok_fn */
  1333. };
  1334.  
  1335. static
  1336. MDMINF SUPRA =                /* Supra */
  1337.     {
  1338.     "SupraFAXModem 144 or 288",
  1339.     "ATP\015",                /* pulse command */
  1340.     "ATT\015",                /* tone command */
  1341.     35,                    /* dial_time */
  1342.     ",",                /* pause_chars */
  1343.     2,                    /* pause_time */
  1344. #ifdef OS2
  1345.     "ATQ0E1N1W0X4Y0&S0&C1&D2\\K5S82=128\015", /* wake_str */
  1346. #else
  1347.     "ATQ0E1N1W0X4Y0\\K5S82=128\015",    /* wake_str */
  1348. #endif /* OS2 */
  1349.     0,                    /* wake_rate */
  1350.     "OK\015",                /* wake_prompt */
  1351.     "",                    /* dmode_str */
  1352.     "",                    /* dmode_prompt */
  1353.     "ATD%s\015",            /* dial_str */
  1354.     0,                    /* dial_rate */
  1355.     1100,                /* esc_time */
  1356.     43,                    /* esc_char */
  1357.     "ATQ0H0\015",            /* hup_str */
  1358.     "AT&K3\015",            /* hwfc_str */
  1359.     "AT&K4\015",            /* swfc_str */
  1360.     "AT&K0\015",            /* nofc_str */
  1361.     "AT&Q5\\N3S48=7\015",        /* ec_on_str */
  1362.     "AT&Q0\\N1\015",            /* ec_off_str */
  1363.     "AT%C1S46=138\015",            /* dc_on_str */
  1364.     "AT%C0S46=136\015",            /* dc_off_str */
  1365.     "ATS0=1\015",            /* aa_on_str */
  1366.     "ATS0=0\015",            /* aa_off_str */
  1367.     "",                    /* sb_on_str */
  1368.     "",                    /* sb_off_str */
  1369.     57600L,                /* max_speed */
  1370.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1371.     getok                /* ok_fn */
  1372. };
  1373.  
  1374. static
  1375. MDMINF MAXTECH =            /* MaxTech */
  1376.     {
  1377.     "MaxTech XM288EA or GVC FAXModem",
  1378.     "ATP\015",                /* pulse command */
  1379.     "ATT\015",                /* tone command */
  1380.     35,                    /* dial_time */
  1381.     ",",                /* pause_chars */
  1382.     2,                    /* pause_time */
  1383. #ifdef OS2
  1384.     "ATQ0E1X4Y0&S0&C1&D2&L0&M0\\K5\015", /* wake_str */
  1385. #else
  1386.     "ATQ0E1X4Y0&L0&M0\\K5\015",        /* wake_str */
  1387. #endif /* OS2 */
  1388.     0,                    /* wake_rate */
  1389.     "OK\015",                /* wake_prompt */
  1390.     "",                    /* dmode_str */
  1391.     "",                    /* dmode_prompt */
  1392.     "ATD%s\015",            /* dial_str */
  1393.     0,                    /* dial_rate */
  1394.     1100,                /* esc_time */
  1395.     43,                    /* esc_char */
  1396.     "ATQ0H0\015",            /* hup_str */
  1397.     "AT\\Q3\015",            /* hwfc_str */
  1398.     "AT\\Q1\\X0\015",            /* swfc_str */
  1399.     "AT\\Q0\015",            /* nofc_str */
  1400.     "AT\\N6\015",            /* ec_on_str */
  1401.     "AT\\N0\015",            /* ec_off_str */
  1402.     "AT\\N6%C1\015",            /* dc_on_str */
  1403.     "AT\\N6%C0\015",            /* dc_off_str */
  1404.     "ATS0=1\015",            /* aa_on_str */
  1405.     "ATS0=0\015",            /* aa_off_str */
  1406.     "",                    /* sb_on_str */
  1407.     "",                    /* sb_off_str */
  1408.     115200L,                /* max_speed */
  1409.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1410.     getok                /* ok_fn */
  1411. };
  1412.  
  1413. static
  1414. MDMINF ROLM =        /* IBM / Siemens / Rolm 8000, 9000, 9751 CBX DCM */
  1415.     {
  1416.     "IBM/Siemens/Rolm CBX Data Communications Module",
  1417.     "",                    /* pulse command */
  1418.     "",                    /* tone command */
  1419.     60,                    /* dial_time */
  1420.     "",                    /* pause_chars */
  1421.     0,                    /* pause_time */
  1422.     "\015\015",                /* wake_str */
  1423.     5,                    /* wake_rate */
  1424.     "MODIFY?",                /* wake_prompt */
  1425.     "",                    /* dmode_str */
  1426.     "",                    /* dmode_prompt */
  1427.     "CALL %s\015",            /* dial_str */
  1428.     0,                    /* dial_rate */
  1429.     0,                    /* esc_time */
  1430.     0,                    /* esc_char */
  1431.     "",                    /* hup_str */
  1432.     "",                    /* hwfc_str */
  1433.     "",                    /* swfc_str */
  1434.     "",                    /* nofc_str */
  1435.     "",                    /* ec_on_str */
  1436.     "",                    /* ec_off_str */
  1437.     "",                    /* dc_on_str */
  1438.     "",                    /* dc_off_str */
  1439.     "",                    /* aa_on_str */
  1440.     "",                    /* aa_off_str */
  1441.     "",                    /* sb_on_str */
  1442.     "",                    /* sb_off_str */
  1443.     19200L,                /* max_speed */
  1444.     0,                    /* capas */
  1445.     NULL                /* ok_fn */
  1446. };
  1447.  
  1448. static
  1449. MDMINF USR =                /* USR Courier and Sportster modems */
  1450.     {
  1451.     "US Robotics Courier or Sportster",
  1452.     "ATP\015",                /* pulse command */
  1453.     "ATT\015",                /* tone command */
  1454.     35,                    /* dial_time */
  1455.     ",",                /* pause_chars */
  1456.     2,                    /* pause_time */
  1457. #ifdef OS2
  1458.     "ATQ0X4&A3&S0&C1&D2&N0&Y3\015",    /* wake_str */
  1459. #else
  1460.     "ATQ0X4&A3&N0&Y3\015",        /* wake_str */
  1461. #endif /* OS2 */
  1462.     0,                    /* wake_rate */
  1463.     "OK\015",                /* wake_prompt */
  1464.     "",                    /* dmode_str */
  1465.     "",                    /* dmode_prompt */
  1466.     "ATD%s\015",            /* dial_str */
  1467.     0,                    /* dial_rate */
  1468.     1100,                /* esc_time */
  1469.     43,                    /* esc_char */
  1470.     "ATQ0H0\015",            /* hup_str */
  1471.     "AT&H1&R2&I0\015",            /* hwfc_str */
  1472.     "AT&H2&R1&I2\015",            /* swfc_str */
  1473.     "AT&H0&R1&I0\015",            /* nofc_str */
  1474.     "AT&M4&B1\015",            /* ec_on_str */
  1475.     "AT&M0\015",            /* ec_off_str */
  1476.     "AT&K1\015",            /* dc_on_str */
  1477.     "AT&K0\015",            /* dc_off_str */
  1478.     "ATS0=1\015",            /* aa_on_str */
  1479.     "ATS0=0\015",            /* aa_off_str */
  1480.     "",                    /* sb_on_str */
  1481.     "",                    /* sb_off_str */
  1482.     57600L,                /* max_speed */
  1483.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1484.     getok                /* ok_fn */
  1485. };
  1486.  
  1487. #ifdef OLDTBCODE
  1488. static
  1489. MDMINF TELEBIT =            /* All Telebits */
  1490.     {
  1491.     "Telebit - all models",
  1492.     "ATP\015",                /* pulse command */
  1493.     "ATT\015",                /* tone command */
  1494.     60,                    /* dial_time */
  1495.     ",",                /* pause_chars */
  1496.     2,                    /* pause_time */
  1497. /*
  1498.   NOTE: The wake_string MUST contain the I command (model query), and otherwise
  1499.   must contain commands that work on ALL Telebit models.  Here we ensure that
  1500.   result codes are returned (Q0), and ask for extended result codes (X1), and
  1501.   ensure that the escape sequence is +++ and it is enabled.  And also, make
  1502.   sure the final character is not a digit (whose echo might be mistaken for a
  1503.   result code).  The Ctrl-Q (\021) and multiple A's are recommended by Telebit.
  1504. */
  1505. #ifdef OS2
  1506.     "\021AAAAATQ0X1&S0&C1&D2S12=50 S50=0 I\015", /* wake_str. */
  1507. #else
  1508.     "\021AAAAATQ0X1S12=50 S50=0 I\015", /* wake_str. */
  1509. #endif /* OS2 */
  1510.     100,                /* wake_rate = 100 msec */
  1511.     "OK\015",                /* wake_prompt */
  1512.     "",                    /* dmode_str */
  1513.     "",                    /* dmode_prompt */
  1514.     "ATD%s\015",            /* dial_str, Note: no T or P */
  1515.     80,                    /* dial_rate */
  1516.     1100,                /* esc_time (guard time) */
  1517.     43,                    /* esc_char */
  1518.     "ATQ0H0\015",            /* hup_str */
  1519.     "ATS58=2S68=2\015",            /* hwfc_str */
  1520.     "ATS58=3S68=3\015",            /* swfc_str */
  1521.     "ATS58=0S68=0\015",            /* nofc_str */
  1522.     "",                    /* ec_on_str */
  1523.     "",                    /* ec_off_str */
  1524.     "",                    /* dc_on_str */
  1525.     "",                    /* dc_off_str */
  1526.     "ATS0=1\015",            /* aa_on_str */
  1527.     "ATS0=0\015",            /* aa_off_str */
  1528.     "",                    /* sb_on_str */
  1529.     "",                    /* sb_off_str */
  1530.     0L,                    /* max_speed */
  1531.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW|CKD_TB, /* capas */
  1532.     getok                /* ok_fn */
  1533. };
  1534.  
  1535. #else
  1536.  
  1537. static
  1538. MDMINF OLDTB =                /* Old Telebits */
  1539.     {
  1540.     "Telebit TrailBlazer, T1000, T1500, T2000, T2500",
  1541.     "ATP\015",                /* pulse command */
  1542.     "ATT\015",                /* tone command */
  1543.     60,                    /* dial_time */
  1544.     ",",                /* pause_chars */
  1545.     2,                    /* pause_time */
  1546. #ifdef OS2
  1547.     "\021AAAAATQ0X1&S0&C1&D2S12=50S50=0S54=3\015", /* wake_str. */
  1548. #else
  1549.     "\021AAAAATQ0X1S12=50S50=0S54=3\015", /* wake_str. */
  1550. #endif /* OS2 */
  1551.     100,                /* wake_rate = 100 msec */
  1552.     "OK\015",                /* wake_prompt */
  1553.     "",                    /* dmode_str */
  1554.     "",                    /* dmode_prompt */
  1555.     "ATD%s\015",            /* dial_str, Note: no T or P */
  1556.     80,                    /* dial_rate */
  1557.     1100,                /* esc_time (guard time) */
  1558.     43,                    /* esc_char */
  1559.     "ATQ0H0\015",            /* hup_str */
  1560.     "ATS58=2S68=2\015",            /* hwfc_str */
  1561.     "ATS58=3S68=3S69=0\015",        /* swfc_str */
  1562.     "ATS58=0S68=0\015",            /* nofc_str */
  1563.     "ATS66=1S95=2\015",            /* ec_on_str */
  1564.     "ATS95=0\015",            /* ec_off_str */
  1565.     "ATS110=1S96=1\015",        /* dc_on_str */
  1566.     "ATS110=0S96=0\015",        /* dc_off_str */
  1567.     "ATS0=1\015",            /* aa_on_str */
  1568.     "ATS0=0\015",            /* aa_off_str */
  1569.     "",                    /* sb_on_str */
  1570.     "",                    /* sb_off_str */
  1571.     19200L,                /* max_speed */
  1572.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW|CKD_TB|CKD_KS, /* capas */
  1573.     getok                /* ok_fn */
  1574. };
  1575.  
  1576. static
  1577. MDMINF NEWTB =                /* New Telebits */
  1578.     {
  1579.     "Telebit T1600, T3000, QBlazer, WorldBlazer, etc.",
  1580.     "ATP\015",                /* pulse command */
  1581.     "ATT\015",                /* tone command */
  1582.     60,                    /* dial_time */
  1583.     ",",                /* pause_chars */
  1584.     2,                    /* pause_time */
  1585. #ifdef OS2
  1586.     "\021AAAAATQ0X2&S0&C1&D2S12=50S50=0S61=1S63=0\015", /* wake_str. */
  1587. #else
  1588.     "\021AAAAATQ0X2S12=50S50=0S61=1S63=0\015", /* wake_str. */
  1589. #endif /* OS2 */
  1590.     100,                /* wake_rate = 100 msec */
  1591.     "OK\015",                /* wake_prompt */
  1592.     "",                    /* dmode_str */
  1593.     "",                    /* dmode_prompt */
  1594.     "ATD%s\015",            /* dial_str, Note: no T or P */
  1595.     80,                    /* dial_rate */
  1596.     1100,                /* esc_time (guard time) */
  1597.     43,                    /* esc_char */
  1598.     "ATQ0H0\015",            /* hup_str */
  1599.     "ATS58=2S68=2\015",            /* hwfc_str */
  1600.     "ATS58=3S68=3\015",            /* swfc_str */
  1601.     "ATS58=0S68=0\015",            /* nofc_str */
  1602.     "ATS180=3\015",            /* ec_on_str */
  1603.     "ATS180=0\015",            /* ec_off_str */
  1604.     "ATS190=1\015",            /* dc_on_str */
  1605.     "ATS190=0\015",            /* dc_off_str */
  1606.     "ATS0=1\015",            /* aa_on_str */
  1607.     "ATS0=0\015",            /* aa_off_str */
  1608.     "",                    /* sb_on_str */
  1609.     "",                    /* sb_off_str */
  1610.     38400L,                /* max_speed */
  1611.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW|CKD_TB|CKD_KS, /* capas */
  1612.     getok                /* ok_fn */
  1613. };
  1614. #endif /* OLDTBCODE */
  1615.  
  1616. static
  1617. MDMINF DUMMY = /* dummy information for modems that are handled elsewhere */
  1618.     {
  1619.     "(dummy)",
  1620.     "",                    /* pulse command */
  1621.     "",                    /* tone command */
  1622.     30,                    /* dial_time */
  1623.     "",                    /* pause_chars */
  1624.     0,                    /* pause_time */
  1625.     "",                    /* wake_str */
  1626.     0,                    /* wake_rate */
  1627.     "",                    /* wake_prompt */
  1628.     "",                    /* dmode_str */
  1629.     NULL,                /* dmode_prompt */
  1630.     "%s\015",                /* dial_str */
  1631.     0,                    /* dial_rate */
  1632.     0,                    /* esc_time */
  1633.     0,                    /* esc_char */
  1634.     "",                    /* hup_str */
  1635.     "",                    /* hwfc_str */
  1636.     "",                    /* swfc_str */
  1637.     "",                    /* nofc_str */
  1638.     "",                    /* ec_on_str */
  1639.     "",                    /* ec_off_str */
  1640.     "",                    /* dc_on_str */
  1641.     "",                    /* dc_off_str */
  1642.     "",                    /* aa_on_str */
  1643.     "",                    /* aa_off_str */
  1644.     "",                    /* sb_on_str */
  1645.     "",                    /* sb_off_str */
  1646.     0L,                    /* max_speed */
  1647.     0,                    /* capas */
  1648.     NULL                /* ok_fn */
  1649. };
  1650.  
  1651. static
  1652. MDMINF RWV32 =                /* Generic Rockwell V.32 */
  1653.     {
  1654.     "Generic Rockwell V.32 modem",    /* ATI3, ATI4, and ATI6 for details */
  1655.     "ATP\015",                /* pulse command */
  1656.     "ATT\015",                /* tone command */
  1657.     35,                    /* dial_time */
  1658.     ",",                /* pause_chars */
  1659.     2,                    /* pause_time */
  1660. #ifdef OS2
  1661.     "ATQ0X4W1Y0&S0&C1&D2%E2\\K5+FCLASS=0N1S37=0\015", /* wake_str */
  1662. #else
  1663.     "ATQ0X4W1Y0%E2\\K5+FCLASS=0N1S37=0\015", /* wake_str */
  1664. #endif /* OS2 */
  1665.     0,                    /* wake_rate */
  1666.     "OK\015",                /* wake_prompt */
  1667.     "",                    /* dmode_str */
  1668.     "",                    /* dmode_prompt */
  1669.     "ATD%s\015",            /* dial_str */
  1670.     0,                    /* dial_rate */
  1671.     1100,                /* esc_time */
  1672.     43,                    /* esc_char */
  1673.     "ATQ0H0\015",            /* hup_str */
  1674.     "AT&K3\015",            /* hwfc_str */
  1675.     "AT&K4S32=17S33=19\015",        /* swfc_str */
  1676.     "AT&K0\015",            /* nofc_str */
  1677.     "AT&Q5\\N0\015",            /* ec_on_str */
  1678.     "AT&Q0\\N1\015",            /* ec_off_str */
  1679.     "AT%C1\015",            /* dc_on_str */
  1680.     "AT%C0\015",            /* dc_off_str */
  1681.     "ATS0=1\015",            /* aa_on_str */
  1682.     "ATS0=0\015",            /* aa_off_str */
  1683.     "",                    /* sb_on_str */
  1684.     "",                    /* sb_off_str */
  1685.     57600L,                /* max_speed */
  1686.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1687.     getok                /* ok_fn */
  1688. };
  1689.  
  1690. static
  1691. MDMINF RWV32B =                /* Generic Rockwell V.32bis */
  1692.     {
  1693.     "Generic Rockwell V.32bis modem",    /* ATI3, ATI4, and ATI6 for details */
  1694.     "ATP\015",                /* pulse command */
  1695.     "ATT\015",                /* tone command */
  1696.     35,                    /* dial_time */
  1697.     ",",                /* pause_chars */
  1698.     2,                    /* pause_time */
  1699. #ifdef OS2
  1700.     "ATQ0X4W1Y0&S0&C1&D2%E2\\K5+FCLASS=0N1S37=0\015", /* wake_str */
  1701. #else
  1702.     "ATQ0X4W1Y0%E2\\K5+FCLASS=0N1S37=0\015", /* wake_str */
  1703. #endif /* OS2 */
  1704.     0,                    /* wake_rate */
  1705.     "OK\015",                /* wake_prompt */
  1706.     "",                    /* dmode_str */
  1707.     "",                    /* dmode_prompt */
  1708.     "ATD%s\015",            /* dial_str */
  1709.     0,                    /* dial_rate */
  1710.     1100,                /* esc_time */
  1711.     43,                    /* esc_char */
  1712.     "ATQ0H0\015",            /* hup_str */
  1713.     "AT&K3\015",            /* hwfc_str */
  1714.     "AT&K4S32=17S33=19\015",        /* swfc_str */
  1715.     "AT&K0\015",            /* nofc_str */
  1716.     "AT&Q5S36=7S48=7\\N3\015",        /* ec_on_str */
  1717.     "AT&Q0S48=128\\N1\015",        /* ec_off_str */
  1718.     "ATS46=138%C1\015",            /* dc_on_str */
  1719.     "ATS46=136%C0\015",            /* dc_off_str */
  1720.     "ATS0=1\015",            /* aa_on_str */
  1721.     "ATS0=0\015",            /* aa_off_str */
  1722.     "",                    /* sb_on_str */
  1723.     "",                    /* sb_off_str */
  1724.     57600L,                /* max_speed */
  1725.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1726.     getok                /* ok_fn */
  1727. };
  1728.  
  1729. static
  1730. MDMINF RWV34 =                /* Generic Rockwell V.34 Data/Fax */
  1731.     {
  1732.     "Generic Rockwell V.34 modem",    /* ATI3, ATI4, and ATI6 for details */
  1733.     "ATP\015",                /* pulse command */
  1734.     "ATT\015",                /* tone command */
  1735.     35,                    /* dial_time */
  1736.     ",",                /* pause_chars */
  1737.     2,                    /* pause_time */
  1738. #ifdef OS2
  1739.     "ATQ0X4W1Y0%E2&S0&C1&D2\\K5+FCLASS=0+MS=11,1\015", /* wake_str */
  1740. #else
  1741.     "ATQ0X4W1Y0%E2\\K5+FCLASS=0+MS=11,1\015", /* wake_str */
  1742. #endif /* OS2 */
  1743.     0,                    /* wake_rate */
  1744.     "OK\015",                /* wake_prompt */
  1745.     "",                    /* dmode_str */
  1746.     "",                    /* dmode_prompt */
  1747.     "ATD%s\015",            /* dial_str */
  1748.     0,                    /* dial_rate */
  1749.     1100,                /* esc_time */
  1750.     43,                    /* esc_char */
  1751.     "ATQ0H0\015",            /* hup_str */
  1752.     "AT&K3\015",            /* hwfc_str */
  1753.     "AT&K4S32=17S33=19\015",        /* swfc_str */
  1754.     "AT&K0\015",            /* nofc_str */
  1755.     "AT&Q5S36=7S48=7\\N3\015",        /* ec_on_str */
  1756.     "AT&Q0S48=128\\N1\015",        /* ec_off_str */
  1757.     "ATS46=138%C1\015",            /* dc_on_str */
  1758.     "ATS46=136%C0\015",            /* dc_off_str */
  1759.     "ATS0=1\015",            /* aa_on_str */
  1760.     "ATS0=0\015",            /* aa_off_str */
  1761.     "",                    /* sb_on_str */
  1762.     "",                    /* sb_off_str */
  1763.     115200L,                /* max_speed */
  1764.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1765.     getok                /* ok_fn */
  1766. };
  1767.  
  1768. static
  1769. MDMINF MWAVE =                /* IBM Mwave */
  1770.     {
  1771.     "IBM Mwave Adapter",
  1772.     "ATP\015",                /* pulse command */
  1773.     "ATT\015",                /* tone command */
  1774.     35,                    /* dial_time */
  1775.     ",",                /* pause_chars */
  1776.     2,                    /* pause_time */
  1777. #ifdef OS2
  1778.     "ATQ0X4Y0&S0&C1&D2&M0&Q0&N1\\K3\\T0%E2S28=0\015", /* wake_str */
  1779. #else
  1780.     "ATQ0X4Y0&M0&Q0&N1&S0\\K3\\T0%E2S28=0\015", /* wake_str */
  1781. #endif /* OS2 */
  1782.     0,                    /* wake_rate */
  1783.     "OK\015",                /* wake_prompt */
  1784.     "",                    /* dmode_str */
  1785.     "",                    /* dmode_prompt */
  1786.     "ATD%s\015",            /* dial_str */
  1787.     0,                    /* dial_rate */
  1788.     1100,                /* esc_time */
  1789.     43,                    /* esc_char */
  1790.     "ATQ0H0\015",            /* hup_str */
  1791.     "AT\\Q3\015",            /* hwfc_str */
  1792.     "",                    /* swfc_str (it doesn't!) */
  1793.     "AT\\Q0\015",            /* nofc_str */
  1794.     "AT\\N7\015",            /* ec_on_str */
  1795.     "AT\\N0\015",            /* ec_off_str */
  1796.     "AT%C1\"H3\015",            /* dc_on_str */
  1797.     "AT%C0\"H0\015",            /* dc_off_str */
  1798.     "ATS0=1\015",            /* aa_on_str */
  1799.     "ATS0=0\015",            /* aa_off_str */
  1800.     "",                    /* sb_on_str */
  1801.     "",                    /* sb_off_str */
  1802.     57600L,                /* max_speed */
  1803.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW, /* capas */
  1804.     getok                /* ok_fn */
  1805. };
  1806.  
  1807. static
  1808. MDMINF TELEPATH =            /* Gateway 2000 Telepath */
  1809.     {
  1810.     "Gateway 2000 Telepath II 28.8",
  1811.     "ATP\015",                /* pulse command */
  1812.     "ATT\015",                /* tone command */
  1813.     35,                    /* dial_time */
  1814.     ",",                /* pause_chars */
  1815.     2,                    /* pause_time */
  1816. #ifdef OS2
  1817.     "ATQ0X4&S0&C1&D2&N0&Y2#CLS=0S13=0S15=0S19=0\015", /* wake_str */
  1818. #else
  1819.     "ATQ0X4&N0&Y1#CLS=0S13=0S15=0S19=0\015", /* wake_str */
  1820. #endif /* OS2 */
  1821.     0,                    /* wake_rate */
  1822.     "OK\015",                /* wake_prompt */
  1823.     "",                    /* dmode_str */
  1824.     "",                    /* dmode_prompt */
  1825.     "ATD%s\015",            /* dial_str */
  1826.     0,                    /* dial_rate */
  1827.     1100,                /* esc_time */
  1828.     43,                    /* esc_char */
  1829.     "ATQ0H0\015",            /* hup_str */
  1830.     "AT&H1&R2\015",            /* hwfc_str */
  1831.     "AT&H2&I2S22=17S23=19\015",        /* swfc_str */
  1832.     "AT&H0&I0&R1\015",            /* nofc_str */
  1833.     "AT&M4&B1\015",            /* ec_on_str -- also fixes speed */
  1834.     "AT&M0\015",            /* ec_off_str */
  1835.     "AT&K1\015",            /* dc_on_str */
  1836.     "AT&K0\015",            /* dc_off_str */
  1837.     "ATS0=1\015",            /* aa_on_str */
  1838.     "ATS0=0\015",            /* aa_off_str */
  1839.     "",                    /* sb_on_str */
  1840.     "",                    /* sb_off_str */
  1841.     57600L,                /* max_speed */
  1842.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW, /* capas */
  1843.     getok                /* ok_fn */
  1844. };
  1845.  
  1846. static
  1847. MDMINF CARDINAL =            /* Cardinal - based on Rockwell V.34 */
  1848.     {
  1849.     "Cardinal MVP288X Series",        /* ATI3, ATI4, and ATI6 for details */
  1850.     "ATP\015",                /* pulse command */
  1851.     "ATT\015",                /* tone command */
  1852.     35,                    /* dial_time */
  1853.     ",",                /* pause_chars */
  1854.     2,                    /* pause_time */
  1855. #ifdef OS2
  1856.     "ATQ0X4W1Y0%E2&S0&C1&D2\\K5+FCLASS=0+MS=11,1\015", /* wake_str */
  1857. #else
  1858.     "ATQ0X4W1Y0%E2\\K5+FCLASS=0+MS=11,1\015", /* wake_str */
  1859. #endif /* OS2 */
  1860.     0,                    /* wake_rate */
  1861.     "OK\015",                /* wake_prompt */
  1862.     "",                    /* dmode_str */
  1863.     "",                    /* dmode_prompt */
  1864.     "ATD%s\015",            /* dial_str */
  1865.     0,                    /* dial_rate */
  1866.     1100,                /* esc_time */
  1867.     43,                    /* esc_char */
  1868.     "ATQ0H0\015",            /* hup_str */
  1869.     "AT&K3\015",            /* hwfc_str */
  1870.     "AT&K4S32=17S33=19\015",        /* swfc_str */
  1871.     "AT&K0\015",            /* nofc_str */
  1872.     "AT&Q5S36=7S48=7\\N3\015",        /* ec_on_str */
  1873.     "AT&Q0S48=128\\N1\015",        /* ec_off_str */
  1874.     "ATS46=138%C1\015",            /* dc_on_str */
  1875.     "ATS46=136%C0\015",            /* dc_off_str */
  1876.     "ATS0=1\015",            /* aa_on_str */
  1877.     "ATS0=0\015",            /* aa_off_str */
  1878.     "",                    /* sb_on_str */
  1879.     "",                    /* sb_off_str */
  1880.     115200L,                /* max_speed */
  1881.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
  1882.     getok                /* ok_fn */
  1883. };
  1884.  
  1885. /*
  1886.   Now the "old" modems, all grouped together, and also within 
  1887.   "if not defined MINIDIAL"...
  1888. */
  1889. #ifdef OLDMODEMS
  1890.  
  1891. static
  1892. MDMINF CERMETEK =    /* Information for "Cermetek Info-Mate 212 A" modem */
  1893.     {
  1894.     "Cermetek Info-Mate 212 A",
  1895.     "",                    /* pulse command */
  1896.     "",                    /* tone command */
  1897.     20,                    /* dial_time */
  1898.     "BbPpTt",                /* pause_chars */
  1899.     0,                    /* pause_time */
  1900.     "  XY\016R\015",            /* wake_str */
  1901.     200,                /* wake_rate */
  1902.     "",                    /* wake_prompt */
  1903.     "",                    /* dmode_str */
  1904.     NULL,                /* dmode_prompt */
  1905.     "\016D '%s'\015",            /* dial_str */
  1906.     200,                /* dial_rate */
  1907.     0,                    /* esc_time */
  1908.     0,                    /* esc_char */
  1909.     "",                    /* hup_str */
  1910.     "",                    /* hwfc_str */
  1911.     "",                    /* swfc_str */
  1912.     "",                    /* nofc_str */
  1913.     "",                    /* ec_on_str */
  1914.     "",                    /* ec_off_str */
  1915.     "",                    /* dc_on_str */
  1916.     "",                    /* dc_off_str */
  1917.     "",                    /* aa_on_str */
  1918.     "",                    /* aa_off_str */
  1919.     "",                    /* sb_on_str */
  1920.     "",                    /* sb_off_str */
  1921.     1200L,                /* max_speed */
  1922.     0,                    /* capas */
  1923.     NULL                /* ok_fn */
  1924. };
  1925.  
  1926. static
  1927. MDMINF DF03 =        /* information for "DEC DF03-AC" modem */
  1928.     {
  1929.     "Digital DF03-AC",
  1930.     "",                    /* pulse command */
  1931.     "",                    /* tone command */
  1932.     27,                    /* dial_time */
  1933.     "=",                /* pause_chars */
  1934.     15,                    /* pause_time */
  1935.     "\001\002",                /* wake_str */
  1936.     0,                    /* wake_rate */
  1937.     "",                    /* wake_prompt */
  1938.     "",                    /* dmode_str */
  1939.     NULL,                /* dmode_prompt */
  1940.     "%s",                /* dial_str */
  1941.     0,                    /* dial_rate */
  1942.     0,                    /* esc_time */
  1943.     0,                    /* esc_char */
  1944.     "",                    /* hup_str */
  1945.     "",                    /* hwfc_str */
  1946.     "",                    /* swfc_str */
  1947.     "",                    /* nofc_str */
  1948.     "",                    /* ec_on_str */
  1949.     "",                    /* ec_off_str */
  1950.     "",                    /* dc_on_str */
  1951.     "",                    /* dc_off_str */
  1952.     "",                    /* aa_on_str */
  1953.     "",                    /* aa_off_str */
  1954.     "",                    /* sb_on_str */
  1955.     "",                    /* sb_off_str */
  1956.     0L,                    /* max_speed */
  1957.     0,                    /* capas */
  1958.     NULL                /* ok_fn */
  1959. };
  1960.  
  1961. static
  1962. MDMINF DF100 =        /* information for "DEC DF100-series" modem */
  1963.             /*
  1964.              * The telephone "number" can include "P"s and/or "T"s
  1965.              * within it to indicate that subsequent digits are
  1966.              * to be dialed using pulse or tone dialing.  The
  1967.              * modem defaults to pulse dialing.  You may modify
  1968.              * the dial string below to explicitly default all
  1969.              * dialing to pulse or tone, but doing so prevents
  1970.              * the use of phone numbers that you may have stored
  1971.              * in the modem's memory.
  1972.              */
  1973.     {
  1974.     "Digital DF-100",
  1975.     "",                    /* pulse command */
  1976.     "",                    /* tone command */
  1977.     30,                    /* dial_time */
  1978.     "=",                /* pause_chars */
  1979.     15,                    /* pause_time */
  1980.     "\001",                /* wake_str */
  1981.     0,                    /* wake_rate */
  1982.     "",                    /* wake_prompt */
  1983.     "",                    /* dmode_str */
  1984.     NULL,                /* dmode_prompt */
  1985.     "%s#",                /* dial_str */
  1986.     0,                    /* dial_rate */
  1987.     0,                    /* esc_time */
  1988.     0,                    /* esc_char */
  1989.     "",                    /* hup_str */
  1990.     "",                    /* hwfc_str */
  1991.     "",                    /* swfc_str */
  1992.     "",                    /* nofc_str */
  1993.     "",                    /* ec_on_str */
  1994.     "",                    /* ec_off_str */
  1995.     "",                    /* dc_on_str */
  1996.     "",                    /* dc_off_str */
  1997.     "",                    /* aa_on_str */
  1998.     "",                    /* aa_off_str */
  1999.     "",                    /* sb_on_str */
  2000.     "",                    /* sb_off_str */
  2001.     0L,                    /* max_speed */
  2002.     0,                    /* capas */
  2003.     NULL                /* ok_fn */
  2004. };
  2005.  
  2006. static
  2007. MDMINF DF200 =        /* information for "DEC DF200-series" modem */
  2008.             /*
  2009.              * The telephone "number" can include "P"s and/or "T"s
  2010.              * within it to indicate that subsequent digits are
  2011.              * to be dialed using pulse or tone dialing.  The
  2012.              * modem defaults to pulse dialing.  You may modify
  2013.              * the dial string below to explicitly default all
  2014.              * dialing to pulse or tone, but doing so prevents
  2015.              * the use of phone numbers that you may have stored
  2016.              * in the modem's memory.
  2017.              */
  2018.     {
  2019.     "Digital DF-200",
  2020.     "",            /* pulse command */
  2021.     "",            /* tone command */
  2022.     30,            /* dial_time */
  2023.     "=W",        /* pause_chars */    /* =: second tone; W: 5 secs */
  2024.     15,            /* pause_time */    /* worst case */
  2025.     "\002",        /* wake_str */        /* allow stored number usage */
  2026.     0,            /* wake_rate */
  2027.     "",            /* wake_prompt */
  2028.     "",            /* dmode_str */
  2029.     NULL,        /* dmode_prompt */
  2030. #ifdef COMMENT
  2031.     "%s!",        /* dial_str */
  2032. #else
  2033.     "   d %s\015",
  2034. #endif /* COMMENT */
  2035.     0,                    /* dial_rate */
  2036.     0,                    /* esc_time */
  2037.     0,                    /* esc_char */
  2038.     "",                    /* hup_str */
  2039.     "",                    /* hwfc_str */
  2040.     "",                    /* swfc_str */
  2041.     "",                    /* nofc_str */
  2042.     "",                    /* ec_on_str */
  2043.     "",                    /* ec_off_str */
  2044.     "",                    /* dc_on_str */
  2045.     "",                    /* dc_off_str */
  2046.     "",                    /* aa_on_str */
  2047.     "",                    /* aa_off_str */
  2048.     "",                    /* sb_on_str */
  2049.     "",                    /* sb_off_str */
  2050.     0L,                    /* max_speed */
  2051.     0,                    /* capas */
  2052.     NULL                /* ok_fn */
  2053. };
  2054.  
  2055. static
  2056. MDMINF GDC =        /* information for "GeneralDataComm 212A/ED" modem */
  2057.     {
  2058.     "GeneralDataComm 212A/ED",
  2059.     "",                    /* pulse command */
  2060.     "",                    /* tone command */
  2061.     32,                    /* dial_time */
  2062.     "%",                /* pause_chars */
  2063.     3,                    /* pause_time */
  2064.     "\015\015",                /* wake_str */
  2065.     500,                /* wake_rate */
  2066.     "$",                /* wake_prompt */
  2067.     "D\015",                /* dmode_str */
  2068.     ":",                /* dmode_prompt */
  2069.     "T%s\015",                /* dial_str */
  2070.     0,                    /* dial_rate */
  2071.     0,                    /* esc_time */
  2072.     0,                    /* esc_char */
  2073.     "",                    /* hup_str */
  2074.     "",                    /* hwfc_str */
  2075.     "",                    /* swfc_str */
  2076.     "",                    /* nofc_str */
  2077.     "",                    /* ec_on_str */
  2078.     "",                    /* ec_off_str */
  2079.     "",                    /* dc_on_str */
  2080.     "",                    /* dc_off_str */
  2081.     "",                    /* aa_on_str */
  2082.     "",                    /* aa_off_str */
  2083.     "",                    /* sb_on_str */
  2084.     "",                    /* sb_off_str */
  2085.     1200L,                /* max_speed */
  2086.     0,                    /* capas */
  2087.     NULL                /* ok_fn */
  2088. };
  2089.  
  2090. static
  2091. MDMINF PENRIL =        /* information for "Penril" modem */
  2092.     {
  2093.     "Penril modem",
  2094.     "",                    /* pulse command */
  2095.     "",                    /* tone command */
  2096.     50,                    /* dial_time */
  2097.     "",                    /* pause_chars */
  2098.     0,                    /* pause_time */
  2099.     "\015\015",                /* wake_str */
  2100.     300,                /* wake_rate */
  2101.     ">",                /* wake_prompt */
  2102.     "k\015",                /* dmode_str */
  2103.     ":",                /* dmode_prompt */
  2104.     "%s\015",                /* dial_str */
  2105.     0,                    /* dial_rate */
  2106.     0,                    /* esc_time */
  2107.     0,                    /* esc_char */
  2108.     "",                    /* hup_str */
  2109.     "",                    /* hwfc_str */
  2110.     "",                    /* swfc_str */
  2111.     "",                    /* nofc_str */
  2112.     "",                    /* ec_on_str */
  2113.     "",                    /* ec_off_str */
  2114.     "",                    /* dc_on_str */
  2115.     "",                    /* dc_off_str */
  2116.     "",                    /* aa_on_str */
  2117.     "",                    /* aa_off_str */
  2118.     "",                    /* sb_on_str */
  2119.     "",                    /* sb_off_str */
  2120.     0L,                    /* max_speed */
  2121.     0,                    /* capas */
  2122.     NULL                /* ok_fn */
  2123. };
  2124.  
  2125. static
  2126. MDMINF RACAL =                /* Racal Vadic VA4492E */
  2127.     {
  2128.     "Racal Vadic VA4492E",
  2129.     "",                    /* pulse command */
  2130.     "",                    /* tone command */
  2131.     35,            /* dial_time (manual says modem is hardwired to 60) */
  2132.     "Kk",                /* pause_chars */
  2133.     5,                    /* pause_time */
  2134.     "\005\015",                /* wake_str, ^E^M */
  2135.     50,                    /* wake_rate */
  2136.     "*",                /* wake_prompt */
  2137.     "D\015",                /* dmode_str */
  2138.     "?",                /* dmode_prompt */
  2139.     "%s\015",                /* dial_str */
  2140.     0,                    /* dial_rate */
  2141.     1100,                /* esc_time */
  2142.     5,                    /* esc_char, ^E */
  2143.     "\003\004",                /* hup_str, ^C^D */
  2144.     0,                    /* hwfc_str */
  2145.     "",                    /* swfc_str */
  2146.     "",                    /* nofc_str */
  2147.     "",                    /* ec_on_str */
  2148.     "",                    /* ec_off_str */
  2149.     "",                    /* dc_on_str */
  2150.     "",                    /* dc_off_str */
  2151.     "",                    /* aa_on_str */
  2152.     "",                    /* aa_off_str */
  2153.     "",                    /* sb_on_str */
  2154.     "",                    /* sb_off_str */
  2155.     0L,                    /* max_speed */
  2156.     0,                    /* capas */
  2157.     NULL                /* ok_fn */
  2158. };
  2159.  
  2160. static
  2161. MDMINF VENTEL =                /* Information for Ven-Tel modem */
  2162.     {
  2163.     "Ven-Tel",
  2164.     "",                    /* pulse command */
  2165.     "",                    /* tone command */
  2166.     20,                    /* dial_time */
  2167.     "%",                /* pause_chars */
  2168.     5,                    /* pause_time */
  2169.     "\015\015\015",            /* wake_str */
  2170.     300,                /* wake_rate */
  2171.     "$",                /* wake_prompt */
  2172.     "K\015",                /* dmode_str (was "") */
  2173.     "Number to call: ",            /* dmode_prompt (was NULL) */
  2174.     "%s\015",                /* dial_str (was "<K%s\r>") */
  2175.     0,                    /* dial_rate */
  2176.     0,                    /* esc_time */
  2177.     0,                    /* esc_char */
  2178.     "",                    /* hup_str */
  2179.     "",                    /* hwfc_str */
  2180.     "",                    /* swfc_str */
  2181.     "",                    /* nofc_str */
  2182.     "",                    /* ec_on_str */
  2183.     "",                    /* ec_off_str */
  2184.     "",                    /* dc_on_str */
  2185.     "",                    /* dc_off_str */
  2186.     "",                    /* aa_on_str */
  2187.     "",                    /* aa_off_str */
  2188.     "",                    /* sb_on_str */
  2189.     "",                    /* sb_off_str */
  2190.     0L,                    /* max_speed */
  2191.     0,                    /* capas */
  2192.     NULL                /* ok_fn */
  2193. };
  2194.  
  2195. static
  2196. MDMINF CONCORD =    /* Info for Condor CDS 220 2400b modem */
  2197.     {
  2198.     "Concord Condor CDS 220 2400b",
  2199.     "",                    /* pulse command */
  2200.     "",                    /* tone command */
  2201.     35,                    /* dial_time */
  2202.     ",",                /* pause_chars */
  2203.     2,                    /* pause_time */
  2204.     "\015\015",                /* wake_str */
  2205.     20,                    /* wake_rate */
  2206.     "CDS >",                /* wake_prompt */
  2207.     "",                    /* dmode_str */
  2208.     NULL,                /* dmode_prompt */
  2209.     "<D M%s\015>",            /* dial_str */
  2210.     0,                    /* dial_rate */
  2211.     0,                    /* esc_time */
  2212.     0,                    /* esc_char */
  2213.     "",                    /* hup_str */
  2214.     "",                    /* hwfc_str */
  2215.     "",                    /* swfc_str */
  2216.     "",                    /* nofc_str */
  2217.     "",                    /* ec_on_str */
  2218.     "",                    /* ec_off_str */
  2219.     "",                    /* dc_on_str */
  2220.     "",                    /* dc_off_str */
  2221.     "",                    /* aa_on_str */
  2222.     "",                    /* aa_off_str */
  2223.     "",                    /* sb_on_str */
  2224.     "",                    /* sb_off_str */
  2225.     2400L,                /* max_speed */
  2226.     0,                    /* capas */
  2227.     NULL                /* ok_fn */
  2228. };
  2229. #endif /* OLDMODEMS */
  2230.  
  2231. static
  2232. MDMINF MICROCOM =    /* Microcom modems in native SX mode */
  2233.             /* (long answer only) */
  2234. {
  2235.     "Microcom MNP modems in SX command mode",
  2236.     "DP\015",                /* pulse command */
  2237.     "DT\015",                /* tone command */
  2238.     35,                    /* dial_time */
  2239.     ",!@",        /* pause_chars (! and @ aren't pure pauses) */
  2240.     3,                    /* pause_time */
  2241. /*
  2242.   The following sets 8 bits, no parity, BREAK passthru, and SE0 disables the
  2243.   escape character, which is a single character with no guard time, totally
  2244.   unsafe, so we have no choice but to disable it.  Especially since, by
  2245.   default, it is Ctrl-A, which is Kermit's packet-start character.  We would
  2246.   change it to something else, which would enable "mdmhup()", but the user
  2247.   wouldn't know about it.  Very bad.  Note: SE1 sets it to Ctrl-A, SE2
  2248.   sets it to Ctrl-B, etc (1..31 allowed).  Also SE/Q sets it to "Q".
  2249. */
  2250.     "SE0;S1P4;SBRK5\015",        /* wake_str */
  2251.     100,                /* wake_rate */
  2252.     "!",                /* wake_prompt */
  2253.     "",                    /* dmode_str */
  2254.     NULL,                /* dmode_prompt */
  2255.     "D%s\015",                /* dial_str - number up to 39 chars */
  2256.     0,                    /* dial_rate */
  2257.     0,                    /* esc_time */
  2258.     0,                    /* esc_char - we can't use this */
  2259.     "",                    /* hup_str - it's "H" but can't use */
  2260.     "SF13\015",                /* hwfc_str */
  2261.     "SF11\015",                /* swfc_str */
  2262.     "SF10\015",                /* nofc_str */
  2263.     "BAOFF;SMAUT\015",            /* ec_on_str */
  2264.     "BAON;SMDIR\015",            /* ec_off_str */
  2265.     "COMP1\015",            /* dc_on_str */
  2266.     "COMP0\015",            /* dc_off_str */
  2267.     "AA",                /* aa_on_str */
  2268.     "",                    /* aa_off_str */
  2269.     "",                    /* sb_on_str */
  2270.     "",                    /* sb_off_str */
  2271.     0L,                    /* max_speed */
  2272.     CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW|CKD_KS, /* capas */
  2273.     getok                /* ok_fn */
  2274. };
  2275.  
  2276.  
  2277. static
  2278. MDMINF MICROLINK =            /* MicroLink ... */
  2279.     {                    /* 14.4TQ,TL,PC;28.8TQ,TQV;2440T/TR */
  2280.     "MicroLink 14.4 or 28.8",        /* ELSA GmbH, Aachen */
  2281.     "ATP\015",                /* pulse command */
  2282.     "ATT\015",                /* tone command */
  2283.     35,                    /* dial_time */
  2284.     ",",                /* pause_chars */
  2285.     2,                    /* pause_time */
  2286. #ifdef OS2
  2287.     "ATQ0X4&S0\\D0&C1&D2\\K5\015",    /* wake_str */
  2288. #else
  2289.     "ATQ0X4\\K5\015",            /* wake_str */
  2290. #endif /* OS2 */
  2291.     0,                    /* wake_rate */
  2292.     "OK\015",                /* wake_prompt */
  2293.     "",                    /* dmode_str */
  2294.     "",                    /* dmode_prompt */
  2295.     "ATD%s\015",            /* dial_str */
  2296.     0,                    /* dial_rate */
  2297.     1100,                /* esc_time */
  2298.     43,                    /* esc_char */
  2299.     "ATQ0H\015",            /* hup_str */
  2300.     "AT\\Q3\015",            /* hwfc_str */
  2301.     "AT\\Q1\\X0\015",            /* swfc_str */
  2302.     "AT\\Q0\015",            /* nofc_str */
  2303.     "AT\\N3\015",            /* ec_on_str */
  2304.     "AT\\N0\015",            /* ec_off_str */
  2305.     "AT%C3\015",            /* dc_on_str */
  2306.     "AT%C0\015",            /* dc_off_str */
  2307.     "ATS0=1\015",            /* aa_on_str */
  2308.     "ATS0=0\015",            /* aa_off_str */
  2309.     "\\J0",                /* sb_on_str (?) */
  2310.     "",                    /* sb_off_str */
  2311.     57600L,                /* max_speed */
  2312.     CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW, /* capas */
  2313.     getok                /* ok_fn */
  2314. };
  2315.  
  2316.  
  2317. #endif /* MINIDIAL */
  2318.  
  2319. /* END MDMINF STRUCT DEFINITIONS */
  2320.  
  2321. /*
  2322.   Table to convert modem numbers to MDMINF struct pointers.
  2323.   The entries MUST be in ascending order by modem number, without any
  2324.   "gaps" in the numbers, and starting from one (1).
  2325. */
  2326.  
  2327. MDMINF *modemp[] = {
  2328. #ifdef MINIDIAL
  2329.     &CCITT,                /*  1 */
  2330.     &HAYES,                /*  2 */
  2331.     &UNKNOWN                /*  3 */
  2332. #else
  2333.     &ATTDTDM,                /*  1 */
  2334.     &ATTISN,                /*  2 */
  2335.     &ATTMODEM,                /*  3 */
  2336.     &CCITT,                /*  4 */
  2337. #ifdef OLDMODEMS
  2338.     &CERMETEK,                /*  5 */
  2339.     &DF03,                /*  6 */
  2340.     &DF100,                /*  7 */
  2341.     &DF200,                /*  8 */
  2342.     &GDC,                /*  9 */
  2343. #else
  2344.     NULL,
  2345.     NULL,
  2346.     NULL,
  2347.     NULL,
  2348.     NULL,
  2349. #endif /* OLDMODEMS */
  2350.     &HAYES,                /* 10 */
  2351. #ifdef OLDMODEMS
  2352.     &PENRIL,                /* 11 */
  2353.     &RACAL,                /* 12 */
  2354. #else
  2355.     NULL,
  2356.     NULL,
  2357. #endif /* OLDMODEMS */
  2358.     &UNKNOWN,                /* 13 */
  2359. #ifdef OLDMODEMS
  2360.     &VENTEL,                /* 14 */
  2361.     &CONCORD,                /* 15 */
  2362. #else
  2363.     NULL,
  2364.     NULL,
  2365. #endif /* OLDMODEMS */
  2366.     &DUMMY,                /* 16 */
  2367.     &ROLM,                /* 17 */
  2368. #ifdef OLDMODEMS
  2369.     &MICROCOM,                /* 18 */
  2370. #else
  2371.     NULL,
  2372. #endif /* OLDMODEMS */
  2373.     &USR,                /* 19 USR Courier and Sportster */
  2374. #ifdef OLDTBCODE
  2375.     &TELEBIT,
  2376. #else
  2377.     &OLDTB,                /* 20 Old Telebits */
  2378. #endif /* OLDTBCODE */
  2379.     &DIGITEL,                /* 21 Digitel CCITT */
  2380.     &H_1200,                /* 22 Hayes 1200 */
  2381.     &H_ULTRA,                /* 23 Hayes Ultra */
  2382.     &H_ACCURA,                /* 24 Hayes Optima */
  2383.     &PPI,                /* 25 PPI */
  2384.     &DATAPORT,                /* 26 Dataport */
  2385.     &BOCA,                /* 27 Boca */
  2386.     &MOTOROLA,                /* 28 Motorola UDS MOTOROLA */
  2387.     NULL,                /* 29 Digicomm */
  2388.     NULL,                /* 30 Dynalink */
  2389.     &INTEL,                /* 31 Intel */
  2390.     &UCOM_AT,                /* 32 Microcom in AT mode */
  2391.     &MULTITECH,                /* 33 Multitech */
  2392.     &SUPRA,                /* 34 Supra */
  2393.     &ZOLTRIX,                /* 35 Zoltrix */
  2394.     &ZOOM,                /* 36 Zoom */
  2395.     &ZYXEL,                /* 37 ZyXEL */
  2396.     &DUMMY,                /* 38 TAPI */
  2397. #ifdef OLDTBCODE
  2398.     &TELEBIT,
  2399. #else
  2400.     &NEWTB,                /* 39 New-Telebit */
  2401. #endif /* OLDTBCODE */
  2402.     &MAXTECH,                /* 40 MaxTech */
  2403.     &DUMMY,                /* 41 User-defined */
  2404.     &RWV32,                /* 42 Rockwell V.32 */
  2405.     &RWV32B,                /* 43 Rockwell V.32bis */
  2406.     &RWV34,                /* 44 Rockwell V.34 */
  2407.     &MWAVE,                /* 45 IBM Mwave */
  2408.     &TELEPATH,                /* 46 Gateway 2000 Telepath II 28.8 */
  2409.     &MICROLINK,                /* 47 MicroLink modems */
  2410.     &CARDINAL                /* 48 Cardinal */
  2411. #endif /* MINIDIAL */
  2412. };
  2413. /*
  2414.  * Declare modem names and associated numbers for command parsing,
  2415.  * and also for doing number-to-name translation.
  2416.  *
  2417.  * The entries must be in alphabetical order by modem name.
  2418.  */
  2419. struct keytab mdmtab[] = {
  2420. #ifndef MINIDIAL
  2421.     "att-dataport",    n_DATAPORT,    0,
  2422.     "att-dtdm",        n_ATTDTDM,    0,
  2423.     "attdtdm",        n_ATTDTDM,    CM_INV,    /* old name */
  2424.     "att-isn",          n_ATTISN,       0,
  2425.     "attisn",           n_ATTISN,       CM_INV,    /* old name */
  2426.     "att-switched-net", n_ATTMODEM,    0,
  2427.     "attmodem",        n_ATTMODEM,    CM_INV,    /* old name */
  2428.     "att-7300",        n_ATTUPC,    0,
  2429.     "att7300",        n_ATTUPC,    CM_INV,    /* old name */
  2430.     "boca",        n_BOCA,        0,
  2431. #endif /* MINIDIAL */
  2432.     "ccitt-v25bis",    n_CCITT,    CM_INV, /* Name changed to ITU-T */
  2433. #ifndef MINIDIAL
  2434.     "cardinal",         n_CARDINAL,     0,
  2435. #ifdef OLDMODEMS
  2436.     "cermetek",        n_CERMETEK,    M_OLD,
  2437.     "concord",        n_CONCORD,    M_OLD,
  2438. #endif /* OLDMODEMS */
  2439.     "courier",          n_USR,          CM_INV,
  2440.     "dataport",        n_DATAPORT,    CM_INV,    /* == att-dataport */
  2441. #ifdef OLDMODEMS
  2442.     "df03-ac",        n_DF03,        M_OLD,
  2443.     "df100-series",    n_DF100,    M_OLD,
  2444.     "df200-series",    n_DF200,    M_OLD,
  2445. #endif /* OLDMODEMS */
  2446.     "digitel-dt22",    n_DIGITEL,    0,
  2447. #endif /* MINIDIAL */
  2448.     "direct",        0,        CM_INV,    /* Synonym for NONE */
  2449. #ifndef MINIDIAL
  2450.     "gateway-telepath", n_TELEPATH,     0,
  2451. #ifdef OLDMODEMS
  2452.     "gdc-212a/ed",    n_GDC,        M_OLD,
  2453.     "gendatacomm",    n_GDC,        CM_INV,    /* Synonym for GDC */
  2454. #endif /* OLDMODEMS */
  2455. #endif /* MINIDIAL */
  2456.     "h",            n_HAYES,    CM_INV|CM_ABR,
  2457.     "ha",            n_HAYES,    CM_INV|CM_ABR,
  2458.     "hay",            n_HAYES,    CM_INV|CM_ABR,
  2459.     "haye",            n_HAYES,    CM_INV|CM_ABR,
  2460.     "hayes",        n_HAYES,    CM_INV|CM_ABR, /* Hayes 2400 */
  2461. #ifndef MINIDIAL
  2462.     "hayes-1200",    n_H_1200,    0,
  2463. #endif /* MINIDIAL */
  2464.     "hayes-2400",    n_HAYES,    0,
  2465. #ifndef MINIDIAL
  2466.     "hayes-high-speed", n_H_ACCURA,     0,
  2467.     "hayes-accura",     n_H_ACCURA,     CM_INV,
  2468.     "hayes-optima",     n_H_ACCURA,     CM_INV,
  2469.     "hayes-ultra",    n_H_ULTRA,    CM_INV,
  2470.     "hst-courier",      n_USR,          CM_INV,    /* Synonym for COURIER */
  2471.     "intel",        n_INTEL,        0,
  2472. #endif /* MINIDIAL */
  2473.     "itu-t-v25bis",    n_CCITT,    0,    /* New name for CCITT */
  2474. #ifndef MINIDIAL
  2475.     "maxtech",        n_MAXTECH,    0,
  2476.     "mi",        n_MICROCOM,    CM_INV|CM_ABR,
  2477.     "mic",        n_MICROCOM,    CM_INV|CM_ABR,
  2478.     "micr",        n_MICROCOM,    CM_INV|CM_ABR,
  2479.     "micro",        n_MICROCOM,    CM_INV|CM_ABR,
  2480.     "microc",        n_MICROCOM,    CM_INV|CM_ABR,
  2481.     "microco",        n_MICROCOM,    CM_INV|CM_ABR,
  2482.     "microcom",        n_MICROCOM,    CM_INV|CM_ABR,
  2483.     "microcom-at-mode",    n_UCOM_AT,    0, /* Microcom DeskPorte, etc */
  2484.     "microcom-sx-mode",    n_MICROCOM,    0, /* Microcom AX,QX,SX, native mode */
  2485.     "microlink",        n_MICROLINK,    0,
  2486.     "motorola-fastalk", n_MOTOROLA,    0,
  2487.     "multitech",    n_MULTI,    0,
  2488.     "mwave",        n_MWAVE,    0,
  2489. #endif /* MINIDIAL */
  2490.     "none",             0,              0,
  2491. #ifndef MINIDIAL
  2492. #ifndef OLDTBCODE
  2493.     "old-telebit",      n_TELEBIT,      0,
  2494. #endif /* OLDTBCODE */
  2495. #ifdef OLDMODEMS
  2496.     "penril",        n_PENRIL,    M_OLD,
  2497. #endif /* OLDMODEMS */
  2498.     "ppi",              n_PPI,        0,
  2499. #ifdef OLDMODEMS
  2500.     "racalvadic",    n_RACAL,    M_OLD,
  2501. #endif /* OLDMODEMS */
  2502.     "rockwell-v32",    n_RWV32,    0,
  2503.     "rockwell-v32bis",    n_RWV32B,    0,
  2504.     "rockwell-v34",    n_RWV34,    0,
  2505.     "rolm-dcm",        n_ROLM,        0,
  2506.     "sportster",        n_USR,          CM_INV,
  2507.     "supra",        n_SUPRA,    0,
  2508.     "tapi",        n_TAPI,        CM_INV,
  2509. #ifndef OLDTBCODE
  2510.     "te",               n_TBNEW,        CM_INV|CM_ABR,
  2511.     "tel",              n_TBNEW,        CM_INV|CM_ABR,
  2512.     "telebit",          n_TBNEW,        0,
  2513. #else
  2514.     "te",               n_TELEBIT,      CM_INV|CM_ABR,
  2515.     "tel",              n_TELEBIT,      CM_INV|CM_ABR,
  2516.     "telebit",          n_TELEBIT,      0,
  2517. #endif /* OLDTBCODE */
  2518.     "telepath",         n_TELEPATH,     CM_INV,
  2519. #endif /* MINIDIAL */
  2520.     "unknown",        n_UNKNOWN,    0,
  2521.     "user-defined",     n_UDEF,        0,
  2522. #ifndef MINIDIAL
  2523.     "usr",              n_USR,          CM_INV|CM_ABR,
  2524. /* Keep the next one for backwards compatibility, but it's the same as H2400 */
  2525.     "usr-212a",        n_HAYES,    CM_INV,
  2526.     "usr-courier",      n_USR,          CM_INV,
  2527.     "usr-sportster",    n_USR,          CM_INV,
  2528.     "usrobotics",       n_USR,          0,
  2529.     "v25bis",        n_CCITT,    CM_INV, /* Name changed to ITU-T */
  2530. #ifdef OLDMODEMS
  2531.     "ventel",        n_VENTEL,    M_OLD,
  2532. #endif /* OLDMODEMS */
  2533.     "zoltrix",        n_ZOLTRIX,    0,
  2534.     "zoom",        n_ZOOM,        0,
  2535.     "zyxel",        n_ZYXEL,    0,
  2536.     "",                 0,              0
  2537. #endif /* MINIDIAL */
  2538. };
  2539. int nmdm = (sizeof(mdmtab) / sizeof(struct keytab)) - 1; /* Number of modems */
  2540.  
  2541. #define CONNECTED 1            /* For completion status */
  2542. #define D_FAILED  2
  2543. #define D_PARTIAL 3
  2544.  
  2545. static int tries = 0;
  2546. static int mdmecho = 0;    /* assume modem does not echo */
  2547.  
  2548. static char *p;        /* For command strings & messages */
  2549.  
  2550. #ifdef DYNAMIC
  2551. #define LBUFL 256
  2552. static char *lbuf = NULL;
  2553. #else
  2554. #define LBUFL 100
  2555. static char lbuf[LBUFL];
  2556. #endif /* DYNAMIC */
  2557.  
  2558. #ifdef DYNAMIC
  2559. #define RBUFL 256
  2560. static char *rbuf = NULL;
  2561. #else
  2562. #define RBUFL 63
  2563. static char rbuf[RBUFL+1];
  2564. #endif /* DYNAMIC */
  2565.  
  2566. #ifdef DYNAMIC
  2567. #define FULLNUML 256
  2568. char *fbuf = NULL;            /* For full (prefixed) phone number */
  2569. #else
  2570. #define FULLNUML 100
  2571. char fbuf[FULLNUML];
  2572. #endif /* DYNAMIC */
  2573.  
  2574. static ckjmpbuf sjbuf;
  2575.  
  2576. #ifdef CK_ANSIC
  2577. static SIGTYP (*savalrm)(int);    /* For saving alarm handler */
  2578. static SIGTYP (*savint)(int);    /* For saving interrupt handler */
  2579. #else 
  2580. static SIGTYP (*savalrm)();    /* For saving alarm handler */
  2581. static SIGTYP (*savint)();    /* For saving interrupt handler */
  2582. #endif /* CK_ANSIC */
  2583.  
  2584. #ifndef MINIDIAL
  2585. #ifdef OLDTBCODE
  2586. int tbmodel = 0;        /* Telebit modem model */
  2587.  
  2588. char *
  2589. gtbmodel() {            /* Function to return name of Telebit model */
  2590.     if (tbmodel < 0 || tbmodel > TB__MAX) tbmodel = TB_UNK;
  2591.     return(tb_name[tbmodel]);
  2592. }
  2593. #endif /* OLDTBCODE */
  2594.  
  2595. #ifdef COMMENT
  2596. static VOID
  2597. xcpy(to,from,len)        /* Copy the given number of bytes */
  2598.     register char *to, *from;
  2599.     register unsigned int len; {
  2600.     while (len--) *to++ = *from++;
  2601. }
  2602. #endif /* COMMENT */
  2603. #endif /* MINIDIAL */
  2604.  
  2605. static SIGTYP
  2606. #ifdef CK_ANSIC
  2607. dialtime(int foo)            /* Timer interrupt handler */
  2608. #else
  2609. dialtime(foo) int foo;            /* Timer interrupt handler */
  2610. #endif /* CK_ANSIC */
  2611. /* dialtime */ {
  2612.  
  2613.     fail_code = F_TIME;            /* Failure reason = timeout */
  2614.     debug(F100,"dialtime caught SIGALRM","",0);
  2615. #ifdef BEBOX
  2616.     alarm_expired();
  2617. #endif /* BEBOX */
  2618. #ifdef OS2 
  2619.     signal(SIGALRM, dialtime);
  2620. #endif /* OS2 */
  2621. #ifdef __EMX__
  2622.     signal(SIGALRM, SIG_ACK);        /* Needed for OS/2 */
  2623. #endif /* __EMX__ */
  2624.  
  2625. #ifdef OSK                /* OS-9 */
  2626. /*
  2627.   We are in an intercept routine but do not perform a F$RTE (done implicitly
  2628.   by RTS), so we have to decrement the sigmask as F$RTE does.  Warning:
  2629.   longjump only restores the CPU registers, NOT the FPU registers.  So, don't
  2630.   use FPU at all or at least don't use common FPU (double or float) register
  2631.   variables.
  2632. */
  2633.     sigmask(-1);
  2634. #endif /* OSK */
  2635.  
  2636. #ifdef NTSIG
  2637.     if (foo == SIGALRM)
  2638.       PostAlarmSigSem();
  2639.     else 
  2640.       PostCtrlCSem();
  2641. #else /* NTSIG */
  2642. #ifdef NT
  2643.     cklongjmp(ckjaddr(sjbuf),1);
  2644. #else /* NT */
  2645.     cklongjmp(sjbuf,1);
  2646. #endif /* NT */
  2647. #endif /* NTSIG */
  2648.     /* NOTREACHED */
  2649.     SIGRETURN;
  2650. }
  2651.  
  2652. static SIGTYP
  2653. #ifdef CK_ANSIC
  2654. dialint(int foo)            /* Keyboard interrupt handler */
  2655. #else
  2656. dialint(foo) int foo;            /* Keyboard interrupt handler */
  2657. #endif /* CK_ANSIC */
  2658. /* dialint */ {
  2659.     fail_code = F_INT;
  2660.     debug(F100,"dialint caught SIGINT","",0);
  2661. #ifdef OS2
  2662.     signal(SIGINT, dialint);
  2663.     debug(F100,"dialint() SIGINT caught -- dialint restored","",0) ;
  2664. #endif /* OS2 */
  2665. #ifdef __EMX__
  2666.     signal(SIGINT, SIG_ACK);        /* Needed for OS/2 */
  2667. #endif /* __EMX__ */
  2668. #ifdef OSK                /* OS-9, see comment in dialtime() */
  2669.     sigmask(-1);
  2670. #endif /* OSK */
  2671. #ifdef NTSIG
  2672.     PostCtrlCSem() ;
  2673. #else /* NTSIG */
  2674. #ifdef NT
  2675.     cklongjmp(ckjaddr(sjbuf),1);
  2676. #else /* NT */
  2677.     cklongjmp(sjbuf,1);
  2678. #endif /* NT */
  2679. #endif /* NT */
  2680.     SIGRETURN;
  2681. }
  2682.  
  2683. /*
  2684.   Routine to read a character from communication device, handling TELNET
  2685.   protocol negotiations in case we're connected to the modem through a
  2686.   TCP/IP TELNET modem server.
  2687. */
  2688. static int
  2689. ddinc(n) int n; {
  2690.     int c;
  2691.  
  2692. #ifdef TNCODE
  2693.     int done = 0;
  2694.     debug(F101,"ddinc entry n","",n);
  2695.     while (!done) {
  2696.     c = ttinc(n);
  2697.     debug(F000,"ddinc","",c);
  2698.     if (c < 0) return(c);
  2699.     if (c == IAC && network && ttnproto == NP_TELNET) {
  2700.         switch (tn_doop((CHAR)(c & 0xff),duplex,ttinc)) {
  2701.           case 2: duplex = 0; continue;
  2702.           case 1: duplex = 1;
  2703.           default: continue;
  2704.         }
  2705.     } else done = 1;
  2706.     }
  2707.     return(c & 0xff);
  2708. #else
  2709.     debug(F101,"ddinc entry n","",n);
  2710.     return(ttinc(n));
  2711. #endif /* TNCODE */
  2712. }
  2713.  
  2714. static VOID
  2715. ttslow(s,millisec) char *s; int millisec; { /* Output s-l-o-w-l-y */
  2716. #ifdef TCPSOCKET
  2717.     extern int tn_nlm, tn_b_nlm, me_binary;
  2718. #endif /* TCPSOCKET */
  2719.     if (dialdpy && duplex)        /* Echo the command in case modem */
  2720.       printf("%s\n",s);            /* isn't echoing commands. */
  2721.     for (; *s; s++) {
  2722.     ttoc(*s);
  2723. #ifdef TCPSOCKET
  2724.     if (*s == CR && network && ttnproto == NP_TELNET) {
  2725.        if (!me_binary && tn_nlm != TNL_CR)
  2726.           ttoc((char)((tn_nlm == TNL_CRLF) ? LF : NUL));
  2727.         else if (me_binary &&
  2728.             (tn_b_nlm == TNL_CRLF || tn_b_nlm == TNL_CRNUL))
  2729.           ttoc((char)((tn_b_nlm == TNL_CRLF) ? LF : NUL));
  2730.         }
  2731. #endif /* TCPSOCKET */
  2732.     msleep(millisec);
  2733.     }
  2734. }
  2735.  
  2736. /*
  2737.  * Wait for a string of characters.
  2738.  *
  2739.  * The characters are waited for individually, and other characters may
  2740.  * be received "in between".  This merely guarantees that the characters
  2741.  * ARE received, and in the order specified.
  2742.  */
  2743. static VOID
  2744. waitfor(s) char *s; {
  2745.     CHAR c, x;
  2746.     while ( c = *s++ ) {        /* while more characters remain... */
  2747.     do {                /* wait for the character */
  2748.         x = (CHAR) (ddinc(0) & 0177);
  2749.         debug(F000,"dial waitfor got","",x);
  2750.         if (dialdpy) {
  2751.         if (x != LF) conoc(x);
  2752.         if (x == CR) conoc(LF);
  2753.         }
  2754.     } while ( x != c);
  2755.     }
  2756. }
  2757.  
  2758. static int
  2759. didweget(s,r) char *s, *r; {    /* Looks in string s for response r */
  2760.     int lr = (int)strlen(r);    /*  0 means not found, 1 means found it */
  2761.     int i;
  2762.     debug(F110,"didweget",r,0);
  2763.     debug(F110," in",s,0);
  2764.     for (i = (int)strlen(s)-lr; i >= 0; i--)
  2765.     if ( s[i] == r[0] ) if ( !strncmp(s+i,r,lr) ) return( 1 );
  2766.     return( 0 );
  2767. }
  2768.  
  2769.  
  2770. /* R E S E T -- Reset alarms, etc. on exit. */
  2771.  
  2772. static VOID
  2773. dreset() {
  2774.     debug(F100,"dreset resetting alarm and signal handlers","",0);
  2775.     alarm(0);
  2776.     signal(SIGALRM,savalrm);        /* restore alarm handler */
  2777.     signal(SIGINT,savint);        /* restore interrupt handler */
  2778.     debug(F100,"dreset alarm and signal handlers reset","",0);
  2779. }
  2780.  
  2781. /*
  2782.   Call this routine when the modem reports that it has connected at a certain
  2783.   speed, giving that speed as the argument.  If the connection speed is not
  2784.   the same as Kermit's current communication speed, AND the modem interface
  2785.   speed is not locked (i.e. DIAL SPEED-MATCHING is not ON), then change the
  2786.   device speed to the one given.
  2787. */
  2788. static VOID
  2789. #ifdef CK_ANSIC
  2790. spdchg(long s)
  2791. #else
  2792. spdchg(s) long s;
  2793. #endif /* CK_ANSIC */
  2794. /* spdchg */ {
  2795.     int s2;
  2796.     if (!mdmspd)            /* If modem interface speed locked, */
  2797.       return;                /*  don't do this. */
  2798.     if (speed != s) {            /* Speeds differ? */
  2799.     s2 = s / 10L;            /* Convert to cps expressed as int */
  2800.     if (ttsspd(s2) < 0) {        /* Change speed. */
  2801.         printf(" WARNING - speed change to %ld failed.\r\n",s);
  2802.     } else {
  2803.         printf(" Speed changed to %ld.\r\n",s);
  2804.         speed = s;            /* Update global speed variable */
  2805.     }
  2806.     }
  2807. }
  2808.  
  2809. /*
  2810.   Display all characters received from modem dialer through this routine,
  2811.   for consistent handling of carriage returns and linefeeds.
  2812. */
  2813. static VOID
  2814. #ifdef CK_ANSIC
  2815. dialoc(char c)
  2816. #else
  2817. dialoc(c) char c;
  2818. #endif /* CK_ANSIC */
  2819. { /* dialoc */                /* Dial Output Character */
  2820.     if (dialdpy) {
  2821.     if (c != LF) conoc(c);        /* Don't echo LF */
  2822.     if (c == CR) conoc(LF);        /* Echo CR as CRLF */
  2823.     }
  2824. }
  2825.  
  2826. #ifndef MINIDIAL
  2827. #ifdef OLDTBCODE
  2828. /*
  2829.   tbati3() -- Routine to find out Telebit model when ATI reports "965"
  2830.   or "971". This routine sends another query, ATI3, to get further info
  2831.   to narrow down the model number.  Argument is ATI response as integer.
  2832.   Result: sets tbmodel variable to Telebit model.
  2833. */
  2834. static VOID
  2835. tbati3(n) int n; {
  2836.     int status;
  2837.     ttflui();                /* Flush input buffer */
  2838.     ttslow("ATI3\015",100);        /* Send ATI3<CR> */
  2839.     status = getok(5,0);        /* Get OK response, nonstrict */
  2840.     if (status < 1) {            /* ERROR or timeout */
  2841.     tbmodel = TB_UNK;
  2842.     debug(F111,"tbati3 fails",rbuf,status);
  2843.     return;
  2844.     }
  2845.     debug(F110,"tbati3 rbuf",rbuf,0);
  2846.  
  2847. /* Got a good response, check the model info */
  2848.  
  2849.     if (n == 965) {            /* "965" - various models. */
  2850.     if (didweget(rbuf,"T1600")) {
  2851.         tbmodel = TB_1600;            /* T1600 */
  2852.     } else if (didweget(rbuf,"T3000")) {
  2853.         tbmodel = TB_3000;            /* T3000 */
  2854.     } else if (didweget(rbuf,"World")) {
  2855.         tbmodel = TB_WBLA;            /* WorldBlazer */
  2856.     } else if (didweget(rbuf,"Version B") || /* TrailBlazer-Plus models */
  2857.            didweget(rbuf,"TBSA") ||
  2858.            didweget(rbuf,"TBRM") ||
  2859.            didweget(rbuf,"DC")) {     /* Ven-Tel EC18K */
  2860.         tbmodel = TB_PLUS;
  2861.     } else tbmodel = TB_UNK;        /* Others: Unknown */
  2862.  
  2863.     } else if (n == 971) {        /* "971" could be T1500 or T1600. */
  2864.     if (didweget(rbuf,"T1500"))
  2865.       tbmodel = TB_1500;
  2866.     else tbmodel = TB_2500;
  2867.     }                    /* Other, don't change tbmodel. */
  2868. }
  2869. #endif /* OLDTBCODE */
  2870. #endif /* MINIDIAL */
  2871.  
  2872. VOID                /* Get dialing defaults from environment */
  2873. getdialenv() {
  2874.     char *p = NULL;
  2875.  
  2876.     makestr(&p,getenv("K_DIAL_DIRECTORY")); /* Dialing directories */
  2877.     if (p) {
  2878.     int i;
  2879.     xwords(p,(MAXDDIR - 2),dialdir,0);
  2880.     for (i = 0; i < (MAXDDIR - 1); i++) {
  2881.         if (!dialdir[i+1])
  2882.           break;
  2883.         else
  2884.           dialdir[i] = dialdir[i+1];
  2885.     }
  2886.     ndialdir = i;
  2887.     }
  2888.     makestr(&diallcc,getenv("K_COUNTRYCODE")); /* My country code */
  2889.     makestr(&dialixp,getenv("K_LD_PREFIX"));   /* My long-distance prefix */
  2890.     makestr(&dialldp,getenv("K_INTL_PREFIX")); /* My international prefix */
  2891.     makestr(&dialldp,getenv("K_TF_PREFIX"));   /* Ny Toll-free prefix */
  2892.  
  2893.     p = NULL;
  2894.     makestr(&p,getenv("K_TF_AREACODE")); /* Toll-free areacodes */
  2895.     if (p) {
  2896.     int i;
  2897.     xwords(p,7,dialtfc,0);
  2898.     for (i = 0; i < 8; i++) {
  2899.         if (!dialtfc[i+1])
  2900.           break;
  2901.         else
  2902.           dialtfc[i] = dialtfc[i+1];
  2903.     }
  2904.     ntollfree = i;
  2905.     }
  2906.     if (diallcc) {            /* Have country code */
  2907.     if (!strcmp(diallcc,"1")) {    /* If it's 1 */
  2908.         if (!dialldp)        /* Set these prefixes... */
  2909.           makestr(&dialldp,"1");
  2910.         if (!dialtfp)
  2911.           makestr(&dialtfp,"1");
  2912.         if (!dialixp)
  2913.           makestr(&dialixp,"011");
  2914.         if (ntollfree == 0) {    /* Toll-free area codes... */
  2915.         if (dialtfc[0] = malloc(4)) {
  2916.             strcpy(dialtfc[0],"800");
  2917.             ntollfree++;
  2918.         }
  2919.         if (dialtfc[1] = malloc(4)) {
  2920.             strcpy(dialtfc[1],"888");
  2921.             ntollfree++;
  2922.         }
  2923.         }
  2924.     } else if (!strcmp(diallcc,"358") &&
  2925.            ((int) strcmp(zzndate(),"19961011") > 0)
  2926.            ) {            /* Finland */
  2927.         if (!dialldp)        /* Long-distance prefix */
  2928.           makestr(&dialldp,"9");
  2929.         if (!dialixp)         /* International dialing prefix */
  2930.           makestr(&dialixp,"990");
  2931.     } else {            /* Not NANP or Finland */
  2932.         if (!dialldp)
  2933.           makestr(&dialldp,"0");
  2934.         if (!dialixp)
  2935.           makestr(&dialixp,"00");
  2936.     }
  2937.     }
  2938.     makestr(&diallac,getenv("K_AREACODE"));
  2939.     makestr(&dialpxo,getenv("K_PBX_XCH"));
  2940.     makestr(&dialpxi,getenv("K_PBX_ICP"));
  2941.     makestr(&dialpxx,getenv("K_PBX_OCP"));
  2942. }
  2943.  
  2944. static int
  2945. dialfail(x) int x; {
  2946.     char * s;
  2947.  
  2948.     fail_code = x;
  2949.     debug(F101,"ckudial dialfail","",x);
  2950.     dreset();                /* Reset alarm and signal handlers */
  2951.  
  2952.     printf("%s Failure: ", func_code == 0 ? "DIAL" : "ANSWER");
  2953.     if (dialdpy) {            /* If showing progress */
  2954.        debug(F100,"dial display is on","",0);
  2955.     p = ck_time();            /* get current time; */
  2956.     if (*p) printf("%s: ",p);
  2957.     }
  2958.     switch (fail_code) {        /* Type of failure */
  2959.       case F_TIME:             /* Timeout */
  2960.     if (dial_what == DW_INIT)
  2961.       printf ("Timed out while trying to initialize modem.\n");
  2962.     else if (dial_what == DW_DIAL)
  2963.       printf ("%s interval expired.\n",
  2964.           func_code == 0 ? "DIAL TIMEOUT" : "ANSWER timeout");
  2965.     else printf("Timeout.\n");
  2966.     if (mp->capas & CKD_AT)
  2967.       ttoc('\015');        /* Send CR to interrupt dialing */
  2968.     /* Some Hayes modems don't fail with BUSY on busy lines */
  2969.     dialsta = DIA_TIMO;
  2970.     debug(F110,"dial","timeout",0);
  2971.     break;
  2972.  
  2973.       case F_INT:            /* Dialing interrupted */
  2974.     printf ("Interrupted.\n");
  2975.     debug(F110,"dial","interrupted",0);
  2976.     if (mp->capas & CKD_AT)
  2977.       ttoc('\015');            /* Send CR to interrupt dialing */
  2978.     dialsta = DIA_INTR;
  2979.     break;
  2980.  
  2981.     case F_MODEM:            /* Modem detected a failure */
  2982.          debug(F111,"dialfail()","lbuf",lbuf);
  2983.          if (lbuf && *lbuf) {
  2984.             printf(" \"");
  2985.             for (s = lbuf; *s; s++)
  2986.                if (isprint(*s))
  2987.                   putchar(*s);        /* Display printable reason */
  2988.             printf ("\"");
  2989.          } else printf(func_code == 0 ?
  2990.                         " Call not completed." :
  2991.                         " Call did not come in."
  2992.                         );
  2993.     printf("\n");
  2994.     debug(F110,"dial",lbuf?lbuf:"",0);
  2995.     if (dialsta < 0) dialsta = DIA_UNSP;
  2996.     break;
  2997.  
  2998.       case F_MINIT:            /* Failure to initialize modem */
  2999.     printf ("Error initializing modem.\n");
  3000.     debug(F110,"dial","modem init",0);
  3001.     dialsta = DIA_NOIN;
  3002.     break;
  3003.  
  3004.     default:
  3005.     printf("unknown\n");
  3006.     debug(F110,"dial","unknown",0);
  3007.     if (mp->capas & CKD_AT)
  3008.       ttoc('\015');            /* Send CR to interrupt dialing */
  3009.     dialsta = DIA_INTR;
  3010.     }
  3011.  
  3012. #ifdef DYNAMIC
  3013.     if (lbuf) free(lbuf); lbuf = NULL;
  3014.     if (rbuf) free(rbuf); rbuf = NULL;
  3015.     if (fbuf) free(fbuf); fbuf = NULL;
  3016. #endif /* DYNAMIC */
  3017.  
  3018.     if (dialsta < 0) dialsta = DIA_UERR; /* Set failure code */
  3019.     return(0);                /* Return zero (important) */
  3020. }
  3021.  
  3022. /*  C K D I A L     --  Dial up the remote system */
  3023.  
  3024. /* Returns 1 if call completed, 0 otherwise */
  3025.  
  3026. static int waitct, mdmwait, mdmstat = 0;
  3027. int mdmwaitd = 10 ;   /* difference between dialtmo and mdmwait */
  3028. static char c;
  3029. static char *telnbr;
  3030.  
  3031. static SIGTYP
  3032. #ifdef CK_ANSIC
  3033. _dodial(void * threadinfo)
  3034. #else /* CK_ANSIC */
  3035. _dodial(threadinfo) VOID * threadinfo;
  3036. #endif /* CK_ANSIC */
  3037. /* _dodial */ {
  3038.     char c2;
  3039.     char *s, *ws;
  3040.     int x = 0, n = F_TIME;
  3041.  
  3042. #ifdef NTSIG
  3043.     if (threadinfo) {            /* Thread local storage... */
  3044.     TlsSetValue(TlsIndex,threadinfo);
  3045.     }
  3046. #endif /* NTSIG */
  3047.  
  3048.     /* Hang up the modem (in case it wasn't "on hook") */
  3049.     /* But only if SET DIAL HANGUP ON... */
  3050.  
  3051.     if (dialhup() < 0) {        /* Hangup first */
  3052.     debug(F100,"ckdial dialhup failed","",0);
  3053. #ifndef MINIDIAL
  3054.     if (mdmcapas & CKD_TB)        /* Telebits might need a BREAK */
  3055.       ttsndb();            /*  first. */
  3056. #endif /* MINIDIAL */
  3057.     if (dialhng && dialsta != DIA_PART) { /* If hangup failed, */
  3058.         ttclos(0);            /* close and reopen the device. */
  3059.         if (ttopen(ttname,&local,mymdmtyp,0) < 0) {
  3060.         printf("Sorry, Can't hang up communication device.\n");
  3061.         printf("Try 'set line %s' again.\n",ttname);
  3062.         dialsta = DIA_HANG;
  3063. #ifdef DYNAMIC
  3064.         if (lbuf) free(lbuf); lbuf = NULL;
  3065.         if (rbuf) free(rbuf); rbuf = NULL;
  3066.         if (fbuf) free(fbuf); fbuf = NULL;
  3067. #endif /* DYNAMIC */
  3068.         dreset();
  3069. #ifdef NTSIG
  3070.         ckThreadEnd(threadinfo);
  3071. #endif /* NTSIG */
  3072.         SIGRETURN;
  3073.         }
  3074.     }
  3075.     }
  3076. #ifndef MINIDIAL
  3077.     /* Don't start talking to Rolm too soon */
  3078.     if (mymdmtyp == n_ROLM && dialsta != DIA_PART)
  3079.       msleep(500);
  3080. #endif /* MINIDIAL */
  3081.  
  3082. /* Send init-string */
  3083.  
  3084.     if (dialsta != DIA_PART
  3085. #ifndef MINIDIAL
  3086.     && mymdmtyp != n_ATTUPC
  3087. #endif /* MINIDIAL */
  3088.     ) {
  3089.     fail_code = F_MINIT;        /* Default failure code */
  3090.     dial_what = DW_INIT;        /* What I'm Doing Now   */
  3091.     if (dialdpy) {            /* If showing progress, */
  3092.         p = ck_time();        /* display timestamp.   */
  3093.         if (*p) printf(" Initializing: %s...\n",p);
  3094.     }
  3095.     }
  3096.  
  3097. #ifndef MINIDIAL
  3098. #ifdef ATT7300
  3099.     if (mymdmtyp == n_ATTUPC) {
  3100. /*
  3101.   For ATT7300/Unix PC's with their special internal modem.  Whole dialing
  3102.   process is handled right here, an exception to the normal structure.
  3103.   Timeout and user interrupts are enabled during dialing.  attdial() is in
  3104.   file ckutio.c.  - jrd
  3105. */
  3106.         _PROTOTYP( int attdial, (char *, long, char *) );
  3107.     fail_code = F_MODEM;        /* Default failure code */
  3108.     dial_what = DW_DIAL;
  3109.     if (dialdpy) {            /* If showing progress */
  3110.         p = ck_time();        /* get current time; */
  3111.         if (*p) printf(" Dialing: %s...\n",p);
  3112.     }
  3113.     alarm(waitct);            /* Do alarm properly */
  3114.     if (attdial(ttname,speed,telnbr)) { /* dial internal modem */
  3115.         dreset();            /* reset alarms, etc. */
  3116.         printf(" Call failed.\r\n");
  3117.         dialhup();                /* Hangup the call */
  3118. #ifdef DYNAMIC
  3119.         if (lbuf) free(lbuf); lbuf = NULL;
  3120.         if (rbuf) free(rbuf); rbuf = NULL;
  3121.         if (fbuf) free(fbuf); fbuf = NULL;
  3122. #endif /* DYNAMIC */
  3123.         dialsta = DIA_UERR;
  3124. #ifdef NTSIG
  3125.         ckThreadEnd(threadinfo);
  3126. #endif /* NTSIG */
  3127.         SIGRETURN;            /* return failure */
  3128.     }
  3129.     dreset();            /* reset alarms, etc. */
  3130.     ttpkt(speed,FLO_DIAX,parity);    /* cancel dialing ioctl */
  3131.     if (!quiet && !backgrd) {
  3132.         if (dialdpy) printf("\n");
  3133.         printf(" Call complete.\r\n");
  3134.     }
  3135.     dialsta = DIA_OK;
  3136. #ifdef DYNAMIC
  3137.     if (lbuf) free(lbuf); lbuf = NULL;
  3138.     if (rbuf) free(rbuf); rbuf = NULL;
  3139.     if (fbuf) free(fbuf); fbuf = NULL;
  3140. #endif /* DYNAMIC */
  3141. #ifdef NTSIG
  3142.     ckThreadEnd(threadinfo);
  3143. #endif /* NTSIG */
  3144.     SIGRETURN;    /* No conversation with modem to complete dialing */
  3145.     } else
  3146. #endif /* ATT7300 */
  3147.     if (mymdmtyp == n_TAPI) {        /* Windows dialer */
  3148.     printf("INSERT CALL TO WINDOWS TELEPHONY API HERE\n");
  3149. #ifdef NTSIG
  3150.     ckThreadEnd(threadinfo);
  3151. #endif /* NTSIG */
  3152.     SIGRETURN;
  3153.     } else
  3154. #endif /* MINIDIAL */
  3155.  
  3156. /* Modems with AT command set... */
  3157.  
  3158.       if ((mdmcapas & CKD_AT) && dialsta != DIA_PART) {
  3159.  
  3160.       if (dialini)            /* Get wakeup/init string */
  3161.         ws = dialini;
  3162.       else
  3163.         ws = mp->wake_str;
  3164.       if (!ws) ws = "\015";        /* If none, use CR */
  3165.  
  3166.       for (tries = 4; tries > 0; tries--) {    /* Send it */
  3167.           ttslow(ws,mp->wake_rate);
  3168.           mdmstat = getok(4,1);    /* Get response */
  3169.           if (mdmstat > 0) break;
  3170.           if (dialdpy && tries > 1)
  3171.         printf(" No response from modem, retrying%s...\n",
  3172.                (tries < 4) ? " again" : "");
  3173.       }
  3174.       debug(F101,"ckdial wake_str mdmstat","",mdmstat);
  3175.  
  3176.       if (mdmstat < 1) {         /* Initialized OK? */
  3177.           dialfail(F_MINIT); /* No, fail. */
  3178. #ifdef NTSIG
  3179.           ckThreadEnd(threadinfo);
  3180. #endif /* NTSIG */
  3181.           SIGRETURN;
  3182.       } else {            /* Yes. */
  3183.           char hbuf[16];
  3184.  
  3185.           if (mdmwait > 255)    /* If larger than maximum, */
  3186.         mdmwait = 255;        /* make it maximum. */
  3187.  
  3188.           sprintf(hbuf,"ATS7=%d%c",mdmwait,13); /* S7 carrier wait time */
  3189.           ttslow(hbuf,mp->wake_rate); /* Set it. */
  3190.           mdmstat = getok(4,1);    /* Get response from modem */
  3191.           /* If it gets an error, go ahead anyway */
  3192.           debug(F101,"ckdial S7 mdmstat","",mdmstat);
  3193.       }
  3194.  
  3195. #ifndef MINIDIAL
  3196. #ifdef OLDTBCODE
  3197. /*
  3198.   Telebit modems fall into two basic groups: old and new.  The functions and
  3199.   command sets are different between the two groups, and also vary by specific
  3200.   models within each group, and even by firmware ROM revision number.  Read
  3201.   ckcker.bwr for details.
  3202.  
  3203.   Commands used by C-Kermit include:
  3204.  
  3205.     Old       New            Meaning
  3206.     -------   --------       ----------------------------------------
  3207.     Q0        Q0             Enable result codes.
  3208.     X1        X1             Extended result codes.
  3209.     X1        X1             Extended result codes + BUSY, NO DIALTONE, etc.
  3210.     I         I              Model number inquiry.
  3211.     I3        I3             Additional model information inquiry.
  3212.     S12=50    S12=50         Escape sequence guard time (1 sec).
  3213.     S2=43     S2=43          Escape character is '+'.
  3214.     S7=xx     S7=xx          DIAL TIMEOUT, calculated or SET by user.
  3215.     S48=0     S48=0          7-bit data (Kermit's PARITY is not NONE).
  3216.     S48=1     S48=1          8-bit data (Kermit's PARITY is NONE).
  3217.     S50=0     S50=0          Automatic speed & protocol determination.
  3218.     S50=3     S50=3          2400/1200/300 bps.
  3219.     S50=6     S50=6          V.32 (9600 bps).
  3220.     S50=255   S50=255        PEP mode.
  3221.     S110=1    S190=1 S191=7  Allow compression in PEP mode.
  3222.     S51=?     S51=?          DTE interface speed (left alone by Kermit).
  3223.     S54=3     S61=0 S63=0    Pass BREAK signal (always).
  3224.     S58=2     S58=2          RTS/CTS flow control if Kermit's FLOW is RTS/CTS.
  3225.     S58=?     S58=?          S58 unchanged if Kermit's FLOW is not RTS/CTS.
  3226.     S68=255   S68=255        Use flow control specified by S58 (always).
  3227.     S95=0     S180=0         MNP disabled (SET DIAL MNP-ENABLE OFF)
  3228.     S95=2     S180=3         MNP, fallback to direct (also as V.42 fallback)
  3229.     S97=1     S180=2         Enable V.42 (LAPM) error correction
  3230.     S98=3                    Enable compression in both directions
  3231.     S106=1                   V.42bis compression enable
  3232.  
  3233. For Kermit Spoof (same commands for all models that support it):
  3234.  
  3235.     S111=0                   No Kermit spoofing
  3236.     S111=10                  Kermit with no parity
  3237.     S111=11                  Kermit with odd parity
  3238.     S111=12                  Kermit with even parity
  3239.     S111=13                  Kermit with mark parity
  3240.     S111=14                  Kermit with space parity
  3241.     S112=??                  Kermit's start-of-packet character (stchr).
  3242. */
  3243.       if (mdmcapas & CKD_TB) { /* Telebits... */
  3244.  
  3245.           int S111;            /* Telebit Kermit spoof register */
  3246.           char tbcmdbuf[64];    /* Telebit modem command buffer */
  3247.           char *ecstr = "";        /* Pointer to EC-enable string */
  3248.           char *dprstr = "";    /* Pointer to dial protocol string */
  3249. /*
  3250.   If user defined a DIAL INIT-STRING, send that now, otherwise send built-in
  3251.   Telebit string.  Try up to 4 times to get OK or 0 response from modem.
  3252.   NOTE: The default init string *must* be independent of Telebit model.
  3253. */
  3254.           ws = dialini ? dialini : TELEBIT.wake_str;
  3255.           debug(F110,"ckdial telebit init string",ws,0);
  3256.           for (tries = 4; tries > 0; tries--) {
  3257.           ttsndb();        /* Begin by sending BREAK */
  3258.           ttslow(ws,mp->wake_rate); /* Send wakeup string */
  3259.           mdmstat = getok(5,0);    /* Get modem's response */
  3260.           if (mdmstat) break;    /* If response OK, done */
  3261.           if (dialdpy && tries > 1)
  3262.             printf(" No response from modem, retrying%s...\n",
  3263.                (tries < 4) ? " again" : "");
  3264.           msleep(300);        /* Otherwise, sleep 1/3 second */
  3265.           dialhup();        /* Hang up */
  3266.           ttflui();        /* Flush input buffer and try again */
  3267.           }
  3268.           if (mdmstat < 1) {    /* If we didn't get a response, */
  3269.           dialfail(F_MINIT); /* fail. */
  3270. #ifdef NTSIG
  3271.           ckThreadEnd(threadinfo);
  3272. #endif /* NTSIG */
  3273.           SIGRETURN;
  3274.           }
  3275.           if (!dialini) {        /* If using built-in init strings... */
  3276. /*
  3277.   Try to get the model number.  It should be in the getok() response buffer,
  3278.   rbuf[], because the Telebit init string asks for it with the "I" command.
  3279.   If the model number is 965, we have to make another query to narrow it down.
  3280. */
  3281.           if (didweget(rbuf,"962") || /* Check model number */
  3282.               didweget(rbuf,"961") ||
  3283.               didweget(rbuf,"963")) {
  3284.               tbmodel = TB_BLAZ; /* Trailblazer */
  3285.           } else if (didweget(rbuf,"972")) {
  3286.               tbmodel = TB_2500; /* T2500 */
  3287.           } else if (didweget(rbuf,"968")) {
  3288.               tbmodel = TB_1000;    /* T1000 */
  3289.           } else if (didweget(rbuf,"966") ||
  3290.                  didweget(rbuf,"967") ||
  3291.                  didweget(rbuf,"964")) {
  3292.               tbmodel = TB_PLUS; /* Trailblazer-Plus */
  3293.           } else if (didweget(rbuf,"969")) {
  3294.               tbmodel = TB_QBLA; /* Qblazer */
  3295.           } else if (didweget(rbuf,"970")) {
  3296.               tbmodel = TB_QBLA; /* Qblazer Plus */
  3297.           } else if (didweget(rbuf,"965")) { /* Most new models */
  3298.               tbati3(965);    /* Go find out */
  3299.           } else if (didweget(rbuf,"971")) { /* T1500 or T2500 */
  3300.               tbati3(971);    /* Go find out */
  3301.           } else if (didweget(rbuf,"123") || didweget(rbuf,"960")) {
  3302.               tbmodel = TB_UNK;    /* Telebit in Hayes mode */
  3303.           }
  3304.           debug(F111,"Telebit model",tb_name[tbmodel],tbmodel);
  3305.           if (dialdpy)
  3306.             printf("Telebit model: %s\n",tb_name[tbmodel]);
  3307.           ttflui();
  3308. /*
  3309.   Flow control.  If C-Kermit's FLOW-CONTROL is RTS/CTS, then we set this on
  3310.   the modem too.  Unfortunately, many versions of UNIX only allow RTS/CTS
  3311.   to be set outside of Kermit (e.g. by selecting a special device name).
  3312.   In that case, Kermit doesn't know that it should set RTS/CTS on the modem,
  3313.   in which case the user SET MODEM FLOW appropriately.
  3314. */
  3315.           if (flow == FLO_RTSC) { /* RTS/CTS active in Kermit */
  3316.               sprintf(tbcmdbuf,
  3317.                   "ATS7=%d S48=%d S50=0 S58=2 S68=255\015",
  3318.                   mdmwait, parity ? 0 : 1);
  3319.           } else
  3320.             sprintf(tbcmdbuf,    /* Otherwise, don't touch modem's fc */
  3321.                 "ATS7=%d S48=%d S50=0 S68=255\015",
  3322.                 mdmwait, parity ? 0 : 1);
  3323.           s = tbcmdbuf;
  3324.           debug(F110,"ckdial Telebit init step 2",s,0);
  3325.           for (tries = 4; tries > 0; tries--) {
  3326.               ttslow(s,mp->wake_rate);
  3327.               mdmstat = getok(5,1);
  3328.               if (mdmstat) break;
  3329.               if (dialdpy && tries > 1)
  3330.             printf(" No response from modem, retrying%s...\n",
  3331.                    (tries < 4) ? " again" : "");
  3332.               msleep(500);
  3333.               ttflui();
  3334.           }
  3335.           if (mdmstat < 1) {
  3336.               dialfail(F_MINIT);
  3337. #ifdef NTSIG
  3338.               ckThreadEnd(threadinfo);
  3339. #endif /* NTSIG */
  3340.               SIGRETURN;
  3341.           }
  3342. /*
  3343.   Model-dependent items, but constant per model.
  3344. */
  3345.           switch (tbmodel) {
  3346.             case TB_BLAZ:
  3347.             case TB_PLUS:    /* TrailBlazer-Plus */
  3348.             case TB_1000:    /* T1000 */
  3349.             case TB_2000:    /* T2000 */
  3350.             case TB_2500:    /* T2500 */
  3351. #ifdef COMMENT
  3352. /* Code from edit 183 told modem to follow RS-232 wrt CD and DTR */
  3353.               /* DTR, CD, follow RS-232, pass BREAK */
  3354.               sprintf(tbcmdbuf,"ATS52=1 S53=4 S54=3\015");
  3355. #else
  3356. /* But everybody agreed we should not touch modem's CD and DTR settings. */
  3357.               /* Just pass BREAK */
  3358.               sprintf(tbcmdbuf,"ATS54=3\015");
  3359. #endif /* COMMENT */
  3360.               break;
  3361.             case TB_1600:    /* T1600 */
  3362.             case TB_3000:    /* T3000 */
  3363.             case TB_WBLA:    /* WorldBlazer */
  3364.             case TB_QBLA:    /* Qblazer */
  3365. #ifdef COMMENT
  3366. /* Code from edit 183 */
  3367.               /* Follow RS-232, No CONNECT suffix, pass BREAK */
  3368.               sprintf(tbcmdbuf,"AT&C1&D2&Q0 S59=0 S61=0 S63=0\015");
  3369. #else
  3370. /*
  3371.   Everybody agrees we should not touch modem's CD and DTR settings.
  3372.   Also no more &Q0, no more S59=0 (doesn't matter, so don't touch).
  3373.   So this section now deals only with treatment of BREAK.
  3374.   Here we also raise the result code from X1 to X2, which allows
  3375.   the T1600, T3000, and WB to supply NO DIALTONE, BUSY, RRING, and DIALING.
  3376.   X2 means something else on the other models.
  3377. */
  3378.               /* Transmit BREAK in sequence, raise result code. */
  3379.               sprintf(tbcmdbuf,"ATX2 S61=0 S63=0\015");
  3380. #endif /* COMMENT */
  3381.               break;
  3382.             default:        /* Others, do nothing */
  3383.               tbcmdbuf[0] = NUL;
  3384.               break;
  3385.           }
  3386.           s = tbcmdbuf;
  3387.           if (*s) {
  3388.               debug(F110,"ckdial Telebit init step 3",s,0);
  3389.               for (tries = 4; tries > 0; tries--) {
  3390.               ttslow(s,mp->wake_rate);
  3391.               mdmstat = getok(5,1);
  3392.               if (mdmstat) break;
  3393.               if (dialdpy && tries > 1)
  3394.                 printf(" No response from modem, retrying%s...\n",
  3395.                    (tries < 4) ? " again" : "");
  3396.               msleep(500);
  3397.               ttflui();
  3398.               }
  3399.               if (mdmstat < 1)
  3400.             dialfail(F_MINIT);
  3401.           } else debug(F100,"ckdial Telebit init step 3 skipped","",0);
  3402.  
  3403. /* Error correction, MNP or V.42 */
  3404.  
  3405.           if (dialec) {        /* User wants error correction */
  3406.               switch (tbmodel) { /* which implies fallback to MNP. */
  3407.             case TB_PLUS:    /* BC7.00 and up firmware */
  3408.             case TB_2000:    /* now really the same as TB+ ? */
  3409.             case TB_2500:    /* LAPM+compress->MNP->direct */
  3410.               ecstr = "S50=0 S95=2 S97=1 S98=3 S106=1";
  3411.               break;
  3412.             case TB_1600:
  3413.             case TB_3000:
  3414.             case TB_WBLA:
  3415.             case TB_QBLA:
  3416. #ifdef COMMENT
  3417.               /* V.42, fallback = lock speed */
  3418.               ecstr = "S180=2 S181=0";
  3419. #else
  3420. /* Better not to mess with S181, let it be used however user has it set. */
  3421. /* S180=2 allows fallback to MNP, S180=1 disallows fallback to MNP. */
  3422.               ecstr = "S180=2";    /* V.42 */
  3423. #endif /* COMMENT */
  3424.               break;
  3425.             default:
  3426.               if (dialdpy)
  3427.                 printf(
  3428. "V.42 not supported by this Telebit model\n");
  3429.               }
  3430.           } else {        /* Handle DIAL ERROR-CORRE.. setting */
  3431.               switch (tbmodel) {
  3432.             case TB_BLAZ:    /* TrailBlazer */
  3433.             case TB_PLUS:    /* TrailBlazer-Plus */
  3434.             case TB_1000:    /* T1000 */
  3435.             case TB_2000:    /* T2000 */
  3436.             case TB_2500:    /* T2500 */
  3437.               ecstr = dialec ? "S95=2" : "S95=0"; /* ON, OFF */
  3438.               break;
  3439.             case TB_1600:    /* T1600 */
  3440.             case TB_3000:    /* T3000 */
  3441.             case TB_WBLA:    /* WorldBlazer */
  3442.             case TB_QBLA:    /* Qblazer */
  3443.               ecstr = dialec ? "S180=3" : "S180=0"; /* ON, OFF */
  3444.               /* (Leave S181 fallback method alone) */
  3445.               break;
  3446.             default:
  3447.               ecstr = "";
  3448.               }
  3449.           }
  3450.  
  3451. /* Dialing protocol */
  3452.  
  3453.           dprstr = "";    /* Initialize dialing protocol string */
  3454.           p = "";        /* and message string */
  3455.           switch (mymdmtyp) {
  3456.             case n_TELEBIT:    /* Start at highest and work down */
  3457.               p = "standard";
  3458.               switch (tbmodel) { /* First group starts with PEP */
  3459.             case TB_BLAZ:    /* TrailBlazer */
  3460.             case TB_PLUS:    /* TrailBlazer-Plus */
  3461.             case TB_1000:    /* T1000 */
  3462.             case TB_2000:    /* T2000 */
  3463.             case TB_2500:    /* T2500 */
  3464.               dprstr = "S50=0 S110=1"; /* PEP, compression. */
  3465.               break;
  3466.             case TB_WBLA:    /* WorldBlazer has PEP */
  3467.               dprstr = "S50=0 S190=1 S191=7"; /* PEP, */
  3468.               break;    /* compression allowed. */
  3469.             case TB_1600:    /* T1600 doesn't have PEP */
  3470.             case TB_3000:    /* T3000 doesn't */
  3471.             case TB_QBLA:    /* Qblazer doesn't*/
  3472.             default:
  3473.               dprstr = "S50=0"; /* No PEP available */
  3474.               break;
  3475.               }
  3476.               break;
  3477.  
  3478. #ifdef COMMENT
  3479. /* Who needs it? */
  3480.             case n_TBS:        /* Telebit up to 2400 Baud */
  3481.               p = "300/1200/2400 Baud"; /* Leave S90 alone assuming */
  3482.               dprstr = "S50=3";    /* already set for V.22 vs 212A */
  3483.               break;
  3484.             case n_TB3:        /* Telebit V.32 */
  3485.               if (tbmodel == TB_3000 || tbmodel == TB_1600 ||
  3486.               tbmodel == TB_2500 || tbmodel == TB_WBLA) {
  3487.               p = "V.32";
  3488.             /* Note: we don't touch S51 (interface speed) here. */
  3489.             /* We're already talking to the modem, and the modem */
  3490.             /* SHOULD be able to make a V.32 call no matter what */
  3491.             /* its interface speed is.  (In practice, however, */
  3492.             /* that is not always true.) */
  3493.               dprstr = "S50=6";
  3494.               } else if (dialdpy)
  3495.             printf("V.32 not supported by this Telebit model.\n");
  3496.               break;
  3497.  
  3498.             case n_TBPEP:    /* Force PEP Protocol */
  3499.               /* Models that don't support PEP */
  3500.               if (tbmodel != TB_1600 &&
  3501.               tbmodel != TB_3000 &&
  3502.               tbmodel != TB_QBLA) {
  3503.               p = "PEP";
  3504.               if (tbmodel == TB_WBLA) /* WorldBlazer */
  3505.                 dprstr = "S50=255 S190=1 S191=7";
  3506.               else if (tbmodel != TB_1000)
  3507.                 dprstr = "S50=255 S110=1"; /* TrailBlazer, etc. */
  3508.               else dprstr = "S50=255"; /* T1000, no compression */
  3509.               } else if (dialdpy)
  3510.             printf("PEP not supported by this Telebit model.\n");
  3511.               break;
  3512. #endif /* COMMENT */
  3513.           }
  3514.  
  3515.           /* Telebit Kermit Spoof */
  3516.  
  3517.           if (dialksp) {
  3518.               p = "Kermit Spoof";
  3519.               switch (parity) {    /* S111 value depends on parity */
  3520.             case 'e': S111 = 12; break;
  3521.             case 'm': S111 = 13; break;
  3522.             case 'o': S111 = 11; break;
  3523.             case 's': S111 = 14; break;
  3524.             case 0:
  3525.             default:  S111 = 10; break;
  3526.               }
  3527.               if (tbmodel != TB_QBLA)
  3528.             sprintf(tbcmdbuf,"AT%s %s S111=%d S112=%d\015",
  3529.                 ecstr,dprstr,S111,stchr);
  3530.               else {        /* Qblazer has no Kermit spoof */
  3531.               sprintf(tbcmdbuf,"AT%s %s\015", ecstr,dprstr);
  3532.               p = "No Kermit Spoof";
  3533.               if (dialdpy)
  3534.                 printf("Kermit Spoof not supported by Qblazer\n");
  3535.               }
  3536.           } else {        /* KERMIT-SPOOF OFF */
  3537.               p = "No Kermit Spoof";
  3538.               sprintf(tbcmdbuf,"AT%s %s %s\015",
  3539.                   ecstr, dprstr,
  3540.                   (tbmodel == TB_QBLA) ? "" : "S111=0");
  3541.           }
  3542.           s = tbcmdbuf;
  3543.           debug(F111,"ckdial Telebit config",p,speed);
  3544.           debug(F110,"ckdial Telebit init step 4",s,0);
  3545.           if (*s) {
  3546.               for (tries = 4; tries > 0; tries--) {
  3547.               ttslow(s,mp->wake_rate);
  3548.               mdmstat = getok(5,1);
  3549.               if (mdmstat) break;
  3550.               if (dialdpy && tries > 1)
  3551.                 printf(" No response from modem, retrying%s...\n",
  3552.                    (tries < 4) ? " again" : "");
  3553.               msleep(500);
  3554.               ttflui();
  3555.               }
  3556.               debug(F101,"ckdial telebit init mdmstat","",mdmstat);
  3557.               if (mdmstat < 1)
  3558.             dialfail(F_MINIT);
  3559.           }
  3560.           }
  3561.           /* Done with Telebit protocols, remove bits from modem type */
  3562.           /* Except nonverbal bit */
  3563.           debug(F101,"ckdial Telebit mymdmtyp","",mymdmtyp);
  3564.       }
  3565. #endif /* OLDTBCODE */
  3566.  
  3567.     } else if (mymdmtyp == n_ATTDTDM && dialsta != DIA_PART) { /* AT&T ... */
  3568.     ttsndb();            /* Send BREAK */
  3569. #endif /* MINIDIAL */
  3570.  
  3571.     } else if ( dialsta != DIA_PART ) { /* All others */
  3572.  
  3573.  
  3574.  
  3575.     /* Place modem into command mode */
  3576.  
  3577.     ws = dialini ? dialini : mp->wake_str;
  3578.     if (ws && (int)strlen(ws) > 0) {
  3579.         debug(F111,"ckdial default, wake string", ws, mp->wake_rate);
  3580.         ttslow(ws, mp->wake_rate);
  3581.     } else debug(F100,"ckdial no wake_str","",0);
  3582.     if (mp->wake_prompt && (int)strlen(mp->wake_prompt) > 0) {
  3583.         debug(F110,"ckdial default, waiting for wake_prompt",
  3584.           mp->wake_prompt,0);
  3585.         alarm(10);
  3586.         waitfor(mp->wake_prompt);
  3587.         alarm(0);
  3588.     } else debug(F100,"ckdial no wake_prompt","",0);
  3589.     }
  3590.     if (dialsta != DIA_PART) {
  3591.     alarm(0);            /* Turn off alarm */
  3592.     debug(F100,"ckdial got wake prompt","",0);
  3593.     msleep(500);            /* Allow settling time */
  3594.     }
  3595. /* Handle error correction, data compression, and flow control... */
  3596.  
  3597.     if ( dialsta != DIA_PART
  3598. #ifndef MINIDIAL
  3599. #ifdef OLDTBCODE
  3600.     && !(mdmcapas & CKD_TB)        /* Telebits already done. */
  3601. #endif /* OLDTBCODE */
  3602. #endif /* MINIDIAL */
  3603.     ) {
  3604.  
  3605.     /* Enable/disable error-correction */
  3606.  
  3607.     x = 0;
  3608.     if (dialec) {            /* DIAL ERROR-CORRECTION is ON */
  3609.         if (dialecon) {        /* SET DIAL STRING ERROR-CORRECTION */
  3610.         x = 1;
  3611.         ttslow(dialecon, mp->wake_rate);        
  3612.         } else if (mdmcapas & CKD_EC) {
  3613.         x = 1;
  3614.         ttslow(mp->ec_on_str, mp->wake_rate);
  3615.         } else printf(
  3616.           "WARNING - I don't know how to turn on EC for this modem\n"
  3617.              );
  3618.     } else {
  3619.         if (dialecoff) {        /* SET DIAL STRING */
  3620.         x = 1;
  3621.         ttslow(dialecoff, mp->wake_rate);        
  3622.         } else if (mdmcapas & CKD_EC) { /* Or built-in one... */
  3623.         x = 1;
  3624.         ttslow(mp->ec_off_str, mp->wake_rate);
  3625.         }
  3626. #ifdef COMMENT
  3627.         else printf(
  3628.           "WARNING - I don't know how to turn off EC for this modem\n"
  3629.              );
  3630. #endif /* COMMENT */
  3631.     }
  3632.     debug(F101,"ckudia xx_ok","",xx_ok);
  3633.     if (x && xx_ok) {            /* Look for OK response */
  3634.         debug(F100,"ckudia calling xx_ok for EC","",0);
  3635.         x = (*xx_ok)(5,1);
  3636.         debug(F101,"ckudia xx_ok","",x);
  3637.         if (x < 0) {
  3638.         printf("WARNING - Trouble enabling error-correction.\n");
  3639.         printf(
  3640. " Likely cause: Your modem is an RPI model, which does not have built-in\n");
  3641.         printf(" error correction and data compression.");
  3642.         }
  3643.     }
  3644.  
  3645.     /* Enable/disable data compression */
  3646.  
  3647.     if (x > 0) x = 0;
  3648.     if (dialdc) {
  3649.         if (x < 0 || !dialec) {
  3650.         printf(
  3651. "WARNING - You can't have compression without error correction.\n");
  3652.         } else if (dialdcon) {    /* SET DIAL STRING ... */
  3653.         x = 1;
  3654.         ttslow(dialdcon, mp->wake_rate);        
  3655.         } else if (mdmcapas & CKD_DC) {
  3656.         x = 1;
  3657.         ttslow(mp->dc_on_str, mp->wake_rate);
  3658.         } else printf(
  3659.           "WARNING - I don't know how to turn on DC for this modem\n"
  3660.               );
  3661.     } else {
  3662.         if (dialdcoff) {        /* SET DIAL STRING */
  3663.         x = 1;
  3664.         ttslow(dialdcoff, mp->wake_rate);        
  3665.         } else if (mdmcapas & CKD_DC) { /* Or built-in one... */
  3666.         x = 1;
  3667.         ttslow(mp->dc_off_str, mp->wake_rate);
  3668.         }
  3669. #ifdef COMMENT
  3670.         else printf(
  3671. "WARNING - I don't know how to turn off compression for this modem\n"
  3672.               );
  3673. #endif /* COMMENT */
  3674.     }
  3675.     if (x && xx_ok) {            /* Look for OK response */
  3676.         x = (*xx_ok)(5,1);
  3677.         if (x < 0) printf("WARNING - Trouble enabling compression\n");
  3678.     }
  3679.  
  3680. /* Flow control */
  3681.  
  3682.     x = 0;                /* User said SET DIAL FLOW RTS/CTS */
  3683.     if ( dialfc == FLO_RTSC ||    /* Even if Kermit's FLOW isn't...  */
  3684.         (dialfc == FLO_AUTO && flow == FLO_RTSC)) {    
  3685.         if (dialhwfc) {        /* User-defined HWFC string */
  3686.         x = 1;
  3687.         ttslow(dialhwfc, mp->wake_rate);
  3688.         } else if (mdmcapas & CKD_HW) { /* or built-in one */
  3689.         x = 1;
  3690.         ttslow(mp->hwfc_str, mp->wake_rate);
  3691.         } else
  3692.           printf("WARNING - I don't know how to enable modem's HWFC.\n");
  3693.  
  3694.     } else if ( dialfc == FLO_XONX || /* User said SET DIAL FLOW SOFT */
  3695.            (dialfc == FLO_AUTO && flow == FLO_XONX)) {
  3696.         if (dialswfc) {
  3697.         x = 1;
  3698.         ttslow(dialswfc, mp->wake_rate);
  3699.         } else if (mdmcapas & CKD_SW) {
  3700.         x = 1;
  3701.         ttslow(mp->swfc_str, mp->wake_rate);
  3702.         }
  3703.  
  3704.     } else if (dialfc == FLO_NONE) { /* User said SET DIAL FLOW NONE */
  3705.         if (dialnofc) {
  3706.         x = 1;
  3707.         ttslow(dialnofc, mp->wake_rate);
  3708.         } else if (mp->nofc_str && *(mp->nofc_str)) {
  3709.         x = 1;
  3710.         ttslow(mp->nofc_str, mp->wake_rate);
  3711.         }
  3712.     }
  3713.     if (x && xx_ok) {        /* Get modem's response */
  3714.         x = (*xx_ok)(5,1);
  3715.         if (x < 0)
  3716.          printf("WARNING - Trouble %sabling modem's local flow control\n",
  3717.             (dialfc == FLO_NONE) ? "dis" : "en");
  3718. #ifdef CK_TTSETFLOW
  3719. #ifdef CK_RTSCTS
  3720. /*
  3721.   So far only ckutio.c has ttsetflow().
  3722.   We have just told the modem to turn on RTS/CTS flow control and the modem
  3723.   has said OK.  But we ourselves have not turned it on yet because of the
  3724.   disgusting ttpkt(...FLO_DIAL...) hack.  So now, if the computer does not
  3725.   happen to be asserting RTS, the modem will no longer send characters to it.
  3726.   So at EXACTLY THIS POINT, we must enable RTS/CTS in the device driver.
  3727. */
  3728.         if (dialfc == FLO_RTSC ||
  3729.         (dialfc == FLO_AUTO && flow == FLO_RTSC))
  3730.           ttsetflow(FLO_RTSC);
  3731. #endif /* CK_RTSCTS */
  3732. #endif /* CK_TTSETFLOW */
  3733.     }
  3734.     }
  3735.  
  3736. #ifndef MINIDIAL
  3737.     if (mdmcapas & CKD_KS && dialsta != DIA_PART) { /* Kermit spoof */
  3738.     int r;                /* Register */
  3739.     char tbcmdbuf[20];        /* Command buffer */
  3740.     switch (mymdmtyp) {
  3741.   
  3742.       case n_MICROCOM:        /* Microcoms in SX mode */
  3743.           if (dialksp)
  3744.           sprintf(tbcmdbuf,"APM1;KMC%d\015",stchr);
  3745.         else
  3746.           sprintf(tbcmdbuf,"APM0\015");
  3747.           ttslow(tbcmdbuf, MICROCOM.wake_rate);
  3748.           alarm(3);
  3749.         waitfor(mp->wake_prompt);
  3750.         alarm(0);
  3751.         break;
  3752.  
  3753.       case n_TELEBIT:        /* Old and new Telebits */
  3754.       case n_TBNEW:
  3755.         if (!dialksp) {
  3756.         sprintf(tbcmdbuf,"ATS111=0\015");
  3757.         } else {
  3758.         switch (parity) {    /* S111 value depends on parity */
  3759.           case 'e': r = 12; break;
  3760.           case 'm': r = 13; break;
  3761.           case 'o': r = 11; break;
  3762.           case 's': r = 14; break;
  3763.           case 0:
  3764.           default:  r = 10; break;
  3765.         }
  3766.         sprintf(tbcmdbuf,"ATS111=%d S112=%d\015",r,stchr);
  3767.         }
  3768.         ttslow(tbcmdbuf, mp->wake_rate);
  3769.  
  3770. /* Not all Telebit models have the Kermit spoof, so ignore response. */
  3771.  
  3772.         if (xx_ok) {        /* Get modem's response */
  3773.         x = (*xx_ok)(5,1);
  3774. #ifdef COMMENT
  3775.         if (x < 0)
  3776.           printf("WARNING - Trouble %sabling Kermit spoof\n",
  3777.              (dialksp == FLO_NONE) ? "dis" : "en");
  3778. #endif /* COMMENT */
  3779.         }
  3780.     }
  3781.     }
  3782. #endif /* MINIDIAL */
  3783.  
  3784.     if (dialmth && dialsta != DIA_PART) { /* If dialing method specified... */
  3785.     char *s = "";            /* Do it here... */
  3786.  
  3787.     if (dialmth == XYDM_T)        /* Tone */
  3788.       s = dialtone ? dialtone : mp->tone;
  3789.     else if (dialmth == XYDM_P)    /* Pulse */
  3790.       s = dialpulse ? dialpulse : mp->pulse;
  3791.     if (s) if (*s) {
  3792.         ttslow(s, mp->dial_rate);
  3793.         if (xx_ok)        /* Get modem's response */
  3794.           (*xx_ok)(5,1);    /* (but ignore it...) */
  3795.     }
  3796.     }
  3797.     if (func_code == 1) {        /* ANSWER (not DIAL) */
  3798.     char *s;
  3799.     s = dialaaon ? dialaaon : mp->aa_on_str;
  3800.     if (!s) s = "";
  3801.     if (*s) {
  3802.         ttslow(s, mp->dial_rate);
  3803.         if (xx_ok)            /* Get modem's response */
  3804.           (*xx_ok)(5,1);        /* (but ignore it...) */
  3805.     } else {
  3806.         printf(
  3807. "WARNING - I don't know how to enable autoanswer for this modem.\n"
  3808.            );
  3809.     } /* And skip all the phone-number & dialing stuff... */
  3810.     alarm(waitct);            /* This much time allowed. */
  3811.     debug(F101,"ckdial ANSWER waitct","",waitct);
  3812.  
  3813.     } else {                /* DIAL (not ANSWER) */
  3814.  
  3815.     if (dialsta != DIA_PART) {    /* Last dial was not partial */
  3816.  
  3817.         char *s = "";
  3818. #ifdef COMMENT
  3819.         s = dialaaoff ? dialaaoff : mp->aa_off_str;
  3820. #endif /* COMMENT */
  3821.         if (s) if (*s) {
  3822.         ttslow(s, mp->dial_rate);
  3823.         if (xx_ok)        /* Get modem's response */
  3824.           (*xx_ok)(5,1);    /* (but ignore it...) */
  3825.         }
  3826.  
  3827.         /* Put modem into dialing mode, if the modem requires it. */
  3828.  
  3829.         if (mp->dmode_str && *(mp->dmode_str)) {
  3830.         ttslow(mp->dmode_str, mp->dial_rate);
  3831.         savalrm = signal(SIGALRM,dialtime);
  3832.         alarm(10);
  3833.         /* Wait for prompt, if any expected */
  3834.         if (mp->dmode_prompt && *(mp->dmode_prompt)) {
  3835.             waitfor(mp->dmode_prompt);
  3836.             msleep(300);
  3837.         }
  3838.         alarm(0);        /* Turn off alarm on dialing prompts */
  3839.         signal(SIGALRM,savalrm); /* Restore alarm */
  3840.         ttflui(); /* Clear out stuff from waking modem up */
  3841.         }
  3842.     }
  3843.  
  3844. /* Allocate a buffer for the dialing string. */
  3845.  
  3846. #ifdef DYNAMIC
  3847.     if (!lbuf) {            /* If, for some reason, this is NULL */
  3848.         if (!(lbuf = malloc(LBUFL+1))) { /* allocate it... */
  3849.         dialsta = DIA_IE;
  3850. #ifdef NTSIG
  3851.         ckThreadEnd(threadinfo);
  3852. #endif /* NTSIG */
  3853.         SIGRETURN;
  3854.         }
  3855.     }
  3856. #endif /* DYNAMIC */
  3857.  
  3858.     if (mdmcapas & CKD_AT && dialsta != DIA_PART) {
  3859.         sprintf(lbuf,"ATS2=%d\015",    /* Set the escape character */
  3860.             dialesc ? dialesc : mp->esc_char);
  3861.         ttslow(lbuf, mp->dial_rate);
  3862.         if (xx_ok)            /* Get modem's response */
  3863.           x = (*xx_ok)(5,1);
  3864.         if (x < 0)
  3865.           printf(
  3866.              "WARNING - Problem setting modem's escape character\n"
  3867.              );
  3868.     }
  3869.     s = dialcmd ? dialcmd : mp->dial_str;
  3870.  
  3871.     if ((int)strlen(s) + (int)strlen(telnbr) > LBUFL) {
  3872.         printf("DIAL command + phone number too long!\n");
  3873.         dreset();
  3874. #ifdef DYNAMIC
  3875.         if (lbuf) free(lbuf); lbuf = NULL;
  3876.         if (rbuf) free(rbuf); rbuf = NULL;
  3877.         if (fbuf) free(fbuf); fbuf = NULL;
  3878. #endif /* DYNAMIC */
  3879. #ifdef NTSIG
  3880.         ckThreadEnd(threadinfo);
  3881. #endif /* NTSIG */
  3882.         SIGRETURN;     /* No conversation with modem to complete dialing */
  3883.     }
  3884.  
  3885.     sprintf(lbuf, s, telnbr);
  3886.  
  3887.     debug(F110,"dialing",lbuf,0);
  3888.     ttslow(lbuf,mp->dial_rate);    /* Send the dialing string */
  3889.  
  3890.     fail_code = F_MODEM;        /* New default failure code changes */
  3891.     dial_what = DW_DIAL;        /* and our state, too. */
  3892.     if (dialdpy) {            /* If showing progress */
  3893.         p = ck_time();        /* get current time; */
  3894.         if (*p) printf(" Dialing: %s...\n",p);
  3895.     }
  3896.     alarm(waitct);            /* This much time allowed. */
  3897.     debug(F101,"ckdial waitct","",waitct);
  3898.  
  3899. #ifndef MINIDIAL
  3900. #ifdef OLDMODEMS
  3901.     switch (mymdmtyp) {
  3902.       case n_RACAL:            /* Acknowledge dialing string */
  3903.         sleep(3);
  3904.         ttflui();
  3905.         ttoc('\015');
  3906.         break;
  3907.       case n_VENTEL:
  3908.         waitfor("\012\012");    /* Ignore the first two strings */
  3909.         break;
  3910.       default:
  3911.         break;
  3912.     }
  3913. #endif /* OLDMODEMS */
  3914. #endif /* MINIDIAL */
  3915.     }
  3916.  
  3917. /* Check for connection */
  3918.  
  3919.     mdmstat = 0;            /* No status yet */
  3920.     strcpy(lbuf,"");            /* Default reason for failure */
  3921.     debug(F101,"dial awaiting response, mymdmtyp","",mymdmtyp);
  3922.  
  3923. #ifndef NOSPL
  3924.     modemmsg[0] = NUL;
  3925. #endif /* NOSPL */
  3926.     while (mdmstat == 0) {        /* Till we get a result or time out */
  3927.  
  3928.     if ((mdmcapas & CKD_AT) && nonverbal) { /* AT command set */
  3929.         gethrn();            /* In digit result mode */
  3930.         if (partial && dialsta == DIA_ERR) {
  3931.         /*
  3932.            If we get an error here, the phone is still
  3933.            off hook so we have to hang it up.
  3934.         */
  3935.         dialhup();
  3936.         dialsta = DIA_ERR;    /* (because dialhup() changes it) */
  3937.         }
  3938.         continue;
  3939.  
  3940.     } else if (mymdmtyp == n_UNKNOWN) { /* Unknown modem type */
  3941.         int x, y = waitct;
  3942.         mdmstat = D_FAILED;        /* Assume failure. */
  3943.         while (y-- > -1) {
  3944.         x = ttchk();
  3945.         if (x > 0) {
  3946.             if (x > LBUFL) x = LBUFL;
  3947.             x = ttxin(x,(CHAR *)lbuf);
  3948.             if ((x > 0) && dialdpy) conol(lbuf);
  3949.         } else if (network && x < 0) { /* Connection dropped */
  3950. #ifdef NTSIG
  3951.             ckThreadEnd(threadinfo);
  3952. #endif /* NTSIG */
  3953.             dialsta = DIA_IO;    /* Call it an I/O error */
  3954. #ifdef DYNAMIC
  3955.             if (lbuf) free(lbuf); lbuf = NULL;
  3956.             if (rbuf) free(rbuf); rbuf = NULL;
  3957.             if (fbuf) free(fbuf); fbuf = NULL;
  3958. #endif /* DYNAMIC */
  3959.             SIGRETURN;
  3960.         }
  3961.         x = ttgmdm();        /* Try to read modem signals */
  3962.         if (x < 0) break;    /* Can't, fail. */
  3963.         if (x & BM_DCD) {    /* Got signals OK.  Carrier present? */
  3964.             mdmstat = CONNECTED; /* Yes, done. */
  3965.             break;
  3966.         }            /* No, keep waiting. */
  3967.         sleep(1);
  3968.         }
  3969.         continue;
  3970.     }
  3971.  
  3972.     for (n = -1; n < LBUFL-1; ) {    /* Accumulate modem response */
  3973.         int xx;
  3974.         c2 = (char) (xx = ddinc(0)); /* Read a character, blocking */
  3975.         if (xx < 1)            /* Ignore NULs and errors */
  3976.           continue;            /* (Timeout will handle errors) */
  3977.         else            /* Real character, keep it */
  3978.           lbuf[++n] = (char) (c2 & 0177);
  3979.         dialoc(lbuf[n]);        /* Maybe echo it  */
  3980.         if (mdmcapas & CKD_V25) {    /* V.25bis dialing... */
  3981. /*
  3982.   This assumes that V.25bis indications are all at least 3 characters long
  3983.   and are terminated by either CRLF or LFCR.
  3984. */
  3985.         if (mymdmtyp == n_CCITT) {
  3986.             if (n < 3) continue;
  3987.             if ((lbuf[n] == CR) && (lbuf[n-1] == LF)) break;
  3988.             if ((lbuf[n] == LF) && (lbuf[n-1] == CR)) break;
  3989.         }
  3990. #ifndef MINIDIAL
  3991.         else if (mymdmtyp == n_DIGITEL) {
  3992.             if (((lbuf[n] == CR) && (lbuf[n-1] == LF)) ||
  3993.             ((lbuf[n] == LF) && (lbuf[n-1] == CR)))
  3994.               break;
  3995.             else
  3996.               continue;
  3997.         }
  3998. #endif /* MINIDIAL */
  3999.         } else {            /* All others, break on CR or LF */
  4000.         if ( lbuf[n] == CR || lbuf[n] == LF ) break;
  4001.         }
  4002.     }
  4003.     lbuf[++n] = '\0';        /* Terminate response from modem */
  4004.     debug(F111,"ckdial modem response",lbuf,n);
  4005. #ifndef NOSPL
  4006.     strncpy(modemmsg,lbuf,79);    /* Call result message */
  4007.     {
  4008.         int x;            /* Strip junk from end */
  4009.         x = (int)strlen(modemmsg) - 1;
  4010.         while ((modemmsg[x] < (char) 33) && (x > -1))
  4011.           modemmsg[x--] = NUL;
  4012.     }
  4013. #endif /* NOSPL */
  4014.     if (mdmcapas & CKD_AT) {    /* Hayes AT command set */
  4015.         gethrw();            /* in word result mode */
  4016.         if (partial && dialsta == DIA_ERR) {
  4017.         dialhup();
  4018.         dialsta = DIA_ERR;    /* (because dialhup() changes it) */
  4019.         }
  4020.         continue;
  4021.     } else if (mdmcapas & CKD_V25) { /* CCITT command set */
  4022.         if (didweget(lbuf,"VAL")) { /* Dial command confirmation */
  4023. #ifndef MINIDIAL
  4024.         if (mymdmtyp == n_CCITT)
  4025. #endif /* MINIDIAL */
  4026.           continue;        /* Go back and read more */
  4027. #ifndef MINIDIAL
  4028. /* Digitel doesn't give an explicit connect confirmation message */
  4029.         else {
  4030.             int n;
  4031.             for (n = -1; n < LBUFL-1; ) {
  4032.             lbuf[++n] = c2 = (char) (ddinc(0) & 0177);
  4033.             dialoc(lbuf[n]);
  4034.             if (((lbuf[n] == CR) && (lbuf[n-1] == LF)) ||
  4035.                 ((lbuf[n] == LF) && (lbuf[n-1] == CR)))
  4036.               break;
  4037.             }
  4038.             mdmstat = CONNECTED; /* Assume we're connected */
  4039.             if (dialdpy && carrier != CAR_OFF) {
  4040.             sleep(1);     /* Wait a second */
  4041.             n = ttgmdm();    /* Try to read modem signals */
  4042.             if ((n > -1) && ((n & BM_DCD) == 0))
  4043.               printf("WARNING - no carrier\n");
  4044.             }
  4045.         }
  4046. #endif /* MINIDIAL */
  4047.  
  4048.         /* Standard V.25bis stuff */
  4049.  
  4050.         } else if (didweget(lbuf,"CNX")) { /* Connected */
  4051.         mdmstat = CONNECTED;
  4052.         } else if (didweget(lbuf, "INV")) {
  4053.         mdmstat = D_FAILED;    /* Command error */
  4054.         dialsta = DIA_ERR;
  4055.         strcpy(lbuf,"INV");
  4056.  
  4057.         } else if (didweget(lbuf,"CFI")) { /* Call Failure */
  4058.  
  4059.         if (didweget(lbuf,"AB")) { /* Interpret reason code */
  4060.             strcpy(lbuf,"AB: Timed out");
  4061.             dialsta = DIA_TIMO;
  4062.         } else if (didweget(lbuf,"CB")) {
  4063.             strcpy(lbuf,"CB: Local DCE Busy");
  4064.             dialsta = DIA_NRDY;
  4065.         } else if (didweget(lbuf,"ET")) {
  4066.             strcpy(lbuf,"ET: Busy");
  4067.             dialsta = DIA_BUSY;
  4068.         } else if (didweget(lbuf, "NS")) {
  4069.             strcpy(lbuf,"NS: Number not stored");
  4070.             dialsta = DIA_ERR;
  4071.         } else if (didweget(lbuf,"NT")) {
  4072.             strcpy(lbuf,"NT: No answer");
  4073.             dialsta = DIA_NOAN;
  4074.         } else if (didweget(lbuf,"RT")) {
  4075.             strcpy(lbuf,"RT: Ring tone");
  4076.             dialsta = DIA_RING;
  4077.         } else if (didweget(lbuf,"PV")) {
  4078.             strcpy(lbuf,"PV: Parameter value error");
  4079.             dialsta = DIA_ERR;
  4080.         } else if (didweget(lbuf,"PS")) {
  4081.             strcpy(lbuf,"PS: Parameter syntax error");
  4082.             dialsta = DIA_ERR;
  4083.         } else if (didweget(lbuf,"MS")) {
  4084.             strcpy(lbuf,"MS: Message syntax error");
  4085.             dialsta = DIA_ERR;
  4086.         } else if (didweget(lbuf,"CU")) {
  4087.             strcpy(lbuf,"CU: Command unknown");
  4088.             dialsta = DIA_ERR;
  4089.         } else if (didweget(lbuf,"FC")) {
  4090.             strcpy(lbuf,"FC: Forbidden call");
  4091.             dialsta = DIA_NOAC;
  4092.         }
  4093.         mdmstat = D_FAILED;
  4094.         } else if (didweget(lbuf,"INC")) { /* Incoming Call */
  4095.         strcpy(lbuf,"INC: Incoming call");
  4096.         dialsta = DIA_RING;
  4097.         mdmstat = D_FAILED;
  4098.         } else if (didweget(lbuf,"DLC")) { /* Delayed Call */
  4099.         strcpy(lbuf,"DLC: Delayed call");
  4100.         dialsta = DIA_NOAN;
  4101.         mdmstat = D_FAILED;
  4102.         } else            /* Response was probably an echo. */
  4103. #ifndef MINIDIAL
  4104.           if (mymdmtyp == n_CCITT)
  4105. #endif /* MINIDIAL */
  4106.         continue;
  4107. #ifndef MINIDIAL
  4108.           else            /* Digitel: If no error, connect. */
  4109.         mdmstat = CONNECTED;
  4110. #endif /* MINIDIAL */
  4111.         break;
  4112.  
  4113.     } else if (n) {            /* Non-Hayes-compatibles... */
  4114.         switch (mymdmtyp) {
  4115. #ifndef MINIDIAL
  4116.           case n_ATTMODEM:
  4117.         /* Careful - "Connected" / "Not Connected" */
  4118.         if (didweget(lbuf,"Busy")) { 
  4119.             mdmstat = D_FAILED;
  4120.             dialsta = DIA_BUSY;
  4121.         } else if (didweget(lbuf,"Not connected") ||
  4122.                didweget(lbuf,"Not Connected")) { 
  4123.             mdmstat = D_FAILED;
  4124.             dialsta = DIA_NOCA;
  4125.         } else if (didweget(lbuf,"No dial tone") ||
  4126.                didweget(lbuf,"No Dial Tone")) { 
  4127.             mdmstat = D_FAILED;
  4128.             dialsta = DIA_NODT;
  4129.         } else if (didweget(lbuf,"No answer") ||
  4130.                didweget(lbuf,"No Answer")) {
  4131.             mdmstat = D_FAILED;
  4132.             dialsta = DIA_NOAN;
  4133.         } else if (didweget(lbuf,"Answered") ||
  4134.                didweget(lbuf,"Connected")) {
  4135.             mdmstat = CONNECTED;
  4136.             dialsta = DIA_OK;
  4137.         }
  4138.         break;
  4139.  
  4140.           case n_ATTISN:
  4141.         if (didweget(lbuf,"ANSWERED")) {
  4142.             mdmstat = CONNECTED;
  4143.             dialsta = DIA_OK;
  4144.         } else if (didweget(lbuf,"BUSY")) { 
  4145.             mdmstat = D_FAILED;
  4146.             dialsta = DIA_BUSY;
  4147.         } else if (didweget(lbuf,"DISCONNECT")) { 
  4148.             mdmstat = D_FAILED;
  4149.             dialsta = DIA_DISC;
  4150.         } else if (didweget(lbuf,"NO ANSWER")) { 
  4151.             mdmstat = D_FAILED;
  4152.             dialsta = DIA_NOAN;
  4153.         } else if (didweget(lbuf,"WRONG ADDRESS")) {
  4154.             mdmstat = D_FAILED;
  4155.             dialsta = DIA_NOAC;
  4156.         }
  4157.         break;
  4158.  
  4159.           case n_ATTDTDM:
  4160.         if (didweget(lbuf,"ANSWERED")) {
  4161.             mdmstat = CONNECTED;
  4162.         } else if (didweget(lbuf,"BUSY")) { 
  4163.             mdmstat = D_FAILED;
  4164.             dialsta = DIA_BUSY;
  4165.         } else if (didweget(lbuf,"CHECK OPTIONS")) { 
  4166.             mdmstat = D_FAILED;
  4167.             dialsta = DIA_ERR;
  4168.         } else if (didweget(lbuf,"DISCONNECTED")) { 
  4169.             mdmstat = D_FAILED;
  4170.             dialsta = DIA_DISC;
  4171.         } else if (didweget(lbuf,"DENIED")) {
  4172.             mdmstat = D_FAILED;
  4173.             dialsta = DIA_NOAC;
  4174.         }
  4175. #ifdef DEBUG
  4176. #ifdef ATT6300
  4177.         /* Horrible hack lost in history. */
  4178.         else if (deblog && didweget(lbuf,"~~"))
  4179.           mdmstat = CONNECTED;
  4180. #endif /* ATT6300 */
  4181. #endif /* DEBUG */
  4182.         break;
  4183.         
  4184. #ifdef OLDMODEMS
  4185.           case n_CERMETEK:
  4186.         if (didweget(lbuf,"\016A")) {
  4187.             mdmstat = CONNECTED;
  4188.             ttslow("\016U 1\015",200); /* Make transparent*/
  4189.         }
  4190.         break;
  4191.  
  4192.           case n_DF03:
  4193.         /* Because response lacks CR or NL . . . */
  4194.         c = (char) (ddinc(0) & 0177);
  4195.         dialoc(c);
  4196.         debug(F000,"dial df03 got","",c);
  4197.         if ( c == 'A' ) mdmstat = CONNECTED;
  4198.         if ( c == 'B' ) mdmstat = D_FAILED;
  4199.         break;
  4200.  
  4201.           case n_DF100:         /* DF100 has short response codes */
  4202.         if (strcmp(lbuf,"A") == 0) {
  4203.             mdmstat = CONNECTED; /* Attached */
  4204.             dialsta = DIA_OK;
  4205.         } else if (strcmp(lbuf,"N") == 0) {
  4206.             mdmstat = D_FAILED;
  4207.             dialsta = DIA_NOAN; /* No answer or no dialtone */
  4208.         } else if (strcmp(lbuf,"E") == 0 || /* Error */
  4209.                strcmp(lbuf,"R") == 0) { /* "Ready" (?) */
  4210.             mdmstat = D_FAILED;
  4211.             dialsta = DIA_ERR;    /* Command error */
  4212.         }
  4213.         /* otherwise fall thru... */
  4214.  
  4215.           case n_DF200:
  4216.         if (didweget(lbuf,"Attached")) {
  4217.             mdmstat = CONNECTED;
  4218.             dialsta = DIA_OK;
  4219.             /*
  4220.              * The DF100 will respond with "Attached" even if DTR
  4221.              * and/or carrier are not present.    Another reason to
  4222.              * (also) wait for carrier?
  4223.              */
  4224.         } else if (didweget(lbuf,"Busy")) {
  4225.             mdmstat = D_FAILED;
  4226.             dialsta = DIA_BUSY;
  4227.         } else if (didweget(lbuf,"Disconnected")) {
  4228.             mdmstat = D_FAILED;
  4229.             dialsta = DIA_DISC;
  4230.         } else if (didweget(lbuf,"Error")) {
  4231.             mdmstat = D_FAILED;
  4232.             dialsta = DIA_ERR;
  4233.         } else if (didweget(lbuf,"No answer")) {
  4234.             mdmstat = D_FAILED;
  4235.             dialsta = DIA_NOAN;
  4236.         } else if (didweget(lbuf,"No dial tone")) {
  4237.             mdmstat = D_FAILED;
  4238.             dialsta = DIA_NODT;
  4239.         } else if (didweget(lbuf,"Speed:)")) {
  4240.             mdmstat = D_FAILED;
  4241.             dialsta = DIA_ERR;
  4242.         }
  4243.         /*
  4244.          * It appears that the "Speed:..." response comes after an
  4245.          * "Attached" response, so this is never seen.  HOWEVER,
  4246.          * it would be very handy to detect this and temporarily
  4247.          * reset the speed, since it's a nuisance otherwise.
  4248.          * If we wait for some more input from the modem, how do
  4249.          * we know if it's from the remote host or the modem?
  4250.          * Carrier reportedly doesn't get set until after the
  4251.          * "Speed:..." response (if any) is sent.  Another reason
  4252.          * to (also) wait for carrier.
  4253.          */
  4254.         break;
  4255.  
  4256.           case n_GDC:
  4257.         if (didweget(lbuf,"ON LINE"))
  4258.           mdmstat = CONNECTED;
  4259.         else if (didweget(lbuf,"NO CONNECT"))
  4260.           mdmstat = D_FAILED;
  4261.         break;
  4262.  
  4263.           case n_PENRIL:
  4264.         if (didweget(lbuf,"OK")) {
  4265.             mdmstat = CONNECTED;
  4266.         } else if (didweget(lbuf,"BUSY")) { 
  4267.             mdmstat = D_FAILED;
  4268.             dialsta = DIA_BUSY;
  4269.             } else if (didweget(lbuf,"NO RING")) {
  4270.             mdmstat = D_FAILED;
  4271.             dialsta = DIA_NOCA;
  4272.             }
  4273.         break;
  4274.  
  4275.           case n_RACAL:
  4276.         if (didweget(lbuf,"ON LINE"))
  4277.           mdmstat = CONNECTED;
  4278.         else if (didweget(lbuf,"FAILED CALL"))
  4279.           mdmstat = D_FAILED;
  4280.         break;
  4281. #endif /* OLDMODEMS */
  4282.  
  4283.           case n_ROLM:
  4284.         if (didweget(lbuf,"CALLING"))
  4285.           mdmstat = 0;
  4286.         else if (didweget(lbuf,"COMPLETE"))
  4287.           mdmstat = CONNECTED;
  4288.         else if (didweget(lbuf,"FAILED") ||
  4289.              didweget(lbuf,"ABANDONDED")) {
  4290.             mdmstat = D_FAILED;
  4291.             dialsta = DIA_NOCA;
  4292.         } else if (didweget(lbuf,"NOT AVAILABLE") ||
  4293.                didweget(lbuf,"LACKS PERMISSION") ||
  4294.                didweget(lbuf,"NOT A DATALINE") ||
  4295.                didweget(lbuf,"INVALID DATA LINE NUMBER") ||
  4296.                didweget(lbuf,"INVALID GROUP NAME")) {
  4297.             mdmstat = D_FAILED;
  4298.             dialsta = DIA_NOAC;
  4299.         } else if (didweget(lbuf,"BUSY")) {
  4300.             mdmstat = D_FAILED;
  4301.             dialsta = DIA_BUSY;
  4302.         } else if (didweget(lbuf,"DOES NOT ANSWER")) { 
  4303.             mdmstat = D_FAILED;
  4304.             dialsta = DIA_NOAN;
  4305.         }
  4306.         break;
  4307.  
  4308. #ifdef OLDMODEMS
  4309.           case n_VENTEL:
  4310.         if (didweget(lbuf,"ONLINE!") ||
  4311.             didweget(lbuf,"Online!")) {
  4312.             mdmstat = CONNECTED;
  4313.         } else if (didweget(lbuf,"BUSY") ||
  4314.                didweget(lbuf,"Busy")) {
  4315.             mdmstat = D_FAILED;
  4316.             dialsta = DIA_BUSY;
  4317.         } else if (didweget(lbuf,"DEAD PHONE")) {
  4318.             mdmstat = D_FAILED;
  4319.             dialsta = DIA_DISC;
  4320.         }
  4321.         break;
  4322.  
  4323.           case n_CONCORD:
  4324.         if (didweget(lbuf,"INITIATING"))
  4325.           mdmstat = CONNECTED;
  4326.         else if (didweget(lbuf,"BUSY")) { 
  4327.             mdmstat = D_FAILED;            
  4328.             dialsta = DIA_BUSY;
  4329.         } else if (didweget(lbuf,"CALL FAILED")) {
  4330.             mdmstat = D_FAILED;
  4331.             dialsta = DIA_NOCA;
  4332.         }
  4333.         break;
  4334. #endif /* OLDMODEMS */
  4335.  
  4336.           case n_MICROCOM:
  4337.         /* "RINGBACK" means phone line ringing, continue */
  4338.         if (didweget(lbuf,"NO CONNECT")) { 
  4339.             mdmstat = D_FAILED;
  4340.             dialsta = DIA_NOCA;
  4341.         } else if (didweget(lbuf,"BUSY")) { 
  4342.             mdmstat = D_FAILED;
  4343.             dialsta = DIA_BUSY;
  4344.         } else if (didweget(lbuf,"NO DIALTONE")) { 
  4345.             mdmstat = D_FAILED;
  4346.             dialsta = DIA_NODT;
  4347.         } else if (didweget(lbuf,"COMMAND ERROR")) { 
  4348.             mdmstat = D_FAILED;
  4349.             dialsta = DIA_ERR;
  4350.         } else if (didweget(lbuf,"IN USE")) {
  4351.             mdmstat = D_FAILED;
  4352.             dialsta = DIA_NOAC;
  4353.         } else if (didweget(lbuf,"CONNECT")) {
  4354.             mdmstat = CONNECTED;
  4355.             /* trailing speed ignored */
  4356.         }
  4357.         break;
  4358.  
  4359. #endif /* MINIDIAL */
  4360.           default:
  4361.         printf(
  4362.             "PROGRAM ERROR - No response handler for modem type %d\n",
  4363.                mymdmtyp);
  4364.         mdmstat = D_FAILED;
  4365.         dialsta = DIA_ERR;
  4366.         }
  4367.     }
  4368.     } /* while (mdmstat == 0) */
  4369.  
  4370.     debug(F101,"ckdial alarm off","",x);
  4371.     alarm(0);
  4372.     if (mdmstat == D_FAILED )    {    /* Failure detected by modem  */
  4373.         dialfail(F_MODEM);
  4374. #ifdef NTSIG
  4375.     ckThreadEnd(threadinfo);
  4376. #endif /* NTSIG */
  4377.         SIGRETURN;
  4378.     } else if (mdmstat == D_PARTIAL )    { /* Partial dial command OK */
  4379.     msleep(500);
  4380.     debug(F100,"dial partial","",0);
  4381.     } else {                /* Call was completed */
  4382.     msleep(1000);            /* In case DTR blinks  */
  4383.     debug(F100,"dial succeeded","",0);
  4384.     if (
  4385. #ifndef MINIDIAL
  4386.         mymdmtyp != n_ROLM        /* Rolm has weird modem signaling */
  4387. #else
  4388.         1
  4389. #endif /* MINIDIAL */
  4390.         ) {
  4391.         alarm(3);            /* In case ttpkt() gets stuck... */
  4392.         ttpkt(speed,FLO_DIAX,parity); /* Cancel dialing state ioctl */
  4393.     }
  4394.     }
  4395.     dreset();                /* Reset alarms and signals. */
  4396.     if (!quiet && !backgrd) {
  4397.     if (dialdpy && (p = ck_time())) { /* If DIAL DISPLAY ON, */
  4398.         printf(" %sall complete: %s.\n", /* include timestamp.  */
  4399.            (mdmstat == D_PARTIAL) ?
  4400.            "Partial c" :
  4401.            "C",
  4402.            p );
  4403.     } else {
  4404.         printf (" %sall complete.\n",
  4405.             (mdmstat == D_PARTIAL) ?
  4406.             "Partial c" :
  4407.             "C"
  4408.             );
  4409.     }
  4410.     }
  4411.  
  4412. #ifdef DYNAMIC
  4413.     if (lbuf) free(lbuf); lbuf = NULL;
  4414.     if (rbuf) free(rbuf); rbuf = NULL;
  4415.     if (fbuf) free(fbuf); fbuf = NULL;
  4416. #endif /* DYNAMIC */
  4417.     dialsta = (mdmstat == D_PARTIAL) ? DIA_PART : DIA_OK;
  4418. #ifdef NTSIG
  4419.     ckThreadEnd(threadinfo);
  4420. #endif /* NTSIG */
  4421.     SIGRETURN;
  4422. }
  4423.  
  4424.  
  4425. static SIGTYP
  4426. #ifdef CK_ANSIC
  4427. faildial(void * threadinfo)
  4428. #else /* Not CK_ANSIC */
  4429. faildial(threadinfo) VOID * threadinfo;
  4430. #endif /* CK_ANSIC */
  4431. /* faildial */ {
  4432.     debug(F100,"longjmp returns to dial routine","",0);
  4433.     dialfail(fail_code);
  4434.     SIGRETURN;
  4435. }
  4436.  
  4437. /*
  4438.   nbr = number to dial (string)
  4439.   x1  = Retry counter 
  4440.   x2  = Number counter
  4441.   fc  = Function code:
  4442.         0 == DIAL
  4443.         1 == ANSWER
  4444.         2 == INIT/CONFIG
  4445.         3 == PARTIAL DIAL
  4446. */
  4447. int
  4448. #ifdef OLD_DIAL
  4449. ckdial(nbr) char *nbr;
  4450. #else
  4451. ckdial(nbr, x1, x2, fc) char *nbr; int x1, x2, fc;
  4452. #endif /* OLD_DIAL */
  4453. /* ckdial */ {
  4454. #define ERMSGL 50
  4455.     char errmsg[ERMSGL], *erp;        /* For error messages */
  4456.     int n = F_TIME;
  4457.     char *s;
  4458.     long spdmax;
  4459.  
  4460.     char *mmsg = "Sorry, DIAL memory buffer can't be allocated\n";
  4461.  
  4462.     partial = 0;
  4463.     if (fc == 3) {            /* Partial dial requested */
  4464.     partial = 1;            /* Set flag */
  4465.     fc = 0;                /* Treat like regular dialing */
  4466.     }
  4467.     func_code = fc;            /* Make global to this module */
  4468.     telnbr = nbr;
  4469.     mymdmtyp = mdmtyp;
  4470.     if (mymdmtyp < 0) {            /* Whoa, network dialing... */
  4471.     if (mdmsav > -1)
  4472.       mymdmtyp = mdmsav;
  4473.     }
  4474.     if (mymdmtyp < 0) {
  4475.     printf("Invalid modem type %d - internal error.\n",mymdmtyp);
  4476.     dialsta = DIA_NOMO;
  4477.     return 0;
  4478.     }
  4479.     dial_what = DW_NOTHING;        /* Doing nothing at first. */
  4480.     nonverbal = 0;
  4481.  
  4482. /* These are ONLY for the purpose of interpreting numeric result codes. */
  4483.  
  4484.     is_rockwell =
  4485. #ifdef MINIDIAL
  4486.       0
  4487. #else
  4488.       mymdmtyp == n_RWV32 || mymdmtyp == n_RWV32B || mymdmtyp == n_RWV34 ||
  4489.     mymdmtyp == n_BOCA || mymdmtyp == n_TELEPATH || mymdmtyp == n_CARDINAL
  4490. #endif /* MINIDIAL */
  4491.     ;
  4492.  
  4493.     is_hayeshispd =
  4494. #ifdef MINIDIAL
  4495.       0
  4496. #else
  4497.       mymdmtyp == n_H_ULTRA || mymdmtyp == n_H_ACCURA || n_PPI
  4498. #endif /* MINIDIAL */
  4499.     ;
  4500.  
  4501. #ifdef OLDTBCODE
  4502. #ifndef MINIDIAL
  4503.     tbmodel = TB_UNK;            /* Initialize Telebit model */
  4504. #endif /* MINIDIAL */
  4505. #endif /* OLDTBCODE */
  4506.  
  4507.     mp = modemp[mymdmtyp - 1];        /* Set pointer to modem info */
  4508.     if (!mp) {
  4509.     printf("Sorry, handler for this modem type not yet filled in.\n");
  4510.     dialsta = DIA_NOMO;
  4511.     return 0;
  4512.     }
  4513.     debug(F110,"dial number",telnbr,0);
  4514. #ifdef COMMENT
  4515.     debug(F110,"dial prefix",(dialnpr ? dialnpr : ""), 0);
  4516. #endif /* COMMENT */
  4517.  
  4518. #ifdef DYNAMIC
  4519.     if (!(lbuf = malloc(LBUFL+1))) {    /* Allocate input line buffer */
  4520.     printf("%s", mmsg);
  4521.     dialsta = DIA_IE;
  4522.     return 0;
  4523.     }
  4524.     *lbuf = NUL;
  4525.     debug(F101,"DIAL lbuf malloc ok","",LBUFL+1);
  4526.  
  4527.     if (!rbuf) {    /* This one might already have been allocated by getok() */
  4528.     if (!(rbuf = malloc(RBUFL+1))) {    /* Allocate input line buffer */
  4529.         printf("%s", mmsg);
  4530.         dialsta = DIA_IE;
  4531.         if (lbuf) free(lbuf); lbuf = NULL;
  4532.         return 0;
  4533.     } else
  4534.       debug(F101,"DIAL rbuf malloc ok","",RBUFL+1);
  4535.     }
  4536.     if (!(fbuf = malloc(FULLNUML+1))) {    /* Allocate input line buffer */
  4537.     printf("%s", mmsg);
  4538.     dialsta = DIA_IE;
  4539.     if (lbuf) free(lbuf); lbuf = NULL;
  4540.     if (rbuf) free(rbuf); rbuf = NULL;
  4541.     return 0;
  4542.     }
  4543.     debug(F101,"DIAL fbuf malloc ok","",FULLNUML+1);
  4544. #endif /* DYNAMIC */
  4545.  
  4546.     /* NOTE: mdmtyp, not mymdmtyp */
  4547.  
  4548.     if (ttopen(ttname,&local,mdmtyp,0) < 0) { /* Open, no carrier wait */
  4549.     erp = errmsg;
  4550.     if ((int)strlen(ttname) < (ERMSGL - 18))
  4551.       sprintf(erp,"Sorry, can't open %s",ttname);
  4552.     else
  4553.       sprintf(erp,"Sorry, can't open device");
  4554.     perror(errmsg);
  4555.     dialsta = DIA_OPEN;
  4556. #ifdef DYNAMIC
  4557.     if (lbuf) free(lbuf); lbuf = NULL;
  4558.     if (rbuf) free(rbuf); rbuf = NULL;
  4559.     if (fbuf) free(fbuf); fbuf = NULL;
  4560. #endif /* DYNAMIC */
  4561.     return 0;
  4562.     }
  4563.  
  4564. /* Condition console terminal and communication line */
  4565.  
  4566.     /* Place line into "clocal" dialing state, */
  4567.     /* important mainly for System V UNIX.     */
  4568.  
  4569.     if (ttpkt(speed,FLO_DIAL,parity) < 0) {
  4570.     ttclos(0);            /* If ttpkt fails do all this... */
  4571.     if (ttopen(ttname,&local,mymdmtyp,0) < 0) {
  4572.         erp = errmsg;
  4573.         if ((int)strlen(ttname) < (ERMSGL - 18))
  4574.           sprintf(erp,"Sorry, can't reopen %s",ttname);
  4575.         else
  4576.           sprintf(erp,"Sorry, can't reopen device");
  4577.         perror(errmsg);
  4578.         dialsta = DIA_OPEN;
  4579. #ifdef DYNAMIC
  4580.         if (lbuf) free(lbuf); lbuf = NULL;
  4581.         if (rbuf) free(rbuf); rbuf = NULL;
  4582.         if (fbuf) free(fbuf); fbuf = NULL;
  4583. #endif /* DYNAMIC */
  4584.         return 0;
  4585.     }                /* And try again. */
  4586.     if ((ttpkt(speed,FLO_DIAL,parity) < 0)
  4587. #ifdef UNIX
  4588.     && (strcmp(ttname,"/dev/null"))
  4589. #else
  4590. #ifdef OSK
  4591.     && (strcmp(ttname,"/nil"))
  4592. #endif /* OSK */
  4593. #endif /* UNIX */
  4594.         ) {
  4595.         printf("Sorry, Can't condition communication line\n");
  4596.         printf("Try 'set line %s' again\n",ttname);
  4597.         dialsta = DIA_OPEN;
  4598. #ifdef DYNAMIC
  4599.         if (lbuf) free(lbuf); lbuf = NULL;
  4600.         if (rbuf) free(rbuf); rbuf = NULL;
  4601.         if (fbuf) free(fbuf); fbuf = NULL;
  4602. #endif /* DYNAMIC */
  4603.         return 0;
  4604.     }
  4605.     }
  4606.     /* Modem's escape sequence... */
  4607.  
  4608.     c = (char) (dialesc ? dialesc : mp->esc_char);
  4609.     mdmcapas = dialcapas ? dialcapas : mp->capas;
  4610.  
  4611.     xx_ok = mp->ok_fn;            /* Pointer to response reader */
  4612.  
  4613.     if (mdmcapas & CKD_AT) {        /* Hayes compatible */
  4614.     escbuf[0] = c;
  4615.     escbuf[1] = c;
  4616.     escbuf[2] = c;
  4617.     escbuf[3] = NUL;
  4618.     /* In case this modem type is user-defined */
  4619.     if (!xx_ok) xx_ok = getok;
  4620.     } else {                /* Other */
  4621.     escbuf[0] = c;
  4622.     escbuf[1] = NUL;
  4623.     /* In case user-defined */
  4624.     if (mdmcapas & CKD_V25) if (!xx_ok) xx_ok = getok;
  4625.     }
  4626.  
  4627.     /* Partial dialing */
  4628.  
  4629.     if (mdmcapas & CKD_AT
  4630. #ifndef MINIDIAL
  4631.     || mymdmtyp == n_MICROCOM
  4632. #endif /* MINIDIAL */
  4633.     ) {
  4634.     int x;
  4635.     x = (int) strlen(telnbr);
  4636.     if (x > 0) {
  4637.         if (telnbr[x-1] == ';') {
  4638.         partial = 1;
  4639.         } else if (partial) {
  4640.         sprintf(fbuf,"%s;", telnbr); /* add one */
  4641.         telnbr = fbuf;
  4642.         }
  4643.     }
  4644.     }
  4645.     msleep(500);
  4646.  
  4647.     /* Interdigit waits for tone dial */
  4648.  
  4649.     if (fc == 1) {            /* ANSWER */
  4650.     waitct = (dialatmo > -1) ? dialatmo : 0;
  4651.     } else {                /* DIAL */
  4652.     if (dialtmo < 1) {        /* Automatic computation. */
  4653.         waitct = 1 * (int)strlen(telnbr) ; /* Worst case dial time */
  4654.         waitct += mp->dial_time;    /* dialtone + completion wait times */
  4655.         for (s = telnbr; *s; s++) {    /* add in pause characters time */
  4656.         for (p = mp->pause_chars; *p; p++)
  4657.           if (*s == *p) {
  4658.               waitct += mp->pause_time;
  4659.               break;
  4660.           }
  4661.         }
  4662. #ifdef COMMENT
  4663. #ifndef MINIDIAL
  4664. #ifdef OLDTBCODE
  4665.     if (mymdmtyp == n_TBPEP)
  4666.       waitct += 30;            /* Longer connect wait for PEP call */
  4667. #endif /* OLDTBCODE */
  4668. #endif /* MINIDIAL */
  4669. #endif /* COMMENT */
  4670.     } else waitct = dialtmo;    /* User-specified timeout */
  4671.     }
  4672.  
  4673. /*
  4674.   waitct is our alarm() timer.
  4675.   mdmwait is how long we tell the modem to wait for carrier.
  4676.   We set mdmwait to be 5 seconds less than waitct, to increase the
  4677.   chance that we get a response from the modem before timing out.
  4678. */
  4679.     if (waitct < 0) waitct = 0;
  4680.     if (fc == 0) {            /* DIAL */
  4681.  
  4682. #ifdef XWAITCT
  4683.     /* Addtl wait slop can be defined at compile time */    
  4684.     waitct += XWAITCT;
  4685. #endif /* XWAITCT */
  4686.     if (waitct < 25) waitct = 25;
  4687.     mdmwait = waitct - mdmwaitd;
  4688.     } else {                /* ANSWER */
  4689. #ifdef COMMENT
  4690. /*
  4691.   This is wrong.  mdmwait is the value given to S7 in Hayeslike modems.
  4692.   When in autoanswer mode, this is the amount of time the modem waits for
  4693.   carrier once ringing starts.  Whereas waitct is the timeout given to the
  4694.   ANSWER command, which is an entirely different thing.  Since the default
  4695.   ANSWER timeout is 0 (meaning "wait forever"), the following statement sets
  4696.   S7 to 0, which, on some modems (like the USR Sportster) makes it hang up
  4697.   and report NO CARRIER the instant the phone rings.
  4698. */    
  4699.     mdmwait = waitct;
  4700. #else
  4701.     mdmwait = 60;            /* Always wait 60 seconds. */
  4702. #endif /* COMMENT */
  4703.  
  4704.     }
  4705.     if (!quiet && !backgrd) {        /* Print information messages. */
  4706.     if (fc == 1)
  4707.       printf(" Waiting for phone call...\n");
  4708.     else
  4709.       printf(" %srying: %s...\n", x1 > 0 ? "Ret" : "T", telnbr);
  4710.     if (x1 == 0 && x2 == 0 && dialsta != DIA_PART) {
  4711.         if (network) {
  4712.         printf(" Via modem server: %s, modem: %s\n",
  4713.                ttname, gmdmtyp() );
  4714.         } else {
  4715.         printf(" Device: %s, modem: %s",
  4716.                ttname, gmdmtyp() );
  4717.         if (speed > -1L)
  4718.           printf(", speed: %ld\n", speed);
  4719.         else
  4720.           printf(", speed: (unknown)\n");
  4721.         }
  4722.         spdmax = dialmax > 0L ? dialmax : mp->max_speed;
  4723.  
  4724.         if (!network &&  spdmax > 0L && speed > spdmax) {
  4725.         printf(
  4726. "\n  WARNING - interface speed %ld might be too high for this modem type.\n",
  4727.                speed
  4728.                );
  4729.         printf(
  4730. "  If dialing fails, SET SPEED to %ld or less and try again.\n\n",
  4731.                spdmax
  4732.                );
  4733.         }
  4734.         printf(" %s timeout: ", fc == 0 ? "Dial" : "Answer");
  4735.         if (waitct > 0)
  4736.           printf("%d seconds\n",waitct);
  4737.         else
  4738.           printf(" (none)\n");
  4739.         printf(
  4740. #ifdef MAC
  4741.            " Type Command-. to cancel.\n"
  4742. #else
  4743. #ifdef UNIX
  4744.            " To cancel: type your interrupt character (normally Ctrl-C).\n"
  4745. #else
  4746.            " To cancel: type Ctrl-C (hold down Ctrl, press C).\n"
  4747. #endif /* UNIX */
  4748. #endif /* MAC */
  4749.            );
  4750.     }
  4751.     }
  4752.     debug(F111,"ckdial",ttname,(int) (speed / 10L));
  4753.     debug(F101,"ckdial timeout","",waitct);
  4754.  
  4755. /* Set timer and interrupt handlers. */
  4756.     savint = signal( SIGINT, dialint ) ; /* And terminal interrupt handler. */ 
  4757.     cc_alrm_execute(ckjaddr(sjbuf), 0, dialtime, _dodial, faildial);
  4758.     signal(SIGINT, savint);
  4759. #ifdef OS2
  4760.     if (dialsta == DIA_OK)        /* Dialing is completed */
  4761.       DialerSend(OPT_KERMIT_CONNECT, 0);
  4762. #endif /* OS2 */
  4763.     if (dialsta == DIA_PART || dialsta == DIA_OK)
  4764.       return(1);            /* Dial attempt succeeded */
  4765.     else
  4766.       return(0);            /* Dial attempt failed */
  4767. } /* ckdial */
  4768.  
  4769. /*
  4770.   getok() - wait up to n seconds for OK (0) or ERROR (4) response from modem.
  4771.   Use with Hayeslike or CCITT modems for reading the reply to a nondialing
  4772.   command.
  4773.  
  4774.   Second argument says whether to be strict about numeric result codes, i.e.
  4775.   to require they be preceded by CR or else be the first character in the
  4776.   response, e.g. to prevent the ATH0<CR> echo from looking like a valid
  4777.   response.  Strict == 0 is needed for ATI on Telebit, which can return the
  4778.   model number concatenated with the numeric response code, e.g. "9620"
  4779.   ("962" is the model number, "0" is the response code).  getok() Returns:
  4780.  
  4781.    0 if it timed out,
  4782.    1 if it succeeded,
  4783.   -1 on modem command, i/o, or other error.
  4784. */
  4785. static ckjmpbuf okbuf;
  4786.  
  4787. static SIGTYP
  4788. #ifdef CK_ANSIC
  4789. oktimo(int foo)                /* Alarm handler for getok(). */
  4790. #else
  4791. oktimo(foo) int foo;            /* Alarm handler for getok(). */
  4792. #endif /* CK_ANSIC */
  4793. /* oktimo */ {
  4794.  
  4795. #ifdef OS2
  4796.     alarm(0);
  4797.     /* signal(SIGALRM,SIG_IGN); */
  4798.     debug(F100,"oktimo() SIGALRM caught -- SIG_IGN set","",0) ;
  4799. #endif /* OS2 */
  4800.     
  4801. #ifdef OSK                /* OS-9, see comment in dialtime(). */
  4802.     sigmask(-1);
  4803. #endif /* OSK */
  4804. #ifdef NTSIG
  4805.     if ( foo == SIGALRM )
  4806.       PostAlarmSigSem();
  4807.     else 
  4808.       PostCtrlCSem();
  4809. #else /* NTSIG */
  4810. #ifdef NT
  4811.     cklongjmp(ckjaddr(okbuf),1);
  4812. #else /* NT */
  4813.     cklongjmp(okbuf,1);
  4814. #endif /* NTSIG */
  4815. #endif /* NT */
  4816.     /* NOTREACHED */
  4817.     SIGRETURN;
  4818. }
  4819.  
  4820. static int okstatus, okn, okstrict;
  4821.  
  4822. static SIGTYP
  4823. #ifdef CK_ANSIC
  4824. dook(void * threadinfo)
  4825. #else /* CK_ANSIC */
  4826. dook(threadinfo) VOID * threadinfo ;
  4827. #endif /* CK_ANSIC */
  4828. /* dook */ {
  4829.     CHAR c;
  4830.     int i, x;
  4831.  
  4832. #ifdef NTSIG
  4833.     if (threadinfo) {            /* Thread local storage... */
  4834.     TlsSetValue(TlsIndex,threadinfo);
  4835.     }
  4836. #endif /* NTSIG */
  4837.  
  4838.     if (mdmcapas & CKD_V25) {        /* CCITT, easy... */
  4839.         waitfor("VAL");
  4840.         okstatus = 1 ;
  4841. #ifdef NTSIG
  4842.     ckThreadEnd(threadinfo);
  4843. #endif /* NTSIG */
  4844.     SIGRETURN;
  4845. #ifndef MINIDIAL
  4846.     } else if (mymdmtyp == n_MICROCOM) { /* Microcom in SX mode, also easy */
  4847.         waitfor(MICROCOM.wake_prompt);    /* (I think...) */
  4848.         okstatus = 1 ;
  4849. #ifdef NTSIG
  4850.     ckThreadEnd(threadinfo);
  4851. #endif /* NTSIG */
  4852.     SIGRETURN;
  4853. #endif /* MINIDIAL */
  4854.     } else {                /* Hayes & friends, start here... */
  4855.     okstatus = 0;            /* No status yet. */
  4856.     for (x = 0; x < RBUFL; x++)    /* Initialize response buffer */
  4857.       rbuf[x] = SP;            /*  to all spaces */
  4858.     rbuf[RBUFL] = NUL;        /* and terminate with NUL. */
  4859.     debug(F100,"getok rbuf init ok","",0);
  4860.     while (okstatus == 0) {        /* While no status... */
  4861.         x = ddinc(okn);        /* Read a character */
  4862.         if (x < 0) {        /* I/O error */
  4863.         okstatus = -1 ;
  4864. #ifdef NTSIG
  4865.         ckThreadEnd(threadinfo);
  4866. #endif /* NTSIG */
  4867.         SIGRETURN;
  4868.         }
  4869.         debug(F101,"getok ddinc","",x); /* Got a character. */
  4870.         c = (char) (x & 0x7f);    /* Get low order 7 bits */
  4871.         if (!c)            /* Don't deposit NULs */
  4872.           continue;            /* or else didweget() won't work */
  4873.         if (dialdpy) conoc((char)c); /* Echo it if requested */
  4874.         for (i = 0; i < RBUFL-1; i++) /* Rotate buffer */
  4875.           rbuf[i] = rbuf[i+1];
  4876.         rbuf[RBUFL-1] = c;        /* Deposit character at end */
  4877.         debug(F000,"getok:",rbuf,(int) c); /* Log it */
  4878.         switch (c) {        /* Interpret it. */
  4879.           case CR:            /* Got a carriage return. */
  4880.         switch(rbuf[RBUFL-2]) {    /* Look at character before it. */
  4881.           case '0':        /* 0 = OK numeric response */
  4882.             if (!okstrict ||
  4883.             rbuf[RBUFL-3] == CR || rbuf[RBUFL-3] == SP) {
  4884.             nonverbal = 1;
  4885.             okstatus = 1;    /* Good response */
  4886.             }
  4887.             break;
  4888.           case '4':        /* 4 = ERROR numeric response */
  4889. #ifndef MINIDIAL
  4890.             /* Or Telebit model number 964! */
  4891.             if (mymdmtyp == n_TELEBIT &&
  4892.             isdigit(rbuf[RBUFL-3]) &&
  4893.             isdigit(rbuf[RBUFL-4]))
  4894.               break;
  4895.             else
  4896. #endif /* MINIDIAL */
  4897.               if (!okstrict ||
  4898.             rbuf[RBUFL-3] == CR || rbuf[RBUFL-3] == SP) {
  4899.             nonverbal = 1;
  4900.             okstatus = -1;    /* Bad command */
  4901.             }
  4902.             break;
  4903.         }
  4904.         if (dialdpy && nonverbal) /* If numeric results, */
  4905.           conoc(LF);          /* echo a linefeed too. */
  4906.         break;
  4907.           case LF:            /* Got a linefeed. */
  4908.         /*
  4909.           Note use of explicit octal codes in the string for
  4910.           CR and LF.  We want real CR and LF here, not whatever
  4911.           the compiler happens to replace \r and \n with...
  4912.         */
  4913.         if (!strcmp(rbuf+RBUFL-4,"OK\015\012")) /* Good response */
  4914.           okstatus = 1;
  4915.         else if (!strcmp(rbuf+RBUFL-7,"ERROR\015\012"))    /* Error */
  4916.           okstatus = -1;
  4917.         break;
  4918.           /* Check whether modem echoes its commands... */
  4919.           case 't':            /* Got little t */
  4920.         if (!strcmp(rbuf+RBUFL-3,"\015at") || /* See if it's "at" */
  4921.             !strcmp(rbuf+RBUFL-3," at"))
  4922.             mdmecho = 1;
  4923.         debug(F111,"MDMECHO-t",rbuf+RBUFL-2,mdmecho);
  4924.         break;
  4925.           case 'T':            /* Got Big T */
  4926.         if (!strcmp(rbuf+RBUFL-3,"\015AT") ||    /* See if it's "AT" */
  4927.             !strcmp(rbuf+RBUFL-3," AT"))
  4928.             mdmecho = 1;
  4929.         debug(F111,"MDMECHO-T",rbuf+RBUFL-3,mdmecho);
  4930.         break;
  4931.           default:            /* Other characters, accumulate. */
  4932.         okstatus = 0;
  4933.         break;
  4934.         }
  4935.     }
  4936.     }
  4937.     debug(F101,"getok returns","",okstatus); /* <-- It's a lie */
  4938. #ifdef NTSIG
  4939.     ckThreadEnd(threadinfo);
  4940. #endif /* NTSIG */
  4941.     SIGRETURN;
  4942. }
  4943.  
  4944. static SIGTYP
  4945. #ifdef CK_ANSIC
  4946. failok(void * threadinfo)
  4947. #else /* CK_ANSIC */
  4948. failok(threadinfo) VOID * threadinfo;
  4949. #endif /* CK_ANSIC */
  4950. /* failok */ {
  4951.     debug(F100,"longjmp returned to getok()","",0);
  4952.     debug(F100,"getok timeout","",0);
  4953.     SIGRETURN;
  4954. }
  4955.  
  4956. static int
  4957. getok(n, strict) int n, strict; {
  4958.     debug(F101,"getok entry n","",n);
  4959.     okstatus = 0;
  4960.     okn = n;
  4961.     okstrict = strict;
  4962.  
  4963. #ifdef DYNAMIC
  4964.     if (!rbuf) {
  4965.     if (!(rbuf = malloc(RBUFL+1))) { /* Allocate input line buffer */
  4966.         dialsta = DIA_IE;
  4967.         return(-1);
  4968.     }
  4969.     debug(F101,"GETOK rbuf malloc ok","",RBUFL+1);
  4970.     }
  4971. #endif /* DYNAMIC */
  4972.  
  4973.     mdmecho = 0;            /* Assume no echoing of commands */
  4974.  
  4975.     debug(F100,"about to alrm_execute dook()","",0);
  4976.     alrm_execute( ckjaddr(okbuf), n, oktimo, dook, failok ) ;
  4977.     debug(F100,"returning from alrm_execute dook()","",0);
  4978.  
  4979.     ttflui();                /* Flush input buffer */
  4980.     return(okstatus);            /* Return status */
  4981. }
  4982.  
  4983. /*  G E T H R N  --  Get Hayes Result Numeric  */
  4984.  
  4985. static VOID
  4986. gethrn() {
  4987.     char c;
  4988.     int x;
  4989. /*
  4990.   Hayes numeric result codes (Hayes 1200 and higher):
  4991.      0 = OK
  4992.      1 = CONNECT at 300 bps (or 1200 bps on Hayes 1200 with basic code set)
  4993.      2 = RING
  4994.      3 = NO CARRIER
  4995.      4 = ERROR (in command line)
  4996.      5 = CONNECT 1200 (extended code set)
  4997.   Hayes 2400 and higher:
  4998.      6 = NO DIALTONE
  4999.      7 = BUSY
  5000.      8 = NO ANSWER
  5001.      9 = (there is no 9)
  5002.     10 = CONNECT 2400
  5003.   Reportedly, the codes for Hayes V.32 modems are:
  5004.     1x = CONNECT <suffix>
  5005.     5x = CONNECT 1200 <suffix>
  5006.     9x = CONNECT 2400 <suffix>
  5007.    11x = CONNECT 4800 <suffix>
  5008.    12x = CONNECT 9600 <suffix>
  5009.   Where:
  5010.     x:   suffix:
  5011.     R  = RELIABLE
  5012.     RC = RELIABLE COMPRESSED
  5013.     L  = LAPM
  5014.     LC = LAPM COMPRESSED
  5015.   And for Telebits, all the above, except no suffix in numeric mode, plus:
  5016.     11 = CONNECT 4800
  5017.     12 = CONNECT 9600
  5018.     13 = CONNECT 14400
  5019.     14 = CONNECT 19200
  5020.     15 = CONNECT 38400
  5021.     16 = CONNECT 57600
  5022.     20 = CONNECT 300/REL  (= MNP)
  5023.     22 = CONNECT 1200/REL (= MNP)
  5024.     23 = CONNECT 2400/REL (= MNP)
  5025.     46 = CONNECT 7512  (i.e. 75/1200)
  5026.     47 = CONNECT 1275  (i.e. 1200/75)
  5027.     48 = CONNECT 7200
  5028.     49 = CONNECT 12000
  5029.     50 = CONNECT FAST (not on T1600/3000)
  5030.     52 = RRING
  5031.     53 = DIALING
  5032.     54 = NO PROMPTTONE
  5033.     61 = CONNECT FAST/KERM (Kermit spoof)
  5034.     70 = CONNECT FAST/COMP (PEP + compression)
  5035.     71 = CONNECT FAST/KERM/COMP (PEP + compression + Kermit spoof)
  5036.  
  5037.   And for others, lots of special cases below...
  5038. */
  5039. #define NBUFL 8
  5040.     char nbuf[NBUFL+1];            /* Response buffer */
  5041.     int i = 0, j = 0;            /* Buffer pointers */
  5042.  
  5043.     debug(F101,"RESPONSE mdmecho","",mdmecho);
  5044.     if (mdmecho) {            /* Sponge up dialing string echo. */
  5045.     while (1) {
  5046.         c = (char) (ddinc(0) & 0x7f);
  5047.         debug(F000,"SPONGE","",c);
  5048.         dialoc(c);
  5049.         if (c == CR) break;
  5050.     }
  5051.     }
  5052.     while (mdmstat == 0) {        /* Read response */
  5053.     for (i = 0; i < NBUFL; i++)    /* Clear the buffer */
  5054.       nbuf[i] = '\0';
  5055.     i = 0;                /* Reset the buffer pointer. */
  5056.     c = (char) (ddinc(0) & 0177);    /* Get first digit of response. */
  5057.                     /* using an untimed, blocking read. */
  5058.     debug(F000,"RESPONSE-A","",c);
  5059.     dialoc(c);            /* Echo it if requested. */
  5060.     if (!isdigit(c))        /* If not a digit, keep looking. */
  5061.       continue;
  5062.     nbuf[i++] = c;            /* Got first digit, save it. */
  5063.     while (c != CR && i < 8) {    /* Read chars up to CR */
  5064.         x = ddinc(0) & 0177;    /* Get a character. */
  5065.         c = (char) x;        /* Got it OK. */
  5066.         debug(F000,"RESPONSE-C","",c);
  5067.         if (c != CR)        /* If it's not a carriage return, */
  5068.           nbuf[i++] = c;        /*  save it. */
  5069.         dialoc(c);            /* Echo it. */
  5070.     }
  5071.     nbuf[i] = '\0';            /* Done, terminate the buffer. */
  5072.     debug(F110,"dial hayesnv lbuf",lbuf,0);
  5073.     debug(F111,"dial hayesnv got",nbuf,i);
  5074.     /*
  5075.        Separate any non-numeric suffix from the numeric 
  5076.        result code with a null.
  5077.     */
  5078.     for (j = i-1; (j > -1) && !isdigit(nbuf[j]); j--)
  5079.       nbuf[j+1] = nbuf[j];
  5080.     j++;
  5081.     nbuf[j++] = '\0';
  5082.     debug(F110,"dial hayesnv numeric",nbuf,0);
  5083.     debug(F111,"dial hayesnv suffix ",nbuf+j,j);
  5084.     /* Probably phone number echoing. */
  5085.     if ((int)strlen(nbuf) > 3)
  5086.       continue;
  5087.  
  5088.     /* Now read and interpret the results... */
  5089.  
  5090.     i = atoi(nbuf);    /* Convert to integer */
  5091.     switch (i) {
  5092.       case 0:
  5093.         mdmstat = D_PARTIAL;    /* OK response */
  5094.         break;
  5095.       case 1:            /* CONNECT */
  5096.         mdmstat = CONNECTED;    /* Could be any speed */
  5097.         break;
  5098.       case 2:            /* RING */
  5099.         if (dialdpy)
  5100.           printf("\r\n Local phone is ringing!\r\n");
  5101.         mdmstat = D_FAILED;
  5102.         dialsta = DIA_RING;
  5103.         break;
  5104.       case 3:            /* NO CARRIER */
  5105.         if (dialdpy) printf("\r\n No Carrier.\r\n");
  5106.         mdmstat = D_FAILED;
  5107.         dialsta = DIA_NOCA;
  5108.         break;
  5109.       case 4:            /* ERROR */
  5110.         if (dialdpy)
  5111.           printf("\r\n Modem Command Error.\r\n");
  5112.         mdmstat = D_FAILED;
  5113.         dialsta = DIA_ERR;
  5114.         break;
  5115.       case 5:            /* CONNECT 1200 */
  5116.         spdchg(1200L); /* Change speed if necessary. */
  5117.         mdmstat = CONNECTED;
  5118.         break;
  5119.       case 6:            /* NO DIALTONE */
  5120. #ifndef MINIDIAL
  5121.         if (mymdmtyp == n_MICROLINK && atoi(diallcc) == 49 && dialdpy)
  5122.           printf("\r\n Dial Locked.\r\n"); /* Germany */
  5123.         else
  5124. #endif /* MINIDIAL */
  5125.           if (dialdpy)
  5126.         printf("\r\n No Dialtone.\r\n");
  5127.         mdmstat = D_FAILED;
  5128.         dialsta = DIA_NODT;
  5129.         break;
  5130.       case 7:            /* BUSY */
  5131.         if (dialdpy) printf("\r\n Busy.\r\n");
  5132.         mdmstat = D_FAILED;
  5133.         dialsta = DIA_BUSY;
  5134.         break;
  5135.       case 8:            /* NO ANSWER */
  5136. #ifndef MINIDIAL
  5137.         if (mymdmtyp == n_MICROLINK && atoi(diallcc) == 41 && dialdpy)
  5138.           printf("\r\n Dial Locked.\r\n"); /* Switzerland */
  5139.         else
  5140. #endif /* MINIDIAL */
  5141.           if (dialdpy)
  5142.         printf("\r\n No Answer.\r\n");
  5143.         mdmstat = D_FAILED;
  5144.         dialsta = DIA_NOAN;
  5145.         break;
  5146.       case 9:            /* CONNECT 2400 */
  5147.       case 10:
  5148.         spdchg(2400L); /* Change speed if necessary. */
  5149.         mdmstat = CONNECTED;
  5150.         break;
  5151.  
  5152. #ifndef MINIDIAL
  5153.  
  5154. /* Starting here, we get different meanings from different manufacturers */
  5155.  
  5156.       case 11:
  5157.         if (mymdmtyp == n_USR) {
  5158.         if (dialdpy) printf(" Ringing...\r\n");        
  5159.         } else {
  5160.         spdchg(4800L);        /* CONNECT 4800 */
  5161.         mdmstat = CONNECTED;
  5162.         }
  5163.         break;
  5164.       case 12:
  5165.         if (mymdmtyp == n_USR) {
  5166.         if (dialdpy)
  5167.           printf("\r\n Answered by voice.\r\n");
  5168.         mdmstat = D_FAILED;
  5169.         dialsta = DIA_VOIC;
  5170.         } else {
  5171.         spdchg(9600L);
  5172.         mdmstat = CONNECTED;
  5173.         }
  5174.         break;
  5175.       case 13:
  5176.         if (mymdmtyp == n_USR)
  5177.           spdchg(9600L); 
  5178.         if (is_rockwell || mymdmtyp == n_ZOLTRIX)
  5179.           spdchg(7200L); 
  5180.         else if (mymdmtyp != n_MICROLINK) /* 12000 */
  5181.           spdchg(14400L);
  5182.         mdmstat = CONNECTED;
  5183.         break;
  5184.       case 14:
  5185.         if (is_rockwell)
  5186.           spdchg(12000L); 
  5187.         else if (mymdmtyp == n_DATAPORT || mymdmtyp == n_MICROLINK)
  5188.           spdchg(14400L);
  5189.         else if (mymdmtyp != n_USR && mymdmtyp != n_ZOLTRIX)
  5190.           spdchg(19200L);
  5191.         mdmstat = CONNECTED;
  5192.         break;
  5193.       case 15:
  5194.         if (is_rockwell || mymdmtyp == n_ZOLTRIX)
  5195.           spdchg(14400L);
  5196.         else if (mymdmtyp == n_ZYXEL || mymdmtyp == n_INTEL)
  5197.           spdchg(7200L);
  5198.         else if (mymdmtyp == n_DATAPORT)
  5199.           spdchg(19200L);
  5200.         else
  5201.           spdchg(38400L);
  5202.         mdmstat = CONNECTED;
  5203.         break;
  5204.       case 16:
  5205.         if (is_rockwell || mymdmtyp == n_ZOLTRIX)
  5206.           spdchg(19200L);
  5207.         else if (mymdmtyp == n_DATAPORT)
  5208.           spdchg(7200L);
  5209.         else if (mymdmtyp != n_ZYXEL && mymdmtyp != n_INTEL) /* 12000 */
  5210.           spdchg(57600L);
  5211.         mdmstat = CONNECTED;
  5212.         break;
  5213.       case 17:
  5214.         if (mymdmtyp != n_DATAPORT)    /* 16800 */
  5215.           spdchg(38400L);
  5216.         else if (mymdmtyp == n_ZYXEL || mymdmtyp == n_INTEL)
  5217.           spdchg(14400L);
  5218.         mdmstat = CONNECTED;
  5219.         break;
  5220.       case 18:
  5221.         if (is_rockwell || mymdmtyp == n_ZOLTRIX)
  5222.           spdchg(57600L);
  5223.         else if (mymdmtyp == n_INTEL)
  5224.           spdchg(19200L);
  5225.         else if (mymdmtyp == n_USR)
  5226.           spdchg(4800L);
  5227.         mdmstat = CONNECTED;
  5228.         break;
  5229.       case 19:
  5230.         if (mymdmtyp == n_DATAPORT)
  5231.           spdchg(300L);
  5232.         else if (mymdmtyp == n_ZYXEL || mymdmtyp == n_INTEL)
  5233.           spdchg(38400L);
  5234.         else
  5235.           spdchg(115200L);
  5236.         mdmstat = CONNECTED;
  5237.         break;
  5238.       case 20:
  5239.         if (mymdmtyp == n_USR)
  5240.           spdchg(7200L);
  5241.         else if (mymdmtyp == n_DATAPORT)
  5242.           spdchg(2400L);
  5243.         else if (mymdmtyp == n_ZYXEL || mymdmtyp == n_INTEL)
  5244.           spdchg(57600L);
  5245.         else
  5246.           spdchg(300L);
  5247.         mdmstat = CONNECTED;
  5248.         break;
  5249.       case 21:
  5250.         if (mymdmtyp == n_DATAPORT)
  5251.           spdchg(4800L);
  5252.         mdmstat = CONNECTED;
  5253.         break;
  5254.       case 22:
  5255.         if (is_rockwell)
  5256.           spdchg(8880L);
  5257.         else if (mymdmtyp == n_DATAPORT)
  5258.           spdchg(9600L);
  5259.         else if (!is_hayeshispd)
  5260.           spdchg(1200L);
  5261.         mdmstat = CONNECTED;
  5262.         break;
  5263.       case 23:
  5264.         if (is_hayeshispd || mymdmtyp == n_MULTI)
  5265.           spdchg(8880L);
  5266.         else if (mymdmtyp != n_DATAPORT && !is_rockwell) /* 12000 */
  5267.           spdchg(2400L);
  5268.         mdmstat = CONNECTED;
  5269.         break;
  5270.       case 24:
  5271.         if (is_rockwell) {
  5272.         mdmstat = D_FAILED;
  5273.         dialsta = DIA_DELA;    /* Delayed */
  5274.         break;
  5275.         } else if (is_hayeshispd)
  5276.           spdchg(7200L);
  5277.         else if (mymdmtyp == n_DATAPORT)
  5278.           spdchg(14400L);
  5279.         else if (mymdmtyp == n_INTEL)
  5280.           spdchg(1200L);
  5281.         mdmstat = CONNECTED;
  5282.         break;
  5283.       case 25:
  5284.         if (mymdmtyp == n_MOTOROLA)
  5285.           spdchg(9600L);
  5286.         else if (mymdmtyp == n_INTEL)
  5287.           spdchg(2400L);
  5288.         mdmstat = CONNECTED;
  5289.         break;
  5290.       case 26:
  5291.         if (mymdmtyp == n_DATAPORT)
  5292.           spdchg(19200L);
  5293.         else if (mymdmtyp == n_INTEL)
  5294.           spdchg(4800L);
  5295.         mdmstat = CONNECTED;
  5296.         break;
  5297.       case 27:
  5298.         if (mymdmtyp == n_DATAPORT)
  5299.           spdchg(38400L);
  5300.         else if (mymdmtyp == n_INTEL)
  5301.           spdchg(7200L);
  5302.         mdmstat = CONNECTED;
  5303.         break;
  5304.       case 28:
  5305.         if (mymdmtyp == n_DATAPORT)
  5306.           spdchg(7200L);
  5307.         else if (mymdmtyp == n_INTEL)
  5308.           spdchg(9600L);
  5309.         mdmstat = CONNECTED;
  5310.         break;
  5311.       case 29:
  5312.         if (mymdmtyp == n_MOTOROLA)
  5313.           spdchg(4800L);
  5314.         else if (mymdmtyp == n_DATAPORT)
  5315.           spdchg(19200L);
  5316.         mdmstat = CONNECTED;
  5317.         break;
  5318.       case 30:
  5319.         if (mymdmtyp == n_INTEL) {
  5320.         spdchg(14400L);
  5321.         mdmstat = CONNECTED;
  5322.         } /* fall thru on purpose... */
  5323.       case 31:
  5324.         if (mymdmtyp == n_UCOM_AT || mymdmtyp == n_MICROLINK) {
  5325.         spdchg(4800L);
  5326.         mdmstat = CONNECTED;
  5327.         } else if (mymdmtyp == n_MOTOROLA) {
  5328.         spdchg(57600L);
  5329.         mdmstat = CONNECTED;
  5330.         }
  5331.         break;
  5332.       case 32:
  5333.         if (is_rockwell) {
  5334.         mdmstat = D_FAILED;
  5335.         dialsta = DIA_BLCK;    /* Blacklisted */
  5336.         } else if (mymdmtyp == n_UCOM_AT || mymdmtyp == n_MICROLINK) {
  5337.         spdchg(9600L);
  5338.         mdmstat = CONNECTED;
  5339.         } else if (mymdmtyp == n_INTEL) {
  5340.         spdchg(2400L);
  5341.         mdmstat = CONNECTED;
  5342.         }
  5343.         break;
  5344.       case 33:            /* FAX connection */
  5345.         if (is_rockwell || mymdmtyp == n_ZOLTRIX) {
  5346.         mdmstat = D_FAILED;
  5347.         dialsta = DIA_FAX;
  5348.         } else if (mymdmtyp == n_UCOM_AT ||
  5349.                mymdmtyp == n_MOTOROLA ||
  5350.                mymdmtyp == n_MICROLINK
  5351.                ) {
  5352.         spdchg(9600L);
  5353.         mdmstat = CONNECTED;
  5354.         }
  5355.         break;
  5356.       case 34:
  5357.         if (mymdmtyp == n_INTEL) {
  5358.         spdchg(1200L);
  5359.         mdmstat = CONNECTED;
  5360.         } else if (mymdmtyp == n_MICROLINK) {
  5361.         spdchg(7200L);
  5362.         mdmstat = CONNECTED;
  5363.         }
  5364.         break;
  5365.       case 35:
  5366.         if (is_rockwell) {
  5367.         spdchg(300L);
  5368.         dialsta = CONNECTED;
  5369.         } else if (mymdmtyp == n_MOTOROLA) {
  5370.         spdchg(14400L);
  5371.         mdmstat = CONNECTED;
  5372.         } else if (mymdmtyp == n_INTEL) {
  5373.         spdchg(2400L);
  5374.         mdmstat = CONNECTED;
  5375.         } else if (mymdmtyp == n_MICROLINK) {
  5376.         spdchg(7200L);
  5377.         mdmstat = CONNECTED;
  5378.         } else if (mymdmtyp == n_ZOLTRIX) /* "DATA" */
  5379.           mdmstat = CONNECTED;
  5380.         break;
  5381.       case 36:
  5382.         if (mymdmtyp == n_UCOM_AT) {
  5383.         spdchg(19200L);
  5384.         mdmstat = CONNECTED;
  5385.         } else if (mymdmtyp == n_MOTOROLA) {
  5386.         spdchg(1200L);
  5387.         mdmstat = CONNECTED;
  5388.         } else if (mymdmtyp == n_INTEL) {
  5389.         spdchg(4800L);
  5390.         mdmstat = CONNECTED;
  5391.         }
  5392.         break;
  5393.       case 37:
  5394.         if (mymdmtyp == n_UCOM_AT) {
  5395.         spdchg(19200L);
  5396.         mdmstat = CONNECTED;
  5397.         } else if (mymdmtyp == n_MOTOROLA) {
  5398.         spdchg(2400L);
  5399.         mdmstat = CONNECTED;
  5400.         } else if (mymdmtyp == n_INTEL) {
  5401.         spdchg(7200L);
  5402.         mdmstat = CONNECTED;
  5403.         }
  5404.         break;
  5405.       case 38:
  5406.         if (mymdmtyp == n_MOTOROLA) {
  5407.         spdchg(4800L);
  5408.         mdmstat = CONNECTED;
  5409.         } else if (mymdmtyp == n_INTEL) {
  5410.         spdchg(9600L);
  5411.         mdmstat = CONNECTED;
  5412.         } /* fall thru on purpose... */
  5413.       case 39:
  5414.         if (mymdmtyp == n_UCOM_AT) {
  5415.         spdchg(38400L);
  5416.         mdmstat = CONNECTED;
  5417.         } else if (mymdmtyp == n_MOTOROLA) {
  5418.         spdchg(9600L);
  5419.         mdmstat = CONNECTED;
  5420.         } else if (mymdmtyp == n_MICROLINK) {
  5421.         spdchg(14400L);
  5422.         mdmstat = CONNECTED;
  5423.         }
  5424.         break;
  5425.       case 40:
  5426.         if (mymdmtyp == n_UCOM_AT) {
  5427.         mdmstat = D_FAILED;
  5428.         dialsta = DIA_NOCA;
  5429.         } else if (mymdmtyp == n_MOTOROLA || mymdmtyp == n_INTEL) {
  5430.         spdchg(14400L);
  5431.         mdmstat = CONNECTED;
  5432.         }
  5433.         break;
  5434.       case 41:
  5435.         if (mymdmtyp == n_MOTOROLA) {
  5436.         spdchg(19200L);
  5437.         mdmstat = CONNECTED;
  5438.         }
  5439.         break;
  5440.       case 42:
  5441.         if (mymdmtyp == n_MOTOROLA) {
  5442.         spdchg(38400L);
  5443.         mdmstat = CONNECTED;
  5444.         } /* fall thru on purpose... */
  5445.       case 43:
  5446.         if (mymdmtyp == n_UCOM_AT) {
  5447.         spdchg(57600L);
  5448.         mdmstat = CONNECTED;
  5449.         }
  5450.         break;
  5451.       case 44:
  5452.         if (is_rockwell) {
  5453.         spdchg(8800L);
  5454.         dialsta = CONNECTED;
  5455.         } else if (mymdmtyp == n_MOTOROLA) {
  5456.         spdchg(7200L);
  5457.         mdmstat = CONNECTED;
  5458.         } else if (mymdmtyp == n_INTEL) {
  5459.         spdchg(1200L);
  5460.         mdmstat = CONNECTED;
  5461.         }
  5462.         break;
  5463.       case 45:
  5464.         if (mymdmtyp == n_MOTOROLA) {
  5465.         spdchg(57600L);
  5466.         mdmstat = CONNECTED;
  5467.         } else if (mymdmtyp == n_INTEL) {
  5468.         spdchg(2400L);
  5469.         mdmstat = CONNECTED;
  5470.         }
  5471.         break;
  5472.       case 46:
  5473.         if (is_rockwell)
  5474.           spdchg(1200L);
  5475.         else if (mymdmtyp == n_INTEL)
  5476.           spdchg(4800L);
  5477.         else
  5478.           spdchg(8880L);        /* 75/1200 split speed */
  5479.         mdmstat = CONNECTED;
  5480.         break;
  5481.       case 47:
  5482.         if (is_rockwell)
  5483.           spdchg(2400L);
  5484.         else if (mymdmtyp == n_INTEL)
  5485.           spdchg(7200L);
  5486.         else
  5487.           printf("CONNECT 1200/75 - Not supported by C-Kermit\r\n");
  5488.         mdmstat = CONNECTED;
  5489.         break;
  5490.       case 48:
  5491.         if (is_rockwell)
  5492.           spdchg(4800L);
  5493.         else if (mymdmtyp == n_INTEL)
  5494.           spdchg(9600L);
  5495.         else
  5496.           spdchg(7200L);
  5497.         mdmstat = CONNECTED;
  5498.         break;
  5499.       case 49:
  5500.         if (is_rockwell)
  5501.           spdchg(7200L);
  5502.         mdmstat = CONNECTED;
  5503.         break;
  5504.       case 50:            /* CONNECT FAST */
  5505.         if (is_rockwell)
  5506.           spdchg(9600L);
  5507.         else if (mymdmtyp == n_INTEL)
  5508.           spdchg(14400L);
  5509.         mdmstat = CONNECTED;
  5510.         break;
  5511.       case 51:
  5512.         if (mymdmtyp == n_UCOM_AT) {
  5513.         mdmstat = D_FAILED;
  5514.         dialsta = DIA_NODT;
  5515.         }
  5516.         break;
  5517.       case 52:            /* RRING */
  5518.         if (mymdmtyp == n_TELEBIT)
  5519.           if (dialdpy) printf(" Ringing...\r\n");
  5520.         break;
  5521.       case 53:            /* DIALING */
  5522.         if (mymdmtyp == n_TELEBIT)
  5523.           if (dialdpy) printf(" Dialing...\r\n");
  5524.         break;
  5525.       case 54:
  5526.         if (is_rockwell) {
  5527.         spdchg(19200L);
  5528.         mdmstat = CONNECTED;
  5529.         } else if (mymdmtyp == n_INTEL) {
  5530.         spdchg(1200L);
  5531.         mdmstat = CONNECTED;
  5532.         } else if (mymdmtyp == n_TELEBIT) {
  5533.         if (dialdpy) printf("\r\n No Prompttone.\r\n");
  5534.         mdmstat = D_FAILED;
  5535.         dialsta = DIA_NODT;
  5536.         }
  5537.         break;
  5538.       case 55:
  5539.         if (mymdmtyp == n_INTEL) {
  5540.         spdchg(2400L);
  5541.         mdmstat = CONNECTED;
  5542.         }
  5543.         break;
  5544.       case 56:
  5545.         if (mymdmtyp == n_INTEL) {
  5546.         spdchg(4800L);
  5547.         mdmstat = CONNECTED;
  5548.         }
  5549.         break;
  5550.       case 57:
  5551.         if (mymdmtyp == n_INTEL) {
  5552.         spdchg(7200L);
  5553.         mdmstat = CONNECTED;
  5554.         }
  5555.         break;
  5556.       case 58:
  5557.         if (mymdmtyp == n_INTEL) {
  5558.         spdchg(9600L);
  5559.         mdmstat = CONNECTED;
  5560.         }
  5561.         break;
  5562.       case 59:
  5563.         if (mymdmtyp == n_INTEL)    /* 12000 */
  5564.           mdmstat = CONNECTED;
  5565.         break;
  5566.       case 60:
  5567.         if (mymdmtyp == n_INTEL) {
  5568.         spdchg(14400L);
  5569.         mdmstat = CONNECTED;
  5570.         }
  5571.         break;
  5572.       case 64:
  5573.         if (mymdmtyp == n_INTEL) {
  5574.         spdchg(1200L);
  5575.         mdmstat = CONNECTED;
  5576.         }
  5577.         break;
  5578.       case 65:
  5579.         if (mymdmtyp == n_INTEL) {
  5580.         spdchg(2400L);
  5581.         mdmstat = CONNECTED;
  5582.         }
  5583.         break;
  5584.       case 66:
  5585.         if (mymdmtyp == n_INTEL) {
  5586.         spdchg(4800L);
  5587.         mdmstat = CONNECTED;
  5588.         }
  5589.         break;
  5590.       case 67:
  5591.         if (mymdmtyp == n_INTEL) {
  5592.         spdchg(7200L);
  5593.         mdmstat = CONNECTED;
  5594.         }
  5595.         break;
  5596.       case 68:
  5597.         if (mymdmtyp == n_INTEL) {
  5598.         spdchg(9600L);
  5599.         mdmstat = CONNECTED;
  5600.         }
  5601.         break;
  5602.       case 69:
  5603.         if (mymdmtyp == n_INTEL)    /* 12000 */
  5604.           mdmstat = CONNECTED;
  5605.         break;
  5606.       case 70:
  5607.         if (mymdmtyp == n_INTEL) {
  5608.         spdchg(14400L);
  5609.         mdmstat = CONNECTED;
  5610.         }
  5611.         break;
  5612.       case 73:
  5613.         if (mymdmtyp == n_UCOM_AT) {
  5614.         spdchg(115200L);
  5615.         mdmstat = CONNECTED;
  5616.         break;
  5617.         } /* else fall thru */
  5618.         if (mymdmtyp == n_TELEBIT)    /* Early models only */
  5619.           mdmstat = CONNECTED;
  5620.         break;
  5621.       case 85:
  5622.         if (mymdmtyp == n_USR)
  5623.           spdchg(19200L);
  5624.         mdmstat = CONNECTED;
  5625.         break;
  5626. #endif /* MINIDIAL */
  5627.       default:
  5628. #ifndef MINIDIAL
  5629.         if (mymdmtyp == n_USR || is_hayeshispd || is_rockwell)
  5630. #endif /* MINIDIAL */
  5631.           if (i > 12)        /* There are hundreds of them... */
  5632.         mdmstat = CONNECTED;
  5633.         break;
  5634.     }
  5635.     }
  5636.     if (mdmstat == CONNECTED && nbuf[j] != '\0') {
  5637.     if (dialdpy) {
  5638.         printf("\r\n");
  5639.         if (nbuf[j] == 'R') printf(" RELIABLE");
  5640.         if (nbuf[j] == 'L') printf(" LAPM");
  5641.         if (nbuf[j+1] == 'C') printf(" COMPRESSED");
  5642.         printf("\r\n");
  5643.     }
  5644.     strcpy(lbuf,nbuf);        /* (for messages...) */
  5645.     }
  5646. }
  5647.  
  5648. static VOID                /* Get Hayes Result in Word mode */
  5649. gethrw() {
  5650.     char *cptr, *s;
  5651.     long conspd;
  5652.  
  5653.     if (mdmspd && !network) {
  5654.     s = lbuf;
  5655.     while (*s != '\0' && *s != 'C') s++;
  5656.     cptr = (*s == 'C') ? s : NULL;
  5657.     conspd = 0L;
  5658.     if ((cptr != NULL) && !strncmp(cptr,"CONNECT ",8)) {
  5659.         if ((int)strlen(cptr) < 9)   /* Just CONNECT, */
  5660.           conspd = 300L;         /* use 300 bps */
  5661.         else if (isdigit(*(cptr+8))) /* not CONNECT FAST */
  5662.           conspd = atol(cptr + 8);   /* CONNECT nnnn */
  5663.         if (conspd != speed) {
  5664.         if ((conspd / 10L) > 0) {
  5665.             if (ttsspd((int) (conspd / 10L)) < 0) {
  5666.             printf(" Can't change speed to %ld\r\n",
  5667.                    conspd);
  5668.             } else {
  5669.             speed = conspd;
  5670.             mdmstat = CONNECTED;
  5671.             if ( !quiet && !backgrd )
  5672.               printf(" Speed changed to %ld\r\n",
  5673.                  conspd);
  5674.             }
  5675.         }
  5676.         } /* Expanded to handle any conceivable speed */
  5677.     }
  5678.     }
  5679. #ifndef MINIDIAL
  5680.     if (mymdmtyp == n_TELEBIT) {
  5681.     if (didweget(lbuf,"CONNECT FAST/KERM")) {
  5682.         mdmstat = CONNECTED;
  5683.         if (dialdpy) printf("FAST/KERM ");
  5684.         return;
  5685.     }
  5686.     }
  5687. #endif /* MINIDIAL */
  5688.     if (didweget(lbuf,"RRING") ||
  5689.     didweget(lbuf,"RINGING") ||
  5690.     didweget(lbuf,"DIALING")) {
  5691.     mdmstat = 0;
  5692.     } else if (didweget(lbuf,"CONNECT")) {
  5693.     mdmstat = CONNECTED;
  5694.     } else if (didweget(lbuf,"OK")) {
  5695.     mdmstat = D_PARTIAL;
  5696.     } else if (didweget(lbuf,"NO CARRIER")) {
  5697.     mdmstat = D_FAILED;
  5698.     dialsta = DIA_NOCA;
  5699.     } else if (didweget(lbuf,"NO DIALTONE")) {
  5700.     mdmstat = D_FAILED;
  5701.     dialsta = DIA_NODT;
  5702.     } else if (didweget(lbuf,"NO DIAL TONE")) {
  5703.     mdmstat = D_FAILED;
  5704.     dialsta = DIA_NODT;
  5705.     } else if (didweget(lbuf,"BUSY")) {
  5706.     mdmstat = D_FAILED;
  5707.     dialsta = DIA_BUSY;
  5708.     } else if (didweget(lbuf,"NO ANSWER")) {
  5709.     mdmstat = D_FAILED;
  5710.     dialsta = DIA_NOAN;
  5711.     } else if (didweget(lbuf,"VOICE")) {
  5712.     mdmstat = D_FAILED;
  5713.     dialsta = DIA_VOIC;
  5714.     } else if (didweget(lbuf,"NO PROMPT TONE")) {
  5715.     mdmstat = D_FAILED;
  5716.     dialsta = DIA_NODT;
  5717.     } else if (didweget(lbuf,"REMOTE ACCESS FAILED")) {
  5718.     mdmstat = D_FAILED;
  5719.     dialsta = DIA_NOCA;
  5720.     } else if (didweget(lbuf,"FAX")) {
  5721.     mdmstat = D_FAILED;
  5722.     dialsta = DIA_FAX;
  5723.     } else if (didweget(lbuf,"DELAYED")) {
  5724.     mdmstat = D_FAILED;
  5725.     dialsta = DIA_DELA;
  5726.     } else if (didweget(lbuf,"BLACKLISTED")) {
  5727.     mdmstat = D_FAILED;
  5728.     dialsta = DIA_BLCK;
  5729.     } else if (didweget(lbuf,"DIAL LOCKED")) { /* Germany, Austria, Schweiz */
  5730.     mdmstat = D_FAILED;
  5731.     dialsta = DIA_BLCK;
  5732.     } else if (didweget(lbuf,"RING")) {
  5733.     mdmstat = (func_code == 0) ? D_FAILED : 0;
  5734.     dialsta = DIA_RING;            
  5735.     } else if (didweget(lbuf,"ERROR")) {
  5736.     mdmstat = D_FAILED;
  5737.     dialsta = DIA_ERR;
  5738.     } else if (didweget(lbuf,"CARRIER")) { /* Boca */
  5739.     mdmstat = CONNECTED;
  5740.     } else if (didweget(lbuf,"DATA")) {    /* Boca */
  5741.     mdmstat = CONNECTED;
  5742.     }
  5743. }
  5744.  
  5745. /* Maybe hang up the phone, depending on various SET DIAL parameters. */
  5746.  
  5747. int
  5748. dialhup() {
  5749.     int x = 0;
  5750.     if (dialhng && dialsta != DIA_PART) { /* DIAL HANGUP ON? */
  5751.     x = mdmhup();            /* Try modem-specific method first */
  5752.     debug(F101,"dialhup mdmhup","",x);
  5753.     if (x > 0) {            /* If it worked, */
  5754.         dialsta = DIA_HUP;
  5755.         if (dialdpy)
  5756.           printf(" Modem hangup OK\r\n"); /* fine. */
  5757.     } else if (network) {        /* If we're telnetted to */
  5758.         dialsta = DIA_HANG;
  5759.         if (dialdpy)        /* a modem server, just print a msg */
  5760.           printf(" WARNING - modem hangup failed\r\n"); /* don't hangup! */
  5761.         return(0);
  5762.     } else {            /* Otherwise */
  5763.         x = tthang();        /* Tell the OS to turn off DTR. */
  5764.         if (x > 0) {        /* Yes, tell results from tthang() */
  5765.         dialsta = DIA_HUP;
  5766.         if (dialdpy) printf(" Hangup OK\r\n");
  5767.         } else if (x == 0) {
  5768.         if (dialdpy) printf(" Hangup skipped\r\n");
  5769.         } else {
  5770.         dialsta = DIA_HANG;
  5771.         if (dialdpy) perror(" Hangup error");
  5772.         }
  5773.     }
  5774.     } else if (dialdpy) printf(" Hangup skipped\r\n"); /* DIAL HANGUP OFF */
  5775.     return(x);
  5776. }
  5777.  
  5778. /*
  5779.   M D M H U P  --
  5780.  
  5781.   Sends escape sequence to modem, then sends its hangup command.  Returns:
  5782.    0: If modem type is 0 (direct serial connection),
  5783.       or if modem type is < 0 (network connection),
  5784.       or if no action taken because DIAL MODEM-HANGUP is OFF)
  5785.         or because no hangup string for current modem type,
  5786.       or C-Kermit is in remote mode,
  5787.       or if action taken but there was no positive response from modem;
  5788.    1: Success: modem is in command state and acknowledged the hangup command;
  5789.   -1: On modem command error.
  5790. */
  5791. int
  5792. mdmhup() {
  5793. #ifdef MDMHUP
  5794.     int m, x = 0;
  5795.     int xparity;
  5796.     char *s, *p;
  5797.     MDMINF * mp = NULL;
  5798.  
  5799.     if (dialmhu == 0 || local == 0)    /* If DIAL MODEM-HANGUP is OFF, */
  5800.       return(0);            /*  or not in local mode, fail. */
  5801.  
  5802. #ifdef OS2
  5803. /*
  5804.   In OS/2, if CARRIER is OFF, and there is indeed no carrier signal, any
  5805.   attempt to do i/o at this point can hang the program.  This might be true
  5806.   for other operating systems too.
  5807. */
  5808.     if (!network) {            /* Not a network connection */
  5809.     m = ttgmdm();            /* Get modem signals */
  5810.     if ((m > -1) && (m & BM_DCD == 0)) /* Check for carrier */
  5811.       return(0);            /* No carrier, skip the rest */
  5812.     }
  5813. #endif /* OS2 */
  5814.     
  5815.     if (mymdmtyp < 0)
  5816.       return(0);
  5817.     if (mymdmtyp > 0) mp = modemp[mymdmtyp - 1];
  5818.     if (!mp) return(0);
  5819.  
  5820.     s = dialhcmd ? dialhcmd : mp->hup_str;
  5821.     if (!s) return(0);
  5822.     if (!*s) return(0);
  5823.  
  5824.     debug(F110,"mdmhup hup_str",s,0);
  5825.     xparity = parity;            /* Set PARITY to NONE temporarily */
  5826.  
  5827.     if (escbuf[0]) {            /* Have escape sequence? */
  5828.     debug(F110,"mdmhup escbuf",escbuf,0);
  5829.     debug(F101,"mdmhup esc_time",0,mp->esc_time);
  5830.     parity = 0;
  5831.     if (ttpkt(speed,FLO_DIAL,parity) < 0) { /* Condition line */
  5832.         parity = xparity;
  5833.         return(-1);            /*  for dialing. */
  5834.     }
  5835.     if (mp->esc_time)        /* If we have a guard time */
  5836.       msleep(mp->esc_time);        /* Pause for guard time */
  5837.     debug(F100,"mdmhup pause 1 OK","",0);
  5838.  
  5839. #ifdef NETCONN                /* Send modem's escape sequence */
  5840.     if (network) {            /* Must catch errors here. */
  5841.         if (ttol((CHAR *)escbuf,(int)strlen((char *)escbuf)) < 0) {
  5842.         parity = xparity;
  5843.         return(-1);
  5844.         }
  5845.     } else {
  5846. #endif /* NETCONN */
  5847.         ttslow((char *)escbuf,mp->wake_rate); /* Send escape sequence */
  5848.         debug(F110,"mdmhup net ttslow ok",escbuf,0);
  5849. #ifdef NETCONN
  5850.     }
  5851. #endif /* NETCONN */
  5852.  
  5853.     if (mp->esc_time)        /* Pause for guard time again */
  5854.       msleep(mp->esc_time);
  5855.     else
  5856.       msleep(500);            /* Wait half a sec for echoes. */
  5857.     debug(F100,"mdmhup pause 1 OK","",0);
  5858. #ifdef COMMENT    
  5859.     ttflui();            /* Flush response or echo, if any */
  5860.     debug(F100,"mdmhup ttflui OK","",0);
  5861. #endif /* COMMENT */
  5862.     ttslow(s,mp->wake_rate);    /* Now Send hangup string */
  5863.     debug(F110,"mdmhup ttslow ok",s,0);
  5864. /*
  5865.   This is not exactly right, but it works.
  5866.   If we are online:
  5867.     the modem says OK when it gets the escape sequence,
  5868.     and it says NO CARRIER when it gets the hangup command.    
  5869.   If we are offline:
  5870.     the modem does NOT say OK (or anything else) when it gets the esc sequence,
  5871.     but it DOES say OK (and not NO CARRIER) when it gets the hangup command.
  5872.   So the following function should read the OK in both cases.
  5873.   Of course, this is somewhat Hayes-specific...
  5874. */
  5875.     if (xx_ok) {            /* Look for OK response */
  5876.         debug(F100,"mdmhup calling response function","",0);
  5877.         x = (*xx_ok)(3,1);        /* Give it 3 seconds, be strict. */
  5878.         debug(F101,"mdmhup hangup response","",x);
  5879.         msleep(500);        /* Wait half a sec */
  5880.         ttflui();            /* Get rid of NO CARRIER, if any */
  5881.     } else {            /* No OK function, */
  5882.         x = 1;            /* so assume it worked */
  5883.         debug(F101,"mdmhup no ok_fn","",x);
  5884.     }
  5885.     }
  5886.     parity = xparity;            /* Restore prevailing parity */
  5887.     return(x);                /* Return OK function's return code. */
  5888.  
  5889. #else  /* MDMHUP not defined. */
  5890.  
  5891.     return(0);                /* Always fail. */
  5892. #endif /* MDMHUP */
  5893. }
  5894.  
  5895. #else /* NODIAL */
  5896.  
  5897. char *dialv = "Dial Command Disabled";
  5898.  
  5899. int                    /* To allow NODIAL versions to */
  5900. mdmhup() {                /* call mdmhup(), so calls to  */
  5901.     return(0);                /* mdmhup() need not be within */
  5902. }                    /* #ifndef NODIAL conditionals */
  5903.  
  5904. #endif /* NOICP */
  5905. #endif /* NODIAL */
  5906. #endif /* NOLOCAL */
  5907.