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
826153Sbloom #ifndef lint
9*62384Sbostic static char sccsid[] = "@(#)att2224.c 8.1 (Berkeley) 06/06/93";
1048651Sbostic #endif /* not lint */
1126153Sbloom
1246875Sbostic #include "condevs.h"
1326153Sbloom
attopn(telno,flds,dev)1426153Sbloom attopn(telno, flds, dev)
1526153Sbloom char *telno, *flds[];
1626153Sbloom struct Devices *dev;
1726153Sbloom {
1826153Sbloom char dcname[20], phone[MAXPH+10], c = 0;
1926153Sbloom int dnf, failret = 0, timelim;
2026153Sbloom
2126153Sbloom sprintf(dcname, "/dev/%s", dev->D_line);
2226153Sbloom
2326153Sbloom if (setjmp(Sjbuf)) {
2426153Sbloom delock(dev->D_line);
2526153Sbloom logent("DEVICE", "NO");
2626153Sbloom DEBUG(4, "Open timed out %s", dcname);
2726153Sbloom alarm (0);
2826153Sbloom return CF_NODEV;
2926153Sbloom }
3026153Sbloom
3126153Sbloom signal(SIGALRM, alarmtr);
3226153Sbloom getnextfd();
3326153Sbloom alarm(10);
3426153Sbloom
3526153Sbloom if ((dnf = open(dcname, 2)) <= 0) {
3626153Sbloom delock(dev->D_line);
3726153Sbloom logent("DEVICE", "NO");
3826153Sbloom DEBUG(4, "Can't open %s", dcname);
3926153Sbloom alarm (0);
4026153Sbloom return CF_NODEV;
4126153Sbloom }
4226153Sbloom
4326153Sbloom alarm(0);
4426153Sbloom next_fd = -1;
4526153Sbloom fixline(dnf, dev->D_speed);
4626153Sbloom DEBUG(4, "modem port - %s\n", dcname);
4726153Sbloom
4826153Sbloom if (setjmp(Sjbuf)) {
4926153Sbloom delock(dev->D_line);
5026153Sbloom logent("ACU WRITE", "FAILED");
5126153Sbloom return CF_DIAL;
5226153Sbloom }
5326153Sbloom signal(SIGALRM, alarmtr);
5426153Sbloom alarm(10);
5526153Sbloom do {
5626153Sbloom slowrite(dnf, "\r"); /* wake up modem */
5726153Sbloom } while (expect(":~3", dnf));
5826153Sbloom alarm(0);
5926153Sbloom
6026153Sbloom sprintf (phone, "atzt%s\r", telno);
6126153Sbloom slowrite (dnf, phone); /* type telno string to modem */
6226153Sbloom
6326153Sbloom if ((expect(phone, dnf)) != SUCCESS) {
6426153Sbloom delock(dev->D_line);
6526153Sbloom logent("ACU READ", "FAILED");
6626153Sbloom return CF_DIAL;
6726153Sbloom }
6826153Sbloom
6926153Sbloom if (setjmp(Sjbuf)) {
7026153Sbloom delock(dev->D_line);
7126153Sbloom logent("NO ANSWER", "FAILED");
7226153Sbloom alarm (0);
7326153Sbloom return CF_DIAL;
7426153Sbloom }
7526153Sbloom timelim = strlen(telno) * 4;
7626153Sbloom signal(SIGALRM, alarmtr);
7726153Sbloom alarm(timelim > 30 ? timelim : 30);
7826153Sbloom
7926153Sbloom readchar:
8026153Sbloom if ((read(dnf, &c, 1)) != 1) {
8126153Sbloom delock(dev->D_line);
8226153Sbloom logent("ACU READ", "FAILED");
8326153Sbloom return CF_DIAL;
8426153Sbloom }
8526153Sbloom
8626153Sbloom switch (c) {
8726153Sbloom case 'D': /* no dial tone */
8826153Sbloom logent("NO DIAL TONE", "FAILED");
8926153Sbloom failret++;
9026153Sbloom break;
9126153Sbloom case 'B': /* line busy */
9226153Sbloom logent("LINE BUSY", "FAILED");
9326153Sbloom failret++;
9426153Sbloom break;
9526153Sbloom case 'N': /* no answer */
9626153Sbloom logent("NO ANSWER", "FAILED");
9726153Sbloom failret++;
9826153Sbloom break;
9926153Sbloom case 'H': /* handshake failed */
10026153Sbloom logent("MODEM HANDSHAKE", "FAILED");
10126153Sbloom failret++;
10226153Sbloom break;
10326153Sbloom case '3': /* 2400 baud */
10426153Sbloom DEBUG(4, "Baudrate set to 2400 baud", CNULL);
10526153Sbloom fixline(dnf, 2400);
10626153Sbloom break;
10726153Sbloom case '2': /* 1200 baud */
10826153Sbloom DEBUG(4, "Baudrate set to 1200 baud", CNULL);
10926153Sbloom fixline(dnf, 1200);
11026153Sbloom break;
11126153Sbloom case '1': /* 300 baud */
11226153Sbloom DEBUG(4, "Baudrate set to 300 baud", CNULL);
11326153Sbloom fixline(dnf, 300);
11426153Sbloom break;
11526153Sbloom default: /* Not one of the above, so must be garbage */
11626153Sbloom goto readchar;
11726153Sbloom }
11826153Sbloom if (failret) {
11926153Sbloom alarm (0);
12026153Sbloom delock(dev->D_line);
12126153Sbloom return CF_DIAL;
12226153Sbloom }
12326153Sbloom alarm (0);
12426153Sbloom return dnf;
12526153Sbloom }
12626153Sbloom
attcls(fd)12726153Sbloom attcls(fd)
12826153Sbloom int fd;
12926153Sbloom {
13026153Sbloom char dcname[20];
13126153Sbloom #ifdef USG
13226153Sbloom struct termio hup, sav;
13326153Sbloom #else !USG
13426153Sbloom struct sgttyb hup, sav;
13526153Sbloom #endif !USG
13626153Sbloom
13726153Sbloom if (fd > 0) {
13826153Sbloom sprintf(dcname, "/dev/%s", devSel);
13926153Sbloom DEBUG(4, "Hanging up fd = %d\n", fd);
14026153Sbloom /*
14126153Sbloom * code to drop DTR -- change to 0 baud then back to default.
14226153Sbloom */
14326153Sbloom gtty(fd, &hup);
14426153Sbloom gtty(fd, &sav);
14526153Sbloom #ifdef USG
14626153Sbloom hup.c_cflag = B0;
14726153Sbloom #else !USG
14826153Sbloom hup.sg_ispeed = B0;
14926153Sbloom hup.sg_ospeed = B0;
15026153Sbloom #endif !USG
15126153Sbloom stty(fd, &hup);
15226153Sbloom sleep(2);
15326153Sbloom stty(fd, &sav);
15426153Sbloom /*
15526153Sbloom * now raise DTR -- close the device
15626153Sbloom */
15726153Sbloom sleep(2);
15826153Sbloom close(fd);
15926153Sbloom delock(devSel);
16026153Sbloom }
16126153Sbloom }
162