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