ckudia.c
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:217k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

  1.     &SUPRAX /* 69 Diamond Supra Express V.90 */
  2. #endif /* MINIDIAL */
  3. };
  4. /*
  5.  * Declare modem names and associated numbers for command parsing,
  6.  * and also for doing number-to-name translation.
  7.  *
  8.  * The entries must be in alphabetical order by modem name.
  9.  */
  10. struct keytab mdmtab[] = {
  11. #ifndef MINIDIAL
  12.     "3com-usr-megahertz-56k", n_USRX2,  0,
  13.     "atlas-newcom-33600ifxC", n_ATLAS,  0,
  14.     "att-1900-stu-iii", n_ATT1900,      0,
  15.     "att-1910-stu-iii", n_ATT1910,      0,
  16.     "att-7300", n_ATTUPC, 0,
  17.     "att-dataport", n_DATAPORT, 0,
  18.     "att-dtdm", n_ATTDTDM, 0,
  19.     "att-isn",          n_ATTISN,       0,
  20.     "att-keepintouch",  n_KEEPINTOUCH,  0,
  21.     "att-switched-net", n_ATTMODEM, 0,
  22.     "att7300", n_ATTUPC, CM_INV, /* old name */
  23.     "attdtdm", n_ATTDTDM, CM_INV, /* old name */
  24.     "attisn",           n_ATTISN,       CM_INV, /* old name */
  25.     "attmodem", n_ATTMODEM, CM_INV, /* old name */
  26.     "bestdata",         n_BESTDATA,     0,
  27.     "boca", n_BOCA, 0,
  28. #endif /* MINIDIAL */
  29.     "ccitt-v25bis", n_CCITT, CM_INV, /* Name changed to ITU-T */
  30. #ifndef MINIDIAL
  31.     "cardinal",         n_CARDINAL,     0,
  32. #ifdef OLDMODEMS
  33.     "cermetek", n_CERMETEK, M_OLD,
  34. #endif /* OLDMODEMS */
  35.     "compaq",           n_COMPAQ,       0,
  36. #ifdef OLDMODEMS
  37.     "concord", n_CONCORD, M_OLD,
  38. #endif /* OLDMODEMS */
  39.     "courier",          n_USR,          CM_INV,
  40.     "dataport", n_DATAPORT, CM_INV, /* == att-dataport */
  41. #ifdef OLDMODEMS
  42.     "df03-ac", n_DF03, M_OLD,
  43.     "df100-series", n_DF100, M_OLD,
  44.     "df200-series", n_DF200, M_OLD,
  45. #endif /* OLDMODEMS */
  46.     "digitel-dt22", n_DIGITEL, 0,
  47. #endif /* MINIDIAL */
  48.     "direct", 0, CM_INV, /* Synonym for NONE */
  49. #ifndef MINIDIAL
  50.     "fujitsu",          n_FUJITSU,      0,
  51.     "gateway-telepath", n_TELEPATH,     0,
  52. #ifdef OLDMODEMS
  53.     "gdc-212a/ed", n_GDC, M_OLD,
  54.     "ge",               n_GENERIC, CM_INV|CM_ABR,
  55.     "gen",              n_GENERIC, CM_INV|CM_ABR,
  56.     "gendatacomm", n_GDC, CM_INV, /* Synonym for GDC */
  57. #endif /* OLDMODEMS */
  58. #endif /* MINIDIAL */
  59.     "generic-high-speed", n_GENERIC,    0,
  60.     "h",      n_HAYES, CM_INV|CM_ABR,
  61.     "ha",      n_HAYES, CM_INV|CM_ABR,
  62.     "hay",     n_HAYES, CM_INV|CM_ABR,
  63.     "haye",      n_HAYES, CM_INV|CM_ABR,
  64.     "hayes",     n_HAYES, CM_INV|CM_ABR, /* Hayes 2400 */
  65. #ifndef MINIDIAL
  66.     "hayes-1200", n_H_1200, 0,
  67. #endif /* MINIDIAL */
  68.     "hayes-2400", n_HAYES, 0,
  69. #ifndef MINIDIAL
  70.     "hayes-high-speed", n_H_ACCURA,     0,
  71.     "hayes-accura",     n_H_ACCURA,     CM_INV,
  72.     "hayes-optima",     n_H_ACCURA,     CM_INV,
  73.     "hayes-ultra", n_H_ULTRA, CM_INV,
  74.     "hst-courier",      n_USR,          CM_INV, /* Synonym for COURIER */
  75.     "intel", n_INTEL,        0,
  76. #endif /* MINIDIAL */
  77.     "itu-t-v250",       n_ITUTV250,     CM_INV,
  78.     "itu-t-v25ter/v250",n_ITUTV250,     0,
  79.     "itu-t-v25bis", n_CCITT, 0, /* New name for CCITT */
  80. #ifndef MINIDIAL
  81.     "maxtech", n_MAXTECH,     0,
  82.     "megahertz-att-v34",    n_MHZATT,  0, /* Megahertzes */
  83.     "megahertz-xjack",      n_XJACK,   CM_INV|CM_ABR,
  84.     "megahertz-xjack-33.6", n_XJACK,   0,
  85.     "megahertz-xjack-56k",  n_USRX2,   0, /* 3COM/USR/Megahertz 33.6 PC Card */
  86.     "mi", n_MICROCOM, CM_INV|CM_ABR,
  87.     "mic", n_MICROCOM, CM_INV|CM_ABR,
  88.     "micr", n_MICROCOM, CM_INV|CM_ABR,
  89.     "micro", n_MICROCOM, CM_INV|CM_ABR,
  90.     "microc", n_MICROCOM, CM_INV|CM_ABR,
  91.     "microco", n_MICROCOM, CM_INV|CM_ABR,
  92.     "microcom", n_MICROCOM, CM_INV|CM_ABR,
  93.     "microcom-at-mode", n_UCOM_AT, 0, /* Microcom DeskPorte, etc */
  94.     "microcom-sx-mode", n_MICROCOM, 0, /* Microcom AX,QX,SX, native mode */
  95.     "microlink",        n_MICROLINK,    0,
  96.     "microlink-v250",   n_ULINKV250,    0,
  97.     "motorola-codex",   n_CODEX,        0,
  98.     "motorola-fastalk", n_MOTOROLA, 0,
  99.     "motorola-lifestyle",n_MOTOROLA, 0,
  100.     "motorola-montana", n_MONTANA, 0,
  101.     "mt5634zpx",        n_MT5634ZPX,    0,
  102.     "multitech", n_MULTI, 0,
  103.     "mwave", n_MWAVE, 0,
  104. #endif /* MINIDIAL */
  105.     "none",             0,              0,
  106. #ifndef MINIDIAL
  107. #ifndef OLDTBCODE
  108.     "old-telebit",      n_TELEBIT,      0,
  109. #endif /* OLDTBCODE */
  110. #ifdef OLDMODEMS
  111.     "penril", n_PENRIL, M_OLD,
  112. #endif /* OLDMODEMS */
  113.     "ppi",              n_PPI, 0,
  114. #ifdef OLDMODEMS
  115.     "racalvadic", n_RACAL, M_OLD,
  116. #endif /* OLDMODEMS */
  117.     "rockwell-v32", n_RWV32, 0,
  118.     "rockwell-v32bis", n_RWV32B, 0,
  119.     "rockwell-v34", n_RWV34, 0,
  120.     "rockwell-v90", n_RWV90, 0,
  121.     "rolm",             n_ROLM, CM_INV|CM_ABR,
  122.     "rolm-244pc",       n_ROLMAT,       0,
  123.     "rolm-600-series",  n_ROLMAT,       0,
  124.     "rolm-dcm", n_ROLM, 0,
  125.     "spirit-ii",        n_SPIRITII,     0,
  126.     "sportster",        n_USR,          CM_INV,
  127.     "sup",         n_SUPRA, CM_INV|CM_ABR,
  128.     "supr",         n_SUPRA, CM_INV|CM_ABR,
  129.     "supra",         n_SUPRA, CM_INV|CM_ABR,
  130.     "supra-express-v90",n_SUPRAX,       0,
  131.     "suprafaxmodem", n_SUPRA, 0,
  132.     "suprasonic", n_SUPRASON, 0,
  133. #ifdef CK_TAPI
  134.     "tapi", n_TAPI, 0,
  135. #endif /* CK_TAPI */
  136.     "te",               n_TBNEW,        CM_INV|CM_ABR,
  137.     "tel",              n_TBNEW,        CM_INV|CM_ABR,
  138.     "telebit",          n_TBNEW,        0,
  139.     "telepath",         n_TELEPATH,     CM_INV,
  140. #endif /* MINIDIAL */
  141.     "unknown", n_UNKNOWN, 0,
  142.     "user-defined",     n_UDEF, 0,
  143. #ifndef MINIDIAL
  144.     "usr",               n_USR,         CM_INV|CM_ABR,
  145.     "usr-212a",  n_HAYES, CM_INV,
  146.     "usr-courier",       n_USR,         CM_INV,
  147.     "usr-megahertz-56k", n_USRX2,       0,
  148.     "usr-sportster",     n_USR,         CM_INV,
  149.     "usr-xj1560-x2",     n_USRX2,       CM_INV,
  150.     "usrobotics",        n_USR,         0,
  151.     "v25bis", n_CCITT, CM_INV, /* Name changed to ITU-T */
  152. #ifdef OLDMODEMS
  153.     "ventel", n_VENTEL, M_OLD,
  154. #endif /* OLDMODEMS */
  155.     "zoltrix", n_ZOLTRIX, 0,
  156.     "zoom", n_ZOOM, 0,
  157.     "zyxel", n_ZYXEL, 0,
  158. #endif /* MINIDIAL */
  159.     "",                 0,              0
  160. };
  161. int nmdm = (sizeof(mdmtab) / sizeof(struct keytab)) - 1; /* Number of modems */
  162. #define CONNECTED 1 /* For completion status */
  163. #define D_FAILED  2
  164. #define D_PARTIAL 3
  165. static int tries = 0;
  166. static int mdmecho = 0; /* Assume modem does not echo */
  167. static char *p; /* For command strings & messages */
  168. #define LBUFL 200
  169. static char lbuf[LBUFL+4];
  170. #ifdef DYNAMIC
  171. #define RBUFL 256
  172. static char *rbuf = NULL;
  173. #else
  174. #define RBUFL 63
  175. static char rbuf[RBUFL+1];
  176. #endif /* DYNAMIC */
  177. #ifdef DYNAMIC
  178. #define FULLNUML 256
  179. char *fbuf = NULL; /* For full (prefixed) phone number */
  180. #else
  181. #define FULLNUML 100
  182. char fbuf[FULLNUML];
  183. #endif /* DYNAMIC */
  184. static ckjmpbuf sjbuf;
  185. #ifdef CK_ANSIC
  186. static SIGTYP (*savalrm)(int); /* For saving alarm handler */
  187. static SIGTYP (*savint)(int); /* For saving interrupt handler */
  188. #else
  189. static SIGTYP (*savalrm)(); /* For saving alarm handler */
  190. static SIGTYP (*savint)(); /* For saving interrupt handler */
  191. #endif /* CK_ANSIC */
  192. #ifdef CKLOGDIAL
  193. static VOID
  194. dologdial(s) char *s; {
  195.     char buf2[16];
  196.     char * r = NULL;
  197.     int x, m, n;
  198.     extern char cxlogbuf[], uidbuf[], myhost[];
  199.     if (!s) s = "";
  200.     if ((x = strlen(s)) > 0) { /* Replace spaces by underscores */
  201. r = (char *)malloc(x+1);
  202. if (r) {
  203.     int i;
  204.     for (i = 0; i <= x; i++) {
  205. if (s[i] != 0 && s[i] <= SP)
  206.   r[i] = '_';
  207. else
  208.   r[i] = s[i];
  209.     }
  210.     s = r;
  211. }
  212.     }
  213.     p = ckdate();
  214.     n = ckstrncpy(cxlogbuf,p,CXLOGBUFL);
  215.     m = strlen(uidbuf)+strlen(myhost)+strlen(ttname)+strlen(s)+strlen(buf2)+32;
  216.     if (n+m < CXLOGBUFL-1) {
  217. p = cxlogbuf+n;
  218. if (diallcc && diallac)
  219.   sprintf(buf2,"+%s(%s)",diallcc,diallac);
  220. else
  221.   strcpy(buf2,"Unknown");
  222. sprintf(p," %s %s T=DIAL H=%s D=%s N=%s O=%s ",
  223. uidbuf,
  224. ckgetpid(),
  225. myhost,
  226. ttname,
  227. s,
  228. buf2
  229. );
  230. debug(F110,"dologdial cxlogbuf",cxlogbuf,0);
  231.     } else
  232.       sprintf(p,"LOGDIAL BUFFER OVERFLOW");
  233.     if (r) free(r);
  234. }
  235. #endif /* CKLOGDIAL */
  236. #ifndef MINIDIAL
  237. #ifdef COMMENT
  238. static VOID
  239. xcpy(to,from,len) /* Copy the given number of bytes */
  240.     register char *to, *from;
  241.     register unsigned int len; {
  242. while (len--) *to++ = *from++;
  243. }
  244. #endif /* COMMENT */
  245. #endif /* MINIDIAL */
  246. static SIGTYP
  247. #ifdef CK_ANSIC
  248. dialtime(int foo) /* Timer interrupt handler */
  249. #else
  250. dialtime(foo) int foo; /* Timer interrupt handler */
  251. #endif /* CK_ANSIC */
  252. /* dialtime */ {
  253.     fail_code = F_TIME; /* Failure reason = timeout */
  254.     debug(F100,"dialtime caught SIGALRM","",0);
  255. #ifdef BEBOX
  256. #ifdef BE_DR_7
  257.     alarm_expired();
  258. #endif /* BE_DR_7 */
  259. #endif /* BEBOX */
  260. #ifdef OS2
  261.     signal(SIGALRM, dialtime);
  262. #endif /* OS2 */
  263. #ifdef __EMX__
  264.     signal(SIGALRM, SIG_ACK); /* Needed for OS/2 */
  265. #endif /* __EMX__ */
  266. #ifdef OSK /* OS-9 */
  267. /*
  268.   We are in an intercept routine but do not perform a F$RTE (done implicitly
  269.   by RTS), so we have to decrement the sigmask as F$RTE does.  Warning:
  270.   longjump only restores the CPU registers, NOT the FPU registers.  So, don't
  271.   use FPU at all or at least don't use common FPU (double or float) register
  272.   variables.
  273. */
  274.     sigmask(-1);
  275. #endif /* OSK */
  276. #ifdef NTSIG
  277.     if (foo == SIGALRM)
  278.       PostAlarmSigSem();
  279.     else
  280.       PostCtrlCSem();
  281. #else /* NTSIG */
  282. #ifdef NT
  283.     cklongjmp(ckjaddr(sjbuf),1);
  284. #else /* NT */
  285.     cklongjmp(sjbuf,1);
  286. #endif /* NT */
  287. #endif /* NTSIG */
  288.     /* NOTREACHED */
  289.     SIGRETURN;
  290. }
  291. static SIGTYP
  292. #ifdef CK_ANSIC
  293. dialint(int foo) /* Keyboard interrupt handler */
  294. #else
  295. dialint(foo) int foo; /* Keyboard interrupt handler */
  296. #endif /* CK_ANSIC */
  297. /* dialint */ {
  298.     fail_code = F_INT;
  299.     debug(F100,"dialint caught SIGINT","",0);
  300. #ifdef OS2
  301.     signal(SIGINT, dialint);
  302.     debug(F100,"dialint() SIGINT caught -- dialint restored","",0) ;
  303. #endif /* OS2 */
  304. #ifdef __EMX__
  305.     signal(SIGINT, SIG_ACK); /* Needed for OS/2 */
  306. #endif /* __EMX__ */
  307. #ifdef OSK /* OS-9, see comment in dialtime() */
  308.     sigmask(-1);
  309. #endif /* OSK */
  310. #ifdef NTSIG
  311.     PostCtrlCSem() ;
  312. #ifdef CK_TAPI
  313.     PostTAPIConnectSem();
  314.     PostTAPIAnswerSem();
  315. #endif /* CK_TAPI */
  316. #else /* NTSIG */
  317. #ifdef NT
  318.     cklongjmp(ckjaddr(sjbuf),1);
  319. #else /* NT */
  320.     cklongjmp(sjbuf,1);
  321. #endif /* NT */
  322. #endif /* NT */
  323.     SIGRETURN;
  324. }
  325. /*
  326.   Routine to read a character from communication device, handling TELNET
  327.   protocol negotiations in case we're connected to the modem through a
  328.   TCP/IP TELNET modem server.
  329. */
  330. static int
  331. ddinc(n) int n; {
  332. #ifdef TNCODE
  333.     int c = 0;
  334.     int done = 0;
  335.     debug(F101,"ddinc entry n","",n);
  336.     while (!done) {
  337. c = ttinc(n);
  338. debug(F000,"ddinc","",c);
  339. if (c < 0) return(c);
  340. #ifndef OS2
  341. if ((c == IAC) && network && (ttnproto == NP_TELNET)) {
  342.     switch (tn_doop((CHAR)(c & 0xff),duplex,ttinc)) {
  343.       case 2: duplex = 0; continue;
  344.       case 1: duplex = 1;
  345.       default: continue;
  346.     }
  347. } else done = 1;
  348. #else /* OS2 */
  349. done = !(c == IAC && network && ttnproto == NP_TELNET);
  350. scriptwrtbuf(c); /* TELNET negotiations handled by emulator */
  351. #endif /* OS2 */
  352.     }
  353.     return(c & 0xff);
  354. #else  /* TNCODE */
  355.     debug(F101,"ddinc entry n","",n);
  356.     return(ttinc(n));
  357. #endif /* TNCODE */
  358. }
  359. static VOID
  360. ttslow(s,millisec) char *s; int millisec; { /* Output s-l-o-w-l-y */
  361. #ifdef TCPSOCKET
  362.     extern int tn_nlm, tn_b_nlm;
  363. #endif /* TCPSOCKET */
  364.     debug(F111,"ttslow",s,millisec);
  365.     if (dialdpy && (duplex || !mdmecho)) { /* Echo the command in case modem */
  366. printf("%sn",s); /* isn't echoing commands. */
  367. #ifdef OS2
  368. {
  369.     char *s2 = s; /* Echo to emulator */
  370.     while (*s2) {
  371. scriptwrtbuf((USHORT)*s2++);
  372.     }
  373.     scriptwrtbuf((USHORT)CR);
  374.     scriptwrtbuf((USHORT)LF);
  375. }
  376. #endif /* OS2 */
  377.     }
  378.     for (; *s; s++) {
  379. ttoc(*s);
  380. #ifdef TCPSOCKET
  381. if (*s == CR && network && ttnproto == NP_TELNET) {
  382.     if (!TELOPT_ME(TELOPT_BINARY) && tn_nlm != TNL_CR)
  383.       ttoc((char)((tn_nlm == TNL_CRLF) ? LF : NUL));
  384.     else if (TELOPT_ME(TELOPT_BINARY) &&
  385.      (tn_b_nlm == TNL_CRLF || tn_b_nlm == TNL_CRNUL))
  386.       ttoc((char)((tn_b_nlm == TNL_CRLF) ? LF : NUL));
  387.         }
  388. #endif /* TCPSOCKET */
  389. if (millisec > 0)
  390.   msleep(millisec);
  391.     }
  392. }
  393. /*
  394.  * Wait for a string of characters.
  395.  *
  396.  * The characters are waited for individually, and other characters may
  397.  * be received "in between".  This merely guarantees that the characters
  398.  * ARE received, and in the order specified.
  399.  */
  400. static VOID
  401. waitfor(s) char *s; {
  402.     CHAR c, x;
  403.     while ( c = *s++ ) { /* while more characters remain... */
  404. do { /* wait for the character */
  405.     x = (CHAR) (ddinc(0) & 0177);
  406.     debug(F000,"dial waitfor got","",x);
  407.     if (dialdpy) {
  408. if (x != LF) conoc(x);
  409. if (x == CR) conoc(LF);
  410.     }
  411. } while ( x != c);
  412.     }
  413. }
  414. static int
  415. didweget(s,r) char *s, *r; { /* Looks in string s for response r */
  416.     int lr = (int)strlen(r); /*  0 means not found, 1 means found it */
  417.     int i;
  418.     debug(F110,"didweget",r,0);
  419.     debug(F110," in",s,0);
  420.     for (i = (int)strlen(s)-lr; i >= 0; i--)
  421. if ( s[i] == r[0] ) if ( !strncmp(s+i,r,lr) ) return( 1 );
  422.     return( 0 );
  423. }
  424. /* R E S E T -- Reset alarms, etc. on exit. */
  425. static VOID
  426. dreset() {
  427.     debug(F100,"dreset resetting alarm and signal handlers","",0);
  428.     alarm(0);
  429.     signal(SIGALRM,savalrm); /* restore alarm handler */
  430.     signal(SIGINT,savint); /* restore interrupt handler */
  431.     debug(F100,"dreset alarm and signal handlers reset","",0);
  432. }
  433. /*
  434.   Call this routine when the modem reports that it has connected at a certain
  435.   speed, giving that speed as the argument.  If the connection speed is not
  436.   the same as Kermit's current communication speed, AND the modem interface
  437.   speed is not locked (i.e. DIAL SPEED-MATCHING is not ON), then change the
  438.   device speed to the one given.
  439. */
  440. static VOID
  441. #ifdef CK_ANSIC
  442. spdchg(long s)
  443. #else
  444. spdchg(s) long s;
  445. #endif /* CK_ANSIC */
  446. /* spdchg */ {
  447.     int s2;
  448.     if (!mdmspd) /* If modem interface speed locked, */
  449.       return; /*  don't do this. */
  450.     if (speed != s) { /* Speeds differ? */
  451. s2 = s / 10L; /* Convert to cps expressed as int */
  452. if (ttsspd(s2) < 0) { /* Change speed. */
  453.     printf(" WARNING - speed change to %ld failed.rn",s);
  454. } else {
  455.     printf(" Speed changed to %ld.rn",s);
  456.     speed = s; /* Update global speed variable */
  457. }
  458.     }
  459. }
  460. /*
  461.   Display all characters received from modem dialer through this routine,
  462.   for consistent handling of carriage returns and linefeeds.
  463. */
  464. static VOID
  465. #ifdef CK_ANSIC
  466. dialoc(char c)
  467. #else
  468. dialoc(c) char c;
  469. #endif /* CK_ANSIC */
  470. { /* dialoc */ /* Dial Output Character */
  471.     if (dialdpy) {
  472. if (c != LF) conoc(c); /* Don't echo LF */
  473. if (c == CR) conoc(LF); /* Echo CR as CRLF */
  474.     }
  475. }
  476. char *
  477. getdm(x) int x; { /* Return dial modifier */
  478.     MDMINF * mp;
  479.     int m;
  480.     int ishayes = 0;
  481.     m = mdmtyp;
  482.     if (m < 1)
  483.       if (mdmsav > -1)
  484. m = mdmsav;
  485.     if (m < 1)
  486.       return("");
  487. #ifndef MINIDIAL
  488.     if (m == n_TAPI)
  489.       m = n_HAYES;
  490. #endif /* MINIDIAL */
  491.     mp = modemp[m];
  492.     ishayes = mp->capas & CKD_AT;
  493.     switch (x) {
  494.       case VN_DM_LP:
  495. return(ishayes ? "," : "");
  496.       case VN_DM_SP:
  497. #ifdef MINIDIAL
  498. return("");
  499. #else
  500. return(m == n_USR ? "/" : "");
  501. #endif /* MINIDIAL */
  502.       case VN_DM_PD:
  503. return(ishayes ? "P" : "");
  504.       case VN_DM_TD:
  505. return(ishayes ? "T" : "");
  506.       case VN_DM_WA:
  507. return(ishayes ? "@" : "");
  508.       case VN_DM_WD:
  509. return(ishayes ? "W" : "");
  510.       case VN_DM_RC:
  511. return(ishayes ? ";" : "");
  512.     }
  513.     return("");
  514. }
  515. static VOID
  516. getdialmth() {
  517.     if (dialmauto && diallcc) { /* If DIAL METHOD AUTO... */
  518. int i; /* and we know our area code... */
  519. for (i = 0; i < ndialtocc; i++) { /* First check Tone countries list */
  520.     if (!strcmp(dialtocc[i],diallcc)) {
  521. dialmth = XYDM_T;
  522. break;
  523.     }
  524. }
  525. for (i = 0; i < ndialpucc; i++) { /* Then Pulse countries list */
  526.     if (!strcmp(dialpucc[i],diallcc)) {
  527. dialmth = XYDM_P;
  528. break;
  529.     }
  530. }
  531.     }
  532. }
  533. VOID /* Get dialing defaults from environment */
  534. getdialenv() {
  535.     char *p = NULL;
  536.     int i, x;
  537.     makestr(&p,getenv("K_DIAL_DIRECTORY"));
  538.     if (p) {
  539. int i;
  540. xwords(p,(MAXDDIR - 2),dialdir,0);
  541. for (i = 0; i < (MAXDDIR - 1); i++) {
  542.     if (!dialdir[i+1])
  543.       break;
  544.     else
  545.       dialdir[i] = dialdir[i+1];
  546. }
  547. ndialdir = i;
  548.     }
  549.     xmakestr(&diallcc,getenv("K_COUNTRYCODE")); /* My country code */
  550.     xmakestr(&dialixp,getenv("K_LD_PREFIX"));   /* My long-distance prefix */
  551.     xmakestr(&dialldp,getenv("K_INTL_PREFIX")); /* My international prefix */
  552.     xmakestr(&dialldp,getenv("K_TF_PREFIX"));   /* Ny Toll-free prefix */
  553. #ifndef NOICP
  554.     p = getenv("K_DIAL_METHOD"); /* Local dial method */
  555.     if (p) if (*p) {
  556. extern struct keytab dial_m[];
  557. extern int ndial_m;
  558. i = lookup(dial_m,p,ndial_m,&x);
  559. if (i > -1) {
  560.     if (i == XYDM_A) {
  561. dialmauto = 1;
  562. dialmth = XYDM_D;
  563.     } else {
  564. dialmauto = 0;
  565. dialmth = i;
  566.     }
  567. }
  568.     }
  569. #endif /* NOICP */
  570.     p = NULL;
  571.     xmakestr(&p,getenv("K_TF_AREACODE")); /* Toll-free areacodes */
  572.     if (p) {
  573. int i;
  574. xwords(p,7,dialtfc,0);
  575. for (i = 0; i < 8; i++) {
  576.     if (!dialtfc[i+1])
  577.       break;
  578.     else
  579.       dialtfc[i] = dialtfc[i+1];
  580. }
  581. ntollfree = i;
  582. free(p);
  583.     }
  584.     for (i = 0; i < MAXTPCC; i++) { /* Clear Tone/Pulse country lists */
  585. dialtocc[i] = NULL;
  586. dialpucc[i] = NULL;
  587.     }
  588.     for (i = 0; i < MAXTPCC; i++) { /* Init Tone country list */
  589. if (tonecc[i])
  590.   makestr(&(dialtocc[i]),tonecc[i]);
  591. else
  592.   break;
  593.     }
  594.     ndialtocc = i;
  595.     for (i = 0; i < MAXTPCC; i++) { /* Init Pulse country list */
  596. if (pulsecc[i])
  597.   makestr(&(dialpucc[i]),pulsecc[i]);
  598. else
  599.   break;
  600.     }
  601.     ndialpucc = i;
  602.     if (diallcc) { /* Have country code */
  603. if (!strcmp(diallcc,"1")) { /* If it's 1 */
  604.     if (!dialldp) /* Set these prefixes... */
  605.       makestr(&dialldp,"1");
  606.     if (!dialtfp)
  607.       makestr(&dialtfp,"1");
  608.     if (!dialixp)
  609.       makestr(&dialixp,"011");
  610.     if (ntollfree == 0) { /* Toll-free area codes */
  611. if (dialtfc[0] = malloc(4)) {
  612.     strcpy(dialtfc[0],"800"); /* 1970-something */
  613.     ntollfree++;
  614.     if (dialtfc[1] = malloc(4)) {
  615. strcpy(dialtfc[1],"888"); /* 1996 */
  616. ntollfree++;
  617. if (dialtfc[2] = malloc(4)) {
  618.     strcpy(dialtfc[2],"877"); /* 5 April 1998 */
  619.     ntollfree++;
  620.     if (dialtfc[3] = malloc(4)) {
  621. strcpy(dialtfc[3],"866"); /* Soon */
  622. ntollfree++;
  623.     }
  624. }
  625.     }
  626. }
  627.     }
  628. } else if (!strcmp(diallcc,"358") &&
  629.    ((int) strcmp(zzndate(),"19961011") > 0)
  630.    ) { /* Finland */
  631.     if (!dialldp) /* Long-distance prefix */
  632.       makestr(&dialldp,"9");
  633.     if (!dialixp)  /* International dialing prefix */
  634.       makestr(&dialixp,"990");
  635. } else { /* Not NANP or Finland */
  636.     if (!dialldp)
  637.       makestr(&dialldp,"0");
  638.     if (!dialixp)
  639.       makestr(&dialixp,"00");
  640. }
  641.     }
  642.     xmakestr(&diallac,getenv("K_AREACODE"));
  643.     xmakestr(&dialpxo,getenv("K_PBX_OCP"));
  644.     xmakestr(&dialpxi,getenv("K_PBX_ICP"));
  645.     p = getenv("K_PBX_XCH");
  646. #ifdef COMMENT
  647.     xmakestr(&dialpxx,p);
  648. #else
  649.     if (p) if (*p) {
  650. int x;
  651. char * s = NULL;
  652. char * pp[MAXPBXEXCH+1];
  653. makestr(&s,p); /* Make a copy for poking */
  654. if (s) {
  655.     xwords(s,MAXPBXEXCH+1,pp,0); /* Note: pp[] is 1-based. */
  656.     for (i = 0; i <= MAXPBXEXCH; i++) {
  657.                 if (!pp[i+1]) break;
  658. makestr(&(dialpxx[i]),pp[i+1]);
  659. ndialpxx++;
  660.     }
  661.     makestr(&s,NULL); /* Free poked copy */
  662. }
  663.     }
  664. #endif /* COMMENT */
  665. }
  666. static int
  667. dialfail(x) int x; {
  668.     char * s;
  669.     fail_code = x;
  670.     debug(F101,"ckudial dialfail","",x);
  671.     dreset(); /* Reset alarm and signal handlers */
  672.     printf("%s Failure: ", func_code == 0 ? "DIAL" : "ANSWER");
  673.     if (dialdpy) { /* If showing progress */
  674.        debug(F100,"dial display is on","",0);
  675. p = ck_time(); /* get current time; */
  676. if (*p) printf("%s: ",p);
  677.     }
  678.     switch (fail_code) { /* Type of failure */
  679.       case F_TIME:  /* Timeout */
  680. if (dial_what == DW_INIT)
  681.   printf ("Timed out while trying to initialize modem.n");
  682. else if (dial_what == DW_DIAL)
  683.   printf ("%s interval expired.n",
  684.   func_code == 0 ? "DIAL TIMEOUT" : "ANSWER timeout");
  685. else
  686.   printf("Timeout.n");
  687. fflush(stdout);
  688. if (mp->capas & CKD_AT)
  689.   ttoc('15'); /* Send CR to interrupt dialing */
  690. /* Some Hayes modems don't fail with BUSY on busy lines */
  691. dialsta = DIA_TIMO;
  692. debug(F110,"dial","timeout",0);
  693. break;
  694.       case F_INT: /* Dialing interrupted */
  695. printf ("Interrupted.n");
  696. fflush(stdout);
  697. debug(F110,"dial","interrupted",0);
  698. if (mp->capas & CKD_AT)
  699.   ttoc('15'); /* Send CR to interrupt dialing */
  700. dialsta = DIA_INTR;
  701. break;
  702.     case F_MODEM: /* Modem detected a failure */
  703.          debug(F111,"dialfail()","lbuf",lbuf);
  704.          if (lbuf && *lbuf) {
  705.             printf(" "");
  706.             for (s = lbuf; *s; s++)
  707.                if (isprint(*s))
  708.                   putchar(*s); /* Display printable reason */
  709.             printf (""");
  710.          } else printf(func_code == 0 ?
  711.                         " Call not completed." :
  712.                         " Call did not come in."
  713.                         );
  714. printf("n");
  715. debug(F110,"dial",lbuf,0);
  716. if (dialsta < 0) dialsta = DIA_UNSP;
  717. break;
  718.       case F_MINIT: /* Failure to initialize modem */
  719. printf ("Error initializing modem.n");
  720. debug(F110,"dial","modem init",0);
  721. dialsta = DIA_NOIN;
  722. break;
  723.     default:
  724. printf("unknownn");
  725. debug(F110,"dial","unknown",0);
  726. fflush(stdout);
  727. if (mp->capas & CKD_AT)
  728.   ttoc('15'); /* Send CR to interrupt dialing */
  729. dialsta = DIA_INTR;
  730.     }
  731. #ifdef DYNAMIC
  732.     if (rbuf) free(rbuf); rbuf = NULL;
  733.     if (fbuf) free(fbuf); fbuf = NULL;
  734. #endif /* DYNAMIC */
  735.     if (dialsta < 0) dialsta = DIA_UERR; /* Set failure code */
  736.     return(0); /* Return zero (important) */
  737. }
  738. /*  C K D I A L  --  Dial up the remote system */
  739. /* Returns 1 if call completed, 0 otherwise */
  740. static int mdmwait, mdmstat = 0;
  741. #ifndef CK_TAPI
  742. static
  743. #endif /* CK_TAPI */
  744. int waitct;
  745. int mdmwaitd = 10 ; /* dialtmo / mdmwait difference */
  746. static char c;
  747. static char *telnbr;
  748. static int wr = 0; /* wr = wake rate */
  749. static char * ws; /* ws = wake string */
  750. static char * xnum = NULL;
  751. static int inited = 0;
  752. static SIGTYP
  753. #ifdef CK_ANSIC
  754. _dodial(void * threadinfo)
  755. #else /* CK_ANSIC */
  756. _dodial(threadinfo) VOID * threadinfo;
  757. #endif /* CK_ANSIC */
  758. /* _dodial */ {
  759.     char c2;
  760.     char *dcmd, *s, *flocmd = NULL;
  761.     int x = 0, n = F_TIME;
  762. #ifdef NTSIG
  763.     signal( SIGINT, dialint );
  764.     if (threadinfo) { /* Thread local storage... */
  765. TlsSetValue(TlsIndex,threadinfo);
  766.     }
  767. #endif /* NTSIG */
  768.     dcmd = dialcmd ? dialcmd : mp->dial_str;
  769.     if ((int)strlen(dcmd) + (int)strlen(telnbr) > (LBUFL - 2)) {
  770. printf("DIAL command + phone number too long!n");
  771. dreset();
  772. #ifdef DYNAMIC
  773. if (rbuf) free(rbuf); rbuf = NULL;
  774. if (fbuf) free(fbuf); fbuf = NULL;
  775. #endif /* DYNAMIC */
  776. #ifdef NTSIG
  777. ckThreadEnd(threadinfo);
  778. #endif /* NTSIG */
  779. SIGRETURN;  /* No conversation with modem to complete dialing */
  780.     }
  781.     makestr(&xnum,telnbr);
  782.     getdialmth(); /* Get dial method */
  783. #ifdef CK_ATDT
  784.     /* Combine the SET DIAL METHOD command with the DIAL command string */
  785.     if (!dialcmd && /* Using default DIAL command */
  786. (mdmcapas & CKD_AT) && /* AT command set only */
  787. ((dialmth == XYDM_T && !dialtone) || /* and using default */
  788.  (dialmth == XYDM_P && !dialpulse))) { /* modem commands... */
  789. char c;
  790. debug(F110,"dial atdt xnum 1",xnum,0);
  791. s = dcmd;
  792. debug(F110,"dial atdt s",s,0);
  793. if (*telnbr != 'T' &&
  794.     *telnbr != 'P' &&
  795.     *telnbr != 't' &&
  796.     *telnbr != 'p' &&
  797.     !ckstrcmp(s,"atd",3,0) &&
  798.     s[3] != 'T' &&
  799.     s[3] != 'P' &&
  800.     s[3] != 't' &&
  801.     s[3] != 'p') {
  802.     char xbuf[200];
  803.     c = (dialmth == XYDM_T) ? 'T' : 'P';
  804.     if (islower(s[0]))
  805.       c = tolower(c);
  806.     if ((int)strlen(telnbr) < 199) {
  807. sprintf(xbuf,"%c%s",c,telnbr);
  808. makestr(&xnum,xbuf);
  809.     }
  810. }
  811.     }
  812. #endif /* CK_ATDT */
  813.     debug(F111,"ckdial",xnum,xredial);
  814.     /* Hang up the modem (in case it wasn't "on hook") */
  815.     /* But only if SET DIAL HANGUP ON... */
  816.     if (!xredial) { /* Modem not initalized yet. */
  817. inited = 0;
  818.     }
  819.     if (!xredial || !inited) {
  820. if (dialhup() < 0) { /* Hangup first */
  821.     debug(F100,"ckdial dialhup failed","",0);
  822. #ifndef MINIDIAL
  823.     if (mdmcapas & CKD_TB) /* Telebits might need a BREAK */
  824.       ttsndb(); /*  first. */
  825. #endif /* MINIDIAL */
  826.     if (dialhng && dialsta != DIA_PART) { /* If hangup failed, */
  827. ttclos(0); /* close and reopen the device. */
  828. if (ttopen(ttname,&local,mymdmtyp,0) < 0) {
  829.     printf("Sorry, Can't hang up communication device.n");
  830.     printf("Try 'set line %s' again.n",ttname);
  831.     dialsta = DIA_HANG;
  832. #ifdef DYNAMIC
  833.     if (rbuf) free(rbuf); rbuf = NULL;
  834.     if (fbuf) free(fbuf); fbuf = NULL;
  835. #endif /* DYNAMIC */
  836.     dreset();
  837. #ifdef NTSIG
  838.     ckThreadEnd(threadinfo);
  839. #endif /* NTSIG */
  840.     SIGRETURN;
  841. }
  842.     }
  843. }
  844. inited = 0; /* We hung up so must reinit */
  845.     }
  846. #ifndef MINIDIAL
  847.     /* Don't start talking to Rolm too soon */
  848.     if (mymdmtyp == n_ROLM && dialsta != DIA_PART)
  849.       msleep(500);
  850. #endif /* MINIDIAL */
  851.     if (dialsta != DIA_PART /* Some initial setups. */
  852. #ifndef MINIDIAL
  853. && mymdmtyp != n_ATTUPC
  854. #endif /* MINIDIAL */
  855. ) {
  856. fail_code = F_MINIT; /* Default failure code */
  857. dial_what = DW_INIT; /* What I'm Doing Now   */
  858. if (dialdpy) { /* If showing progress, */
  859.     p = ck_time(); /* get timestamp.   */
  860.     if (!inited)
  861.       if (*p)
  862. printf(" Initializing: %s...n",p);
  863. }
  864.     }
  865. #ifndef MINIDIAL
  866. #ifdef ATT7300
  867.     if (mymdmtyp == n_ATTUPC) {
  868. /*
  869.   For ATT7300/Unix PC's with their special internal modem.  Whole dialing
  870.   process is handled right here, an exception to the normal structure.
  871.   Timeout and user interrupts are enabled during dialing.  attdial() is in
  872.   file ckutio.c.  - jrd
  873. */
  874.         _PROTOTYP( int attdial, (char *, long, char *) );
  875. fail_code = F_MODEM; /* Default failure code */
  876. dial_what = DW_DIAL;
  877. if (dialdpy) { /* If showing progress */
  878.     p = ck_time(); /* get current time; */
  879.     if (*p)
  880.       printf(" Dialing: %s...n",p);
  881. }
  882. alarm(waitct); /* Set alarm */
  883. if (attdial(ttname,speed,telnbr)) { /* dial internal modem */
  884.     dreset(); /* reset alarms, etc. */
  885.     printf(" Call failed.rn");
  886.     dialhup();          /* Hangup the call */
  887. #ifdef DYNAMIC
  888.     if (rbuf) free(rbuf); rbuf = NULL;
  889.     if (fbuf) free(fbuf); fbuf = NULL;
  890. #endif /* DYNAMIC */
  891.     dialsta = DIA_UERR;
  892. #ifdef NTSIG
  893.     ckThreadEnd(threadinfo);
  894. #endif /* NTSIG */
  895.     SIGRETURN; /* return failure */
  896. }
  897. dreset(); /* reset alarms, etc. */
  898. ttpkt(speed,FLO_DIAX,parity); /* cancel dialing ioctl */
  899. if (!quiet && !backgrd) {
  900.     if (dialdpy) {
  901. printf("n");
  902. printf(" Call complete.rn");
  903.     } else if (modemmsg[0])
  904. printf(" Call complete: "%s".rn",(char *)modemmsg);
  905.     else
  906.       printf(" Call complete.rn");
  907. }
  908. #ifdef CKLOGDIAL
  909. dologdial(telnbr);
  910. #endif /* CKLOGDIAL */
  911. dialsta = DIA_OK;
  912. #ifdef DYNAMIC
  913. if (rbuf) free(rbuf); rbuf = NULL;
  914. if (fbuf) free(fbuf); fbuf = NULL;
  915. #endif /* DYNAMIC */
  916. #ifdef NTSIG
  917. ckThreadEnd(threadinfo);
  918. #endif /* NTSIG */
  919. SIGRETURN; /* No conversation with modem to complete dialing */
  920.     } else
  921. #endif /* ATT7300 */
  922. #ifdef CK_TAPI
  923.       if (tttapi && !tapipass) { /* TAPI Dialing */
  924.   switch (func_code) {
  925.     case 0: /* Dial */
  926.       if (cktapidial(telnbr)) {
  927.   fail_code = 0;
  928.   if (partial) {
  929.       dialsta = DIA_PART;
  930.   } else {
  931.       dialsta = DIA_OK;
  932.       speed = ttgspd();
  933.   }
  934.       } else {
  935.   if (dialsta == DIA_PART)
  936.     cktapihangup();
  937.   if (!fail_code)
  938.     fail_code = F_MODEM;
  939.   dialsta = DIA_TAPI;
  940.       }
  941.       break;
  942.     case 1: { /* Answer */
  943. long strttime = time((long *)NULL);
  944. long diff = 0;
  945. do {
  946.     if (dialatmo) {
  947. strttime += diff;
  948. waitct   -= diff;
  949.     }
  950.     fail_code = 0;
  951.     if (cktapianswer()) { /* SUCCESS */
  952. dialsta = DIA_OK;
  953. speed = ttgspd();
  954. break;
  955.     } else { /* FAILURE */
  956. if (fail_code) {
  957.     dialsta = DIA_TAPI;
  958.     break;
  959. } else {
  960.     fail_code = F_MODEM;
  961.     dialsta = DIA_TAPI;
  962. }
  963.     }
  964.     if (dialatmo) {
  965. diff = time((long *)NULL) - strttime;
  966.     }
  967. } while (dialatmo ? (diff < waitct) : 1);
  968. break;
  969.     }
  970.   }
  971. #ifdef NTSIG
  972.   ckThreadEnd(threadinfo);
  973. #endif /* NTSIG */
  974.   SIGRETURN;
  975.       } else
  976. #endif /* CK_TAPI */
  977. #endif /* MINIDIAL */
  978. /* Modems with AT command set... */
  979.       if ((mdmcapas & CKD_AT) && dialsta != DIA_PART) {
  980.   if (dialpace > -1) /* Set intercharacter pacing */
  981.     wr = dialpace;
  982.   else
  983.     wr = mp->wake_rate;
  984.   if (dialini) /* Get wakeup/init string */
  985.     ws = dialini;
  986.   else
  987.     ws = mp->wake_str;
  988.   if (!ws) ws = "15"; /* If none, use CR */
  989.   /* First get the modem's attention and enable result codes */
  990.   for (tries = 0; tries < 5; tries++) { /* Send short command */
  991.       if (tries > 0) {
  992.   ttoc('15'); /* AT must go first for speed */
  993.   msleep(wr); /* detection. */
  994.       }
  995.       ttslow("ATQ015",wr);
  996.       mdmstat = getok(tries < 2 ? 2 : tries, 1); /* Get response */
  997.       if (mdmstat > 0) break; /* OK - done */
  998.       if (dialdpy && tries > 0) {
  999.   printf("rn No response from modem, retrying%s...rn",
  1000.  (tries > 1) ? " again" : "");
  1001.   fflush(stdout);
  1002.       }
  1003.       ttflui();
  1004.       switch (tries) {
  1005. case 0: msleep(100); break;
  1006. case 1: ttsndb(); break;
  1007. default:
  1008.   if (network) {
  1009.       ttsndb();
  1010.   } else {
  1011.       if (tries == 2)
  1012. tthang();
  1013.       else
  1014. mdmhup();
  1015.       inited = 0;
  1016.   }
  1017.       }
  1018.       fflush(stdout);
  1019.   }
  1020.   debug(F101,"ckdial ATQ0 mdmstat","",mdmstat);
  1021.   if (xredial && inited) { /* Redialing... */
  1022.       ttoc('15'); /* Cancel previous */
  1023.       msleep(250); /* Wait a bit */
  1024. #ifdef COMMENT
  1025. /* This wasn't the problem... */
  1026.       ttflui(); /* Clear out stuff from modem setup */
  1027.       ttslow("ATS7=6015",wr); /* Redo carrier wait */
  1028.       getok(4,1); /* Get response */
  1029. #endif /* COMMENT */
  1030.       alarm(0); /* Just in case... */
  1031.       ttflui(); /* Clear out stuff from modem setup */
  1032.       goto REDIAL; /* Skip setup - we already did it */
  1033.   }
  1034. /*
  1035.   Do flow control next because a long init string echoing back could
  1036.   cause data overruns, causing us to miss the OK, or (worse) to get out
  1037.   of sync entirely.
  1038. */
  1039.   x = 0; /* User said SET DIAL FLOW RTS/CTS */
  1040.   if (dialfc == FLO_RTSC || /* Even if Kermit's FLOW isn't...  */
  1041.       (dialfc == FLO_AUTO && flow == FLO_RTSC)) {
  1042.       if (dialhwfc) { /* User-defined HWFC string */
  1043.   if (*dialhwfc) {
  1044.       x = 1;
  1045.       flocmd = dialhwfc;
  1046.   }
  1047.       } else if ((mdmcapas & CKD_HW) && *(mp->hwfc_str)) {
  1048.   x = 1;
  1049.   flocmd = mp->hwfc_str;
  1050.       }
  1051.   } else if (dialfc == FLO_XONX || /* User said SET DIAL FLOW SOFT */
  1052.      (dialfc == FLO_AUTO && flow == FLO_XONX)) {
  1053.       if (dialswfc) {
  1054.   if (*dialswfc) {
  1055.       x = 1;
  1056.       flocmd = dialswfc;
  1057.   }
  1058.       } else if ((mdmcapas & CKD_SW) && *(mp->swfc_str)) {
  1059.   x = 1;
  1060.   flocmd = mp->swfc_str;
  1061.       }
  1062.   } else if (dialfc == FLO_NONE) { /* User said SET DIAL FLOW NONE */
  1063.       if (dialnofc) {
  1064.   if (*dialnofc) {
  1065.       x = 1;
  1066.       flocmd = dialnofc;
  1067.   }
  1068.       } else if (mp->nofc_str && *(mp->nofc_str)) {
  1069.   x = 1;
  1070.   flocmd = mp->nofc_str;
  1071.       }
  1072.   }
  1073.   if (x) { /* Send the flow control command */
  1074.       debug(F110,"ckdial flocmd",flocmd,0);
  1075.       for (tries = 4; tries > 0; tries--) { /* Send the command */
  1076.   ttslow(flocmd,wr);
  1077.   mdmstat = getok(5,1);
  1078.   if (mdmstat > 0) break;
  1079.   if (dialdpy && tries > 1)
  1080.     printf(" No response from modem, retrying%s...n",
  1081.    (tries < 4) ? " again" : "");
  1082.       }
  1083. #ifdef CK_TTSETFLOW
  1084. #ifdef CK_RTSCTS
  1085. /*
  1086.   So far only ckutio.c has ttsetflow().
  1087.   We have just told the modem to turn on RTS/CTS flow control and the modem
  1088.   has said OK.  But we ourselves have not turned it on yet because of the
  1089.   disgusting ttpkt(...FLO_DIAL...) hack.  So now, if the computer does not
  1090.   happen to be asserting RTS, the modem will no longer send characters to it.
  1091.   So at EXACTLY THIS POINT, we must enable RTS/CTS in the device driver.
  1092. */
  1093.       if (dialfc == FLO_RTSC ||
  1094.   (dialfc == FLO_AUTO && flow == FLO_RTSC)) {
  1095.   ttsetflow(FLO_RTSC);
  1096.       }
  1097. #endif /* CK_RTSCTS */
  1098. #endif /* CK_TTSETFLOW */
  1099.   }
  1100.   ttflui(); /* Clear out stuff from modem setup */
  1101.   msleep(250);
  1102.   for (tries = 4; tries > 0; tries--) { /* Send init string */
  1103.       ttslow(ws,wr);
  1104.       mdmstat = getok(4,1); /* Get response */
  1105.       if (mdmstat > 0) break;
  1106.       if (dialdpy && tries > 1)
  1107. printf(" No response from modem, retrying%s...n",
  1108.        (tries < 4) ? " again" : "");
  1109.   }
  1110.   debug(F101,"ckdial wake_str mdmstat","",mdmstat);
  1111.   if (mdmstat < 1) { /* Initialized OK? */
  1112.       dialfail(F_MINIT); /* No, fail. */
  1113. #ifdef NTSIG
  1114.       ckThreadEnd(threadinfo);
  1115. #endif /* NTSIG */
  1116.       SIGRETURN;
  1117.   }
  1118. #ifndef MINIDIAL
  1119.     } else if (mymdmtyp == n_ATTDTDM && dialsta != DIA_PART) { /* AT&T ... */
  1120. ttsndb(); /* Send BREAK */
  1121. #endif /* MINIDIAL */
  1122.     } else if (dialsta != DIA_PART) { /* All others */
  1123. /* Place modem into command mode */
  1124. ws = dialini ? dialini : mp->wake_str;
  1125. if (ws && (int)strlen(ws) > 0) {
  1126.     debug(F111,"ckdial default, wake string", ws, wr);
  1127.     ttslow(ws, wr);
  1128. } else debug(F100,"ckdial no wake_str","",0);
  1129. if (mp->wake_prompt && (int)strlen(mp->wake_prompt) > 0) {
  1130.     debug(F110,"ckdial default, waiting for wake_prompt",
  1131.   mp->wake_prompt,0);
  1132.     alarm(10);
  1133.     waitfor(mp->wake_prompt);
  1134.     alarm(0);
  1135. } else debug(F100,"ckdial no wake_prompt","",0);
  1136.     }
  1137.     if (dialsta != DIA_PART) {
  1138. alarm(0); /* Turn off alarm */
  1139. debug(F100,"ckdial got wake prompt","",0);
  1140. msleep(500); /* Allow settling time */
  1141.     }
  1142. /* Handle error correction, data compression, and flow control... */
  1143.     if (dialsta != DIA_PART) {
  1144. /* Enable/disable error-correction */
  1145. x = 0;
  1146. if (dialec) { /* DIAL ERROR-CORRECTION is ON */
  1147.     if (dialecon) { /* SET DIAL STRING ERROR-CORRECTION */
  1148. if (*dialecon) {
  1149.     x = 1;
  1150.     ttslow(dialecon, wr);
  1151. }
  1152.     } else if ((mdmcapas & CKD_EC) && *(mp->ec_on_str)) {
  1153. x = 1;
  1154. ttslow(mp->ec_on_str, wr);
  1155.     }
  1156. #ifdef COMMENT
  1157.     else printf(
  1158.   "WARNING - I don't know how to turn on EC for this modemn"
  1159.      );
  1160. #endif /* COMMENT */
  1161. } else {
  1162.     if (dialecoff) { /* DIAL ERROR-CORRECTION OFF */
  1163. if (*dialecoff) {
  1164.     x = 1;
  1165.     ttslow(dialecoff, wr);
  1166. }
  1167.     } else if ((mdmcapas & CKD_EC) && *(mp->ec_off_str)) {
  1168. x = 1;
  1169. ttslow(mp->ec_off_str, wr);
  1170.     }
  1171. #ifdef COMMENT
  1172.     else printf(
  1173.   "WARNING - I don't know how to turn off EC for this modemn"
  1174.      );
  1175. #endif /* COMMENT */
  1176. }
  1177. debug(F101,"ckudia xx_ok","",xx_ok);
  1178. if (x && xx_ok) { /* Look for OK response */
  1179.     debug(F100,"ckudia calling xx_ok for EC","",0);
  1180.     x = (*xx_ok)(5,1);
  1181.     debug(F101,"ckudia xx_ok","",x);
  1182.     if (x < 0) {
  1183. printf("WARNING - Trouble enabling error-correction.n");
  1184. printf(
  1185. " Likely cause: Your modem is an RPI model, which does not have built-inn");
  1186. printf(" error correction and data compression.");
  1187.     }
  1188. }
  1189. /* Enable/disable data compression */
  1190. if (x > 0) x = 0;
  1191. if (dialdc) {
  1192.     if (x < 0 || !dialec) {
  1193. printf(
  1194. "WARNING - You can't have compression without error correction.n");
  1195.     } else if (dialdcon) { /* SET DIAL STRING ... */
  1196. if (*dialdcon) {
  1197.     x = 1;
  1198.     ttslow(dialdcon, wr);
  1199. }
  1200.     } else if ((mdmcapas & CKD_DC) && *(mp->dc_on_str)) {
  1201. x = 1;
  1202. ttslow(mp->dc_on_str, wr);
  1203.     }
  1204. #ifdef COMMENT
  1205.     else printf(
  1206.   "WARNING - I don't know how to turn on DC for this modemn"
  1207.   );
  1208. #endif /* COMMENT */
  1209. } else {
  1210.     if (dialdcoff) {
  1211. if (*dialdcoff) {
  1212.     x = 1;
  1213.     ttslow(dialdcoff, wr);
  1214. }
  1215.     } else if ((mdmcapas & CKD_DC) && *(mp->dc_off_str)) {
  1216. x = 1;
  1217. ttslow(mp->dc_off_str, wr);
  1218.     }
  1219. #ifdef COMMENT
  1220.     else printf(
  1221. "WARNING - I don't know how to turn off compression for this modemn"
  1222.   );
  1223. #endif /* COMMENT */
  1224. }
  1225. if (x && xx_ok) { /* Look for OK response */
  1226.     x = (*xx_ok)(5,1);
  1227.     if (x < 0) printf("WARNING - Trouble enabling compressionn");
  1228. }
  1229.     }
  1230. #ifndef NOXFER
  1231. #ifndef MINIDIAL
  1232.     if (mdmcapas & CKD_KS && dialsta != DIA_PART) { /* Kermit spoof */
  1233. int r; /* Register */
  1234. char tbcmdbuf[20]; /* Command buffer */
  1235. switch (mymdmtyp) {
  1236.   case n_MICROCOM: /* Microcoms in SX mode */
  1237.        if (dialksp)
  1238.       sprintf(tbcmdbuf,"APM1;KMC%d15",stchr);
  1239.     else
  1240.       sprintf(tbcmdbuf,"APM015");
  1241.        ttslow(tbcmdbuf, MICROCOM.wake_rate);
  1242.        alarm(3);
  1243.     waitfor(mp->wake_prompt);
  1244.     alarm(0);
  1245.     break;
  1246.   case n_TELEBIT: /* Old and new Telebits */
  1247.   case n_TBNEW:
  1248.     if (!dialksp) {
  1249. sprintf(tbcmdbuf,"ATS111=015");
  1250.     } else {
  1251. switch (parity) { /* S111 value depends on parity */
  1252.   case 'e': r = 12; break;
  1253.   case 'm': r = 13; break;
  1254.   case 'o': r = 11; break;
  1255.   case 's': r = 14; break;
  1256.   case 0:
  1257.   default:  r = 10; break;
  1258. }
  1259. sprintf(tbcmdbuf,"ATS111=%d S112=%d15",r,stchr);
  1260.     }
  1261.     ttslow(tbcmdbuf, wr);
  1262. /* Not all Telebit models have the Kermit spoof, so ignore response. */
  1263.     if (xx_ok) { /* Get modem's response */
  1264. x = (*xx_ok)(5,1);
  1265.     }
  1266. }
  1267.     }
  1268. #endif /* MINIDIAL */
  1269. #endif /* NOXFER */
  1270.     /* Speaker */
  1271.     if ((mdmcapas & CKD_AT) && (dialsta != DIA_PART) &&
  1272. !dialspon && !dialspoff &&
  1273. !dialvol1 && !dialvol2 &&!dialvol3) {
  1274. /* AT command set and commands have not been customized */
  1275. /* so combine speaker and volume commands. */
  1276. if (mdmspk)
  1277.   sprintf(lbuf,"ATM1L%d%c",mdmvol,13);
  1278. else
  1279.   sprintf(lbuf,"ATM0%c",13);
  1280. ttslow(lbuf,wr); /* Send command */
  1281. getok(5,1); /* Get but ignore response */
  1282.     } else if (dialsta != DIA_PART) { /* Customized or not AT commands */
  1283. x = 0; /* Do it the hard way */
  1284. if (mdmspk) {
  1285.     if (dialspon) {
  1286. if (*dialspon) {
  1287.     x = 1;
  1288.     ttslow(dialspon,wr);
  1289. }
  1290.     } else {
  1291. x = 1;
  1292. ttslow(mp->sp_on_str,wr);
  1293.     }
  1294. } else {
  1295.     /* s = dialspoff ? dialspoff : mp->sp_off_str; */
  1296.     if (dialspoff) {
  1297. if (*dialspoff) {
  1298.     x = 1;
  1299.     ttslow(dialspoff,wr);
  1300. }
  1301.     } else {
  1302. x = 1;
  1303. ttslow(mp->sp_off_str,wr);
  1304.     }
  1305. }
  1306. if (x) {
  1307.     if (xx_ok) /* Get response */
  1308.       x = (*xx_ok)(5,1);
  1309.     if (x && mdmspk) { /* Good response and speaker on? */
  1310. switch (mdmvol) { /* Yes, send volume command. */
  1311.   case 0:
  1312.   case 1:
  1313.     s = dialvol1 ? dialvol1 : mp->vol1_str; break;
  1314.   case 2:
  1315.     s = dialvol2 ? dialvol2 : mp->vol2_str; break;
  1316.   case 3:
  1317.     s = dialvol3 ? dialvol3 : mp->vol3_str; break;
  1318.   default:
  1319.     s = NULL;
  1320. }
  1321. if (s) if (*s) { /* Send volume command. */
  1322.     ttslow(s, wr);
  1323.     if (xx_ok) /* Get response but ignore it */
  1324.       (*xx_ok)(5,1);
  1325. }
  1326.     }
  1327. }
  1328.     }
  1329. #ifndef CK_ATDT
  1330.     /* Dialing Method */
  1331.     if (dialmth && dialsta != DIA_PART) { /* If dialing method specified... */
  1332. char *s = ""; /* Do it here... */
  1333. if (dialmth == XYDM_T && dialtone) /* Tone */
  1334.   s = dialtone;
  1335. else if (dialmth == XYDM_P && dialpulse) /* Pulse */
  1336.   s = dialpulse;
  1337. if (s) if (*s) {
  1338.     ttslow(s, wr);
  1339.     if (xx_ok) /* Get modem's response */
  1340.       (*xx_ok)(5,1); /* (but ignore it...) */
  1341. }
  1342.     }
  1343. #endif /* CK_ATDT */
  1344.     if (dialidt) { /* Ignore dialtone? */
  1345. char *s = "";
  1346. s = dialx3 ? dialx3 : mp->ignoredt;
  1347. if (s) if (*s) {
  1348.     ttslow(s, wr);
  1349.     if (xx_ok) /* Get modem's response */
  1350.       (*xx_ok)(5,1); /* (but ignore it...) */
  1351. }
  1352.     }
  1353.     {
  1354. char *s = ""; /* Last-minute init string? */
  1355. s = dialini2 ? dialini2 : mp->ini2;
  1356. if (s) if (*s) {
  1357.     ttslow(s, wr);
  1358.     if (xx_ok) /* Get modem's response */
  1359.       (*xx_ok)(5,1); /* (but ignore it...) */
  1360. }
  1361.     }
  1362.     if (func_code == 1) { /* ANSWER (not DIAL) */
  1363. char *s;
  1364. s = dialaaon ? dialaaon : mp->aa_on_str;
  1365. if (!s) s = "";
  1366. if (*s) {
  1367.     ttslow(s, (dialpace > -1) ? wr : mp->dial_rate);
  1368.     if (xx_ok) /* Get modem's response */
  1369.       (*xx_ok)(5,1); /* (but ignore it...) */
  1370. } else {
  1371.     printf(
  1372. "WARNING - I don't know how to enable autoanswer for this modem.n"
  1373.    );
  1374. } /* And skip all the phone-number & dialing stuff... */
  1375. alarm(waitct); /* This much time allowed. */
  1376. debug(F101,"ckdial ANSWER waitct","",waitct);
  1377.     } else { /* DIAL (not ANSWER) */
  1378. if (dialsta != DIA_PART) { /* Last dial was not partial */
  1379.     char *s = "";
  1380. #ifdef COMMENT
  1381.     s = dialaaoff ? dialaaoff : mp->aa_off_str;
  1382. #endif /* COMMENT */
  1383.     if (s) if (*s) {
  1384. ttslow(s, (dialpace > -1) ? wr : mp->dial_rate);
  1385. if (xx_ok) /* Get modem's response */
  1386.   (*xx_ok)(5,1); /* (but ignore it...) */
  1387.     }
  1388.     /* Put modem into dialing mode, if the modem requires it. */
  1389.     if (mp->dmode_str && *(mp->dmode_str)) {
  1390. ttslow(mp->dmode_str, (dialpace > -1) ? wr : mp->dial_rate);
  1391. savalrm = signal(SIGALRM,dialtime);
  1392. alarm(10);
  1393. /* Wait for prompt, if any expected */
  1394. if (mp->dmode_prompt && *(mp->dmode_prompt)) {
  1395.     waitfor(mp->dmode_prompt);
  1396.     msleep(300);
  1397. }
  1398. alarm(0); /* Turn off alarm on dialing prompts */
  1399. signal(SIGALRM,savalrm); /* Restore alarm */
  1400.     }
  1401. }
  1402. if (mdmcapas & CKD_AT && /* AT command set */
  1403.     dialsta != DIA_PART) {
  1404.     if (mdmwait > 255) /* If larger than maximum, */
  1405.       mdmwait = 255; /* make it maximum. */
  1406.     if (dialesc > 0 && /* Modem escape character is set */
  1407. dialmhu > 0) { /* Hangup method is modem command */
  1408. int x = dialesc;
  1409. if (dialesc < 0 || dialesc > 127)
  1410.   x = 128;
  1411. sprintf(lbuf,
  1412. "ATS2=%dS7=%d15",
  1413. dialesc ? x : mp->esc_char, mdmwait);
  1414.     } else
  1415.       sprintf(lbuf,"ATS7=%d%c",mdmwait,13);
  1416.     ttslow(lbuf,wr); /* Set it. */
  1417.     mdmstat = getok(5,1); /* Get response from modem */
  1418.     /* If it gets an error, go ahead anyway */
  1419.     debug(F101,"ckdial S7 mdmstat","",mdmstat);
  1420. }
  1421. ttflui(); /* Clear out stuff from modem setup */
  1422. inited = 1; /* Remember modem is initialized */
  1423.       REDIAL:
  1424. sprintf(lbuf, dcmd, xnum);
  1425. debug(F110,"dialing",lbuf,0);
  1426. /* Send the dialing string */
  1427. ttslow(lbuf,dialpace > -1 ? wr : mp->dial_rate);
  1428. fail_code = F_MODEM; /* New default failure code changes */
  1429. dial_what = DW_DIAL; /* and our state, too. */
  1430. if (dialdpy) { /* If showing progress */
  1431.     p = ck_time(); /* get current time; */
  1432.     if (*p) printf(" Dialing: %s...n",p);
  1433. #ifdef VMS
  1434.     printf(" n");
  1435.     fflush(stdout);
  1436. #endif /* VMS */
  1437. }
  1438. alarm(waitct); /* This much time allowed. */
  1439. debug(F101,"ckdial waitct","",waitct);
  1440. #ifndef MINIDIAL
  1441. #ifdef OLDMODEMS
  1442. switch (mymdmtyp) {
  1443.   case n_RACAL: /* Acknowledge dialing string */
  1444.     sleep(3);
  1445.     ttflui();
  1446.     ttoc('15');
  1447.     break;
  1448.   case n_VENTEL:
  1449.     waitfor("1212"); /* Ignore the first two strings */
  1450.     break;
  1451.   default:
  1452.     break;
  1453. }
  1454. #endif /* OLDMODEMS */
  1455. #endif /* MINIDIAL */
  1456.     }
  1457. /* Check for connection */
  1458.     mdmstat = 0; /* No status yet */
  1459.     strcpy(lbuf,""); /* Default reason for failure */
  1460.     debug(F101,"dial awaiting response, mymdmtyp","",mymdmtyp);
  1461. #ifndef NOSPL
  1462.     modemmsg[0] = NUL;
  1463. #endif /* NOSPL */
  1464.     while (mdmstat == 0) { /* Till we get a result or time out */
  1465. if ((mdmcapas & CKD_AT) && nonverbal) { /* AT command set */
  1466.     gethrn(); /* In digit result mode */
  1467.     if (partial && dialsta == DIA_ERR) {
  1468. /*
  1469.    If we get an error here, the phone is still
  1470.    off hook so we have to hang it up.
  1471. */
  1472. dialhup();
  1473. dialsta = DIA_ERR; /* (because dialhup() changes it) */
  1474.     }
  1475.     continue;
  1476. } else if (mymdmtyp == n_UNKNOWN) { /* Unknown modem type */
  1477.     int x, y = waitct;
  1478.     mdmstat = D_FAILED; /* Assume failure. */
  1479.     while (y-- > -1) {
  1480. x = ttchk();
  1481. if (x > 0) {
  1482.     if (x > LBUFL) x = LBUFL;
  1483.     x = ttxin(x,(CHAR *)lbuf);
  1484.     if ((x > 0) && dialdpy) conol(lbuf);
  1485. } else if (network && x < 0) { /* Connection dropped */
  1486.     inited = 0;
  1487. #ifdef NTSIG
  1488.     ckThreadEnd(threadinfo);
  1489. #endif /* NTSIG */
  1490.     dialsta = DIA_IO; /* Call it an I/O error */
  1491. #ifdef DYNAMIC
  1492.     if (rbuf) free(rbuf); rbuf = NULL;
  1493.     if (fbuf) free(fbuf); fbuf = NULL;
  1494. #endif /* DYNAMIC */
  1495.     SIGRETURN;
  1496. }
  1497. x = ttgmdm(); /* Try to read modem signals */
  1498. if (x < 0) break; /* Can't, fail. */
  1499. if (x & BM_DCD) { /* Got signals OK.  Carrier present? */
  1500.     mdmstat = CONNECTED; /* Yes, done. */
  1501.     break;
  1502. } /* No, keep waiting. */
  1503. sleep(1);
  1504.     }
  1505.     continue;
  1506. }
  1507. for (n = -1; n < LBUFL-1; ) { /* Accumulate modem response */
  1508.     int xx;
  1509.     c2 = (char) (xx = ddinc(0)); /* Read a character, blocking */
  1510.     if (xx < 1) /* Ignore NULs and errors */
  1511.       continue; /* (Timeout will handle errors) */
  1512.     else /* Real character, keep it */
  1513.       lbuf[++n] = (char) (c2 & 0177);
  1514.     dialoc(lbuf[n]); /* Maybe echo it  */
  1515.     if (mdmcapas & CKD_V25) { /* V.25bis dialing... */
  1516. /*
  1517.   This assumes that V.25bis indications are all at least 3 characters long
  1518.   and are terminated by either CRLF or LFCR.
  1519. */
  1520. if (mymdmtyp == n_CCITT) {
  1521.     if (n < 3) continue;
  1522.     if ((lbuf[n] == CR) && (lbuf[n-1] == LF)) break;
  1523.     if ((lbuf[n] == LF) && (lbuf[n-1] == CR)) break;
  1524. }
  1525. #ifndef MINIDIAL
  1526. else if (mymdmtyp == n_DIGITEL) {
  1527.     if (((lbuf[n] == CR) && (lbuf[n-1] == LF)) ||
  1528. ((lbuf[n] == LF) && (lbuf[n-1] == CR)))
  1529.       break;
  1530.     else
  1531.       continue;
  1532. }
  1533. #endif /* MINIDIAL */
  1534.     } else { /* All others, break on CR or LF */
  1535. if ( lbuf[n] == CR || lbuf[n] == LF ) break;
  1536.     }
  1537. }
  1538. lbuf[++n] = ''; /* Terminate response from modem */
  1539. debug(F111,"ckdial modem response",lbuf,n);
  1540. #ifndef NOSPL
  1541. ckstrncpy(modemmsg,lbuf,LBUFL); /* Call result message */
  1542. lbuf[79] = NUL;
  1543. {
  1544.     int x; /* Strip junk from end */
  1545.     x = (int)strlen(modemmsg) - 1;
  1546.     while (x > -1) {
  1547. if (modemmsg[x] < (char) 33)
  1548.   modemmsg[x] = NUL;
  1549. else
  1550.   break;
  1551. x--;
  1552.     }
  1553. }
  1554. #endif /* NOSPL */
  1555. if (mdmcapas & CKD_AT) { /* Hayes AT command set */
  1556.     gethrw(); /* in word result mode */
  1557.     if (partial && dialsta == DIA_ERR) {
  1558. dialhup();
  1559. dialsta = DIA_ERR; /* (because dialhup() changes it) */
  1560.     }
  1561.     continue;
  1562. } else if (mdmcapas & CKD_V25) { /* CCITT command set */
  1563.     if (didweget(lbuf,"VAL")) { /* Dial command confirmation */
  1564. #ifndef MINIDIAL
  1565. if (mymdmtyp == n_CCITT)
  1566. #endif /* MINIDIAL */
  1567.   continue; /* Go back and read more */
  1568. #ifndef MINIDIAL
  1569. /* Digitel doesn't give an explicit connect confirmation message */
  1570. else {
  1571.     int n;
  1572.     for (n = -1; n < LBUFL-1; ) {
  1573. lbuf[++n] = c2 = (char) (ddinc(0) & 0177);
  1574. dialoc(lbuf[n]);
  1575. if (((lbuf[n] == CR) && (lbuf[n-1] == LF)) ||
  1576.     ((lbuf[n] == LF) && (lbuf[n-1] == CR)))
  1577.   break;
  1578.     }
  1579.     mdmstat = CONNECTED; /* Assume we're connected */
  1580.     if (dialdpy && carrier != CAR_OFF) {
  1581. sleep(1);  /* Wait a second */
  1582. n = ttgmdm(); /* Try to read modem signals */
  1583. if ((n > -1) && ((n & BM_DCD) == 0))
  1584.   printf("WARNING - no carriern");
  1585.     }
  1586. }
  1587. #endif /* MINIDIAL */
  1588. /* Standard V.25bis stuff */
  1589.     } else if (didweget(lbuf,"CNX")) { /* Connected */
  1590. mdmstat = CONNECTED;
  1591.     } else if (didweget(lbuf, "INV")) {
  1592. mdmstat = D_FAILED; /* Command error */
  1593. dialsta = DIA_ERR;
  1594. strcpy(lbuf,"INV");
  1595.     } else if (didweget(lbuf,"CFI")) { /* Call Failure */
  1596. if (didweget(lbuf,"AB")) { /* Interpret reason code */
  1597.     strcpy(lbuf,"AB: Timed out");
  1598.     dialsta = DIA_TIMO;
  1599. } else if (didweget(lbuf,"CB")) {
  1600.     strcpy(lbuf,"CB: Local DCE Busy");
  1601.     dialsta = DIA_NRDY;
  1602. } else if (didweget(lbuf,"ET")) {
  1603.     strcpy(lbuf,"ET: Busy");
  1604.     dialsta = DIA_BUSY;
  1605. } else if (didweget(lbuf, "NS")) {
  1606.     strcpy(lbuf,"NS: Number not stored");
  1607.     dialsta = DIA_ERR;
  1608. } else if (didweget(lbuf,"NT")) {
  1609.     strcpy(lbuf,"NT: No answer");
  1610.     dialsta = DIA_NOAN;
  1611. } else if (didweget(lbuf,"RT")) {
  1612.     strcpy(lbuf,"RT: Ring tone");
  1613.     dialsta = DIA_RING;
  1614. } else if (didweget(lbuf,"PV")) {
  1615.     strcpy(lbuf,"PV: Parameter value error");
  1616.     dialsta = DIA_ERR;
  1617. } else if (didweget(lbuf,"PS")) {
  1618.     strcpy(lbuf,"PS: Parameter syntax error");
  1619.     dialsta = DIA_ERR;
  1620. } else if (didweget(lbuf,"MS")) {
  1621.     strcpy(lbuf,"MS: Message syntax error");
  1622.     dialsta = DIA_ERR;
  1623. } else if (didweget(lbuf,"CU")) {
  1624.     strcpy(lbuf,"CU: Command unknown");
  1625.     dialsta = DIA_ERR;
  1626. } else if (didweget(lbuf,"FC")) {
  1627.     strcpy(lbuf,"FC: Forbidden call");
  1628.     dialsta = DIA_NOAC;
  1629. }
  1630. mdmstat = D_FAILED;
  1631.     } else if (didweget(lbuf,"INC")) { /* Incoming Call */
  1632. strcpy(lbuf,"INC: Incoming call");
  1633. dialsta = DIA_RING;
  1634. mdmstat = D_FAILED;
  1635.     } else if (didweget(lbuf,"DLC")) { /* Delayed Call */
  1636. strcpy(lbuf,"DLC: Delayed call");
  1637. dialsta = DIA_NOAN;
  1638. mdmstat = D_FAILED;
  1639.     } else /* Response was probably an echo. */
  1640. #ifndef MINIDIAL
  1641.       if (mymdmtyp == n_CCITT)
  1642. #endif /* MINIDIAL */
  1643. continue;
  1644. #ifndef MINIDIAL
  1645.       else /* Digitel: If no error, connect. */
  1646. mdmstat = CONNECTED;
  1647. #endif /* MINIDIAL */
  1648.     break;
  1649. } else if (n) { /* Non-Hayes-compatibles... */
  1650.     switch (mymdmtyp) {
  1651. #ifndef MINIDIAL
  1652.       case n_ATTMODEM:
  1653. /* Careful - "Connected" / "Not Connected" */
  1654. if (didweget(lbuf,"Busy")) {
  1655.     mdmstat = D_FAILED;
  1656.     dialsta = DIA_BUSY;
  1657. } else if (didweget(lbuf,"Not connected") ||
  1658.    didweget(lbuf,"Not Connected")) {
  1659.     mdmstat = D_FAILED;
  1660.     dialsta = DIA_NOCA;
  1661. } else if (didweget(lbuf,"No dial tone") ||
  1662.    didweget(lbuf,"No Dial Tone")) {
  1663.     mdmstat = D_FAILED;
  1664.     dialsta = DIA_NODT;
  1665. } else if (didweget(lbuf,"No answer") ||
  1666.    didweget(lbuf,"No Answer")) {
  1667.     mdmstat = D_FAILED;
  1668.     dialsta = DIA_NOAN;
  1669. } else if (didweget(lbuf,"Answered") ||
  1670.    didweget(lbuf,"Connected")) {
  1671.     mdmstat = CONNECTED;
  1672.     dialsta = DIA_OK;
  1673. }
  1674. break;
  1675.       case n_ATTISN:
  1676. if (didweget(lbuf,"ANSWERED")) {
  1677.     mdmstat = CONNECTED;
  1678.     dialsta = DIA_OK;
  1679. } else if (didweget(lbuf,"BUSY")) {
  1680.     mdmstat = D_FAILED;
  1681.     dialsta = DIA_BUSY;
  1682. } else if (didweget(lbuf,"DISCONNECT")) {
  1683.     mdmstat = D_FAILED;
  1684.     dialsta = DIA_DISC;
  1685. } else if (didweget(lbuf,"NO ANSWER")) {
  1686.     mdmstat = D_FAILED;
  1687.     dialsta = DIA_NOAN;
  1688. } else if (didweget(lbuf,"WRONG ADDRESS")) {
  1689.     mdmstat = D_FAILED;
  1690.     dialsta = DIA_NOAC;
  1691. }
  1692. break;
  1693.       case n_ATTDTDM:
  1694. if (didweget(lbuf,"ANSWERED")) {
  1695.     mdmstat = CONNECTED;
  1696. } else if (didweget(lbuf,"BUSY")) {
  1697.     mdmstat = D_FAILED;
  1698.     dialsta = DIA_BUSY;
  1699. } else if (didweget(lbuf,"CHECK OPTIONS")) {
  1700.     mdmstat = D_FAILED;
  1701.     dialsta = DIA_ERR;
  1702. } else if (didweget(lbuf,"DISCONNECTED")) {
  1703.     mdmstat = D_FAILED;
  1704.     dialsta = DIA_DISC;
  1705. } else if (didweget(lbuf,"DENIED")) {
  1706.     mdmstat = D_FAILED;
  1707.     dialsta = DIA_NOAC;
  1708. }
  1709. #ifdef DEBUG
  1710. #ifdef ATT6300
  1711. /* Horrible hack lost in history. */
  1712. else if (deblog && didweget(lbuf,"~~"))
  1713.   mdmstat = CONNECTED;
  1714. #endif /* ATT6300 */
  1715. #endif /* DEBUG */
  1716. break;
  1717. #ifdef OLDMODEMS
  1718.       case n_CERMETEK:
  1719. if (didweget(lbuf,"16A")) {
  1720.     mdmstat = CONNECTED;
  1721.     ttslow("16U 115",200); /* Make transparent*/
  1722. }
  1723. break;
  1724.       case n_DF03:
  1725. /* Because response lacks CR or NL . . . */
  1726. c = (char) (ddinc(0) & 0177);
  1727. dialoc(c);
  1728. debug(F000,"dial df03 got","",c);
  1729. if ( c == 'A' ) mdmstat = CONNECTED;
  1730. if ( c == 'B' ) mdmstat = D_FAILED;
  1731. break;
  1732.       case n_DF100:      /* DF100 has short response codes */
  1733. if (strcmp(lbuf,"A") == 0) {
  1734.     mdmstat = CONNECTED; /* Attached */
  1735.     dialsta = DIA_OK;
  1736. } else if (strcmp(lbuf,"N") == 0) {
  1737.     mdmstat = D_FAILED;
  1738.     dialsta = DIA_NOAN; /* No answer or no dialtone */
  1739. } else if (strcmp(lbuf,"E") == 0 || /* Error */
  1740.    strcmp(lbuf,"R") == 0) { /* "Ready" (?) */
  1741.     mdmstat = D_FAILED;
  1742.     dialsta = DIA_ERR; /* Command error */
  1743. }
  1744. /* otherwise fall thru... */
  1745.       case n_DF200:
  1746. if (didweget(lbuf,"Attached")) {
  1747.     mdmstat = CONNECTED;
  1748.     dialsta = DIA_OK;
  1749.     /*
  1750.      * The DF100 will respond with "Attached" even if DTR
  1751.      * and/or carrier are not present. Another reason to
  1752.      * (also) wait for carrier?
  1753.      */
  1754. } else if (didweget(lbuf,"Busy")) {
  1755.     mdmstat = D_FAILED;
  1756.     dialsta = DIA_BUSY;
  1757. } else if (didweget(lbuf,"Disconnected")) {
  1758.     mdmstat = D_FAILED;
  1759.     dialsta = DIA_DISC;
  1760. } else if (didweget(lbuf,"Error")) {
  1761.     mdmstat = D_FAILED;
  1762.     dialsta = DIA_ERR;
  1763. } else if (didweget(lbuf,"No answer")) {
  1764.     mdmstat = D_FAILED;
  1765.     dialsta = DIA_NOAN;
  1766. } else if (didweget(lbuf,"No dial tone")) {
  1767.     mdmstat = D_FAILED;
  1768.     dialsta = DIA_NODT;
  1769. } else if (didweget(lbuf,"Speed:)")) {
  1770.     mdmstat = D_FAILED;
  1771.     dialsta = DIA_ERR;
  1772. }
  1773. /*
  1774.  * It appears that the "Speed:..." response comes after an
  1775.  * "Attached" response, so this is never seen.  HOWEVER,
  1776.  * it would be very handy to detect this and temporarily
  1777.  * reset the speed, since it's a nuisance otherwise.
  1778.  * If we wait for some more input from the modem, how do
  1779.  * we know if it's from the remote host or the modem?
  1780.  * Carrier reportedly doesn't get set until after the
  1781.  * "Speed:..." response (if any) is sent.  Another reason
  1782.  * to (also) wait for carrier.
  1783.  */
  1784. break;
  1785.       case n_GDC:
  1786. if (didweget(lbuf,"ON LINE"))
  1787.   mdmstat = CONNECTED;
  1788. else if (didweget(lbuf,"NO CONNECT"))
  1789.   mdmstat = D_FAILED;
  1790. break;
  1791.       case n_PENRIL:
  1792. if (didweget(lbuf,"OK")) {
  1793.     mdmstat = CONNECTED;
  1794. } else if (didweget(lbuf,"BUSY")) {
  1795.     mdmstat = D_FAILED;
  1796.     dialsta = DIA_BUSY;
  1797.     } else if (didweget(lbuf,"NO RING")) {
  1798. mdmstat = D_FAILED;
  1799. dialsta = DIA_NOCA;
  1800.     }
  1801. break;
  1802.       case n_RACAL:
  1803. if (didweget(lbuf,"ON LINE"))
  1804.   mdmstat = CONNECTED;
  1805. else if (didweget(lbuf,"FAILED CALL"))
  1806.   mdmstat = D_FAILED;
  1807. break;
  1808. #endif /* OLDMODEMS */
  1809.       case n_ROLM:
  1810. if (didweget(lbuf,"CALLING"))
  1811.   mdmstat = 0;
  1812. else if (didweget(lbuf,"COMPLETE"))
  1813.   mdmstat = CONNECTED;
  1814. else if (didweget(lbuf,"FAILED") ||
  1815.  didweget(lbuf,"ABANDONDED")) {
  1816.     mdmstat = D_FAILED;
  1817.     dialsta = DIA_NOCA;
  1818. } else if (didweget(lbuf,"NOT AVAILABLE") ||
  1819.    didweget(lbuf,"LACKS PERMISSION") ||
  1820.    didweget(lbuf,"NOT A DATALINE") ||
  1821.    didweget(lbuf,"INVALID DATA LINE NUMBER") ||
  1822.    didweget(lbuf,"INVALID GROUP NAME")) {
  1823.     mdmstat = D_FAILED;
  1824.     dialsta = DIA_NOAC;
  1825. } else if (didweget(lbuf,"BUSY")) {
  1826.     mdmstat = D_FAILED;
  1827.     dialsta = DIA_BUSY;
  1828. } else if (didweget(lbuf,"DOES NOT ANSWER")) {
  1829.     mdmstat = D_FAILED;
  1830.     dialsta = DIA_NOAN;
  1831. }
  1832. break;
  1833. #ifdef OLDMODEMS
  1834.       case n_VENTEL:
  1835. if (didweget(lbuf,"ONLINE!") ||
  1836.     didweget(lbuf,"Online!")) {
  1837.     mdmstat = CONNECTED;
  1838. } else if (didweget(lbuf,"BUSY") ||
  1839.    didweget(lbuf,"Busy")) {
  1840.     mdmstat = D_FAILED;
  1841.     dialsta = DIA_BUSY;
  1842. } else if (didweget(lbuf,"DEAD PHONE")) {
  1843.     mdmstat = D_FAILED;
  1844.     dialsta = DIA_DISC;
  1845. }
  1846. break;
  1847.       case n_CONCORD:
  1848. if (didweget(lbuf,"INITIATING"))
  1849.   mdmstat = CONNECTED;
  1850. else if (didweget(lbuf,"BUSY")) {
  1851.     mdmstat = D_FAILED;
  1852.     dialsta = DIA_BUSY;
  1853. } else if (didweget(lbuf,"CALL FAILED")) {
  1854.     mdmstat = D_FAILED;
  1855.     dialsta = DIA_NOCA;
  1856. }
  1857. break;
  1858. #endif /* OLDMODEMS */
  1859.       case n_MICROCOM:
  1860. /* "RINGBACK" means phone line ringing, continue */
  1861. if (didweget(lbuf,"NO CONNECT")) {
  1862.     mdmstat = D_FAILED;
  1863.     dialsta = DIA_NOCA;
  1864. } else if (didweget(lbuf,"BUSY")) {
  1865.     mdmstat = D_FAILED;
  1866.     dialsta = DIA_BUSY;
  1867. } else if (didweget(lbuf,"NO DIALTONE")) {
  1868.     mdmstat = D_FAILED;
  1869.     dialsta = DIA_NODT;
  1870. } else if (didweget(lbuf,"COMMAND ERROR")) {
  1871.     mdmstat = D_FAILED;
  1872.     dialsta = DIA_ERR;
  1873. } else if (didweget(lbuf,"IN USE")) {
  1874.     mdmstat = D_FAILED;
  1875.     dialsta = DIA_NOAC;
  1876. } else if (didweget(lbuf,"CONNECT")) {
  1877.     mdmstat = CONNECTED;
  1878.     /* trailing speed ignored */
  1879. }
  1880. break;
  1881. #endif /* MINIDIAL */
  1882.       default:
  1883. printf(
  1884.     "PROGRAM ERROR - No response handler for modem type %dn",
  1885.        mymdmtyp);
  1886. mdmstat = D_FAILED;
  1887. dialsta = DIA_ERR;
  1888.     }
  1889. }
  1890.     } /* while (mdmstat == 0) */
  1891.     debug(F101,"ckdial alarm off","",x);
  1892.     alarm(0);
  1893.     if (mdmstat == D_FAILED) { /* Failure detected by modem  */
  1894.         dialfail(F_MODEM);
  1895. #ifdef NTSIG
  1896. ckThreadEnd(threadinfo);
  1897. #endif /* NTSIG */
  1898.         SIGRETURN;
  1899.     } else if (mdmstat == D_PARTIAL ) { /* Partial dial command OK */
  1900. msleep(500);
  1901. debug(F100,"dial partial","",0);
  1902.     } else { /* Call was completed */
  1903. int x;
  1904. msleep(700); /* In case modem signals blink  */
  1905. debug(F100,"dial succeeded","",0);
  1906. if (
  1907. #ifndef MINIDIAL
  1908.     mymdmtyp != n_ROLM /* Rolm has weird modem signaling */
  1909. #else
  1910.     1
  1911. #endif /* MINIDIAL */
  1912.     ) {
  1913.     alarm(3); /* In case ttpkt() gets stuck... */
  1914.     ttpkt(speed,FLO_DIAX,parity); /* Cancel dialing state ioctl */
  1915. }
  1916. /*
  1917.   In case CD went off in the interval between call completion and return
  1918.   from ttpkt()...
  1919. */
  1920. if (carrier == CAR_AUT || carrier == CAR_ON)
  1921.   if ((x = ttgmdm()) >= 0)
  1922.     if (!(x & BM_DCD))
  1923.       printf("WARNING: Carrier seems to have dropped...n");
  1924.     }
  1925.     dreset(); /* Reset alarms and signals. */
  1926.     if (!quiet && !backgrd) {
  1927. if (dialdpy && (p = ck_time())) { /* If DIAL DISPLAY ON, */
  1928.     printf(" %sall complete: %s.n", /* include timestamp.  */
  1929.    (mdmstat == D_PARTIAL) ?
  1930.    "Partial c" :
  1931.    "C",
  1932.    p );
  1933. } else if (modemmsg[0]) {
  1934.     printf (" %sall complete: "%s".n",
  1935.     (mdmstat == D_PARTIAL) ? "Partial c" : "C",
  1936.     (char *)modemmsg
  1937.     );
  1938. } else {
  1939.     printf (" %sall complete.n",
  1940.     (mdmstat == D_PARTIAL) ?
  1941.     "Partial c" :
  1942.     "C"
  1943.     );
  1944. }
  1945.     }
  1946. #ifdef CKLOGDIAL
  1947.     dologdial(telnbr);
  1948. #endif /* CKLOGDIAL */
  1949. #ifdef DYNAMIC
  1950.     if (rbuf) free(rbuf); rbuf = NULL;
  1951.     if (fbuf) free(fbuf); fbuf = NULL;
  1952. #endif /* DYNAMIC */
  1953.     dialsta = (mdmstat == D_PARTIAL) ? DIA_PART : DIA_OK;
  1954. #ifdef NTSIG
  1955.     ckThreadEnd(threadinfo);
  1956. #endif /* NTSIG */
  1957.     SIGRETURN;
  1958. }
  1959. static SIGTYP
  1960. #ifdef CK_ANSIC
  1961. faildial(void * threadinfo)
  1962. #else /* Not CK_ANSIC */
  1963. faildial(threadinfo) VOID * threadinfo;
  1964. #endif /* CK_ANSIC */
  1965. /* faildial */ {
  1966.     debug(F100,"longjmp returns to dial routine","",0);
  1967.     dialfail(fail_code);
  1968.     SIGRETURN;
  1969. }
  1970. /*
  1971.   nbr = number to dial (string)
  1972.   x1  = Retry counter
  1973.   x2  = Number counter
  1974.   fc  = Function code:
  1975.         0 == DIAL
  1976.         1 == ANSWER
  1977.         2 == INIT/CONFIG
  1978.         3 == PARTIAL DIAL
  1979. */
  1980. int
  1981. #ifdef OLD_DIAL
  1982. ckdial(nbr) char *nbr;
  1983. #else
  1984. ckdial(nbr, x1, x2, fc, redial) char *nbr; int x1, x2, fc, redial;
  1985. #endif /* OLD_DIAL */
  1986. /* ckdial */ {
  1987. #define ERMSGL 50
  1988.     char errmsg[ERMSGL], *erp; /* For error messages */
  1989.     int n = F_TIME;
  1990.     char *s;
  1991.     long spdmax;
  1992. #ifdef OS2
  1993.     extern int term_io;
  1994.     int term_io_sav = term_io;
  1995. #endif /* OS2 */
  1996.     char *mmsg = "Sorry, DIAL memory buffer can't be allocatedn";
  1997.     partial = 0;
  1998.     if (fc == 3) { /* Partial dial requested */
  1999. partial = 1; /* Set flag */
  2000. fc = 0; /* Treat like regular dialing */
  2001.     }
  2002.     func_code = fc; /* Make global to this module */
  2003.     telnbr = nbr;
  2004.     xredial = redial;
  2005.     debug(F111,"ckdial entry partial",ckitoa(fc),partial);
  2006.     debug(F111,"ckdial entry number",nbr,redial);
  2007. #ifdef CK_TAPI_X
  2008.     if (tttapi && tapipass) {
  2009. if (modemp[n_TAPI] = cktapiGetModemInf()) {
  2010.     mymdmtyp = n_TAPI;
  2011. } else {
  2012.     mymdmtyp = mdmtyp;
  2013.     modemp[n_TAPI] = &GENERIC;
  2014. }
  2015.     } else
  2016. #endif /* CK_TAPI */
  2017.     mymdmtyp = mdmtyp;
  2018.     if (mymdmtyp < 0) { /* Whoa, network dialing... */
  2019. if (mdmsav > -1)
  2020.   mymdmtyp = mdmsav;
  2021.     }
  2022.     if (mymdmtyp < 0) {
  2023. printf("Invalid modem type %d - internal error.n",mymdmtyp);
  2024. dialsta = DIA_NOMO;
  2025. return(0);
  2026.     }
  2027.     dial_what = DW_NOTHING; /* Doing nothing at first. */
  2028.     nonverbal = 0;
  2029. /* These are ONLY for the purpose of interpreting numeric result codes. */
  2030.     is_motorola =
  2031. #ifdef MINIDIAL
  2032.       0
  2033. #else
  2034.       mymdmtyp == n_SUPRA || mymdmtyp == n_SUPRASON;
  2035. #endif /* MINIDIAL */
  2036. ;
  2037.     is_motorola =
  2038. #ifdef MINIDIAL
  2039.       0
  2040. #else
  2041.       mymdmtyp == n_MOTOROLA || mymdmtyp == n_MONTANA;
  2042. #endif /* MINIDIAL */
  2043. ;
  2044.     is_rockwell =
  2045. #ifdef MINIDIAL
  2046.       0
  2047. #else
  2048.       mymdmtyp == n_RWV32 || mymdmtyp == n_RWV32B ||
  2049. mymdmtyp == n_RWV34 || mymdmtyp == n_RWV90 ||
  2050.   mymdmtyp == n_BOCA || mymdmtyp == n_TELEPATH ||
  2051.     mymdmtyp == n_CARDINAL || mymdmtyp == n_BESTDATA
  2052. #endif /* MINIDIAL */
  2053. ;
  2054.     is_hayeshispd =
  2055. #ifdef MINIDIAL
  2056.       0
  2057. #else
  2058.       mymdmtyp == n_H_ULTRA || mymdmtyp == n_H_ACCURA || n_PPI
  2059. #endif /* MINIDIAL */
  2060. ;
  2061.     is_supra =
  2062. #ifdef MINIDIAL
  2063.       0
  2064. #else
  2065.       mymdmtyp == n_SUPRA || mymdmtyp == n_SUPRAX || n_SUPRASON
  2066. #endif /* MINIDIAL */
  2067. ;
  2068.     mp = modemp[mymdmtyp]; /* Set pointer to modem info */
  2069.     if (!mp) {
  2070. printf("Sorry, handler for this modem type not yet filled in.n");
  2071. dialsta = DIA_NOMO;
  2072. return 0;
  2073.     }
  2074.     debug(F110,"dial number",telnbr,0);
  2075. #ifdef COMMENT
  2076.     debug(F110,"dial prefix",(dialnpr ? dialnpr : ""), 0);
  2077. #endif /* COMMENT */
  2078. #ifdef DYNAMIC
  2079.     *lbuf = NUL;
  2080.     debug(F101,"DIAL lbuf malloc ok","",LBUFL+1);
  2081.     if (!rbuf) {    /* This one might already have been allocated by getok() */
  2082. if (!(rbuf = malloc(RBUFL+1))) {    /* Allocate input line buffer */
  2083.     printf("%s", mmsg);
  2084.     dialsta = DIA_IE;
  2085.     return 0;
  2086. } else
  2087.   debug(F101,"DIAL rbuf malloc ok","",RBUFL+1);
  2088.     }
  2089.     if (!(fbuf = malloc(FULLNUML+1))) {    /* Allocate input line buffer */
  2090. printf("%s", mmsg);
  2091. dialsta = DIA_IE;
  2092. if (rbuf) free(rbuf); rbuf = NULL;
  2093. return 0;
  2094.     }
  2095.     debug(F101,"DIAL fbuf malloc ok","",FULLNUML+1);
  2096. #endif /* DYNAMIC */
  2097.     /* NOTE: mdmtyp, not mymdmtyp */
  2098.     if (ttopen(ttname,&local,mdmtyp,0) < 0) { /* Open, no carrier wait */
  2099. erp = errmsg;
  2100. if ((int)strlen(ttname) < (ERMSGL - 18))
  2101.   sprintf(erp,"Sorry, can't open %s",ttname);
  2102. else
  2103.   sprintf(erp,"Sorry, can't open device");
  2104. perror(errmsg);
  2105. dialsta = DIA_OPEN;
  2106. #ifdef DYNAMIC
  2107. if (rbuf) free(rbuf); rbuf = NULL;
  2108. if (fbuf) free(fbuf); fbuf = NULL;
  2109. #endif /* DYNAMIC */
  2110. return 0;
  2111.     }
  2112. #ifdef CK_TAPI
  2113.     if (!tttapi) {
  2114. #endif /* CK_TAPI */
  2115. /* Condition console terminal and communication line */
  2116.     /* Place line into "clocal" dialing state, */
  2117.     /* important mainly for System V UNIX.     */
  2118.     if (ttpkt(speed,FLO_DIAL,parity) < 0) {
  2119. ttclos(0); /* If ttpkt fails do all this... */
  2120. if (ttopen(ttname,&local,mymdmtyp,0) < 0) {
  2121.     erp = errmsg;
  2122.     if ((int)strlen(ttname) < (ERMSGL - 18))
  2123.       sprintf(erp,"Sorry, can't reopen %s",ttname);
  2124.     else
  2125.       sprintf(erp,"Sorry, can't reopen device");
  2126.     perror(errmsg);
  2127.     dialsta = DIA_OPEN;
  2128. #ifdef DYNAMIC
  2129.     if (rbuf) free(rbuf); rbuf = NULL;
  2130.     if (fbuf) free(fbuf); fbuf = NULL;
  2131. #endif /* DYNAMIC */
  2132.     return 0;
  2133. } /* And try again. */
  2134. if ((ttpkt(speed,FLO_DIAL,parity) < 0)
  2135. #ifdef UNIX
  2136. && (strcmp(ttname,"/dev/null"))
  2137. #else
  2138. #ifdef OSK
  2139. && (strcmp(ttname,"/nil"))
  2140. #endif /* OSK */
  2141. #endif /* UNIX */
  2142. #ifdef CK_TAPI
  2143.      && !tttapi
  2144. #endif /* CK_TAPI */
  2145.     ) {
  2146.     printf("Sorry, Can't condition communication linen");
  2147.     printf("Try 'set line %s' againn",ttname);
  2148.     dialsta = DIA_OPEN;
  2149. #ifdef DYNAMIC
  2150.     if (rbuf) free(rbuf); rbuf = NULL;
  2151.     if (fbuf) free(fbuf); fbuf = NULL;
  2152. #endif /* DYNAMIC */
  2153.     return 0;
  2154. }
  2155.     }
  2156. #ifdef CK_TAPI
  2157.     }
  2158. #endif /* CK_TAPI */
  2159.     /* Modem's escape sequence... */
  2160.     if (dialesc < 0 || dialesc > 127)
  2161.       c = NUL;
  2162.     else
  2163.       c = (char) (dialesc ? dialesc : mp->esc_char);
  2164.     mdmcapas = dialcapas ? dialcapas : mp->capas;
  2165.     xx_ok = mp->ok_fn; /* Pointer to response reader */
  2166.     if (mdmcapas & CKD_AT) { /* Hayes compatible */
  2167. escbuf[0] = c;
  2168. escbuf[1] = c;
  2169. escbuf[2] = c;
  2170. escbuf[3] = NUL;
  2171. /* In case this modem type is user-defined */
  2172. if (!xx_ok) xx_ok = getok;
  2173.     } else { /* Other */
  2174. escbuf[0] = c;
  2175. escbuf[1] = NUL;
  2176. /* In case user-defined */
  2177. if (mdmcapas & CKD_V25) if (!xx_ok) xx_ok = getok;
  2178.     }
  2179.     /* Partial dialing */
  2180.     if (mdmcapas & CKD_AT
  2181. #ifndef MINIDIAL
  2182. || mymdmtyp == n_MICROCOM
  2183. #endif /* MINIDIAL */
  2184. ) {
  2185. int x;
  2186. x = (int) strlen(telnbr);
  2187. if (x > 0) {
  2188.     if (telnbr[x-1] == ';') {
  2189. partial = 1;
  2190. debug(F110,"ckdial sets partial=1:",telnbr,0);
  2191.     } else if (partial) {
  2192. sprintf(fbuf,"%s;", telnbr); /* add one */
  2193. telnbr = fbuf;
  2194.     }
  2195. }
  2196.     }
  2197.     msleep(500);
  2198.     /* Interdigit waits for tone dial */
  2199.     if (fc == 1) { /* ANSWER */
  2200. waitct = (dialatmo > -1) ? dialatmo : 0;
  2201.     } else { /* DIAL */
  2202. if (dialtmo < 1) { /* Automatic computation. */
  2203. #ifdef CK_TAPI
  2204.     if (tttapi && !tapipass) {
  2205. waitct = 1 * (int)strlen(telnbr) ; /* Worst case dial time */
  2206. waitct += 60; /* dialtone + completion wait times */
  2207. for (s = telnbr; *s; s++) { /* add in pause characters time */
  2208.     if (*s == ',') {
  2209. waitct += 2; /* unless it was changed in the modem */
  2210.     } else if (*s == 'W' ||
  2211.        *s == 'w' ||
  2212.        *s == '$' ||
  2213.        *s == '@'
  2214.        ) {
  2215. waitct += 8;
  2216.     }
  2217. }
  2218.     } else {
  2219. #endif /* CK_TAPI */
  2220. waitct = 1 * (int)strlen(telnbr) ;
  2221. /* dialtone + completion wait times */
  2222. waitct += mp->dial_time;
  2223. for (s = telnbr; *s; s++) {
  2224.     for (p = mp->pause_chars; *p; p++)
  2225.       if (*s == *p) {
  2226.   waitct += mp->pause_time;
  2227.   break;
  2228.       }
  2229. }
  2230. #ifdef CK_TAPI
  2231.     }
  2232. #endif /* CK_TAPI */
  2233. } else waitct = dialtmo; /* User-specified timeout */
  2234.     }
  2235. /*
  2236.   waitct is our alarm() timer.
  2237.   mdmwait is how long we tell the modem to wait for carrier.
  2238.   We set mdmwait to be 5 seconds less than waitct, to increase the
  2239.   chance that we get a response from the modem before timing out.
  2240. */
  2241.     if (waitct <= 0) { /* 0 or negative means wait forever  */
  2242. waitct = 254;
  2243. mdmwait = 0;
  2244.     } else {
  2245. #ifdef XWAITCT
  2246. /* Addtl wait slop can be defined at compile time */
  2247. waitct += XWAITCT;
  2248. #endif /* XWAITCT */
  2249. if (waitct < 60 + mdmwaitd)
  2250.   waitct = 60 + mdmwaitd;
  2251. mdmwait = waitct - mdmwaitd;
  2252.     }
  2253.     if (fc != 0) { /* ANSWER */
  2254. #ifdef COMMENT
  2255. /*
  2256.   This is wrong.  mdmwait is the value given to S7 in Hayeslike modems.
  2257.   When in autoanswer mode, this is the amount of time the modem waits for
  2258.   carrier once ringing starts.  Whereas waitct is the timeout given to the
  2259.   ANSWER command, which is an entirely different thing.  Since the default
  2260.   ANSWER timeout is 0 (meaning "wait forever"), the following statement sets
  2261.   S7 to 0, which, on some modems (like the USR Sportster) makes it hang up
  2262.   and report NO CARRIER the instant the phone rings.
  2263. */
  2264. mdmwait = waitct;
  2265. #else
  2266. mdmwait = 60; /* Always wait 60 seconds. */
  2267. #endif /* COMMENT */
  2268.     }
  2269.     if (!quiet && !backgrd) { /* Print information messages. */
  2270. #ifdef VMS
  2271. printf(" n");
  2272. fflush(stdout);
  2273. #endif /* VMS */
  2274. if (fc == 1)
  2275.   printf(" Waiting for phone call...n");
  2276. else
  2277.   printf(" %srying: %s...n", x1 > 0 ? "Ret" : "T", telnbr);
  2278. if (x1 == 0 && x2 == 0 && dialsta != DIA_PART) {
  2279.     if (network) {
  2280. printf(" Via modem server: %s, modem: %sn",
  2281.        ttname, gmdmtyp() );
  2282.     } else {
  2283. #ifdef CK_TAPI
  2284. if (tttapi && !tapipass)
  2285.   printf(" Device: %s, modem: %s", ttname, "TAPI" );
  2286. else
  2287. #endif /* CK_TAPI */
  2288. printf(" Device: %s, modem: %s",
  2289.        ttname, gmdmtyp() );
  2290. if (speed > -1L)
  2291.   printf(", speed: %ldn", speed);
  2292. else
  2293.   printf(", speed: (unknown)n");
  2294.     }
  2295.     spdmax = dialmax > 0L ? dialmax : mp->max_speed;
  2296.     if (!network &&  spdmax > 0L && speed > spdmax
  2297. #ifdef CK_TAPI
  2298.  && (!tttapi || tapipass)
  2299. #endif /* CK_TAPI */
  2300. #ifndef NOHINTS
  2301. && hints
  2302. #endif /* NOHINTS */
  2303.  ) {
  2304. #ifndef NOHINTS
  2305. printf("n*************************");
  2306. #endif /* NOHINTS */
  2307. printf(
  2308. "nHINT: interface speed %ld might be too high for this modem type.n",
  2309.        speed
  2310.        );
  2311. printf(
  2312. "If dialing fails, SET SPEED to %ld or less and try again.n",
  2313.        spdmax
  2314.        );
  2315. #ifndef NOHINTS
  2316. printf("(Use SET HINTS OFF to suppress future hints.)n");
  2317. printf("n*************************n");
  2318. #endif /* NOHINTS */
  2319. printf("n");
  2320.     }
  2321.     printf(" %s timeout: ", fc == 0 ? "Dial" : "Answer");
  2322.     if (waitct > 0)
  2323.       printf("%d secondsn",waitct);
  2324.     else
  2325.       printf(" (none)n");
  2326.     printf(
  2327. #ifdef MAC
  2328.        " Type Command-. to cancel.n"
  2329. #else
  2330. #ifdef UNIX
  2331.        " To cancel: type your interrupt character (normally Ctrl-C).n"
  2332. #else
  2333.        " To cancel: type Ctrl-C (hold down Ctrl, press C).n"
  2334. #endif /* UNIX */
  2335. #endif /* MAC */
  2336.    );
  2337. }
  2338.     }
  2339.     debug(F111,"ckdial",ttname,(int) (speed / 10L));
  2340.     debug(F101,"ckdial timeout","",waitct);
  2341. #ifdef OS2
  2342.     term_io = 0;
  2343. #endif /* OS2 */
  2344. /* Set timer and interrupt handlers. */
  2345.     savint = signal( SIGINT, dialint ) ; /* And terminal interrupt handler. */
  2346.     cc_alrm_execute(ckjaddr(sjbuf), 0, dialtime, _dodial, faildial);
  2347.     signal(SIGINT, savint);
  2348. #ifdef OS2
  2349.     if (dialsta == DIA_OK) /* Dialing is completed */
  2350.       DialerSend(OPT_KERMIT_CONNECT, 0);
  2351.     term_io = term_io_sav;
  2352. #endif /* OS2 */
  2353.     if (dialsta == DIA_PART || dialsta == DIA_OK)
  2354.       return(1); /* Dial attempt succeeded */
  2355.     else
  2356.       return(0); /* Dial attempt failed */
  2357. } /* ckdial */
  2358. /*
  2359.   getok() - wait up to n seconds for OK (0) or ERROR (4) response from modem.
  2360.   Use with Hayeslike or CCITT modems for reading the reply to a nondialing
  2361.   command.
  2362.   Second argument says whether to be strict about numeric result codes, i.e.
  2363.   to require they be preceded by CR or else be the first character in the
  2364.   response, e.g. to prevent the ATH0<CR> echo from looking like a valid
  2365.   response.  Strict == 0 is needed for ATI on Telebit, which can return the
  2366.   model number concatenated with the numeric response code, e.g. "9620"
  2367.   ("962" is the model number, "0" is the response code).  getok() Returns:
  2368.    0 if it timed out,
  2369.    1 if it succeeded,
  2370.   -1 on modem command, i/o, or other error.
  2371. */
  2372. static ckjmpbuf okbuf;
  2373. static SIGTYP
  2374. #ifdef CK_ANSIC
  2375. oktimo(int foo) /* Alarm handler for getok(). */
  2376. #else
  2377. oktimo(foo) int foo; /* Alarm handler for getok(). */
  2378. #endif /* CK_ANSIC */
  2379. /* oktimo */ {
  2380. #ifdef OS2
  2381.     alarm(0);
  2382.     /* signal(SIGALRM,SIG_IGN); */
  2383.     debug(F100,"oktimo() SIGALRM caught -- SIG_IGN set","",0) ;
  2384. #endif /* OS2 */
  2385. #ifdef OSK /* OS-9, see comment in dialtime(). */
  2386.     sigmask(-1);
  2387. #endif /* OSK */
  2388. #ifdef NTSIG
  2389.     if ( foo == SIGALRM )
  2390.       PostAlarmSigSem();
  2391.     else
  2392.       PostCtrlCSem();
  2393. #else /* NTSIG */
  2394. #ifdef NT
  2395.     cklongjmp(ckjaddr(okbuf),1);
  2396. #else /* NT */
  2397.     cklongjmp(okbuf,1);
  2398. #endif /* NTSIG */
  2399. #endif /* NT */
  2400.     /* NOTREACHED */
  2401.     SIGRETURN;
  2402. }
  2403. static int okstatus, okn, okstrict;
  2404. static SIGTYP
  2405. #ifdef CK_ANSIC
  2406. dook(void * threadinfo)
  2407. #else /* CK_ANSIC */
  2408. dook(threadinfo) VOID * threadinfo ;
  2409. #endif /* CK_ANSIC */
  2410. /* dook */ {
  2411.     CHAR c;
  2412.     int i, x;
  2413. #ifdef IKSD
  2414.     extern int inserver;
  2415. #endif /* IKSD */
  2416. #ifdef NTSIG
  2417.     signal(SIGINT,oktimo);
  2418.     if (threadinfo) { /* Thread local storage... */
  2419. TlsSetValue(TlsIndex,threadinfo);
  2420.     }
  2421. #endif /* NTSIG */
  2422. #ifdef CK_LOGIN
  2423. #ifdef NT
  2424. #ifdef IKSD
  2425.     if (inserver)
  2426.       setntcreds();
  2427. #endif /* IKSD */
  2428. #endif /* NT */
  2429. #endif /* CK_LOGIN */
  2430.     if (mdmcapas & CKD_V25) { /* CCITT, easy... */
  2431.         waitfor("VAL");
  2432.         okstatus = 1 ;
  2433. #ifdef NTSIG
  2434. ckThreadEnd(threadinfo);
  2435. #endif /* NTSIG */
  2436. SIGRETURN;
  2437. #ifndef MINIDIAL
  2438.     } else if (mymdmtyp == n_MICROCOM) { /* Microcom in SX mode, also easy */
  2439.         waitfor(MICROCOM.wake_prompt); /* (I think...) */
  2440.         okstatus = 1 ;
  2441. #ifdef NTSIG
  2442. ckThreadEnd(threadinfo);
  2443. #endif /* NTSIG */
  2444. SIGRETURN;
  2445. #endif /* MINIDIAL */
  2446.     } else { /* Hayes & friends, start here... */
  2447. okstatus = 0; /* No status yet. */
  2448. for (x = 0; x < RBUFL; x++) /* Initialize response buffer */
  2449.   rbuf[x] = SP; /*  to all spaces */
  2450. rbuf[RBUFL] = NUL; /* and terminate with NUL. */
  2451. debug(F100,"getok rbuf init ok","",0);
  2452. while (okstatus == 0) { /* While no status... */
  2453.     x = ddinc(okn); /* Read a character */
  2454.     if (x < 0) { /* I/O error */
  2455. okstatus = -1 ;
  2456. #ifdef NTSIG
  2457. ckThreadEnd(threadinfo);
  2458. #endif /* NTSIG */
  2459. SIGRETURN;
  2460.     }
  2461.     debug(F101,"getok ddinc","",x); /* Got a character. */
  2462.     c = (char) (x & 0x7f); /* Get low order 7 bits */
  2463.     if (!c) /* Don't deposit NULs */
  2464.       continue; /* or else didweget() won't work */
  2465.     if (dialdpy) conoc((char)c); /* Echo it if requested */
  2466.     for (i = 0; i < RBUFL-1; i++) /* Rotate buffer */
  2467.       rbuf[i] = rbuf[i+1];
  2468.     rbuf[RBUFL-1] = c; /* Deposit character at end */
  2469.     debug(F000,"getok:",rbuf,(int) c); /* Log it */
  2470.     switch (c) { /* Interpret it. */
  2471.       case CR: /* Got a carriage return. */
  2472. switch(rbuf[RBUFL-2]) { /* Look at character before it. */
  2473.   case '0': /* 0 = OK numeric response */
  2474.     if (!okstrict ||
  2475. rbuf[RBUFL-3] == CR || rbuf[RBUFL-3] == SP) {
  2476. nonverbal = 1;
  2477. okstatus = 1; /* Good response */
  2478.     }
  2479.     break;
  2480.   case '4': /* 4 = ERROR numeric response */
  2481. #ifndef MINIDIAL
  2482.     /* Or Telebit model number 964! */
  2483.     if (mymdmtyp == n_TELEBIT &&
  2484. isdigit(rbuf[RBUFL-3]) &&
  2485. isdigit(rbuf[RBUFL-4]))
  2486.       break;
  2487.     else
  2488. #endif /* MINIDIAL */
  2489.       if (!okstrict ||
  2490. rbuf[RBUFL-3] == CR || rbuf[RBUFL-3] == SP) {
  2491. nonverbal = 1;
  2492. okstatus = -1; /* Bad command */
  2493.     }
  2494.     break;
  2495. }
  2496. if (dialdpy && nonverbal) /* If numeric results, */
  2497.   conoc(LF);   /* echo a linefeed too. */
  2498. break;
  2499.       case LF: /* Got a linefeed. */
  2500. /*
  2501.   Note use of explicit octal codes in the string for
  2502.   CR and LF.  We want real CR and LF here, not whatever
  2503.   the compiler happens to replace r and n with...
  2504. */
  2505. if (!strcmp(rbuf+RBUFL-4,"OK1512")) /* Good response */
  2506.   okstatus = 1;
  2507. if (!strcmp(rbuf+RBUFL-3,"OK12")) /* Good response */
  2508.   okstatus = 1;
  2509. else if (!strcmp(rbuf+RBUFL-7,"ERROR1512")) /* Error */
  2510.   okstatus = -1;
  2511. else if (!strcmp(rbuf+RBUFL-6,"ERROR12")) /* Error */
  2512.   okstatus = -1;
  2513. break;
  2514.       /* Check whether modem echoes its commands... */
  2515.       case 't': /* Got little t */
  2516. if (!strcmp(rbuf+RBUFL-3,"15at") || /* See if it's "at" */
  2517.     !strcmp(rbuf+RBUFL-3," at"))
  2518.     mdmecho = 1;
  2519. debug(F111,"MDMECHO-t",rbuf+RBUFL-2,mdmecho);
  2520. break;
  2521.       case 'T': /* Got Big T */
  2522. if (!strcmp(rbuf+RBUFL-3,"15AT") || /* See if it's "AT" */
  2523.     !strcmp(rbuf+RBUFL-3," AT"))
  2524.     mdmecho = 1;
  2525. debug(F111,"MDMECHO-T",rbuf+RBUFL-3,mdmecho);
  2526. break;
  2527.       default: /* Other characters, accumulate. */
  2528. okstatus = 0;
  2529. break;
  2530.     }
  2531. }
  2532.     }
  2533.     debug(F101,"getok returns","",okstatus); /* <-- It's a lie */
  2534. #ifdef NTSIG
  2535.     ckThreadEnd(threadinfo);
  2536. #endif /* NTSIG */
  2537.     SIGRETURN;
  2538. }
  2539. static SIGTYP
  2540. #ifdef CK_ANSIC
  2541. failok(void * threadinfo)
  2542. #else /* CK_ANSIC */
  2543. failok(threadinfo) VOID * threadinfo;
  2544. #endif /* CK_ANSIC */
  2545. /* failok */ {
  2546.     debug(F100,"longjmp returned to getok()","",0);
  2547.     debug(F100,"getok timeout","",0);
  2548.     SIGRETURN;
  2549. }
  2550. int
  2551. getok(n, strict) int n, strict; {
  2552.     debug(F101,"getok entry n","",n);
  2553.     okstatus = 0;
  2554.     okn = n;
  2555.     okstrict = strict;
  2556. #ifdef DYNAMIC
  2557.     if (!rbuf) {
  2558. if (!(rbuf = malloc(RBUFL+1))) { /* Allocate input line buffer */
  2559.     dialsta = DIA_IE;
  2560.     return(-1);
  2561. }
  2562. debug(F101,"GETOK rbuf malloc ok","",RBUFL+1);
  2563.     }
  2564. #endif /* DYNAMIC */
  2565.     mdmecho = 0; /* Assume no echoing of commands */
  2566.     debug(F100,"about to alrm_execute dook()","",0);
  2567.     alrm_execute( ckjaddr(okbuf), n, oktimo, dook, failok ) ;
  2568.     debug(F100,"returning from alrm_execute dook()","",0);
  2569.     ttflui(); /* Flush input buffer */
  2570.     return(okstatus); /* Return status */
  2571. }
  2572. /*  G E T H R N  --  Get Hayes Result Numeric  */
  2573. static VOID
  2574. gethrn() {
  2575.     char c;
  2576.     int x;
  2577. /*
  2578.   Hayes numeric result codes (Hayes 1200 and higher):
  2579.      0 = OK
  2580.      1 = CONNECT at 300 bps (or 1200 bps on Hayes 1200 with basic code set)
  2581.      2 = RING
  2582.      3 = NO CARRIER
  2583.      4 = ERROR (in command line)
  2584.      5 = CONNECT 1200 (extended code set)
  2585.   Hayes 2400 and higher:
  2586.      6 = NO DIALTONE
  2587.      7 = BUSY
  2588.      8 = NO ANSWER
  2589.      9 = (there is no 9)
  2590.     10 = CONNECT 2400
  2591.   Reportedly, the codes for Hayes V.32 modems are:
  2592.     1x = CONNECT <suffix>
  2593.     5x = CONNECT 1200 <suffix>
  2594.     9x = CONNECT 2400 <suffix>
  2595.    11x = CONNECT 4800 <suffix>
  2596.    12x = CONNECT 9600 <suffix>
  2597.   Where:
  2598.     x:   suffix:
  2599.     R  = RELIABLE
  2600.     RC = RELIABLE COMPRESSED
  2601.     L  = LAPM
  2602.     LC = LAPM COMPRESSED
  2603.   And for Telebits, all the above, except no suffix in numeric mode, plus:
  2604.     11 = CONNECT 4800
  2605.     12 = CONNECT 9600
  2606.     13 = CONNECT 14400
  2607.     14 = CONNECT 19200
  2608.     15 = CONNECT 38400
  2609.     16 = CONNECT 57600
  2610.     20 = CONNECT 300/REL  (= MNP)
  2611.     22 = CONNECT 1200/REL (= MNP)
  2612.     23 = CONNECT 2400/REL (= MNP)
  2613.     46 = CONNECT 7512  (i.e. 75/1200)
  2614.     47 = CONNECT 1275  (i.e. 1200/75)
  2615.     48 = CONNECT 7200
  2616.     49 = CONNECT 12000
  2617.     50 = CONNECT FAST (not on T1600/3000)
  2618.     52 = RRING
  2619.     53 = DIALING
  2620.     54 = NO PROMPTTONE
  2621.     61 = CONNECT FAST/KERM (Kermit spoof)
  2622.     70 = CONNECT FAST/COMP (PEP + compression)
  2623.     71 = CONNECT FAST/KERM/COMP (PEP + compression + Kermit spoof)
  2624.   And for others, lots of special cases below...
  2625. */
  2626. #define NBUFL 8
  2627.     char nbuf[NBUFL+1]; /* Response buffer */
  2628.     int i = 0, j = 0; /* Buffer pointers */
  2629.     debug(F101,"RESPONSE mdmecho","",mdmecho);
  2630.     if (mdmecho) { /* Sponge up dialing string echo. */
  2631. while (1) {
  2632.     c = (char) (ddinc(0) & 0x7f);
  2633.     debug(F000,"SPONGE","",c);
  2634.     dialoc(c);
  2635.     if (c == CR) break;
  2636. }
  2637.     }
  2638.     while (mdmstat == 0) { /* Read response */
  2639. for (i = 0; i < NBUFL; i++) /* Clear the buffer */
  2640.   nbuf[i] = '';
  2641. i = 0; /* Reset the buffer pointer. */
  2642. c = (char) (ddinc(0) & 0177); /* Get first digit of response. */
  2643. /* using an untimed, blocking read. */
  2644. debug(F000,"RESPONSE-A","",c);
  2645. dialoc(c); /* Echo it if requested. */
  2646. if (!isdigit(c)) /* If not a digit, keep looking. */
  2647.   continue;
  2648. nbuf[i++] = c; /* Got first digit, save it. */
  2649. while (c != CR && i < 8) { /* Read chars up to CR */
  2650.     x = ddinc(0) & 0177; /* Get a character. */
  2651.     c = (char) x; /* Got it OK. */
  2652.     debug(F000,"RESPONSE-C","",c);
  2653.     if (c != CR) /* If it's not a carriage return, */
  2654.       nbuf[i++] = c; /*  save it. */
  2655.     dialoc(c); /* Echo it. */
  2656. }
  2657. nbuf[i] = ''; /* Done, terminate the buffer. */
  2658. debug(F110,"dial hayesnv lbuf",lbuf,0);
  2659. debug(F111,"dial hayesnv got",nbuf,i);
  2660. /*
  2661.    Separate any non-numeric suffix from the numeric
  2662.    result code with a null.
  2663. */
  2664. for (j = i-1; (j > -1) && !isdigit(nbuf[j]); j--)
  2665.   nbuf[j+1] = nbuf[j];
  2666. j++;
  2667. nbuf[j++] = '';
  2668. debug(F110,"dial hayesnv numeric",nbuf,0);
  2669. debug(F111,"dial hayesnv suffix ",nbuf+j,j);
  2670. /* Probably phone number echoing. */
  2671. if ((int)strlen(nbuf) > 3)
  2672.   continue;
  2673. /* Now read and interpret the results... */
  2674. i = atoi(nbuf); /* Convert to integer */
  2675. switch (i) {
  2676.   case 0:
  2677.     mdmstat = D_PARTIAL; /* OK response */
  2678.     break;
  2679.   case 1: /* CONNECT */
  2680.     mdmstat = CONNECTED; /* Could be any speed */
  2681.     break;
  2682.   case 2: /* RING */
  2683.     if (dialdpy)
  2684.       printf("rn Local phone is ringing!rn");
  2685.     mdmstat = D_FAILED;
  2686.     dialsta = DIA_RING;
  2687.     break;
  2688.   case 3: /* NO CARRIER */
  2689.     if (dialdpy) printf("rn No Carrier.rn");
  2690.     mdmstat = D_FAILED;
  2691.     dialsta = DIA_NOCA;
  2692.     break;
  2693.   case 4: /* ERROR */
  2694.     if (dialdpy)
  2695.       printf("rn Modem Command Error.rn");
  2696.     mdmstat = D_FAILED;
  2697.     dialsta = DIA_ERR;
  2698.     break;
  2699.   case 5: /* CONNECT 1200 */
  2700.     spdchg(1200L); /* Change speed if necessary. */
  2701.     mdmstat = CONNECTED;
  2702.     break;
  2703.   case 6: /* NO DIALTONE */
  2704. #ifndef MINIDIAL
  2705.     if (mymdmtyp == n_MICROLINK && atoi(diallcc) == 49 && dialdpy)
  2706.       printf("rn Dial Locked.rn"); /* Germany */
  2707.     else
  2708. #endif /* MINIDIAL */
  2709.       if (dialdpy)
  2710. printf("rn No Dialtone.rn");
  2711.     mdmstat = D_FAILED;
  2712.     dialsta = DIA_NODT;
  2713.     break;
  2714.   case 7: /* BUSY */
  2715.     if (dialdpy) printf("rn Busy.rn");
  2716.     mdmstat = D_FAILED;
  2717.     dialsta = DIA_BUSY;
  2718.     break;
  2719.   case 8: /* NO ANSWER */
  2720. #ifndef MINIDIAL
  2721.     if (mymdmtyp == n_MICROLINK && atoi(diallcc) == 41 && dialdpy)
  2722.       printf("rn Dial Locked.rn"); /* Switzerland */
  2723.     else
  2724. #endif /* MINIDIAL */
  2725.       if (dialdpy)
  2726. printf("rn No Answer.rn");
  2727.     mdmstat = D_FAILED;
  2728.     dialsta = DIA_NOAN;
  2729.     break;
  2730.   case 9:
  2731. #ifndef MINIDIAL
  2732.     if (mymdmtyp == n_XJACK || mymdmtyp == n_SUPRAX) {
  2733. spdchg(600);
  2734. break;
  2735.     } /* fall thru */
  2736. #endif /* MINIDIAL */
  2737.   case 10: /* CONNECT 2400 */
  2738.     spdchg(2400L); /* Change speed if necessary. */
  2739.     mdmstat = CONNECTED;
  2740.     break;
  2741. #ifndef MINIDIAL
  2742. /* Starting here, we get different meanings from different manufacturers */
  2743.   case 11:
  2744.     if (mymdmtyp == n_USR) {
  2745. if (dialdpy) printf(" Ringing...rn");
  2746.     } else {
  2747. spdchg(4800L); /* CONNECT 4800 */
  2748. mdmstat = CONNECTED;
  2749.     }
  2750.     break;
  2751.   case 12:
  2752.     if (mymdmtyp == n_USR) {
  2753. if (dialdpy)
  2754.   printf("rn Answered by voice.rn");
  2755. mdmstat = D_FAILED;
  2756. dialsta = DIA_VOIC;
  2757.     } else if (mymdmtyp == n_KEEPINTOUCH) {
  2758. spdchg(7200L);
  2759. mdmstat = CONNECTED;
  2760.     } else {
  2761. spdchg(9600L);
  2762. mdmstat = CONNECTED;
  2763.     }
  2764.     break;
  2765.   case 13:
  2766.     if (mymdmtyp == n_ATT1900 || mymdmtyp == n_ATT1910) {
  2767. if (dialdpy) printf(" Wait...rn");
  2768. break;
  2769.     } else if (mymdmtyp == n_USR || mymdmtyp == n_USRX2)
  2770.       spdchg(9600L);
  2771.     else if (is_rockwell || is_supra ||
  2772. mymdmtyp == n_ZOLTRIX || mymdmtyp == n_XJACK)
  2773.       spdchg(7200L);
  2774.     else if (mymdmtyp != n_MICROLINK) /* 12000 */
  2775.       spdchg(14400L);
  2776.     mdmstat = CONNECTED;
  2777.     break;
  2778.   case 14:
  2779.     if (is_rockwell || is_supra || mymdmtyp == n_XJACK)
  2780.       spdchg(12000L);
  2781.     else if (mymdmtyp == n_DATAPORT || mymdmtyp == n_MICROLINK)
  2782.       spdchg(14400L);
  2783.     else if (mymdmtyp == n_KEEPINTOUCH)
  2784.       spdchg(9600L);
  2785.     else if (mymdmtyp != n_USR && mymdmtyp != n_ZOLTRIX)
  2786.       spdchg(19200L);
  2787.     mdmstat = CONNECTED;
  2788.     break;
  2789.   case 15:
  2790.     if (is_rockwell || is_supra ||
  2791. mymdmtyp == n_ZOLTRIX || mymdmtyp == n_XJACK)
  2792.       spdchg(14400L);
  2793.     else if (mymdmtyp == n_USR)
  2794.       spdchg(1200L);
  2795.     else if (mymdmtyp == n_ZYXEL || mymdmtyp == n_INTEL)
  2796.       spdchg(7200L);
  2797.     else if (mymdmtyp == n_DATAPORT)
  2798.       spdchg(19200L);
  2799.     else
  2800.       spdchg(38400L);
  2801.     mdmstat = CONNECTED;
  2802.     break;
  2803.   case 16:
  2804.     if (is_rockwell || is_supra ||
  2805. mymdmtyp == n_ZOLTRIX || mymdmtyp == n_XJACK)
  2806.       spdchg(19200L);
  2807.     else if (mymdmtyp == n_USR)
  2808.       spdchg(2400L);
  2809.     else if (mymdmtyp == n_DATAPORT)
  2810.       spdchg(7200L);
  2811.     else if (mymdmtyp != n_ZYXEL && mymdmtyp != n_INTEL) /* 12000 */
  2812.       spdchg(57600L);
  2813.     mdmstat = CONNECTED;
  2814.     break;
  2815.   case 17:
  2816.     if (mymdmtyp != n_DATAPORT || mymdmtyp == n_XJACK) /* 16800 */
  2817.       spdchg(38400L);
  2818.     else if (mymdmtyp == n_ZYXEL || mymdmtyp == n_INTEL)
  2819.       spdchg(14400L);
  2820.     else if (mymdmtyp == n_KEEPINTOUCH)
  2821.       spdchg(14400L);
  2822.     else if (mymdmtyp == n_USR)
  2823.       spdchg(9600L);
  2824.     mdmstat = CONNECTED;
  2825.     break;
  2826.   case 18:
  2827.     if (is_rockwell || is_supra ||
  2828. mymdmtyp == n_ZOLTRIX || mymdmtyp == n_XJACK
  2829. || mymdmtyp == n_MHZATT)
  2830.       spdchg(57600L);
  2831.     else if (mymdmtyp == n_INTEL)
  2832.       spdchg(19200L);
  2833.     else if (mymdmtyp == n_USR || mymdmtyp == n_USRX2)
  2834.       spdchg(4800L);
  2835.     mdmstat = CONNECTED;
  2836.     break;
  2837.   case 19:
  2838.     if (mymdmtyp == n_DATAPORT)
  2839.       spdchg(300L);
  2840.     else if (mymdmtyp == n_ZYXEL || mymdmtyp == n_INTEL)
  2841.       spdchg(38400L);
  2842.     else
  2843.       spdchg(115200L);
  2844.     mdmstat = CONNECTED;
  2845.     break;
  2846.   case 20:
  2847.     if (mymdmtyp == n_USR || mymdmtyp == n_USRX2)
  2848.       spdchg(7200L);
  2849.     else if (mymdmtyp == n_DATAPORT)
  2850.       spdchg(2400L);
  2851.     else if (mymdmtyp == n_ZYXEL || mymdmtyp == n_INTEL)
  2852.       spdchg(57600L);
  2853.     else
  2854.       spdchg(300L);
  2855.     mdmstat = CONNECTED;
  2856.     break;
  2857.   case 21:
  2858.     if (mymdmtyp == n_DATAPORT)
  2859.       spdchg(4800L);
  2860.     mdmstat = CONNECTED;
  2861.     break;
  2862.   case 22:
  2863.     if (is_rockwell || is_supra || mymdmtyp == n_XJACK)
  2864.       spdchg(8880L);
  2865.     else if (mymdmtyp == n_DATAPORT)
  2866.       spdchg(9600L);
  2867.     else if (mymdmtyp == n_KEEPINTOUCH)
  2868.       spdchg(300L);
  2869.     else if (!is_hayeshispd)
  2870.       spdchg(1200L);
  2871.     mdmstat = CONNECTED;
  2872.     break;
  2873.   case 23:
  2874.     if (is_hayeshispd || is_supra ||
  2875. mymdmtyp == n_MULTI || mymdmtyp == n_XJACK)
  2876.       spdchg(8880L);
  2877.     else if (mymdmtyp != n_DATAPORT && !is_rockwell) /* 12000 */
  2878.       spdchg(2400L);
  2879.     mdmstat = CONNECTED;
  2880.     break;
  2881.   case 24:
  2882.     if (is_rockwell ||  is_supra || mymdmtyp == n_XJACK) {
  2883. mdmstat = D_FAILED;
  2884. dialsta = DIA_DELA; /* Delayed */
  2885. break;
  2886.     } else if (is_hayeshispd)
  2887.       spdchg(7200L);
  2888.     else if (mymdmtyp == n_DATAPORT)
  2889.       spdchg(14400L);
  2890.     else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
  2891.       spdchg(1200L);
  2892.     mdmstat = CONNECTED;
  2893.     break;
  2894.   case 25:
  2895.     if (mymdmtyp == n_USR || mymdmtyp == n_USRX2)
  2896.       spdchg(14400L);
  2897.     else if (is_motorola)
  2898.       spdchg(9600L);
  2899.     else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
  2900.       spdchg(2400L);
  2901.     mdmstat = CONNECTED;
  2902.     break;
  2903.   case 26:
  2904.     if (mymdmtyp == n_DATAPORT)
  2905.       spdchg(19200L);
  2906.     else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
  2907.       spdchg(4800L);
  2908.     mdmstat = CONNECTED;
  2909.     break;
  2910.   case 27:
  2911.     if (mymdmtyp == n_DATAPORT)
  2912.       spdchg(38400L);
  2913.     else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
  2914.       spdchg(7200L);
  2915.     else if (mymdmtyp == n_MHZATT)
  2916.       spdchg(8880L);
  2917.     mdmstat = CONNECTED;
  2918.     break;
  2919.   case 28:
  2920.     if (mymdmtyp == n_DATAPORT)
  2921.       spdchg(7200L);
  2922.     else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
  2923.       spdchg(9600L);
  2924.     else if (mymdmtyp == n_MHZATT)
  2925.       spdchg(38400L);
  2926.     mdmstat = CONNECTED;
  2927.     break;
  2928.   case 29:
  2929.     if (is_motorola)
  2930.       spdchg(4800L);
  2931.     else if (mymdmtyp == n_DATAPORT)
  2932.       spdchg(19200L);
  2933.     mdmstat = CONNECTED;
  2934.     break;
  2935.   case 30:
  2936.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  2937. spdchg(14400L);
  2938. mdmstat = CONNECTED;
  2939.     } /* fall thru on purpose... */
  2940.   case 31:
  2941.     if (mymdmtyp == n_UCOM_AT || mymdmtyp == n_MICROLINK) {
  2942. spdchg(4800L);
  2943. mdmstat = CONNECTED;
  2944.     } else if (is_motorola) {
  2945. spdchg(57600L);
  2946. mdmstat = CONNECTED;
  2947.     }
  2948.     break;
  2949.   case 32:
  2950.     if (is_rockwell || is_supra || mymdmtyp == n_XJACK) {
  2951. mdmstat = D_FAILED;
  2952. dialsta = DIA_BLCK; /* Blacklisted */
  2953.     } else if (mymdmtyp == n_UCOM_AT || mymdmtyp == n_MICROLINK) {
  2954. spdchg(9600L);
  2955. mdmstat = CONNECTED;
  2956.     } else if (mymdmtyp == n_KEEPINTOUCH) {
  2957. spdchg(300L);
  2958. mdmstat = CONNECTED;
  2959.     } else if (mymdmtyp == n_INTEL) {
  2960. spdchg(2400L);
  2961. mdmstat = CONNECTED;
  2962.     }
  2963.     break;
  2964.   case 33: /* FAX connection */
  2965.     if (is_rockwell || is_supra ||
  2966. mymdmtyp == n_ZOLTRIX || mymdmtyp == n_XJACK) {
  2967. mdmstat = D_FAILED;
  2968. dialsta = DIA_FAX;
  2969.     } else if (mymdmtyp == n_UCOM_AT ||
  2970.        is_motorola ||
  2971.        mymdmtyp == n_MICROLINK
  2972.        ) {
  2973. spdchg(9600L);
  2974. mdmstat = CONNECTED;
  2975.     } else if (mymdmtyp == n_MHZATT) {
  2976. spdchg(115200L);
  2977. mdmstat = CONNECTED;
  2978.     }
  2979.     break;
  2980.   case 34:
  2981.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  2982. spdchg(1200L);
  2983. mdmstat = CONNECTED;
  2984.     } else if (mymdmtyp == n_MICROLINK) {
  2985. spdchg(7200L);
  2986. mdmstat = CONNECTED;
  2987.     }
  2988.     break;
  2989.   case 35:
  2990.     if (is_rockwell) {
  2991. spdchg(300L);
  2992. dialsta = CONNECTED;
  2993.     } else if (is_motorola) {
  2994. spdchg(14400L);
  2995. mdmstat = CONNECTED;
  2996.     } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  2997. spdchg(2400L);
  2998. mdmstat = CONNECTED;
  2999.     } else if (mymdmtyp == n_MICROLINK) {
  3000. spdchg(7200L);
  3001. mdmstat = CONNECTED;
  3002.     } else if (mymdmtyp == n_ZOLTRIX || mymdmtyp == n_XJACK) /* DATA */
  3003.       mdmstat = CONNECTED;
  3004.     break;
  3005.   case 36:
  3006.     if (mymdmtyp == n_UCOM_AT) {
  3007. spdchg(19200L);
  3008. mdmstat = CONNECTED;
  3009.     } else if (is_motorola) {
  3010. spdchg(1200L);
  3011. mdmstat = CONNECTED;
  3012.     } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3013. spdchg(4800L);
  3014. mdmstat = CONNECTED;
  3015.     }
  3016.     break;
  3017.   case 37:
  3018.     if (mymdmtyp == n_UCOM_AT) {
  3019. spdchg(19200L);
  3020. mdmstat = CONNECTED;
  3021.     } else if (is_motorola) {
  3022. spdchg(2400L);
  3023. mdmstat = CONNECTED;
  3024.     } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3025. spdchg(7200L);
  3026. mdmstat = CONNECTED;
  3027.     }
  3028.     break;
  3029.   case 38:
  3030.     if (is_motorola) {
  3031. spdchg(4800L);
  3032. mdmstat = CONNECTED;
  3033.     } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3034. spdchg(9600L);
  3035. mdmstat = CONNECTED;
  3036.     } /* fall thru on purpose... */
  3037.   case 39:
  3038.     if (mymdmtyp == n_UCOM_AT) {
  3039. spdchg(38400L);
  3040. mdmstat = CONNECTED;
  3041.     } else if (is_motorola) {
  3042. spdchg(9600L);
  3043. mdmstat = CONNECTED;
  3044.     } else if (mymdmtyp == n_MICROLINK) {
  3045. spdchg(14400L);
  3046. mdmstat = CONNECTED;
  3047.     }
  3048.     break;
  3049.   case 40:
  3050.     if (mymdmtyp == n_UCOM_AT) {
  3051. mdmstat = D_FAILED;
  3052. dialsta = DIA_NOCA;
  3053.     } else if (is_motorola || mymdmtyp == n_INTEL ||
  3054.        mymdmtyp == n_KEEPINTOUCH) {
  3055. spdchg(14400L);
  3056. mdmstat = CONNECTED;
  3057.     }
  3058.     break;
  3059.   case 41:
  3060.     if (is_motorola) {
  3061. spdchg(19200L);
  3062. mdmstat = CONNECTED;
  3063.     }
  3064.     break;
  3065.   case 42:
  3066.     if (mymdmtyp == n_KEEPINTOUCH) {
  3067. spdchg(300L);
  3068. mdmstat = CONNECTED;
  3069.     } else if (is_motorola) {
  3070. spdchg(38400L);
  3071. mdmstat = CONNECTED;
  3072.     } /* fall thru on purpose... */
  3073.   case 43:
  3074.     if (mymdmtyp == n_UCOM_AT) {
  3075. spdchg(57600L);
  3076. mdmstat = CONNECTED;
  3077.     } else if (mymdmtyp == n_USRX2)
  3078.       mdmstat = CONNECTED; /* 168000 */
  3079.     break;
  3080.   case 44:
  3081.     if (is_rockwell) {
  3082. spdchg(8800L);
  3083. dialsta = CONNECTED;
  3084.     } else if (is_motorola) {
  3085. spdchg(7200L);
  3086. mdmstat = CONNECTED;
  3087.     } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3088. spdchg(1200L);
  3089. mdmstat = CONNECTED;
  3090.     }
  3091.     break;
  3092.   case 45:
  3093.     if (is_motorola) {
  3094. spdchg(57600L);
  3095. mdmstat = CONNECTED;
  3096.     } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3097. spdchg(2400L);
  3098. mdmstat = CONNECTED;
  3099.     } else if (n_USR) {
  3100. spdchg(14400L);
  3101. mdmstat = CONNECTED;
  3102.     }
  3103.     break;
  3104.   case 46:
  3105.     if (is_rockwell)
  3106.       spdchg(1200L);
  3107.     else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
  3108.       spdchg(4800L);
  3109.     else
  3110.       spdchg(8880L); /* 75/1200 split speed */
  3111.     mdmstat = CONNECTED;
  3112.     break;
  3113.   case 47:
  3114.     if (is_rockwell)
  3115.       spdchg(2400L);
  3116.     else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
  3117.       spdchg(7200L);
  3118.     else
  3119.       printf("CONNECT 1200/75 - Not supported by C-Kermitrn");
  3120.     mdmstat = CONNECTED;
  3121.     break;
  3122.   case 48:
  3123.     if (is_rockwell)
  3124.       spdchg(4800L);
  3125.     else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
  3126.       spdchg(9600L);
  3127.     else
  3128.       spdchg(7200L);
  3129.     mdmstat = CONNECTED;
  3130.     break;
  3131.   case 49:
  3132.     if (is_rockwell)
  3133.       spdchg(7200L);
  3134.     mdmstat = CONNECTED;
  3135.     break;
  3136.   case 50: /* CONNECT FAST */
  3137.     if (is_rockwell)
  3138.       spdchg(9600L);
  3139.     else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH)
  3140.       spdchg(14400L);
  3141.     mdmstat = CONNECTED;
  3142.     break;
  3143.   case 51:
  3144.     if (mymdmtyp == n_UCOM_AT) {
  3145. mdmstat = D_FAILED;
  3146. dialsta = DIA_NODT;
  3147.     }
  3148.     break;
  3149.   case 52: /* RRING */
  3150.     if (mymdmtyp == n_TELEBIT)
  3151.       if (dialdpy) printf(" Ringing...rn");
  3152.     break;
  3153.   case 53: /* DIALING */
  3154.     if (mymdmtyp == n_TELEBIT)
  3155.       if (dialdpy) printf(" Dialing...rn");
  3156.     break;
  3157.   case 54:
  3158.     if (is_rockwell) {
  3159. spdchg(19200L);
  3160. mdmstat = CONNECTED;
  3161.     } else if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3162. spdchg(1200L);
  3163. mdmstat = CONNECTED;
  3164.     } else if (mymdmtyp == n_TELEBIT) {
  3165. if (dialdpy) printf("rn No Prompttone.rn");
  3166. mdmstat = D_FAILED;
  3167. dialsta = DIA_NODT;
  3168.     }
  3169.     break;
  3170.   case 55:
  3171.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3172. spdchg(2400L);
  3173. mdmstat = CONNECTED;
  3174.     }
  3175.     break;
  3176.   case 56:
  3177.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3178. spdchg(4800L);
  3179. mdmstat = CONNECTED;
  3180.     }
  3181.     break;
  3182.   case 57:
  3183.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3184. spdchg(7200L);
  3185. mdmstat = CONNECTED;
  3186.     }
  3187.     break;
  3188.   case 58:
  3189.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3190. spdchg(9600L);
  3191. mdmstat = CONNECTED;
  3192.     }
  3193.     break;
  3194.   case 59:
  3195.     if (mymdmtyp == n_INTEL) /* 12000 */
  3196.       mdmstat = CONNECTED;
  3197.     break;
  3198.   case 60:
  3199.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3200. spdchg(14400L);
  3201. mdmstat = CONNECTED;
  3202.     }
  3203.     break;
  3204.   case 64:
  3205.     if (mymdmtyp == n_INTEL) {
  3206. spdchg(1200L);
  3207. mdmstat = CONNECTED;
  3208.     } else if (is_supra) {
  3209. spdchg(28800L);
  3210. mdmstat = CONNECTED;
  3211.     }
  3212.     break;
  3213.   case 65:
  3214.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3215. spdchg(2400L);
  3216. mdmstat = CONNECTED;
  3217.     }
  3218.     break;
  3219.   case 66:
  3220.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3221. spdchg(4800L);
  3222. mdmstat = CONNECTED;
  3223.     }
  3224.     break;
  3225.   case 67:
  3226.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3227. spdchg(7200L);
  3228. mdmstat = CONNECTED;
  3229.     }
  3230.     break;
  3231.   case 68:
  3232.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3233. spdchg(9600L);
  3234. mdmstat = CONNECTED;
  3235.     }
  3236.     break;
  3237.   case 69:
  3238.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) /* 12000 */
  3239.       mdmstat = CONNECTED;
  3240.     break;
  3241.   case 70:
  3242.     if (mymdmtyp == n_INTEL || mymdmtyp == n_KEEPINTOUCH) {
  3243. spdchg(14400L);
  3244. mdmstat = CONNECTED;
  3245.     }
  3246.     break;
  3247.   case 73:
  3248.     if (mymdmtyp == n_UCOM_AT) {
  3249. spdchg(115200L);
  3250. mdmstat = CONNECTED;
  3251. break;
  3252.     } /* else fall thru */
  3253.     if (mymdmtyp == n_TELEBIT) /* Early models only */
  3254.       mdmstat = CONNECTED;
  3255.     break;
  3256.   case 85:
  3257.     if (mymdmtyp == n_USR || mymdmtyp == n_USRX2)
  3258.       spdchg(19200L);
  3259.     mdmstat = CONNECTED;
  3260.     break;
  3261.   case 91: /* 21600 */
  3262.   case 99: /* 24000 */
  3263.   case 103: /* 26400 */
  3264.     if (mymdmtyp == n_USRX2)
  3265.       mdmstat = CONNECTED;
  3266.     break;
  3267.   case 107:
  3268.     if (mymdmtyp == n_USR || mymdmtyp == n_USRX2) {
  3269. spdchg(28800L);
  3270. mdmstat = CONNECTED;
  3271.     }
  3272.     break;
  3273.   case 151: /* 312000 */
  3274.   case 155: /* 336000 */
  3275.     if (mymdmtyp == n_USRX2)
  3276.       mdmstat = CONNECTED;
  3277.     break;
  3278. #endif /* MINIDIAL */
  3279.   default:
  3280. #ifndef MINIDIAL
  3281.     if (mymdmtyp == n_USR || mymdmtyp == n_USRX2 ||
  3282. is_hayeshispd || is_rockwell)
  3283. #endif /* MINIDIAL */
  3284.       if (i > 12) /* There are hundreds of them... */
  3285. mdmstat = CONNECTED;
  3286.     break;
  3287. }
  3288.     }
  3289.     if (mdmstat == CONNECTED && nbuf[j] != '') {
  3290. if (dialdpy) {
  3291.     printf("rn");
  3292.     if (nbuf[j] == 'R') printf(" RELIABLE");
  3293.     if (nbuf[j] == 'L') printf(" LAPM");
  3294.     if (nbuf[j+1] == 'C') printf(" COMPRESSED");
  3295.     printf("rn");
  3296. }
  3297. strcpy(lbuf,nbuf); /* (for messages...) */
  3298.     }
  3299. }
  3300. static VOID /* Get Hayes Result in Word mode */
  3301. gethrw() {
  3302.     char *cptr, *s;
  3303.     long conspd;
  3304.     if (mdmspd && !network) {
  3305. s = lbuf;
  3306. while (*s != '' && *s != 'C') s++;
  3307. cptr = (*s == 'C') ? s : NULL;
  3308. conspd = 0L;
  3309. if ((cptr != NULL) && !strncmp(cptr,"CONNECT ",8)) {
  3310.     if ((int)strlen(cptr) < 9)   /* Just CONNECT, */
  3311.       conspd = 300L;  /* use 300 bps */
  3312.     else if (isdigit(*(cptr+8))) /* not CONNECT FAST */
  3313.       conspd = atol(cptr + 8);   /* CONNECT nnnn */
  3314.     if (conspd != speed) {
  3315. if ((conspd / 10L) > 0) {
  3316.     if (ttsspd((int) (conspd / 10L)) < 0) {
  3317. printf(" Can't change speed to %ldrn",
  3318.        conspd);
  3319.     } else {
  3320. speed = conspd;
  3321. mdmstat = CONNECTED;
  3322. if ( !quiet && !backgrd )
  3323.   printf(" Speed changed to %ldrn",
  3324.  conspd);
  3325.     }
  3326. }
  3327.     } /* Expanded to handle any conceivable speed */
  3328. }
  3329.     }
  3330. #ifndef MINIDIAL
  3331.     if (mymdmtyp == n_TELEBIT) {
  3332. if (didweget(lbuf,"CONNECT FAST/KERM")) {
  3333.     mdmstat = CONNECTED;
  3334.     if (dialdpy) printf("FAST/KERM ");
  3335.     return;
  3336. }
  3337.     }
  3338. #endif /* MINIDIAL */
  3339.     if (didweget(lbuf,"RRING") ||
  3340. didweget(lbuf,"RINGING") ||
  3341. didweget(lbuf,"DIALING")) {
  3342. mdmstat = 0;
  3343.     } else if (didweget(lbuf,"CONNECT")) {
  3344. mdmstat = CONNECTED;
  3345.     } else if (didweget(lbuf,"OK")) {
  3346. if (partial) {
  3347.     mdmstat = D_PARTIAL;
  3348. } else {
  3349.     mdmstat = D_FAILED;
  3350.     dialsta = DIA_ERR;
  3351. }
  3352.     } else if (didweget(lbuf,"NO CARRIER")) {
  3353. mdmstat = D_FAILED;
  3354. dialsta = DIA_NOCA;
  3355.     } else if (didweget(lbuf,"NO DIALTONE")) {
  3356. mdmstat = D_FAILED;
  3357. dialsta = DIA_NODT;
  3358.     } else if (didweget(lbuf,"NO DIAL TONE")) {
  3359. mdmstat = D_FAILED;
  3360. dialsta = DIA_NODT;
  3361.     } else if (didweget(lbuf,"BUSY")) {
  3362. mdmstat = D_FAILED;
  3363. dialsta = DIA_BUSY;
  3364.     } else if (didweget(lbuf,"NO ANSWER")) {
  3365. mdmstat = D_FAILED;
  3366. dialsta = DIA_NOAN;
  3367.     } else if (didweget(lbuf,"VOICE")) {
  3368. mdmstat = D_FAILED;
  3369. dialsta = DIA_VOIC;
  3370.     } else if (didweget(lbuf,"NO PROMPT TONE")) {
  3371. mdmstat = D_FAILED;
  3372. dialsta = DIA_NODT;
  3373.     } else if (didweget(lbuf,"REMOTE ACCESS FAILED")) {
  3374. mdmstat = D_FAILED;
  3375. dialsta = DIA_NOCA;
  3376.     } else if (didweget(lbuf,"FAX")) {
  3377. mdmstat = D_FAILED;
  3378. dialsta = DIA_FAX;
  3379.     } else if (didweget(lbuf,"WAIT - CONNECTING") ||
  3380.        didweget(lbuf,"WAIT-CONNECTING")) { /* AT&T STU-III 19xx */
  3381. mdmstat = 0;
  3382.     } else if (didweget(lbuf,"DELAYED")) {
  3383. mdmstat = D_FAILED;
  3384. dialsta = DIA_DELA;
  3385.     } else if (didweget(lbuf,"BLACKLISTED")) {
  3386. mdmstat = D_FAILED;
  3387. dialsta = DIA_BLCK;
  3388.     } else if (didweget(lbuf,"COMPRESSION")) {
  3389. mdmstat = 0;
  3390.     } else if (didweget(lbuf,"PROTOCOL")) {
  3391. mdmstat = 0;
  3392.     } else if (didweget(lbuf,"DIAL LOCKED")) { /* Germany, Austria, Schweiz */
  3393. mdmstat = D_FAILED;
  3394. dialsta = DIA_BLCK;
  3395.     } else if ( didweget(lbuf,"RING") ||
  3396.         didweget(lbuf,"RING1") || /* Distinctive Ring 1 */
  3397. didweget(lbuf,"RING2") || /* Distinctive Ring 2 */
  3398. didweget(lbuf,"RING3") ) {
  3399. mdmstat = (func_code == 0) ? D_FAILED : 0;
  3400. dialsta = DIA_RING;
  3401.     } else if (didweget(lbuf,"ERROR")) {
  3402. mdmstat = D_FAILED;
  3403. dialsta = DIA_ERR;
  3404.     } else if (didweget(lbuf,"CARRIER")) { /* Boca / Rockwell family */
  3405. #ifdef COMMENT
  3406. if (is_rockwell)
  3407. #endif /* COMMENT */
  3408.   mdmstat = 0;
  3409. #ifdef COMMENT
  3410. /* Does CARRIER ever mean the same as CONNECT? */
  3411. else
  3412.   mdmstat = CONNECTED;
  3413. #endif /* COMMENT */
  3414.     } else if (didweget(lbuf,"DATA")) { /* Boca / Rockwell family */
  3415. /* This message is sent when the modem is in FAX mode  */
  3416. /* So setting this to CONNECTED may not be appropriate */
  3417. /* We must send ATO15 to the modem in response       */
  3418. /* Then we will get a CONNECTED message                */
  3419. mdmstat = CONNECTED;
  3420.     } else if (didweget(lbuf,"DIGITAL LINE")) {
  3421. mdmstat = D_FAILED;
  3422. dialsta = DIA_DIGI;
  3423.     } else if (didweget(lbuf,"DATE")) { /* Caller ID Date */
  3424. debug(F110,"CALLID DATE",lbuf,0);
  3425. /* Format is "DATE     =   MMDD"   */
  3426.     } else if (didweget(lbuf,"TIME")) { /* Caller ID Time */
  3427. /* Format is "TIME     =   HHMM"   */
  3428. debug(F110,"CALLID TIME",lbuf,0);
  3429.     } else if (didweget(lbuf,"NAME")) { /* Caller ID Name */
  3430. /* Format is "NAME     =   <listing name>"   */
  3431. debug(F110,"CALLID NAME",lbuf,0);
  3432.     } else if (didweget(lbuf,"NMBR")) { /* Caller ID Number */
  3433. /* Format is "NMBR     =   <number>, 'P' or 'O'"   */
  3434. /*  'P' means Privacy Requested     */
  3435. /*      'O' means Out of Service or Not available  */
  3436. debug(F110,"CALLID NMBR",lbuf,0);
  3437.     } else if (didweget(lbuf,"MESG")) { /* Caller ID Unrecognized Message */
  3438. /* Format is "MESG     =   <tag><length><data><checksum>"   */
  3439. debug(F110,"CALLID MESG",lbuf,0);
  3440.     }
  3441. }
  3442. /* Maybe hang up the phone, depending on various SET DIAL parameters. */
  3443. int
  3444. dialhup() {
  3445.     int x = 0;
  3446.     if (dialhng && dialsta != DIA_PART) { /* DIAL HANGUP ON? */
  3447. x = mdmhup(); /* Try modem-specific method first */
  3448. debug(F101,"dialhup mdmhup","",x);
  3449. if (x > 0) { /* If it worked, */
  3450.     dialsta = DIA_HUP;
  3451.     if (dialdpy)
  3452.       printf(" Modem hangup OKrn"); /* fine. */
  3453. } else if (network) { /* If we're telnetted to */
  3454.     dialsta = DIA_HANG;
  3455.     if (dialdpy) /* a modem server, just print a msg */
  3456.       printf(" WARNING - modem hangup failedrn"); /* don't hangup! */
  3457.     return(0);
  3458. } else { /* Otherwise */
  3459.     x = tthang(); /* Tell the OS to turn off DTR. */
  3460.     if (x > 0) { /* Yes, tell results from tthang() */
  3461. dialsta = DIA_HUP;
  3462. if (dialdpy) printf(" Hangup OKrn");
  3463.     } else if (x == 0) {
  3464. if (dialdpy) printf(" Hangup skippedrn");
  3465.     } else {
  3466. dialsta = DIA_HANG;
  3467. if (dialdpy) perror(" Hangup error");
  3468.     }
  3469. }
  3470.     } else if (dialdpy) printf(" Hangup skippedrn"); /* DIAL HANGUP OFF */
  3471.     return(x);
  3472. }
  3473. /*
  3474.   M D M H U P  --
  3475.   Sends escape sequence to modem, then sends its hangup command.  Returns:
  3476.    0: If modem type is 0 (direct serial connection),
  3477.       or if modem type is < 0 (network connection),
  3478.       or if no action taken because DIAL MODEM-HANGUP is OFF)
  3479.         or because no hangup string for current modem type,
  3480.       or C-Kermit is in remote mode,
  3481.       or if action taken but there was no positive response from modem;
  3482.    1: Success: modem is in command state and acknowledged the hangup command;
  3483.   -1: On modem command error.
  3484. */
  3485. int
  3486. mdmhup() {
  3487. #ifdef MDMHUP
  3488.     int m, x = 0;
  3489.     int xparity;
  3490.     char *s, *p, c;
  3491.     MDMINF * mp = NULL;
  3492.     debug(F101,"mdmhup dialmhu","",dialmhu); /* MODEM-HANGUP METHOD */
  3493.     debug(F101,"mdmhup local","",local);
  3494.     if (dialmhu == 0 || local == 0) /* If DIAL MODEM-HANGUP is OFF, */
  3495.       return(0); /*  or not in local mode, fail. */
  3496.     if (dialesc < 0)
  3497.       return(0); /* No modem escape-character, fail. */
  3498. #ifdef CK_TAPI
  3499.     if (tttapi && !tapipass) /* Don't hangup if using TAPI */
  3500.       return(0);
  3501. #endif /* CK_TAPI */
  3502.     x = ttchk();
  3503.     debug(F101,"mdmhup ttchk","",x);
  3504.     if (x < 0) /* There appears to be no connection */
  3505.       return(0);
  3506.     x = 0;
  3507. #ifdef OS2
  3508. /*
  3509.   In OS/2, if CARRIER is OFF, and there is indeed no carrier signal, any
  3510.   attempt to do i/o at this point can hang the program.  This might be true
  3511.   for other operating systems too.
  3512. */
  3513.     if (!network) { /* Not a network connection */
  3514. m = ttgmdm(); /* Get modem signals */
  3515. if ((m > -1) && (m & BM_DCD == 0)) /* Check for carrier */
  3516.   return(0); /* No carrier, skip the rest */
  3517.     }
  3518. #endif /* OS2 */
  3519.     debug(F111,"mdmhup network",ttname,network);
  3520.     debug(F101,"mdmhup mymdmtyp","",mymdmtyp);
  3521.     debug(F101,"mdmhup mdmtyp","",mdmtyp);
  3522.     /* In case of HANGUP before DIAL */
  3523.     if (network && mdmtyp < 1) /* SET HOST but no subsequent */
  3524.       return(0); /* SET MODEM TYPE... */
  3525.     if (mymdmtyp == 0 && mdmtyp > 0)
  3526.       mymdmtyp = mdmtyp;
  3527.     if (mymdmtyp < 1) /* Not using a modem */
  3528.       return(0);
  3529.     if (mymdmtyp > 0) /* An actual modem... */
  3530.       mp = modemp[mymdmtyp];
  3531.     if (!mp) { /* Get pointer to its MDMINF struct */
  3532. debug(F100,"mdmhup no MDMINF","",0);
  3533. return(0);
  3534.     }
  3535.     mdmcapas = dialcapas ? dialcapas : mp->capas;
  3536.     xx_ok = mp->ok_fn; /* Pointer to response reader */
  3537.     s = dialhcmd ? dialhcmd : mp->hup_str; /* Get hangup command */
  3538.     if (!s) s = "";
  3539.     debug(F110,"mdmhup hup_str",s,0);
  3540.     if (!*s) return(0); /* If none, fail. */
  3541.     if (ttpkt(speed,FLO_DIAL,parity) < 0) /* Condition line for dialing */
  3542.       return(-1);
  3543.     xparity = parity; /* Set PARITY to NONE temporarily */
  3544.     parity = 0;
  3545.     /* In case they gave a SET MODEM ESCAPE command recently... */
  3546.     if (dialesc < 0 || dialesc > 127)
  3547.       c = NUL;
  3548.     else
  3549.       c = (char) (dialesc ? dialesc : mp->esc_char);
  3550.     if (mdmcapas & CKD_AT) { /* Hayes compatible */
  3551. escbuf[0] = c;
  3552. escbuf[1] = c;
  3553. escbuf[2] = c;
  3554. escbuf[3] = NUL;
  3555.     } else { /* Other */
  3556. escbuf[0] = c;
  3557. escbuf[1] = NUL;
  3558.     }
  3559.     debug(F110,"mdmhup escbuf",escbuf,0);
  3560.     if (escbuf[0]) { /* Have escape sequence? */
  3561. debug(F101,"mdmhup esc_time",0,mp->esc_time);
  3562. if (mp->esc_time) /* If we have a guard time */
  3563.   msleep(mp->esc_time); /* Pause for guard time */
  3564. debug(F100,"mdmhup pause 1 OK","",0);
  3565. #ifdef NETCONN /* Send modem's escape sequence */
  3566. if (network) { /* Must catch errors here. */
  3567.     if (ttol((CHAR *)escbuf,(int)strlen((char *)escbuf)) < 0) {
  3568. parity = xparity;
  3569. return(-1);
  3570.     }
  3571.     debug(F110,"mdmhup ttslow net ok",escbuf,0);
  3572. } else {
  3573. #endif /* NETCONN */
  3574.     ttslow((char *)escbuf,wr); /* Send escape sequence */
  3575.     debug(F110,"mdmhup ttslow ok",escbuf,0);
  3576. #ifdef NETCONN
  3577. }
  3578. #endif /* NETCONN */
  3579. if (mp->esc_time) /* Pause for guard time again */
  3580.   msleep(mp->esc_time);
  3581. else
  3582.   msleep(500); /* Wait half a sec for echoes. */
  3583. debug(F100,"mdmhup pause 1 OK","",0);
  3584. #ifdef COMMENT
  3585. ttflui(); /* Flush response or echo, if any */
  3586. debug(F100,"mdmhup ttflui OK","",0);
  3587. #endif /* COMMENT */
  3588.     }
  3589.     ttslow(s,wr); /* Now Send hangup string */
  3590.     debug(F110,"mdmhup ttslow ok",s,0);
  3591. /*
  3592.   This is not exactly right, but it works.
  3593.   If we are online:
  3594.     the modem says OK when it gets the escape sequence,
  3595.     and it says NO CARRIER when it gets the hangup command.
  3596.   If we are offline:
  3597.     the modem does NOT say OK (or anything else) when it gets the esc sequence,
  3598.     but it DOES say OK (and not NO CARRIER) when it gets the hangup command.
  3599.   So the following function should read the OK in both cases.
  3600.   Of course, this is somewhat Hayes-specific...
  3601. */
  3602.     if (xx_ok) { /* Look for OK response */
  3603. debug(F100,"mdmhup calling response function","",0);
  3604. x = (*xx_ok)(3,1); /* Give it 3 seconds, be strict. */
  3605. debug(F101,"mdmhup hangup response","",x);
  3606. msleep(500); /* Wait half a sec */
  3607. ttflui(); /* Get rid of NO CARRIER, if any */
  3608.     } else { /* No OK function, */
  3609. x = 1; /* so assume it worked */
  3610. debug(F101,"mdmhup no ok_fn","",x);
  3611.     }
  3612.     parity = xparity; /* Restore prevailing parity */
  3613.     return(x); /* Return OK function's return code. */
  3614. #else  /* MDMHUP not defined. */
  3615.     return(0); /* Always fail. */
  3616. #endif /* MDMHUP */
  3617. }
  3618. #else /* NODIAL */
  3619. int /* To allow NODIAL versions to */
  3620. mdmhup() { /* call mdmhup(), so calls to  */
  3621.     return(0); /* mdmhup() need not be within */
  3622. } /* #ifndef NODIAL conditionals */
  3623. #endif /* NOICP */
  3624. #endif /* NODIAL */
  3625. #endif /* NOLOCAL */