1 #ifndef lint 2 static char sccsid[] = "@(#)nov.c 4.2 (Berkeley) 02/24/88"; 3 #endif 4 5 #include "../condevs.h" 6 7 /*** 8 * novopn(telno, flds, dev) connect to novation Smart-Cat 9 * (similar to hayes smartmodem) 10 * char *flds[], *dev[]; 11 * 12 * return codes: 13 * >0 - file number - ok 14 * CF_DIAL,CF_DEVICE - failed 15 */ 16 17 novopn(telno, flds, dev) 18 char *telno; 19 char *flds[]; 20 struct Devices *dev; 21 { 22 int dh = -1; 23 extern errno; 24 char dcname[20]; 25 int pulse = 0; 26 27 sprintf(dcname, "/dev/%s", dev->D_line); 28 DEBUG(4, "dc - %s\n", dcname); 29 if (strcmp(dev->D_calldev, "pulse") == 0) 30 pulse = 1; 31 if (setjmp(Sjbuf)) { 32 DEBUG(1, "timeout novation open %s\n", dcname); 33 logent("novation open", "TIMEOUT"); 34 if (dh >= 0) 35 close(dh); 36 delock(dev->D_line); 37 return CF_DIAL; 38 } 39 signal(SIGALRM, alarmtr); 40 getnextfd(); 41 alarm(10); 42 dh = open(dcname, 2); /* read/write */ 43 alarm(0); 44 45 /* modem is open */ 46 next_fd = -1; 47 if (dh >= 0) { 48 fixline(dh, dev->D_speed); 49 /* set guard time small so line is in transparant mode */ 50 slowrite(dh, "\rATS12=1\r"); 51 if (expect("OK", dh) != 0) { 52 logent("NOV no line", _FAILED); 53 strcpy(devSel, dev->D_line); 54 novcls(dh); 55 return CF_DIAL; 56 } 57 58 if (pulse) 59 slowrite(dh, "ATDP"); 60 else 61 slowrite(dh, "ATDT"); 62 slowrite(dh, telno); 63 slowrite(dh, "\r"); 64 65 if (expect("CONNECT", dh) != 0) { 66 logent("NOV no carrier", _FAILED); 67 strcpy(devSel, dev->D_line); 68 novcls(dh); 69 return CF_DIAL; 70 } 71 72 } 73 if (dh < 0) { 74 DEBUG(4, "novation failed\n", CNULL); 75 delock(dev->D_line); 76 } 77 DEBUG(4, "novation ok\n", CNULL); 78 return dh; 79 } 80 81 novcls(fd) 82 int fd; 83 { 84 char dcname[20]; 85 struct sgttyb hup, sav; 86 87 if (fd > 0) { 88 sprintf(dcname, "/dev/%s", devSel); 89 DEBUG(4, "Hanging up fd = %d\n", fd); 90 /* 91 * code to drop DTR -- change to 0 baud then back to default. 92 */ 93 gtty(fd, &hup); 94 gtty(fd, &sav); 95 hup.sg_ispeed = B0; 96 hup.sg_ospeed = B0; 97 stty(fd, &hup); 98 sleep(2); 99 stty(fd, &sav); 100 /* 101 * now raise DTR -- close the device & open it again. 102 */ 103 sleep(2); 104 close(fd); 105 sleep(2); 106 fd = open(dcname, 2); 107 /* 108 * Since we have a getty sleeping on this line, when it wakes up it sends 109 * all kinds of garbage to the modem. Unfortunatly, the modem likes to 110 * execute the previous command when it sees the garbage. The previous 111 * command was to dial the phone, so let's make the last command reset 112 * the modem. 113 */ 114 sleep(2); 115 slowrite(fd, "\rATZ\r"); 116 close(fd); 117 delock(devSel); 118 } 119 } 120