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