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[] = "@(#)dn.c 8.1 (Berkeley) 06/06/93"; 10 #endif /* not lint */ 11 12 #include "condevs.h" 13 #define ACULAST "-<" 14 15 /*** 16 * dnopn(ph, flds, dev) dial remote machine 17 * 18 * return codes: 19 * file descriptor - succeeded 20 * FAIL - failed 21 */ 22 dnopn(ph, flds, dev) 23 char *ph; 24 char *flds[]; 25 struct Devices *dev; 26 { 27 char dcname[20], dnname[20], phone[MAXPH+2], c = 0; 28 #ifdef USG 29 struct termio ttbuf; 30 #endif USG 31 int dnf, dcf; 32 int nw, lt, pid, status; 33 unsigned timelim; 34 #ifdef TIOCFLUSH 35 int zero = 0; 36 #endif TIOCFLUSH 37 38 sprintf(dnname, "/dev/%s", dev->D_calldev); 39 errno = 0; 40 41 if (setjmp(Sjbuf)) { 42 logent(dnname, "CAN'T OPEN"); 43 DEBUG(4, "%s Open timed out\n", dnname); 44 return(CF_NODEV); 45 } 46 signal(SIGALRM, alarmtr); 47 getnextfd(); 48 alarm(10); 49 dnf = open(dnname, 1); 50 alarm(0); 51 next_fd = -1; 52 if (dnf < 0 && errno == EACCES) { 53 logent(dnname, "CAN'T OPEN"); 54 logent("DEVICE", "NO"); 55 return CF_NODEV; 56 } 57 fioclex(dnf); 58 59 sprintf(dcname, "/dev/%s", dev->D_line); 60 sprintf(phone, "%s%s", ph, ACULAST); 61 DEBUG(4, "dc - %s, ", dcname); 62 DEBUG(4, "acu - %s\n", dnname); 63 pid = 0; 64 if (setjmp(Sjbuf)) { 65 logent("DIALUP DN write", "TIMEOUT"); 66 if (pid) 67 kill(pid, 9); 68 delock(dev->D_line); 69 if (dnf) 70 close(dnf); 71 return CF_DIAL; 72 } 73 signal(SIGALRM, alarmtr); 74 timelim = 5 * strlen(phone); 75 alarm(timelim < 30 ? 30 : timelim); 76 if ((pid = fork()) == 0) { 77 sleep(2); 78 fclose(stdin); 79 fclose(stdout); 80 #ifdef TIOCFLUSH 81 ioctl(dnf, TIOCFLUSH, &zero); 82 #endif TIOCFLUSH 83 nw = write(dnf, phone, lt = strlen(phone)); 84 if (nw != lt) { 85 logent("DIALUP ACU write", _FAILED); 86 exit(1); 87 } 88 DEBUG(4, "ACU write ok\n", CNULL); 89 exit(0); 90 } 91 /* open line - will return on carrier */ 92 /* RT needs a sleep here because it returns immediately from open */ 93 94 #if RT 95 sleep(15); 96 #endif 97 98 getnextfd(); 99 errno = 0; 100 dcf = open(dcname, 2); 101 next_fd = -1; 102 if (dcf < 0 && errno == EACCES) 103 logent(dcname, "CAN'T OPEN"); 104 DEBUG(4, "dcf is %d\n", dcf); 105 if (dcf < 0) { 106 logent("DIALUP LINE open", _FAILED); 107 alarm(0); 108 kill(pid, 9); 109 close(dnf); 110 delock(dev->D_line); 111 return CF_DIAL; 112 } 113 while ((nw = wait(<)) != pid && nw != -1) 114 ; 115 #ifdef USG 116 ioctl(dcf, TCGETA, &ttbuf); 117 if(!(ttbuf.c_cflag & HUPCL)) { 118 ttbuf.c_cflag |= HUPCL; 119 ioctl(dcf, TCSETA, &ttbuf); 120 } 121 #endif USG 122 alarm(0); 123 fflush(stdout); 124 fixline(dcf, dev->D_speed); 125 DEBUG(4, "Fork Stat %o\n", lt); 126 if (lt != 0) { 127 close(dcf); 128 if (dnf) 129 close(dnf); 130 delock(dev->D_line); 131 return CF_DIAL; 132 } 133 return dcf; 134 } 135 136 /*** 137 * dncls() close dn type call unit 138 * 139 * return codes: None 140 */ 141 dncls(fd) 142 register int fd; 143 { 144 if (fd > 0) { 145 close(fd); 146 sleep(5); 147 delock(devSel); 148 } 149 } 150