1 #ifndef lint 2 static char sccsid[] = "@(#)sy.c 4.3 (Berkeley) 03/02/91"; 3 #endif 4 5 #include "condevs.h" 6 7 #ifdef SYTEK 8 9 /* 10 * sykopn: establish connection through a sytek port. 11 * Returns descriptor open to tty for reading and writing. 12 * Negative values (-1...-7) denote errors in connmsg. 13 * Will try to change baud rate of local port to match 14 * that of the remote side. 15 */ 16 char sykspeed[50]; /* speed to reset to on close */ 17 18 sykopn(flds) 19 register char *flds[]; 20 { 21 extern errno; 22 char *rindex(), *fdig(), dcname[20]; 23 int dh, ok = 0, speed; 24 register FILE *dfp; 25 struct Devices dev; 26 char speedbuf[50]; 27 28 dfp = fopen(DEVFILE, "r"); 29 ASSERT(dfp != NULL, "Can't open", DEVFILE, 0); 30 31 signal(SIGALRM, alarmtr); 32 dh = -1; 33 while(rddev(dfp, &dev) != FAIL) { 34 /* we'll set our own speed; F_CLASS is how cynthia configures it every night 35 if (strcmp(flds[F_CLASS], dev.D_class) != SAME) 36 continue; 37 */ 38 if (snccmp(flds[F_LINE], dev.D_type) != SAME) 39 continue; 40 if (mlock(dev.D_line) == FAIL) 41 continue; 42 43 sprintf(dcname, "/dev/%s", dev.D_line); 44 getnextfd(); 45 alarm(10); 46 if (setjmp(Sjbuf)) { 47 delock(dev.D_line); 48 logent(dev.D_line,"sytek open TIMEOUT"); 49 dh = -1; 50 break; 51 } 52 dh = open(dcname, 2); 53 alarm(0); 54 next_fd = -1; 55 if (dh > 0) { 56 break; 57 } 58 devSel[0] = '\0'; 59 delock(dev.D_line); 60 } 61 fclose(dfp); 62 if (dh < 0) 63 return(CF_NODEV); 64 65 speed = atoi(fdig(dev.D_class)); 66 fixline(dh, speed); 67 sleep(1); 68 69 /* negotiate with sytek */ 70 genbrk(dh, 3); 71 72 DEBUG(4, "wanted %s ", "#"); 73 ok = expect("#", dh); 74 DEBUG(4, "got %s\n", ok ? "?" : "that"); 75 if(ok != 0){ 76 if(atoi(fdig(dev.D_class)) == 9600){ 77 fixline(dh, 2400); 78 speed = 2400; 79 } else { 80 fixline(dh, 9600); 81 speed = 9600; 82 } 83 sleep(1); 84 genbrk(dh, 3); 85 ok = expect("#", dh); 86 if(ok){ 87 close(dh); 88 DEBUG(4, "sytek BREAK failed\n", ""); 89 delock(dev.D_line); 90 return(CF_DIAL); 91 } 92 } 93 write(dh, "done \r", 6); 94 ok = expect("#", dh); 95 DEBUG(4, "got %s\n", ok ? "?" : "that"); 96 if(speed != atoi(fdig(flds[F_CLASS]))){ 97 DEBUG(4, "changing speed\n", ""); 98 sprintf(speedbuf, "baud %s\r", fdig(flds[F_CLASS])); 99 write(dh, speedbuf, strlen(speedbuf)); 100 sleep(1); 101 speed = atoi(fdig(flds[F_CLASS])); 102 fixline(dh, speed); 103 genbrk(dh, 3); 104 ok = expect("#", dh); 105 DEBUG(4, "speed set %s\n", ok ? "failed" : flds[F_CLASS]); 106 } 107 strcpy(sykspeed, dev.D_class); 108 write(dh, "command break\r", 14); 109 ok = expect("#", dh); 110 DEBUG(4, "got %s\n", ok ? "?" : "that"); 111 if (ok == 0) { 112 write(dh, "call ", 5); 113 write(dh, flds[F_PHONE], strlen(flds[F_PHONE])); 114 write(dh, "\r", 1); 115 DEBUG(4, "sytek dial %s\n", flds[F_PHONE]); 116 DEBUG(4, "wanted %s ", "COMPLETED TO "); 117 ok = expect("COMPLETED TO ", dh); 118 DEBUG(4, "got %s\n", ok ? "?" : "that"); 119 } 120 121 if (ok != 0) { 122 close(dh); 123 DEBUG(4, "sytek failed\n", ""); 124 delock(dev.D_line); 125 return(CF_DIAL); 126 } else 127 DEBUG(4, "sytek ok\n", ""); 128 129 CU_end = sykcls; 130 strcpy(devSel, dev.D_line); /* for later unlock */ 131 return(dh); 132 133 } 134 135 sykcls(fd) 136 register int fd; 137 { 138 register int ok, speed; 139 140 141 if (fd > 0) { 142 genbrk(fd, 3); 143 ok = expect("#", fd); 144 DEBUG(4, "got %s\n", ok ? "?" : "that"); 145 if(ok != 0){ 146 genbrk(fd, 3); 147 ok = expect("#", fd); 148 } 149 if(ok == 0){ 150 write(fd, "done 1\r", 7); 151 ok = expect("#", fd); 152 DEBUG(4, "got %s\n", ok ? "?" : "that"); 153 DEBUG(4, "reset baud to %s\n", sykspeed); 154 write(fd, "baud ", 5); 155 write(fd, sykspeed, strlen(sykspeed)); 156 write(fd, "\r", 1); 157 sleep(1); 158 } 159 close(fd); 160 delock(devSel); 161 } 162 } 163 #endif SYTEK 164