source: trunk/third/kermit/ckudia.c @ 20081

Revision 20081, 234.8 KB checked in by zacheiss, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r20080, which included commits to RCS files with non-trunk default branches.
Line 
1#include "ckcsym.h"
2char *dialv = "Dial Command, 8.0.160, 29 Apr 2002";
3
4/*  C K U D I A  --  Module for automatic modem dialing. */
5
6/*
7  Copyright (C) 1985, 2002,
8    Trustees of Columbia University in the City of New York.
9    All rights reserved.  See the C-Kermit COPYING.TXT file or the
10    copyright text in the ckcmai.c module for disclaimer and permissions.
11*/
12
13/*
14  Authors:
15
16  Original (version 1, 1985) author: Herm Fischer, Encino, CA.
17  Contributed to Columbia University in 1985 for inclusion in C-Kermit 4.0.
18  Author and maintainer since 1985: Frank da Cruz, Columbia University,
19  fdc@columbia.edu.
20
21  Contributions by many others throughout the years, including: Jeffrey
22  Altman, Mark Berryman, Fernando Cabral, John Chmielewski, Joe Doupnik,
23  Richard Hill, Larry Jacobs, Eric Jones, Tom Kloos, Bob Larson, Peter Mauzey,
24  Joe Orost, Kevin O'Gorman, Kai Uwe Rommel, Dan Schullman, Warren Tucker, and
25  many others.
26*/
27
28/*
29  Entry points:
30    ckdial(char * number)   Dial a number or answer a call
31    dialhup()               Hang up a dialed connection
32    mdmhup()                Use modem commands to hang up
33
34  All other routines are static.
35  Don't call dialhup() or mdmhup() without first calling ckdial().
36*/
37
38/*
39  This module calls externally defined system-dependent functions for
40  communications i/o, as described in CKCPLM.DOC, the C-Kermit Program Logic
41  Manual, and thus should be portable to all systems that implement those
42  functions, and where alarm() and signal() work.
43
44  HOW TO ADD SUPPORT FOR ANOTHER MODEM:
45
46  1. In ckuusr.h, define a modem-type number symbol (n_XXX) for the new modem,
47     the next highest one.
48
49  2. In ckuusr.h, adjust MAX_MDM to the new number of modem types.
50
51The remaining steps are in this module:
52
53  3. Create a MDMINF structure for it.  NOTE: The wake_str should include
54     all invariant setup info, e.g. enable result codes, BREAK transparency,
55     modulation negotiation, etc.  See ckcker.h for MDMINF struct definition.
56
57  4. Add the address of the MDMINF structure to the modemp[] array,
58     according to the numerical value of the modem-type number.
59
60  5. Add the user-visible (SET MODEM) name and corresponding modem number
61     to the mdmtab[] array, in alphabetical order by modem-name string.
62
63  6. If this falls into a class like is_rockwell, is_supra, etc, add the new
64     one to the definition of the class.
65
66  7. Adjust the gethrn() routine to account for any special numeric result
67     codes (if it's a Hayes compatible modem).
68
69  8. Read through the code and add any modem-specific sections as necessary.
70     For most modern Hayes-compatible modems, no specific code will be
71     needed.
72
73  NOTE: The MINIDIAL symbol is used to build this module to include support
74  for only a minimum number of standard and/or generally useful modem types,
75  namely Hayes 1200 and 2400, ITU-T (CCITT) V.25bis and V.25ter (V.250),
76  Generic-High-Speed, "Unknown", and None.  When adding support for a new
77  modem type, keep it outside of the MINIDIAL sections unless it deserves to
78  be in it.
79*/
80
81#include "ckcdeb.h"
82#ifndef NOLOCAL
83#ifndef NODIAL
84#ifndef NOICP
85
86#ifndef CK_ATDT
87#define CK_ATDT
88#endif /* CK_ATDT */
89
90#ifndef NOOLDMODEMS        /* Unless instructed otherwise, */
91#define OLDMODEMS          /* keep support for old modems. */
92#endif /* NOOLDMODEMS */
93
94#ifndef M_OLD              /* Hide old modem keywords in SET MODEM table. */
95#define M_OLD 0            /* Define as CM_INV to make them invisible. */
96#endif /* M_OLD */
97
98#ifndef M_ALIAS
99#define M_ALIAS 64
100#endif /* M_ALIAS */
101
102#ifndef MAC
103#include <signal.h>
104#endif /* MAC */
105#include "ckcasc.h"
106#include "ckcker.h"
107#include "ckucmd.h"
108#include "ckcnet.h"
109#include "ckuusr.h"
110
111#ifdef OS2ONLY
112#define INCL_VIO                        /* Needed for ckocon.h */
113#include <os2.h>
114#undef COMMENT
115#include "ckocon.h"
116#endif /* OS2ONLY */
117
118#ifdef NT
119#include <windows.h>
120#include <tapi.h>
121#include "cknwin.h"
122#include "ckntap.h"
123#endif /* NT */
124#ifdef OS2
125#include "ckowin.h"
126#endif /* OS2 */
127
128#ifndef ZILOG
129#ifdef NT
130#include <setjmpex.h>
131#else /* NT */
132#include <setjmp.h>
133#endif /* NT */
134#else
135#include <setret.h>
136#endif /* ZILOG */
137
138#include "ckcsig.h"        /* C-Kermit signal processing */
139
140#ifdef MAC
141#define signal msignal
142#define SIGTYP long
143#define alarm malarm
144#define SIG_IGN 0
145#define SIGALRM 1
146#define SIGINT  2
147SIGTYP (*msignal(int type, SIGTYP (*func)(int)))(int);
148#endif /* MAC */
149
150#ifdef AMIGA
151#define signal asignal
152#define alarm aalarm
153#define SIGALRM (_NUMSIG+1)
154#define SIGTYP void
155SIGTYP (*asignal(int type, SIGTYP (*func)(int)))(int);
156unsigned aalarm(unsigned);
157#endif /* AMIGA */
158
159#ifdef STRATUS
160/*
161  VOS doesn't have alarm(), but it does have some things we can work with.
162  However, we have to catch all the signals in one place to do this, so
163  we intercept the signal() routine and call it from our own replacement.
164*/
165#define signal vsignal
166#define alarm valarm
167SIGTYP (*vsignal(int type, SIGTYP (*func)(int)))(int);
168int valarm(int interval);
169#ifdef putchar
170#undef putchar
171#endif /* putchar */
172#define putchar(x) conoc(x)
173#ifdef getchar
174#undef getchar
175#endif /* getchar */
176#define getchar(x) coninc(0)
177#endif /* STRATUS */
178
179#ifdef OS2
180#ifdef putchar
181#undef putchar
182#endif /* putchar */
183#define putchar(x) conoc(x)
184#endif /* OS2 */
185
186#ifndef NOHINTS
187extern int hints;
188#endif /* NOHINTS */
189
190#ifdef CK_TAPI
191extern int tttapi;
192extern int tapipass;
193#endif /* CK_TAPI */
194
195#ifdef CKLOGDIAL
196extern int dialog;
197#endif /* CKLOGDIAL */
198
199char * dialmsg[] = {                    /* DIAL status strings */
200
201    /* Keyed to numbers defined in ckcker.h -- keep in sync! */
202
203    "DIAL succeeded",                       /*  0 DIA_OK */
204    "Modem type not specified",             /*  1 DIA_NOMO */
205    "Communication device not specified",   /*  2 DIA_NOLI */
206    "Communication device can't be opened", /*  3 DIA_OPEN */
207    "Speed not specified",                  /*  4 DIA_NOSP */
208    "Pre-DIAL hangup failed",               /*  5 DIA_HANG */
209    "Internal error",                       /*  6 DIA_IE   */
210    "Device input/output error",            /*  7 DIA_IO   */
211    "DIAL TIMEOUT expired",                 /*  8 DIA_TIMO */
212    "Interrupted by user",                  /*  9 DIA_INTR */
213    "Modem not ready",                      /* 10 DIA_NRDY */
214    "Partial dial OK",                      /* 11 DIA_PART */
215    "Dial directory lookup error",          /* 12 DIA_DIR  */
216    "Hangup OK",                            /* 13 DIA_HUP  */
217    NULL,                                   /* 14 (undef)  */
218    NULL,                                   /* 15 (undef)  */
219    NULL,                                   /* 16 (undef)  */
220    NULL,                                   /* 17 (undef)  */
221    NULL,                                   /* 18 (undef)  */
222    "No response from modem",               /* 19 DIA_NRSP */
223    "Modem command error",                  /* 20 DIA_ERR  */
224    "Failure to initialize modem",          /* 21 DIA_NOIN */
225    "Phone busy",                           /* 22 DIA_BUSY */
226    "No carrier",                           /* 23 DIA_NOCA */
227    "No dialtone",                          /* 24 DIA_NODT */
228    "Incoming call",                        /* 25 DIA_RING */
229    "No answer",                            /* 26 DIA_NOAN */
230    "Disconnected",                         /* 27 DIA_DISC */
231    "Answered by voice",                    /* 28 DIA_VOIC */
232    "Access denied / forbidden call",       /* 29 DIA_NOAC */
233    "Blacklisted",                          /* 30 DIA_BLCK */
234    "Delayed",                              /* 31 DIA_DELA */
235    "Fax connection",                       /* 32 DIA_FAX  */
236    "Digital line",                         /* 33 DIA_DIGI */
237    "TAPI dialing failure",                 /* 34 DIA_TAPI */
238    NULL                                    /* 34 */
239};
240
241#ifdef COMMENT
242#ifdef NOSPL
243static
244#endif /* NOSPL */
245char modemmsg[128] = { NUL, NUL };      /* DIAL response from modem */
246#endif /* COMMENT */
247
248#ifdef NTSIG
249extern int TlsIndex;
250#endif /* NTSIG */
251
252int mdmtyp = n_GENERIC;                 /* Default modem type */
253int mdmset = 0;                         /* User explicitly set a modem type */
254
255int                                     /* SET DIAL parameters */
256  dialhng = 1,                          /* DIAL HANGUP, default is ON */
257  dialdpy = 0,                          /* DIAL DISPLAY, default is OFF */
258  mdmspd  = 0,                          /* DIAL SPEED-MATCHING (0 = OFF) */
259  mdmspk  = 1,                          /* MODEM SPEAKER */
260  mdmvol  = 2,                          /* MODEM VOLUME */
261  dialtmo = 0,                          /* DIAL TIMEOUT */
262  dialatmo = -1,                        /* ANSWER TIMEOUT */
263  dialksp = 0,                          /* DIAL KERMIT-SPOOF, 0 = OFF */
264  dialidt = 0,                          /* DIAL IGNORE-DIALTONE */
265#ifndef CK_RTSCTS
266  /* If we can't do RTS/CTS then there's no flow control at first.  */
267  /* So we might easily lose the echo to the init string and the OK */
268  /* and then give "No response from modem" errors. */
269  dialpace = 150,                       /* DIAL PACING */
270#else
271  dialpace = -1,
272#endif /* CK_RTSCTS */
273
274  /* 0 = RS232 (drop DTR); 1 = MODEM-COMMAND (e.g. <sec>+++<sec>ATH0) */
275  dialmhu = DEFMDMHUP;                  /* MODEM HANGUP-METHOD */
276
277int
278  dialec = 1,                           /* DIAL ERROR-CORRECTION */
279  dialdc = 1,                           /* DIAL COMPRESSION  */
280#ifdef VMS
281  /* VMS can only use Xon/Xoff */
282  dialfc = FLO_XONX,                    /* DIAL FLOW-CONTROL */
283#else
284  dialfc = FLO_AUTO,
285#endif /* VMS */
286  dialmth = XYDM_D,                     /* DIAL METHOD (Tone, Pulse, Defalt) */
287  dialmauto = 1,                        /* DIAL METHOD is AUTO */
288  dialesc = 0;                          /* DIAL ESCAPE */
289
290int telephony = 0;                      /* Command-line '-T' option */
291
292long dialmax = 0L,                      /* Modem's max interface speed */
293  dialcapas  = 0L;                      /* Modem's capabilities */
294
295int dialsta = DIA_UNK;                  /* Detailed return code (ckuusr.h) */
296
297#ifdef COMMENT
298int ans_cid = 0;                        /* SET ANSWER parameters */
299int ans_rings = 0;                      /* (not used yet...) */
300#endif /* COMMENT */
301
302int is_rockwell = 0;
303int is_motorola = 0;
304int is_supra = 0;
305int is_hayeshispd = 0;
306
307/* Dialing directory list */
308
309char *dialdir[MAXDDIR];                 /* DIAL DIRECTORY filename array */
310int   ndialdir = 0;                     /* How many dial directories */
311
312/* User overrides for built-in modem commands */
313
314char *dialini = NULL;                   /* MODEM INIT-STRING none */
315char *dialmstr = NULL;                  /* MODEM DIALMODE-STRING */
316char *dialmprmt = NULL;                 /* MODEM DIALMODE-PROMPT */
317char *dialcmd = NULL;                   /* MODEM DIAL-COMMAND, default none */
318char *dialname  = NULL;                 /* Descriptive name for modem */
319char *dialdcon  = NULL;                 /* DC ON command */
320char *dialdcoff = NULL;                 /* DC OFF command */
321char *dialecon  = NULL;                 /* EC ON command */
322char *dialecoff = NULL;                 /* EC OFF command */
323char *dialaaon  = NULL;                 /* Autoanswer ON command */
324char *dialaaoff = NULL;                 /* Autoanswer OFF command */
325char *dialhcmd  = NULL;                 /* Hangup command */
326char *dialhwfc  = NULL;                 /* Hardware flow control command */
327char *dialswfc  = NULL;                 /* (Local) software f.c. command */
328char *dialnofc  = NULL;                 /* No (Local) flow control command */
329char *dialtone  = NULL;                 /* Command to force tone dialing */
330char *dialpulse = NULL;                 /*  ..to force pulse dialing */
331char *dialx3    = NULL;                 /* Ignore dialtone */
332char *mdmname   = NULL;
333char *dialspon  = NULL;                 /* Speaker On command */
334char *dialspoff = NULL;                 /* Speaker Off command */
335char *dialvol1  = NULL;                 /* Volume Low command */
336char *dialvol2  = NULL;                 /* Volume Medium command */
337char *dialvol3  = NULL;                 /* Volume High command */
338char *dialini2  = NULL;                 /* Second init string */
339
340/* Phone number options */
341
342char *dialnpr = NULL;                   /* DIAL PREFIX, ditto */
343char *diallac = NULL;                   /* DIAL LOCAL-AREA-CODE, ditto */
344char *diallcc = NULL;                   /* DIAL LOCAL-COUNTRY-CODE, ditto */
345char *dialixp = NULL;                   /* DIAL INTL-PREFIX */
346char *dialixs = NULL;                   /* DIAL INTL-SUFFIX */
347char *dialldp = NULL;                   /* DIAL LD-PREFIX */
348char *diallds = NULL;                   /* DIAL LD-SUFFIX */
349char *diallcp = NULL;                   /* DIAL LOCAL-PREFIX */
350char *diallcs = NULL;                   /* DIAL LOCAL-SUFFIX */
351char *dialpxi = NULL;                   /* DIAL PBX-INTERNAL-PREFIX */
352char *dialpxo = NULL;                   /* DIAL PBX-OUTSIDE-PREFIX */
353char *dialsfx = NULL;                   /* DIAL SUFFIX */
354char *dialtfp = NULL;                   /* DIAL TOLL-FREE-PREFIX */
355
356char *callid_date = NULL;               /* Caller ID strings */
357char *callid_time = NULL;
358char *callid_name = NULL;
359char *callid_nmbr = NULL;
360char *callid_mesg = NULL;
361
362extern char * d_name;
363extern char * dialtfc[];                /* DIAL TOLL-FREE-AREA-CODE */
364extern char * dialpxx[];                /* DIAL PBX-EXCHANGE */
365extern int ntollfree;
366extern int ndialpxx;
367
368extern char * dialpucc[];               /* DIAL Pulse countries */
369extern int ndialpucc;
370extern char * dialtocc[];               /* DIAL Tone countries */
371extern int ndialtocc;
372
373char *dialmac   = NULL;                 /* DIAL macro */
374
375/* Countries where pulse dialing must be used (tone is not available) */
376static char * pulsecc[] = { NULL };     /* (Unknown at present) */
377
378/* Countries where tone dialing may safely be the default. */
379/* "+" marks countries where pulse is also allowed. */
380/* Both Pulse and Tone are allowed in Austria & Switzerland but it is not */
381/* yet known if Tone is universally in those countries. */
382static char * tonecc[] = {
383    "1",                                /* + North American Numbering Plan */
384    "31",                               /*   Netherlands */
385    "32",                               /*   Belgium */
386    "33",                               /*   France */
387    "352",                              /*   Luxembourg */
388    "353",                              /*   Ireland */
389    "354",                              /*   Iceland */
390    "358",                              /*   Finland */
391    "39",                               /*   Italy */
392    "44",                               /* + UK */
393    "45",                               /*   Denmark */
394    "46",                               /*   Sweden */
395    "47",                               /*   Norway */
396    "49",                               /* + Germany */
397    NULL
398};
399
400#ifndef MINIDIAL
401/*
402  Telebit model codes:
403
404  ATI  Model Numbers           Examples
405  ---  -------------           --------
406  123                          Telebit in "total Hayes-1200" emulation mode
407  960                          Telebit in Conventional Command (Hayes) mode
408  961  RA12C                   IBM PC internal original Trailblazer
409  962  RA12E                   External original Trailblazer
410  963  RM12C                   Rackmount original Trailblazer
411  964  T18PC                   IBM PC internal Trailblazer-Plus (TB+)
412  965  T18SA, T2SAA, T2SAS     External TB+, T1600, T2000, T3000, WB, and later
413  966  T18RMM                  Rackmount TB+
414  967  T2MC                    IBM PS/2 internal TB+
415  968  T1000                   External T1000
416  969  ?                       Qblazer
417  970                          Qblazer Plus
418  971  T2500                   External T2500
419  972  T2500                   Rackmount T2500
420*/
421
422/* Telebit model codes */
423
424#define TB_UNK  0                       /* Unknown Telebit model */
425#define TB_BLAZ 1                       /* Original TrailBlazer */
426#define TB_PLUS 2                       /* TrailBlazer Plus */
427#define TB_1000 3                       /* T1000 */
428#define TB_1500 4                       /* T1500 */
429#define TB_1600 5                       /* T1600 */
430#define TB_2000 6                       /* T2000 */
431#define TB_2500 7                       /* T2500 */
432#define TB_3000 8                       /* T3000 */
433#define TB_QBLA 9                       /* Qblazer */
434#define TB_WBLA 10                      /* WorldBlazer */
435#define TB__MAX 10                      /* Highest number */
436
437char *tb_name[] = {                     /* Array of model names */
438    "Unknown",                          /* TB_UNK  */
439    "TrailBlazer",                      /* TB_BLAZ */
440    "TrailBlazer-Plus",                 /* TB_PLUS */
441    "T1000",                            /* TB_1000 */
442    "T1500",                            /* TB_1500 */
443    "T1600",                            /* TB_1600 */
444    "T2000",                            /* TB_2000 */
445    "T2500",                            /* TB_2500 */
446    "T3000",                            /* TB_3000 */
447    "Qblazer",                          /* TB_QBLA */
448    "WorldBlazer",                      /* TB_WBLA */
449    ""
450};
451#endif /* MINIDIAL */
452
453extern int flow, local, mdmtyp, quiet, backgrd, parity, seslog, network;
454extern int carrier, duplex, mdmsav, reliable, setreliable;
455extern int ttnproto, nettype;
456extern long speed;
457extern char ttname[], sesfil[];
458#ifndef NOXFER
459extern CHAR stchr;
460extern int interrupted;
461#endif /* NOXFER */
462
463/*  Failure codes  */
464
465#define F_TIME          1               /* timeout */
466#define F_INT           2               /* interrupt */
467#define F_MODEM         3               /* modem-detected failure */
468#define F_MINIT         4               /* cannot initialize modem */
469
470#ifndef CK_TAPI
471static
472#endif /* CK_TAPI */
473#ifdef OS2
474 volatile
475#endif /* OS2 */
476 int fail_code =  0;                    /* Default failure reason. */
477
478static int xredial = 0;
479static int func_code;                   /* 0 = dialing, nonzero = answering */
480static int partial;
481static int mymdmtyp = 0;
482
483#define DW_NOTHING      0               /* What we are doing */
484#define DW_INIT         1
485#define DW_DIAL         2
486
487static int dial_what = DW_NOTHING;      /* Nothing at first. */
488static int nonverbal = 0;               /* Hayes in numeric response mode */
489static MDMINF * mp;
490static CHAR escbuf[6];
491static long mdmcapas;
492
493_PROTOTYP (static VOID dreset, (void) );
494_PROTOTYP (static int (*xx_ok), (int,int) );
495_PROTOTYP (static int ddinc, (int) );
496_PROTOTYP (int dialhup, (void) );
497_PROTOTYP (int getok, (int,int) );
498_PROTOTYP (char * ck_time, (void) );
499_PROTOTYP (static VOID ttslow, (char *, int) );
500#ifdef COMMENT
501_PROTOTYP (static VOID xcpy, (char *, char *, unsigned int) );
502#endif /* COMMENT */
503_PROTOTYP (static VOID waitfor, (char *) );
504_PROTOTYP (static VOID dialoc, (char) );
505_PROTOTYP (static int didweget, (char *, char *) );
506_PROTOTYP (static VOID spdchg, (long) );
507_PROTOTYP (static int dialfail, (int) );
508_PROTOTYP (static VOID gethrw, (void) );
509_PROTOTYP (static VOID gethrn, (void) );
510
511int dialudt = n_UDEF;                   /* Number of user-defined type */
512
513/* BEGIN MDMINF STRUCT DEFINITIONS */
514
515/*
516  Declare structures containing modem-specific information.
517  REMEMBER that only the first SEVEN characters of these names are
518  guaranteed to be unique.
519
520  First declare the three types that are allowed for MINIDIAL versions.
521*/
522static
523MDMINF CCITT =                          /* CCITT / ITU-T V.25bis autodialer */
524/*
525  According to V.25bis:
526  . Even parity is required for giving commands to the modem.
527  . Commands might or might not echo.
528  . Responses ("Indications") from the modem are terminated by CR and LF.
529  . Call setup is accomplished by:
530    - DTE raises DTR (V.24 circuit 108)              [ttopen() does this]
531    - Modem raises CTS (V.24 circuit 106)            [C-Kermit ignores this]
532    - DTE issues a call request command ("CRN")
533    - Modem responds with "VAL" ("command accepted")
534    - If the call is completed:
535        modem responds with "CNX" ("call connected");
536        modem turns CTS (106) OFF;
537        modem turns DSR (107) ON;
538      else:
539        modem responds with "CFI <parameter>" ("call failure indication").
540  . To clear a call, the DTE turns DTR (108) OFF.
541  . There is no mention of the Carrier Detect circuit (109) in the standard.
542  . There is no provision for "escaping back" to the modem's command mode.
543
544  It is not known whether there exists in real life a pure V.25bis modem.
545  If there is, this code has never been tested on it.  See the Digitel entry.
546*/
547    {
548    "Any CCITT / ITU-T V.25bis conformant modem",
549    "",                 /* pulse command */
550    "",                 /* tone command */
551    40,                 /* dial_time -- programmable -- */
552    ",:",               /* pause_chars -- "," waits for programmable time */
553                        /* ":" waits for dial tone */
554    10,                 /* pause_time (seconds, just a guess) */
555    "",                 /* wake_str (none) */
556    200,                /* wake_rate (msec) */
557    "VAL",              /* wake_prompt */
558    "",                 /* dmode_str (none) */
559    "",                 /* dmode_prompt (none) */
560    "CRN%s\015",        /* dial_str */
561    200,                /* dial_rate (msec) */
562    0,                  /* No esc_time */
563    0,                  /* No esc_char  */
564    "",                 /* No 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    "CIC\015",          /* aa_on_str */
573    "DIC\015",          /* aa_off_str */
574    "",                 /* sb_on_str */
575    "",                 /* sb_off_str */
576    "",                 /* sp_off_str */
577    "",                 /* sp_on_str */
578    "",                 /* vol1_str */
579    "",                 /* vol2_str */
580    "",                 /* vol3_str */
581    "",                 /* ignoredt */
582    "",                 /* ini2 */
583    0L,                 /* max_speed */
584    CKD_V25,            /* capas */
585    NULL                /* No ok_fn    */
586};
587
588static
589MDMINF HAYES =                          /* Hayes 2400 and compatible modems */
590    {
591    "Hayes Smartmodem 2400 and compatibles",
592    "ATP\015",                          /* pulse command */
593    "ATT\015",                          /* tone command */
594    35,                                 /* dial_time */
595    ",",                                /* pause_chars */
596    2,                                  /* pause_time */
597#ifdef OS2
598    "ATE1Q0V1&S0&C1&D2\015",            /* wake_str */
599#else
600#ifdef VMS
601    "ATQ0&S1\015",                      /* wake_str */
602#else
603    "ATQ0\015",                         /* wake_str */
604#endif /* VMS */
605#endif /* OS2 */
606    0,                                  /* wake_rate */
607    "OK\015",                           /* wake_prompt */
608    "",                                 /* dmode_str */
609    "",                                 /* dmode_prompt */
610    "ATD%s\015",                        /* dial_str, user supplies D or T */
611    0,                                  /* dial_rate */
612    1100,                               /* esc_time */
613    43,                                 /* esc_char */
614    "ATQ0H0\015",                       /* hup_str */
615    "",                                 /* hwfc_str */
616    "",                                 /* swfc_str */
617    "",                                 /* nofc_str */
618    "",                                 /* ec_on_str */
619    "",                                 /* ec_off_str */
620    "",                                 /* dc_on_str */
621    "",                                 /* dc_off_str */
622    "ATS0=1\015",                       /* aa_on_str */
623    "ATS0=0\015",                       /* aa_off_str */
624    "",                                 /* sb_on_str */
625    "",                                 /* sb_off_str */
626    "ATM1\015",                         /* sp_on_str */
627    "ATM0\015",                         /* sp_off_str */
628    "ATL1\015",                         /* vol1_str */
629    "ATL2\015",                         /* vol2_str */
630    "ATL3\015",                         /* vol3_str */
631    "ATX3\015",                         /* ignoredt */
632    "",                                 /* ini2 */
633    2400L,                              /* max_speed */
634    CKD_AT,                             /* capas */
635    getok                               /* ok_fn */
636};
637
638/*
639  The intent of the "unknown" modem is to allow KERMIT to support
640  unknown modems by having the user type the entire autodial sequence
641  (possibly including control characters, etc.) as the "phone number".
642  The protocol and other characteristics of this modem are unknown, with
643  some "reasonable" values being chosen for some of them.  The only way to
644  detect if a connection is made is to look for carrier.
645*/
646static
647MDMINF UNKNOWN =                        /* Information for "Unknown" modem */
648    {
649    "Unknown",                          /* name */
650    "",                                 /* pulse command */
651    "",                                 /* tone command */
652    30,                                 /* dial_time */
653    "",                                 /* pause_chars */
654    0,                                  /* pause_time */
655    "",                                 /* wake_str */
656    0,                                  /* wake_rate */
657    "",                                 /* wake_prompt */
658    "",                                 /* dmode_str */
659    NULL,                               /* dmode_prompt */
660    "%s\015",                           /* dial_str */
661    0,                                  /* dial_rate */
662    0,                                  /* esc_time */
663    0,                                  /* esc_char */
664    "",                                 /* hup_str */
665    "",                                 /* hwfc_str */
666    "",                                 /* swfc_str */
667    "",                                 /* nofc_str */
668    "",                                 /* ec_on_str */
669    "",                                 /* ec_off_str */
670    "",                                 /* dc_on_str */
671    "",                                 /* dc_off_str */
672    "",                                 /* aa_on_str */
673    "",                                 /* aa_off_str */
674    "",                                 /* sb_on_str */
675    "",                                 /* sb_off_str */
676    "",                                 /* sp_off_str */
677    "",                                 /* sp_on_str */
678    "",                                 /* vol1_str */
679    "",                                 /* vol2_str */
680    "",                                 /* vol3_str */
681    "",                                 /* ignoredt */
682    "",                                 /* ini2 */
683    0L,                                 /* max_speed */
684    0,                                  /* capas */
685    NULL                                /* ok_fn */
686};
687
688#ifndef MINIDIAL
689static
690MDMINF ATTISN =                         /* AT&T ISN Network */
691    {
692    "",                                 /* pulse command */
693    "",                                 /* tone command */
694    "AT&T ISN Network",
695    30,                                 /* Dial time */
696    "",                                 /* Pause characters */
697    0,                                  /* Pause time */
698    "\015\015\015\015",                 /* Wake string */
699    900,                                /* Wake rate */
700    "DIAL",                             /* Wake prompt */
701    "",                                 /* dmode_str */
702    "",                                 /* dmode_prompt */
703    "%s\015",                           /* dial_str */
704    0,                                  /* dial_rate */
705    0,                                  /* esc_time */
706    0,                                  /* esc_char */
707    "",                                 /* hup_str */
708    "",                                 /* hwfc_str */
709    "",                                 /* swfc_str */
710    "",                                 /* nofc_str */
711    "",                                 /* ec_on_str */
712    "",                                 /* ec_off_str */
713    "",                                 /* dc_on_str */
714    "",                                 /* dc_off_str */
715    "",                                 /* aa_on_str */
716    "",                                 /* aa_off_str */
717    "",                                 /* sb_on_str */
718    "",                                 /* sb_off_str */
719    "",                                 /* sp_off_str */
720    "",                                 /* sp_on_str */
721    "",                                 /* vol1_str */
722    "",                                 /* vol2_str */
723    "",                                 /* vol3_str */
724    "",                                 /* ignoredt */
725    "",                                 /* ini2 */
726    0L,                                 /* max_speed */
727    0,                                  /* capas */
728    NULL                                /* ok_fn */
729};
730
731static
732MDMINF ATTMODEM =       /* information for AT&T switched-network modems */
733                        /* "Number" following "dial" can include: p's and
734                         * t's to indicate pulse or tone (default) dialing,
735                         * + for wait for dial tone, , for pause, r for
736                         * last number dialed, and, except for 2224B, some
737                         * comma-delimited options like o12=y, before number.
738
739 * "Important" options for the modems:
740 *
741 *      All:            Except for 2224B, enable option 12 for "transparent
742 *                      data," o12=y.  If a computer port used for both
743 *                      incoming and outgoing calls is connected to the
744 *                      modem, disable "enter interactive mode on carriage
745 *                      return," EICR.  The Kermit "dial" command can
746 *                      function with EIA leads standard, EIAS.
747 *
748 *      2212C:          Internal hardware switches at their default
749 *                      positions (four rockers down away from numbers)
750 *                      unless EICR is not wanted (rocker down at the 4).
751 *                      For EIAS, rocker down at the 1.
752 *
753 *      2224B:          Front-panel switch position 1 must be up (at the 1,
754 *                      closed).  Disable EICR with position 2 down.
755 *                      For EIAS, position 4 down.
756 *                      All switches on the back panel down.
757 *
758 *      2224CEO:        All front-panel switches down except either 5 or 6.
759 *                      Enable interactive flow control with o16=y.
760 *                      Select normal asynchronous mode with o34=0 (zero).
761 *                      Disable EICR with position 3 up.  For EIAS, 1 up.
762 *                      Reset the modem after changing switches.
763 *
764 *      2296A:          If option 00 (zeros) is present, use o00=0.
765 *                      Enable interactive flow control with o16=y.
766 *                      Select normal asynchronous mode with o34=0 (zero).
767 *                      (available in Microcom Networking version, but
768 *                      not necessarily other models of the 2296A).
769 *                      Enable modem-port flow control (if available) with
770 *                      o42=y.  Enable asynchronous operation with o50=y.
771 *                      Disable EICR with o69=n.  For EIAS, o66=n, using
772 *                      front panel.
773 */
774    {
775   "AT&T switched-network modems",
776    "",                                 /* pulse command */
777    "",                                 /* tone command */
778    20,                                 /* dial_time */
779    ",",                                /* pause_chars */
780    2,                                  /* pause_time */
781    "+",                                /* wake_str */
782    0,                                  /* wake_rate */
783    "",                                 /* wake_prompt */
784    "",                                 /* dmode_str */
785    "",                                 /* dmode_prompt */
786    "at%s\015",                         /* dial_str */
787    0,                                  /* dial_rate */
788    0,                                  /* esc_time */
789    0,                                  /* esc_char */
790    "",                                 /* hup_str */
791    "",                                 /* hwfc_str */
792    "",                                 /* swfc_str */
793    "",                                 /* nofc_str */
794    "",                                 /* ec_on_str */
795    "",                                 /* ec_off_str */
796    "",                                 /* dc_on_str */
797    "",                                 /* dc_off_str */
798    "",                                 /* aa_on_str */
799    "",                                 /* aa_off_str */
800    "",                                 /* sb_on_str */
801    "",                                 /* sb_off_str */
802    "",                                 /* sp_off_str */
803    "",                                 /* sp_on_str */
804    "",                                 /* vol1_str */
805    "",                                 /* vol2_str */
806    "",                                 /* vol3_str */
807    "",                                 /* ignoredt */
808    "",                                 /* ini2 */
809    0L,                                 /* max_speed */
810    CKD_AT,                             /* capas */
811    NULL                                /* ok_fn */
812};
813
814static
815MDMINF ATTDTDM = /* AT&T Digital Terminal Data Module  */
816                 /* For dialing: KYBD switch down, others usually up. */
817    {
818    "AT&T Digital Terminal Data Module",
819    "",                                 /* pulse command */
820    "",                                 /* tone command */
821    20,                                 /* dial_time */
822    "",                                 /* pause_chars */
823    0,                                  /* pause_time */
824    "",                                 /* wake_str */
825    0,                                  /* wake_rate */
826    "",                                 /* wake_prompt */
827    "",                                 /* dmode_str */
828    "",                                 /* dmode_prompt */
829    "%s\015",                           /* dial_str */
830    0,                                  /* dial_rate */
831    0,                                  /* esc_time */
832    0,                                  /* esc_char */
833    "",                                 /* 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    "",                                 /* aa_on_str */
842    "",                                 /* aa_off_str */
843    "",                                 /* sb_on_str */
844    "",                                 /* sb_off_str */
845    "",                                 /* sp_off_str */
846    "",                                 /* sp_on_str */
847    "",                                 /* vol1_str */
848    "",                                 /* vol2_str */
849    "",                                 /* vol3_str */
850    "",                                 /* ignoredt */
851    "",                                 /* ini2 */
852    0L,                                 /* max_speed */
853    0,                                  /* capas */
854    NULL                                /* ok_fn */
855};
856
857static
858MDMINF DIGITEL =        /* Digitel DT-22 CCITT variant used in Brazil */
859/*
860  Attempts to adhere strictly to the V.25bis specification do not produce good
861  results in real life.  The modem for which this code was developed: (a)
862  ignores parity; (b) sometimes terminates responses with LF CR instead of CR
863  LF; (c) has a Hayes-like escape sequence; (d) supports a hangup ("HUP")
864  command.  Information from Fernando Cabral in Brasilia.
865*/
866    {
867    "Digitel DT-22 CCITT dialer",
868    "",                         /* pulse command */
869    "",                         /* tone command */
870    40,                         /* dial_time -- programmable -- */
871    ",:",               /* pause_chars -- "," waits for programmable time */
872                        /* ":" waits for dial tone */
873    10,                 /* pause_time (seconds, just a guess) */
874    "HUP\015",          /* wake_str (Not Standard CCITT) */
875    200,                /* wake_rate (msec) */
876    "VAL",              /* wake_prompt */
877    "",                 /* dmode_str (none) */
878    "",                 /* dmode_prompt (none) */
879    "CRN%s\015",        /* dial_str */
880    200,                /* dial_rate (msec) */
881    1100,               /* esc_time (Not Standard CCITT) */
882    43,                 /* esc_char  (Not Standard CCITT) */
883    "HUP\015",          /* hup_str  (Not Standard CCITT) */
884    "",                                 /* hwfc_str */
885    "",                                 /* swfc_str */
886    "",                                 /* nofc_str */
887    "",                                 /* ec_on_str */
888    "",                                 /* ec_off_str */
889    "",                                 /* dc_on_str */
890    "",                                 /* dc_off_str */
891    "CIC\015",                          /* aa_on_str */
892    "DIC\015",                          /* aa_off_str */
893    "",                                 /* sb_on_str */
894    "",                                 /* sb_off_str */
895    "",                                 /* sp_off_str */
896    "",                                 /* sp_on_str */
897    "",                                 /* vol1_str */
898    "",                                 /* vol2_str */
899    "",                                 /* vol3_str */
900    "",                                 /* ignoredt */
901    "",                                 /* ini2 */
902    0L,                                 /* max_speed */
903    CKD_V25,                            /* capas */
904    getok                               /* ok_fn */
905};
906
907static
908MDMINF H_1200 =         /* Hayes 1200 and compatible modems */
909    {
910    "Hayes Smartmodem 1200 and compatibles",
911    "ATP\015",                          /* pulse command */
912    "ATT\015",                          /* tone command */
913    35,                                 /* dial_time */
914    ",",                                /* pause_chars */
915    2,                                  /* pause_time */
916#ifdef OS2
917    "ATE1Q0V1\015",                     /* wake_str */
918#else
919    "ATQ0\015",                         /* wake_str */
920#endif /* OS2 */
921    0,                                  /* wake_rate */
922    "OK\015",                           /* wake_prompt */
923    "",                                 /* dmode_str */
924    "",                                 /* dmode_prompt */
925    "ATD%s\015",                        /* dial_str */
926    0,                                  /* dial_rate */
927    1100,                               /* esc_time */
928    43,                                 /* esc_char */
929    "ATQ0H0\015",                       /* hup_str */
930    "",                                 /* hwfc_str */
931    "",                                 /* swfc_str */
932    "",                                 /* nofc_str */
933    "",                                 /* ec_on_str */
934    "",                                 /* ec_off_str */
935    "",                                 /* dc_on_str */
936    "",                                 /* dc_off_str */
937    "ATS0=1\015",                       /* aa_on_str */
938    "ATS0=0\015",                       /* aa_off_str */
939    "",                                 /* sb_on_str */
940    "",                                 /* sb_off_str */
941    "ATM1\015",                         /* sp_on_str */
942    "ATM0\015",                         /* sp_off_str */
943    "ATL1\015",                         /* vol1_str */
944    "ATL2\015",                         /* vol2_str */
945    "ATL3\015",                         /* vol3_str */
946    "",                                 /* ignoredt */
947    "",                                 /* ini2 */
948    1200L,                              /* max_speed */
949    CKD_AT,                             /* capas */
950    getok                               /* ok_fn */
951};
952
953static
954MDMINF H_ULTRA =                        /* Hayes high-speed */
955    {
956    "Hayes Ultra/Optima/Accura 96/144/288", /* U,O,A */
957    "ATP\015",                          /* pulse command */
958    "ATT\015",                          /* tone command */
959    35,                                 /* dial_time */
960    ",",                                /* pause_chars */
961    2,                                  /* pause_time */
962#ifdef OS2
963    "ATE1Q0V1X4N1Y0&S0&C1&D2S37=0S82=128\015", /* wake_str */
964#else
965#ifdef VMS
966    "ATQ0X4N1Y0&S1S37=0S82=128\015",    /* wake_str */
967#else
968    "ATQ0X4N1Y0S37=0S82=128\015",       /* wake_str */
969#endif /* VMS */
970#endif /* OS2 */
971    0,                                  /* wake_rate */
972    "OK\015",                           /* wake_prompt */
973    "",                                 /* dmode_str */
974    "",                                 /* dmode_prompt */
975    "ATD%s\015",                        /* dial_str */
976    0,                                  /* dial_rate */
977    1100,                               /* esc_time */
978    43,                                 /* esc_char */
979    "ATQ0H0\015",                       /* hup_str */
980    "AT&K3\015",                        /* hwfc_str */   /* OK for U,O */
981    "AT&K4\015",                        /* swfc_str */   /* OK for U,O */
982    "AT&K0\015",                        /* nofc_str */   /* OK for U,O */
983    "AT&Q5S36=7S48=7\015",              /* ec_on_str */  /* OK for U,O */
984    "AT&Q0\015",                        /* ec_off_str */ /* OK for U,O */
985    "ATS46=2\015",                      /* dc_on_str */
986    "ATS46=0\015",                      /* dc_off_str */
987    "ATS0=1\015",                       /* aa_on_str */
988    "ATS0=0\015",                       /* aa_off_str */
989    "",                                 /* sb_on_str */
990    "",                                 /* sb_off_str */
991    "ATM1\015",                         /* sp_on_str */
992    "ATM0\015",                         /* sp_off_str */
993    "ATL1\015",                         /* vol1_str */
994    "ATL2\015",                         /* vol2_str */
995    "ATL3\015",                         /* vol3_str */
996    "ATX3\015",                         /* ignoredt */
997    "",                                 /* ini2 */
998    115200L,                            /* max_speed */  /* (varies) */
999    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1000    getok                               /* ok_fn */
1001};
1002
1003static
1004MDMINF H_ACCURA =                       /* Hayes Accura */
1005    {                                   /* GUESSING IT'S LIKE ULTRA & OPTIMA */
1006    "Hayes Accura",
1007    "ATP\015",                          /* pulse command */
1008    "ATT\015",                          /* tone command */
1009    35,                                 /* dial_time */
1010    ",",                                /* pause_chars */
1011    2,                                  /* pause_time */
1012#ifdef OS2
1013    "ATE1Q0V1X4N1Y0&S0&C1&D2S37=0\015", /* wake_str */
1014#else
1015#ifdef VMS
1016    "ATQ0X4N1Y0&S1S37=0\015",           /* wake_str */
1017#else
1018    "ATQ0X4N1Y0S37=0\015",              /* wake_str */
1019#endif /* VMS */
1020#endif /* OS2 */
1021    0,                                  /* wake_rate */
1022    "OK\015",                           /* wake_prompt */
1023    "",                                 /* dmode_str */
1024    "",                                 /* dmode_prompt */
1025    "ATD%s\015",                        /* dial_str */
1026    0,                                  /* dial_rate */
1027    1100,                               /* esc_time */
1028    43,                                 /* esc_char */
1029    "ATQ0H0\015",                       /* hup_str */
1030    "AT&K3\015",                        /* hwfc_str */
1031    "AT&K4\015",                        /* swfc_str */
1032    "AT&K0\015",                        /* nofc_str */
1033    "AT&Q5S36=7S48=7\015",              /* ec_on_str */
1034    "AT&Q0\015",                        /* ec_off_str */
1035    "ATS46=2\015",                      /* dc_on_str */
1036    "ATS46=0\015",                      /* dc_off_str */
1037    "ATS0=1\015",                       /* aa_on_str */
1038    "ATS0=0\015",                       /* aa_off_str */
1039    "",                                 /* sb_on_str */
1040    "",                                 /* sb_off_str */
1041    "ATM1\015",                         /* sp_on_str */
1042    "ATM0\015",                         /* sp_off_str */
1043    "ATL1\015",                         /* vol1_str */
1044    "ATL2\015",                         /* vol2_str */
1045    "ATL3\015",                         /* vol3_str */
1046    "ATX3\015",                         /* ignoredt */
1047    "",                                 /* ini2 */
1048    115200L,                            /* max_speed */  /* (varies) */
1049    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1050    getok                               /* ok_fn */
1051};
1052
1053static
1054MDMINF PPI =                            /* Practical Peripherals  */
1055    {
1056    "Practical Peripherals V.22bis or higher with V.42 and V.42bis",
1057    "ATP\015",                          /* pulse command */
1058    "ATT\015",                          /* tone command */
1059    35,                                 /* dial_time */
1060    ",",                                /* pause_chars */
1061    2,                                  /* pause_time */
1062#ifdef COMMENT
1063/* In newer models S82 (BREAK handling) was eliminated, causing an error. */
1064#ifdef OS2
1065    "ATQ0X4N1&S0&C1&D2S37=0S82=128\015", /* wake_str */
1066#else
1067    "ATQ0X4N1S37=0S82=128\015",         /* wake_str */
1068#endif /* OS2 */
1069#else /* So now we use Y0 instead */
1070#ifdef OS2
1071    "ATE1Q0V1X4N1&S0&C1&D2Y0S37=0\015", /* wake_str */
1072#else
1073#ifdef VMS
1074    "ATQ0X4N1Y0&S1S37=0\015",           /* wake_str */
1075#else
1076    "ATQ0X4N1Y0S37=0\015",              /* wake_str */
1077#endif /* VMS */
1078#endif /* OS2 */
1079#endif /* COMMENT */
1080    0,                                  /* wake_rate */
1081    "OK\015",                           /* wake_prompt */
1082    "",                                 /* dmode_str */
1083    "",                                 /* dmode_prompt */
1084    "ATD%s\015",                        /* dial_str */
1085    0,                                  /* dial_rate */
1086    1100,                               /* esc_time */
1087    43,                                 /* esc_char */
1088    "ATQ0H0\015",                       /* hup_str */
1089    "AT&K3\015",                        /* hwfc_str */
1090    "AT&K4\015",                        /* swfc_str */
1091    "AT&K0\015",                        /* nofc_str */
1092    "AT&Q5S36=7S48=7\015",              /* ec_on_str */
1093    "AT&Q0S36=0S48=128\015",            /* ec_off_str */
1094    "ATS46=2\015",                      /* dc_on_str */
1095    "ATS46=0\015",                      /* dc_off_str */
1096    "ATS0=1\015",                       /* aa_on_str */
1097    "ATS0=0\015",                       /* aa_off_str */
1098    "",                                 /* sb_on_str  */
1099    "",                                 /* sb_off_str  */
1100    "ATM1\015",                         /* sp_on_str */
1101    "ATM0\015",                         /* sp_off_str */
1102    "ATL1\015",                         /* vol1_str */
1103    "ATL2\015",                         /* vol2_str */
1104    "ATL3\015",                         /* vol3_str */
1105    "ATX3\015",                         /* ignoredt */
1106    "",                                 /* ini2 */
1107    115200L,                            /* max_speed */
1108    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1109    getok                               /* ok_fn */
1110};
1111
1112static
1113MDMINF DATAPORT =                       /* AT&T Dataport  */
1114    {
1115    "AT&T / Paradyne DataPort V.32 or higher",
1116    "ATP\015",                          /* pulse command */
1117    "ATT\015",                          /* tone command */
1118    35,                                 /* dial_time */
1119    ",",                                /* pause_chars */
1120    2,                                  /* pause_time */
1121    /*
1122       Note: S41=0 (use highest modulation) omitted, since it is not
1123       supported on the V.32 and lower models.  So let's not touch it.
1124    */
1125#ifdef OS2
1126    "ATQ0E1V1X6&S0&C1&D2&Q0Y0\\K5S78=0\015", /* wake_str */
1127#else
1128#ifdef VMS
1129    "ATQ0E1X6&S1&Q0Y0\\K5S78=0\015",    /* wake_str */
1130#else
1131    "ATQ0E1X6&Q0Y0\\K5S78=0\015",               /* wake_str */
1132#endif /* VMS */
1133#endif /* OS2 */
1134    0,                                  /* wake_rate */
1135    "OK\015",                           /* wake_prompt */
1136    "",                                 /* dmode_str */
1137    "",                                 /* dmode_prompt */
1138    "ATD%s\015",                        /* dial_str */
1139    0,                                  /* dial_rate */
1140    1100,                               /* esc_time */
1141    43,                                 /* esc_char */
1142    "ATQ0H0\015",                       /* hup_str */
1143    "AT\\Q3\015",                       /* hwfc_str */
1144    "AT\\Q1\\X0\015",                   /* swfc_str */
1145    "AT\\Q0\015",                       /* nofc_str */
1146    "AT\\N7\015",                       /* ec_on_str */
1147    "AT\\N0\015",                       /* ec_off_str */
1148    "AT%C1\015",                        /* dc_on_str */
1149    "AT%C0\015",                        /* dc_off_str */
1150    "ATS0=1\015",                       /* aa_on_str */
1151    "ATS0=0\015",                       /* aa_off_str */
1152    "",                                 /* sb_on_str */
1153    "",                                 /* sb_off_str */
1154    "ATM1\015",                         /* sp_on_str */
1155    "ATM0\015",                         /* sp_off_str */
1156    "ATL1\015",                         /* vol1_str */
1157    "ATL2\015",                         /* vol2_str */
1158    "ATL3\015",                         /* vol3_str */
1159    "ATX3\015",                         /* ignoredt */
1160    "",                                 /* ini2 */
1161    57600L,                             /* max_speed */
1162    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1163    getok                               /* ok_fn */
1164};
1165
1166static
1167MDMINF UCOM_AT =                        /* Microcom DeskPorte FAST ES 28.8 */
1168    {
1169    "Microcom DeskPorte FAST 28.8",
1170    "ATP\015",                          /* pulse command */
1171    "ATT\015",                          /* tone command */
1172    35,                                 /* dial_time */
1173    ",",                                /* pause_chars */
1174    2,                                  /* pause_time */
1175#ifdef OS2
1176    "ATE1Q0V1X4\\N0F0&S0&C1&D2\\K5\015", /* wake_str */
1177#else
1178#ifdef VMS
1179    "ATQ0X4F0&S1\\K5\015",              /* wake_str */
1180#else
1181    "ATQ0X4F0\\K5\015",                 /* wake_str */
1182#endif /* VMS */
1183#endif /* OS2 */
1184    0,                                  /* wake_rate */
1185    "OK\015",                           /* wake_prompt */
1186    "",                                 /* dmode_str */
1187    "",                                 /* dmode_prompt */
1188    "ATD%s\015",                        /* dial_str */
1189    0,                                  /* dial_rate */
1190    1100,                               /* esc_time */
1191    43,                                 /* esc_char */
1192    "ATQ0H0\015",                       /* hup_str */
1193    "AT\\Q3\015",                       /* hwfc_str */
1194    "AT\\Q1\015",                       /* swfc_str */
1195    "AT\\H0\\Q0\015",                   /* nofc_str */
1196    "AT\\N3\015",                       /* ec_on_str */
1197    "AT\\N0\015",                       /* ec_off_str */
1198    "AT%C3\015",                        /* dc_on_str */
1199    "AT%C0\015",                        /* dc_off_str */
1200    "ATS0=1\015",                       /* aa_on_str */
1201    "ATS0=0\015",                       /* aa_off_str */
1202    "AT-J0\015",                        /* sb_on_str */
1203    "AT-J1\015",                        /* sb_off_str */
1204    "ATM1\015",                         /* sp_on_str */
1205    "ATM0\015",                         /* sp_off_str */
1206    "ATL1\015",                         /* vol1_str */
1207    "ATL2\015",                         /* vol2_str */
1208    "ATL3\015",                         /* vol3_str */
1209    "ATX3\015",                         /* ignoredt */
1210    "",                                 /* ini2 */
1211    115200L,                            /* max_speed */
1212    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1213    getok                               /* ok_fn */
1214};
1215
1216static
1217MDMINF ZOOM =                           /* Zoom Telephonics V.32bis  */
1218    {
1219    "Zoom Telephonics V.32bis",
1220    "ATP\015",                          /* pulse command */
1221    "ATT\015",                          /* tone command */
1222    35,                                 /* dial_time */
1223    ",",                                /* pause_chars */
1224    2,                                  /* pause_time */
1225#ifdef OS2
1226    "ATE1Q0V1N1W1X4&S0&C1&D2S82=128S95=47\015", /* wake_str */
1227#else
1228#ifdef VMS
1229    "ATQ0E1N1W1X4&S1S82=128S95=47\015", /* wake_str */
1230#else
1231    "ATQ0E1N1W1X4S82=128S95=47\015",    /* wake_str */
1232#endif /* VMS */
1233#endif /* OS2 */
1234    0,                                  /* wake_rate */
1235    "OK\015",                           /* wake_prompt */
1236    "",                                 /* dmode_str */
1237    "",                                 /* dmode_prompt */
1238    "ATD%s\015",                        /* dial_str */
1239    0,                                  /* dial_rate */
1240    1100,                               /* esc_time */
1241    43,                                 /* esc_char */
1242    "ATQ0H0\015",                       /* hup_str */
1243    "AT&K3\015",                        /* hwfc_str */
1244    "AT&K4\015",                        /* swfc_str */
1245    "AT&K0\015",                        /* nofc_str */
1246    "AT&Q5S36=7S48=7\015",              /* ec_on_str */
1247    "AT&Q0\015",                        /* ec_off_str */
1248    "ATS46=138\015",                    /* dc_on_str */
1249    "ATS46=136\015",                    /* dc_off_str */
1250    "ATS0=1\015",                       /* aa_on_str */
1251    "ATS0=0\015",                       /* aa_off_str */
1252    "",                                 /* sb_on_str */
1253    "",                                 /* sb_off_str */
1254    "ATM1\015",                         /* sp_on_str */
1255    "ATM0\015",                         /* sp_off_str */
1256    "ATL1\015",                         /* vol1_str */
1257    "ATL2\015",                         /* vol2_str */
1258    "ATL3\015",                         /* vol3_str */
1259    "ATX3\015",                         /* ignoredt */
1260    "",                                 /* ini2 */
1261    57600L,                             /* max_speed */
1262    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1263    getok                               /* ok_fn */
1264};
1265
1266static
1267MDMINF ZYXEL =                          /* ZyXEL U-Series */
1268    {
1269    "ZyXEL U-Series V.32bis or higher",
1270    "ATP\015",                          /* pulse command */
1271    "ATT\015",                          /* tone command */
1272    35,                                 /* dial_time */
1273    ",",                                /* pause_chars */
1274    2,                                  /* pause_time */
1275#ifdef OS2
1276    "ATE1Q0V1&S0&C1&D2&N0X5&Y1\015",    /* wake_str */
1277#else
1278#ifdef VMS
1279    "ATQ0E1&S1&N0X5&Y1\015",            /* wake_str */
1280#else
1281    "ATQ0E1&N0X5&Y1\015",               /* wake_str */
1282#endif /* VMS */
1283#endif /* OS2 */
1284    0,                                  /* wake_rate */
1285    "OK\015",                           /* wake_prompt */
1286    "",                                 /* dmode_str */
1287    "",                                 /* dmode_prompt */
1288    "ATD%s\015",                        /* dial_str */
1289    0,                                  /* dial_rate */
1290    1100,                               /* esc_time */
1291    43,                                 /* esc_char */
1292    "ATQ0H0\015",                       /* hup_str */
1293    "AT&H3\015",                        /* hwfc_str */
1294    "AT&H4\015",                        /* swfc_str */
1295    "AT&H0\015",                        /* nofc_str */
1296    "AT&K3\015",                        /* ec_on_str */
1297    "AT&K0\015",                        /* ec_off_str */
1298    "AT&K4\015",                        /* dc_on_str */
1299    "AT&K3\015",                        /* dc_off_str */
1300    "ATS0=1\015",                       /* aa_on_str */
1301    "ATS0=0\015",                       /* aa_off_str */
1302    "",                                 /* sb_on_str */
1303    "",                                 /* sb_off_str */
1304    "ATM1\015",                         /* sp_on_str */
1305    "ATM0\015",                         /* sp_off_str */
1306    "ATL1\015",                         /* vol1_str */
1307    "ATL2\015",                         /* vol2_str */
1308    "ATL3\015",                         /* vol3_str */
1309    "ATX3\015",                         /* ignoredt */
1310    "",                                 /* ini2 */
1311    57600L,                             /* max_speed */
1312    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1313    getok                               /* ok_fn */
1314};
1315
1316static
1317MDMINF ZOLTRIX =                        /* Zoltrix */
1318    {
1319    "Zoltrix V.32bis and V.34 modems with Rockwell ACI chipset",
1320    "ATP\015",                          /* pulse command */
1321    "ATT\015",                          /* tone command */
1322    35,                                 /* dial_time */
1323    ",",                                /* pause_chars */
1324    2,                                  /* pause_time */
1325#ifdef OS2
1326   "ATE1Q0V1F0W1X4Y0&S0&C1&D2\\K5S82=128S95=41\015", /* wake_str */
1327#else
1328#ifdef VMS
1329   "ATQ0E1F0W1X4Y0&S1\\K5S82=128S95=41\015", /* wake_str */
1330#else
1331   "ATQ0E1F0W1X4Y0\\K5S82=128S95=41\015", /* wake_str */
1332#endif /* VMS */
1333#endif /* OS2 */
1334    0,                                  /* wake_rate */
1335    "OK\015",                           /* wake_prompt */
1336    "",                                 /* dmode_str */
1337    "",                                 /* dmode_prompt */
1338    "ATD%s\015",                        /* dial_str */
1339    0,                                  /* dial_rate */
1340    1100,                               /* esc_time */
1341    43,                                 /* esc_char */
1342    "ATQ0H0\015",                       /* hup_str */
1343    "AT&K3\015",                        /* hwfc_str */
1344    "AT&K4S32=17S33=19\015",            /* swfc_str */
1345    "AT&K0\015",                        /* nofc_str */
1346    "AT\\N3\015",                       /* ec_on_str */
1347    "AT\\N1\015",                       /* ec_off_str */
1348    "ATS46=138%C3\015",                 /* dc_on_str */
1349    "ATS46=136%C0\015",                 /* dc_off_str */
1350    "ATS0=1\015",                       /* aa_on_str */
1351    "ATS0=0\015",                       /* aa_off_str */
1352    "AT\\N0\015",                       /* sb_on_str */
1353    "AT&Q0\015",                        /* sb_off_str */
1354    "ATM1\015",                         /* sp_on_str */
1355    "ATM0\015",                         /* sp_off_str */
1356    "ATL1\015",                         /* vol1_str */
1357    "ATL2\015",                         /* vol2_str */
1358    "ATL3\015",                         /* vol3_str */
1359    "ATX3\015",                         /* ignoredt */
1360    "",                                 /* ini2 */
1361    57600L,                             /* max_speed */
1362    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1363    getok                               /* ok_fn */
1364};
1365
1366static
1367MDMINF MOTOROLA = {                     /* Motorola FasTalk II or Lifestyle */
1368/*
1369  "\E" and "\X" commands removed - Motorola Lifestyle doesn't have them.
1370     \E0 = Don't echo while online
1371     \X0 = Process Xon/Xoff but don't pass through
1372*/
1373    "Motorola FasTalk II or Lifestyle", /* Name */
1374    "ATP\015",                          /* pulse command */
1375    "ATT\015",                          /* tone command */
1376    35,                                 /* dial_time */
1377    ",",                                /* pause_chars */
1378    2,                                  /* pause_time */
1379#ifdef OS2
1380    "ATE1Q0V1X4&S0&C1&D2\\K5\\V1\015",  /* wake_str */
1381#else
1382#ifdef VMS
1383    "ATQ0E1X4&S1\\K5\\V1\015",          /* wake_str */
1384#else
1385    "ATQ0E1X4\\K5\\V1\015",             /* wake_str */
1386#endif /* VMS */
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\015",                       /* swfc_str */
1399    "AT\\Q0\015",                       /* nofc_str */
1400    "AT\\N6\015",                       /* ec_on_str */
1401    "AT\\N1\015",                       /* ec_off_str */
1402    "AT%C1\015",                        /* dc_on_str */
1403    "AT%C0\015",                        /* dc_off_str */
1404    "ATS0=1\015",                       /* aa_on_str */
1405    "ATS0=0\015",                       /* aa_off_str */
1406    "AT\\J0\015",                       /* sb_on_str */
1407    "AT\\J1\015",                       /* sb_off_str */
1408    "ATM1\015",                         /* sp_on_str */
1409    "ATM0\015",                         /* sp_off_str */
1410    "ATL1\015",                         /* vol1_str */
1411    "ATL2\015",                         /* vol2_str */
1412    "ATL3\015",                         /* vol3_str */
1413    "ATX3\015",                         /* ignoredt */
1414    "",                                 /* ini2 */
1415    57600L,                             /* max_speed */
1416    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1417    getok                               /* ok_fn */
1418};
1419
1420static
1421MDMINF BOCA =                           /* Boca */
1422    {
1423    "BOCA 14.4 Faxmodem",
1424    "ATP\015",                          /* pulse command */
1425    "ATT\015",                          /* tone command */
1426    35,                                 /* dial_time */
1427    ",",                                /* pause_chars */
1428    2,                                  /* pause_time */
1429#ifdef OS2
1430    "ATE1Q0V1F1N1W1&S0&C1&D2\\K5S37=11S82=128S95=47X4\015", /* wake_str */
1431#else
1432#ifdef VMS
1433    "ATQ0E1F1N1W1&S1\\K5S37=11S82=128S95=47X4\015", /* wake_str */
1434#else
1435    "ATQ0E1F1N1W1\\K5S37=11S82=128S95=47X4\015", /* wake_str */
1436#endif /* VMS */
1437#endif /* OS2 */
1438    0,                                  /* wake_rate */
1439    "OK\015",                           /* wake_prompt */
1440    "",                                 /* dmode_str */
1441    "",                                 /* dmode_prompt */
1442    "ATD%s\015",                        /* dial_str */
1443    0,                                  /* dial_rate */
1444    1100,                               /* esc_time */
1445    43,                                 /* esc_char */
1446    "ATQ0H0\015",                       /* hup_str */
1447    "AT&K3\015",                        /* hwfc_str */
1448    "AT&K4\015",                        /* swfc_str */
1449    "AT&K0\015",                        /* nofc_str */
1450    "AT\\N3S36=7S48=7\015",             /* ec_on_str */
1451    "AT\\N1\015",                       /* ec_off_str */
1452    "ATS46=138\015",                    /* dc_on_str */
1453    "ATS46=136\015",                    /* dc_off_str */
1454    "ATS0=1\015",                       /* aa_on_str */
1455    "ATS0=0\015",                       /* aa_off_str */
1456    "",                                 /* sb_on_str */
1457    "",                                 /* sb_off_str */
1458    "ATM1\015",                         /* sp_on_str */
1459    "ATM0\015",                         /* sp_off_str */
1460    "ATL1\015",                         /* vol1_str */
1461    "ATL2\015",                         /* vol2_str */
1462    "ATL3\015",                         /* vol3_str */
1463    "ATX3\015",                         /* ignoredt */
1464    "",                                 /* ini2 */
1465    57600L,                             /* max_speed */
1466    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1467    getok                               /* ok_fn */
1468};
1469
1470static
1471MDMINF INTEL =                          /* Intel */
1472    {
1473    "Intel High-Speed Faxmodem",
1474    "ATP\015",                          /* pulse command */
1475    "ATT\015",                          /* tone command */
1476    35,                                 /* dial_time */
1477    ",",                                /* pause_chars */
1478    2,                                  /* pause_time */
1479#ifdef OS2
1480    "ATE1Q0V1Y0X4&S0&C1&D2\\K1\\V2S25=50\015", /* wake_str */
1481#else
1482#ifdef VMS
1483    "ATQ0E1Y0X4&S1\\K1\\V2S25=50\015",  /* wake_str */
1484#else
1485    "ATQ0E1Y0X4\\K1\\V2S25=50\015",     /* wake_str */
1486#endif /* VMS */
1487#endif /* OS2 */
1488    0,                                  /* wake_rate */
1489    "OK\015",                           /* wake_prompt */
1490    "ATB1+FCLASS=0\015",                /* dmode_str */
1491    "OK\015",                           /* dmode_prompt */
1492    "ATD%s\015",                        /* dial_str */
1493    0,                                  /* dial_rate */
1494    1100,                               /* esc_time */
1495    43,                                 /* esc_char */
1496    "ATQ0H0\015",                       /* hup_str */
1497    "AT\\G1\\Q3\015",                   /* hwfc_str */
1498    "AT\\G1\\Q1\\X0\015",               /* swfc_str */
1499    "AT\\G0\015",                       /* nofc_str */
1500    "AT\\J0\\N3\"H3\015",               /* ec_on_str */
1501    "AT\\N1\015",                       /* ec_off_str */
1502    "AT%C1\015",                        /* dc_on_str */
1503    "AT%C0\015",                        /* dc_off_str */
1504    "ATS0=1\015",                       /* aa_on_str */
1505    "ATS0=0\015",                       /* aa_off_str */
1506    "",                                 /* sb_on_str */
1507    "",                                 /* sb_off_str */
1508    "ATM1\015",                         /* sp_on_str */
1509    "ATM0\015",                         /* sp_off_str */
1510    "ATL1\015",                         /* vol1_str */
1511    "ATL2\015",                         /* vol2_str */
1512    "ATL3\015",                         /* vol3_str */
1513    "ATX3\015",                         /* ignoredt */
1514    "",                                 /* ini2 */
1515    57600L,                             /* max_speed */
1516    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1517    getok                               /* ok_fn */
1518};
1519
1520static
1521MDMINF MULTITECH =                      /* Multitech */
1522    {
1523    "Multitech MT1432 or MT2834 Series",
1524    "ATP\015",                          /* pulse command */
1525    "ATT\015",                          /* tone command */
1526    35,                                 /* dial_time */
1527    ",",                                /* pause_chars */
1528    2,                                  /* pause_time */
1529/* #P0 (= no parity) is not listed in the manual for newer models */
1530/* so it has been removed from all three copies of the Multitech wake_str */
1531#ifdef OS2
1532    "ATE1Q0V1X4&S0&C1&D2&E8&Q0\015",    /* wake_str */
1533#else
1534#ifdef VMS
1535    "ATQ0E1X4&S1&E8&Q0\015",            /* wake_str */
1536#else
1537    "ATQ0E1X4&E8&Q0\015",               /* wake_str */
1538#endif /* VMS */
1539#endif /* OS2 */
1540    0,                                  /* wake_rate */
1541    "OK\015",                           /* wake_prompt */
1542    "",                                 /* dmode_str */
1543    "",                                 /* dmode_prompt */
1544    "ATD%s\015",                        /* dial_str */
1545    0,                                  /* dial_rate */
1546    1100,                               /* esc_time */
1547    43,                                 /* esc_char */
1548    "ATQ0H0\015",                       /* hup_str */
1549    "AT&E4&E7&E8&E11&E13\015",          /* hwfc_str */
1550    "AT&E5&E6&E8&E11&E13\015",          /* swfc_str */
1551    "AT&E3&E7&E8&E10&E12\015",          /* nofc_str */
1552    "AT&E1\015",                        /* ec_on_str */
1553    "AT&E0\015",                        /* ec_off_str */
1554    "AT&E15\015",                       /* dc_on_str */
1555    "AT&E14\015",                       /* dc_off_str */
1556    "ATS0=1\015",                       /* aa_on_str */
1557    "ATS0=0\015",                       /* aa_off_str */
1558    "AT$BA0\015",                       /* sb_on_str (= "baud adjust off") */
1559    "AT$BA1\015",                       /* sb_off_str */
1560    "ATM1\015",                         /* sp_on_str */
1561    "ATM0\015",                         /* sp_off_str */
1562    "ATL1\015",                         /* vol1_str */
1563    "ATL2\015",                         /* vol2_str */
1564    "ATL3\015",                         /* vol3_str */
1565    "ATX3\015",                         /* ignoredt */
1566    "",                                 /* ini2 */
1567    57600L,                             /* max_speed */
1568    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1569    getok                               /* ok_fn */
1570};
1571
1572static
1573MDMINF SUPRA =                          /* Supra */
1574    {
1575    "SupraFAXModem 144 or 288",
1576    "ATP\015",                          /* pulse command */
1577    "ATT\015",                          /* tone command */
1578    35,                                 /* dial_time */
1579    ",",                                /* pause_chars */
1580    2,                                  /* pause_time */
1581#ifdef OS2
1582    "ATQ0E1V1N1W0X4Y0&S0&C1&D2\\K5S82=128\015", /* wake_str */
1583#else
1584#ifdef VMS
1585    "ATQ0E1N1W0X4Y0&S1\\K5S82=128\015", /* wake_str */
1586#else
1587    "ATQ0E1N1W0X4Y0\\K5S82=128\015",    /* wake_str */
1588#endif /* VMS */
1589#endif /* OS2 */
1590    0,                                  /* wake_rate */
1591    "OK\015",                           /* wake_prompt */
1592    "",                                 /* dmode_str */
1593    "",                                 /* dmode_prompt */
1594    "ATD%s\015",                        /* dial_str */
1595    0,                                  /* dial_rate */
1596    1100,                               /* esc_time */
1597    43,                                 /* esc_char */
1598    "ATQ0H0\015",                       /* hup_str */
1599    "AT&K3\015",                        /* hwfc_str */
1600    "AT&K4\015",                        /* swfc_str */
1601    "AT&K0\015",                        /* nofc_str */
1602    "AT&Q5\\N3S48=7\015",               /* ec_on_str */
1603    "AT&Q0\\N1\015",                    /* ec_off_str */
1604    "AT%C1S46=138\015",                 /* dc_on_str */
1605    "AT%C0S46=136\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    "ATM1\015",                         /* sp_on_str */
1611    "ATM\015",                          /* sp_off_str */
1612    "ATL\015",                          /* vol1_str */
1613    "ATL2\015",                         /* vol2_str */
1614    "ATL3\015",                         /* vol3_str */
1615    "ATX3\015",                         /* ignoredt */
1616    "",                                 /* ini2 */
1617    57600L,                             /* max_speed */
1618    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1619    getok                               /* ok_fn */
1620};
1621
1622static
1623MDMINF SUPRAX =                         /* Supra Express */
1624    {
1625    "Diamond Supra Express V.90",
1626    "ATP\015",                          /* pulse command */
1627    "ATT\015",                          /* tone command */
1628    35,                                 /* dial_time */
1629    ",",                                /* pause_chars */
1630    2,                                  /* pause_time */
1631#ifdef OS2
1632    "ATQ0E1V1W0X4&C1&D2&S0\\K5\015",    /* wake_str */
1633#else
1634#ifdef VMS
1635    "ATQ0E1W0X4&S1\\K5\015",            /* wake_str */
1636#else
1637    "ATQ0E1W0X4\\K5\015",               /* wake_str */
1638#endif /* VMS */
1639#endif /* OS2 */
1640    0,                                  /* wake_rate */
1641    "OK\015",                           /* wake_prompt */
1642    "",                                 /* dmode_str */
1643    "",                                 /* dmode_prompt */
1644    "ATD%s\015",                        /* dial_str */
1645    0,                                  /* dial_rate */
1646    1100,                               /* esc_time */
1647    43,                                 /* esc_char */
1648    "ATQ0H0\015",                       /* hup_str */
1649    "AT&K3\015",                        /* hwfc_str */
1650    "AT&K4\015",                        /* swfc_str */
1651    "AT&K0\015",                        /* nofc_str */
1652    "AT\\N3\015",                       /* ec_on_str */
1653    "AT\\N1\015",                       /* ec_off_str */
1654    "AT%C2\015",                        /* dc_on_str */
1655    "AT%C0\015",                        /* dc_off_str */
1656    "ATS0=1\015",                       /* aa_on_str */
1657    "ATS0=0\015",                       /* aa_off_str */
1658    "",                                 /* sb_on_str */
1659    "",                                 /* sb_off_str */
1660    "ATM1\015",                         /* sp_on_str */
1661    "ATM\015",                          /* sp_off_str */
1662    "ATL\015",                          /* vol1_str */
1663    "ATL2\015",                         /* vol2_str */
1664    "ATL3\015",                         /* vol3_str */
1665    "ATX3\015",                         /* ignoredt */
1666    "",                                 /* ini2 */
1667    230400L,                            /* max_speed */
1668    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1669    getok                               /* ok_fn */
1670};
1671
1672static
1673MDMINF MAXTECH =                        /* MaxTech */
1674    {
1675    "MaxTech XM288EA or GVC FAXModem",
1676    "ATP\015",                          /* pulse command */
1677    "ATT\015",                          /* tone command */
1678    35,                                 /* dial_time */
1679    ",",                                /* pause_chars */
1680    2,                                  /* pause_time */
1681#ifdef OS2
1682    "ATQ0E1V1X4Y0&S0&C1&D2&L0&M0\\K5\015", /* wake_str */
1683#else
1684#ifdef VMS
1685    "ATQ0E1X4Y0&L0&M0&S1\\K5\015",      /* wake_str */
1686#else
1687    "ATQ0E1X4Y0&L0&M0\\K5\015",         /* wake_str */
1688#endif /* VMS */
1689#endif /* OS2 */
1690    0,                                  /* wake_rate */
1691    "OK\015",                           /* wake_prompt */
1692    "",                                 /* dmode_str */
1693    "",                                 /* dmode_prompt */
1694    "ATD%s\015",                        /* dial_str */
1695    0,                                  /* dial_rate */
1696    1100,                               /* esc_time */
1697    43,                                 /* esc_char */
1698    "ATQ0H0\015",                       /* hup_str */
1699    "AT\\Q3\015",                       /* hwfc_str */
1700    "AT\\Q1\\X0\015",                   /* swfc_str */
1701    "AT\\Q0\015",                       /* nofc_str */
1702    "AT\\N6\015",                       /* ec_on_str */
1703    "AT\\N0\015",                       /* ec_off_str */
1704    "AT\\N6%C1\015",                    /* dc_on_str */
1705    "AT\\N6%C0\015",                    /* dc_off_str */
1706    "ATS0=1\015",                       /* aa_on_str */
1707    "ATS0=0\015",                       /* aa_off_str */
1708    "",                                 /* sb_on_str */
1709    "",                                 /* sb_off_str */
1710    "ATM1\015",                         /* sp_on_str */
1711    "ATM0\015",                         /* sp_off_str */
1712    "ATL1\015",                         /* vol1_str */
1713    "ATL2\015",                         /* vol2_str */
1714    "ATL3\015",                         /* vol3_str */
1715    "ATX3\015",                         /* ignoredt */
1716    "",                                 /* ini2 */
1717    115200L,                            /* max_speed */
1718    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1719    getok                               /* ok_fn */
1720};
1721
1722static
1723MDMINF ROLM =           /* IBM / Siemens / Rolm 8000, 9000, 9751 CBX DCM */
1724    {
1725    "IBM/Siemens/Rolm CBX Data Communications Module",
1726    "",                                 /* pulse command */
1727    "",                                 /* tone command */
1728    60,                                 /* dial_time */
1729    "",                                 /* pause_chars */
1730    0,                                  /* pause_time */
1731    "\015\015",                         /* wake_str */
1732    50,                                 /* wake_rate */
1733    "MODIFY?",                          /* wake_prompt */
1734    "",                                 /* dmode_str */
1735    "",                                 /* dmode_prompt */
1736    "CALL %s\015",                      /* dial_str */
1737    0,                                  /* dial_rate */
1738    0,                                  /* esc_time */
1739    0,                                  /* esc_char */
1740    "",                                 /* hup_str */
1741    "",                                 /* hwfc_str */
1742    "",                                 /* swfc_str */
1743    "",                                 /* nofc_str */
1744    "",                                 /* ec_on_str */
1745    "",                                 /* ec_off_str */
1746    "",                                 /* dc_on_str */
1747    "",                                 /* dc_off_str */
1748    "",                                 /* aa_on_str */
1749    "",                                 /* aa_off_str */
1750    "",                                 /* sb_on_str */
1751    "",                                 /* sb_off_str */
1752    "",                                 /* sp_off_str */
1753    "",                                 /* sp_on_str */
1754    "",                                 /* vol1_str */
1755    "",                                 /* vol2_str */
1756    "",                                 /* vol3_str */
1757    "",                                 /* ignoredt */
1758    "",                                 /* ini2 */
1759    19200L,                             /* max_speed */
1760    0,                                  /* capas */
1761    NULL                                /* ok_fn */
1762};
1763
1764static
1765MDMINF USR =                            /* USR Courier and Sportster modems */
1766    {
1767    "US Robotics Courier, Sportster, or compatible",
1768    "ATP\015",                          /* pulse command */
1769    "ATT\015",                          /* tone command */
1770    35,                                 /* dial_time */
1771    ",",                                /* pause_chars */
1772    2,                                  /* pause_time */
1773#ifdef OS2
1774    "ATQ0E1V1X4&A3&S0&C1&D2&N0&Y3S14=0\015", /* wake_str */
1775#else
1776#ifdef SUNOS4
1777    "ATQ0X4&A3&S0&N0&Y3S14=0\015",      /* wake_str -- needs &S0 in SunOS */
1778#else
1779#ifdef VMS
1780    "ATQ0X4&A3&S1&N0&Y3S14=0\015",      /* wake_str -- needs &S1 in VMS */
1781#else
1782    "ATQ0X4&A3&N0&Y3S14=0\015",         /* wake_str */
1783#endif /* VMS */
1784#endif /* SUNOS4 */
1785#endif /* OS2 */
1786    0,                                  /* wake_rate */
1787    "OK\015",                           /* wake_prompt */
1788    "",                                 /* dmode_str */
1789    "",                                 /* dmode_prompt */
1790    "ATD%s\015",                        /* dial_str */
1791    0,                                  /* dial_rate */
1792    1100,                               /* esc_time */
1793    43,                                 /* esc_char */
1794    "ATQ0H0\015",                       /* hup_str */
1795    "AT&H1&R2&I0\015",                  /* hwfc_str */
1796    "AT&H2&R1&I2\015",                  /* swfc_str */
1797    "AT&H0&R1&I0\015",                  /* nofc_str */
1798    "AT&M4&B1\015",                     /* ec_on_str */
1799    "AT&M0\015",                        /* ec_off_str */
1800    "AT&K1\015",                        /* dc_on_str */
1801    "AT&K0\015",                        /* dc_off_str */
1802    "ATS0=1\015",                       /* aa_on_str */
1803    "ATS0=0\015",                       /* aa_off_str */
1804    "",                                 /* sb_on_str */
1805    "",                                 /* sb_off_str */
1806    "ATM1\015",                         /* sp_on_str */
1807    "ATM0\015",                         /* sp_off_str */
1808    "ATL1\015",                         /* vol1_str */
1809    "ATL2\015",                         /* vol2_str */
1810    "ATL3\015",                         /* vol3_str */
1811    "ATX3\015",                         /* ignoredt */
1812    "",                                 /* ini2 */
1813    115200L,                            /* max_speed */
1814    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1815    getok                               /* ok_fn */
1816};
1817
1818
1819static
1820MDMINF USRX2 =                          /* USR XJ-CC1560 X2 56K */
1821    {
1822    "US Robotics / Megahertz CC/XJ-CC1560 X2",
1823    "ATP\015",                          /* pulse command */
1824    "ATT\015",                          /* tone command */
1825    35,                                 /* dial_time */
1826    ",",                                /* pause_chars */
1827    2,                                  /* pause_time */
1828#ifdef OS2
1829    "ATQ0E1V1X4&A3&S0&B2&C1&D2&N0\015", /* wake_str */
1830#else
1831#ifdef VMS
1832    "ATQ0X4&A3&B2&N0&S1\015",           /* wake_str */
1833#else
1834    "ATQ0X4&A3&B2&N0\015",              /* wake_str */
1835#endif /* VMS */
1836#endif /* OS2 */
1837    0,                                  /* wake_rate */
1838    "OK\015",                           /* wake_prompt */
1839    "",                                 /* dmode_str */
1840    "",                                 /* dmode_prompt */
1841    "ATD%s\015",                        /* dial_str */
1842    0,                                  /* dial_rate */
1843    1100,                               /* esc_time */
1844    43,                                 /* esc_char */
1845    "ATQ0H0\015",                       /* hup_str */
1846    "AT&H1&I0\015",                     /* hwfc_str */
1847    "AT&H2&I2\015",                     /* swfc_str */
1848    "AT&H0&I0\015",                     /* nofc_str */
1849    "AT&M4\015",                        /* ec_on_str */
1850    "AT&M0\015",                        /* ec_off_str */
1851    "AT&K1\015",                        /* dc_on_str */
1852    "AT&K0\015",                        /* dc_off_str */
1853    "ATS0=1\015",                       /* aa_on_str */
1854    "ATS0=0\015",                       /* aa_off_str */
1855    "AT&B1\015",                        /* sb_on_str */
1856    "AT&B0\015",                        /* sb_off_str */
1857    "ATM1\015",                         /* sp_on_str */
1858    "ATM0\015",                         /* sp_off_str */
1859    "ATL1\015",                         /* vol1_str */
1860    "ATL2\015",                         /* vol2_str */
1861    "ATL3\015",                         /* vol3_str */
1862    "ATX3\015",                         /* ignoredt */
1863    "",                                 /* ini2 */
1864    115200L,                            /* max_speed */
1865    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
1866    getok                               /* ok_fn */
1867};
1868
1869static
1870MDMINF OLDTB =                          /* Old Telebits */
1871    {
1872    "Telebit TrailBlazer, T1000, T1500, T2000, T2500",
1873    "ATP\015",                          /* pulse command */
1874    "ATT\015",                          /* tone command */
1875    60,                                 /* dial_time */
1876    ",",                                /* pause_chars */
1877    2,                                  /* pause_time */
1878#ifdef OS2
1879    "\021AAAAATQ0E1V1X1&S0&C1&D2S12=50S50=0S54=3\015", /* wake_str. */
1880#else
1881#ifdef VMS
1882    "\021AAAAATQ0X1S12=50S50=0S54=3\015", /* wake_str. */
1883#else
1884    "\021AAAAATQ0X1&S1S12=50S50=0S54=3\015", /* wake_str. */
1885#endif /* VMS */
1886#endif /* OS2 */
1887    100,                                /* wake_rate = 100 msec */
1888    "OK\015",                           /* wake_prompt */
1889    "",                                 /* dmode_str */
1890    "",                                 /* dmode_prompt */
1891    "ATD%s\015",                        /* dial_str, Note: no T or P */
1892    80,                                 /* dial_rate */
1893    1100,                               /* esc_time (guard time) */
1894    43,                                 /* esc_char */
1895    "ATQ0H0\015",                       /* hup_str */
1896    "ATS58=2S68=2\015",                 /* hwfc_str */
1897    "ATS58=3S68=3S69=0\015",            /* swfc_str */
1898    "ATS58=0S68=0\015",                 /* nofc_str */
1899    "ATS66=1S95=2\015",                 /* ec_on_str */
1900    "ATS95=0\015",                      /* ec_off_str */
1901    "ATS110=1S96=1\015",                /* dc_on_str */
1902    "ATS110=0S96=0\015",                /* dc_off_str */
1903    "ATS0=1\015",                       /* aa_on_str */
1904    "ATS0=0\015",                       /* aa_off_str */
1905    "",                                 /* sb_on_str */
1906    "",                                 /* sb_off_str */
1907    "ATM1\015",                         /* sp_on_str */
1908    "ATM0\015",                         /* sp_off_str */
1909    "ATL1\015",                         /* vol1_str */
1910    "ATL2\015",                         /* vol2_str */
1911    "ATL3\015",                         /* vol3_str */
1912    "ATX3\015",                         /* ignoredt */
1913    "",                                 /* ini2 */
1914    19200L,                             /* max_speed */
1915    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW|CKD_TB|CKD_KS, /* capas */
1916    getok                               /* ok_fn */
1917};
1918
1919static
1920MDMINF NEWTB =                          /* New Telebits */
1921    {
1922    "Telebit T1600, T3000, QBlazer, WorldBlazer, etc.",
1923    "ATP\015",                          /* pulse command */
1924    "ATT\015",                          /* tone command */
1925    60,                                 /* dial_time */
1926    ",",                                /* pause_chars */
1927    2,                                  /* pause_time */
1928#ifdef OS2
1929    "\021AAAAATQ0E1V1X2&S0&C1&D2S12=50S50=0S61=0S63=0\015", /* wake_str. */
1930#else
1931#ifdef VMS
1932    "\021AAAAATQ0X2&S1S12=50S50=0S61=0S63=0\015", /* wake_str. */
1933#else
1934    "\021AAAAATQ0X2S12=50S50=0S61=0S63=0\015", /* wake_str. */
1935#endif /* VMS */
1936#endif /* OS2 */
1937    100,                                /* wake_rate = 100 msec */
1938    "OK\015",                           /* wake_prompt */
1939    "",                                 /* dmode_str */
1940    "",                                 /* dmode_prompt */
1941    "ATD%s\015",                        /* dial_str, Note: no T or P */
1942    80,                                 /* dial_rate */
1943    1100,                               /* esc_time (guard time) */
1944    43,                                 /* esc_char */
1945    "ATQ0H0\015",                       /* hup_str */
1946    "ATS58=2S68=2\015",                 /* hwfc_str */
1947    "ATS58=3S68=3\015",                 /* swfc_str */
1948    "ATS58=0S68=0\015",                 /* nofc_str */
1949    "ATS180=3\015",                     /* ec_on_str */
1950    "ATS180=0\015",                     /* ec_off_str */
1951    "ATS190=1\015",                     /* dc_on_str */
1952    "ATS190=0\015",                     /* dc_off_str */
1953    "ATS0=1\015",                       /* aa_on_str */
1954    "ATS0=0\015",                       /* aa_off_str */
1955    "",                                 /* sb_on_str */
1956    "",                                 /* sb_off_str */
1957    "ATM1\015",                         /* sp_on_str */
1958    "ATM0\015",                         /* sp_off_str */
1959    "ATL1\015",                         /* vol1_str */
1960    "ATL2\015",                         /* vol2_str */
1961    "ATL3\015",                         /* vol3_str */
1962    "ATX3\015",                         /* ignoredt */
1963    "",                                 /* ini2 */
1964    38400L,                             /* max_speed */
1965    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW|CKD_TB|CKD_KS, /* capas */
1966    getok                               /* ok_fn */
1967};
1968#endif /* MINIDIAL */
1969
1970static
1971MDMINF DUMMY = /* dummy information for modems that are handled elsewhere */
1972    {
1973    "(dummy)",
1974    "",                                 /* pulse command */
1975    "",                                 /* tone command */
1976    30,                                 /* dial_time */
1977    "",                                 /* pause_chars */
1978    0,                                  /* pause_time */
1979    "",                                 /* wake_str */
1980    0,                                  /* wake_rate */
1981    "",                                 /* wake_prompt */
1982    "",                                 /* dmode_str */
1983    NULL,                               /* dmode_prompt */
1984    "%s\015",                           /* dial_str */
1985    0,                                  /* dial_rate */
1986    0,                                  /* esc_time */
1987    0,                                  /* esc_char */
1988    "",                                 /* hup_str */
1989    "",                                 /* hwfc_str */
1990    "",                                 /* swfc_str */
1991    "",                                 /* nofc_str */
1992    "",                                 /* ec_on_str */
1993    "",                                 /* ec_off_str */
1994    "",                                 /* dc_on_str */
1995    "",                                 /* dc_off_str */
1996    "",                                 /* aa_on_str */
1997    "",                                 /* aa_off_str */
1998    "",                                 /* sb_on_str */
1999    "",                                 /* sb_off_str */
2000    "",                                 /* sp_off_str */
2001    "",                                 /* sp_on_str */
2002    "",                                 /* vol1_str */
2003    "",                                 /* vol2_str */
2004    "",                                 /* vol3_str */
2005    "",                                 /* ignoredt */
2006    "",                                 /* ini2 */
2007    0L,                                 /* max_speed */
2008    0,                                  /* capas */
2009    NULL                                /* ok_fn */
2010};
2011
2012#ifndef MINIDIAL
2013static
2014MDMINF RWV32 =                          /* Generic Rockwell V.32 */
2015    {
2016    "Generic Rockwell V.32 modem",      /* ATI3, ATI4, and ATI6 for details */
2017    "ATP\015",                          /* pulse command */
2018    "ATT\015",                          /* tone command */
2019    35,                                 /* dial_time */
2020    ",",                                /* pause_chars */
2021    2,                                  /* pause_time */
2022#ifdef OS2
2023    "ATQ0E1V1X4Y0&S0&C1&D2%E2\\K5+FCLASS=0N1S37=0\015", /* wake_str */
2024#else
2025#ifdef VMS
2026    "ATQ0X4Y0&S1%E2\\K5+FCLASS=0N1S37=0\015", /* wake_str */
2027#else
2028    "ATQ0X4Y0%E2\\K5+FCLASS=0N1S37=0\015", /* wake_str */
2029#endif /* VMS */
2030#endif /* OS2 */
2031    0,                                  /* wake_rate */
2032    "OK\015",                           /* wake_prompt */
2033    "",                                 /* dmode_str */
2034    "",                                 /* dmode_prompt */
2035    "ATD%s\015",                        /* dial_str */
2036    0,                                  /* dial_rate */
2037    1100,                               /* esc_time */
2038    43,                                 /* esc_char */
2039    "ATQ0H0\015",                       /* hup_str */
2040    "AT&K3\015",                        /* hwfc_str */
2041    "AT&K4S32=17S33=19\015",            /* swfc_str */
2042    "AT&K0\015",                        /* nofc_str */
2043    "AT&Q6\015",                        /* ec_on_str */
2044    "AT&Q0\015",                        /* ec_off_str */
2045    "AT%C1\015",                        /* dc_on_str */
2046    "AT%C0\015",                        /* dc_off_str */
2047    "ATS0=1\015",                       /* aa_on_str */
2048    "ATS0=0\015",                       /* aa_off_str */
2049    "",                                 /* sb_on_str */
2050    "",                                 /* sb_off_str */
2051    "ATM1\015",                         /* sp_on_str */
2052    "ATM0\015",                         /* sp_off_str */
2053    "ATL1\015",                         /* vol1_str */
2054    "ATL2\015",                         /* vol2_str */
2055    "ATL3\015",                         /* vol3_str */
2056    "ATX3\015",                         /* ignoredt */
2057    "",                                 /* ini2 */
2058    57600L,                             /* max_speed */
2059    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
2060    getok                               /* ok_fn */
2061};
2062
2063static
2064MDMINF RWV32B =                         /* Generic Rockwell V.32bis */
2065    {
2066    "Generic Rockwell V.32bis modem",   /* ATI3, ATI4, and ATI6 for details */
2067    "ATP\015",                          /* pulse command */
2068    "ATT\015",                          /* tone command */
2069    35,                                 /* dial_time */
2070    ",",                                /* pause_chars */
2071    2,                                  /* pause_time */
2072#ifdef OS2
2073    "ATQ0E1V1X4Y0&S0&C1&D2%E2\\K5+FCLASS=0N1S37=0\015", /* wake_str */
2074#else
2075#ifdef VMS
2076    "ATQ0X4Y0&S1%E2\\K5+FCLASS=0N1S37=0\015", /* wake_str */
2077#else
2078    "ATQ0X4Y0%E2\\K5+FCLASS=0N1S37=0\015", /* wake_str */
2079#endif /* VMS */
2080#endif /* OS2 */
2081    0,                                  /* wake_rate */
2082    "OK\015",                           /* wake_prompt */
2083    "",                                 /* dmode_str */
2084    "",                                 /* dmode_prompt */
2085    "ATD%s\015",                        /* dial_str */
2086    0,                                  /* dial_rate */
2087    1100,                               /* esc_time */
2088    43,                                 /* esc_char */
2089    "ATQ0H0\015",                       /* hup_str */
2090    "AT&K3\015",                        /* hwfc_str */
2091    "AT&K4S32=17S33=19\015",            /* swfc_str */
2092    "AT&K0\015",                        /* nofc_str */
2093    "AT&Q5\015",                        /* ec_on_str */
2094    "AT&Q0\015",                        /* ec_off_str */
2095    "ATS%C1\015",                       /* dc_on_str */
2096    "ATS%C0\015",                       /* dc_off_str */
2097    "ATS0=1\015",                       /* aa_on_str */
2098    "ATS0=0\015",                       /* aa_off_str */
2099    "",                                 /* sb_on_str */
2100    "",                                 /* sb_off_str */
2101    "ATM1\015",                         /* sp_on_str */
2102    "ATM0\015",                         /* sp_off_str */
2103    "ATL1\015",                         /* vol1_str */
2104    "ATL2\015",                         /* vol2_str */
2105    "ATL3\015",                         /* vol3_str */
2106    "ATX3\015",                         /* ignoredt */
2107    "",                                 /* ini2 */
2108    57600L,                             /* max_speed */
2109    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
2110    getok                               /* ok_fn */
2111};
2112
2113static
2114MDMINF RWV34 =                          /* Generic Rockwell V.34 Data/Fax */
2115    {
2116    "Generic Rockwell V.34 modem",      /* ATI3, ATI4, and ATI6 for details */
2117    "ATP\015",                          /* pulse command */
2118    "ATT\015",                          /* tone command */
2119    35,                                 /* dial_time */
2120    ",",                                /* pause_chars */
2121    2,                                  /* pause_time */
2122#ifdef OS2
2123    "ATQ0V1X4Y0&C1&D2&S0%E2\\K5+FCLASS=0\015", /* wake_str */
2124#else
2125#ifdef VMS
2126    "ATQ0V1X4Y0&C1&D2&S1%E2\\K5+FCLASS=0\015", /* wake_str */
2127#else
2128    "ATQ0V1X4Y0&C1&D2%E2\\K5+FCLASS=0\015", /* wake_str */
2129#endif /* VMS */
2130#endif /* OS2 */
2131    0,                                  /* wake_rate */
2132    "OK\015",                           /* wake_prompt */
2133    "",                                 /* dmode_str */
2134    "",                                 /* dmode_prompt */
2135    "ATD%s\015",                        /* dial_str */
2136    0,                                  /* dial_rate */
2137    1100,                               /* esc_time */
2138    43,                                 /* esc_char */
2139    "ATQ0H0\015",                       /* hup_str */
2140    "AT&K3\015",                        /* hwfc_str */
2141    "AT&K4S32=17S33=19\015",            /* swfc_str */
2142    "AT&K0\015",                        /* nofc_str */
2143    "AT&Q5\015",                        /* ec_on_str */
2144    "AT&Q0\015",                        /* ec_off_str */
2145    "ATS%C3\015",                       /* dc_on_str */
2146    "ATS%C0\015",                       /* dc_off_str */
2147    "ATS0=1\015",                       /* aa_on_str */
2148    "ATS0=0\015",                       /* aa_off_str */
2149    "",                                 /* sb_on_str */
2150    "",                                 /* sb_off_str */
2151    "ATM1\015",                         /* sp_on_str */
2152    "ATM0\015",                         /* sp_off_str */
2153    "ATL1\015",                         /* vol1_str */
2154    "ATL2\015",                         /* vol2_str */
2155    "ATL3\015",                         /* vol3_str */
2156    "ATX3\015",                         /* ignoredt */
2157    "",                                 /* ini2 */
2158    115200L,                            /* max_speed */
2159    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
2160    getok                               /* ok_fn */
2161};
2162
2163static
2164MDMINF RWV90 =                          /* Generic Rockwell V.90 Data/Fax */
2165    {
2166    "Generic Rockwell V.90 56K modem",  /* ATI3, ATI4, and ATI6 for details */
2167    "ATP\015",                          /* pulse command */
2168    "ATT\015",                          /* tone command */
2169    35,                                 /* dial_time */
2170    ",",                                /* pause_chars */
2171    2,                                  /* pause_time */
2172#ifdef OS2
2173    "ATQ0V1N1X4Y0&C1&D2&S0%E2\\K5+FCLASS=0S37=0\015", /* K95 */
2174#else
2175#ifdef VMS
2176    "ATQ0V1N1X4Y0&C1&D2&S1%E2\\K5+FCLASS=0S37=0\015", /* wake_str */
2177#else
2178    "ATQ0V1N1X4Y0&C1&D2%E2\\K5+FCLASS=0S37=0\015", /* wake_str */
2179#endif /* VMS */
2180#endif /* OS2 */
2181    0,                                  /* wake_rate */
2182    "OK\015",                           /* wake_prompt */
2183    "",                                 /* dmode_str */
2184    "",                                 /* dmode_prompt */
2185    "ATD%s\015",                        /* dial_str */
2186    0,                                  /* dial_rate */
2187    1100,                               /* esc_time */
2188    43,                                 /* esc_char */
2189    "ATQ0H0\015",                       /* hup_str */
2190    "AT&K3\015",                        /* hwfc_str */
2191    "AT&K4S32=17S33=19\015",            /* swfc_str */
2192    "AT&K0\015",                        /* nofc_str */
2193    "AT&Q5\015",                        /* ec_on_str */
2194    "AT&Q0\015",                        /* ec_off_str */
2195    "AT%C3\015",                        /* dc_on_str */
2196    "AT%C0\015",                        /* dc_off_str */
2197    "ATS0=1\015",                       /* aa_on_str */
2198    "ATS0=0\015",                       /* aa_off_str */
2199    "",                                 /* sb_on_str */
2200    "",                                 /* sb_off_str */
2201    "ATM1\015",                         /* sp_on_str */
2202    "ATM0\015",                         /* sp_off_str */
2203    "ATL1\015",                         /* vol1_str */
2204    "ATL2\015",                         /* vol2_str */
2205    "ATL3\015",                         /* vol3_str */
2206    "ATX3\015",                         /* ignoredt */
2207    "",                                 /* ini2 */
2208    115200L,                            /* max_speed */
2209    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
2210    getok                               /* ok_fn */
2211};
2212
2213static
2214MDMINF MWAVE =                          /* IBM Mwave */
2215    {
2216    "IBM Mwave Adapter",
2217    "ATP\015",                          /* pulse command */
2218    "ATT\015",                          /* tone command */
2219    35,                                 /* dial_time */
2220    ",",                                /* pause_chars */
2221    2,                                  /* pause_time */
2222#ifdef OS2
2223    "ATQ0E1V1X4Y0&S0&C1&D2&M0&Q0&N1\\K3\\T0%E2S28=0\015", /* wake_str */
2224#else
2225#ifdef VMS
2226    "ATQ0X4Y0&M0&S1&Q0&N1&S0\\K3\\T0%E2S28=0\015", /* wake_str */
2227#else
2228    "ATQ0X4Y0&M0&Q0&N1&S0\\K3\\T0%E2S28=0\015", /* wake_str */
2229#endif /* VMS */
2230#endif /* OS2 */
2231    0,                                  /* wake_rate */
2232    "OK\015",                           /* wake_prompt */
2233    "",                                 /* dmode_str */
2234    "",                                 /* dmode_prompt */
2235    "ATD%s\015",                        /* dial_str */
2236    0,                                  /* dial_rate */
2237    1100,                               /* esc_time */
2238    43,                                 /* esc_char */
2239    "ATQ0H0\015",                       /* hup_str */
2240    "AT\\Q3\015",                       /* hwfc_str */
2241    "",                                 /* swfc_str (it doesn't!) */
2242    "AT\\Q0\015",                       /* nofc_str */
2243    "AT\\N7\015",                       /* ec_on_str */
2244    "AT\\N0\015",                       /* ec_off_str */
2245    "AT%C1\"H3\015",                    /* dc_on_str */
2246    "AT%C0\"H0\015",                    /* dc_off_str */
2247    "ATS0=1\015",                       /* aa_on_str */
2248    "ATS0=0\015",                       /* aa_off_str */
2249    "",                                 /* sb_on_str */
2250    "",                                 /* sb_off_str */
2251    "ATM1\015",                         /* sp_on_str */
2252    "ATM0\015",                         /* sp_off_str */
2253    "ATL1\015",                         /* vol1_str */
2254    "ATL2\015",                         /* vol2_str */
2255    "ATL3\015",                         /* vol3_str */
2256    "ATX3\015",                         /* ignoredt */
2257    "",                                 /* ini2 */
2258    57600L,                             /* max_speed */
2259    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW, /* capas */
2260    getok                               /* ok_fn */
2261};
2262
2263static
2264MDMINF TELEPATH =                       /* Gateway 2000 Telepath */
2265    {
2266    "Gateway 2000 Telepath II 28.8",
2267    "ATP\015",                          /* pulse command */
2268    "ATT\015",                          /* tone command */
2269    35,                                 /* dial_time */
2270    ",",                                /* pause_chars */
2271    2,                                  /* pause_time */
2272#ifdef OS2
2273    "ATQ0E1V1X4&S0&C1&D2&N0&Y2#CLS=0S13=0S15=0S19=0\015", /* wake_str */
2274#else
2275#ifdef VMS
2276    "ATQ0X4&N0&S1&Y1#CLS=0S13=0S15=0S19=0\015", /* wake_str */
2277#else
2278    "ATQ0X4&N0&Y1#CLS=0S13=0S15=0S19=0\015", /* wake_str */
2279#endif /* VMS */
2280#endif /* OS2 */
2281    0,                                  /* wake_rate */
2282    "OK\015",                           /* wake_prompt */
2283    "",                                 /* dmode_str */
2284    "",                                 /* dmode_prompt */
2285    "ATD%s\015",                        /* dial_str */
2286    0,                                  /* dial_rate */
2287    1100,                               /* esc_time */
2288    43,                                 /* esc_char */
2289    "ATQ0H0\015",                       /* hup_str */
2290    "AT&H1&R2\015",                     /* hwfc_str */
2291    "AT&H2&I2S22=17S23=19\015",         /* swfc_str */
2292    "AT&H0&I0&R1\015",                  /* nofc_str */
2293    "AT&M4&B1\015",                     /* ec_on_str -- also fixes speed */
2294    "AT&M0\015",                        /* ec_off_str */
2295    "AT&K1\015",                        /* dc_on_str */
2296    "AT&K0\015",                        /* dc_off_str */
2297    "ATS0=1\015",                       /* aa_on_str */
2298    "ATS0=0\015",                       /* aa_off_str */
2299    "",                                 /* sb_on_str */
2300    "",                                 /* sb_off_str */
2301    "ATM1\015",                         /* sp_on_str */
2302    "ATM0\015",                         /* sp_off_str */
2303    "ATL1\015",                         /* vol1_str */
2304    "ATL2\015",                         /* vol2_str */
2305    "ATL3\015",                         /* vol3_str */
2306    "ATX3\015",                         /* ignoredt */
2307    "",                                 /* ini2 */
2308    57600L,                             /* max_speed */
2309    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
2310    getok                               /* ok_fn */
2311};
2312
2313static
2314MDMINF CARDINAL =                       /* Cardinal - based on Rockwell V.34 */
2315    {
2316    "Cardinal MVP288X Series",          /* ATI3, ATI4, and ATI6 for details */
2317    "ATP\015",                          /* pulse command */
2318    "ATT\015",                          /* tone command */
2319    35,                                 /* dial_time */
2320    ",",                                /* pause_chars */
2321    2,                                  /* pause_time */
2322#ifdef OS2
2323    "ATQ0E1V1X4W1Y0%E2&S0&C1&D2\\K5+FCLASS=0+MS=11,1\015", /* wake_str */
2324#else
2325#ifdef VMS
2326    "ATQ0X4W1Y0&S1%E2\\K5+FCLASS=0+MS=11,1\015", /* wake_str */
2327#else
2328    "ATQ0X4W1Y0%E2\\K5+FCLASS=0+MS=11,1\015", /* wake_str */
2329#endif /* VMS */
2330#endif /* OS2 */
2331    0,                                  /* wake_rate */
2332    "OK\015",                           /* wake_prompt */
2333    "",                                 /* dmode_str */
2334    "",                                 /* dmode_prompt */
2335    "ATD%s\015",                        /* dial_str */
2336    0,                                  /* dial_rate */
2337    1100,                               /* esc_time */
2338    43,                                 /* esc_char */
2339    "ATQ0H0\015",                       /* hup_str */
2340    "AT&K3\015",                        /* hwfc_str */
2341    "AT&K4S32=17S33=19\015",            /* swfc_str */
2342    "AT&K0\015",                        /* nofc_str */
2343    "AT&Q5S36=7S48=7\\N3\015",          /* ec_on_str */
2344    "AT&Q0S48=128\\N1\015",             /* ec_off_str */
2345    "ATS46=138%C1\015",                 /* dc_on_str */
2346    "ATS46=136%C0\015",                 /* dc_off_str */
2347    "ATS0=1\015",                       /* aa_on_str */
2348    "ATS0=0\015",                       /* aa_off_str */
2349    "",                                 /* sb_on_str */
2350    "",                                 /* sb_off_str */
2351    "ATM1\015",                         /* sp_on_str */
2352    "ATM0\015",                         /* sp_off_str */
2353    "ATL1\015",                         /* vol1_str */
2354    "ATL2\015",                         /* vol2_str */
2355    "ATL3\015",                         /* vol3_str */
2356    "ATX3\015",                         /* ignoredt */
2357    "",                                 /* ini2 */
2358    115200L,                            /* max_speed */
2359    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
2360    getok                               /* ok_fn */
2361};
2362
2363static
2364MDMINF LUCENT =                         /* Lucent Venus or Data/Fax modem */
2365    {
2366    "Lucent Venus chipset",
2367    "ATP\015",                          /* pulse command */
2368    "ATT\015",                          /* tone command */
2369    35,                                 /* dial_time */
2370    ",",                                /* pause_chars */
2371    2,                                  /* pause_time */
2372#ifdef OS2
2373    "ATQ0V1N1X4Y0&C1&D2&S0%E2\\K5+FCLASS=0S37=0\015", /* K95 */
2374#else
2375#ifdef VMS
2376    "ATQ0V1N1X4Y0&C1&D2&S1%E2\\K5+FCLASS=0S37=0\015", /* VMS */
2377#else
2378    "ATQ0V1N1X4Y0&C1&D2%E2\\K5+FCLASS=0S37=0\015", /* All others */
2379#endif /* VMS */
2380#endif /* OS2 */
2381    0,                                  /* wake_rate */
2382    "OK\015",                           /* wake_prompt */
2383    "",                                 /* dmode_str */
2384    "",                                 /* dmode_prompt */
2385    "ATD%s\015",                        /* dial_str */
2386    0,                                  /* dial_rate */
2387    1100,                               /* esc_time */
2388    43,                                 /* esc_char */
2389    "ATQ0H0\015",                       /* hup_str */
2390    "AT&K3\015",                        /* hwfc_str */
2391    "AT&K4S32=17S33=19\015",            /* swfc_str */
2392    "AT&K0\015",                        /* nofc_str */
2393    "AT&Q5\015",                        /* ec_on_str */
2394    "AT&Q0\015",                        /* ec_off_str */
2395    "AT%C1\015",                        /* dc_on_str */
2396    "AT%C0\015",                        /* dc_off_str */
2397    "ATS0=1\015",                       /* aa_on_str */
2398    "ATS0=0\015",                       /* aa_off_str */
2399    "",                                 /* sb_on_str */
2400    "",                                 /* sb_off_str */
2401    "ATM1\015",                         /* sp_on_str */
2402    "ATM0\015",                         /* sp_off_str */
2403    "ATL1\015",                         /* vol1_str */
2404    "ATL2\015",                         /* vol2_str */
2405    "ATL3\015",                         /* vol3_str */
2406    "ATX3\015",                         /* ignoredt */
2407    "",                                 /* ini2 */
2408    115200L,                            /* max_speed */
2409    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
2410    getok                               /* ok_fn */
2411};
2412
2413static
2414MDMINF CONEXANT =                       /* Conexant family */
2415    {
2416    "Conexant family of modems",
2417    "ATP\015",                          /* pulse command */
2418    "ATT\015",                          /* tone command */
2419    35,                                 /* dial_time */
2420    ",",                                /* pause_chars */
2421    2,                                  /* pause_time */
2422#ifdef OS2
2423    "ATQ0V1X4&C1&D2&S0%E1+FCLASS=0\015", /* K95 */
2424#else
2425#ifdef VMS
2426    "ATQ0V1X4&C1&D2&S1%E1+FCLASS=0\015", /* VMS */
2427#else
2428    "ATQ0V1X4&C1&D2%E1+FCLASS=0\015", /* UNIX etc */
2429#endif /* VMS */
2430#endif /* OS2 */
2431    0,                                  /* wake_rate */
2432    "OK\015",                           /* wake_prompt */
2433    "",                                 /* dmode_str */
2434    "",                                 /* dmode_prompt */
2435    "ATD%s\015",                        /* dial_str */
2436    0,                                  /* dial_rate */
2437    1100,                               /* esc_time */
2438    43,                                 /* esc_char */
2439    "ATQ0H0\015",                       /* hup_str */
2440    "AT&K3\015",                        /* hwfc_str */
2441    "AT&K4S32=17S33=19\015",            /* swfc_str */
2442    "AT&K0\015",                        /* nofc_str */
2443    "AT&Q5\015",                        /* ec_on_str */
2444    "AT&Q0\015",                        /* ec_off_str */
2445    "AT%C3\015",                        /* dc_on_str */
2446    "AT%C0\015",                        /* dc_off_str */
2447    "ATS0=1\015",                       /* aa_on_str */
2448    "ATS0=0\015",                       /* aa_off_str */
2449    "",                                 /* sb_on_str */
2450    "",                                 /* sb_off_str */
2451    "ATM1\015",                         /* sp_on_str */
2452    "ATM0\015",                         /* sp_off_str */
2453    "ATL1\015",                         /* vol1_str */
2454    "ATL2\015",                         /* vol2_str */
2455    "ATL3\015",                         /* vol3_str */
2456    "ATX3\015",                         /* ignoredt */
2457    "",                                 /* ini2 */
2458    115200L,                            /* max_speed */
2459    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
2460    getok                               /* ok_fn */
2461};
2462
2463static
2464MDMINF PCTEL =                          /* PCTel chipset */
2465    {
2466    "PCTel chipset",
2467    "ATP\015",                          /* pulse command */
2468    "ATT\015",                          /* tone command */
2469    35,                                 /* dial_time */
2470    ",",                                /* pause_chars */
2471    2,                                  /* pause_time */
2472#ifdef OS2
2473    "ATQ0V1N1X4Y0&C1&D2&S0%E2\\K5S37=0\015", /* K95 */
2474#else
2475#ifdef VMS
2476    "ATQ0V1N1X4Y0&C1&D2&S1%E2\\K5S37=0\015", /* VMS */
2477#else
2478    "ATQ0V1N1X4Y0&C1&D2%E2\\K5S37=0\015", /* UNIX etc */
2479#endif /* VMS */
2480#endif /* OS2 */
2481    0,                                  /* wake_rate */
2482    "OK\015",                           /* wake_prompt */
2483    "",                                 /* dmode_str */
2484    "",                                 /* dmode_prompt */
2485    "ATD%s\015",                        /* dial_str */
2486    0,                                  /* dial_rate */
2487    1100,                               /* esc_time */
2488    43,                                 /* esc_char */
2489    "ATQ0H0\015",                       /* hup_str */
2490    "AT&K3\015",                        /* hwfc_str */
2491    "AT&K4S32=17S33=19\015",            /* swfc_str */
2492    "AT&K0\015",                        /* nofc_str */
2493    "AT\\N3\015",                       /* ec_on_str */
2494    "AT\\N0\015",                       /* ec_off_str */
2495    "AT%C1\015",                        /* dc_on_str */
2496    "AT%C0\015",                        /* dc_off_str */
2497    "ATS0=1\015",                       /* aa_on_str */
2498    "ATS0=0\015",                       /* aa_off_str */
2499    "",                                 /* sb_on_str */
2500    "",                                 /* sb_off_str */
2501    "ATM1\015",                         /* sp_on_str */
2502    "ATM0\015",                         /* sp_off_str */
2503    "ATL1\015",                         /* vol1_str */
2504    "ATL2\015",                         /* vol2_str */
2505    "ATL3\015",                         /* vol3_str */
2506    "ATX3\015",                         /* ignoredt */
2507    "",                                 /* ini2 */
2508    115200L,                            /* max_speed */
2509    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
2510    getok                               /* ok_fn */
2511};
2512
2513static
2514MDMINF ZOOMV34 =                        /* Zoom Telephonics V.34  */
2515    {
2516    "Zoom Telephonics V.34",
2517    "ATP\015",                          /* pulse command */
2518    "ATT\015",                          /* tone command */
2519    35,                                 /* dial_time */
2520    ",",                                /* pause_chars */
2521    2,                                  /* pause_time */
2522#ifdef OS2
2523    "ATQ0V1N1W1X4&S0&C1&D2S82=128\015", /* wake_str */
2524#else
2525#ifdef VMS
2526    "ATQ0V1N1W1X4&S1S82=128\015",       /* wake_str */
2527#else
2528    "ATQ0V1N1W1X4S82=128S015",          /* wake_str */
2529#endif /* VMS */
2530#endif /* OS2 */
2531    0,                                  /* wake_rate */
2532    "OK\015",                           /* wake_prompt */
2533    "",                                 /* dmode_str */
2534    "",                                 /* dmode_prompt */
2535    "ATD%s\015",                        /* dial_str */
2536    0,                                  /* dial_rate */
2537    1100,                               /* esc_time */
2538    43,                                 /* esc_char */
2539    "ATQ0H0\015",                       /* hup_str */
2540    "AT&K3\015",                        /* hwfc_str */
2541    "AT&K4\015S32=17S33=19",            /* swfc_str */
2542    "AT&K0\015",                        /* nofc_str */
2543    "AT&Q5\015",                        /* ec_on_str */
2544    "AT&Q0\015",                        /* ec_off_str */
2545    "ATS%C3\015",                       /* dc_on_str */
2546    "ATS%C0\015",                       /* dc_off_str */
2547    "ATS0=1\015",                       /* aa_on_str */
2548    "ATS0=0\015",                       /* aa_off_str */
2549    "",                                 /* sb_on_str */
2550    "",                                 /* sb_off_str */
2551    "ATM1\015",                         /* sp_on_str */
2552    "ATM0\015",                         /* sp_off_str */
2553    "ATL1\015",                         /* vol1_str */
2554    "ATL2\015",                         /* vol2_str */
2555    "ATL3\015",                         /* vol3_str */
2556    "ATX3\015",                         /* ignoredt */
2557    "",                                 /* ini2 */
2558    57600L,                             /* max_speed */
2559    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
2560    getok                               /* ok_fn */
2561};
2562
2563static
2564MDMINF ZOOMV90 =                        /* ZOOM V.90 */
2565    {
2566    "Zoom V.90 56K",
2567    "ATP\015",                          /* pulse command */
2568    "ATT\015",                          /* tone command */
2569    35,                                 /* dial_time */
2570    ",",                                /* pause_chars */
2571    2,                                  /* pause_time */
2572#ifdef OS2
2573    "ATQ0V1N1X4Y0&C1&D2&S0%E2\\K5+FCLASS=0S37=0\015", /* K95 */
2574#else
2575#ifdef VMS
2576    "ATQ0V1N1X4Y0&C1&D2&S1%E2\\K5+FCLASS=0S37=0\015", /* VMS */
2577#else
2578    "ATQ0V1N1X4Y0&C1&D2%E2\\K5+FCLASS=0S37=0\015", /* All others */
2579#endif /* VMS */
2580#endif /* OS2 */
2581    0,                                  /* wake_rate */
2582    "OK\015",                           /* wake_prompt */
2583    "",                                 /* dmode_str */
2584    "",                                 /* dmode_prompt */
2585    "ATD%s\015",                        /* dial_str */
2586    0,                                  /* dial_rate */
2587    1100,                               /* esc_time */
2588    43,                                 /* esc_char */
2589    "ATQ0H0\015",                       /* hup_str */
2590    "AT&K3\015",                        /* hwfc_str */
2591    "AT&K4S32=17S33=19\015",            /* swfc_str */
2592    "AT&K0\015",                        /* nofc_str */
2593    "AT&Q5\015",                        /* ec_on_str */
2594    "AT&Q0\015",                        /* ec_off_str */
2595    "AT%C1\015",                        /* dc_on_str */
2596    "AT%C0\015",                        /* dc_off_str */
2597    "ATS0=1\015",                       /* aa_on_str */
2598    "ATS0=0\015",                       /* aa_off_str */
2599    "",                                 /* sb_on_str */
2600    "",                                 /* sb_off_str */
2601    "ATM1\015",                         /* sp_on_str */
2602    "ATM0\015",                         /* sp_off_str */
2603    "ATL1\015",                         /* vol1_str */
2604    "ATL2\015",                         /* vol2_str */
2605    "ATL3\015",                         /* vol3_str */
2606    "ATX3\015",                         /* ignoredt */
2607    "",                                 /* ini2 */
2608    115200L,                            /* max_speed */
2609    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
2610    getok                               /* ok_fn */
2611};
2612
2613static
2614MDMINF ZOOMV92 =                        /* ZOOM V.92 */
2615    {
2616    "Zoom V.92 with V.44 compression",
2617    "ATP\015",                          /* pulse command */
2618    "ATT\015",                          /* tone command */
2619    35,                                 /* dial_time */
2620    ",",                                /* pause_chars */
2621    2,                                  /* pause_time */
2622#ifdef OS2
2623    "ATQ0V1N1X4Y0&C1&D2&S0%E2\\K5+FCLASS=0S37=0+MS=V92\015", /* K95 */
2624#else
2625#ifdef VMS
2626    "ATQ0V1N1X4Y0&C1&D2&S1%E2\\K5+FCLASS=0S37=0+MS=V92\015", /* VMS */
2627#else
2628    "ATQ0V1N1X4Y0&C1&D2%E2\\K5+FCLASS=0S37=0+MS=V92\015", /* All others */
2629#endif /* VMS */
2630#endif /* OS2 */
2631    0,                                  /* wake_rate */
2632    "OK\015",                           /* wake_prompt */
2633    "",                                 /* dmode_str */
2634    "",                                 /* dmode_prompt */
2635    "ATD%s\015",                        /* dial_str */
2636    0,                                  /* dial_rate */
2637    1100,                               /* esc_time */
2638    43,                                 /* esc_char */
2639    "ATQ0H0\015",                       /* hup_str */
2640    "AT&K3\015",                        /* hwfc_str */
2641    "AT&K4S32=17S33=19\015",            /* swfc_str */
2642    "AT&K0\015",                        /* nofc_str */
2643    "AT&Q5\015",                        /* ec_on_str */
2644    "AT&Q0\015",                        /* ec_off_str */
2645    "AT%C1+DCS=1,1\015",                /* dc_on_str */
2646    "AT%C0\015",                        /* dc_off_str */
2647    "ATS0=1\015",                       /* aa_on_str */
2648    "ATS0=0\015",                       /* aa_off_str */
2649    "",                                 /* sb_on_str */
2650    "",                                 /* sb_off_str */
2651    "ATM1\015",                         /* sp_on_str */
2652    "ATM0\015",                         /* sp_off_str */
2653    "ATL1\015",                         /* vol1_str */
2654    "ATL2\015",                         /* vol2_str */
2655    "ATL3\015",                         /* vol3_str */
2656    "ATX3\015",                         /* ignoredt */
2657    "",                                 /* ini2 */
2658    115200L,                            /* max_speed */
2659    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
2660    getok                               /* ok_fn */
2661};
2662
2663
2664/*
2665  Now the "old" modems, all grouped together, and also within
2666  "if not defined MINIDIAL"...
2667*/
2668#ifdef OLDMODEMS
2669
2670static
2671MDMINF CERMETEK =       /* Information for "Cermetek Info-Mate 212 A" modem */
2672    {
2673    "Cermetek Info-Mate 212 A",
2674    "",                                 /* pulse command */
2675    "",                                 /* tone command */
2676    20,                                 /* dial_time */
2677    "BbPpTt",                           /* pause_chars */
2678    0,                                  /* pause_time */
2679    "  XY\016R\015",                    /* wake_str */
2680    200,                                /* wake_rate */
2681    "",                                 /* wake_prompt */
2682    "",                                 /* dmode_str */
2683    NULL,                               /* dmode_prompt */
2684    "\016D '%s'\015",                   /* dial_str */
2685    200,                                /* dial_rate */
2686    0,                                  /* esc_time */
2687    0,                                  /* esc_char */
2688    "",                                 /* hup_str */
2689    "",                                 /* hwfc_str */
2690    "",                                 /* swfc_str */
2691    "",                                 /* nofc_str */
2692    "",                                 /* ec_on_str */
2693    "",                                 /* ec_off_str */
2694    "",                                 /* dc_on_str */
2695    "",                                 /* dc_off_str */
2696    "",                                 /* aa_on_str */
2697    "",                                 /* aa_off_str */
2698    "",                                 /* sb_on_str */
2699    "",                                 /* sb_off_str */
2700    "",                                 /* sp_off_str */
2701    "",                                 /* sp_on_str */
2702    "",                                 /* vol1_str */
2703    "",                                 /* vol2_str */
2704    "",                                 /* vol3_str */
2705    "",                                 /* ignoredt */
2706    "",                                 /* ini2 */
2707    1200L,                              /* max_speed */
2708    0,                                  /* capas */
2709    NULL                                /* ok_fn */
2710};
2711
2712static
2713MDMINF DF03 =           /* information for "DEC DF03-AC" modem */
2714    {
2715    "Digital DF03-AC",
2716    "",                                 /* pulse command */
2717    "",                                 /* tone command */
2718    27,                                 /* dial_time */
2719    "=",                                /* pause_chars */
2720    15,                                 /* pause_time */
2721    "\001\002",                         /* wake_str */
2722    0,                                  /* wake_rate */
2723    "",                                 /* wake_prompt */
2724    "",                                 /* dmode_str */
2725    NULL,                               /* dmode_prompt */
2726    "%s",                               /* dial_str */
2727    0,                                  /* dial_rate */
2728    0,                                  /* esc_time */
2729    0,                                  /* esc_char */
2730    "",                                 /* hup_str */
2731    "",                                 /* hwfc_str */
2732    "",                                 /* swfc_str */
2733    "",                                 /* nofc_str */
2734    "",                                 /* ec_on_str */
2735    "",                                 /* ec_off_str */
2736    "",                                 /* dc_on_str */
2737    "",                                 /* dc_off_str */
2738    "",                                 /* aa_on_str */
2739    "",                                 /* aa_off_str */
2740    "",                                 /* sb_on_str */
2741    "",                                 /* sb_off_str */
2742    "",                                 /* sp_off_str */
2743    "",                                 /* sp_on_str */
2744    "",                                 /* vol1_str */
2745    "",                                 /* vol2_str */
2746    "",                                 /* vol3_str */
2747    "",                                 /* ignoredt */
2748    "",                                 /* ini2 */
2749    0L,                                 /* max_speed */
2750    0,                                  /* capas */
2751    NULL                                /* ok_fn */
2752};
2753
2754static
2755MDMINF DF100 =          /* information for "DEC DF100-series" modem */
2756                        /*
2757                         * The telephone "number" can include "P"s and/or "T"s
2758                         * within it to indicate that subsequent digits are
2759                         * to be dialed using pulse or tone dialing.  The
2760                         * modem defaults to pulse dialing.  You may modify
2761                         * the dial string below to explicitly default all
2762                         * dialing to pulse or tone, but doing so prevents
2763                         * the use of phone numbers that you may have stored
2764                         * in the modem's memory.
2765                         */
2766    {
2767    "Digital DF-100",
2768    "",                                 /* pulse command */
2769    "",                                 /* tone command */
2770    30,                                 /* dial_time */
2771    "=",                                /* pause_chars */
2772    15,                                 /* pause_time */
2773    "\001",                             /* wake_str */
2774    0,                                  /* wake_rate */
2775    "",                                 /* wake_prompt */
2776    "",                                 /* dmode_str */
2777    NULL,                               /* dmode_prompt */
2778    "%s#",                              /* dial_str */
2779    0,                                  /* dial_rate */
2780    0,                                  /* esc_time */
2781    0,                                  /* esc_char */
2782    "",                                 /* hup_str */
2783    "",                                 /* hwfc_str */
2784    "",                                 /* swfc_str */
2785    "",                                 /* nofc_str */
2786    "",                                 /* ec_on_str */
2787    "",                                 /* ec_off_str */
2788    "",                                 /* dc_on_str */
2789    "",                                 /* dc_off_str */
2790    "",                                 /* aa_on_str */
2791    "",                                 /* aa_off_str */
2792    "",                                 /* sb_on_str */
2793    "",                                 /* sb_off_str */
2794    "",                                 /* sp_off_str */
2795    "",                                 /* sp_on_str */
2796    "",                                 /* vol1_str */
2797    "",                                 /* vol2_str */
2798    "",                                 /* vol3_str */
2799    "",                                 /* ignoredt */
2800    "",                                 /* ini2 */
2801    0L,                                 /* max_speed */
2802    0,                                  /* capas */
2803    NULL                                /* ok_fn */
2804};
2805
2806static
2807MDMINF DF200 =          /* information for "DEC DF200-series" modem */
2808                        /*
2809                         * The telephone "number" can include "P"s and/or "T"s
2810                         * within it to indicate that subsequent digits are
2811                         * to be dialed using pulse or tone dialing.  The
2812                         * modem defaults to pulse dialing.  You may modify
2813                         * the dial string below to explicitly default all
2814                         * dialing to pulse or tone, but doing so prevents
2815                         * the use of phone numbers that you may have stored
2816                         * in the modem's memory.
2817                         */
2818    {
2819    "Digital DF-200",
2820    "",                 /* pulse command */
2821    "",                 /* tone command */
2822    30,                 /* dial_time */
2823    "=W",               /* pause_chars */       /* =: second tone; W: 5 secs */
2824    15,                 /* pause_time */        /* worst case */
2825    "\002",             /* wake_str */          /* allow stored number usage */
2826    0,                  /* wake_rate */
2827    "",                 /* wake_prompt */
2828    "",                 /* dmode_str */
2829    NULL,               /* dmode_prompt */
2830#ifdef COMMENT
2831    "%s!",              /* dial_str */
2832#else
2833    "   d %s\015",
2834#endif /* COMMENT */
2835    0,                                  /* dial_rate */
2836    0,                                  /* esc_time */
2837    0,                                  /* esc_char */
2838    "",                                 /* hup_str */
2839    "",                                 /* hwfc_str */
2840    "",                                 /* swfc_str */
2841    "",                                 /* nofc_str */
2842    "",                                 /* ec_on_str */
2843    "",                                 /* ec_off_str */
2844    "",                                 /* dc_on_str */
2845    "",                                 /* dc_off_str */
2846    "",                                 /* aa_on_str */
2847    "",                                 /* aa_off_str */
2848    "",                                 /* sb_on_str */
2849    "",                                 /* sb_off_str */
2850    "",                                 /* sp_off_str */
2851    "",                                 /* sp_on_str */
2852    "",                                 /* vol1_str */
2853    "",                                 /* vol2_str */
2854    "",                                 /* vol3_str */
2855    "",                                 /* ignoredt */
2856    "",                                 /* ini2 */
2857    0L,                                 /* max_speed */
2858    0,                                  /* capas */
2859    NULL                                /* ok_fn */
2860};
2861
2862static
2863MDMINF GDC =            /* information for "GeneralDataComm 212A/ED" modem */
2864    {
2865    "GeneralDataComm 212A/ED",
2866    "",                                 /* pulse command */
2867    "",                                 /* tone command */
2868    32,                                 /* dial_time */
2869    "%",                                /* pause_chars */
2870    3,                                  /* pause_time */
2871    "\015\015",                         /* wake_str */
2872    500,                                /* wake_rate */
2873    "$",                                /* wake_prompt */
2874    "D\015",                            /* dmode_str */
2875    ":",                                /* dmode_prompt */
2876    "T%s\015",                          /* dial_str */
2877    0,                                  /* dial_rate */
2878    0,                                  /* esc_time */
2879    0,                                  /* esc_char */
2880    "",                                 /* hup_str */
2881    "",                                 /* hwfc_str */
2882    "",                                 /* swfc_str */
2883    "",                                 /* nofc_str */
2884    "",                                 /* ec_on_str */
2885    "",                                 /* ec_off_str */
2886    "",                                 /* dc_on_str */
2887    "",                                 /* dc_off_str */
2888    "",                                 /* aa_on_str */
2889    "",                                 /* aa_off_str */
2890    "",                                 /* sb_on_str */
2891    "",                                 /* sb_off_str */
2892    "",                                 /* sp_off_str */
2893    "",                                 /* sp_on_str */
2894    "",                                 /* vol1_str */
2895    "",                                 /* vol2_str */
2896    "",                                 /* vol3_str */
2897    "",                                 /* ignoredt */
2898    "",                                 /* ini2 */
2899    1200L,                              /* max_speed */
2900    0,                                  /* capas */
2901    NULL                                /* ok_fn */
2902};
2903
2904static
2905MDMINF PENRIL =         /* information for "Penril" modem */
2906    {
2907    "Penril modem",
2908    "",                                 /* pulse command */
2909    "",                                 /* tone command */
2910    50,                                 /* dial_time */
2911    "",                                 /* pause_chars */
2912    0,                                  /* pause_time */
2913    "\015\015",                         /* wake_str */
2914    300,                                /* wake_rate */
2915    ">",                                /* wake_prompt */
2916    "k\015",                            /* dmode_str */
2917    ":",                                /* dmode_prompt */
2918    "%s\015",                           /* dial_str */
2919    0,                                  /* dial_rate */
2920    0,                                  /* esc_time */
2921    0,                                  /* esc_char */
2922    "",                                 /* hup_str */
2923    "",                                 /* hwfc_str */
2924    "",                                 /* swfc_str */
2925    "",                                 /* nofc_str */
2926    "",                                 /* ec_on_str */
2927    "",                                 /* ec_off_str */
2928    "",                                 /* dc_on_str */
2929    "",                                 /* dc_off_str */
2930    "",                                 /* aa_on_str */
2931    "",                                 /* aa_off_str */
2932    "",                                 /* sb_on_str */
2933    "",                                 /* sb_off_str */
2934    "",                                 /* sp_off_str */
2935    "",                                 /* sp_on_str */
2936    "",                                 /* vol1_str */
2937    "",                                 /* vol2_str */
2938    "",                                 /* vol3_str */
2939    "",                                 /* ignoredt */
2940    "",                                 /* ini2 */
2941    0L,                                 /* max_speed */
2942    0,                                  /* capas */
2943    NULL                                /* ok_fn */
2944};
2945
2946static
2947MDMINF RACAL =                          /* Racal Vadic VA4492E */
2948    {
2949    "Racal Vadic VA4492E",
2950    "",                                 /* pulse command */
2951    "",                                 /* tone command */
2952    35,                 /* dial_time (manual says modem is hardwired to 60) */
2953    "Kk",                               /* pause_chars */
2954    5,                                  /* pause_time */
2955    "\005\015",                         /* wake_str, ^E^M */
2956    50,                                 /* wake_rate */
2957    "*",                                /* wake_prompt */
2958    "D\015",                            /* dmode_str */
2959    "?",                                /* dmode_prompt */
2960    "%s\015",                           /* dial_str */
2961    0,                                  /* dial_rate */
2962    1100,                               /* esc_time */
2963    5,                                  /* esc_char, ^E */
2964    "\003\004",                         /* hup_str, ^C^D */
2965    0,                                  /* hwfc_str */
2966    "",                                 /* swfc_str */
2967    "",                                 /* nofc_str */
2968    "",                                 /* ec_on_str */
2969    "",                                 /* ec_off_str */
2970    "",                                 /* dc_on_str */
2971    "",                                 /* dc_off_str */
2972    "",                                 /* aa_on_str */
2973    "",                                 /* aa_off_str */
2974    "",                                 /* sb_on_str */
2975    "",                                 /* sb_off_str */
2976    "",                                 /* sp_off_str */
2977    "",                                 /* sp_on_str */
2978    "",                                 /* vol1_str */
2979    "",                                 /* vol2_str */
2980    "",                                 /* vol3_str */
2981    "",                                 /* ignoredt */
2982    "",                                 /* ini2 */
2983    0L,                                 /* max_speed */
2984    0,                                  /* capas */
2985    NULL                                /* ok_fn */
2986};
2987
2988static
2989MDMINF VENTEL =                         /* Information for Ven-Tel modem */
2990    {
2991    "Ven-Tel",
2992    "",                                 /* pulse command */
2993    "",                                 /* tone command */
2994    20,                                 /* dial_time */
2995    "%",                                /* pause_chars */
2996    5,                                  /* pause_time */
2997    "\015\015\015",                     /* wake_str */
2998    300,                                /* wake_rate */
2999    "$",                                /* wake_prompt */
3000    "K\015",                            /* dmode_str (was "") */
3001    "Number to call: ",                 /* dmode_prompt (was NULL) */
3002    "%s\015",                           /* dial_str (was "<K%s\r>") */
3003    0,                                  /* dial_rate */
3004    0,                                  /* esc_time */
3005    0,                                  /* esc_char */
3006    "",                                 /* hup_str */
3007    "",                                 /* hwfc_str */
3008    "",                                 /* swfc_str */
3009    "",                                 /* nofc_str */
3010    "",                                 /* ec_on_str */
3011    "",                                 /* ec_off_str */
3012    "",                                 /* dc_on_str */
3013    "",                                 /* dc_off_str */
3014    "",                                 /* aa_on_str */
3015    "",                                 /* aa_off_str */
3016    "",                                 /* sb_on_str */
3017    "",                                 /* sb_off_str */
3018    "",                                 /* sp_off_str */
3019    "",                                 /* sp_on_str */
3020    "",                                 /* vol1_str */
3021    "",                                 /* vol2_str */
3022    "",                                 /* vol3_str */
3023    "",                                 /* ignoredt */
3024    "",                                 /* ini2 */
3025    0L,                                 /* max_speed */
3026    0,                                  /* capas */
3027    NULL                                /* ok_fn */
3028};
3029
3030static
3031MDMINF CONCORD =        /* Info for Condor CDS 220 2400b modem */
3032    {
3033    "Concord Condor CDS 220 2400b",
3034    "",                                 /* pulse command */
3035    "",                                 /* tone command */
3036    35,                                 /* dial_time */
3037    ",",                                /* pause_chars */
3038    2,                                  /* pause_time */
3039    "\015\015",                         /* wake_str */
3040    20,                                 /* wake_rate */
3041    "CDS >",                            /* wake_prompt */
3042    "",                                 /* dmode_str */
3043    NULL,                               /* dmode_prompt */
3044    "<D M%s\015>",                      /* dial_str */
3045    0,                                  /* dial_rate */
3046    0,                                  /* esc_time */
3047    0,                                  /* esc_char */
3048    "",                                 /* hup_str */
3049    "",                                 /* hwfc_str */
3050    "",                                 /* swfc_str */
3051    "",                                 /* nofc_str */
3052    "",                                 /* ec_on_str */
3053    "",                                 /* ec_off_str */
3054    "",                                 /* dc_on_str */
3055    "",                                 /* dc_off_str */
3056    "",                                 /* aa_on_str */
3057    "",                                 /* aa_off_str */
3058    "",                                 /* sb_on_str */
3059    "",                                 /* sb_off_str */
3060    "",                                 /* sp_off_str */
3061    "",                                 /* sp_on_str */
3062    "",                                 /* vol1_str */
3063    "",                                 /* vol2_str */
3064    "",                                 /* vol3_str */
3065    "",                                 /* ignoredt */
3066    "",                                 /* ini2 */
3067    2400L,                              /* max_speed */
3068    0,                                  /* capas */
3069    NULL                                /* ok_fn */
3070};
3071#endif /* OLDMODEMS */
3072
3073static
3074MDMINF MICROCOM =       /* Microcom modems in native SX mode */
3075                        /* (long answer only) */
3076{
3077    "Microcom MNP modems in SX command mode",
3078    "DP\015",                           /* pulse command */
3079    "DT\015",                           /* tone command */
3080    35,                                 /* dial_time */
3081    ",!@",              /* pause_chars (! and @ aren't pure pauses) */
3082    3,                                  /* pause_time */
3083/*
3084  The following sets 8 bits, no parity, BREAK passthru, and SE0 disables the
3085  escape character, which is a single character with no guard time, totally
3086  unsafe, so we have no choice but to disable it.  Especially since, by
3087  default, it is Ctrl-A, which is Kermit's packet-start character.  We would
3088  change it to something else, which would enable "mdmhup()", but the user
3089  wouldn't know about it.  Very bad.  Note: SE1 sets it to Ctrl-A, SE2
3090  sets it to Ctrl-B, etc (1..31 allowed).  Also SE/Q sets it to "Q".
3091*/
3092    "SE0;S1P4;SBRK5\015",               /* wake_str */
3093    100,                                /* wake_rate */
3094    "!",                                /* wake_prompt */
3095    "",                                 /* dmode_str */
3096    NULL,                               /* dmode_prompt */
3097    "D%s\015",                          /* dial_str - number up to 39 chars */
3098    0,                                  /* dial_rate */
3099    0,                                  /* esc_time */
3100    0,                                  /* esc_char - we can't use this */
3101    "",                                 /* hup_str - it's "H" but can't use */
3102    "SF13\015",                         /* hwfc_str */
3103    "SF11\015",                         /* swfc_str */
3104    "SF10\015",                         /* nofc_str */
3105    "BAOFF;SMAUT\015",                  /* ec_on_str */
3106    "BAON;SMDIR\015",                   /* ec_off_str */
3107    "COMP1\015",                        /* dc_on_str */
3108    "COMP0\015",                        /* dc_off_str */
3109    "AA",                               /* aa_on_str */
3110    "",                                 /* aa_off_str */
3111    "",                                 /* sb_on_str */
3112    "",                                 /* sb_off_str */
3113    "SA2",                              /* sp_off_str */
3114    "SA0",                              /* sp_on_str */
3115    "",                                 /* vol1_str */
3116    "",                                 /* vol2_str */
3117    "",                                 /* vol3_str */
3118    "",                                 /* ignoredt */
3119    "",                                 /* ini2 */
3120    0L,                                 /* max_speed */
3121    CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW|CKD_KS, /* capas */
3122    getok                               /* ok_fn */
3123};
3124
3125static
3126MDMINF MICROLINK =                      /* MicroLink ... */
3127    {                                   /* 14.4TQ,TL,PC;28.8TQ,TQV;2440T/TR */
3128    "ELSA MicroLink 14.4, 28.8, 33.6 or 56K", /* ELSA GmbH, Aachen */
3129    "ATP\015",                          /* pulse command */
3130    "ATT\015",                          /* tone command */
3131    35,                                 /* dial_time */
3132    ",",                                /* pause_chars */
3133    2,                                  /* pause_time */
3134#ifdef OS2
3135    "ATQ0E1V1X4&S0\\D0&C1&D2\\K5\015",  /* wake_str */
3136#else
3137#ifdef VMS
3138    "ATQ0X4&S1\\K5\015",                /* wake_str */
3139#else
3140    "ATQ0X4\\K5\015",                   /* wake_str */
3141#endif /* VMS */
3142#endif /* OS2 */
3143    0,                                  /* wake_rate */
3144    "OK\015",                           /* wake_prompt */
3145    "",                                 /* dmode_str */
3146    "",                                 /* dmode_prompt */
3147    "ATD%s\015",                        /* dial_str */
3148    0,                                  /* dial_rate */
3149    1100,                               /* esc_time */
3150    43,                                 /* esc_char */
3151    "ATQ0H\015",                        /* hup_str */
3152    "AT\\Q3\015",                       /* hwfc_str */
3153    "AT\\Q1\\X0\015",                   /* swfc_str */
3154    "AT\\Q0\015",                       /* nofc_str */
3155    "AT\\N3\015",                       /* ec_on_str */
3156    "AT\\N0\015",                       /* ec_off_str */
3157    "AT%C3\015",                        /* dc_on_str */
3158    "AT%C0\015",                        /* dc_off_str */
3159    "ATS0=1\015",                       /* aa_on_str */
3160    "ATS0=0\015",                       /* aa_off_str */
3161    "\\J0",                             /* sb_on_str (?) */
3162    "",                                 /* sb_off_str */
3163    "ATM1\015",                         /* sp_on_str */
3164    "ATM0\015",                         /* sp_off_str */
3165    "ATL1\015",                         /* vol1_str */
3166    "ATL2\015",                         /* vol2_str */
3167    "ATL3\015",                         /* vol3_str */
3168    "ATX3\015",                         /* ignoredt */
3169    "",                                 /* ini2 */
3170    57600L,                             /* max_speed */
3171    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3172    getok                               /* ok_fn */
3173};
3174
3175static
3176MDMINF ULINKV250 =                      /* MicroLink V.250 */
3177    {                                   /* 56Kflex, V.90; V.250 command set */
3178    "ELSA MicroLink 56K V.250",         /* ELSA GmbH, Aachen */
3179    "ATP\015",                          /* pulse command */
3180    "ATT\015",                          /* tone command */
3181    35,                                 /* dial_time */
3182    ",",                                /* pause_chars */
3183    2,                                  /* pause_time */
3184#ifdef OS2
3185    /* \D0 = DSR & CTS always on but hwfc overrides on CTS. */
3186    "ATQ0E1V1X4&S0\\D0&C1&D2\015",      /* wake_str */
3187#else
3188#ifdef VMS
3189    "ATQ0X4&S1\015",                    /* wake_str */
3190#else
3191    "ATQ0X4\015",                       /* wake_str */
3192#endif /* VMS */
3193#endif /* OS2 */
3194    0,                                  /* wake_rate */
3195    "OK\015",                           /* wake_prompt */
3196    "",                                 /* dmode_str */
3197    "",                                 /* dmode_prompt */
3198    "ATD%s\015",                        /* dial_str */
3199    0,                                  /* dial_rate */
3200    1100,                               /* esc_time */
3201    43,                                 /* esc_char */
3202    "ATQ0H0\015",                       /* hup_str */
3203    "AT+IFC=2,2\015",                   /* hwfc_str */
3204    "AT+IFC=1,1\015",                   /* swfc_str */
3205    "AT+IFC=0,0\015",                   /* nofc_str */
3206    "AT+ES=3,0\015",                    /* ec_on_str */
3207    "AT+ES=1,0\015",                    /* ec_off_str */
3208    "AT+DS=3,0,2048,32\015",            /* dc_on_str */
3209    "AT+DS=0,0\015",                    /* dc_off_str */
3210
3211    "ATS0=1\015",                       /* aa_on_str */
3212    "ATS0=0\015",                       /* aa_off_str */
3213    "",                                 /* sb_on_str (?) */
3214    "",                                 /* sb_off_str */
3215    "ATM1\015",                         /* sp_on_str */
3216    "ATM0\015",                         /* sp_off_str */
3217    "ATL1\015",                         /* vol1_str */
3218    "ATL2\015",                         /* vol2_str */
3219    "ATL3\015",                         /* vol3_str */
3220    "ATX3\015",                         /* ignoredt */
3221    "",                                 /* ini2 */
3222    57600L,                             /* max_speed */
3223    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3224    getok                               /* ok_fn */
3225};
3226#endif /* MINIDIAL */
3227
3228static
3229MDMINF ITUTV250 =                       /* ITU-T V.250 conforming modem */
3230{
3231    "Any ITU-T V.25ter/V.250 conformant modem",
3232    "ATP\015",                          /* pulse command */
3233    "ATT\015",                          /* tone command */
3234    35,                                 /* dial_time */
3235    ",",                                /* pause_chars */
3236    2,                                  /* pause_time */
3237    "ATQ0E1V1X4&C1&D2\015",             /* wake_str (no &Sn in V.25) */
3238    0,                                  /* wake_rate */
3239    "OK\015",                           /* wake_prompt */
3240    "",                                 /* dmode_str */
3241    "",                                 /* dmode_prompt */
3242    "ATD%s\015",                        /* dial_str */
3243    0,                                  /* dial_rate */
3244    1100,                               /* esc_time */
3245    43,                                 /* esc_char */
3246    "ATQ0H0\015",                       /* hup_str */
3247    "AT+IFC=2,2\015",                   /* hwfc_str */
3248    "AT+IFC=1,1\015",                   /* swfc_str */
3249    "AT+IFC=0,0\015",                   /* nofc_str */
3250    "AT+ES=3,0,2;+EB=1,0,30\015",       /* ec_on_str */
3251    "AT+ES=0\015",                      /* ec_off_str */
3252    "AT+DS=3,0\015",                    /* dc_on_str */
3253    "AT+DS=0,0\015",                    /* dc_off_str */
3254    "ATS0=1\015",                       /* aa_on_str */
3255    "ATS0=0\015",                       /* aa_off_str */
3256    "",                                 /* sb_on_str */
3257    "",                                 /* sb_off_str */
3258    "ATM1\015",                         /* sp_on_str */
3259    "ATM0\015",                         /* sp_off_str */
3260    "ATL1\015",                         /* vol1_str */
3261    "ATL2\015",                         /* vol2_str */
3262    "ATL3\015",                         /* vol3_str */
3263    "ATX3\015",                         /* ignoredt */
3264    "",                                 /* ini2 */
3265    57600L,                             /* max_speed */
3266    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3267    getok                               /* ok_fn */
3268};
3269
3270#ifndef CK_TAPI
3271static
3272#endif /* CK_TAPI */
3273MDMINF GENERIC =                        /* Generic high speed ... */
3274    {
3275    "Generic high-speed AT command set",
3276    "ATP\015",                          /* pulse command */
3277    "ATT\015",                          /* tone command */
3278    35,                                 /* dial_time */
3279    ",",                                /* pause_chars */
3280    2,                                  /* pause_time */
3281    "",                                 /* wake_str */
3282    0,                                  /* wake_rate */
3283    "",                                 /* wake_prompt */
3284    "",                                 /* dmode_str */
3285    "",                                 /* dmode_prompt */
3286    "ATD%s\015",                        /* dial_str */
3287    0,                                  /* dial_rate */
3288    1100,                               /* esc_time */
3289    43,                                 /* esc_char */
3290    "ATQ0H0\015",                       /* hup_str */
3291    "",                                 /* hwfc_str */
3292    "",                                 /* swfc_str */
3293    "",                                 /* nofc_str */
3294    "",                                 /* ec_on_str */
3295    "",                                 /* ec_off_str */
3296    "",                                 /* dc_on_str */
3297    "",                                 /* dc_off_str */
3298    "ATS0=1\015",                       /* aa_on_str */
3299    "ATS0=0\015",                       /* aa_off_str */
3300    "",                                 /* sb_on_str */
3301    "",                                 /* sb_off_str */
3302    "",                                 /* sp_on_str */
3303    "",                                 /* sp_off_str */
3304    "",                                 /* vol1_str */
3305    "",                                 /* vol2_str */
3306    "",                                 /* vol3_str */
3307    "ATX3\015",                         /* ignoredt */
3308    "",                                 /* ini2 */
3309    115200,                             /* max_speed */
3310    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW, /* capas */
3311    getok                               /* ok_fn */
3312};
3313
3314#ifndef MINIDIAL
3315static
3316MDMINF XJACK =                          /* Megahertz X-Jack */
3317    {
3318    "Megahertz X-Jack XJ3144 / CC6144",
3319    "ATP\015",                          /* pulse command */
3320    "ATT\015",                          /* tone command */
3321    35,                                 /* dial_time */
3322    ",",                                /* pause_chars */
3323    2,                                  /* pause_time */
3324#ifdef OS2
3325    "ATQ0E1V1X4N1&C1&D2\\K5\015",       /* wake_str */
3326#else
3327    "ATQ0X4N1\\K5\015",                 /* wake_str */
3328#endif /* OS2 */
3329    0,                                  /* wake_rate */
3330    "OK\015",                           /* wake_prompt */
3331    "",                                 /* dmode_str */
3332    "",                                 /* dmode_prompt */
3333    "ATD%s\015",                        /* dial_str */
3334    0,                                  /* dial_rate */
3335    1100,                               /* esc_time */
3336    43,                                 /* esc_char */
3337    "ATQ0H\015",                        /* hup_str */
3338    "AT&K3\015",                        /* hwfc_str */
3339    "AT&K4\015",                        /* swfc_str */
3340    "AT&K0\015",                        /* nofc_str */
3341    "AT\\N3&Q5\015",                    /* ec_on_str */
3342    "AT\\N1&Q0\015",                    /* ec_off_str */
3343    "AT%C3\015",                        /* dc_on_str */
3344    "AT%C0\015",                        /* dc_off_str */
3345    "ATS0=1\015",                       /* aa_on_str */
3346    "ATS0=0\015",                       /* aa_off_str */
3347    "",                                 /* sb_on_str */
3348    "",                                 /* sb_off_str */
3349    "ATM1\015",                         /* sp_on_str */
3350    "ATM0\015",                         /* sp_off_str */
3351    "ATL1\015",                         /* vol1_str */
3352    "ATL2\015",                         /* vol2_str */
3353    "ATL3\015",                         /* vol3_str */
3354    "ATX3\015",                         /* ignoredt */
3355    "",                                 /* ini2 */
3356    57600L,                             /* max_speed */
3357    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3358    getok                               /* ok_fn */
3359};
3360
3361static
3362MDMINF SPIRITII =                       /* QuickComm Spirit II */
3363    {
3364    "QuickComm Spirit II",
3365    "ATP\015",                          /* pulse command */
3366    "ATT\015",                          /* tone command */
3367    35,                                 /* dial_time */
3368    ",",                                /* pause_chars */
3369    2,                                  /* pause_time */
3370    "AT&F\015",                         /* wake_str */
3371    0,                                  /* wake_rate */
3372    "OK\015",                           /* wake_prompt */
3373    "",                                 /* dmode_str */
3374    "",                                 /* dmode_prompt */
3375    "ATD%s\015",                        /* dial_str */
3376    0,                                  /* dial_rate */
3377    1100,                               /* esc_time */
3378    43,                                 /* esc_char */
3379    "ATQ0H\015",                        /* hup_str */
3380    "AT*F3\015",                        /* hwfc_str */
3381    "AT*F2\015",                        /* swfc_str */
3382    "AT*F0\015",                        /* nofc_str */
3383    "AT*E6\015",                        /* ec_on_str */
3384    "AT*E0\015",                        /* ec_off_str */
3385    "AT*E9\015",                        /* dc_on_str */
3386    "AT*E0\015",                        /* dc_off_str */
3387    "ATS0=2\015",                       /* aa_on_str */
3388    "ATS0=0\015",                       /* aa_off_str */
3389    "",                                 /* sb_on_str */
3390    "",                                 /* sb_off_str */
3391    "ATM1\015",                         /* sp_on_str */
3392    "ATM0\015",                         /* sp_off_str */
3393    "ATL1\015",                         /* vol1_str */
3394    "ATL2\015",                         /* vol2_str */
3395    "ATL3\015",                         /* vol3_str */
3396    "ATX3\015",                         /* ignoredt */
3397    "",                                 /* ini2 */
3398    57600L,                             /* max_speed */
3399    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3400    getok                               /* ok_fn */
3401};
3402
3403static
3404MDMINF MONTANA = {                      /* Motorola Montana */
3405    "Motorola Montana",                 /* Name */
3406    "ATP\015",                          /* pulse command */
3407    "ATT\015",                          /* tone command */
3408    35,                                 /* dial_time */
3409    ",",                                /* pause_chars */
3410    2,                                  /* pause_time */
3411#ifdef OS2
3412    "ATQ0E1V1X4&S0&C1&D2\\K5\\V1\015",  /* wake_str */
3413#else
3414#ifdef VMS
3415    "ATQ0E1X4&S1\\K5\\V1\015",          /* wake_str */
3416#else
3417    "ATQ0E1X4\\K5\\V1\015",             /* wake_str */
3418#endif /* VMS */
3419#endif /* OS2 */
3420    0,                                  /* wake_rate */
3421    "OK\015",                           /* wake_prompt */
3422    "",                                 /* dmode_str */
3423    "",                                 /* dmode_prompt */
3424    "ATD%s\015",                        /* dial_str */
3425    0,                                  /* dial_rate */
3426    1100,                               /* esc_time */
3427    43,                                 /* esc_char */
3428    "ATQ0H0\015",                       /* hup_str */
3429    "AT\\Q3\015",                       /* hwfc_str */
3430    "AT\\Q1\015",                       /* swfc_str */
3431    "AT\\Q0\015",                       /* nofc_str */
3432    "AT\\N4\015",                       /* ec_on_str */
3433    "AT\\N1\015",                       /* ec_off_str */
3434    "AT%C1\015",                        /* dc_on_str */
3435    "AT%C0\015",                        /* dc_off_str */
3436    "ATS0=1\015",                       /* aa_on_str */
3437    "ATS0=0\015",                       /* aa_off_str */
3438    "AT\\J0\015",                       /* sb_on_str */
3439    "AT\\J1\015",                       /* sb_off_str */
3440    "ATM1\015",                         /* sp_on_str */
3441    "ATM0\015",                         /* sp_off_str */
3442    "ATL1\015",                         /* vol1_str */
3443    "ATL2\015",                         /* vol2_str */
3444    "ATL3\015",                         /* vol3_str */
3445    "ATX3\015",                         /* ignoredt */
3446    "",                                 /* ini2 */
3447    57600L,                             /* max_speed */
3448    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3449    getok                               /* ok_fn */
3450};
3451
3452static
3453MDMINF COMPAQ = {                       /* Compaq Data+Fax Modem */
3454    "Compaq Data+Fax Modem",            /* Name */
3455    "ATP\015",                          /* pulse command */
3456    "ATT\015",                          /* tone command */
3457    35,                                 /* dial_time */
3458    ",",                                /* pause_chars */
3459    2,                                  /* pause_time */
3460#ifdef OS2
3461    "ATQ0E1V1X4&S0&C1&D2\015",          /* wake_str */
3462#else
3463#ifdef VMS
3464    "ATQ0E1X4&S1\015",                  /* wake_str */
3465#else
3466    "ATQ0E1X4\015",                     /* wake_str */
3467#endif /* VMS */
3468#endif /* OS2 */
3469    0,                                  /* wake_rate */
3470    "OK\015",                           /* wake_prompt */
3471    "",                                 /* dmode_str */
3472    "",                                 /* dmode_prompt */
3473    "ATD%s\015",                        /* dial_str */
3474    0,                                  /* dial_rate */
3475    1100,                               /* esc_time */
3476    43,                                 /* esc_char */
3477    "ATQ0H0\015",                       /* hup_str */
3478    "AT\\Q3\015",                       /* hwfc_str (same as &K3) */
3479    "AT\\Q1\015",                       /* swfc_str (same as &K4) */
3480    "AT\\Q0\015",                       /* nofc_str (same as &K0) */
3481    "AT\\N3\015",                       /* ec_on_str */
3482    "AT\\N0\015",                       /* ec_off_str */
3483    "AT%C1\015",                        /* dc_on_str */
3484    "AT%C0\015",                        /* dc_off_str */
3485    "ATS0=1\015",                       /* aa_on_str */
3486    "ATS0=0\015",                       /* aa_off_str */
3487    "AT\\N3\015",                       /* sb_on_str */
3488    "AT\\N1\015",                       /* sb_off_str */
3489    "ATM1\015",                         /* sp_on_str */
3490    "ATM0\015",                         /* sp_off_str */
3491    "ATL0\015",                         /* vol1_str */
3492    "ATL2\015",                         /* vol2_str */
3493    "ATL3\015",                         /* vol3_str */
3494    "ATX3\015",                         /* ignoredt */
3495    "",                                 /* ini2 */
3496    115200L,                            /* max_speed */
3497    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3498    getok                               /* ok_fn */
3499};
3500
3501
3502static
3503MDMINF FUJITSU = {                      /* Fujitsu */
3504    "Fujitsu Fax/Modem Adapter",        /* Name */
3505    "ATP\015",                          /* pulse command */
3506    "ATT\015",                          /* tone command */
3507    35,                                 /* dial_time */
3508    ",",                                /* pause_chars */
3509    2,                                  /* pause_time */
3510#ifdef OS2
3511    "ATQ0E1V1X4&S0&C1&D2\\K5\\N3\015",  /* wake_str */
3512#else
3513#ifdef VMS
3514    "ATQ0E1X4&S1\\K5\\N3\015",          /* wake_str */
3515#else
3516    "ATQ0E1X4\\K5\\N3\015",             /* wake_str */
3517#endif /* VMS */
3518#endif /* OS2 */
3519    0,                                  /* wake_rate */
3520    "OK\015",                           /* wake_prompt */
3521    "",                                 /* dmode_str */
3522    "",                                 /* dmode_prompt */
3523    "ATD%s\015",                        /* dial_str */
3524    0,                                  /* dial_rate */
3525    1100,                               /* esc_time */
3526    43,                                 /* esc_char */
3527    "ATQ0H0\015",                       /* hup_str */
3528    "AT&K3\\Q3\015",                    /* hwfc_str */
3529    "AT&K4\\Q1\015",                    /* swfc_str */
3530    "AT&K0\\Q0\015",                    /* nofc_str */
3531    "AT\\N3\015",                       /* ec_on_str */
3532    "AT\\N0\015",                       /* ec_off_str */
3533    "AT%C1",                            /* dc_on_str */
3534    "AT%C0",                            /* dc_off_str */
3535    "ATS0=1\015",                       /* aa_on_str */
3536    "ATS0=0\015",                       /* aa_off_str */
3537    "AT\\J0\015",                       /* sb_on_str */
3538    "AT\\J1\015",                       /* sb_off_str */
3539    "ATM1\015",                         /* sp_on_str */
3540    "ATM0\015",                         /* sp_off_str */
3541    "ATL1\015",                         /* vol1_str */
3542    "ATL2\015",                         /* vol2_str */
3543    "ATL3\015",                         /* vol3_str */
3544    "ATX3\015",                         /* ignoredt */
3545    "",                                 /* ini2 */
3546    115200L,                            /* max_speed */
3547    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3548    getok                               /* ok_fn */
3549};
3550
3551static
3552MDMINF MHZATT =                         /* Megahertz AT&T V.34 */
3553    {
3554    "Megahertz AT&T V.34",
3555    "ATP\015",                          /* pulse command */
3556    "ATT\015",                          /* tone command */
3557    35,                                 /* dial_time */
3558    ",",                                /* pause_chars */
3559    2,                                  /* pause_time */
3560#ifdef OS2
3561    "ATQ0E1V1X4N1&C1&D2\\K5\015",       /* wake_str */
3562#else
3563    "ATQ0X4N1\\K5\015",                 /* wake_str */
3564#endif /* OS2 */
3565    0,                                  /* wake_rate */
3566    "OK\015",                           /* wake_prompt */
3567    "",                                 /* dmode_str */
3568    "",                                 /* dmode_prompt */
3569    "ATD%s\015",                        /* dial_str */
3570    0,                                  /* dial_rate */
3571    1100,                               /* esc_time */
3572    43,                                 /* esc_char */
3573    "ATQ0H\015",                        /* hup_str */
3574    "AT&K3\015",                        /* hwfc_str */
3575    "AT&K4\015",                        /* swfc_str */
3576    "AT&K0\015",                        /* nofc_str */
3577    "AT\\N3\015",                       /* ec_on_str */
3578    "AT\\N0\015",                       /* ec_off_str */
3579    "AT%C1\"H3\015",                    /* dc_on_str */
3580    "AT%C0\"H0\015",                    /* dc_off_str */
3581    "ATS0=1\015",                       /* aa_on_str */
3582    "ATS0=0\015",                       /* aa_off_str */
3583    "AT\\J0\015",                       /* sb_on_str */
3584    "AT\\J1\015",                       /* sb_off_str */
3585    "ATM1\015",                         /* sp_on_str */
3586    "ATM0\015",                         /* sp_off_str */
3587    "ATL1\015",                         /* vol1_str */
3588    "ATL2\015",                         /* vol2_str */
3589    "ATL3\015",                         /* vol3_str */
3590    "ATX3\015",                         /* ignoredt */
3591    "",                                 /* ini2 */
3592    115200L,                            /* max_speed */
3593    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3594    getok                               /* ok_fn */
3595};
3596
3597static
3598MDMINF SUPRASON =                       /* SupraSonic */
3599    {
3600    "Diamond SupraSonic 288V+",         /* Diamond Multimedia Systems Inc */
3601    "ATP\015",                          /* pulse command */
3602    "ATT\015",                          /* tone command */
3603    35,                                 /* dial_time */
3604    ",",                                /* pause_chars */
3605    2,                                  /* pause_time */
3606#ifdef OS2
3607    "ATQ0E1V1N1W0X4Y0&S0&C1&D2\015",    /* wake_str */
3608#else
3609#ifdef VMS
3610    "ATQ0E1N1W0X4Y0&S1\015",            /* wake_str */
3611#else
3612    "ATQ0E1N1W0X4Y0\015",               /* wake_str */
3613#endif /* VMS */
3614#endif /* OS2 */
3615    0,                                  /* wake_rate */
3616    "OK\015",                           /* wake_prompt */
3617    "",                                 /* dmode_str */
3618    "",                                 /* dmode_prompt */
3619    "ATD%s\015",                        /* dial_str */
3620    0,                                  /* dial_rate */
3621    1100,                               /* esc_time */
3622    43,                                 /* esc_char */
3623    "ATQ0H0\015",                       /* hup_str */
3624    "AT&K3\015",                        /* hwfc_str */
3625    "AT&K4\015",                        /* swfc_str */
3626    "AT&K\015",                         /* nofc_str */
3627    "AT&Q5\\N3S48=7\015",               /* ec_on_str */
3628    "AT&Q0\\N1\015",                    /* ec_off_str */
3629    "AT%C3S46=138\015",                 /* dc_on_str */
3630    "AT%C0S46=136\015",                 /* dc_off_str */
3631    "ATS0=1\015",                       /* aa_on_str */
3632    "ATS0=0\015",                       /* aa_off_str */
3633    "",                                 /* sb_on_str */
3634    "",                                 /* sb_off_str */
3635    "ATM1\015",                         /* sp_on_str */
3636    "ATM\015",                          /* sp_off_str */
3637    "ATL\015",                          /* vol1_str */
3638    "ATL2\015",                         /* vol2_str */
3639    "ATL3\015",                         /* vol3_str */
3640    "ATX3\015",                         /* ignoredt */
3641    "",                                 /* ini2 */
3642    115200L,                            /* max_speed */
3643    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3644    getok                               /* ok_fn */
3645};
3646
3647static
3648MDMINF BESTDATA =                       /* Best Data */
3649    {
3650    "Best Data Fax Modem",              /* Best Data Fax Modem */
3651    "ATP\015",                          /* pulse command */
3652    "ATT\015",                          /* tone command */
3653    35,                                 /* dial_time */
3654    ",",                                /* pause_chars */
3655    2,                                  /* pause_time */
3656#ifdef OS2
3657    "ATQ0E1V1N1W0X4Y0&S0&C1&D2\015",    /* wake_str */
3658#else
3659#ifdef VMS
3660    "ATQ0E1N1W0X4Y0&S1\015",            /* wake_str */
3661#else
3662    "ATQ0E1N1W0X4Y0\015",               /* wake_str */
3663#endif /* VMS */
3664#endif /* OS2 */
3665    0,                                  /* wake_rate */
3666    "OK\015",                           /* wake_prompt */
3667    "",                                 /* dmode_str */
3668    "",                                 /* dmode_prompt */
3669    "ATD%s\015",                        /* dial_str */
3670    0,                                  /* dial_rate */
3671    1100,                               /* esc_time */
3672    43,                                 /* esc_char */
3673    "ATQ0H0\015",                       /* hup_str */
3674    "AT&K3\015",                        /* hwfc_str */
3675    "AT&K4\015",                        /* swfc_str */
3676    "AT&K\015",                         /* nofc_str */
3677    "AT&Q6\\N3\015",                    /* ec_on_str */
3678    "AT&Q0\\N1\015",                    /* ec_off_str */
3679    "AT%C3\015",                        /* dc_on_str */
3680    "AT%C0\015",                        /* dc_off_str */
3681    "ATS0=1\015",                       /* aa_on_str */
3682    "ATS0=0\015",                       /* aa_off_str */
3683    "AT\\N3\015",                       /* sb_on_str */
3684    "AT\\N0\015",                       /* sb_off_str */
3685    "ATM1\015",                         /* sp_on_str */
3686    "ATM0\015",                         /* sp_off_str */
3687    "ATL1\015",                         /* vol1_str */
3688    "ATL2\015",                         /* vol2_str */
3689    "ATL3\015",                         /* vol3_str */
3690    "ATX3\015",                         /* ignoredt */
3691    "",                                 /* ini2 */
3692    57600L,                             /* max_speed */
3693    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3694    getok                               /* ok_fn */
3695};
3696
3697static
3698MDMINF ATT1900 =                        /* AT&T Secure Data STU III 1900 */
3699    {
3700    "AT&T Secure Data STU III Model 1900", /* name */
3701    "",                                 /* pulse command */
3702    "",                                 /* tone command */
3703    35,                                 /* dial_time */
3704    ",",                                /* pause_chars */
3705    2,                                  /* pause_time */
3706#ifdef OS2
3707    "ATQ0E1V1X4\015",                   /* wake_str */
3708#else
3709    "ATQ0E1X4\015",                     /* wake_str */
3710#endif /* OS2 */
3711    0,                                  /* wake_rate */
3712    "OK\015",                           /* wake_prompt */
3713    "",                                 /* dmode_str */
3714    "",                                 /* dmode_prompt */
3715    "ATD%s\015",                        /* dial_str */
3716    0,                                  /* dial_rate */
3717    1100,                               /* esc_time */
3718    43,                                 /* esc_char */
3719    "ATQ0H0\015",                       /* hup_str */
3720    "",                                 /* hwfc_str */
3721    "",                                 /* swfc_str */
3722    "",                                 /* nofc_str */
3723    "",                                 /* ec_on_str */
3724    "",                                 /* ec_off_str */
3725    "",                                 /* dc_on_str */
3726    "",                                 /* dc_off_str */
3727    "ATS0=1\015",                       /* aa_on_str */
3728    "ATS0=0\015",                       /* aa_off_str */
3729    "",                                 /* sb_on_str */
3730    "",                                 /* sb_off_str */
3731    "",                                 /* sp_on_str */
3732    "",                                 /* sp_off_str */
3733    "",                                 /* vol1_str */
3734    "",                                 /* vol2_str */
3735    "",                                 /* vol3_str */
3736    "",                                 /* ignoredt */
3737    "",                                 /* ini2 */
3738    9600L,                              /* max_speed */
3739    CKD_AT|CKD_SB|CKD_HW,               /* capas */
3740    getok                               /* ok_fn */
3741};
3742
3743/*
3744  Experimentation showed that hardly any of the documented commands did
3745  anything other that print ERROR.  At first there was no communication at
3746  all at 9600 bps -- turns out the interface speed was stuck at 2400.
3747  ATS28=130 (given at 2400 bps) allowed it to work at 9600.
3748*/
3749static
3750MDMINF ATT1910 =                        /* AT&T Secure Data STU III 1910 */
3751    {                                   /* Adds V.32bis, V.42, V.42bis */
3752    "AT&T Secure Data STU III Model 1910", /* name */
3753
3754/* Believe it or not, "ATT" and "ATP" result in ERROR */
3755
3756    "",                                 /* pulse command */
3757    "",                                 /* tone command */
3758    35,                                 /* dial_time */
3759    ",",                                /* pause_chars */
3760    2,                                  /* pause_time */
3761#ifdef OS2
3762    "ATQ0E1V1X4\015",                   /* wake_str */
3763#else
3764    "ATQ0E1X4\015",                     /* wake_str */
3765#endif /* OS2 */
3766    0,                                  /* wake_rate */
3767    "OK\015",                           /* wake_prompt */
3768    "",                                 /* dmode_str */
3769    "",                                 /* dmode_prompt */
3770    "ATD%s\015",                        /* dial_str */
3771    0,                                  /* dial_rate */
3772    1100,                               /* esc_time */
3773    43,                                 /* esc_char */
3774    "ATQ0H0\015",                       /* hup_str */
3775    "",                                 /* hwfc_str */
3776    "",                                 /* swfc_str */
3777    "",                                 /* nofc_str */
3778#ifdef COMMENT
3779/* These are evidently read-only registers */
3780    "ATS46=138S47=0\015",               /* ec_on_str */
3781    "ATS46=138S47=128\015",             /* ec_off_str */
3782    "ATS46=138S47=0\015",               /* dc_on_str */
3783    "ATS46=138S47=128\015",             /* dc_off_str */
3784#else
3785    "",
3786    "",
3787    "",
3788    "",
3789#endif /* COMMENT */
3790    "ATS0=1\015",                       /* aa_on_str */
3791    "ATS0=0\015",                       /* aa_off_str */
3792    "",                                 /* sb_on_str */
3793    "",                                 /* sb_off_str */
3794    "",                                 /* sp_on_str */
3795    "",                                 /* sp_off_str */
3796    "",                                 /* vol1_str */
3797    "",                                 /* vol2_str */
3798    "",                                 /* vol3_str */
3799    "",                                 /* ignoredt */
3800    "",                                 /* ini2 */
3801    9600L,                              /* max_speed */
3802    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW, /* capas */
3803    getok                               /* ok_fn */
3804};
3805
3806static
3807MDMINF KEEPINTOUCH =                    /* AT&T KeepinTouch Card Modem */
3808    {
3809    "AT&T KeepinTouch V.32bis Card Modem", /* Name */
3810    "ATP\015",                          /* pulse command */
3811    "ATT\015",                          /* tone command */
3812    35,                                 /* dial_time */
3813    ",",                                /* pause_chars */
3814    2,                                  /* pause_time */
3815#ifdef OS2
3816/* This used to include &C1&S0&D2+Q0 but that gives ERROR */
3817    "ATQ0E1V1X4&S0&C1&D2\\K5\015",      /* wake_str */
3818#else
3819#ifdef VMS
3820    "ATQ0E1X4&S1\\K5\015",              /* wake_str */
3821#else
3822    "ATQ0E1X4\\K5\015",                 /* wake_str */
3823#endif /* VMS */
3824#endif /* OS2 */
3825    0,                                  /* wake_rate */
3826    "OK\015",                           /* wake_prompt */
3827    "",                                 /* dmode_str */
3828    "",                                 /* dmode_prompt */
3829    "ATD%s\015",                        /* dial_str */
3830    0,                                  /* dial_rate */
3831    1100,                               /* esc_time */
3832    43,                                 /* esc_char */
3833    "ATQ0H0\015",                       /* hup_str */
3834    "AT\\Q3\015",                       /* hwfc_str */
3835    "AT\\Q1\\X0\015",                   /* swfc_str */
3836    "AT\\Q0\015",                       /* nofc_str */
3837    "AT\\N3-J1\015",                    /* ec_on_str */
3838    "AT\\N1\015",                       /* ec_off_str */
3839    "AT%C3\"H3\015",                    /* dc_on_str */
3840    "AT%C0\"H0\015",                    /* dc_off_str */
3841    "ATS0=1\015",                       /* aa_on_str */
3842    "ATS0=0\015",                       /* aa_off_str */
3843    "ATN0\\J0\015",                     /* sb_on_str */
3844    "ATN1\\J1\015",                     /* sb_off_str */
3845    "ATM1\015",                         /* sp_on_str */
3846    "ATM0\015",                         /* sp_off_str */
3847    "",                                 /* vol1_str */
3848    "",                                 /* vol2_str */
3849    "",                                 /* vol3_str */
3850    "ATX3\015",                         /* ignoredt */
3851    "",                                 /* ini2 */
3852    57600L,                             /* max_speed */
3853    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3854    getok                               /* ok_fn */
3855};
3856
3857static
3858MDMINF ROLM_AT =                /* Rolm data phone with AT command set */
3859    {
3860    "Rolm 244PC or 600 Series with AT Command Set",
3861    "",                                 /* pulse command */
3862    "",                                 /* tone command */
3863    35,                                 /* dial_time */
3864    ",",                                /* pause_chars */
3865    2,                                  /* pause_time */
3866#ifdef OS2
3867    "ATE1Q0V1\015",                     /* wake_str */
3868#else
3869    "ATQ0\015",                         /* wake_str */
3870#endif /* OS2 */
3871    0,                                  /* wake_rate */
3872    "OK\015",                           /* wake_prompt */
3873    "",                                 /* dmode_str */
3874    "",                                 /* dmode_prompt */
3875    "ATDT%s\015",                       /* dial_str -- always Tone */
3876    0,                                  /* dial_rate */
3877    1100,                               /* esc_time */
3878    43,                                 /* esc_char */
3879    "ATQ0H0\015",                       /* hup_str */
3880    "",                                 /* hwfc_str */
3881    "",                                 /* swfc_str */
3882    "",                                 /* nofc_str */
3883    "",                                 /* ec_on_str */
3884    "",                                 /* ec_off_str */
3885    "",                                 /* dc_on_str */
3886    "",                                 /* dc_off_str */
3887    "ATS0=1\015",                       /* aa_on_str */
3888    "ATS0=0\015",                       /* aa_off_str */
3889    "",                                 /* sb_on_str */
3890    "",                                 /* sb_off_str */
3891    "",                                 /* sp_on_str */
3892    "",                                 /* sp_off_str */
3893    "",                                 /* vol1_str */
3894    "",                                 /* vol2_str */
3895    "",                                 /* vol3_str */
3896    "",                                 /* ignoredt */
3897    "",                                 /* ini2 */
3898    19200L,                             /* max_speed */
3899    CKD_AT,                             /* capas */
3900    getok                               /* ok_fn */
3901};
3902
3903static
3904MDMINF ATLAS =                          /* Atlas / Newcom ixfC 33.6 */
3905    {
3906    "Atlas / Newcom 33600ixfC Data/Fax Modem", /* Name */
3907    "ATP\015",                          /* pulse command */
3908    "ATT\015",                          /* tone command */
3909    35,                                 /* dial_time */
3910    ",",                                /* pause_chars */
3911    2,                                  /* pause_time */
3912#ifdef OS2
3913    "ATZ0&FQ0V1&C1&D2\015",             /* wake_str */
3914#else
3915    "ATZ0&FQ0V1\015",                   /* wake_str */
3916#endif /* OS2 */
3917    0,                                  /* wake_rate */
3918    "OK\015",                           /* wake_prompt */
3919    "",                                 /* dmode_str */
3920    "",                                 /* dmode_prompt */
3921    "ATD%s\015",                        /* dial_str */
3922    0,                                  /* dial_rate */
3923    1100,                               /* esc_time */
3924    43,                                 /* esc_char */
3925    "ATQ0H0\015",                       /* hup_str */
3926    "AT&K3\015",                        /* hwfc_str */
3927    "AT&K4\015",                        /* swfc_str */
3928    "AT&K0\015",                        /* nofc_str */
3929    "AT\"H3\015",                       /* ec_on_str */
3930    "AT\"H0\015",                       /* ec_off_str */
3931    "AT%C1\015",                        /* dc_on_str */
3932    "AT%C0\015",                        /* dc_off_str */
3933    "ATS0=1\015",                       /* aa_on_str */
3934    "ATS0=0\015",                       /* aa_off_str */
3935    "ATN0\\J0\015",                     /* sb_on_str */
3936    "ATN1\\J1\015",                     /* sb_off_str */
3937    "ATM1\015",                         /* sp_on_str */
3938    "ATM0\015",                         /* sp_off_str */
3939    "ATL1\015",                         /* vol1_str */
3940    "ATL2\015",                         /* vol2_str */
3941    "ATL3\015",                         /* vol3_str */
3942    "ATX3\015",                         /* ignoredt */
3943    "",                                 /* ini2 */
3944    115200L,                            /* max_speed */
3945    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3946    getok                               /* ok_fn */
3947};
3948
3949static
3950MDMINF CODEX = {                        /* Motorola Codex */
3951    "Motorola Codex 326X Series",       /* Name - AT&V to see settings */
3952    "ATP\015",                          /* pulse command */
3953    "ATT\015",                          /* tone command */
3954    35,                                 /* dial_time */
3955    ",",                                /* pause_chars */
3956    2,                                  /* pause_time */
3957#ifdef OS2
3958    /* &M0=Async (not sync) */
3959    /* *MM0=Automatic modulation negotiation */
3960    /* *DE22=Automatic data rate */
3961    "ATZQ0E1V1X4Y0*DE22*MM0&C1&M0&S0&D2\015", /* wake_str */
3962#else
3963#ifdef VMS
3964    "ATZQ0E1V1X4Y0*DE22*MM0&C1&M0&S1\015", /* wake_str */
3965#else
3966    "ATZQ0E1V1X4Y0*DE22*MM0&C1&M0\015", /* wake_str */
3967#endif /* VMS */
3968#endif /* OS2 */
3969    0,                                  /* wake_rate */
3970    "OK\015",                           /* wake_prompt */
3971    "",                                 /* dmode_str */
3972    "",                                 /* dmode_prompt */
3973    "ATD%s\015",                        /* dial_str */
3974    0,                                  /* dial_rate */
3975    1100,                               /* esc_time */
3976    43,                                 /* esc_char */
3977    "ATQ0H0\015",                       /* hup_str */
3978    "AT*MF1*FL3\015",                   /* hwfc_str */
3979    "AT*MF1*FL1\015",                   /* swfc_str */
3980    "AT*MF0*FL0\015",                   /* nofc_str */
3981    "AT*EC0*SM3*SC0\015",               /* ec_on_str */
3982    "AT*SM0\015",                       /* ec_off_str */
3983    "AT*DC1\015",                       /* dc_on_str */
3984    "AT*DC0\015",                       /* dc_off_str */
3985    "AT*AA5S0=1\015",                   /* aa_on_str */
3986    "AT*AA5S0=0\015",                   /* aa_off_str */
3987    "AT*SC1\015",                       /* sb_on_str */
3988    "AT*SC0\015",                       /* sb_off_str */
3989    "ATM1\015",                         /* sp_on_str */
3990    "ATM0\015",                         /* sp_off_str */
3991    "ATL1\015",                         /* vol1_str */
3992    "ATL2\015",                         /* vol2_str */
3993    "ATL3\015",                         /* vol3_str */
3994    "ATX3*BD2\015",                     /* ignoredt */
3995    "",                                 /* ini2 */
3996    115200L,                            /* max_speed */
3997    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
3998    getok                               /* ok_fn */
3999};
4000
4001static
4002MDMINF MT5634ZPX =                      /* Multitech */
4003    {
4004    "Multitech MT5634ZPX",              /* name */
4005    "ATP\015",                          /* pulse command */
4006    "ATT\015",                          /* tone command */
4007    35,                                 /* dial_time */
4008    ",",                                /* pause_chars */
4009    2,                                  /* pause_time */
4010#ifdef OS2
4011    "ATE1Q0V1X4&S0&C1&D2&Q0\015",       /* wake_str */
4012#else
4013#ifdef VMS
4014    "ATQ0E1X4&S1&Q0\015",               /* wake_str */
4015#else
4016    "ATQ0E1X4&Q0\015",                  /* wake_str */
4017#endif /* VMS */
4018#endif /* OS2 */
4019    0,                                  /* wake_rate */
4020    "OK\015",                           /* wake_prompt */
4021    "",                                 /* dmode_str */
4022    "",                                 /* dmode_prompt */
4023    "ATD%s\015",                        /* dial_str */
4024    0,                                  /* dial_rate */
4025    1100,                               /* esc_time */
4026    43,                                 /* esc_char */
4027    "ATQ0H0\015",                       /* hup_str */
4028    "AT&K3\015",                        /* hwfc_str */
4029    "AT&K4\015",                        /* swfc_str */
4030    "AT&K0\015",                        /* nofc_str */
4031    "AT\\N3\015",                       /* ec_on_str */
4032    "AT\\N1\015",                       /* ec_off_str */
4033    "AT%C1\015",                        /* dc_on_str */
4034    "AT%C0\015",                        /* dc_off_str */
4035    "ATS0=1\015",                       /* aa_on_str */
4036    "ATS0=0\015",                       /* aa_off_str */
4037    "AT\\J0\015",                       /* sb_on_str */
4038    "AT\\J1\015",                       /* sb_off_str (NOT SUPPORTED) */
4039    "ATM1\015",                         /* sp_on_str */
4040    "ATM0\015",                         /* sp_off_str */
4041    "ATL1\015",                         /* vol1_str */
4042    "ATL2\015",                         /* vol2_str */
4043    "ATL3\015",                         /* vol3_str */
4044    "ATX3\015",                         /* ignoredt */
4045    "",                                 /* ini2 */
4046    115200L,                            /* max_speed */
4047    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
4048    getok                               /* ok_fn */
4049};
4050
4051static
4052MDMINF MOTSM56 =                        /* Motorola SM56 Chipset */
4053    {
4054    "Motorola SM56 V.90 chipset",       /* name */
4055    "ATP\015",                          /* pulse command */
4056    "ATT\015",                          /* tone command */
4057    35,                                 /* dial_time */
4058    ",",                                /* pause_chars */
4059    2,                                  /* pause_time */
4060#ifdef OS2
4061    "ATQ0V1X4&S0&C1&D2*MM16\015",       /* wake_str */
4062#else
4063#ifdef VMS
4064    "ATQ0V1X4&S1&C1&D2*MM16\015",       /* wake_str */
4065#else
4066    "ATQ0V1X4&C1&D2*MM16\015",          /* wake_str */
4067#endif /* VMS */
4068#endif /* OS2 */
4069    0,                                  /* wake_rate */
4070    "OK\015",                           /* wake_prompt */
4071    "",                                 /* dmode_str */
4072    "",                                 /* dmode_prompt */
4073    "ATD%s\015",                        /* dial_str */
4074    0,                                  /* dial_rate */
4075    1100,                               /* esc_time */
4076    43,                                 /* esc_char */
4077    "ATQ0H0\015",                       /* hup_str */
4078    "AT\\Q3\015",                       /* hwfc_str */
4079    "AT\\Q1\015",                       /* swfc_str */
4080    "AT\\Q0\015",                       /* nofc_str */
4081    "AT\\N7\015",                       /* ec_on_str */
4082    "AT\\N1\015",                       /* ec_off_str */
4083    "AT%C1\015",                        /* dc_on_str */
4084    "AT%C0\015",                        /* dc_off_str */
4085    "ATS0=1\015",                       /* aa_on_str */
4086    "ATS0=0\015",                       /* aa_off_str */
4087    "AT\\J0\015",                       /* sb_on_str */
4088    "AT\\J1\015",                       /* sb_off_str (NOT SUPPORTED) */
4089    "ATM1\015",                         /* sp_on_str */
4090    "ATM0\015",                         /* sp_off_str */
4091    "ATL1\015",                         /* vol1_str */
4092    "ATL2\015",                         /* vol2_str */
4093    "ATL3\015",                         /* vol3_str */
4094    "ATX3\015",                         /* ignoredt */
4095    "",                                 /* ini2 */
4096    115200L,                            /* max_speed */
4097    CKD_AT|CKD_SB|CKD_EC|CKD_DC|CKD_HW|CKD_SW, /* capas */
4098    getok                               /* ok_fn */
4099};
4100#endif /* MINIDIAL */
4101
4102/* END MDMINF STRUCT DEFINITIONS */
4103
4104/*
4105  Table to convert modem numbers to MDMINF struct pointers.
4106  The entries MUST be in ascending order by modem number, without any
4107  "gaps" in the numbers, and starting from one (1).
4108*/
4109
4110MDMINF *modemp[] = {
4111#ifdef MINIDIAL
4112    NULL,                               /*  0 */
4113    &CCITT,                             /*  1 */
4114    &HAYES,                             /*  2 */
4115    &UNKNOWN,                           /*  3 */
4116    &DUMMY,                             /*  4 */
4117    &GENERIC,                           /*  5 */
4118    &ITUTV250                           /*  6 */
4119#else  /* Not MINIDIAL */
4120    NULL,                               /*  0 */
4121    &ATTDTDM,                           /*  1 */
4122    &ATTISN,                            /*  2 */
4123    &ATTMODEM,                          /*  3 */
4124    &CCITT,                             /*  4 */
4125#ifdef OLDMODEMS
4126    &CERMETEK,                          /*  5 */
4127    &DF03,                              /*  6 */
4128    &DF100,                             /*  7 */
4129    &DF200,                             /*  8 */
4130    &GDC,                               /*  9 */
4131#else
4132    NULL,
4133    NULL,
4134    NULL,
4135    NULL,
4136    NULL,
4137#endif /* OLDMODEMS */
4138    &HAYES,                             /* 10 */
4139#ifdef OLDMODEMS
4140    &PENRIL,                            /* 11 */
4141    &RACAL,                             /* 12 */
4142#else
4143    NULL,
4144    NULL,
4145#endif /* OLDMODEMS */
4146    &UNKNOWN,                           /* 13 */
4147#ifdef OLDMODEMS
4148    &VENTEL,                            /* 14 */
4149    &CONCORD,                           /* 15 */
4150#else
4151    NULL,
4152    NULL,
4153#endif /* OLDMODEMS */
4154    &DUMMY,                             /* 16 */
4155    &ROLM,                              /* 17 */
4156#ifdef OLDMODEMS
4157    &MICROCOM,                          /* 18 */
4158#else
4159    NULL,
4160#endif /* OLDMODEMS */
4161    &USR,                               /* 19 USR Courier and Sportster */
4162    &OLDTB,                             /* 20 Old Telebits */
4163    &DIGITEL,                           /* 21 Digitel CCITT */
4164    &H_1200,                            /* 22 Hayes 1200 */
4165    &H_ULTRA,                           /* 23 Hayes Ultra */
4166    &H_ACCURA,                          /* 24 Hayes Optima */
4167    &PPI,                               /* 25 PPI */
4168    &DATAPORT,                          /* 26 Dataport */
4169    &BOCA,                              /* 27 Boca */
4170    &MOTOROLA,                          /* 28 Motorola UDS MOTOROLA */
4171    NULL,                               /* 29 Digicomm */
4172    NULL,                               /* 30 Dynalink */
4173    &INTEL,                             /* 31 Intel */
4174    &UCOM_AT,                           /* 32 Microcom in AT mode */
4175    &MULTITECH,                         /* 33 Multitech */
4176    &SUPRA,                             /* 34 Supra */
4177    &ZOLTRIX,                           /* 35 Zoltrix */
4178    &ZOOM,                              /* 36 Zoom */
4179    &ZYXEL,                             /* 37 ZyXEL */
4180    &DUMMY,                             /* 38 TAPI */
4181    &NEWTB,                             /* 39 New-Telebit */
4182    &MAXTECH,                           /* 40 MaxTech */
4183    &DUMMY,                             /* 41 User-defined */
4184    &RWV32,                             /* 42 Rockwell V.32 */
4185    &RWV32B,                            /* 43 Rockwell V.32bis */
4186    &RWV34,                             /* 44 Rockwell V.34 */
4187    &MWAVE,                             /* 45 IBM Mwave */
4188    &TELEPATH,                          /* 46 Gateway 2000 Telepath II 28.8 */
4189    &MICROLINK,                         /* 47 MicroLink modems */
4190    &CARDINAL,                          /* 48 Cardinal */
4191    &GENERIC,                           /* 49 Generic high-speed */
4192    &XJACK,                             /* 50 Megahertz-Xjack */
4193    &SPIRITII,                          /* 51 QuickComm Spirit II */
4194    &MONTANA,                           /* 52 Motorola Montana */
4195    &COMPAQ,                            /* 53 Compaq Data+Fax */
4196    &FUJITSU,                           /* 54 Fujitsu */
4197    &MHZATT,                            /* 55 Megahertz AT&T V.34 */
4198    &SUPRASON,                          /* 56 Suprasonic */
4199    &BESTDATA,                          /* 57 Best Data */
4200    &ATT1900,                           /* 58 AT&T Secure Data STU III 1900 */
4201    &ATT1910,                           /* 59 AT&T Secure Data STU III 1910 */
4202    &KEEPINTOUCH,                       /* 60 AT&T KeepinTouch */
4203    &USRX2,                             /* 61 USR XJ-1560 X2 */
4204    &ROLM_AT,                           /* 62 Rolm with AT command set */
4205    &ATLAS,                             /* 63 Atlas / Newcom */
4206    &CODEX,                             /* 64 Motorola Codex */
4207    &MT5634ZPX,                         /* 65 Multitech MT5634ZPX */
4208    &ULINKV250,                         /* 66 Microlink V.250 56K */
4209    &ITUTV250,                          /* 67 Generic ITU-T V.250 */
4210    &RWV90,                             /* 68 Rockwell V.90 56K */
4211    &SUPRAX,                            /* 69 Diamond Supra Express V.90 */
4212    &LUCENT,                            /* 70 Lucent Venus chipset */
4213    &PCTEL,                             /* 71 PCTel */
4214    &CONEXANT,                          /* 72 Conexant */
4215    &ZOOMV34,                           /* 73 Zoom V.34 */
4216    &ZOOMV90,                           /* 74 Zoom V.90 */
4217    &ZOOMV92,                           /* 75 Zoom V.92 */
4218    &MOTSM56                            /* 76 Motorola SM56 chipset */
4219#endif /* MINIDIAL */
4220};
4221/*
4222 * Declare modem names and associated numbers for command parsing,
4223 * and also for doing number-to-name translation.
4224 *
4225 * The entries must be in alphabetical order by modem name.
4226 */
4227struct keytab mdmtab[] = {
4228#ifndef MINIDIAL
4229    "3com-usr-megahertz-56k", n_USRX2,  CM_INV,
4230    "acer-v90",         n_RWV90,        M_ALIAS,
4231    "atlas-newcom-33600ifxC", n_ATLAS,  0,
4232    "att-1900-stu-iii", n_ATT1900,      0,
4233    "att-1910-stu-iii", n_ATT1910,      0,
4234    "att-7300",         n_ATTUPC,       0,
4235    "att-dataport",     n_DATAPORT,     0,
4236    "att-dtdm",         n_ATTDTDM,      0,
4237    "att-isn",          n_ATTISN,       0,
4238    "att-keepintouch",  n_KEEPINTOUCH,  0,
4239    "att-switched-net", n_ATTMODEM,     0,
4240
4241    "att7300",          n_ATTUPC,       CM_INV, /* old name */
4242    "attdtdm",          n_ATTDTDM,      CM_INV, /* old name */
4243    "attisn",           n_ATTISN,       CM_INV, /* old name */
4244    "attmodem",         n_ATTMODEM,     CM_INV, /* old name */
4245
4246    "bestdata",         n_BESTDATA,     0,
4247    "boca",             n_BOCA,         0,
4248    "cardinal",         n_CARDINAL,     0,
4249#endif /* MINIDIAL */
4250    "ccitt-v25bis",     n_CCITT,        CM_INV, /* Name changed to ITU-T */
4251#ifndef MINIDIAL
4252#ifdef OLDMODEMS
4253    "cermetek",         n_CERMETEK,     M_OLD,
4254#endif /* OLDMODEMS */
4255    "compaq",           n_COMPAQ,       0,
4256#ifdef OLDMODEMS
4257    "concord",          n_CONCORD,      M_OLD,
4258#endif /* OLDMODEMS */
4259    "conexant",         n_CONEXANT,     0,
4260    "courier",          n_USR,          CM_INV,
4261    "dataport",         n_DATAPORT,     CM_INV, /* == att-dataport */
4262#ifdef OLDMODEMS
4263    "df03-ac",          n_DF03,         M_OLD,
4264    "df100-series",     n_DF100,        M_OLD,
4265    "df200-series",     n_DF200,        M_OLD,
4266#endif /* OLDMODEMS */
4267    "digitel-dt22",     n_DIGITEL,      0,
4268#endif /* MINIDIAL */
4269    "direct",           0,              CM_INV, /* Synonym for NONE */
4270#ifndef MINIDIAL
4271    "fujitsu",          n_FUJITSU,      0,
4272    "gateway-telepath", n_TELEPATH,     0,
4273#ifdef OLDMODEMS
4274    "gdc-212a/ed",      n_GDC,          M_OLD,
4275    "ge",               n_GENERIC,      CM_INV|CM_ABR,
4276    "gen",              n_GENERIC,      CM_INV|CM_ABR,
4277    "gendatacomm",      n_GDC,          CM_INV, /* Synonym for GDC */
4278#endif /* OLDMODEMS */
4279#endif /* MINIDIAL */
4280    "gene",             n_GENERIC,      CM_INV|CM_ABR,
4281    "generic",          n_GENERIC,      0,
4282    "generic-high-speed",n_GENERIC,     CM_INV,
4283    "h",                n_HAYES,        CM_INV|CM_ABR,
4284    "ha",               n_HAYES,        CM_INV|CM_ABR,
4285    "hay",              n_HAYES,        CM_INV|CM_ABR,
4286    "haye",             n_HAYES,        CM_INV|CM_ABR,
4287    "hayes",            n_HAYES,        CM_INV|CM_ABR, /* Hayes 2400 */
4288#ifndef MINIDIAL
4289    "hayes-1200",       n_H_1200,       0,
4290#endif /* MINIDIAL */
4291    "hayes-2400",       n_HAYES,        0,
4292#ifndef MINIDIAL
4293    "hayes-high-speed", n_H_ACCURA,     0,
4294    "hayes-accura",     n_H_ACCURA,     CM_INV,
4295    "hayes-optima",     n_H_ACCURA,     CM_INV,
4296    "hayes-ultra",      n_H_ULTRA,      CM_INV,
4297    "hst-courier",      n_USR,          CM_INV, /* Synonym for COURIER */
4298    "intel",            n_INTEL,        0,
4299#endif /* MINIDIAL */
4300
4301    "itu-t-v250",       n_ITUTV250,     0,
4302    "itu-t-v25bis",     n_CCITT,        0,      /* New name for CCITT */
4303    "itu-t-v25ter/v250",n_ITUTV250,     CM_INV,
4304
4305#ifndef MINIDIAL
4306    "lucent",           n_LUCENT,      0,
4307    "maxtech",          n_MAXTECH,     0,
4308
4309    "megahertz-att-v34",    n_MHZATT,  0, /* Megahertzes */
4310    "megahertz-xjack",      n_XJACK,   CM_INV|CM_ABR,
4311    "megahertz-xjack-33.6", n_XJACK,   0,
4312    "megahertz-xjack-56k",  n_USRX2,   0, /* 3COM/USR/Megahertz 33.6 PC Card */
4313
4314    "mi",               n_MICROCOM,     CM_INV|CM_ABR,
4315    "mic",              n_MICROCOM,     CM_INV|CM_ABR,
4316    "micr",             n_MICROCOM,     CM_INV|CM_ABR,
4317    "micro",            n_MICROCOM,     CM_INV|CM_ABR,
4318    "microc",           n_MICROCOM,     CM_INV|CM_ABR,
4319    "microco",          n_MICROCOM,     CM_INV|CM_ABR,
4320    "microcom",         n_MICROCOM,     CM_INV|CM_ABR,
4321    "microcom-at-mode", n_UCOM_AT,      0, /* Microcom DeskPorte, etc */
4322    "microcom-sx-mode", n_MICROCOM,     0, /* Microcom AX,QX,SX, native mode */
4323    "microlink",        n_MICROLINK,    0,
4324    "microlink-v250",   n_ULINKV250,    0,
4325    "motorola-codex",   n_CODEX,        0,
4326    "motorola-fastalk", n_MOTOROLA,     0,
4327    "motorola-lifestyle",n_MOTOROLA,    0,
4328    "motorola-montana", n_MONTANA,      0,
4329    "motorola-sm56-v90",n_MOTSM56,      0,
4330    "mt5634zpx",        n_MT5634ZPX,    0,
4331    "multitech",        n_MULTI,        0,
4332    "mwave",            n_MWAVE,        0,
4333#endif /* MINIDIAL */
4334    "none",             0,              0,
4335#ifndef MINIDIAL
4336#ifndef OLDTBCODE
4337    "old-telebit",      n_TELEBIT,      0,
4338#endif /* OLDTBCODE */
4339    "pctel",            n_PCTEL,        0,
4340#ifdef OLDMODEMS
4341    "penril",           n_PENRIL,       M_OLD,
4342#endif /* OLDMODEMS */
4343    "ppi",              n_PPI,          0,
4344#ifdef OLDMODEMS
4345    "racalvadic",       n_RACAL,        M_OLD,
4346#endif /* OLDMODEMS */
4347    "rockwell-v32",     n_RWV32,        0,
4348    "rockwell-v32bis",  n_RWV32B,       0,
4349    "rockwell-v34",     n_RWV34,        0,
4350    "rockwell-v90",     n_RWV90,        0,
4351    "rolm",             n_ROLM,         CM_INV|CM_ABR,
4352    "rolm-244pc",       n_ROLMAT,       0,
4353    "rolm-600-series",  n_ROLMAT,       0,
4354    "rolm-dcm",         n_ROLM,         0,
4355    "smartlink-v90",    n_USR,          M_ALIAS,
4356    "spirit-ii",        n_SPIRITII,     0,
4357    "sportster",        n_USR,          M_ALIAS,
4358    "sup",              n_SUPRA,        CM_INV|CM_ABR,
4359    "supr",             n_SUPRA,        CM_INV|CM_ABR,
4360    "supra",            n_SUPRA,        CM_INV|CM_ABR,
4361    "supra-express-v90",n_SUPRAX,       0,
4362    "suprafaxmodem",    n_SUPRA,        0,
4363    "suprasonic",       n_SUPRASON,     0,
4364#ifdef CK_TAPI
4365    "tapi",             n_TAPI,         0,
4366#endif /* CK_TAPI */
4367    "te",               n_TBNEW,        CM_INV|CM_ABR,
4368    "tel",              n_TBNEW,        CM_INV|CM_ABR,
4369    "telebit",          n_TBNEW,        0,
4370    "telepath",         n_TELEPATH,     CM_INV,
4371#endif /* MINIDIAL */
4372    "unknown",          n_UNKNOWN,      0,
4373    "user-defined",     n_UDEF,         0,
4374#ifndef MINIDIAL
4375
4376    "usr",               n_USR,         CM_INV|CM_ABR,
4377    "usr-212a",          n_HAYES,       CM_INV|M_ALIAS,
4378    "usr-courier",       n_USR,         CM_INV,
4379    "usr-megahertz-56k", n_USRX2,       0,
4380    "usr-sportster",     n_USR,         CM_INV,
4381    "usr-xj1560-x2",     n_USRX2,       CM_INV,
4382    "usrobotics",        n_USR,         0,
4383
4384    "v25bis",           n_CCITT,        CM_INV, /* Name changed to ITU-T */
4385#ifdef OLDMODEMS
4386    "ventel",           n_VENTEL,       M_OLD,
4387#endif /* OLDMODEMS */
4388    "zoltrix-v34",      n_ZOLTRIX,      0,
4389    "zoltrix-hsp-v90",  n_PCTEL,        M_ALIAS,
4390    "zoltrix-hcf-v90",  n_ITUTV250,     0,
4391    "zoo",              n_ZOOM,         CM_INV|CM_ABR,
4392    "zoom",             n_ZOOM,         CM_INV|CM_ABR,
4393    "zoom-v32bis",      n_ZOOM,         0,
4394    "zoom-v34",         n_ZOOMV34,      0,
4395    "zoom-v90",         n_ZOOMV90,      0,
4396    "zoom-v92",         n_ZOOMV92,      0,
4397    "zyxel",            n_ZYXEL,        0,
4398#endif /* MINIDIAL */
4399    "",                 0,              0
4400};
4401int nmdm = (sizeof(mdmtab) / sizeof(struct keytab)) - 1; /* Number of modems */
4402
4403#define CONNECTED 1                     /* For completion status */
4404#define D_FAILED  2
4405#define D_PARTIAL 3
4406
4407static int tries = 0;
4408static int mdmecho = 0;                 /* Assume modem does not echo */
4409
4410static char *p;                         /* For command strings & messages */
4411
4412#define LBUFL 200
4413static char lbuf[LBUFL+4];
4414char modemmsg[LBUFL+4] = { NUL, NUL };  /* DIAL response from modem */
4415
4416#ifdef DYNAMIC
4417#define RBUFL 256
4418static char *rbuf = NULL;
4419#else
4420#define RBUFL 63
4421static char rbuf[RBUFL+1];
4422#endif /* DYNAMIC */
4423
4424#ifdef DYNAMIC
4425#define FULLNUML 256
4426char *fbuf = NULL;                      /* For full (prefixed) phone number */
4427#else
4428#define FULLNUML 100
4429char fbuf[FULLNUML];
4430#endif /* DYNAMIC */
4431
4432static ckjmpbuf sjbuf;
4433
4434#ifdef CK_ANSIC
4435static SIGTYP (*savalrm)(int);  /* For saving alarm handler */
4436static SIGTYP (*savint)(int);   /* For saving interrupt handler */
4437#else
4438static SIGTYP (*savalrm)();     /* For saving alarm handler */
4439static SIGTYP (*savint)();      /* For saving interrupt handler */
4440#endif /* CK_ANSIC */
4441
4442#ifdef CKLOGDIAL
4443static VOID
4444dologdial(s) char *s; {
4445    char buf2[16];
4446    char * r = NULL;
4447    int x, m, n;
4448    extern char cxlogbuf[], uidbuf[], myhost[];
4449
4450    if (!s) s = "";
4451    if ((x = strlen(s)) > 0) {          /* Replace spaces by underscores */
4452        r = (char *)malloc(x+1);
4453        if (r) {
4454            int i;
4455            for (i = 0; i <= x; i++) {
4456                if (s[i] != 0 && s[i] <= SP)
4457                  r[i] = '_';
4458                else
4459                  r[i] = s[i];
4460            }
4461            s = r;
4462        }
4463    }
4464    p = ckdate();
4465    n = ckstrncpy(cxlogbuf,p,CXLOGBUFL);
4466    if (!uidbuf[0]) {
4467        debug(F100,"dologdial uidbuf empty","",0);
4468        ckstrncpy(uidbuf,(char *)whoami(),UIDBUFLEN);
4469    }
4470    m = strlen(uidbuf)+strlen(myhost)+strlen(ttname)+strlen(s)+strlen(buf2)+32;
4471    if (n+m < CXLOGBUFL-1) {
4472        p = cxlogbuf+n;
4473        if (diallcc && diallac) {
4474            buf2[0] = '+';
4475            ckmakmsg(&buf2[1],15,diallcc,"(",diallac,")");
4476        } else {
4477            ckstrncpy(buf2,"Unknown",16);
4478        }
4479        sprintf(p," %s %s T=DIAL H=%s D=%s N=%s O=%s ", /* safe (prechecked) */
4480                uidbuf,
4481                ckgetpid(),
4482                myhost,
4483                ttname,
4484                s,
4485                buf2
4486                );
4487        debug(F110,"dologdial cxlogbuf",cxlogbuf,0);
4488    } else
4489      sprintf(p,"LOGDIAL BUFFER OVERFLOW");
4490    if (r) free(r);
4491}
4492#endif /* CKLOGDIAL */
4493
4494#ifndef MINIDIAL
4495
4496#ifdef COMMENT
4497static VOID
4498xcpy(to,from,len)               /* Copy the given number of bytes */
4499    register char *to, *from;
4500    register unsigned int len; {
4501        while (len--) *to++ = *from++;
4502}
4503#endif /* COMMENT */
4504#endif /* MINIDIAL */
4505
4506static SIGTYP
4507#ifdef CK_ANSIC
4508dialtime(int foo)                       /* Timer interrupt handler */
4509#else
4510dialtime(foo) int foo;                  /* Timer interrupt handler */
4511#endif /* CK_ANSIC */
4512/* dialtime */ {
4513
4514    fail_code = F_TIME;                 /* Failure reason = timeout */
4515    debug(F100,"dialtime caught SIGALRM","",0);
4516#ifdef BEBOX
4517#ifdef BE_DR_7
4518    alarm_expired();
4519#endif /* BE_DR_7 */
4520#endif /* BEBOX */
4521#ifdef OS2
4522    signal(SIGALRM, dialtime);
4523#endif /* OS2 */
4524#ifdef __EMX__
4525    signal(SIGALRM, SIG_ACK);           /* Needed for OS/2 */
4526#endif /* __EMX__ */
4527
4528#ifdef OSK                              /* OS-9 */
4529/*
4530  We are in an intercept routine but do not perform a F$RTE (done implicitly
4531  by RTS), so we have to decrement the sigmask as F$RTE does.  Warning:
4532  longjump only restores the CPU registers, NOT the FPU registers.  So, don't
4533  use FPU at all or at least don't use common FPU (double or float) register
4534  variables.
4535*/
4536    sigmask(-1);
4537#endif /* OSK */
4538
4539#ifdef NTSIG
4540    if (foo == SIGALRM)
4541      PostAlarmSigSem();
4542    else
4543      PostCtrlCSem();
4544#else /* NTSIG */
4545#ifdef NT
4546    cklongjmp(ckjaddr(sjbuf),1);
4547#else /* NT */
4548    cklongjmp(sjbuf,1);
4549#endif /* NT */
4550#endif /* NTSIG */
4551    /* NOTREACHED */
4552    SIGRETURN;
4553}
4554
4555static SIGTYP
4556#ifdef CK_ANSIC
4557dialint(int foo)                        /* Keyboard interrupt handler */
4558#else
4559dialint(foo) int foo;
4560#endif /* CK_ANSIC */
4561/* dialint */ {
4562    fail_code = F_INT;
4563    debug(F100,"dialint caught SIGINT","",0);
4564#ifdef OS2
4565    signal(SIGINT, dialint);
4566    debug(F100,"dialint() SIGINT caught -- dialint restored","",0) ;
4567#endif /* OS2 */
4568#ifdef __EMX__
4569    signal(SIGINT, SIG_ACK);            /* Needed for OS/2 */
4570#endif /* __EMX__ */
4571#ifdef OSK                              /* OS-9, see comment in dialtime() */
4572    sigmask(-1);
4573#endif /* OSK */
4574#ifdef NTSIG
4575    PostCtrlCSem() ;
4576#ifdef CK_TAPI
4577    PostTAPIConnectSem();
4578    PostTAPIAnswerSem();
4579#endif /* CK_TAPI */
4580#else /* NTSIG */
4581#ifdef NT
4582    cklongjmp(ckjaddr(sjbuf),1);
4583#else /* NT */
4584    cklongjmp(sjbuf,1);
4585#endif /* NT */
4586#endif /* NT */
4587    SIGRETURN;
4588}
4589
4590/*
4591  Routine to read a character from communication device, handling TELNET
4592  protocol negotiations in case we're connected to the modem through a
4593  TCP/IP TELNET modem server.
4594*/
4595static int
4596ddinc(n) int n; {
4597#ifdef TNCODE
4598    int c = 0;
4599    int done = 0;
4600    debug(F101,"ddinc entry n","",n);
4601    while (!done) {
4602        c = ttinc(n);
4603        /* debug(F000,"ddinc","",c); */
4604        if (c < 0) return(c);
4605#ifndef OS2
4606        if ((c == IAC) && network && IS_TELNET()) {
4607            switch (tn_doop((CHAR)(c & 0xff),duplex,ttinc)) {
4608              case 2: duplex = 0; continue;
4609              case 1: duplex = 1;
4610              default: continue;
4611            }
4612        } else done = 1;
4613#else /* OS2 */
4614        done = !(c == IAC && network && IS_TELNET());
4615        scriptwrtbuf(c);        /* TELNET negotiations handled by emulator */
4616#endif /* OS2 */
4617    }
4618    return(c & 0xff);
4619#else  /* TNCODE */
4620    return(ttinc(n));
4621#endif /* TNCODE */
4622}
4623
4624static VOID
4625ttslow(s,millisec) char *s; int millisec; { /* Output s-l-o-w-l-y */
4626#ifdef TCPSOCKET
4627    extern int tn_nlm, tn_b_nlm;
4628#endif /* TCPSOCKET */
4629    debug(F111,"ttslow",s,millisec);
4630    if (dialdpy && (duplex || !mdmecho)) { /* Echo the command in case modem */
4631        printf("%s\n",s);               /* isn't echoing commands. */
4632#ifdef OS2
4633        {
4634            char *s2 = s;               /* Echo to emulator */
4635            while (*s2) {
4636                scriptwrtbuf((USHORT)*s2++);
4637            }
4638            scriptwrtbuf((USHORT)CR);
4639            scriptwrtbuf((USHORT)LF);
4640        }
4641#endif /* OS2 */
4642    }
4643    for (; *s; s++) {
4644        ttoc(*s);
4645#ifdef TCPSOCKET
4646        if (*s == CR && network && IS_TELNET()) {
4647            if (!TELOPT_ME(TELOPT_BINARY) && tn_nlm != TNL_CR)
4648              ttoc((char)((tn_nlm == TNL_CRLF) ? LF : NUL));
4649            else if (TELOPT_ME(TELOPT_BINARY) &&
4650                     (tn_b_nlm == TNL_CRLF || tn_b_nlm == TNL_CRNUL))
4651              ttoc((char)((tn_b_nlm == TNL_CRLF) ? LF : NUL));
4652        }
4653#endif /* TCPSOCKET */
4654        if (millisec > 0)
4655          msleep(millisec);
4656    }
4657}
4658
4659/*
4660 * Wait for a string of characters.
4661 *
4662 * The characters are waited for individually, and other characters may
4663 * be received "in between".  This merely guarantees that the characters
4664 * ARE received, and in the order specified.
4665 */
4666static VOID
4667waitfor(s) char *s; {
4668    CHAR c, x;
4669    while ((c = *s++)) {                /* while more characters remain... */
4670        do {                            /* wait for the character */
4671            x = (CHAR) (ddinc(0) & 0177);
4672            debug(F000,"dial waitfor got","",x);
4673            if (dialdpy) {
4674                if (x != LF) conoc(x);
4675                if (x == CR) conoc(LF);
4676            }
4677        } while (x != c);
4678    }
4679}
4680
4681static int
4682didweget(s,r) char *s, *r; {    /* Looks in string s for response r */
4683    int lr = (int)strlen(r);    /*  0 means not found, 1 means found it */
4684    int i;
4685    debug(F110,"didweget",r,0);
4686    debug(F110," in",s,0);
4687    for (i = (int)strlen(s)-lr; i >= 0; i--)
4688        if ( s[i] == r[0] ) if ( !strncmp(s+i,r,lr) ) return( 1 );
4689    return( 0 );
4690}
4691
4692
4693/* R E S E T -- Reset alarms, etc. on exit. */
4694
4695static VOID
4696dreset() {
4697    debug(F100,"dreset resetting alarm and signal handlers","",0);
4698    alarm(0);
4699    signal(SIGALRM,savalrm);            /* restore alarm handler */
4700    signal(SIGINT,savint);              /* restore interrupt handler */
4701    debug(F100,"dreset alarm and signal handlers reset","",0);
4702}
4703
4704/*
4705  Call this routine when the modem reports that it has connected at a certain
4706  speed, giving that speed as the argument.  If the connection speed is not
4707  the same as Kermit's current communication speed, AND the modem interface
4708  speed is not locked (i.e. DIAL SPEED-MATCHING is not ON), then change the
4709  device speed to the one given.
4710*/
4711static VOID
4712#ifdef CK_ANSIC
4713spdchg(long s)
4714#else
4715spdchg(s) long s;
4716#endif /* CK_ANSIC */
4717/* spdchg */ {
4718    int s2;
4719    if (!mdmspd)                        /* If modem interface speed locked, */
4720      return;                           /*  don't do this. */
4721    if (speed != s) {                   /* Speeds differ? */
4722        s2 = s / 10L;                   /* Convert to cps expressed as int */
4723        if (ttsspd(s2) < 0) {           /* Change speed. */
4724            printf(" WARNING - speed change to %ld failed.\r\n",s);
4725        } else {
4726            printf(" Speed changed to %ld.\r\n",s);
4727            speed = s;                  /* Update global speed variable */
4728        }
4729    }
4730}
4731
4732/*
4733  Display all characters received from modem dialer through this routine,
4734  for consistent handling of carriage returns and linefeeds.
4735*/
4736static VOID
4737#ifdef CK_ANSIC
4738dialoc(char c)
4739#else
4740dialoc(c) char c;
4741#endif /* CK_ANSIC */
4742{ /* dialoc */                          /* Dial Output Character */
4743    if (dialdpy) {
4744        if (c != LF) conoc(c);          /* Don't echo LF */
4745        if (c == CR) conoc(LF);         /* Echo CR as CRLF */
4746    }
4747}
4748
4749#ifndef NOSPL
4750char *
4751getdm(x) int x; {                       /* Return dial modifier */
4752    MDMINF * mp;
4753    int m;
4754    int ishayes = 0;
4755    m = mdmtyp;
4756    if (m < 1)
4757      if (mdmsav > -1)
4758        m = mdmsav;
4759    if (m < 1)
4760      return("");
4761#ifndef MINIDIAL
4762    if (m == n_TAPI)
4763      m = n_HAYES;
4764#endif /* MINIDIAL */
4765    mp = modemp[m];
4766    ishayes = (dialcapas ? dialcapas : mp->capas) & CKD_AT;
4767    switch (x) {
4768      case VN_DM_LP:
4769        return(ishayes ? "," : "");
4770      case VN_DM_SP:
4771#ifdef MINIDIAL
4772        return("");
4773#else
4774        return(m == n_USR ? "/" : "");
4775#endif /* MINIDIAL */
4776      case VN_DM_PD:
4777        return(ishayes ? "P" : "");
4778      case VN_DM_TD:
4779        return(ishayes ? "T" : "");
4780      case VN_DM_WA:
4781        return(ishayes ? "@" : "");
4782      case VN_DM_WD:
4783        return(ishayes ? "W" : "");
4784      case VN_DM_RC:
4785        return(ishayes ? ";" : "");
4786      case VN_DM_HF:
4787        return(ishayes ? "!" : "");
4788      case VN_DM_WB:
4789        return(ishayes ? "$" : "");
4790    }
4791    return("");
4792}
4793#endif /* NOSPL */
4794
4795static VOID
4796getdialmth() {
4797    if (dialmauto && diallcc) {         /* If DIAL METHOD AUTO... */
4798        int i;                          /* and we know our area code... */
4799        for (i = 0; i < ndialtocc; i++) { /* First check Tone countries list */
4800            if (!strcmp(dialtocc[i],diallcc)) {
4801                dialmth = XYDM_T;
4802                break;
4803            }
4804        }
4805        for (i = 0; i < ndialpucc; i++) { /* Then Pulse countries list */
4806            if (!strcmp(dialpucc[i],diallcc)) {
4807                dialmth = XYDM_P;
4808                break;
4809            }
4810        }
4811    }
4812}
4813
4814VOID                            /* Get dialing defaults from environment */
4815getdialenv() {
4816    char *p = NULL;
4817    int i, x;
4818
4819    makestr(&p,getenv("K_DIAL_DIRECTORY"));
4820    if (p) {
4821        int i;
4822        xwords(p,(MAXDDIR - 2),dialdir,0);
4823        for (i = 0; i < (MAXDDIR - 1); i++) {
4824            if (!dialdir[i+1])
4825              break;
4826            else
4827              dialdir[i] = dialdir[i+1];
4828        }
4829        ndialdir = i;
4830    }
4831    xmakestr(&diallcc,getenv("K_COUNTRYCODE")); /* My country code */
4832    xmakestr(&dialixp,getenv("K_LD_PREFIX"));   /* My long-distance prefix */
4833    xmakestr(&dialldp,getenv("K_INTL_PREFIX")); /* My international prefix */
4834    xmakestr(&dialldp,getenv("K_TF_PREFIX"));   /* Ny Toll-free prefix */
4835
4836#ifndef NOICP
4837    p = getenv("K_DIAL_METHOD");        /* Local dial method */
4838    if (p) if (*p) {
4839        extern struct keytab dial_m[];
4840        extern int ndial_m;
4841        i = lookup(dial_m,p,ndial_m,&x);
4842        if (i > -1) {
4843            if (i == XYDM_A) {
4844                dialmauto = 1;
4845                dialmth = XYDM_D;
4846            } else {
4847                dialmauto = 0;
4848                dialmth = i;
4849            }
4850        }
4851    }
4852#endif /* NOICP */
4853
4854    p = NULL;
4855    xmakestr(&p,getenv("K_TF_AREACODE")); /* Toll-free areacodes */
4856    if (p) {
4857        int i;
4858        xwords(p,7,dialtfc,0);
4859        for (i = 0; i < 8; i++) {
4860            if (!dialtfc[i+1])
4861              break;
4862            else
4863              dialtfc[i] = dialtfc[i+1];
4864        }
4865        ntollfree = i;
4866        free(p);
4867    }
4868    for (i = 0; i < MAXTPCC; i++) {     /* Clear Tone/Pulse country lists */
4869        dialtocc[i] = NULL;
4870        dialpucc[i] = NULL;
4871    }
4872    for (i = 0; i < MAXTPCC; i++) {     /* Init Tone country list */
4873        if (tonecc[i])
4874          makestr(&(dialtocc[i]),tonecc[i]);
4875        else
4876          break;
4877    }
4878    ndialtocc = i;
4879    for (i = 0; i < MAXTPCC; i++) {     /* Init Pulse country list */
4880        if (pulsecc[i])
4881          makestr(&(dialpucc[i]),pulsecc[i]);
4882        else
4883          break;
4884    }
4885    ndialpucc = i;
4886
4887    if (diallcc) {                      /* Have country code */
4888        if (!strcmp(diallcc,"1")) {     /* If it's 1 */
4889            if (!dialldp)               /* Set these prefixes... */
4890              makestr(&dialldp,"1");
4891            if (!dialtfp)
4892              makestr(&dialtfp,"1");
4893            if (!dialixp)
4894              makestr(&dialixp,"011");
4895            if (ntollfree == 0) {       /* Toll-free area codes */
4896                if ((dialtfc[0] = malloc(4))) {
4897                    ckstrncpy(dialtfc[0],"800",4); /* 1970-something */
4898                    ntollfree++;
4899                    if ((dialtfc[1] = malloc(4))) {
4900                        ckstrncpy(dialtfc[1],"888",4); /* 1996 */
4901                        ntollfree++;
4902                        if ((dialtfc[2] = malloc(4))) {
4903                            ckstrncpy(dialtfc[2],"877",4); /* 5 April 1998 */
4904                            ntollfree++;
4905                            if ((dialtfc[3] = malloc(4))) {
4906                                ckstrncpy(dialtfc[3],"866",4); /* 2000? */
4907                                ntollfree++;
4908                            }
4909                        }
4910                    }
4911                }
4912            }
4913        } else if (!strcmp(diallcc,"358") &&
4914                   ((int) strcmp(zzndate(),"19961011") > 0)
4915                   ) {                  /* Finland */
4916            if (!dialldp)               /* Long-distance prefix */
4917              makestr(&dialldp,"9");
4918            if (!dialixp)               /* International dialing prefix */
4919              makestr(&dialixp,"990");
4920        } else {                        /* Not NANP or Finland */
4921            if (!dialldp)
4922              makestr(&dialldp,"0");
4923            if (!dialixp)
4924              makestr(&dialixp,"00");
4925        }
4926    }
4927    xmakestr(&diallac,getenv("K_AREACODE"));
4928    xmakestr(&dialpxo,getenv("K_PBX_OCP"));
4929    xmakestr(&dialpxi,getenv("K_PBX_ICP"));
4930    p = getenv("K_PBX_XCH");
4931#ifdef COMMENT
4932    xmakestr(&dialpxx,p);
4933#else
4934    if (p) if (*p) {
4935        char * s = NULL;
4936        char * pp[MAXPBXEXCH+2];
4937        makestr(&s,p);                  /* Make a copy for poking */
4938        if (s) {
4939            xwords(s,MAXPBXEXCH+1,pp,0); /* Note: pp[] is 1-based. */
4940            for (i = 0; i <= MAXPBXEXCH; i++) {
4941                if (!pp[i+1]) break;
4942                makestr(&(dialpxx[i]),pp[i+1]);
4943                ndialpxx++;
4944            }
4945            makestr(&s,NULL);           /* Free poked copy */
4946        }
4947    }
4948#endif /* COMMENT */
4949}
4950
4951static int
4952dialfail(x) int x; {
4953    char * s;
4954
4955    fail_code = x;
4956    debug(F101,"ckudial dialfail","",x);
4957    dreset();                           /* Reset alarm and signal handlers */
4958
4959    printf("%s Failure: ", func_code == 0 ? "DIAL" : "ANSWER");
4960    if (dialdpy) {                      /* If showing progress */
4961       debug(F100,"dial display is on","",0);
4962        p = ck_time();                  /* get current time; */
4963        if (*p) printf("%s: ",p);
4964    }
4965    switch (fail_code) {                /* Type of failure */
4966      case F_TIME:                      /* Timeout */
4967        if (dial_what == DW_INIT)
4968          printf ("Timed out while trying to initialize modem.\n");
4969        else if (dial_what == DW_DIAL)
4970          printf ("%s interval expired.\n",
4971                  func_code == 0 ? "DIAL TIMEOUT" : "ANSWER timeout");
4972        else
4973          printf("Timeout.\n");
4974        fflush(stdout);
4975        if (mdmcapas & CKD_AT)
4976          ttoc('\015');                 /* Send CR to interrupt dialing */
4977        /* Some Hayes modems don't fail with BUSY on busy lines */
4978        dialsta = DIA_TIMO;
4979        debug(F110,"dial","timeout",0);
4980        break;
4981
4982      case F_INT:                       /* Dialing interrupted */
4983        printf ("Interrupted.\n");
4984        fflush(stdout);
4985#ifndef NOXFER
4986        interrupted = 1;
4987#endif /* NOXFER */
4988        debug(F111,"dial","interrupted",mdmcapas & CKD_AT);
4989        if (mdmcapas & CKD_AT)
4990          ttoc('\015');                 /* Send CR to interrupt dialing */
4991        dialsta = DIA_INTR;
4992        break;
4993
4994    case F_MODEM:                       /* Modem detected a failure */
4995         debug(F111,"dialfail()","lbuf",lbuf);
4996         if (lbuf && *lbuf) {
4997            printf(" \"");
4998            for (s = lbuf; *s; s++)
4999               if (isprint(*s))
5000                  putchar(*s);          /* Display printable reason */
5001            printf ("\"");
5002         } else printf(func_code == 0 ?
5003                        " Call not completed." :
5004                        " Call did not come in."
5005                        );
5006        printf("\n");
5007        debug(F110,"dial",lbuf,0);
5008        if (dialsta < 0) dialsta = DIA_UNSP;
5009        break;
5010
5011      case F_MINIT:                     /* Failure to initialize modem */
5012        printf ("Error initializing modem.\n");
5013        debug(F110,"dial","modem init",0);
5014        dialsta = DIA_NOIN;
5015        break;
5016
5017    default:
5018        printf("unknown\n");
5019        debug(F110,"dial","unknown",0);
5020        fflush(stdout);
5021        if (mdmcapas & CKD_AT)
5022          ttoc('\015');                 /* Send CR to interrupt dialing */
5023        dialsta = DIA_INTR;
5024    }
5025
5026#ifdef DYNAMIC
5027    if (rbuf) free(rbuf); rbuf = NULL;
5028    if (fbuf) free(fbuf); fbuf = NULL;
5029#endif /* DYNAMIC */
5030
5031    if (dialsta < 0) dialsta = DIA_UERR; /* Set failure code */
5032    return(0);                          /* Return zero (important) */
5033}
5034
5035/*  C K D I A L  --  Dial up the remote system */
5036
5037/* Returns 1 if call completed, 0 otherwise */
5038
5039static int mdmwait, mdmstat = 0;
5040#ifndef CK_TAPI
5041static
5042#endif /* CK_TAPI */
5043int waitct;
5044int mdmwaitd = 10 ;                     /* dialtmo / mdmwait difference */
5045static char c;
5046static char *telnbr;
5047
5048static int wr = 0;                      /* wr = wake rate */
5049static char * ws;                       /* ws = wake string */
5050static char * xnum = NULL;
5051static int inited = 0;
5052
5053static SIGTYP
5054#ifdef CK_ANSIC
5055_dodial(void * threadinfo)
5056#else /* CK_ANSIC */
5057_dodial(threadinfo) VOID * threadinfo;
5058#endif /* CK_ANSIC */
5059/* _dodial */ {
5060    char c2;
5061    char *dcmd, *s, *flocmd = NULL;
5062    int x = 0, n = F_TIME;
5063
5064#ifdef NTSIG
5065    signal( SIGINT, dialint );
5066    if (threadinfo) {                   /* Thread local storage... */
5067        TlsSetValue(TlsIndex,threadinfo);
5068    }
5069#endif /* NTSIG */
5070
5071    dcmd = dialcmd ? dialcmd : mp->dial_str;
5072    if ((int)strlen(dcmd) + (int)strlen(telnbr) > (LBUFL - 2)) {
5073        printf("DIAL command + phone number too long!\n");
5074        dreset();
5075#ifdef DYNAMIC
5076        if (rbuf) free(rbuf); rbuf = NULL;
5077        if (fbuf) free(fbuf); fbuf = NULL;
5078#endif /* DYNAMIC */
5079#ifdef NTSIG
5080        ckThreadEnd(threadinfo);
5081#endif /* NTSIG */
5082        SIGRETURN;       /* No conversation with modem to complete dialing */
5083    }
5084    makestr(&xnum,telnbr);
5085
5086    getdialmth();                       /* Get dial method */
5087
5088#ifdef CK_ATDT
5089    /* Combine the SET DIAL METHOD command with the DIAL command string */
5090    if (!dialcmd &&                     /* Using default DIAL command */
5091        (mdmcapas & CKD_AT) &&          /* AT command set only */
5092        ((dialmth == XYDM_T && !dialtone) || /* and using default */
5093         (dialmth == XYDM_P && !dialpulse))) { /* modem commands... */
5094        char c;
5095        debug(F110,"dial atdt xnum 1",xnum,0);
5096        s = dcmd;
5097        debug(F110,"dial atdt s",s,0);
5098        if (*telnbr != 'T' &&
5099            *telnbr != 'P' &&
5100            *telnbr != 't' &&
5101            *telnbr != 'p' &&
5102            !ckstrcmp(s,"atd",3,0) &&
5103            s[3] != 'T' &&
5104            s[3] != 'P' &&
5105            s[3] != 't' &&
5106            s[3] != 'p') {
5107            char xbuf[200];
5108            c = (dialmth == XYDM_T) ? 'T' : 'P';
5109            if (islower(s[0]))
5110              c = tolower(c);
5111            if ((int)strlen(telnbr) < 199) {
5112                sprintf(xbuf,"%c%s",c,telnbr);
5113                makestr(&xnum,xbuf);
5114            }
5115        }
5116    }
5117#endif /* CK_ATDT */
5118    debug(F111,"_dodial",xnum,xredial);
5119
5120    /* Hang up the modem (in case it wasn't "on hook") */
5121    /* But only if SET DIAL HANGUP ON... */
5122
5123    if (!xredial) {                     /* Modem not initalized yet. */
5124        inited = 0;
5125    }
5126    if (!xredial || !inited) {
5127        if (dialhup() < 0) {            /* Hangup first */
5128            debug(F100,"_dodial dialhup failed","",0);
5129#ifndef MINIDIAL
5130            if (mdmcapas & CKD_TB)      /* Telebits might need a BREAK */
5131              ttsndb();                 /*  first. */
5132#endif /* MINIDIAL */
5133            if (dialhng && dialsta != DIA_PART) { /* If hangup failed, */
5134                ttclos(0);              /* close and reopen the device. */
5135                if (ttopen(ttname,&local,mymdmtyp,0) < 0) {
5136                    printf("Sorry, Can't hang up communication device.\n");
5137                    printf("Try 'set line %s' again.\n",ttname);
5138                    dialsta = DIA_HANG;
5139#ifdef DYNAMIC
5140                    if (rbuf) free(rbuf); rbuf = NULL;
5141                    if (fbuf) free(fbuf); fbuf = NULL;
5142#endif /* DYNAMIC */
5143                    dreset();
5144#ifdef NTSIG
5145                    ckThreadEnd(threadinfo);
5146#endif /* NTSIG */
5147                    SIGRETURN;
5148                }
5149            }
5150        }
5151        inited = 0;                     /* We hung up so must reinit */
5152    }
5153#ifndef MINIDIAL
5154    /* Don't start talking to Rolm too soon */
5155    if (mymdmtyp == n_ROLM && dialsta != DIA_PART)
5156      msleep(500);
5157#endif /* MINIDIAL */
5158
5159    if (dialsta != DIA_PART             /* Some initial setups. */
5160#ifndef MINIDIAL
5161        && mymdmtyp != n_ATTUPC
5162#endif /* MINIDIAL */
5163        ) {
5164        fail_code = F_MINIT;            /* Default failure code */
5165        dial_what = DW_INIT;            /* What I'm Doing Now   */
5166        if (dialdpy) {                  /* If showing progress, */
5167            p = ck_time();              /* get timestamp.   */
5168            if (!inited)
5169              if (*p)
5170                printf(" Initializing: %s...\n",p);
5171        }
5172    }
5173#ifndef MINIDIAL
5174#ifdef ATT7300
5175    if (mymdmtyp == n_ATTUPC) {
5176/*
5177  For ATT7300/Unix PC's with their special internal modem.  Whole dialing
5178  process is handled right here, an exception to the normal structure.
5179  Timeout and user interrupts are enabled during dialing.  attdial() is in
5180  file ckutio.c.  - jrd
5181*/
5182        _PROTOTYP( int attdial, (char *, long, char *) );
5183        fail_code = F_MODEM;            /* Default failure code */
5184        dial_what = DW_DIAL;
5185        if (dialdpy) {                  /* If showing progress */
5186            p = ck_time();              /* get current time; */
5187            if (*p)
5188              printf(" Dialing: %s...\n",p);
5189        }
5190        alarm(waitct);                  /* Set alarm */
5191        if (attdial(ttname,speed,telnbr)) { /* dial internal modem */
5192            dreset();                   /* reset alarms, etc. */
5193            printf(" Call failed.\r\n");
5194            dialhup();                  /* Hangup the call */
5195#ifdef DYNAMIC
5196            if (rbuf) free(rbuf); rbuf = NULL;
5197            if (fbuf) free(fbuf); fbuf = NULL;
5198#endif /* DYNAMIC */
5199            dialsta = DIA_UERR;
5200#ifdef NTSIG
5201            ckThreadEnd(threadinfo);
5202#endif /* NTSIG */
5203            SIGRETURN;                  /* return failure */
5204        }
5205        dreset();                       /* reset alarms, etc. */
5206        ttpkt(speed,FLO_DIAX,parity);   /* cancel dialing ioctl */
5207        if (!quiet && !backgrd) {
5208            if (dialdpy) {
5209                printf("\n");
5210                printf(" Call complete.\r\n");
5211            } else if (modemmsg[0])
5212                printf(" Call complete: \"%s\".\r\n",(char *)modemmsg);
5213            else
5214              printf(" Call complete.\r\n");
5215        }
5216#ifdef CKLOGDIAL
5217        dologdial(telnbr);
5218#endif /* CKLOGDIAL */
5219
5220        dialsta = DIA_OK;
5221#ifdef DYNAMIC
5222        if (rbuf) free(rbuf); rbuf = NULL;
5223        if (fbuf) free(fbuf); fbuf = NULL;
5224#endif /* DYNAMIC */
5225#ifdef NTSIG
5226        ckThreadEnd(threadinfo);
5227#endif /* NTSIG */
5228        SIGRETURN;      /* No conversation with modem to complete dialing */
5229    } else
5230#endif /* ATT7300 */
5231#ifdef CK_TAPI
5232      if (tttapi && !tapipass) {        /* TAPI Dialing */
5233          switch (func_code) {
5234            case 0:                     /* Dial */
5235              if (cktapidial(telnbr)) {
5236                  fail_code = 0;
5237                  if (partial) {
5238                      dialsta = DIA_PART;
5239                  } else {
5240                      dialsta = DIA_OK;
5241                      speed = ttgspd();
5242                  }
5243              } else {
5244                  if (dialsta == DIA_PART)
5245                    cktapihangup();
5246                  if (!fail_code)
5247                    fail_code = F_MODEM;
5248                  dialsta = DIA_TAPI;
5249              }
5250              break;
5251            case 1: {                   /* Answer */
5252                long strttime = time((long *)NULL);
5253                long diff = 0;
5254                do {
5255                    if (dialatmo > 0) {
5256                        strttime += diff;
5257                        waitct   -= diff;
5258                    }
5259                    fail_code = 0;
5260                    if (cktapianswer()) { /* SUCCESS */
5261                        dialsta = DIA_OK;
5262                        speed = ttgspd();
5263                        break;
5264                    } else {            /* FAILURE */
5265                        if (fail_code) {
5266                            dialsta = DIA_TAPI;
5267                            break;
5268                        } else {
5269                            fail_code = F_MODEM;
5270                            dialsta = DIA_TAPI;
5271                        }
5272                    }
5273                    if (dialatmo > 0) {
5274                        diff = time((long *)NULL) - strttime;
5275                    }
5276                } while ((dialatmo > 0) ? (diff < waitct) : 1);
5277                break;
5278            }
5279          }
5280#ifdef NTSIG
5281          ckThreadEnd(threadinfo);
5282#endif /* NTSIG */
5283          SIGRETURN;
5284      } else
5285#endif /* CK_TAPI */
5286#endif /* MINIDIAL */
5287
5288/* Modems with AT command set... */
5289
5290      if ((mdmcapas & CKD_AT) && dialsta != DIA_PART) {
5291
5292          if (dialpace > -1)            /* Set intercharacter pacing */
5293            wr = dialpace;
5294          else
5295            wr = mp->wake_rate;
5296
5297          if (dialini)                  /* Get wakeup/init string */
5298            ws = dialini;
5299          else
5300            ws = mp->wake_str;
5301#ifdef COMMENT
5302          if (!ws) ws = "\015";         /* If none, use CR */
5303#endif /* COMMENT */
5304
5305          /* First get the modem's attention and enable result codes */
5306
5307          for (tries = 0; tries < 5; tries++) { /* Send short command */
5308              if (tries > 0) {
5309                  ttoc('\015');         /* AT must go first for speed */
5310                  msleep(wr);           /* detection. */
5311              }
5312              if (mymdmtyp == n_GENERIC) /* Force word result codes */
5313                ttslow("ATQ0V1\015",wr); /* for generic modem type */
5314              else
5315                ttslow("ATQ0\015",wr);
5316              mdmstat = getok(tries < 2 ? 2 : tries, 1); /* Get response */
5317              if (mdmstat > 0) break;   /* OK - done */
5318              if (dialdpy && tries > 0) {
5319                  printf("\r\n No response from modem");
5320                  if (tries == 4) {
5321                      printf(".\r\n");
5322                      dialsta = DIA_NRSP;
5323#ifdef DYNAMIC
5324                      if (rbuf) free(rbuf); rbuf = NULL;
5325                      if (fbuf) free(fbuf); fbuf = NULL;
5326#endif /* DYNAMIC */
5327#ifdef NTSIG
5328                      ckThreadEnd(threadinfo);
5329#endif /* NTSIG */
5330                      SIGRETURN;        /* return failure */
5331                  }
5332                  printf(", retrying%s...\r\n",
5333                         (tries > 1) ? " again" : "");
5334                  fflush(stdout);
5335              }
5336              ttflui();
5337              switch (tries) {
5338                case 0: msleep(100); break;
5339                case 1: ttsndb(); break;
5340                default:
5341                  if (network) {
5342                      ttsndb();
5343                  } else {
5344                      if (tries == 2) {
5345                          tthang();
5346                          ttflui();
5347                      } else {
5348                          mdmhup();
5349                      }
5350                      inited = 0;
5351                  }
5352              }
5353              fflush(stdout);
5354          }
5355          debug(F101,"_dodial ATQ0 mdmstat","",mdmstat);
5356
5357          if (xredial && inited) {      /* Redialing... */
5358              ttoc('\015');             /* Cancel previous */
5359              msleep(250);              /* Wait a bit */
5360#ifdef COMMENT
5361/* This wasn't the problem... */
5362              ttflui();                 /* Clear out stuff from modem setup */
5363              ttslow("ATS7=60\015",wr); /* Redo carrier wait */
5364              getok(4,1);               /* Get response */
5365#endif /* COMMENT */
5366              alarm(0);                 /* Just in case... */
5367              ttflui();                 /* Clear out stuff from modem setup */
5368              goto REDIAL;              /* Skip setup - we already did it */
5369          }
5370/*
5371  Do flow control next because a long init string echoing back could
5372  cause data overruns, causing us to miss the OK, or (worse) to get out
5373  of sync entirely.
5374*/
5375          x = 0;                        /* User said SET DIAL FLOW RTS/CTS */
5376          if (dialfc == FLO_RTSC ||     /* Even if Kermit's FLOW isn't...  */
5377              (dialfc == FLO_AUTO && flow == FLO_RTSC)) {
5378              if (dialhwfc) {           /* User-defined HWFC string */
5379                  if (*dialhwfc) {
5380                      x = 1;
5381                      flocmd = dialhwfc;
5382                  }
5383              } else if ((mdmcapas & CKD_HW) && *(mp->hwfc_str)) {
5384                  x = 1;
5385                  flocmd = mp->hwfc_str;
5386              }
5387          } else if (dialfc == FLO_XONX || /* User said SET DIAL FLOW SOFT */
5388                     (dialfc == FLO_AUTO && flow == FLO_XONX)) {
5389              if (dialswfc) {
5390                  if (*dialswfc) {
5391                      x = 1;
5392                      flocmd = dialswfc;
5393                  }
5394              } else if ((mdmcapas & CKD_SW) && *(mp->swfc_str)) {
5395                  x = 1;
5396                  flocmd = mp->swfc_str;
5397              }
5398          } else if (dialfc == FLO_NONE) { /* User said SET DIAL FLOW NONE */
5399              if (dialnofc) {
5400                  if (*dialnofc) {
5401                      x = 1;
5402                      flocmd = dialnofc;
5403                  }
5404              } else if (mp->nofc_str && *(mp->nofc_str)) {
5405                  x = 1;
5406                  flocmd = mp->nofc_str;
5407              }
5408          }
5409          if (x) {                      /* Send the flow control command */
5410              debug(F110,"_dodial flocmd",flocmd,0);
5411              for (tries = 4; tries > 0; tries--) { /* Send the command */
5412                  ttslow(flocmd,wr);
5413                  mdmstat = getok(5,1);
5414                  if (mdmstat > 0) break;
5415                  if (dialdpy && tries > 1)
5416                    printf(" No response from modem, retrying%s...\n",
5417                           (tries < 4) ? " again" : "");
5418              }
5419
5420#ifdef CK_TTSETFLOW
5421#ifdef CK_RTSCTS
5422/*
5423  So far only ckutio.c has ttsetflow().
5424  We have just told the modem to turn on RTS/CTS flow control and the modem
5425  has said OK.  But we ourselves have not turned it on yet because of the
5426  disgusting ttpkt(...FLO_DIAL...) hack.  So now, if the computer does not
5427  happen to be asserting RTS, the modem will no longer send characters to it.
5428  So at EXACTLY THIS POINT, we must enable RTS/CTS in the device driver.
5429*/
5430              if (dialfc == FLO_RTSC ||
5431                  (dialfc == FLO_AUTO && flow == FLO_RTSC)) {
5432                  ttsetflow(FLO_RTSC);
5433              }
5434#endif /* CK_RTSCTS */
5435#endif /* CK_TTSETFLOW */
5436          }
5437          ttflui();                     /* Clear out stuff from modem setup */
5438          msleep(250);
5439
5440          if (!ws) goto xdialec;        /* No init string */
5441          if (!*ws) goto xdialec;
5442
5443          for (tries = 4; tries > 0; tries--) { /* Send init string */
5444              ttslow(ws,wr);
5445              mdmstat = getok(4,1);     /* Get response */
5446              if (mdmstat > 0) break;
5447              if (dialdpy && tries > 1)
5448                printf(" No response from modem, retrying%s...\n",
5449                       (tries < 4) ? " again" : "");
5450          }
5451          debug(F101,"_dodial wake_str mdmstat","",mdmstat);
5452
5453          if (mdmstat < 1) {            /* Initialized OK? */
5454              dialfail(F_MINIT);        /* No, fail. */
5455#ifdef NTSIG
5456              ckThreadEnd(threadinfo);
5457#endif /* NTSIG */
5458              SIGRETURN;
5459          }
5460
5461#ifndef MINIDIAL
5462    } else if (mymdmtyp == n_ATTDTDM && dialsta != DIA_PART) { /* AT&T ... */
5463        ttsndb();                       /* Send BREAK */
5464#endif /* MINIDIAL */
5465
5466    } else if (dialsta != DIA_PART) { /* All others */
5467
5468        /* Place modem into command mode */
5469
5470        ws = dialini ? dialini : mp->wake_str;
5471        if (ws && (int)strlen(ws) > 0) {
5472            debug(F111,"_dodial default, wake string", ws, wr);
5473            ttslow(ws, wr);
5474        } else debug(F100,"_dodial no wake_str","",0);
5475        if (mp->wake_prompt && (int)strlen(mp->wake_prompt) > 0) {
5476            debug(F110,"_dodial default, waiting for wake_prompt",
5477                  mp->wake_prompt,0);
5478            alarm(10);
5479            waitfor(mp->wake_prompt);
5480            alarm(0);
5481        } else debug(F100,"_dodial no wake_prompt","",0);
5482    }
5483
5484/* Handle error correction, data compression, and flow control... */
5485
5486  xdialec:
5487
5488    if (dialsta != DIA_PART) {
5489        alarm(0);                       /* Turn off alarm */
5490        debug(F100,"_dodial got wake prompt","",0);
5491        msleep(500);                    /* Allow settling time */
5492
5493        /* Enable/disable error-correction */
5494
5495        x = 0;
5496        if (dialec) {                   /* DIAL ERROR-CORRECTION is ON */
5497            if (dialecon) {             /* SET DIAL STRING ERROR-CORRECTION */
5498                if (*dialecon) {
5499                    x = 1;
5500                    ttslow(dialecon, wr);
5501                }
5502            } else if ((mdmcapas & CKD_EC) && *(mp->ec_on_str)) {
5503                x = 1;
5504                ttslow(mp->ec_on_str, wr);
5505            }
5506#ifdef COMMENT
5507            else printf(
5508                  "WARNING - I don't know how to turn on EC for this modem\n"
5509                     );
5510#endif /* COMMENT */
5511        } else {
5512            if (dialecoff) {            /* DIAL ERROR-CORRECTION OFF */
5513                if (*dialecoff) {
5514                    x = 1;
5515                    ttslow(dialecoff, wr);
5516                }
5517            } else if ((mdmcapas & CKD_EC) && *(mp->ec_off_str)) {
5518                x = 1;
5519                ttslow(mp->ec_off_str, wr);
5520            }
5521#ifdef COMMENT
5522            else printf(
5523                  "WARNING - I don't know how to turn off EC for this modem\n"
5524                     );
5525#endif /* COMMENT */
5526        }
5527        debug(F101,"ckudia xx_ok","",xx_ok);
5528        if (x && xx_ok) {                       /* Look for OK response */
5529            debug(F100,"ckudia calling xx_ok for EC","",0);
5530            x = (*xx_ok)(5,1);
5531            debug(F101,"ckudia xx_ok","",x);
5532            if (x < 0) {
5533                printf("WARNING - Trouble enabling error-correction.\n");
5534                printf(
5535" Likely cause: Your modem is an RPI model, which does not have built-in\n");
5536                printf(" error correction and data compression.");
5537            }
5538        }
5539
5540        /* Enable/disable data compression */
5541
5542        if (x > 0) x = 0;
5543        if (dialdc) {
5544            if (x < 0 || !dialec) {
5545                printf(
5546"WARNING - You can't have compression without error correction.\n");
5547            } else if (dialdcon) {      /* SET DIAL STRING ... */
5548                if (*dialdcon) {
5549                    x = 1;
5550                    ttslow(dialdcon, wr);
5551                }
5552            } else if ((mdmcapas & CKD_DC) && *(mp->dc_on_str)) {
5553                x = 1;
5554                ttslow(mp->dc_on_str, wr);
5555            }
5556#ifdef COMMENT
5557            else printf(
5558                  "WARNING - I don't know how to turn on DC for this modem\n"
5559                          );
5560#endif /* COMMENT */
5561        } else {
5562            if (dialdcoff) {
5563                if (*dialdcoff) {
5564                    x = 1;
5565                    ttslow(dialdcoff, wr);
5566                }
5567            } else if ((mdmcapas & CKD_DC) && *(mp->dc_off_str)) {
5568                x = 1;
5569                ttslow(mp->dc_off_str, wr);
5570            }
5571#ifdef COMMENT
5572            else printf(
5573"WARNING - I don't know how to turn off compression for this modem\n"
5574                          );
5575#endif /* COMMENT */
5576        }
5577        if (x && xx_ok) {                       /* Look for OK response */
5578            x = (*xx_ok)(5,1);
5579            if (x < 0) printf("WARNING - Trouble enabling compression\n");
5580        }
5581    }
5582
5583#ifndef NOXFER
5584#ifndef MINIDIAL
5585    if (mdmcapas & CKD_KS && dialsta != DIA_PART) { /* Kermit spoof */
5586        int r;                          /* Register */
5587        char tbcmdbuf[64];              /* Command buffer */
5588        switch (mymdmtyp) {
5589
5590          case n_MICROCOM:              /* Microcoms in SX mode */
5591            if (dialksp)
5592              sprintf(tbcmdbuf,"APM1;KMC%d\015",stchr); /* safe */
5593            else
5594              sprintf(tbcmdbuf,"APM0\015"); /* safe */
5595            ttslow(tbcmdbuf, MICROCOM.wake_rate);
5596            alarm(3);
5597            waitfor(mp->wake_prompt);
5598            alarm(0);
5599            break;
5600
5601          case n_TELEBIT:               /* Old and new Telebits */
5602          case n_TBNEW:
5603            if (!dialksp) {
5604                sprintf(tbcmdbuf,"ATS111=0\015"); /* safe */
5605            } else {
5606                switch (parity) {       /* S111 value depends on parity */
5607                  case 'e': r = 12; break;
5608                  case 'm': r = 13; break;
5609                  case 'o': r = 11; break;
5610                  case 's': r = 14; break;
5611                  case 0:
5612                  default:  r = 10; break;
5613                }
5614                sprintf(tbcmdbuf,"ATS111=%d S112=%d\015",r,stchr); /* safe */
5615            }
5616            ttslow(tbcmdbuf, wr);
5617
5618/* Not all Telebit models have the Kermit spoof, so ignore response. */
5619
5620            if (xx_ok) {                /* Get modem's response */
5621                x = (*xx_ok)(5,1);
5622            }
5623        }
5624    }
5625#endif /* MINIDIAL */
5626#endif /* NOXFER */
5627
5628    /* Speaker */
5629
5630    if (mymdmtyp != n_GENERIC &&
5631        (mdmcapas & CKD_AT) && (dialsta != DIA_PART) &&
5632        !dialspon && !dialspoff &&
5633        !dialvol1 && !dialvol2 &&!dialvol3) {
5634        /* AT command set and commands have not been customized */
5635        /* so combine speaker and volume commands. */
5636        if (mdmspk)
5637          sprintf(lbuf,"ATM1L%d%c",mdmvol,13); /* safe */
5638        else
5639          sprintf(lbuf,"ATM0%c",13);    /* safe */
5640        ttslow(lbuf,wr);                /* Send command */
5641        getok(5,1);                     /* Get but ignore response */
5642    } else if (dialsta != DIA_PART) {   /* Customized or not AT commands */
5643        x = 0;                          /* Do it the hard way */
5644        if (mdmspk) {
5645            if (dialspon) {
5646                if (*dialspon) {
5647                    x = 1;
5648                    ttslow(dialspon,wr);
5649                }
5650            } else {
5651                if (mp->sp_on_str[0]) {
5652                    x = 1;
5653                    ttslow(mp->sp_on_str,wr);
5654                }
5655            }
5656        } else {
5657            /* s = dialspoff ? dialspoff : mp->sp_off_str; */
5658            if (dialspoff) {
5659                if (*dialspoff) {
5660                    x = 1;
5661                    ttslow(dialspoff,wr);
5662                }
5663            } else {
5664                if (mp->sp_off_str[0]) {
5665                    x = 1;
5666                    ttslow(mp->sp_off_str,wr);
5667                }
5668            }
5669        }
5670        if (x) {
5671            if (xx_ok)                  /* Get response */
5672              x = (*xx_ok)(5,1);
5673            if (x && mdmspk) {          /* Good response and speaker on? */
5674                switch (mdmvol) {       /* Yes, send volume command. */
5675                  case 0:
5676                  case 1:
5677                    s = dialvol1 ? dialvol1 : mp->vol1_str; break;
5678                  case 2:
5679                    s = dialvol2 ? dialvol2 : mp->vol2_str; break;
5680                  case 3:
5681                    s = dialvol3 ? dialvol3 : mp->vol3_str; break;
5682                  default:
5683                    s = NULL;
5684                }
5685                if (s) if (*s) {        /* Send volume command. */
5686                    ttslow(s, wr);
5687                    if (xx_ok)          /* Get response but ignore it */
5688                      (*xx_ok)(5,1);
5689                }
5690            }
5691        }
5692    }
5693
5694#ifndef CK_ATDT
5695    /* Dialing Method */
5696
5697    if (dialmth && dialsta != DIA_PART) { /* If dialing method specified... */
5698        char *s = "";                   /* Do it here... */
5699
5700        if (dialmth == XYDM_T && dialtone) /* Tone */
5701          s = dialtone;
5702        else if (dialmth == XYDM_P && dialpulse) /* Pulse */
5703          s = dialpulse;
5704        if (s) if (*s) {
5705            ttslow(s, wr);
5706            if (xx_ok)                  /* Get modem's response */
5707              (*xx_ok)(5,1);            /* (but ignore it...) */
5708        }
5709    }
5710#endif /* CK_ATDT */
5711
5712    if (dialidt) {                      /* Ignore dialtone? */
5713        char *s = "";
5714        s = dialx3 ? dialx3 : mp->ignoredt;
5715        if (s) if (*s) {
5716            ttslow(s, wr);
5717            if (xx_ok)                  /* Get modem's response */
5718              (*xx_ok)(5,1);            /* (but ignore it...) */
5719        }
5720    }
5721    {
5722        char *s = "";                   /* Last-minute init string? */
5723        s = dialini2 ? dialini2 : mp->ini2;
5724        if (s) if (*s) {
5725            ttslow(s, wr);
5726            if (xx_ok)                  /* Get modem's response */
5727              (*xx_ok)(5,1);            /* (but ignore it...) */
5728        }
5729    }
5730    if (func_code == 1) {               /* ANSWER (not DIAL) */
5731        char *s;
5732        s = dialaaon ? dialaaon : mp->aa_on_str;
5733        if (!s) s = "";
5734        if (*s) {
5735            /* Here we would handle caller ID */
5736            ttslow(s, (dialpace > -1) ? wr : mp->dial_rate);
5737            if (xx_ok)                  /* Get modem's response */
5738              (*xx_ok)(5,1);            /* (but ignore it...) */
5739        } else {
5740            printf(
5741"WARNING - I don't know how to enable autoanswer for this modem.\n"
5742                   );
5743        } /* And skip all the phone-number & dialing stuff... */
5744        alarm(waitct);                  /* This much time allowed. */
5745        debug(F101,"_dodial ANSWER waitct","",waitct);
5746
5747    } else {                            /* DIAL (not ANSWER) */
5748
5749        if (dialsta != DIA_PART) {      /* Last dial was not partial */
5750
5751            char *s = "";
5752#ifdef COMMENT
5753            s = dialaaoff ? dialaaoff : mp->aa_off_str;
5754#endif /* COMMENT */
5755            if (s) if (*s) {
5756                ttslow(s, (dialpace > -1) ? wr : mp->dial_rate);
5757                if (xx_ok)              /* Get modem's response */
5758                  (*xx_ok)(5,1);        /* (but ignore it...) */
5759            }
5760
5761            /* Put modem into dialing mode, if the modem requires it. */
5762
5763            if (mp->dmode_str && *(mp->dmode_str)) {
5764                ttslow(mp->dmode_str, (dialpace > -1) ? wr : mp->dial_rate);
5765                savalrm = signal(SIGALRM,dialtime);
5766                alarm(10);
5767                /* Wait for prompt, if any expected */
5768                if (mp->dmode_prompt && *(mp->dmode_prompt)) {
5769                    waitfor(mp->dmode_prompt);
5770                    msleep(300);
5771                }
5772                alarm(0);               /* Turn off alarm on dialing prompts */
5773                signal(SIGALRM,savalrm); /* Restore alarm */
5774            }
5775        }
5776        /* AT-Command-Set non-Generic modem */
5777        if (mdmcapas & CKD_AT && mymdmtyp != n_GENERIC &&
5778            dialsta != DIA_PART) {
5779            if (mdmwait > 255)          /* If larger than maximum, */
5780              mdmwait = 255;            /* make it maximum. */
5781            if (dialesc > 0 &&          /* Modem escape character is set */
5782                dialmhu > 0) {          /* Hangup method is modem command */
5783                int x = dialesc;
5784                if (dialesc < 0 || dialesc > 127)
5785                  x = 128;
5786                sprintf(lbuf,
5787                        "ATS2=%dS7=%d\015",
5788                        dialesc ? x : mp->esc_char, mdmwait); /* safe */
5789            } else
5790              sprintf(lbuf,"ATS7=%d%c",mdmwait,13); /* safe */
5791            ttslow(lbuf,wr);            /* Set it. */
5792            mdmstat = getok(5,1);       /* Get response from modem */
5793            /* If it gets an error, go ahead anyway */
5794            debug(F101,"_dodial S7 mdmstat","",mdmstat);
5795        }
5796        ttflui();                       /* Clear out stuff from modem setup */
5797        inited = 1;                     /* Remember modem is initialized */
5798
5799      REDIAL:
5800        if ((int)strlen(dcmd) + (int)strlen(xnum) > LBUFL)
5801          ckstrncpy(lbuf,"NUMBER TOO LONG!",LBUFL);
5802        else
5803          sprintf(lbuf, dcmd, xnum);    /* safe (prechecked) */
5804        debug(F110,"dialing",lbuf,0);
5805        /* Send the dialing string */
5806        ttslow(lbuf,dialpace > -1 ? wr : mp->dial_rate);
5807
5808        fail_code = F_MODEM;            /* New default failure code changes */
5809        dial_what = DW_DIAL;            /* and our state, too. */
5810        if (dialdpy) {                  /* If showing progress */
5811            p = ck_time();              /* get current time; */
5812            if (*p) printf(" Dialing: %s...\n",p);
5813#ifdef VMS
5814            printf(" \n");
5815            fflush(stdout);
5816#endif /* VMS */
5817        }
5818        alarm(waitct);                  /* This much time allowed. */
5819        debug(F101,"_dodial waitct","",waitct);
5820
5821#ifndef MINIDIAL
5822#ifdef OLDMODEMS
5823        switch (mymdmtyp) {
5824          case n_RACAL:                 /* Acknowledge dialing string */
5825            sleep(3);
5826            ttflui();
5827            ttoc('\015');
5828            break;
5829          case n_VENTEL:
5830            waitfor("\012\012");        /* Ignore the first two strings */
5831            break;
5832          default:
5833            break;
5834        }
5835#endif /* OLDMODEMS */
5836#endif /* MINIDIAL */
5837    }
5838
5839/* Check for connection */
5840
5841    mdmstat = 0;                        /* No status yet */
5842    lbuf[0] = NUL;                      /* Default reason for failure */
5843    debug(F101,"dial awaiting response, mymdmtyp","",mymdmtyp);
5844
5845#ifndef NOSPL
5846    modemmsg[0] = NUL;
5847#endif /* NOSPL */
5848    while (mdmstat == 0) {              /* Till we get a result or time out */
5849
5850        if ((mdmcapas & CKD_AT) && nonverbal) { /* AT command set */
5851            gethrn();                   /* In digit result mode */
5852            if (partial && dialsta == DIA_ERR) {
5853                /*
5854                   If we get an error here, the phone is still
5855                   off hook so we have to hang it up.
5856                */
5857                dialhup();
5858                dialsta = DIA_ERR;      /* (because dialhup() changes it) */
5859            }
5860            continue;
5861
5862        } else if (mymdmtyp == n_UNKNOWN) { /* Unknown modem type */
5863            int x, y = waitct;
5864            mdmstat = D_FAILED;         /* Assume failure. */
5865            while (y-- > -1) {
5866                x = ttchk();
5867                if (x > 0) {
5868                    if (x > LBUFL) x = LBUFL;
5869                    x = ttxin(x,(CHAR *)lbuf);
5870                    if ((x > 0) && dialdpy) conol(lbuf);
5871                } else if (network
5872#ifdef TN_COMPORT
5873                           && !istncomport()
5874#endif /* TN_COMPORT */
5875                           && x < 0) { /* Connection dropped */
5876                    inited = 0;
5877#ifdef NTSIG
5878                    ckThreadEnd(threadinfo);
5879#endif /* NTSIG */
5880                    dialsta = DIA_IO;   /* Call it an I/O error */
5881#ifdef DYNAMIC
5882                    if (rbuf) free(rbuf); rbuf = NULL;
5883                    if (fbuf) free(fbuf); fbuf = NULL;
5884#endif /* DYNAMIC */
5885                    SIGRETURN;
5886                }
5887                x = ttgmdm();           /* Try to read modem signals */
5888                if (x < 0) break;       /* Can't, fail. */
5889                if (x & BM_DCD) {       /* Got signals OK.  Carrier present? */
5890                    mdmstat = CONNECTED; /* Yes, done. */
5891                    break;
5892                }                       /* No, keep waiting. */
5893                sleep(1);
5894            }
5895            continue;
5896        }
5897
5898        for (n = -1; n < LBUFL-1; ) {   /* Accumulate modem response */
5899            int xx;
5900            c2 = (char) (xx = ddinc(0)); /* Read a character, blocking */
5901            if (xx < 1)                 /* Ignore NULs and errors */
5902              continue;                 /* (Timeout will handle errors) */
5903            else                        /* Real character, keep it */
5904              lbuf[++n] = (char) (c2 & 0177);
5905            dialoc(lbuf[n]);            /* Maybe echo it  */
5906            if (mdmcapas & CKD_V25) {   /* V.25bis dialing... */
5907/*
5908  This assumes that V.25bis indications are all at least 3 characters long
5909  and are terminated by either CRLF or LFCR.
5910*/
5911                if (mymdmtyp == n_CCITT) {
5912                    if (n < 3) continue;
5913                    if ((lbuf[n] == CR) && (lbuf[n-1] == LF)) break;
5914                    if ((lbuf[n] == LF) && (lbuf[n-1] == CR)) break;
5915                }
5916#ifndef MINIDIAL
5917                else if (mymdmtyp == n_DIGITEL) {
5918                    if (((lbuf[n] == CR) && (lbuf[n-1] == LF)) ||
5919                        ((lbuf[n] == LF) && (lbuf[n-1] == CR)))
5920                      break;
5921                    else
5922                      continue;
5923                }
5924#endif /* MINIDIAL */
5925            } else {                    /* All others, break on CR or LF */
5926                if ( lbuf[n] == CR || lbuf[n] == LF ) break;
5927            }
5928        }
5929        lbuf[++n] = '\0';               /* Terminate response from modem */
5930        debug(F111,"_dodial modem response",lbuf,n);
5931#ifndef NOSPL
5932        ckstrncpy(modemmsg,lbuf,LBUFL); /* Call result message */
5933        lbuf[79] = NUL;
5934        {
5935            int x;                      /* Strip junk from end */
5936            x = (int)strlen(modemmsg) - 1;
5937            while (x > -1) {
5938                if (modemmsg[x] < (char) 33)
5939                  modemmsg[x] = NUL;
5940                else
5941                  break;
5942                x--;
5943            }
5944        }
5945#endif /* NOSPL */
5946        if (mdmcapas & CKD_AT) {        /* Hayes AT command set */
5947            gethrw();                   /* in word result mode */
5948            if (partial && dialsta == DIA_ERR) {
5949                dialhup();
5950                dialsta = DIA_ERR;      /* (because dialhup() changes it) */
5951            }
5952            continue;
5953        } else if (mdmcapas & CKD_V25) { /* CCITT command set */
5954            if (didweget(lbuf,"VAL")) { /* Dial command confirmation */
5955#ifndef MINIDIAL
5956                if (mymdmtyp == n_CCITT)
5957#endif /* MINIDIAL */
5958                  continue;             /* Go back and read more */
5959#ifndef MINIDIAL
5960/* Digitel doesn't give an explicit connect confirmation message */
5961                else {
5962                    int n;
5963                    for (n = -1; n < LBUFL-1; ) {
5964                        lbuf[++n] = c2 = (char) (ddinc(0) & 0177);
5965                        dialoc(lbuf[n]);
5966                        if (((lbuf[n] == CR) && (lbuf[n-1] == LF)) ||
5967                            ((lbuf[n] == LF) && (lbuf[n-1] == CR)))
5968                          break;
5969                    }
5970                    mdmstat = CONNECTED; /* Assume we're connected */
5971                    if (dialdpy && carrier != CAR_OFF) {
5972#ifdef TN_COMPORT
5973                        if (istncomport()) {
5974                            int i;
5975                            for (i = 0; i < 5; i++) {
5976                                debug(F100,"TN Com Port DCD wait...","",0);
5977                                if ((n = ttgmdm()) >= 0) {
5978                                    if ((n & BM_DCD))
5979                                        break;
5980                                    msleep(500);
5981                                    tnc_wait(
5982                                        (CHAR *)"_dodial waiting for DCD",1);
5983                                }
5984                            }
5985                        } else
5986#endif /* TN_COMPORT */
5987                          sleep(1);     /* Wait a second */
5988                        n = ttgmdm();   /* Try to read modem signals */
5989                        if ((n > -1) && ((n & BM_DCD) == 0))
5990                          printf("WARNING - no carrier\n");
5991                    }
5992                }
5993#endif /* MINIDIAL */
5994
5995                /* Standard V.25bis stuff */
5996
5997            } else if (didweget(lbuf,"CNX")) { /* Connected */
5998                mdmstat = CONNECTED;
5999            } else if (didweget(lbuf, "INV")) {
6000                mdmstat = D_FAILED;     /* Command error */
6001                dialsta = DIA_ERR;
6002                ckstrncpy(lbuf,"INV",LBUFL);
6003
6004            } else if (didweget(lbuf,"CFI")) { /* Call Failure */
6005
6006                if (didweget(lbuf,"AB")) { /* Interpret reason code */
6007                    ckstrncpy(lbuf,"AB: Timed out",LBUFL);
6008                    dialsta = DIA_TIMO;
6009                } else if (didweget(lbuf,"CB")) {
6010                    ckstrncpy(lbuf,"CB: Local DCE Busy",LBUFL);
6011                    dialsta = DIA_NRDY;
6012                } else if (didweget(lbuf,"ET")) {
6013                    ckstrncpy(lbuf,"ET: Busy",LBUFL);
6014                    dialsta = DIA_BUSY;
6015                } else if (didweget(lbuf, "NS")) {
6016                    ckstrncpy(lbuf,"NS: Number not stored",LBUFL);
6017                    dialsta = DIA_ERR;
6018                } else if (didweget(lbuf,"NT")) {
6019                    ckstrncpy(lbuf,"NT: No answer",LBUFL);
6020                    dialsta = DIA_NOAN;
6021                } else if (didweget(lbuf,"RT")) {
6022                    ckstrncpy(lbuf,"RT: Ring tone",LBUFL);
6023                    dialsta = DIA_RING;
6024                } else if (didweget(lbuf,"PV")) {
6025                    ckstrncpy(lbuf,"PV: Parameter value error",LBUFL);
6026                    dialsta = DIA_ERR;
6027                } else if (didweget(lbuf,"PS")) {
6028                    ckstrncpy(lbuf,"PS: Parameter syntax error",LBUFL);
6029                    dialsta = DIA_ERR;
6030                } else if (didweget(lbuf,"MS")) {
6031                    ckstrncpy(lbuf,"MS: Message syntax error",LBUFL);
6032                    dialsta = DIA_ERR;
6033                } else if (didweget(lbuf,"CU")) {
6034                    ckstrncpy(lbuf,"CU: Command unknown",LBUFL);
6035                    dialsta = DIA_ERR;
6036                } else if (didweget(lbuf,"FC")) {
6037                    ckstrncpy(lbuf,"FC: Forbidden call",LBUFL);
6038                    dialsta = DIA_NOAC;
6039                }
6040                mdmstat = D_FAILED;
6041            } else if (didweget(lbuf,"INC")) { /* Incoming Call */
6042                ckstrncpy(lbuf,"INC: Incoming call",LBUFL);
6043                dialsta = DIA_RING;
6044                mdmstat = D_FAILED;
6045            } else if (didweget(lbuf,"DLC")) { /* Delayed Call */
6046                ckstrncpy(lbuf,"DLC: Delayed call",LBUFL);
6047                dialsta = DIA_NOAN;
6048                mdmstat = D_FAILED;
6049            } else                      /* Response was probably an echo. */
6050#ifndef MINIDIAL
6051              if (mymdmtyp == n_CCITT)
6052#endif /* MINIDIAL */
6053                continue;
6054#ifndef MINIDIAL
6055              else                      /* Digitel: If no error, connect. */
6056                mdmstat = CONNECTED;
6057#endif /* MINIDIAL */
6058            break;
6059
6060        } else if (n) {                 /* Non-Hayes-compatibles... */
6061            switch (mymdmtyp) {
6062#ifndef MINIDIAL
6063              case n_ATTMODEM:
6064                /* Careful - "Connected" / "Not Connected" */
6065                if (didweget(lbuf,"Busy")) {
6066                    mdmstat = D_FAILED;
6067                    dialsta = DIA_BUSY;
6068                } else if (didweget(lbuf,"Not connected") ||
6069                           didweget(lbuf,"Not Connected")) {
6070                    mdmstat = D_FAILED;
6071                    dialsta = DIA_NOCA;
6072                } else if (didweget(lbuf,"No dial tone") ||
6073                           didweget(lbuf,"No Dial Tone")) {
6074                    mdmstat = D_FAILED;
6075                    dialsta = DIA_NODT;
6076                } else if (didweget(lbuf,"No answer") ||
6077                           didweget(lbuf,"No Answer")) {
6078                    mdmstat = D_FAILED;
6079                    dialsta = DIA_NOAN;
6080                } else if (didweget(lbuf,"Answered") ||
6081                           didweget(lbuf,"Connected")) {
6082                    mdmstat = CONNECTED;
6083                    dialsta = DIA_OK;
6084                }
6085                break;
6086
6087              case n_ATTISN:
6088                if (didweget(lbuf,"ANSWERED")) {
6089                    mdmstat = CONNECTED;
6090                    dialsta = DIA_OK;
6091                } else if (didweget(lbuf,"BUSY")) {
6092                    mdmstat = D_FAILED;
6093                    dialsta = DIA_BUSY;
6094                } else if (didweget(lbuf,"DISCONNECT")) {
6095                    mdmstat = D_FAILED;
6096                    dialsta = DIA_DISC;
6097                } else if (didweget(lbuf,"NO ANSWER")) {
6098                    mdmstat = D_FAILED;
6099                    dialsta = DIA_NOAN;
6100                } else if (didweget(lbuf,"WRONG ADDRESS")) {
6101                    mdmstat = D_FAILED;
6102                    dialsta = DIA_NOAC;
6103                }
6104                break;
6105
6106              case n_ATTDTDM:
6107                if (didweget(lbuf,"ANSWERED")) {
6108                    mdmstat = CONNECTED;
6109                } else if (didweget(lbuf,"BUSY")) {
6110                    mdmstat = D_FAILED;
6111                    dialsta = DIA_BUSY;
6112                } else if (didweget(lbuf,"CHECK OPTIONS")) {
6113                    mdmstat = D_FAILED;
6114                    dialsta = DIA_ERR;
6115                } else if (didweget(lbuf,"DISCONNECTED")) {
6116                    mdmstat = D_FAILED;
6117                    dialsta = DIA_DISC;
6118                } else if (didweget(lbuf,"DENIED")) {
6119                    mdmstat = D_FAILED;
6120                    dialsta = DIA_NOAC;
6121                }
6122#ifdef DEBUG
6123#ifdef ATT6300
6124                /* Horrible hack lost in history. */
6125                else if (deblog && didweget(lbuf,"~~"))
6126                  mdmstat = CONNECTED;
6127#endif /* ATT6300 */
6128#endif /* DEBUG */
6129                break;
6130
6131#ifdef OLDMODEMS
6132              case n_CERMETEK:
6133                if (didweget(lbuf,"\016A")) {
6134                    mdmstat = CONNECTED;
6135                    ttslow("\016U 1\015",200); /* Make transparent*/
6136                }
6137                break;
6138
6139              case n_DF03:
6140                /* Because response lacks CR or NL . . . */
6141                c = (char) (ddinc(0) & 0177);
6142                dialoc(c);
6143                debug(F000,"dial df03 got","",c);
6144                if ( c == 'A' ) mdmstat = CONNECTED;
6145                if ( c == 'B' ) mdmstat = D_FAILED;
6146                break;
6147
6148              case n_DF100:          /* DF100 has short response codes */
6149                if (strcmp(lbuf,"A") == 0) {
6150                    mdmstat = CONNECTED; /* Attached */
6151                    dialsta = DIA_OK;
6152                } else if (strcmp(lbuf,"N") == 0) {
6153                    mdmstat = D_FAILED;
6154                    dialsta = DIA_NOAN; /* No answer or no dialtone */
6155                } else if (strcmp(lbuf,"E") == 0 || /* Error */
6156                           strcmp(lbuf,"R") == 0) { /* "Ready" (?) */
6157                    mdmstat = D_FAILED;
6158                    dialsta = DIA_ERR;  /* Command error */
6159                }
6160                /* otherwise fall thru... */
6161
6162              case n_DF200:
6163                if (didweget(lbuf,"Attached")) {
6164                    mdmstat = CONNECTED;
6165                    dialsta = DIA_OK;
6166                    /*
6167                     * The DF100 will respond with "Attached" even if DTR
6168                     * and/or carrier are not present.  Another reason to
6169                     * (also) wait for carrier?
6170                     */
6171                } else if (didweget(lbuf,"Busy")) {
6172                    mdmstat = D_FAILED;
6173                    dialsta = DIA_BUSY;
6174                } else if (didweget(lbuf,"Disconnected")) {
6175                    mdmstat = D_FAILED;
6176                    dialsta = DIA_DISC;
6177                } else if (didweget(lbuf,"Error")) {
6178                    mdmstat = D_FAILED;
6179                    dialsta = DIA_ERR;
6180                } else if (didweget(lbuf,"No answer")) {
6181                    mdmstat = D_FAILED;
6182                    dialsta = DIA_NOAN;
6183                } else if (didweget(lbuf,"No dial tone")) {
6184                    mdmstat = D_FAILED;
6185                    dialsta = DIA_NODT;
6186                } else if (didweget(lbuf,"Speed:)")) {
6187                    mdmstat = D_FAILED;
6188                    dialsta = DIA_ERR;
6189                }
6190                /*
6191                 * It appears that the "Speed:..." response comes after an
6192                 * "Attached" response, so this is never seen.  HOWEVER,
6193                 * it would be very handy to detect this and temporarily
6194                 * reset the speed, since it's a nuisance otherwise.
6195                 * If we wait for some more input from the modem, how do
6196                 * we know if it's from the remote host or the modem?
6197                 * Carrier reportedly doesn't get set until after the
6198                 * "Speed:..." response (if any) is sent.  Another reason
6199                 * to (also) wait for carrier.
6200                 */
6201                break;
6202
6203              case n_GDC:
6204                if (didweget(lbuf,"ON LINE"))
6205                  mdmstat = CONNECTED;
6206                else if (didweget(lbuf,"NO CONNECT"))
6207                  mdmstat = D_FAILED;
6208                break;
6209
6210              case n_PENRIL:
6211                if (didweget(lbuf,"OK")) {
6212                    mdmstat = CONNECTED;
6213                } else if (didweget(lbuf,"BUSY")) {
6214                    mdmstat = D_FAILED;
6215                    dialsta = DIA_BUSY;
6216                    } else if (didweget(lbuf,"NO RING")) {
6217                        mdmstat = D_FAILED;
6218                        dialsta = DIA_NOCA;
6219                    }
6220                break;
6221
6222              case n_RACAL:
6223                if (didweget(lbuf,"ON LINE"))
6224                  mdmstat = CONNECTED;
6225                else if (didweget(lbuf,"FAILED CALL"))
6226                  mdmstat = D_FAILED;
6227                break;
6228#endif /* OLDMODEMS */
6229
6230              case n_ROLM:
6231                if (didweget(lbuf,"CALLING"))
6232                  mdmstat = 0;
6233                else if (didweget(lbuf,"COMPLETE"))
6234                  mdmstat = CONNECTED;
6235                else if (didweget(lbuf,"FAILED") ||
6236                         didweget(lbuf,"ABANDONDED")) {
6237                    mdmstat = D_FAILED;
6238                    dialsta = DIA_NOCA;
6239                } else if (didweget(lbuf,"NOT AVAILABLE") ||
6240                           didweget(lbuf,"LACKS PERMISSION") ||
6241                           didweget(lbuf,"NOT A DATALINE") ||
6242                           didweget(lbuf,"INVALID DATA LINE NUMBER") ||
6243                           didweget(lbuf,"INVALID GROUP NAME")) {
6244                    mdmstat = D_FAILED;
6245                    dialsta = DIA_NOAC;
6246                } else if (didweget(lbuf,"BUSY")) {
6247                    mdmstat = D_FAILED;
6248                    dialsta = DIA_BUSY;
6249                } else if (didweget(lbuf,"DOES NOT ANSWER")) {
6250                    mdmstat = D_FAILED;
6251                    dialsta = DIA_NOAN;
6252                }
6253                break;
6254
6255#ifdef OLDMODEMS
6256              case n_VENTEL:
6257                if (didweget(lbuf,"ONLINE!") ||
6258                    didweget(lbuf,"Online!")) {
6259                    mdmstat = CONNECTED;
6260                } else if (didweget(lbuf,"BUSY") ||
6261                           didweget(lbuf,"Busy")) {
6262                    mdmstat = D_FAILED;
6263                    dialsta = DIA_BUSY;
6264                } else if (didweget(lbuf,"DEAD PHONE")) {
6265                    mdmstat = D_FAILED;
6266                    dialsta = DIA_DISC;
6267                }
6268                break;
6269
6270              case n_CONCORD:
6271                if (didweget(lbuf,"INITIATING"))
6272                  mdmstat = CONNECTED;
6273                else if (didweget(lbuf,"BUSY")) {
6274                    mdmstat = D_FAILED;
6275                    dialsta = DIA_BUSY;
6276                } else if (didweget(lbuf,"CALL FAILED")) {
6277                    mdmstat = D_FAILED;
6278                    dialsta = DIA_NOCA;
6279                }
6280                break;
6281#endif /* OLDMODEMS */
6282
6283              case n_MICROCOM:
6284                /* "RINGBACK" means phone line ringing, continue */
6285                if (didweget(lbuf,"NO CONNECT")) {
6286                    mdmstat = D_FAILED;
6287                    dialsta = DIA_NOCA;
6288                } else if (didweget(lbuf,"BUSY")) {
6289                    mdmstat = D_FAILED;
6290                    dialsta = DIA_BUSY;
6291                } else if (didweget(lbuf,"NO DIALTONE")) {
6292                    mdmstat = D_FAILED;
6293                    dialsta = DIA_NODT;
6294                } else if (didweget(lbuf,"COMMAND ERROR")) {
6295                    mdmstat = D_FAILED;
6296                    dialsta = DIA_ERR;
6297                } else if (didweget(lbuf,"IN USE")) {
6298                    mdmstat = D_FAILED;
6299                    dialsta = DIA_NOAC;
6300                } else if (didweget(lbuf,"CONNECT")) {
6301                    mdmstat = CONNECTED;
6302                    /* trailing speed ignored */
6303                }
6304                break;
6305
6306#endif /* MINIDIAL */
6307              default:
6308                printf(
6309                    "PROGRAM ERROR - No response handler for modem type %d\n",
6310                       mymdmtyp);
6311                mdmstat = D_FAILED;
6312                dialsta = DIA_ERR;
6313            }
6314        }
6315    } /* while (mdmstat == 0) */
6316
6317    debug(F101,"_dodial alarm off","",x);
6318    alarm(0);
6319    if (mdmstat == D_FAILED) {          /* Failure detected by modem  */
6320        dialfail(F_MODEM);
6321#ifdef NTSIG
6322        ckThreadEnd(threadinfo);
6323#endif /* NTSIG */
6324        SIGRETURN;
6325    } else if (mdmstat == D_PARTIAL )   { /* Partial dial command OK */
6326        msleep(500);
6327        debug(F100,"dial partial","",0);
6328    } else {                            /* Call was completed */
6329        int x;
6330        msleep(700);                    /* In case modem signals blink  */
6331        debug(F100,"dial succeeded","",0);
6332        if (
6333#ifndef MINIDIAL
6334            mymdmtyp != n_ROLM          /* Rolm has weird modem signaling */
6335#else
6336            1
6337#endif /* MINIDIAL */
6338            ) {
6339            alarm(3);                   /* In case ttpkt() gets stuck... */
6340            ttpkt(speed,FLO_DIAX,parity); /* Cancel dialing state ioctl */
6341            alarm(0);
6342        }
6343/*
6344  In case CD went off in the interval between call completion and return
6345  from ttpkt()...
6346*/
6347        if (carrier != CAR_OFF) {
6348            if ((x = ttgmdm()) >= 0) {
6349#ifdef TN_COMPORT
6350                if (istncomport() && !(x & BM_DCD)) {
6351                    int i;
6352                    for (i = 0; i < 5; i++) {
6353                        msleep(500);
6354                        tnc_wait((CHAR *)"_dodial waiting for DCD",1);
6355                        if ((x = ttgmdm()) >= 0) {
6356                            if ((x & BM_DCD))
6357                                break;
6358                        }
6359                    }
6360                }
6361#endif /* TN_COMPORT */
6362                if (!(x & BM_DCD))
6363                  printf("WARNING: Carrier seems to have dropped...\n");
6364            }
6365        }
6366    }
6367    dreset();                           /* Reset alarms and signals. */
6368    if (!quiet && !backgrd) {
6369        if (dialdpy && (p = ck_time())) { /* If DIAL DISPLAY ON, */
6370            printf(" %sall complete: %s.\n", /* include timestamp.  */
6371                   (mdmstat == D_PARTIAL) ?
6372                   "Partial c" :
6373                   "C",
6374                   p );
6375        } else if (modemmsg[0]) {
6376            printf (" %sall complete: \"%s\".\n",
6377                    (mdmstat == D_PARTIAL) ? "Partial c" : "C",
6378                    (char *)modemmsg
6379                    );
6380        } else {
6381            printf (" %sall complete.\n",
6382                    (mdmstat == D_PARTIAL) ?
6383                    "Partial c" :
6384                    "C"
6385                    );
6386        }
6387    }
6388#ifdef CKLOGDIAL
6389    dologdial(telnbr);
6390#endif /* CKLOGDIAL */
6391
6392#ifdef DYNAMIC
6393    if (rbuf) free(rbuf); rbuf = NULL;
6394    if (fbuf) free(fbuf); fbuf = NULL;
6395#endif /* DYNAMIC */
6396    dialsta = (mdmstat == D_PARTIAL) ? DIA_PART : DIA_OK;
6397#ifdef NTSIG
6398    ckThreadEnd(threadinfo);
6399#endif /* NTSIG */
6400    SIGRETURN;
6401}
6402
6403static SIGTYP
6404#ifdef CK_ANSIC
6405faildial(void * threadinfo)
6406#else /* Not CK_ANSIC */
6407faildial(threadinfo) VOID * threadinfo;
6408#endif /* CK_ANSIC */
6409/* faildial */ {
6410    debug(F100,"longjmp returns to dial routine","",0);
6411    dialfail(fail_code);
6412    SIGRETURN;
6413}
6414
6415/*
6416  nbr = number to dial (string)
6417  x1  = Retry counter
6418  x2  = Number counter
6419  fc  = Function code:
6420        0 == DIAL
6421        1 == ANSWER
6422        2 == INIT/CONFIG
6423        3 == PARTIAL DIAL
6424*/
6425
6426int
6427#ifdef OLD_DIAL
6428ckdial(nbr) char *nbr;
6429#else
6430ckdial(nbr, x1, x2, fc, redial) char *nbr; int x1, x2, fc, redial;
6431#endif /* OLD_DIAL */
6432/* ckdial */ {
6433#define ERMSGL 50
6434    char errmsg[ERMSGL], *erp;          /* For error messages */
6435    int n = F_TIME;
6436    char *s;
6437    long spdmax;
6438#ifdef OS2
6439    extern int term_io;
6440    int term_io_sav = term_io;
6441#endif /* OS2 */
6442
6443    char *mmsg = "Sorry, DIAL memory buffer can't be allocated\n";
6444    /*
6445      A DIAL command implies a SET MODEM TYPE command and therefore enables
6446      hanging up by modem commands rather than dropping DTR.
6447    */
6448    mdmset = 1;                         /* See mdmhup() */
6449
6450    partial = 0;
6451    if (fc == 3) {                      /* Partial dial requested */
6452        partial = 1;                    /* Set flag */
6453        fc = 0;                         /* Treat like regular dialing */
6454    }
6455    func_code = fc;                     /* Make global to this module */
6456    telnbr = nbr;
6457    xredial = redial;
6458    debug(F111,"ckdial entry partial",ckitoa(fc),partial);
6459    debug(F111,"ckdial entry number",nbr,redial);
6460
6461    if (fc == 1) {                      /* ANSWER command? */
6462        /* Reset caller ID strings */
6463        if (callid_date) makestr(&callid_date,NULL);
6464        if (callid_time) makestr(&callid_time,NULL);
6465        if (callid_name) makestr(&callid_name,NULL);
6466        if (callid_nmbr) makestr(&callid_nmbr,NULL);
6467        if (callid_mesg) makestr(&callid_mesg,NULL);
6468    }
6469
6470#ifdef CK_TAPI_X
6471    if (tttapi && tapipass) {
6472        if (modemp[n_TAPI] = cktapiGetModemInf()) {
6473            mymdmtyp = n_TAPI;
6474        } else {
6475            mymdmtyp = mdmtyp;
6476            modemp[n_TAPI] = &GENERIC;
6477        }
6478    } else
6479#endif /* CK_TAPI */
6480    mymdmtyp = mdmtyp;
6481    if (mymdmtyp < 0) {                 /* Whoa, network dialing... */
6482        if (mdmsav > -1)
6483          mymdmtyp = mdmsav;
6484    }
6485    if (mymdmtyp < 0) {
6486        printf("Invalid modem type %d - internal error.\n",mymdmtyp);
6487        dialsta = DIA_NOMO;
6488        return(0);
6489    }
6490    dial_what = DW_NOTHING;             /* Doing nothing at first. */
6491    nonverbal = 0;
6492
6493/* These are ONLY for the purpose of interpreting numeric result codes. */
6494
6495    is_motorola =
6496#ifdef MINIDIAL
6497      0
6498#else
6499      mymdmtyp == n_SUPRA || mymdmtyp == n_SUPRASON;
6500#endif /* MINIDIAL */
6501        ;
6502
6503    is_motorola =
6504#ifdef MINIDIAL
6505      0
6506#else
6507      mymdmtyp == n_MOTOROLA || mymdmtyp == n_MONTANA;
6508#endif /* MINIDIAL */
6509        ;
6510
6511    is_rockwell =
6512#ifdef MINIDIAL
6513      0
6514#else
6515      mymdmtyp == n_RWV32 || mymdmtyp == n_RWV32B ||
6516        mymdmtyp == n_RWV34 || mymdmtyp == n_RWV90 ||
6517          mymdmtyp == n_BOCA || mymdmtyp == n_TELEPATH ||
6518            mymdmtyp == n_CARDINAL || mymdmtyp == n_BESTDATA ||
6519              mymdmtyp == n_CONEXANT || mymdmtyp == n_PCTEL
6520#endif /* MINIDIAL */
6521        ;
6522
6523    is_hayeshispd =
6524#ifdef MINIDIAL
6525      0
6526#else
6527      mymdmtyp == n_H_ULTRA || mymdmtyp == n_H_ACCURA || n_PPI
6528#endif /* MINIDIAL */
6529        ;
6530
6531    is_supra =
6532#ifdef MINIDIAL
6533      0
6534#else
6535      mymdmtyp == n_SUPRA || mymdmtyp == n_SUPRAX || n_SUPRASON
6536#endif /* MINIDIAL */
6537        ;
6538
6539    mp = modemp[mymdmtyp];              /* Set pointer to modem info */
6540    if (!mp) {
6541        printf("Sorry, handler for this modem type not yet filled in.\n");
6542        dialsta = DIA_NOMO;
6543        return 0;
6544    }
6545    debug(F110,"dial number",telnbr,0);
6546#ifdef COMMENT
6547    debug(F110,"dial prefix",(dialnpr ? dialnpr : ""), 0);
6548#endif /* COMMENT */
6549
6550#ifdef DYNAMIC
6551    *lbuf = NUL;
6552    debug(F101,"DIAL lbuf malloc ok","",LBUFL+1);
6553
6554    if (!rbuf) {    /* This one might already have been allocated by getok() */
6555        if (!(rbuf = malloc(RBUFL+1))) {    /* Allocate input line buffer */
6556            printf("%s", mmsg);
6557            dialsta = DIA_IE;
6558            return 0;
6559        } else
6560          debug(F101,"DIAL rbuf malloc ok","",RBUFL+1);
6561    }
6562    if (!(fbuf = malloc(FULLNUML+1))) {    /* Allocate input line buffer */
6563        printf("%s", mmsg);
6564        dialsta = DIA_IE;
6565        if (rbuf) free(rbuf); rbuf = NULL;
6566        return 0;
6567    }
6568    debug(F101,"DIAL fbuf malloc ok","",FULLNUML+1);
6569#endif /* DYNAMIC */
6570
6571    /* NOTE: mdmtyp, not mymdmtyp */
6572
6573    if (ttopen(ttname,&local,mdmtyp,0) < 0) { /* Open, no carrier wait */
6574        erp = errmsg;
6575        if ((int)strlen(ttname) < (ERMSGL - 18)) /* safe, checked */
6576          sprintf(erp,"Sorry, can't open %s",ttname);
6577        else
6578          sprintf(erp,"Sorry, can't open device");
6579        perror(errmsg);
6580        dialsta = DIA_OPEN;
6581#ifdef DYNAMIC
6582        if (rbuf) free(rbuf); rbuf = NULL;
6583        if (fbuf) free(fbuf); fbuf = NULL;
6584#endif /* DYNAMIC */
6585        return 0;
6586    }
6587
6588#ifdef CK_TAPI
6589    if (!tttapi) {
6590#endif /* CK_TAPI */
6591
6592/* Condition console terminal and communication line */
6593
6594    /* Place line into "clocal" dialing state, */
6595    /* important mainly for System V UNIX.     */
6596
6597    if (ttpkt(speed,FLO_DIAL,parity) < 0) {
6598        ttclos(0);                      /* If ttpkt fails do all this... */
6599        if (ttopen(ttname,&local,mymdmtyp,0) < 0) {
6600            erp = errmsg;
6601            if ((int)strlen(ttname) < (ERMSGL - 18)) /* safe, checked */
6602              sprintf(erp,"Sorry, can't reopen %s",ttname);
6603            else
6604              sprintf(erp,"Sorry, can't reopen device");
6605            perror(errmsg);
6606            dialsta = DIA_OPEN;
6607#ifdef DYNAMIC
6608            if (rbuf) free(rbuf); rbuf = NULL;
6609            if (fbuf) free(fbuf); fbuf = NULL;
6610#endif /* DYNAMIC */
6611            return 0;
6612        }                               /* And try again. */
6613        if ((ttpkt(speed,FLO_DIAL,parity) < 0)
6614#ifdef UNIX
6615        && (strcmp(ttname,"/dev/null"))
6616#else
6617#ifdef OSK
6618        && (strcmp(ttname,"/nil"))
6619#endif /* OSK */
6620#endif /* UNIX */
6621#ifdef CK_TAPI
6622             && !tttapi
6623#endif /* CK_TAPI */
6624            ) {
6625            printf("Sorry, Can't condition communication line\n");
6626            printf("Try 'set line %s' again\n",ttname);
6627            dialsta = DIA_OPEN;
6628#ifdef DYNAMIC
6629            if (rbuf) free(rbuf); rbuf = NULL;
6630            if (fbuf) free(fbuf); fbuf = NULL;
6631#endif /* DYNAMIC */
6632            return 0;
6633        }
6634    }
6635#ifdef CK_TAPI
6636    }
6637#endif /* CK_TAPI */
6638
6639    /* Modem's escape sequence... */
6640
6641    if (dialesc < 0 || dialesc > 127)
6642      c = NUL;
6643    else
6644      c = (char) (dialesc ? dialesc : mp->esc_char);
6645    mdmcapas = dialcapas ? dialcapas : mp->capas;
6646
6647    xx_ok = mp->ok_fn;                  /* Pointer to response reader */
6648
6649    if (mdmcapas & CKD_AT) {            /* Hayes compatible */
6650        escbuf[0] = c;
6651        escbuf[1] = c;
6652        escbuf[2] = c;
6653        escbuf[3] = NUL;
6654        /* In case this modem type is user-defined */
6655        if (!xx_ok) xx_ok = getok;
6656    } else {                            /* Other */
6657        escbuf[0] = c;
6658        escbuf[1] = NUL;
6659        /* In case user-defined */
6660        if (mdmcapas & CKD_V25) if (!xx_ok) xx_ok = getok;
6661    }
6662
6663    /* Partial dialing */
6664
6665    if (mdmcapas & CKD_AT
6666#ifndef MINIDIAL
6667        || mymdmtyp == n_MICROCOM
6668#endif /* MINIDIAL */
6669        ) {
6670        int x;
6671        x = (int) strlen(telnbr);
6672        if (x > 0) {
6673            if (telnbr[x-1] == ';') {
6674                partial = 1;
6675                debug(F110,"ckdial sets partial=1:",telnbr,0);
6676            } else if (partial) {
6677                ckmakmsg(fbuf,FULLNUML,telnbr,";",NULL,NULL); /* add one */
6678                telnbr = fbuf;
6679            }
6680        }
6681    }
6682    msleep(500);
6683
6684    debug(F101,"ckdial dialtmo","",dialtmo); /* Timeout */
6685
6686    if (fc == 1) {                      /* ANSWER */
6687        waitct = (dialatmo > -1) ? dialatmo : 0;
6688    } else {                            /* DIAL */
6689        if (dialtmo < 1) {              /* Automatic computation. */
6690#ifdef CK_TAPI
6691            if (tttapi && !tapipass) {
6692                waitct = 1 * (int)strlen(telnbr) ; /* Worst case dial time */
6693                waitct += 60;           /* dialtone + completion wait times */
6694                for (s = telnbr; *s; s++) { /* add in pause characters time */
6695                    if (*s == ',') {
6696                        waitct += 2; /* unless it was changed in the modem */
6697                    } else if (*s == 'W' ||
6698                               *s == 'w' ||
6699                               *s == '$' ||
6700                               *s == '@'
6701                               ) {
6702                        waitct += 8;
6703                    }
6704                }
6705            } else {
6706#endif /* CK_TAPI */
6707                waitct = 1 * (int)strlen(telnbr) ;
6708                /* dialtone + completion wait times */
6709                waitct += mp->dial_time;
6710                for (s = telnbr; *s; s++) {
6711                    for (p = mp->pause_chars; *p; p++)
6712                      if (*s == *p) {
6713                          waitct += mp->pause_time;
6714                          break;
6715                      }
6716                }
6717#ifdef CK_TAPI
6718            }
6719#endif /* CK_TAPI */
6720        } else {
6721            waitct = dialtmo;           /* User-specified timeout */
6722        }
6723        debug(F101,"ckdial waitct A","",waitct);
6724    }
6725
6726/*
6727  waitct is our alarm() timer.
6728  mdmwait is how long we tell the modem to wait for carrier.
6729  We set mdmwait to be 5 seconds less than waitct, to increase the
6730  chance that we get a response from the modem before timing out.
6731*/
6732    if (waitct <= 0) {                  /* 0 or negative means wait forever  */
6733#ifdef COMMENT
6734        waitct = 254;                   /* These were backwards in 7.0.196 */
6735        mdmwait = 0;
6736#else
6737        waitct = 0;                     /* Fixed in 7.0.198. */
6738        mdmwait = 254;
6739#endif /* COMMENT */
6740    } else {
6741        if (dialtmo < 1) {              /* Automatic computation. */
6742#ifdef XWAITCT
6743            /* Addtl wait slop can be defined at compile time */
6744            waitct += XWAITCT;
6745#endif /* XWAITCT */
6746            if (waitct < 60 + mdmwaitd)
6747              waitct = 60 + mdmwaitd;
6748        }
6749        if (mdmcapas & CKD_AT) {        /* AT command-set modems */
6750            mdmwait = waitct;           /* S7 timeout = what user asked for */
6751            waitct += mdmwaitd;         /* Kermit timeout a bit later */
6752        } else {                        /* Non-AT */
6753            mdmwait = waitct;           /* no difference */
6754        }
6755    }
6756    debug(F101,"ckdial waitct B","",waitct);
6757    if (fc == 1) {                      /* ANSWER */
6758#ifdef COMMENT
6759/*
6760  This is wrong.  mdmwait is the value given to S7 in Hayeslike modems.
6761  When in autoanswer mode, this is the amount of time the modem waits for
6762  carrier once ringing starts.  Whereas waitct is the timeout given to the
6763  ANSWER command, which is an entirely different thing.  Since the default
6764  ANSWER timeout is 0 (meaning "wait forever"), the following statement sets
6765  S7 to 0, which, on some modems (like the USR Sportster) makes it hang up
6766  and report NO CARRIER the instant the phone rings.
6767*/
6768        mdmwait = waitct;
6769#else
6770        if (mdmwait <= 0)
6771          mdmwait = 60;                 /* Always wait 60 seconds. */
6772#endif /* COMMENT */
6773
6774    }
6775    if (!quiet && !backgrd) {           /* Print information messages. */
6776#ifdef VMS
6777        printf(" \n");
6778        fflush(stdout);
6779#endif /* VMS */
6780        if (fc == 1)
6781          printf(" Waiting for phone call...\n");
6782        else
6783          printf(" %srying: %s...\n", x1 > 0 ? "Ret" : "T", telnbr);
6784        if (x1 == 0 && x2 == 0 && dialsta != DIA_PART) {
6785            if (network) {
6786                printf(" Via modem server: %s, modem: %s\n",
6787                       ttname, gmdmtyp() );
6788            } else {
6789#ifdef CK_TAPI
6790                if (tttapi && !tapipass)
6791                  printf(" Device: %s, modem: %s", ttname, "TAPI" );
6792                else
6793#endif /* CK_TAPI */
6794                printf(" Device: %s, modem: %s",
6795                       ttname, gmdmtyp() );
6796                if (speed > -1L)
6797                  printf(", speed: %ld\n", speed);
6798                else
6799                  printf(", speed: (unknown)\n");
6800            }
6801            spdmax = dialmax > 0L ? dialmax : mp->max_speed;
6802
6803#ifndef NOHINTS
6804            if (hints && !quiet &&
6805                !network && spdmax > 0L && speed > spdmax
6806#ifdef CK_TAPI
6807                && (!tttapi || tapipass)
6808#endif /* CK_TAPI */
6809                ) {
6810                printf("\n*************************\n");
6811                printf(
6812    "Interface speed %ld might be too high for this modem type.\n",
6813                       speed
6814                       );
6815                printf(
6816    "If dialing fails, SET SPEED to %ld or less and try again.\n",
6817                       spdmax
6818                       );
6819                printf("(Use SET HINTS OFF to suppress future hints.)\n");
6820                printf("*************************\n");
6821                printf("\n");
6822            }
6823#endif /* NOHINTS */
6824            printf(" %s timeout: ", fc == 0 ? "Dial" : "Answer");
6825            if (waitct > 0)
6826              printf("%d seconds\n",mdmwait);
6827            else
6828              printf(" (none)\n");
6829            printf(
6830#ifdef MAC
6831               " Type Command-. to cancel.\n"
6832#else
6833#ifdef UNIX
6834               " To cancel: type your interrupt character (normally Ctrl-C).\n"
6835#else
6836               " To cancel: type Ctrl-C (hold down Ctrl, press C).\n"
6837#endif /* UNIX */
6838#endif /* MAC */
6839               );
6840        }
6841    }
6842    debug(F111,"ckdial",ttname,(int) (speed / 10L));
6843    debug(F101,"ckdial timeout","",waitct);
6844#ifdef OS2
6845    term_io = 0;
6846#endif /* OS2 */
6847
6848/* Set timer and interrupt handlers. */
6849    savint = signal( SIGINT, dialint ) ; /* And terminal interrupt handler. */
6850    cc_alrm_execute(ckjaddr(sjbuf), 0, dialtime, _dodial, faildial);
6851
6852    signal(SIGINT, savint);
6853#ifdef OS2
6854    if (dialsta == DIA_OK)              /* Dialing is completed */
6855      DialerSend(OPT_KERMIT_CONNECT, 0);
6856    term_io = term_io_sav;
6857#endif /* OS2 */
6858    if (dialsta == DIA_PART || dialsta == DIA_OK) {
6859        /* This is needed, e.g., for Telnet modem servers */
6860        if (reliable != SET_OFF || !setreliable) {
6861            reliable = SET_OFF;         /* Transport is not reliable */
6862            debug(F101,"ckdial reliable","",reliable);
6863        }
6864        return(1);                      /* Dial attempt succeeded */
6865    } else {
6866        return(0);                      /* Dial attempt failed */
6867    }
6868} /* ckdial */
6869
6870/*
6871  getok() - wait up to n seconds for OK (0) or ERROR (4) response from modem.
6872  Use with Hayeslike or CCITT modems for reading the reply to a nondialing
6873  command.
6874
6875  Second argument says whether to be strict about numeric result codes, i.e.
6876  to require they be preceded by CR or else be the first character in the
6877  response, e.g. to prevent the ATH0<CR> echo from looking like a valid
6878  response.  Strict == 0 is needed for ATI on Telebit, which can return the
6879  model number concatenated with the numeric response code, e.g. "9620"
6880  ("962" is the model number, "0" is the response code).  getok() Returns:
6881
6882   0 if it timed out,
6883   1 if it succeeded,
6884  -1 on modem command, i/o, or other error.
6885*/
6886static ckjmpbuf okbuf;
6887
6888static SIGTYP
6889#ifdef CK_ANSIC
6890oktimo(int foo)                         /* Alarm handler for getok(). */
6891#else
6892oktimo(foo) int foo;                    /* Alarm handler for getok(). */
6893#endif /* CK_ANSIC */
6894/* oktimo */ {
6895
6896#ifdef OS2
6897    alarm(0);
6898    /* signal(SIGALRM,SIG_IGN); */
6899    debug(F100,"oktimo() SIGALRM caught -- SIG_IGN set","",0) ;
6900#endif /* OS2 */
6901
6902#ifdef OSK                              /* OS-9, see comment in dialtime(). */
6903    sigmask(-1);
6904#endif /* OSK */
6905#ifdef NTSIG
6906    if ( foo == SIGALRM )
6907      PostAlarmSigSem();
6908    else
6909      PostCtrlCSem();
6910#else /* NTSIG */
6911#ifdef NT
6912    cklongjmp(ckjaddr(okbuf),1);
6913#else /* NT */
6914    cklongjmp(okbuf,1);
6915#endif /* NTSIG */
6916#endif /* NT */
6917    /* NOTREACHED */
6918    SIGRETURN;
6919}
6920
6921static int okstatus, okn, okstrict;
6922
6923static SIGTYP
6924#ifdef CK_ANSIC
6925dook(void * threadinfo)
6926#else /* CK_ANSIC */
6927dook(threadinfo) VOID * threadinfo ;
6928#endif /* CK_ANSIC */
6929/* dook */ {
6930    CHAR c;
6931#ifdef DEBUG
6932    char * mdmmsg = "";
6933#endif /* DEBUG */
6934
6935    int i, x;
6936#ifdef IKSD
6937    extern int inserver;
6938#endif /* IKSD */
6939#ifdef NTSIG
6940    signal(SIGINT,oktimo);
6941    if (threadinfo) {                   /* Thread local storage... */
6942        TlsSetValue(TlsIndex,threadinfo);
6943    }
6944#endif /* NTSIG */
6945#ifdef CK_LOGIN
6946#ifdef NT
6947#ifdef IKSD
6948    if (inserver)
6949      setntcreds();
6950#endif /* IKSD */
6951#endif /* NT */
6952#endif /* CK_LOGIN */
6953
6954    if (mdmcapas & CKD_V25) {           /* CCITT, easy... */
6955        waitfor("VAL");
6956        okstatus = 1;
6957        debug(F111,"Modem_Response(V25)","VAL",okstatus);
6958#ifdef NTSIG
6959        ckThreadEnd(threadinfo);
6960#endif /* NTSIG */
6961        SIGRETURN;
6962#ifndef MINIDIAL
6963    } else if (mymdmtyp == n_MICROCOM) { /* Microcom in SX mode, also easy */
6964        waitfor(MICROCOM.wake_prompt);  /* (I think...) */
6965        debug(F111,"Modem_Response(Microcom)",MICROCOM.wake_prompt,okstatus);
6966        okstatus = 1;
6967#ifdef NTSIG
6968        ckThreadEnd(threadinfo);
6969#endif /* NTSIG */
6970        SIGRETURN;
6971#endif /* MINIDIAL */
6972    } else {                            /* Hayes & friends, start here... */
6973        okstatus = 0;                   /* No status yet. */
6974        for (x = 0; x < RBUFL; x++)     /* Initialize response buffer */
6975          rbuf[x] = SP;                 /*  to all spaces */
6976        rbuf[RBUFL] = NUL;              /* and terminate with NUL. */
6977        while (okstatus == 0) {         /* While no status... */
6978            x = ddinc(okn);             /* Read a character */
6979            if (x < 0) {                /* I/O error */
6980                okstatus = -1;
6981#ifdef NTSIG
6982                ckThreadEnd(threadinfo);
6983#endif /* NTSIG */
6984                SIGRETURN;
6985            }
6986#ifdef COMMENT
6987            /* too much */
6988            debug(F101,"getok ddinc","",x); /* Got a character. */
6989#endif /* COMMENT */
6990            c = (char) (x & 0x7f);      /* Get low order 7 bits */
6991            if (!c)                     /* Don't deposit NULs */
6992              continue;                 /* or else didweget() won't work */
6993            if (dialdpy) conoc((char)c); /* Echo it if requested */
6994            for (i = 0; i < RBUFL-1; i++) /* Rotate buffer */
6995              rbuf[i] = rbuf[i+1];
6996            rbuf[RBUFL-1] = c;          /* Deposit character at end */
6997#ifdef COMMENT
6998            /* too much */
6999            debug(F000,"getok:",rbuf,(int) c); /* Log it */
7000#endif /* COMMENT */
7001            switch (c) {                /* Interpret it. */
7002              case CR:                  /* Got a carriage return. */
7003                switch(rbuf[RBUFL-2]) { /* Look at character before it. */
7004                  case '0':             /* 0 = OK numeric response */
7005                    if (!okstrict ||
7006                        rbuf[RBUFL-3] == CR || rbuf[RBUFL-3] == SP) {
7007                        nonverbal = 1;
7008                        okstatus = 1;   /* Good response */
7009                    }
7010                    debug(F111,"Modem_Response(Hayes)","0",okstatus);
7011                    break;
7012                  case '4':             /* 4 = ERROR numeric response */
7013#ifndef MINIDIAL
7014                    /* Or Telebit model number 964! */
7015                    if (mymdmtyp == n_TELEBIT &&
7016                        isdigit(rbuf[RBUFL-3]) &&
7017                        isdigit(rbuf[RBUFL-4]))
7018                      break;
7019                    else
7020#endif /* MINIDIAL */
7021                      if (!okstrict ||
7022                        rbuf[RBUFL-3] == CR || rbuf[RBUFL-3] == SP) {
7023                        nonverbal = 1;
7024                        okstatus = -1;  /* Bad command */
7025                    }
7026                    debug(F111,"Modem_Response(Hayes)","4",okstatus);
7027                    break;
7028                }
7029                if (dialdpy && nonverbal) /* If numeric results, */
7030                  conoc(LF);              /* echo a linefeed too. */
7031                break;
7032              case LF:                  /* Got a linefeed. */
7033                /*
7034                  Note use of explicit octal codes in the string for
7035                  CR and LF.  We want real CR and LF here, not whatever
7036                  the compiler happens to replace \r and \n with...
7037                */
7038                if (!strcmp(rbuf+RBUFL-4,"OK\015\012")) { /* Good response */
7039                    okstatus = 1;
7040                    debug(F111,"Modem_Response(Hayes)","OK",okstatus);
7041                }
7042                if (!strcmp(rbuf+RBUFL-3,"OK\012")) { /* Good response */
7043                    okstatus = 1;
7044                    debug(F111,"Modem_Response(Hayes)","OK",okstatus);
7045                } else if (!strcmp(rbuf+RBUFL-7,"ERROR\015\012")) { /* Error */
7046                    okstatus = -1;
7047                    debug(F111,"Modem_Response(Hayes)","ERROR",okstatus);
7048                } else if (!strcmp(rbuf+RBUFL-6,"ERROR\012")) { /* Error */
7049                    okstatus = -1;
7050                    debug(F111,"Modem_Response(Hayes)","ERROR",okstatus);
7051                }
7052                break;
7053              /* Check whether modem echoes its commands... */
7054              case 't':                 /* Got little t */
7055                if (!strcmp(rbuf+RBUFL-3,"\015at") || /* See if it's "at" */
7056                    !strcmp(rbuf+RBUFL-3," at"))
7057                    mdmecho = 1;
7058                /* debug(F111,"MDMECHO-t",rbuf+RBUFL-2,mdmecho); */
7059                break;
7060              case 'T':                 /* Got Big T */
7061                if (!strcmp(rbuf+RBUFL-3,"\015AT") ||   /* See if it's "AT" */
7062                    !strcmp(rbuf+RBUFL-3," AT"))
7063                    mdmecho = 1;
7064                /* debug(F111,"MDMECHO-T",rbuf+RBUFL-3,mdmecho); */
7065                break;
7066              default:                  /* Other characters, accumulate. */
7067                okstatus = 0;
7068                break;
7069            }
7070        }
7071    }
7072    debug(F101,"getok","",okstatus);    /* <-- It's a lie (why?) */
7073#ifdef NTSIG
7074    ckThreadEnd(threadinfo);
7075#endif /* NTSIG */
7076    SIGRETURN;
7077}
7078
7079static SIGTYP
7080#ifdef CK_ANSIC
7081failok(void * threadinfo)
7082#else /* CK_ANSIC */
7083failok(threadinfo) VOID * threadinfo;
7084#endif /* CK_ANSIC */
7085/* failok */ {
7086    debug(F100,"longjmp returned to getok()","",0);
7087    debug(F100,"getok timeout","",0);
7088    SIGRETURN;
7089}
7090
7091int
7092getok(n, strict) int n, strict; {
7093    debug(F101,"getok entry n","",n);
7094    okstatus = 0;
7095    okn = n;
7096    okstrict = strict;
7097
7098#ifdef DYNAMIC
7099    if (!rbuf) {
7100        if (!(rbuf = malloc(RBUFL+1))) { /* Allocate input line buffer */
7101            dialsta = DIA_IE;
7102            return(-1);
7103        }
7104        debug(F101,"GETOK rbuf malloc ok","",RBUFL+1);
7105    }
7106#endif /* DYNAMIC */
7107
7108    mdmecho = 0;                        /* Assume no echoing of commands */
7109
7110    debug(F100,"about to alrm_execute dook()","",0);
7111    alrm_execute( ckjaddr(okbuf), n, oktimo, dook, failok ) ;
7112    debug(F100,"returning from alrm_execute dook()","",0);
7113
7114    ttflui();                           /* Flush input buffer */
7115    return(okstatus);                   /* Return status */
7116}
7117
7118/*  G E T H R N  --  Get Hayes Result Numeric  */
7119
7120static VOID
7121gethrn() {
7122    char c;
7123    int x;
7124/*
7125  Hayes numeric result codes (Hayes 1200 and higher):
7126     0 = OK
7127     1 = CONNECT at 300 bps (or 1200 bps on Hayes 1200 with basic code set)
7128     2 = RING
7129     3 = NO CARRIER
7130     4 = ERROR (in command line)
7131     5 = CONNECT 1200 (extended code set)
7132  Hayes 2400 and higher:
7133     6 = NO DIALTONE
7134     7 = BUSY
7135     8 = NO ANSWER
7136     9 = (there is no 9)
7137    10 = CONNECT 2400
7138  Reportedly, the codes for Hayes V.32 modems are:
7139    1x = CONNECT <suffix>
7140    5x = CONNECT 1200 <suffix>
7141    9x = CONNECT 2400 <suffix>
7142   11x = CONNECT 4800 <suffix>
7143   12x = CONNECT 9600 <suffix>
7144  Where:
7145    x:   suffix:
7146    R  = RELIABLE
7147    RC = RELIABLE COMPRESSED
7148    L  = LAPM
7149    LC = LAPM COMPRESSED
7150  And for Telebits, all the above, except no suffix in numeric mode, plus:
7151    11 = CONNECT 4800
7152    12 = CONNECT 9600
7153    13 = CONNECT 14400
7154    14 = CONNECT 19200
7155    15 = CONNECT 38400
7156    16 = CONNECT 57600
7157    20 = CONNECT 300/REL  (= MNP)
7158    22 = CONNECT 1200/REL (= MNP)
7159    23 = CONNECT 2400/REL (= MNP)
7160    46 = CONNECT 7512  (i.e. 75/1200)
7161    47 = CONNECT 1275  (i.e. 1200/75)
7162    48 = CONNECT 7200
7163    49 = CONNECT 12000
7164    50 = CONNECT FAST (not on T1600/3000)
7165    52 = RRING
7166    53 = DIALING
7167    54 = NO PROMPTTONE
7168    61 = CONNECT FAST/KERM (Kermit spoof)
7169    70 = CONNECT FAST/COMP (PEP + compression)
7170    71 = CONNECT FAST/KERM/COMP (PEP + compression + Kermit spoof)
7171
7172  And for others, lots of special cases below...
7173*/
7174#define NBUFL 8
7175    char nbuf[NBUFL+1];                 /* Response buffer */
7176    int i = 0, j = 0;                   /* Buffer pointers */
7177
7178    debug(F101,"RESPONSE mdmecho","",mdmecho);
7179    if (mdmecho) {                      /* Sponge up dialing string echo. */
7180        while (1) {
7181            c = (char) (ddinc(0) & 0x7f);
7182            debug(F000,"SPONGE","",c);
7183            dialoc(c);
7184            if (c == CR) break;
7185        }
7186    }
7187    while (mdmstat == 0) {              /* Read response */
7188        for (i = 0; i < NBUFL; i++)     /* Clear the buffer */
7189          nbuf[i] = '\0';
7190        i = 0;                          /* Reset the buffer pointer. */
7191        c = (char) (ddinc(0) & 0177);   /* Get first digit of response. */
7192                                        /* using an untimed, blocking read. */
7193        debug(F000,"RESPONSE-A","",c);
7194        dialoc(c);                      /* Echo it if requested. */
7195        if (!isdigit(c))                /* If not a digit, keep looking. */
7196          continue;
7197        nbuf[i++] = c;                  /* Got first digit, save it. */
7198        while (c != CR && i < 8) {      /* Read chars up to CR */
7199            x = ddinc(0) & 0177;        /* Get a character. */
7200            c = (char) x;               /* Got it OK. */
7201            debug(F000,"RESPONSE-C","",c);
7202            if (c != CR)                /* If it's not a carriage return, */
7203              nbuf[i++] = c;            /*  save it. */
7204            dialoc(c);                  /* Echo it. */
7205        }
7206        nbuf[i] = '\0';                 /* Done, terminate the buffer. */
7207        debug(F110,"dial hayesnv lbuf",lbuf,0);
7208        debug(F111,"dial hayesnv got",nbuf,i);
7209        /*
7210           Separate any non-numeric suffix from the numeric
7211           result code with a null.
7212        */
7213        for (j = i-1; (j > -1) && !isdigit(nbuf[j]); j--)
7214          nbuf[j+1] = nbuf[j];
7215        j++;
7216        nbuf[j++] = '\0';
7217        debug(F110,"dial hayesnv numeric",nbuf,0);
7218        debug(F111,"dial hayesnv suffix ",nbuf+j,j);
7219        /* Probably phone number echoing. */
7220        if ((int)strlen(nbuf) > 3)
7221          continue;
7222
7223        /* Now read and interpret the results... */
7224
7225        i = atoi(nbuf); /* Convert to integer */
7226        switch (i) {
7227          case 0:
7228            mdmstat = D_PARTIAL;        /* OK response */
7229            break;
7230          case 1:                       /* CONNECT */
7231            mdmstat = CONNECTED;        /* Could be any speed */
7232            break;
7233          case 2:                       /* RING */
7234            if (dialdpy)
7235              printf("\r\n Local phone is ringing!\r\n");
7236            mdmstat = D_FAILED;
7237            dialsta = DIA_RING;
7238            break;
7239          case 3:                       /* NO CARRIER */
7240            if (dialdpy) printf("\r\n No Carrier.\r\n");
7241            mdmstat = D_FAILED;
7242            dialsta = DIA_NOCA;
7243            break;
7244          case 4:                       /* ERROR */
7245            if (dialdpy)
7246              printf("\r\n Modem Command Error.\r\n");
7247            mdmstat = D_FAILED;
7248            dialsta = DIA_ERR;
7249            break;
7250          case 5:                       /* CONNECT 1200 */
7251            spdchg(1200L); /* Change speed if necessary. */
7252            mdmstat = CONNECTED;
7253            break;
7254          case 6:                       /* NO DIALTONE */
7255#ifndef MINIDIAL
7256            if (mymdmtyp == n_MICROLINK && atoi(diallcc) == 49 && dialdpy)
7257              printf("\r\n Dial Locked.\r\n"); /* Germany */
7258            else
7259#endif /* MINIDIAL */
7260              if (dialdpy)
7261                printf("\r\n No Dialtone.\r\n");
7262            mdmstat = D_FAILED;
7263            dialsta = DIA_NODT;
7264            break;
7265          case 7:                       /* BUSY */
7266            if (dialdpy) printf("\r\n Busy.\r\n");
7267            mdmstat = D_FAILED;
7268            dialsta = DIA_BUSY;
7269            break;
7270          case 8:                       /* NO ANSWER */
7271#ifndef MINIDIAL
7272            if (mymdmtyp == n_MICROLINK && atoi(diallcc) == 41 && dialdpy)
7273              printf("\r\n Dial Locked.\r\n"); /* Switzerland */
7274            else
7275#endif /* MINIDIAL */
7276              if (dialdpy)
7277                printf("\r\n No Answer.\r\n");
7278            mdmstat = D_FAILED;
7279            dialsta = DIA_NOAN;
7280            break;
7281
7282          case 9:
7283#ifndef MINIDIAL
7284            if (mymdmtyp == n_XJACK || mymdmtyp == n_SUPRAX) {
7285                spdchg(600);
7286                break;
7287            } /* fall thru */
7288#endif /* MINIDIAL */
7289          case 10:                      /* CONNECT 2400 */
7290            spdchg(2400L);              /* Change speed if necessary. */
7291            mdmstat = CONNECTED;
7292            break;
7293
7294#ifndef MINIDIAL
7295
7296/* Starting here, we get different meanings from different manufacturers */
7297
7298          case 11:
7299            if (mymdmtyp == n_USR) {
7300                if (dialdpy) printf(" Ringing...\r\n");
7301            } else {
7302                spdchg(4800L);          /* CONNECT 4800 */
7303                mdmstat = CONNECTED;
7304            }
7305            break;
7306          case 12:
7307            if (mymdmtyp == n_USR) {
7308                if (dialdpy)
7309                  printf("\r\n Answered by voice.\r\n");
7310                mdmstat = D_FAILED;
7311                dialsta = DIA_VOIC;
7312            } else if (mymdmtyp == n_KEEPINTOUCH) {
7313                spdchg(7200L);
7314                mdmstat = CONNECTED;
7315            } else {
7316                spdchg(9600L);
7317                mdmstat = CONNECTED;
7318            }
7319            break;
7320          case 13:
7321            if (mymdmtyp == n_ATT1900 || mymdmtyp == n_ATT1910) {
7322                if (dialdpy) printf(" Wait...\r\n");
7323                break;
7324            } else if (mymdmtyp == n_USR || mymdmtyp == n_USRX2)
7325              spdchg(9600L);
7326            else if (is_rockwell || is_supra ||
7327                mymdmtyp == n_ZOLTRIX || mymdmtyp == n_XJACK)
7328              spdchg(7200L);
7329            else if (mymdmtyp != n_MICROLINK)
7330              spdchg(14400L);
7331            mdmstat = CONNECTED;
7332            break;
7333          case 14:
7334            if (is_rockwell || is_supra || mymdmtyp == n_XJACK)
7335              spdchg(12000L);
7336            else if (mymdmtyp == n_DATAPORT || mymdmtyp == n_MICROLINK)
7337              spdchg(14400L);
7338            else if (mymdmtyp == n_KEEPINTOUCH)
7339              spdchg(9600L);
7340            else if (mymdmtyp != n_USR && mymdmtyp != n_ZOLTRIX)
7341              spdchg(19200L);
7342            mdmstat = CONNECTED;
7343            break;
7344          case 15:
7345            if (is_rockwell || is_supra ||
7346                mymdmtyp == n_ZOLTRIX || mymdmtyp == n_XJACK)
7347              spdchg(14400L);
7348            else if (mymdmtyp == n_USR)
7349              spdchg(1200L);
7350            else if (mymdmtyp == n_ZYXEL || mymdmtyp == n_INTEL)
7351              spdchg(7200L);
7352            else if (mymdmtyp == n_DATAPORT)
7353              spdchg(19200L);
7354            else
7355              spdchg(38400L);
7356            mdmstat = CONNECTED;
7357            break;
7358          case 16:
7359            if (is_rockwell || is_supra ||
7360                mymdmtyp == n_ZOLTRIX || mymdmtyp == n_XJACK)
7361              spdchg(19200L);
7362            else if (mymdmtyp == n_USR)
7363              spdchg(2400L);
7364            else if (mymdmtyp == n_DATAPORT)
7365              spdchg(7200L);
7366            else if (mymdmtyp != n_ZYXEL && mymdmtyp != n_INTEL) /* 12000 */
7367              spdchg(57600L);
7368            mdmstat = CONNECTED;
7369            break;
7370          case 17:
7371            if (mymdmtyp != n_DATAPORT || mymdmtyp == n_XJACK)  /* 16800 */
7372              spdchg(38400L);
7373            else if (mymdmtyp == n_ZYXEL || mymdmtyp == n_INTEL)
7374              spdchg(14400L);
7375            else if (mymdmtyp == n_KEEPINTOUCH)
7376              spdchg(14400L);
7377            else if (mymdmtyp == n_USR)
7378              spdchg(9600L);
7379            mdmstat = CONNECTED;
7380            break;
7381          case 18:
7382            if (is_rockwell || is_supra ||
7383                mymdmtyp == n_ZOLTRIX || mymdmtyp == n_XJACK ||
7384                mymdmtyp == n_MHZATT || mymdmtyp == n_LUCENT)
7385              spdchg(57600L);
7386            else if (mymdmtyp == n_INTEL)
7387              spdchg(19200L);
7388            else if (mymdmtyp == n_USR || mymdmtyp == n_USRX2)
7389              spdchg(4800L);
7390            mdmstat = CONNECTED;
7391            break;
7392          case 19:
7393            if (mymdmtyp == n_DATAPORT)
7394              spdchg(300L);
7395            else if (mymdmtyp == n_ZYXEL || mymdmtyp == n_INTEL)
7396              spdchg(38400L);
7397            else
7398              spdchg(115200L);
7399            mdmstat = CONNECTED;
7400            break;
7401          case 20:
7402            if (mymdmtyp == n_USR || mymdmtyp == n_USRX2)
7403              spdchg(7200L);
7404            else if (mymdmtyp == n_DATAPORT)
7405              spdchg(2400L);
7406            else if (mymdmtyp == n_ZYXEL || mymdmtyp == n_INTEL)
7407              spdchg(57600L);
7408            else
7409              spdchg(300L);
7410            mdmstat = CONNECTED;
7411            break;
7412          case 21:
7413            if (mymdmtyp == n_DATAPORT)
7414              spdchg(4800L);
7415            mdmstat = CONNECTED;
7416            break;
7417          case 22:
7418            if (is_rockwell || is_supra || mymdmtyp == n_XJACK)
7419              spdchg(8880L);
7420            else if (mymdmtyp == n_DATAPORT)
7421              spdchg(9600L);
7422            else if (mymdmtyp == n_KEEPINTOUCH)
7423              spdchg(300L);
7424            else if (!is_hayeshispd)
7425              spdchg(1200L);
7426            mdmstat = CONNECTED;
7427            break;
7428          case 23:
7429            if (is_hayeshispd || is_supra ||
7430                mymdmtyp == n_MULTI || mymdmtyp == n_XJACK)
7431              spdchg(8880L);
7432            else if (mymdmtyp != n_DATAPORT && !is_rockwell) /* 12000 */
7433              spdchg(2400L);
7434            mdmstat = CONNECTED;
7435            break;
7436          case 24:
7437            if (is_rockwell ||  is_supra || mymdmtyp == n_XJACK) {
7438                mdmstat = D_FAILED;
7439                dialsta = DIA_DELA;     /* Delayed */
7440                break;
7441            } else if (is_hayeshispd || mymdmtyp == n_LUCENT)
7442              spdchg(7200L);
7443            else if (mymdmtyp == n_DATAPORT)
7444              spdchg(14400L);
7445            else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
7446              spdchg(1200L);
7447            mdmstat = CONNECTED;
7448            break;
7449          case 25:
7450            if (mymdmtyp == n_USR || mymdmtyp == n_USRX2)
7451              spdchg(14400L);
7452            else if (mymdmtyp == n_LUCENT)
7453              spdchg(12000L);
7454            else if (is_motorola)
7455              spdchg(9600L);
7456            else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
7457              spdchg(2400L);
7458            mdmstat = CONNECTED;
7459            break;
7460          case 26:
7461            if (mymdmtyp == n_DATAPORT)
7462              spdchg(19200L);
7463            else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
7464              spdchg(4800L);
7465            mdmstat = CONNECTED;
7466            break;
7467          case 27:
7468            if (mymdmtyp == n_DATAPORT)
7469              spdchg(38400L);
7470            else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
7471              spdchg(7200L);
7472            else if (mymdmtyp == n_MHZATT)
7473              spdchg(8880L);
7474            mdmstat = CONNECTED;
7475            break;
7476          case 28:
7477            if (mymdmtyp == n_DATAPORT)
7478              spdchg(7200L);
7479            else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
7480              spdchg(9600L);
7481            else if (mymdmtyp == n_MHZATT || mymdmtyp == n_LUCENT)
7482              spdchg(38400L);
7483            mdmstat = CONNECTED;
7484            break;
7485          case 29:
7486            if (is_motorola)
7487              spdchg(4800L);
7488            else if (mymdmtyp == n_DATAPORT)
7489              spdchg(19200L);
7490            mdmstat = CONNECTED;
7491            break;
7492          case 30:
7493            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7494                spdchg(14400L);
7495                mdmstat = CONNECTED;
7496            } /* fall thru on purpose... */
7497          case 31:
7498            if (mymdmtyp == n_UCOM_AT || mymdmtyp == n_MICROLINK) {
7499                spdchg(4800L);
7500                mdmstat = CONNECTED;
7501            } else if (is_motorola) {
7502                spdchg(57600L);
7503                mdmstat = CONNECTED;
7504            }
7505            break;
7506          case 32:
7507            if (is_rockwell || is_supra || mymdmtyp == n_XJACK) {
7508                mdmstat = D_FAILED;
7509                dialsta = DIA_BLCK;     /* Blacklisted */
7510            } else if (mymdmtyp == n_UCOM_AT || mymdmtyp == n_MICROLINK) {
7511                spdchg(9600L);
7512                mdmstat = CONNECTED;
7513            } else if (mymdmtyp == n_KEEPINTOUCH) {
7514                spdchg(300L);
7515                mdmstat = CONNECTED;
7516            } else if (mymdmtyp == n_INTEL) {
7517                spdchg(2400L);
7518                mdmstat = CONNECTED;
7519            }
7520            break;
7521          case 33:                      /* FAX connection */
7522            if (is_rockwell || is_supra ||
7523                mymdmtyp == n_ZOLTRIX || mymdmtyp == n_XJACK) {
7524                mdmstat = D_FAILED;
7525                dialsta = DIA_FAX;
7526            } else if (mymdmtyp == n_UCOM_AT ||
7527                       is_motorola ||
7528                       mymdmtyp == n_MICROLINK
7529                       ) {
7530                spdchg(9600L);
7531                mdmstat = CONNECTED;
7532            } else if (mymdmtyp == n_MHZATT) {
7533                spdchg(115200L);
7534                mdmstat = CONNECTED;
7535            }
7536            break;
7537          case 34:
7538            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7539                spdchg(1200L);
7540                mdmstat = CONNECTED;
7541            } else if (mymdmtyp == n_MICROLINK) {
7542                spdchg(7200L);
7543                mdmstat = CONNECTED;
7544            }
7545            break;
7546          case 35:
7547            if (is_rockwell) {
7548                spdchg(300L);
7549                dialsta = CONNECTED;
7550            } else if (is_motorola) {
7551                spdchg(14400L);
7552                mdmstat = CONNECTED;
7553            } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7554                spdchg(2400L);
7555                mdmstat = CONNECTED;
7556            } else if (mymdmtyp == n_MICROLINK) {
7557                spdchg(7200L);
7558                mdmstat = CONNECTED;
7559            } else if (mymdmtyp == n_ZOLTRIX || mymdmtyp == n_XJACK) /* DATA */
7560              mdmstat = CONNECTED;
7561            break;
7562          case 36:
7563            if (mymdmtyp == n_UCOM_AT) {
7564                spdchg(19200L);
7565                mdmstat = CONNECTED;
7566            } else if (is_motorola) {
7567                spdchg(1200L);
7568                mdmstat = CONNECTED;
7569            } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7570                spdchg(4800L);
7571                mdmstat = CONNECTED;
7572            }
7573            break;
7574          case 37:
7575            if (mymdmtyp == n_UCOM_AT) {
7576                spdchg(19200L);
7577                mdmstat = CONNECTED;
7578            } else if (is_motorola) {
7579                spdchg(2400L);
7580                mdmstat = CONNECTED;
7581            } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7582                spdchg(7200L);
7583                mdmstat = CONNECTED;
7584            }
7585            break;
7586          case 38:
7587            if (is_motorola) {
7588                spdchg(4800L);
7589                mdmstat = CONNECTED;
7590            } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7591                spdchg(9600L);
7592                mdmstat = CONNECTED;
7593            } /* fall thru on purpose... */
7594          case 39:
7595            if (mymdmtyp == n_UCOM_AT) {
7596                spdchg(38400L);
7597                mdmstat = CONNECTED;
7598            } else if (is_motorola) {
7599                spdchg(9600L);
7600                mdmstat = CONNECTED;
7601            } else if (mymdmtyp == n_MICROLINK) {
7602                spdchg(14400L);
7603                mdmstat = CONNECTED;
7604            }
7605            break;
7606          case 40:
7607            if (mymdmtyp == n_UCOM_AT) {
7608                mdmstat = D_FAILED;
7609                dialsta = DIA_NOCA;
7610            } else if (is_motorola || mymdmtyp == n_INTEL ||
7611                       mymdmtyp == n_KEEPINTOUCH) {
7612                spdchg(14400L);
7613                mdmstat = CONNECTED;
7614            }
7615            break;
7616          case 41:
7617            if (is_motorola) {
7618                spdchg(19200L);
7619                mdmstat = CONNECTED;
7620            }
7621            break;
7622          case 42:
7623            if (mymdmtyp == n_KEEPINTOUCH) {
7624                spdchg(300L);
7625                mdmstat = CONNECTED;
7626            } else if (is_motorola) {
7627                spdchg(38400L);
7628                mdmstat = CONNECTED;
7629            } /* fall thru on purpose... */
7630          case 43:
7631            if (mymdmtyp == n_UCOM_AT) {
7632                spdchg(57600L);
7633                mdmstat = CONNECTED;
7634            } else if (mymdmtyp == n_USRX2)
7635              mdmstat = CONNECTED;      /* 168000 */
7636            break;
7637          case 44:
7638            if (is_rockwell) {
7639                spdchg(8800L);
7640                dialsta = CONNECTED;
7641            } else if (is_motorola) {
7642                spdchg(7200L);
7643                mdmstat = CONNECTED;
7644            } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7645                spdchg(1200L);
7646                mdmstat = CONNECTED;
7647            }
7648            break;
7649          case 45:
7650            if (is_motorola) {
7651                spdchg(57600L);
7652                mdmstat = CONNECTED;
7653            } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7654                spdchg(2400L);
7655                mdmstat = CONNECTED;
7656            } else if (n_USR) {
7657                spdchg(14400L);
7658                mdmstat = CONNECTED;
7659            }
7660            break;
7661          case 46:
7662            if (is_rockwell)
7663              spdchg(1200L);
7664            else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
7665              spdchg(4800L);
7666            else
7667              spdchg(8880L);            /* 75/1200 split speed */
7668            mdmstat = CONNECTED;
7669            break;
7670          case 47:
7671            if (is_rockwell)
7672              spdchg(2400L);
7673            else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
7674              spdchg(7200L);
7675            else
7676              printf("CONNECT 1200/75 - Not supported by C-Kermit\r\n");
7677            mdmstat = CONNECTED;
7678            break;
7679          case 48:
7680            if (is_rockwell)
7681              spdchg(4800L);
7682            else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
7683              spdchg(9600L);
7684            else
7685              spdchg(7200L);
7686            mdmstat = CONNECTED;
7687            break;
7688          case 49:
7689            if (is_rockwell)
7690              spdchg(7200L);
7691            mdmstat = CONNECTED;
7692            break;
7693          case 50:                      /* CONNECT FAST */
7694            if (is_rockwell)
7695              spdchg(9600L);
7696            else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
7697              spdchg(14400L);
7698            mdmstat = CONNECTED;
7699            break;
7700          case 51:
7701            if (mymdmtyp == n_UCOM_AT) {
7702                mdmstat = D_FAILED;
7703                dialsta = DIA_NODT;
7704            }
7705            break;
7706          case 52:                      /* RRING */
7707            if (mymdmtyp == n_TELEBIT)
7708              if (dialdpy) printf(" Ringing...\r\n");
7709            break;
7710          case 53:                      /* DIALING */
7711            if (mymdmtyp == n_TELEBIT)
7712              if (dialdpy) printf(" Dialing...\r\n");
7713            break;
7714          case 54:
7715            if (is_rockwell) {
7716                spdchg(19200L);
7717                mdmstat = CONNECTED;
7718            } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7719                spdchg(1200L);
7720                mdmstat = CONNECTED;
7721            } else if (mymdmtyp == n_TELEBIT) {
7722                if (dialdpy) printf("\r\n No Prompttone.\r\n");
7723                mdmstat = D_FAILED;
7724                dialsta = DIA_NODT;
7725            }
7726            break;
7727          case 55:
7728            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7729                spdchg(2400L);
7730                mdmstat = CONNECTED;
7731            }
7732            break;
7733          case 56:
7734            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7735                spdchg(4800L);
7736                mdmstat = CONNECTED;
7737            }
7738            break;
7739          case 57:
7740            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7741                spdchg(7200L);
7742                mdmstat = CONNECTED;
7743            }
7744            break;
7745          case 58:
7746            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7747                spdchg(9600L);
7748                mdmstat = CONNECTED;
7749            }
7750            break;
7751          case 59:
7752            if (mymdmtyp == n_INTEL)    /* 12000 */
7753              mdmstat = CONNECTED;
7754            break;
7755          case 60:
7756            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7757                spdchg(14400L);
7758                mdmstat = CONNECTED;
7759            }
7760            break;
7761          case 64:
7762            if (mymdmtyp == n_INTEL) {
7763                spdchg(1200L);
7764                mdmstat = CONNECTED;
7765            } else if (is_supra) {
7766                spdchg(28800L);
7767                mdmstat = CONNECTED;
7768            }
7769            break;
7770          case 65:
7771            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7772                spdchg(2400L);
7773                mdmstat = CONNECTED;
7774            }
7775            break;
7776          case 66:
7777            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7778                spdchg(4800L);
7779                mdmstat = CONNECTED;
7780            }
7781            break;
7782          case 67:
7783            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7784                spdchg(7200L);
7785                mdmstat = CONNECTED;
7786            }
7787            break;
7788          case 68:
7789            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7790                spdchg(9600L);
7791                mdmstat = CONNECTED;
7792            }
7793            break;
7794          case 69:
7795            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) /* 12000 */
7796              mdmstat = CONNECTED;
7797            break;
7798          case 70:
7799            if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
7800                spdchg(14400L);
7801                mdmstat = CONNECTED;
7802            }
7803            break;
7804          case 73:
7805            if (mymdmtyp == n_UCOM_AT) {
7806                spdchg(115200L);
7807                mdmstat = CONNECTED;
7808                break;
7809            } /* else fall thru */
7810            if (mymdmtyp == n_TELEBIT)  /* Early models only */
7811              mdmstat = CONNECTED;
7812            break;
7813          case 85:
7814            if (mymdmtyp == n_USR || mymdmtyp == n_USRX2)
7815              spdchg(19200L);
7816            mdmstat = CONNECTED;
7817            break;
7818          case 91:                      /* 21600 */
7819          case 99:                      /* 24000 */
7820          case 103:                     /* 26400 */
7821            if (mymdmtyp == n_USRX2)
7822              mdmstat = CONNECTED;
7823            break;
7824          case 107:
7825            if (mymdmtyp == n_USR || mymdmtyp == n_USRX2) {
7826                spdchg(28800L);
7827                mdmstat = CONNECTED;
7828            }
7829            break;
7830          case 151:                     /* 312000 */
7831          case 155:                     /* 336000 */
7832            if (mymdmtyp == n_USRX2)
7833              mdmstat = CONNECTED;
7834            break;
7835
7836#endif /* MINIDIAL */
7837          default:
7838#ifndef MINIDIAL
7839            if (mymdmtyp == n_USR || mymdmtyp == n_USRX2 ||
7840                is_hayeshispd || is_rockwell)
7841#endif /* MINIDIAL */
7842              if (i > 12)               /* There are hundreds of them... */
7843                mdmstat = CONNECTED;
7844            break;
7845        }
7846    }
7847    if (mdmstat == CONNECTED && nbuf[j] != '\0') {
7848        if (dialdpy) {
7849            printf("\r\n");
7850            if (nbuf[j] == 'R') printf(" RELIABLE");
7851            if (nbuf[j] == 'L') printf(" LAPM");
7852            if (nbuf[j+1] == 'C') printf(" COMPRESSED");
7853            printf("\r\n");
7854        }
7855        ckstrncpy(lbuf,nbuf,LBUFL);             /* (for messages...) */
7856    }
7857}
7858
7859static VOID                             /* Get Hayes Result in Word mode */
7860gethrw() {
7861    char *cptr, *s;
7862    long conspd;
7863
7864    if (mdmspd && !network) {
7865        s = lbuf;
7866        while (*s != '\0' && *s != 'C') s++;
7867        cptr = (*s == 'C') ? s : NULL;
7868        conspd = 0L;
7869        if ((cptr != NULL) && !strncmp(cptr,"CONNECT ",8)) {
7870            if ((int)strlen(cptr) < 9)   /* Just CONNECT, */
7871              conspd = 300L;             /* use 300 bps */
7872            else if (isdigit(*(cptr+8))) /* not CONNECT FAST */
7873              conspd = atol(cptr + 8);   /* CONNECT nnnn */
7874            if (conspd != speed) {
7875                if ((conspd / 10L) > 0) {
7876                    if (ttsspd((int) (conspd / 10L)) < 0) {
7877                        printf(" Can't change speed to %ld\r\n",
7878                               conspd);
7879                    } else {
7880                        speed = conspd;
7881                        mdmstat = CONNECTED;
7882                        if ( !quiet && !backgrd )
7883                          printf(" Speed changed to %ld\r\n",
7884                                 conspd);
7885                    }
7886                }
7887            } /* Expanded to handle any conceivable speed */
7888        }
7889    }
7890#ifndef MINIDIAL
7891    if (mymdmtyp == n_TELEBIT) {
7892        if (didweget(lbuf,"CONNECT FAST/KERM")) {
7893            mdmstat = CONNECTED;
7894            if (dialdpy) printf("FAST/KERM ");
7895            return;
7896        }
7897    }
7898#endif /* MINIDIAL */
7899    if (didweget(lbuf,"RRING") ||
7900        didweget(lbuf,"RINGING") ||
7901        didweget(lbuf,"DIALING")) {
7902        mdmstat = 0;
7903    } else if (didweget(lbuf,"CONNECT")) {
7904        mdmstat = CONNECTED;
7905    } else if (didweget(lbuf,"OK")) {
7906        if (partial) {
7907            mdmstat = D_PARTIAL;
7908        } else {
7909            mdmstat = D_FAILED;
7910            dialsta = DIA_ERR;
7911        }
7912    } else if (didweget(lbuf,"NO CARRIER")) {
7913        mdmstat = D_FAILED;
7914        dialsta = DIA_NOCA;
7915    } else if (didweget(lbuf,"NO DIALTONE")) {
7916        mdmstat = D_FAILED;
7917        dialsta = DIA_NODT;
7918    } else if (didweget(lbuf,"NO DIAL TONE")) {
7919        mdmstat = D_FAILED;
7920        dialsta = DIA_NODT;
7921    } else if (didweget(lbuf,"BUSY")) {
7922        mdmstat = D_FAILED;
7923        dialsta = DIA_BUSY;
7924    } else if (didweget(lbuf,"NO ANSWER")) {
7925        mdmstat = D_FAILED;
7926        dialsta = DIA_NOAN;
7927    } else if (didweget(lbuf,"VOICE")) {
7928        mdmstat = D_FAILED;
7929        dialsta = DIA_VOIC;
7930    } else if (didweget(lbuf,"VCON")) {
7931        mdmstat = D_FAILED;
7932        dialsta = DIA_VOIC;
7933    } else if (didweget(lbuf,"NO PROMPT TONE")) {
7934        mdmstat = D_FAILED;
7935        dialsta = DIA_NODT;
7936    } else if (didweget(lbuf,"REMOTE ACCESS FAILED")) {
7937        mdmstat = D_FAILED;
7938        dialsta = DIA_NOCA;
7939    } else if (didweget(lbuf,"FAX")) {
7940        mdmstat = D_FAILED;
7941        dialsta = DIA_FAX;
7942    } else if (didweget(lbuf,"WAIT - CONNECTING") ||
7943               didweget(lbuf,"WAIT-CONNECTING")) { /* AT&T STU-III 19xx */
7944        mdmstat = 0;
7945    } else if (didweget(lbuf,"DELAYED")) {
7946        mdmstat = D_FAILED;
7947        dialsta = DIA_DELA;
7948    } else if (didweget(lbuf,"BLACKLISTED")) {
7949        mdmstat = D_FAILED;
7950        dialsta = DIA_BLCK;
7951    } else if (didweget(lbuf,"COMPRESSION")) {
7952        mdmstat = 0;
7953    } else if (didweget(lbuf,"PROTOCOL")) {
7954        mdmstat = 0;
7955    } else if (didweget(lbuf,"DIAL LOCKED")) { /* Germany, Austria, Schweiz */
7956        mdmstat = D_FAILED;
7957        dialsta = DIA_BLCK;
7958    } else if ( didweget(lbuf,"RING") ||
7959                didweget(lbuf,"RING1") || /* Distinctive Ring 1 */
7960                didweget(lbuf,"RING2") || /* Distinctive Ring 2 */
7961                didweget(lbuf,"RING3") ) {
7962        mdmstat = (func_code == 0) ? D_FAILED : 0;
7963        dialsta = DIA_RING;
7964    } else if (didweget(lbuf,"ERROR")) {
7965        mdmstat = D_FAILED;
7966        dialsta = DIA_ERR;
7967    } else if (didweget(lbuf,"CARRIER")) { /* Boca / Rockwell family */
7968#ifdef COMMENT
7969        if (is_rockwell)
7970#endif /* COMMENT */
7971          mdmstat = 0;
7972#ifdef COMMENT
7973        /* Does CARRIER ever mean the same as CONNECT? */
7974        else
7975          mdmstat = CONNECTED;
7976#endif /* COMMENT */
7977    } else if (didweget(lbuf,"DATA")) { /* Boca / Rockwell family */
7978        /* This message is sent when the modem is in FAX mode  */
7979        /* So setting this to CONNECTED may not be appropriate */
7980        /* We must send ATO\015 to the modem in response       */
7981        /* Then we will get a CONNECTED message                */
7982        mdmstat = CONNECTED;
7983    } else if (didweget(lbuf,"DIGITAL LINE")) {
7984        mdmstat = D_FAILED;
7985        dialsta = DIA_DIGI;
7986    } else if (didweget(lbuf,"DATE")) { /* Caller ID Date */
7987        debug(F110,"CALLID DATE",lbuf,0);
7988        /* Format is "DATE     =   MMDD"   */
7989        makestr(&callid_date,lbuf);
7990    } else if (didweget(lbuf,"TIME")) { /* Caller ID Time */
7991        /* Format is "TIME     =   HHMM"   */
7992        debug(F110,"CALLID TIME",lbuf,0);
7993        makestr(&callid_time,lbuf);
7994    } else if (didweget(lbuf,"NAME")) { /* Caller ID Name */
7995        /* Format is "NAME     =   <listing name>"   */
7996        debug(F110,"CALLID NAME",lbuf,0);
7997        makestr(&callid_name,lbuf);
7998    } else if (didweget(lbuf,"NMBR")) { /* Caller ID Number */
7999        /* Format is "NMBR     =   <number>, 'P' or 'O'"   */
8000        /*      'P' means Privacy Requested                */
8001        /*      'O' means Out of Service or Not available  */
8002        debug(F110,"CALLID NMBR",lbuf,0);
8003        makestr(&callid_nmbr,lbuf);
8004    } else if (didweget(lbuf,"MESG")) { /* Caller ID Unrecognized Message */
8005        /* Format is "MESG     =   <tag><length><data><checksum>"   */
8006        debug(F110,"CALLID MESG",lbuf,0);
8007        makestr(&callid_mesg,lbuf);
8008    }
8009}
8010
8011/* Maybe hang up the phone, depending on various SET DIAL parameters. */
8012
8013int
8014dialhup() {
8015    int x = 0;
8016    if (dialhng && dialsta != DIA_PART) { /* DIAL HANGUP ON? */
8017        x = mdmhup();                   /* Try modem-specific method first */
8018        debug(F101,"dialhup mdmhup","",x);
8019        if (x > 0) {                    /* If it worked, */
8020            dialsta = DIA_HUP;
8021            if (dialdpy)
8022              printf(" Modem hangup OK\r\n"); /* fine. */
8023        } else if (network              /* If we're telnetted to */
8024#ifdef TN_COMPORT
8025                   && !istncomport()    /* (without RFC 2217)    */
8026#endif /* TN_COMPORT */
8027                   ) {         
8028            dialsta = DIA_HANG;
8029            if (dialdpy)                /* a modem server, just print a msg */
8030              printf(" WARNING - modem hangup failed\r\n"); /* don't hangup! */
8031            return(0);
8032        } else {                        /* Otherwise */
8033            x = tthang();               /* Tell the OS to turn off DTR. */
8034            if (x > 0) {                /* Yes, tell results from tthang() */
8035                dialsta = DIA_HUP;
8036                if (dialdpy) printf(" Hangup OK\r\n");
8037            } else if (x == 0) {
8038                if (dialdpy) printf(" Hangup skipped\r\n");
8039            } else {
8040                dialsta = DIA_HANG;
8041                if (dialdpy) perror(" Hangup error");
8042            }
8043            ttflui();
8044        }
8045    } else if (dialdpy) printf(" Hangup skipped\r\n"); /* DIAL HANGUP OFF */
8046    return(x);
8047}
8048
8049/*
8050  M D M H U P  --
8051
8052  Sends escape sequence to modem, then sends its hangup command.  Returns:
8053   0: If modem type is 0 (direct serial connection),
8054      or if modem type is < 0 (network connection),
8055      or if no action taken because DIAL MODEM-HANGUP is OFF)
8056        or because no hangup string for current modem type,
8057      or C-Kermit is in remote mode,
8058      or if action taken but there was no positive response from modem;
8059   1: Success: modem is in command state and acknowledged the hangup command;
8060  -1: On modem command error.
8061*/
8062int
8063mdmhup() {
8064#ifdef MDMHUP
8065    int m, x = 0;
8066    int xparity;
8067    int savcarr;
8068    extern int ttcarr;
8069    char *s, *p, c;
8070    MDMINF * mp = NULL;
8071
8072    debug(F101,"mdmhup dialmhu","",dialmhu); /* MODEM-HANGUP METHOD */
8073    debug(F101,"mdmhup local","",local);
8074
8075    if (dialmhu == 0 || local == 0)     /* If DIAL MODEM-HANGUP is OFF, */
8076      return(0);                        /*  or not in local mode, fail. */
8077
8078    debug(F101,"mdmhup dialsta","",dialsta);
8079    debug(F101,"mdmhup mdmset","",mdmset);
8080
8081    if (dialsta != DIA_OK && !mdmset)   /* It's not a dialed connection */
8082      return(0);
8083
8084#ifdef CK_TAPI
8085    if (tttapi && !tapipass)            /* Don't hangup if using TAPI */
8086      return(0);
8087#endif /* CK_TAPI */
8088
8089#ifdef COMMENT
8090    /* No, we still need this for modems that ignore DTR */
8091    if (mymdmtyp == n_GENERIC && !network)
8092      return(0);
8093#endif /* COMMENT */
8094
8095    debug(F101,"mdmhup dialesc","",dialesc);
8096    if (dialesc < 0)
8097      return(0);                        /* No modem escape-character, fail. */
8098
8099    savcarr = ttcarr;
8100    ttcarr = CAR_OFF;
8101    x = ttchk();
8102    ttcarr = savcarr;
8103    debug(F101,"mdmhup ttchk","",x);
8104    if (x < 0)                          /* There appears to be no connection */
8105      return(0);
8106    x = 0;
8107
8108#ifdef OS2
8109/*
8110  In OS/2, if CARRIER is OFF, and there is indeed no carrier signal, any
8111  attempt to do i/o at this point can hang the program.  This might be true
8112  for other operating systems too.
8113*/
8114    if (!network                        /* Not a network connection */
8115#ifdef TN_COMPORT
8116        || istncomport()
8117#endif /* TN_COMPORT */
8118        ) {
8119        m = ttgmdm();                   /* Get modem signals */
8120        if ((m > -1) && (m & BM_DCD == 0)) /* Check for carrier */
8121          return(0);                    /* No carrier, skip the rest */
8122    }
8123#endif /* OS2 */
8124
8125    debug(F111,"mdmhup network",ttname,network);
8126    debug(F101,"mdmhup mymdmtyp","",mymdmtyp);
8127    debug(F101,"mdmhup mdmtyp","",mdmtyp);
8128    /* In case of HANGUP before DIAL */
8129    if (network && mdmtyp < 1)          /* SET HOST but no subsequent */
8130      return(0);                        /* SET MODEM TYPE... */
8131    if (mymdmtyp == 0 && mdmtyp > 0)
8132      mymdmtyp = mdmtyp;
8133    if (mymdmtyp < 1)                   /* Not using a modem */
8134      return(0);
8135    if (mymdmtyp > 0)                   /* An actual modem... */
8136      mp = modemp[mymdmtyp];
8137    if (!mp) {                          /* Get pointer to its MDMINF struct */
8138        debug(F100,"mdmhup no MDMINF","",0);
8139        return(0);
8140    }
8141    mdmcapas = dialcapas ? dialcapas : mp->capas;
8142    xx_ok = mp->ok_fn;                  /* Pointer to response reader */
8143
8144    s = dialhcmd ? dialhcmd : mp->hup_str; /* Get hangup command */
8145    if (!s) s = "";
8146    debug(F110,"mdmhup hup_str",s,0);
8147    if (!*s) return(0);                 /* If none, fail. */
8148
8149    if (ttpkt(speed,FLO_DIAL,parity) < 0) /* Condition line for dialing */
8150      return(-1);
8151
8152    xparity = parity;                   /* Set PARITY to NONE temporarily */
8153    parity = 0;
8154
8155    /* In case they gave a SET MODEM ESCAPE command recently... */
8156
8157    if (dialesc < 0 || dialesc > 127)
8158      c = NUL;
8159    else
8160      c = (char) (dialesc ? dialesc : mp->esc_char);
8161
8162    if (mdmcapas & CKD_AT) {            /* Hayes compatible */
8163        escbuf[0] = c;
8164        escbuf[1] = c;
8165        escbuf[2] = c;
8166        escbuf[3] = NUL;
8167    } else {                            /* Other */
8168        escbuf[0] = c;
8169        escbuf[1] = NUL;
8170    }
8171    debug(F110,"mdmhup escbuf",escbuf,0);
8172    if (escbuf[0]) {                    /* Have escape sequence? */
8173        debug(F101,"mdmhup esc_time",0,mp->esc_time);
8174        if (mp->esc_time)               /* If we have a guard time */
8175          msleep(mp->esc_time);         /* Pause for guard time */
8176        debug(F100,"mdmhup pause 1 OK","",0);
8177
8178#ifdef NETCONN                          /* Send modem's escape sequence */
8179        if (network) {                  /* Must catch errors here. */
8180            if (ttol((CHAR *)escbuf,(int)strlen((char *)escbuf)) < 0) {
8181                parity = xparity;
8182                return(-1);
8183            }
8184            debug(F110,"mdmhup ttslow net ok",escbuf,0);
8185        } else {
8186#endif /* NETCONN */
8187            ttslow((char *)escbuf,wr); /* Send escape sequence */
8188            debug(F110,"mdmhup ttslow ok",escbuf,0);
8189#ifdef NETCONN
8190        }
8191#endif /* NETCONN */
8192
8193        if (mp->esc_time)               /* Pause for guard time again */
8194          msleep(mp->esc_time);
8195        else
8196          msleep(500);                  /* Wait half a sec for echoes. */
8197        debug(F100,"mdmhup pause 1 OK","",0);
8198#ifdef COMMENT
8199        ttflui();                       /* Flush response or echo, if any */
8200        debug(F100,"mdmhup ttflui OK","",0);
8201#endif /* COMMENT */
8202    }
8203    ttslow(s,wr);                       /* Now Send hangup string */
8204    debug(F110,"mdmhup ttslow ok",s,0);
8205/*
8206  This is not exactly right, but it works.
8207  If we are online:
8208    the modem says OK when it gets the escape sequence,
8209    and it says NO CARRIER when it gets the hangup command.
8210  If we are offline:
8211    the modem does NOT say OK (or anything else) when it gets the esc sequence,
8212    but it DOES say OK (and not NO CARRIER) when it gets the hangup command.
8213  So the following function should read the OK in both cases.
8214  Of course, this is somewhat Hayes-specific...
8215*/
8216    if (xx_ok) {                        /* Look for OK response */
8217        debug(F100,"mdmhup calling response function","",0);
8218        x = (*xx_ok)(3,1);              /* Give it 3 seconds, be strict. */
8219        debug(F101,"mdmhup hangup response","",x);
8220        msleep(500);                    /* Wait half a sec */
8221        ttflui();                       /* Get rid of NO CARRIER, if any */
8222    } else {                            /* No OK function, */
8223        x = 1;                          /* so assume it worked */
8224        debug(F101,"mdmhup no ok_fn","",x);
8225    }
8226    parity = xparity;                   /* Restore prevailing parity */
8227    return(x);                          /* Return OK function's return code. */
8228
8229#else  /* MDMHUP not defined. */
8230
8231    debug(F100,"mdmhup MDMHUP not defined","",0);
8232    return(0);                          /* Always fail. */
8233
8234#endif /* MDMHUP */
8235}
8236
8237#endif /* NOICP */
8238#else /* NODIAL */
8239
8240int mdmtyp = 0;                         /* Default modem type */
8241
8242int                                     /* To allow NODIAL versions to */
8243mdmhup() {                              /* call mdmhup(), so calls to  */
8244    return(0);                          /* mdmhup() need not be within */
8245}                                       /* #ifndef NODIAL conditionals */
8246#endif /* NODIAL */
8247#else
8248int mdmtyp = 0;                         /* Default modem type */
8249#endif /* NOLOCAL */
Note: See TracBrowser for help on using the repository browser.