1 #ifndef lint 2 static char sccsid[] = "@(#)df12.c 4.1 (Berkeley) 04/03/85"; 3 #endif 4 5 #include "../condevs.h" 6 7 #ifdef DF112 8 /* 9 * df12popn(telno, flds, dev) connect to df12 modem (pulse call) 10 * df12topn(telno, flds, dev) connect to df12 modem (tone call) 11 * char *flds[], *dev[]; 12 * 13 * return codes: 14 * >0 - file number - ok 15 * CF_DIAL,CF_NODEV - failed 16 */ 17 18 df12popn (telno, flds, dev) 19 char *telno, 20 *flds[]; 21 struct Devices *dev; 22 { 23 return df12opn (telno, flds, dev, 0); 24 } 25 26 df12topn (telno, flds, dev) 27 char *telno, 28 *flds[]; 29 struct Devices *dev; 30 { 31 return df12opn (telno, flds, dev, 1); 32 } 33 34 /* ARGSUSED */ 35 df12opn (telno, flds, dev, toneflag) 36 char *telno; 37 char *flds[]; 38 struct Devices *dev; 39 int toneflag; 40 { 41 int phindex, dh = -1; 42 extern errno; 43 char dcname[20], newphone[64]; 44 45 sprintf (dcname, "/dev/%s", dev -> D_line); 46 DEBUG (4, "dc - %s\n", dcname); 47 if (setjmp (Sjbuf)) 48 { 49 logent (dcname, "TIMEOUT"); 50 if (dh >= 0) 51 close (dh); 52 return CF_DIAL; 53 } 54 signal (SIGALRM, alarmtr); 55 getnextfd (); 56 alarm (10); 57 dh = open (dcname, 2);/* read/write */ 58 alarm (0); 59 60 /* modem is open */ 61 62 /* First, adjust our phone number string. These modems don't 63 * like any characters but digits and "=" signs (for delay) 64 */ 65 for (phindex = 0; *telno; telno++) 66 { 67 if (*telno == '=' || (*telno >= '0' && *telno <= '9')) 68 newphone[phindex++] = *telno; 69 if (phindex == 64) 70 { 71 logent (dcname, "Phone number too long"); 72 close (dh); 73 return CF_DIAL; 74 } 75 } 76 newphone[phindex] = '\0'; 77 next_fd = -1; 78 if (dh >= 0) 79 { 80 fixline (dh, dev -> D_speed); 81 if (dochat (dev, flds, dh)) 82 { 83 logent (dcname, "CHAT FAILED"); 84 close (dh); 85 return CF_DIAL; 86 } 87 slowrite (dh, "\02"); 88 if (expect ("Ready\r\n", dh) != 0) 89 { 90 DEBUG (4, "Didn't get 'Ready' response.\n", NULL); 91 logent (dcname, "Modem not responding"); 92 close (dh); 93 return CF_DIAL; 94 } 95 DEBUG (4, "Got 'Ready' response\n", NULL); 96 DEBUG (7, "Writing control select flag %c\n", toneflag ? 'T' : 'P'); 97 slowrite (dh, toneflag ? "T" : "P"); 98 DEBUG (4, "Writing telephone number %s\n", newphone); 99 slowrite (dh, newphone); 100 DEBUG (7, "Telephone number written\n", NULL); 101 slowrite (dh, "#"); 102 DEBUG (7, "Writing # sign\n", NULL); 103 104 if (expect ("Attached\r\n", dh) != 0) 105 { 106 logent (dcname, "No carrier"); 107 strcpy (devSel, dev -> D_line); 108 df12cls (dh); 109 return CF_DIAL; 110 } 111 112 } 113 if (dh < 0) 114 { 115 logent (dcname, "CAN'T OPEN"); 116 return CF_NODEV; 117 } 118 else 119 { 120 DEBUG (4, "df12 ok\n", CNULL); 121 return dh; 122 } 123 } 124 125 df12cls (fd) 126 int fd; 127 { 128 char dcname[20]; 129 struct sgttyb hup, 130 sav; 131 132 if (fd > 0) 133 { 134 sprintf (dcname, "/dev/%s", devSel); 135 DEBUG (4, "Hanging up fd = %d\n", fd); 136 /* 137 * code to drop DTR -- change to 0 baud then back to default. 138 */ 139 gtty (fd, &hup); 140 gtty (fd, &sav); 141 hup.sg_ispeed = B0; 142 hup.sg_ospeed = B0; 143 stty (fd, &hup); 144 sleep (2); 145 stty (fd, &sav); 146 /* 147 * now raise DTR -- close the device & open it again. 148 */ 149 sleep (2); 150 close (fd); 151 sleep (2); 152 delock (devSel); 153 } 154 } 155 156 #endif DF112 157