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[] = "@(#)va212.c 8.1 (Berkeley) 06/06/93"; 10 #endif /* not lint */ 11 12 #include "condevs.h" 13 14 va212opn(telno, flds, dev) 15 char *telno; 16 char *flds[]; 17 struct Devices *dev; 18 { 19 int dh = -1; 20 int i, ok, er = 0, delay; 21 extern errno; 22 char dcname[20]; 23 24 sprintf(dcname, "/dev/%s", dev->D_line); 25 if (setjmp(Sjbuf)) { 26 DEBUG(1, "timeout va212 open\n", 0); 27 logent("va212 open", "TIMEOUT"); 28 if (dh >= 0) 29 close(dh); 30 delock(dev->D_line); 31 return CF_NODEV; 32 } 33 signal(SIGALRM, alarmtr); 34 getnextfd(); 35 alarm(10); 36 dh = open(dcname, 2); 37 alarm(0); 38 39 /* modem is open */ 40 next_fd = -1; 41 if (dh < 0) { 42 DEBUG (4, errno == 4 ? "%s: no carrier\n" : "%s: can't open\n", 43 dcname); 44 delock(dev->D_line); 45 return errno == 4 ? CF_DIAL : CF_NODEV; 46 } 47 fixline(dh, dev->D_speed); 48 49 /* translate - to K for Vadic */ 50 DEBUG(4, "calling %s -> ", telno); 51 delay = 0; 52 for (i = 0; i < strlen(telno); ++i) { 53 switch(telno[i]) { 54 case '=': /* await dial tone */ 55 case '-': /* delay */ 56 case '<': 57 telno[i] = 'K'; 58 delay += 5; 59 break; 60 } 61 } 62 DEBUG(4, "%s\n", telno); 63 for(i = 0; i < TRYCALLS; ++i) { /* make TRYCALLS tries */ 64 /* wake up Vadic */ 65 sendthem("\005\\d", dh); 66 DEBUG(4, "wanted * ", CNULL); 67 ok = expect("*", dh); 68 DEBUG(4, "got %s\n", ok ? "?" : "that"); 69 if (ok != 0) 70 continue; 71 72 sendthem("D\\d", dh); /* "D" (enter number) command */ 73 DEBUG(4, "wanted NUMBER? ", CNULL); 74 ok = expect("NUMBER?", dh); 75 if (ok == 0) 76 ok = expect("\n", dh); 77 DEBUG(4, "got %s\n", ok ? "?" : "that"); 78 if (ok != 0) 79 continue; 80 81 /* send telno, send \r */ 82 sendthem(telno, dh); 83 DEBUG(4, "wanted %s ", telno); 84 ok = expect(telno, dh); 85 if (ok == 0) 86 ok = expect("\n", dh); 87 DEBUG(4, "got %s\n", ok ? "?" : "that"); 88 if (ok != 0) 89 continue; 90 91 sendthem("", dh); /* confirm number */ 92 DEBUG(4, "wanted %s ", "DIALING..."); 93 ok = expect("DIALING...", dh); 94 if (ok == 0) { 95 ok = expect("\n", dh); 96 DEBUG(4, "wanted ANSWER TONE", CNULL); 97 ok = expect("ANSWER TONE", dh); 98 if (ok == 0) 99 ok = expect("\n", dh); 100 } 101 DEBUG(4, "got %s\n", ok ? "?" : "that"); 102 if (ok == 0) 103 break; 104 } 105 106 if (ok == 0) { 107 DEBUG(4, "wanted ON LINE\\r\\n ", CNULL); 108 ok = expect("ON LINE\r\n", dh); 109 DEBUG(4, "got %s\n", ok ? "?" : "that"); 110 } 111 112 if (ok != 0) { 113 sendthem("I\\d", dh); /* back to idle */ 114 if (dh > 2) 115 close(dh); 116 DEBUG(4, "vadDial failed\n", CNULL); 117 delock(dev->D_line); 118 return CF_DIAL; 119 } 120 DEBUG(4, "va212 ok\n", 0); 121 return dh; 122 } 123 124 va212cls(fd) 125 { 126 if (fd > 0) { 127 close(fd); 128 sleep(5); 129 delock(devSel); 130 } 131 } 132