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