148651Sbostic /*-
2*62384Sbostic * Copyright (c) 1985, 1993
3*62384Sbostic * The Regents of the University of California. All rights reserved.
448651Sbostic *
548651Sbostic * %sccs.include.proprietary.c%
648651Sbostic */
748651Sbostic
825883Sbloom #ifndef lint
9*62384Sbostic static char sccsid[] = "@(#)cds224.c 8.1 (Berkeley) 06/06/93";
1048651Sbostic #endif /* not lint */
1125883Sbloom
1246875Sbostic #include "condevs.h"
1325883Sbloom
1425883Sbloom /*
1525883Sbloom * conopn: establish dial-out connection through a Concord CDS 224.
1625883Sbloom * Returns descriptor open to tty for reading and writing.
1725883Sbloom * Negative values (-1...-7) denote errors in connmsg.
1825883Sbloom * Be sure to disconnect tty when done, via HUPCL or stty 0.
1925883Sbloom */
2025883Sbloom #define TRYS 5 /* number of trys */
2125883Sbloom
cdsopn224(telno,flds,dev)2225883Sbloom cdsopn224(telno, flds, dev)
2325883Sbloom char *telno;
2425883Sbloom char *flds[];
2525883Sbloom struct Devices *dev;
2625883Sbloom {
2725883Sbloom int dh = -1;
2825883Sbloom int i, ok, er = 0, delay;
2925883Sbloom extern errno;
3025883Sbloom char dcname[20];
3146875Sbostic char tempbuf[20];
3225883Sbloom
3325883Sbloom sprintf(dcname, "/dev/%s", dev->D_line);
3425883Sbloom if (setjmp(Sjbuf)) {
3525883Sbloom DEBUG(1, "timeout concord open\n", "");
3625883Sbloom logent("concord open", "TIMEOUT");
3725883Sbloom if (dh >= 0)
3825883Sbloom cdscls224(dh);
3925883Sbloom delock(dev->D_line);
4025883Sbloom return CF_NODEV;
4125883Sbloom }
4225883Sbloom signal(SIGALRM, alarmtr);
4325883Sbloom getnextfd();
4425883Sbloom alarm(10);
4525883Sbloom dh = open(dcname, 2);
4625883Sbloom alarm(0);
4725883Sbloom
4825883Sbloom /* modem is open */
4925883Sbloom next_fd = -1;
5025883Sbloom if (dh < 0) {
5125883Sbloom delock(dev->D_line);
5225883Sbloom return CF_NODEV;
5325883Sbloom }
5425883Sbloom fixline(dh, dev->D_speed);
5525883Sbloom
5625883Sbloom DEBUG(4, "calling %s -> ", telno);
5725883Sbloom if (dochat(dev, flds, dh)) {
5825883Sbloom logent(dcname, "CHAT FAILED");
5925883Sbloom cdscls224(dh);
6025883Sbloom return CF_DIAL;
6125883Sbloom }
6225883Sbloom for(i = 0; i < TRYS; ++i) {
6325883Sbloom /* wake up Concord */
6425883Sbloom write(dh, "\r\r", 2);
6525883Sbloom DEBUG(4, "wanted CDS >", CNULL);
6625883Sbloom ok = expect("CDS >", dh);
6725883Sbloom DEBUG(4, "got %s\n", ok ? "?" : "that");
6825883Sbloom if (ok != 0)
6925883Sbloom continue;
7025883Sbloom
7125883Sbloom write(dh, "\r", 2);
7225883Sbloom DEBUG(4, "wanted CDS >", CNULL);
7325883Sbloom ok = expect("CDS >", dh);
7425883Sbloom DEBUG(4, "got %s\n", ok ? "?" : "that");
7525883Sbloom if (ok != 0)
7625883Sbloom continue;
7725883Sbloom
7825883Sbloom /* send telno \r */
7925883Sbloom sprintf(tempbuf,"D%s\r",telno);
8025883Sbloom write(dh, tempbuf, strlen(tempbuf));
8125883Sbloom
8225883Sbloom DEBUG(4, "wanted DIALING ", CNULL);
8325883Sbloom ok = expect("DIALING ", dh);
8425883Sbloom DEBUG(4, "got %s\n", ok ? "?" : "that");
8525883Sbloom if (ok == 0)
8625883Sbloom break;
8725883Sbloom }
8825883Sbloom
8925883Sbloom if (ok == 0) {
9025883Sbloom sleep(10); /* give concord some time */
9125883Sbloom DEBUG(4, "wanted INITIATING " , CNULL);
9225883Sbloom ok = expect("INITIATING", dh);
9325883Sbloom DEBUG(4, "got %s\n", ok ? "?" : "that");
9425883Sbloom }
9525883Sbloom
9625883Sbloom if (ok != 0) {
9725883Sbloom if (dh > 2)
9825883Sbloom close(dh);
9925883Sbloom DEBUG(4, "conDial failed\n", CNULL);
10025883Sbloom delock(dev->D_line);
10125883Sbloom return CF_DIAL;
10225883Sbloom }
10325883Sbloom DEBUG(4, "concord ok\n", CNULL);
10425883Sbloom return dh;
10525883Sbloom }
10625883Sbloom
cdscls224(fd)10725883Sbloom cdscls224(fd)
10825883Sbloom {
10925883Sbloom
11025883Sbloom if (fd > 0) {
11125883Sbloom close(fd);
11225883Sbloom sleep(5);
11325883Sbloom delock(devSel);
11425883Sbloom }
11525883Sbloom }
116