|
|
1.1 ! root 1: /* %W% ! 2: */ ! 3: #include "uucp.h" ! 4: VERSION(%W%); ! 5: ! 6: #ifdef BSD4_2 ! 7: #include <netdb.h> ! 8: #include <netinet/in.h> ! 9: #include <sys/socket.h> ! 10: #endif ! 11: #ifdef UNET ! 12: #include "UNET/unetio.h" ! 13: #include "UNET/tcp.h" ! 14: #endif ! 15: #if defined V8 && defined TCP ! 16: #include <sys/inet/in.h> ! 17: #include <sys/inet/tcp_user.h> ! 18: #endif ! 19: ! 20: ! 21: int alarmtr(); ! 22: extern jmp_buf Sjbuf; ! 23: extern char *fdig(); ! 24: ! 25: /* ! 26: * to add a new caller: ! 27: * declare the function that knows how to call on the device, ! 28: * add a line to the callers table giving the name of the device ! 29: * (from Devices file) and the name of the function ! 30: * add the function to the end of this file ! 31: */ ! 32: ! 33: #ifdef DIAL801 ! 34: int dial801(); ! 35: #endif ! 36: ! 37: #ifdef DATAKIT ! 38: int dkcall(); ! 39: #endif ! 40: ! 41: #ifdef CSERV ! 42: int cscall(); ! 43: #endif ! 44: ! 45: #ifdef V8 ! 46: int Dialout(); ! 47: #endif ! 48: ! 49: #ifdef TCP ! 50: int unetcall(); ! 51: int tcpcall(); ! 52: #endif ! 53: ! 54: #ifdef SYTEK ! 55: int sytcall(); ! 56: #endif ! 57: ! 58: struct caller Caller[] = { ! 59: ! 60: #ifdef DIAL801 ! 61: {"801", dial801}, ! 62: {"212", dial801}, ! 63: #endif ! 64: ! 65: #ifdef V8 ! 66: {"Dialout", Dialout}, /* ditto but using dialout(III) */ ! 67: #endif ! 68: ! 69: #ifdef TCP ! 70: #if defined BSD4_2 || defined V8 ! 71: {"TCP", tcpcall}, /* 4.2BSD sockets */ ! 72: #else ! 73: #ifdef UNET ! 74: {"TCP", unetcall}, /* 3com implementation of tcp */ ! 75: {"Unetserver", unetcall}, ! 76: #endif ! 77: #endif ! 78: #endif ! 79: ! 80: #ifdef DATAKIT ! 81: {"DK", dkcall}, /* standard AT&T DATAKIT VCS caller */ ! 82: #endif ! 83: ! 84: #ifdef CSERV ! 85: {"CS", cscall}, /* presotto connection server */ ! 86: #endif ! 87: ! 88: #ifdef SYTEK ! 89: {"Sytek", sytcall}, /* untested but should work */ ! 90: #endif ! 91: ! 92: {NULL, NULL} /* this line must be last */ ! 93: }; ! 94: ! 95: /*** ! 96: * exphone - expand phone number for given prefix and number ! 97: * ! 98: * return code - none ! 99: */ ! 100: ! 101: static void ! 102: exphone(in, out) ! 103: char *in, *out; ! 104: { ! 105: FILE *fn; ! 106: char pre[MAXPH], npart[MAXPH], tpre[MAXPH], p[MAXPH]; ! 107: char buf[BUFSIZ]; ! 108: char *s1; ! 109: ! 110: if (!isalpha(*in)) { ! 111: (void) strcpy(out, in); ! 112: return; ! 113: } ! 114: ! 115: s1=pre; ! 116: while (isalpha(*in)) ! 117: *s1++ = *in++; ! 118: *s1 = NULLCHAR; ! 119: s1 = npart; ! 120: while (*in != NULLCHAR) ! 121: *s1++ = *in++; ! 122: *s1 = NULLCHAR; ! 123: ! 124: tpre[0] = NULLCHAR; ! 125: fn = fopen(DIALFILE, "r"); ! 126: if (fn != NULL) { ! 127: while (fgets(buf, BUFSIZ, fn)) { ! 128: if ( sscanf(buf, "%s%s", p, tpre) < 1) ! 129: continue; ! 130: if (EQUALS(p, pre)) ! 131: break; ! 132: tpre[0] = NULLCHAR; ! 133: } ! 134: fclose(fn); ! 135: } ! 136: ! 137: (void) strcpy(out, tpre); ! 138: (void) strcat(out, npart); ! 139: return; ! 140: } ! 141: ! 142: /* ! 143: * repphone - Replace \D and \T sequences in arg with phone ! 144: * expanding and translating as appropriate. ! 145: */ ! 146: static char * ! 147: repphone(arg, phone, trstr) ! 148: register char *arg, *phone, *trstr; ! 149: { ! 150: extern void translate(); ! 151: static char pbuf[2*(MAXPH+2)]; ! 152: register char *fp, *tp; ! 153: ! 154: for (tp=pbuf; *arg; arg++) { ! 155: if (*arg != '\\') { ! 156: *tp++ = *arg; ! 157: continue; ! 158: } else { ! 159: switch (*(arg+1)) { ! 160: case 'T': ! 161: exphone(phone, tp); ! 162: translate(trstr, tp); ! 163: for(; *tp; tp++) ! 164: ; ! 165: arg++; ! 166: break; ! 167: case 'D': ! 168: for(fp=phone; *tp = *fp++; tp++) ! 169: ; ! 170: arg++; ! 171: break; ! 172: default: ! 173: *tp++ = *arg; ! 174: break; ! 175: } ! 176: } ! 177: } ! 178: *tp = '\0'; ! 179: return(pbuf); ! 180: } ! 181: ! 182: /* ! 183: * processdev - Process a line from the Devices file ! 184: * ! 185: * return codes: ! 186: * file descriptor - succeeded ! 187: * FAIL - failed ! 188: */ ! 189: ! 190: processdev(flds, dev) ! 191: register char *flds[], *dev[]; ! 192: { ! 193: register int dcf = -1; ! 194: register struct caller *ca; ! 195: char *args[D_MAX+1], dcname[20]; ! 196: register char **sdev; ! 197: extern void translate(); ! 198: register nullfd; ! 199: char *phonecl; /* clear phone string */ ! 200: char phoneex[2*(MAXPH+2)]; /* expanded phone string */ ! 201: ! 202: sdev = dev; ! 203: for (ca = Caller; ca->CA_type != NULL; ca++) { ! 204: /* This will find built-in caller functions */ ! 205: if (EQUALS(ca->CA_type, dev[D_CALLER])) { ! 206: DEBUG(5, "Internal caller type %s\n", dev[D_CALLER]); ! 207: if (dev[D_ARG] == NULL) { ! 208: /* if NULL - assume translate */ ! 209: dev[D_ARG+1] = NULL; /* needed for for loop later to mark the end */ ! 210: dev[D_ARG] = "\\T"; ! 211: } ! 212: dev[D_ARG] = repphone(dev[D_ARG], flds[F_PHONE], ""); ! 213: if ((dcf = (*(ca->CA_caller))(flds, dev)) < 0) ! 214: return(dcf) ; ! 215: dev += 2; /* Skip to next CALLER and ARG */ ! 216: break; ! 217: } ! 218: } ! 219: if (dcf == -1) { ! 220: /* Here if not a built-in caller function */ ! 221: if (mlock(dev[D_LINE]) == FAIL) { /* Lock the line */ ! 222: DEBUG(5, "mlock %s failed\n", dev[D_LINE]); ! 223: Uerror = SS_LOCKED_DEVICE; ! 224: return(FAIL); ! 225: } ! 226: DEBUG(5, "mlock %s succeeded\n", dev[D_LINE]); ! 227: /* ! 228: * Open the line ! 229: */ ! 230: (void) sprintf(dcname, "/dev/%s", dev[D_LINE]); ! 231: /* take care of the possible partial open fd */ ! 232: (void) close(nullfd = open("/", 0)); ! 233: if (setjmp(Sjbuf)) { ! 234: (void) close(nullfd); ! 235: DEBUG(1, "generic open timeout\n", ""); ! 236: logent("generic open", "TIMEOUT"); ! 237: Uerror = SS_CANT_ACCESS_DEVICE; ! 238: goto bad; ! 239: } ! 240: (void) signal(SIGALRM, alarmtr); ! 241: (void) alarm(10); ! 242: dcf = open(dcname, 2); ! 243: (void) alarm(0); ! 244: if (dcf < 0) { ! 245: (void) close(nullfd); ! 246: DEBUG(1, "generic open failed, errno = %d\n", errno); ! 247: logent("generic open", "FAILED"); ! 248: Uerror = SS_CANT_ACCESS_DEVICE; ! 249: goto bad; ! 250: } ! 251: fixline(dcf, atoi(fdig(flds[F_CLASS])), D_DIRECT); ! 252: } ! 253: /* ! 254: * Now loop through the remaining callers and chat ! 255: * according to scripts in dialers file. ! 256: */ ! 257: for (; dev[D_CALLER] != NULL; dev += 2) { ! 258: register int w; ! 259: /* ! 260: * Scan Dialers file to find an entry ! 261: */ ! 262: if ((w = gdial(dev[D_CALLER], args, D_MAX)) < 1) { ! 263: DEBUG(1, "%s not found in Dialers file\n", dev[D_CALLER]); ! 264: logent("generic call to gdial", "FAILED"); ! 265: Uerror = SS_CANT_ACCESS_DEVICE; ! 266: goto bad; ! 267: } ! 268: if (w <= 2) /* do nothing - no chat */ ! 269: break; ! 270: /* ! 271: * Translate the phone number ! 272: */ ! 273: if (dev[D_ARG] == NULL) { ! 274: /* if NULL - assume no translation */ ! 275: dev[D_ARG+1] = NULL; /* needed for for loop to mark the end */ ! 276: dev[D_ARG] = "\\D"; ! 277: } ! 278: ! 279: phonecl = repphone(dev[D_ARG], flds[F_PHONE], args[1]); ! 280: exphone(phonecl, phoneex); ! 281: translate(args[1], phoneex); ! 282: /* ! 283: * Chat ! 284: */ ! 285: if (chat(w-2, &args[2], dcf, phonecl, phoneex) != SUCCESS) { ! 286: Uerror = SS_CHAT_FAILED; ! 287: goto bad; ! 288: } ! 289: } ! 290: /* ! 291: * Success at last! ! 292: */ ! 293: strcpy(Dc, sdev[D_LINE]); ! 294: return(dcf); ! 295: bad: ! 296: (void)close(dcf); ! 297: delock(sdev[D_LINE]); ! 298: return(FAIL); ! 299: } ! 300: ! 301: /* ! 302: * translate the pairs of characters present in the first ! 303: * string whenever the first of the pair appears in the second ! 304: * string. ! 305: */ ! 306: static void ! 307: translate(ttab, str) ! 308: register char *ttab, *str; ! 309: { ! 310: register char *s; ! 311: ! 312: for(;*ttab && *(ttab+1); ttab += 2) ! 313: for(s=str;*s;s++) ! 314: if(*ttab == *s) ! 315: *s = *(ttab+1); ! 316: } ! 317: ! 318: #define MAXLINE 512 ! 319: /* ! 320: * Get the information about the dialer. ! 321: * gdial(type, arps, narps) ! 322: * type -> type of dialer (e.g., penril) ! 323: * arps -> array of pointers returned by gdial ! 324: * narps -> number of elements in array returned by gdial ! 325: * Return value: ! 326: * -1 -> Can't open DIALERFILE ! 327: * 0 -> requested type not found ! 328: * >0 -> success - number of fields filled in ! 329: */ ! 330: static ! 331: gdial(type, arps, narps) ! 332: register char *type, *arps[]; ! 333: register int narps; ! 334: { ! 335: static char info[MAXLINE]; ! 336: register FILE *ldial; ! 337: register na; ! 338: ! 339: DEBUG(2, "gdial(%s) called\n", type); ! 340: if ((ldial = fopen(DIALERFILE, "r")) == NULL) ! 341: return(-1); ! 342: while (fgets(info, sizeof(info), ldial) != NULL) { ! 343: if ((info[0] == '#') || (info[0] == ' ') || ! 344: (info[0] == '\t') || (info[0] == '\n')) ! 345: continue; ! 346: if ((na = getargs(info, arps, narps)) == 0) ! 347: continue; ! 348: if (EQUALS(arps[0], type)) { ! 349: (void)fclose(ldial); ! 350: bsfix(arps); ! 351: return(na); ! 352: } ! 353: } ! 354: (void)fclose(ldial); ! 355: return(0); ! 356: } ! 357: ! 358: ! 359: #ifdef DATAKIT ! 360: ! 361: /*** ! 362: * dkcall(flds, dev) make a DATAKIT VCS connection ! 363: * DATAKIT VCS is a trademark of AT&T ! 364: * ! 365: * return codes: ! 366: * >0 - file number - ok ! 367: * FAIL - failed ! 368: */ ! 369: ! 370: #include "dk.h" ! 371: ! 372: dkcall(flds, dev) ! 373: char *flds[], *dev[]; ! 374: { ! 375: register fd; ! 376: #ifdef V8 ! 377: extern int dkp_ld; ! 378: #endif ! 379: ! 380: char dialstring[64]; ! 381: ! 382: strcpy(dialstring, dev[D_ARG]); ! 383: ! 384: #ifndef STANDALONE ! 385: if(*flds[F_CLASS] < '0' || *flds[F_CLASS] > '9') ! 386: sprintf(dialstring, "%s.%s", dev[D_ARG], flds[F_CLASS]); ! 387: #endif ! 388: ! 389: DEBUG(4, "dkcall(%s)\n", dialstring); ! 390: ! 391: ! 392: #ifdef V8 ! 393: if (setjmp(Sjbuf)) { ! 394: Uerror = SS_DIAL_FAILED; ! 395: return(FAIL); ! 396: } ! 397: ! 398: (void) signal(SIGALRM, alarmtr); ! 399: (void) alarm(70); ! 400: DEBUG(4, "tdkdial(%s", dialstring); ! 401: DEBUG(4, ", %d)\n", atoi(flds[F_CLASS])); ! 402: if ((fd = tdkdial(dialstring, atoi(flds[F_CLASS]))) >= 0) ! 403: if (dkproto(fd, dkp_ld) < 0) ! 404: { ! 405: close(fd); ! 406: fd = -1; ! 407: } ! 408: (void) alarm(0); ! 409: #else ! 410: fd = dkdial(dialstring); ! 411: #endif ! 412: ! 413: (void) strcpy(Dc, "DK"); ! 414: if (fd < 0) { ! 415: Uerror = SS_DIAL_FAILED; ! 416: return(FAIL); ! 417: } ! 418: else ! 419: return(fd); ! 420: } ! 421: ! 422: #endif DATAKIT ! 423: ! 424: #ifdef TCP ! 425: ! 426: /*** ! 427: * tcpcall(flds, dev) make ethernet/socket connection ! 428: * ! 429: * return codes: ! 430: * >0 - file number - ok ! 431: * FAIL - failed ! 432: * ! 433: * the internet address is the phone number ! 434: * the port is the call device ! 435: */ ! 436: ! 437: #ifdef V8 ! 438: tcpcall(flds, dev) ! 439: char *flds[], *dev[]; ! 440: { ! 441: int ret; ! 442: int port; ! 443: extern int errno, sys_nerr; ! 444: extern char *sys_errlist[]; ! 445: struct in_service *sp; ! 446: struct tcpuser poot; ! 447: ! 448: poot.fport = atoi(dev[D_CALLDEV]); ! 449: if (poot.fport == 0) { ! 450: sp = in_service("uucp", "tcp", 0); ! 451: ASSERT(sp != NULL, "No uucp server", 0, 0); ! 452: poot.fport = sp->port; ! 453: } ! 454: if ((poot.faddr = in_address(dev[D_ARG])) == 0) { ! 455: logent("tcpopen", "no such host"); ! 456: Uerror = SS_BADSYSTEM; ! 457: return(FAIL); ! 458: } ! 459: DEBUG(4, "tcpdial host %s, ", dev[D_ARG]); ! 460: DEBUG(4, "port %d\n", poot.fport); ! 461: ! 462: ret = tcp_sock(); ! 463: if (ret < 0) { ! 464: if (errno < sys_nerr) { ! 465: DEBUG(5, "no socket: %s\n", sys_errlist[errno]); ! 466: logent("no socket", sys_errlist[errno]); ! 467: } ! 468: else { ! 469: DEBUG(5, "no socket, errno %d\n", errno); ! 470: logent("tcpopen", "NO SOCKET"); ! 471: } ! 472: Uerror = SS_NO_DEVICE; ! 473: return(FAIL); ! 474: } ! 475: if (setjmp(Sjbuf)) { ! 476: DEBUG(4, "timeout tcpopen\n", ""); ! 477: logent("tcpopen", "TIMEOUT"); ! 478: Uerror = SS_DIAL_FAILED; ! 479: return(FAIL); ! 480: } ! 481: (void) signal(SIGALRM, alarmtr); ! 482: (void) alarm(30); ! 483: DEBUG(7, "addr: %s\n", in_ntoa(poot.faddr)); ! 484: poot.lport = 0; ! 485: poot.param = 0; ! 486: poot.laddr = 0; ! 487: if (tcp_connect(ret, &poot) < 0) { ! 488: (void) alarm(0); ! 489: (void) close(ret); ! 490: if (errno < sys_nerr) { ! 491: DEBUG(5, "connect failed: %s\n", sys_errlist[errno]); ! 492: logent("connect failed", sys_errlist[errno]); ! 493: } ! 494: else { ! 495: DEBUG(5, "connect failed, errno %d\n", errno); ! 496: logent("tcpopen", "CONNECT FAILED"); ! 497: } ! 498: Uerror = SS_DIAL_FAILED; ! 499: return(FAIL); ! 500: } ! 501: (void) signal(SIGPIPE, SIG_IGN); /* watch out for broken ipc link...*/ ! 502: (void) alarm(0); ! 503: (void) strcpy(Dc, "IPC"); ! 504: return(ret); ! 505: } ! 506: #else ! 507: #ifdef BSD4_2 ! 508: tcpcall(flds, dev) ! 509: char *flds[], *dev[]; ! 510: { ! 511: int ret; ! 512: short port; ! 513: extern int errno, sys_nerr; ! 514: extern char *sys_errlist[]; ! 515: struct servent *sp; ! 516: struct hostent *hp; ! 517: struct sockaddr_in sin; ! 518: ! 519: port = atoi(dev[D_CALLDEV]); ! 520: if (port == 0) { ! 521: sp = getservbyname("uucp", "tcp"); ! 522: ASSERT(sp != NULL, "No uucp server", 0, 0); ! 523: port = sp->s_port; ! 524: } ! 525: else port = htons(port); ! 526: hp = gethostbyname(dev[D_ARG]); ! 527: if (hp == NULL) { ! 528: logent("tcpopen", "no such host"); ! 529: Uerror = SS_BADSYSTEM; ! 530: return(FAIL); ! 531: } ! 532: DEBUG(4, "tcpdial host %s, ", dev[D_ARG]); ! 533: DEBUG(4, "port %d\n", ntohs(port)); ! 534: ! 535: ret = socket(AF_INET, SOCK_STREAM, 0); ! 536: if (ret < 0) { ! 537: if (errno < sys_nerr) { ! 538: DEBUG(5, "no socket: %s\n", sys_errlist[errno]); ! 539: logent("no socket", sys_errlist[errno]); ! 540: } ! 541: else { ! 542: DEBUG(5, "no socket, errno %d\n", errno); ! 543: logent("tcpopen", "NO SOCKET"); ! 544: } ! 545: Uerror = SS_NO_DEVICE; ! 546: return(FAIL); ! 547: } ! 548: sin.sin_family = hp->h_addrtype; ! 549: bcopy(hp->h_addr, (caddr_t)&sin.sin_addr, hp->h_length); ! 550: sin.sin_port = port; ! 551: if (setjmp(Sjbuf)) { ! 552: DEBUG(4, "timeout tcpopen\n", ""); ! 553: logent("tcpopen", "TIMEOUT"); ! 554: Uerror = SS_NO_DEVICE; ! 555: return(FAIL); ! 556: } ! 557: (void) signal(SIGALRM, alarmtr); ! 558: (void) alarm(30); ! 559: DEBUG(7, "family: %d\n", sin.sin_family); ! 560: DEBUG(7, "port: %d\n", sin.sin_port); ! 561: DEBUG(7, "addr: %08x\n",*((int *) &sin.sin_addr)); ! 562: if (connect(ret, (caddr_t)&sin, sizeof (sin)) < 0) { ! 563: (void) alarm(0); ! 564: (void) close(ret); ! 565: if (errno < sys_nerr) { ! 566: DEBUG(5, "connect failed: %s\n", sys_errlist[errno]); ! 567: logent("connect failed", sys_errlist[errno]); ! 568: } ! 569: else { ! 570: DEBUG(5, "connect failed, errno %d\n", errno); ! 571: logent("tcpopen", "CONNECT FAILED"); ! 572: } ! 573: Uerror = SS_NO_DEVICE; ! 574: return(FAIL); ! 575: } ! 576: (void) signal(SIGPIPE, SIG_IGN); /* watch out for broken ipc link...*/ ! 577: (void) alarm(0); ! 578: (void) strcpy(Dc, "IPC"); ! 579: return(ret); ! 580: } ! 581: #endif ! 582: #endif ! 583: ! 584: ! 585: /*** ! 586: * unetcall(flds, dev) make ethernet connection ! 587: * ! 588: * return codes: ! 589: * >0 - file number - ok ! 590: * FAIL - failed ! 591: */ ! 592: ! 593: #ifdef UNET ! 594: unetcall(flds, dev) ! 595: char *flds[], *dev[]; ! 596: { ! 597: int ret; ! 598: int port; ! 599: extern int errno; ! 600: ! 601: port = atoi(dev[D_ARG]); ! 602: DEBUG(4, "unetdial host %s, ", flds[F_NAME]); ! 603: DEBUG(4, "port %d\n", port); ! 604: (void) alarm(30); ! 605: ret = tcpopen(flds[F_NAME], port, 0, TO_ACTIVE, "rw"); ! 606: (void) alarm(0); ! 607: endhnent(); /* wave magic wand at 3com and incant "eat it, bruce" */ ! 608: if (ret < 0) { ! 609: DEBUG(5, "tcpopen failed: errno %d\n", errno); ! 610: Uerror = SS_DIAL_FAILED; ! 611: return(FAIL); ! 612: } ! 613: (void) strcpy(Dc, "UNET"); ! 614: return(ret); ! 615: } ! 616: #endif UNET ! 617: ! 618: #endif /* TCP */ ! 619: ! 620: #ifdef CSERV ! 621: ! 622: #include <ipc.h> ! 623: ! 624: cscall(flds, dev) ! 625: char *flds[], *dev[]; ! 626: { ! 627: int fd; ! 628: register char *p; ! 629: char *rem; ! 630: extern int errno; ! 631: extern char *errstr; ! 632: ! 633: rem = dev[D_ARG]; ! 634: if (*dev[D_CALLDEV] == '.') { ! 635: for (p = rem; *p; p++) ! 636: if (*p == '.') { ! 637: *p = '!'; /* sad but true */ ! 638: break; ! 639: } ! 640: } ! 641: rem = ipcpath(rem, (char *)NULL, (char *)NULL); ! 642: DEBUG(4, "ipcopen(%s, ", rem); ! 643: DEBUG(4, "%s)\n", dev[D_LINE]); ! 644: if ((fd = ipcopen(rem, dev[D_LINE])) >= 0) ! 645: return (fd); ! 646: DEBUG(4, "ipcopen failed, error %d ", errno); ! 647: DEBUG(4, "%s\n", errstr); ! 648: /* should think more about errors */ ! 649: Uerror = SS_DIAL_FAILED; ! 650: return(FAIL); ! 651: } ! 652: #endif ! 653: ! 654: #ifdef SYTEK ! 655: ! 656: /**** ! 657: * sytcall(flds, dev) make a sytek connection ! 658: * ! 659: * return codes: ! 660: * >0 - file number - ok ! 661: * FAIL - failed ! 662: */ ! 663: ! 664: /*ARGSUSED*/ ! 665: sytcall(flds, dev) ! 666: char *flds[], *dev[]; ! 667: { ! 668: extern int errno; ! 669: int dcr, dcr2, nullfd, ret; ! 670: char dcname[20], command[BUFSIZ]; ! 671: ! 672: (void) sprintf(dcname, "/dev/%s", dev[D_LINE]); ! 673: DEBUG(4, "dc - %s, ", dcname); ! 674: dcr = open(dcname, O_WRONLY|O_NDELAY); ! 675: if (dcr < 0) { ! 676: Uerror = SS_DIAL_FAILED; ! 677: DEBUG(4, "OPEN FAILED %s\n", dcname); ! 678: delock(dev[D_LINE]); ! 679: return(FAIL); ! 680: } ! 681: ! 682: sytfixline(dcr, atoi(fdig(dev[D_CLASS])), D_DIRECT); ! 683: (void) sleep(2); ! 684: (void) sprintf(command,"\r\rcall %s\r",flds[F_PHONE]); ! 685: ret = write(dcr, command, strlen(command)); ! 686: (void) sleep(1); ! 687: DEBUG(4, "COM1 return = %d\n", ret); ! 688: sytfix2line(dcr); ! 689: (void) close(nullfd = open("/", 0)); ! 690: (void) signal(SIGALRM, alarmtr); ! 691: if (setjmp(Sjbuf)) { ! 692: DEBUG(4, "timeout sytek open\n", ""); ! 693: (void) close(nullfd); ! 694: (void) close(dcr2); ! 695: (void) close(dcr); ! 696: Uerror = SS_DIAL_FAILED; ! 697: delock(dev[D_LINE]); ! 698: return(FAIL); ! 699: } ! 700: (void) alarm(10); ! 701: dcr2 = open(dcname,O_RDWR); ! 702: (void) alarm(0); ! 703: (void) close(dcr); ! 704: if (dcr2 < 0) { ! 705: DEBUG(4, "OPEN 2 FAILED %s\n", dcname); ! 706: Uerror = SS_DIAL_FAILED; ! 707: (void) close(nullfd); /* kernel might think dc2 is open */ ! 708: delock(dev[D_LINE]); ! 709: return(FAIL); ! 710: } ! 711: return(dcr2); ! 712: } ! 713: ! 714: #endif SYTEK ! 715: ! 716: #ifdef DIAL801 ! 717: ! 718: /*** ! 719: * dial801(flds, dev) dial remote machine on 801/801 ! 720: * char *flds[], *dev[]; ! 721: * ! 722: * return codes: ! 723: * file descriptor - succeeded ! 724: * FAIL - failed ! 725: * ! 726: * unfortunately, open801() is different for usg and non-usg ! 727: */ ! 728: ! 729: /*ARGSUSED*/ ! 730: dial801(flds, dev) ! 731: char *flds[], *dev[]; ! 732: { ! 733: char dcname[20], dnname[20], phone[MAXPH+2], *fdig(); ! 734: int dcf = -1, speed; ! 735: ! 736: if (mlock(dev[D_LINE]) == FAIL) { ! 737: DEBUG(5, "mlock %s failed\n", dev[D_LINE]); ! 738: Uerror = SS_LOCKED_DEVICE; ! 739: return(FAIL); ! 740: } ! 741: (void) sprintf(dnname, "/dev/%s", dev[D_CALLDEV]); ! 742: (void) sprintf(phone, "%s%s", dev[D_ARG] , ACULAST); ! 743: (void) sprintf(dcname, "/dev/%s", dev[D_LINE]); ! 744: CDEBUG(1, "Use Port %s, ", dcname); ! 745: DEBUG(4, "acu - %s, ", dnname); ! 746: CDEBUG(1, "Phone Number %s\n", phone); ! 747: VERBOSE("Trying modem - %s, ", dcname); /* for cu */ ! 748: VERBOSE("acu - %s, ", dnname); /* for cu */ ! 749: VERBOSE("calling %s: ", phone); /* for cu */ ! 750: speed = atoi(fdig(dev[D_CLASS])); ! 751: dcf = open801(dcname, dnname, phone, speed); ! 752: if (dcf >= 0) { ! 753: fixline(dcf, speed, D_ACU); ! 754: (void) strcpy(Dc, dev[D_LINE]); /* for later unlock() */ ! 755: VERBOSE("SUCCEEDED\n", 0); ! 756: } else { ! 757: delock(dev[D_LINE]); ! 758: VERBOSE("FAILED\n", 0); ! 759: } ! 760: return(dcf); ! 761: } ! 762: ! 763: ! 764: #ifndef ATTSV ! 765: /*ARGSUSED*/ ! 766: open801(dcname, dnname, phone, speed) ! 767: char *dcname, *dnname, *phone; ! 768: { ! 769: int nw, lt, pid = -1, dcf = -1, nullfd, dnf = -1; ! 770: int rpid; ! 771: unsigned timelim; ! 772: ! 773: if ((dnf = open(dnname, 1)) < 0) { ! 774: DEBUG(5, "can't open %s\n", dnname); ! 775: Uerror = SS_CANT_ACCESS_DEVICE; ! 776: return(FAIL); ! 777: } ! 778: DEBUG(5, "%s is open\n", dnname); ! 779: ! 780: (void) close(nullfd = open("/dev/null", 0)); /* partial open hack */ ! 781: if (setjmp(Sjbuf)) { ! 782: DEBUG(4, "timeout modem open\n", ""); ! 783: logent("801 open", "TIMEOUT"); ! 784: (void) close(nullfd); ! 785: (void) close(dcf); ! 786: (void) close(dnf); ! 787: if (pid > 0) { ! 788: kill(pid, 9); ! 789: while ((rpid = wait((int *) 0)) > 0 && rpid != pid) ! 790: ; ! 791: } ! 792: Uerror = SS_DIAL_FAILED; ! 793: return(FAIL); ! 794: } ! 795: (void) signal(SIGALRM, alarmtr); ! 796: timelim = 5 * strlen(phone); ! 797: (void) alarm(timelim < 30 ? 30 : timelim); ! 798: if ((pid = fork()) == 0) { ! 799: sleep(2); ! 800: nw = write(dnf, phone, lt = strlen(phone)); ! 801: if (nw != lt) { ! 802: DEBUG(4, "ACU write error %d\n", errno); ! 803: logent("ACU write", "FAILED"); ! 804: exit(1); ! 805: } ! 806: DEBUG(4, "ACU write ok%s\n", ""); ! 807: exit(0); ! 808: } ! 809: /* open line - will return on carrier */ ! 810: dcf = open(dcname, 2); ! 811: ! 812: DEBUG(4, "dcf is %d\n", dcf); ! 813: if (dcf < 0) { /* handle like a timeout */ ! 814: (void) alarm(0); ! 815: longjmp(Sjbuf, 1); ! 816: } ! 817: ! 818: /* modem is open */ ! 819: while ((nw = wait(<)) != pid && nw != -1) ! 820: ; ! 821: (void) alarm(0); ! 822: ! 823: (void) close(dnf); /* no reason to keep the 801 open */ ! 824: if (lt != 0) { ! 825: DEBUG(4, "Fork Stat %o\n", lt); ! 826: (void) close(dcf); ! 827: Uerror = SS_DIAL_FAILED; ! 828: return(FAIL); ! 829: } ! 830: return(dcf); ! 831: } ! 832: ! 833: #else ! 834: ! 835: open801(dcname, dnname, phone, speed) ! 836: char *dcname, *dnname, *phone; ! 837: { ! 838: int nw, lt, dcf = -1, nullfd, dnf = -1, ret; ! 839: unsigned timelim; ! 840: ! 841: (void) close(nullfd = open("/", 0)); /* partial open hack */ ! 842: if (setjmp(Sjbuf)) { ! 843: DEBUG(4, "DN write %s\n", "timeout"); ! 844: (void) close(dnf); ! 845: (void) close(dcf); ! 846: (void) close(nullfd); ! 847: Uerror = SS_DIAL_FAILED; ! 848: return(FAIL); ! 849: } ! 850: (void) signal(SIGALRM, alarmtr); ! 851: timelim = 5 * strlen(phone); ! 852: (void) alarm(timelim < 30 ? 30 : timelim); ! 853: ! 854: if ((dnf = open(dnname, O_WRONLY)) < 0 ) { ! 855: DEBUG(5, "can't open %s\n", dnname); ! 856: Uerror = SS_CANT_ACCESS_DEVICE; ! 857: return(FAIL); ! 858: } ! 859: DEBUG(5, "%s is open\n", dnname); ! 860: if ( (dcf = open(dcname, O_RDWR | O_NDELAY)) < 0 ) { ! 861: DEBUG(5, "can't open %s\n", dcname); ! 862: Uerror = SS_CANT_ACCESS_DEVICE; ! 863: return(FAIL); ! 864: } ! 865: ! 866: DEBUG(4, "dcf is %d\n", dcf); ! 867: fixline(dcf, speed, D_ACU); ! 868: nw = write(dnf, phone, lt = strlen(phone)); ! 869: if (nw != lt) { ! 870: (void) alarm(0); ! 871: DEBUG(4, "ACU write error %d\n", errno); ! 872: (void) close(dnf); ! 873: (void) close(dcf); ! 874: Uerror = SS_DIAL_FAILED; ! 875: return(FAIL); ! 876: } else ! 877: DEBUG(4, "ACU write ok%s\n", ""); ! 878: ! 879: (void) close(dnf); ! 880: (void) close(nullfd = open("/", 0)); /* partial open hack */ ! 881: ret = open(dcname, 2); /* wait for carrier */ ! 882: (void) alarm(0); ! 883: (void) close(ret); /* close 2nd modem open() */ ! 884: if (ret < 0) { /* open() interrupted by alarm */ ! 885: DEBUG(4, "Line open %s\n", "failed"); ! 886: Uerror = SS_DIAL_FAILED; ! 887: (void) close(nullfd); /* close partially opened modem */ ! 888: return(FAIL); ! 889: } ! 890: (void) fcntl(dcf,F_SETFL, fcntl(dcf, F_GETFL, 0) & ~O_NDELAY); ! 891: return(dcf); ! 892: } ! 893: #endif ! 894: ! 895: #endif ! 896: ! 897: #ifdef V8 ! 898: Dialout(flds) ! 899: char *flds[]; ! 900: { ! 901: int fd; ! 902: char phone[MAXPH+2]; ! 903: ! 904: exphone(flds[F_PHONE], phone); ! 905: ! 906: DEBUG(4, "call dialout(%s", phone); ! 907: DEBUG(4, ", %s)\n", flds[F_CLASS]); ! 908: fd = dialout(phone, flds[F_CLASS]); ! 909: if (fd >= 0) ! 910: fixline(fd, 0, D_ACU); ! 911: else if (fd == -1) ! 912: Uerror = SS_NO_DEVICE; ! 913: else if (fd == -3) ! 914: Uerror = SS_DIAL_FAILED; ! 915: else if (fd == -9) ! 916: Uerror = SS_DEVICE_FAILED; ! 917: ! 918: (void) strcpy(Dc, "Dialout"); ! 919: ! 920: return(fd); ! 921: } ! 922: #endif DIAL801
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.