1 /*- 2 * Copyright (c) 1985 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.proprietary.c% 6 */ 7 8 #ifndef lint 9 static char sccsid[] = "@(#)cds224.c 1.4 (Berkeley) 04/24/91"; 10 #endif /* not lint */ 11 12 #include "condevs.h" 13 14 /* 15 * conopn: establish dial-out connection through a Concord CDS 224. 16 * Returns descriptor open to tty for reading and writing. 17 * Negative values (-1...-7) denote errors in connmsg. 18 * Be sure to disconnect tty when done, via HUPCL or stty 0. 19 */ 20 #define TRYS 5 /* number of trys */ 21 22 cdsopn224(telno, flds, dev) 23 char *telno; 24 char *flds[]; 25 struct Devices *dev; 26 { 27 int dh = -1; 28 int i, ok, er = 0, delay; 29 extern errno; 30 char dcname[20]; 31 char tempbuf[20]; 32 33 sprintf(dcname, "/dev/%s", dev->D_line); 34 if (setjmp(Sjbuf)) { 35 DEBUG(1, "timeout concord open\n", ""); 36 logent("concord open", "TIMEOUT"); 37 if (dh >= 0) 38 cdscls224(dh); 39 delock(dev->D_line); 40 return CF_NODEV; 41 } 42 signal(SIGALRM, alarmtr); 43 getnextfd(); 44 alarm(10); 45 dh = open(dcname, 2); 46 alarm(0); 47 48 /* modem is open */ 49 next_fd = -1; 50 if (dh < 0) { 51 delock(dev->D_line); 52 return CF_NODEV; 53 } 54 fixline(dh, dev->D_speed); 55 56 DEBUG(4, "calling %s -> ", telno); 57 if (dochat(dev, flds, dh)) { 58 logent(dcname, "CHAT FAILED"); 59 cdscls224(dh); 60 return CF_DIAL; 61 } 62 for(i = 0; i < TRYS; ++i) { 63 /* wake up Concord */ 64 write(dh, "\r\r", 2); 65 DEBUG(4, "wanted CDS >", CNULL); 66 ok = expect("CDS >", dh); 67 DEBUG(4, "got %s\n", ok ? "?" : "that"); 68 if (ok != 0) 69 continue; 70 71 write(dh, "\r", 2); 72 DEBUG(4, "wanted CDS >", CNULL); 73 ok = expect("CDS >", dh); 74 DEBUG(4, "got %s\n", ok ? "?" : "that"); 75 if (ok != 0) 76 continue; 77 78 /* send telno \r */ 79 sprintf(tempbuf,"D%s\r",telno); 80 write(dh, tempbuf, strlen(tempbuf)); 81 82 DEBUG(4, "wanted DIALING ", CNULL); 83 ok = expect("DIALING ", dh); 84 DEBUG(4, "got %s\n", ok ? "?" : "that"); 85 if (ok == 0) 86 break; 87 } 88 89 if (ok == 0) { 90 sleep(10); /* give concord some time */ 91 DEBUG(4, "wanted INITIATING " , CNULL); 92 ok = expect("INITIATING", dh); 93 DEBUG(4, "got %s\n", ok ? "?" : "that"); 94 } 95 96 if (ok != 0) { 97 if (dh > 2) 98 close(dh); 99 DEBUG(4, "conDial failed\n", CNULL); 100 delock(dev->D_line); 101 return CF_DIAL; 102 } 103 DEBUG(4, "concord ok\n", CNULL); 104 return dh; 105 } 106 107 cdscls224(fd) 108 { 109 110 if (fd > 0) { 111 close(fd); 112 sleep(5); 113 delock(devSel); 114 } 115 } 116