|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)acu.c 5.3 (Berkeley) 4/3/86"; ! 9: #endif not lint ! 10: ! 11: #include "tip.h" ! 12: ! 13: static acu_t *acu = NOACU; ! 14: static int conflag; ! 15: static int acuabort(); ! 16: static acu_t *acutype(); ! 17: static jmp_buf jmpbuf; ! 18: /* ! 19: * Establish connection for tip ! 20: * ! 21: * If DU is true, we should dial an ACU whose type is AT. ! 22: * The phone numbers are in PN, and the call unit is in CU. ! 23: * ! 24: * If the PN is an '@', then we consult the PHONES file for ! 25: * the phone numbers. This file is /etc/phones, unless overriden ! 26: * by an exported shell variable. ! 27: * ! 28: * The data base files must be in the format: ! 29: * host-name[ \t]*phone-number ! 30: * with the possibility of multiple phone numbers ! 31: * for a single host acting as a rotary (in the order ! 32: * found in the file). ! 33: */ ! 34: char * ! 35: connect() ! 36: { ! 37: register char *cp = PN; ! 38: char *phnum, string[256]; ! 39: FILE *fd; ! 40: int tried = 0; ! 41: ! 42: if (!DU) { /* regular connect message */ ! 43: if (CM != NOSTR) ! 44: pwrite(FD, CM, size(CM)); ! 45: return (NOSTR); ! 46: } ! 47: /* ! 48: * @ =>'s use data base in PHONES environment variable ! 49: * otherwise, use /etc/phones ! 50: */ ! 51: signal(SIGINT, acuabort); ! 52: signal(SIGQUIT, acuabort); ! 53: if (setjmp(jmpbuf)) { ! 54: signal(SIGINT, SIG_IGN); ! 55: signal(SIGQUIT, SIG_IGN); ! 56: printf("\ncall aborted\n"); ! 57: logent(value(HOST), "", "", "call aborted"); ! 58: if (acu != NOACU) { ! 59: boolean(value(VERBOSE)) = FALSE; ! 60: if (conflag) ! 61: disconnect(NOSTR); ! 62: else ! 63: (*acu->acu_abort)(); ! 64: } ! 65: delock(uucplock); ! 66: exit(1); ! 67: } ! 68: if ((acu = acutype(AT)) == NOACU) ! 69: return ("unknown ACU type"); ! 70: if (*cp != '@') { ! 71: while (*cp) { ! 72: for (phnum = cp; *cp && *cp != ','; cp++) ! 73: ; ! 74: if (*cp) ! 75: *cp++ = '\0'; ! 76: ! 77: if (conflag = (*acu->acu_dialer)(phnum, CU)) { ! 78: logent(value(HOST), phnum, acu->acu_name, ! 79: "call completed"); ! 80: return (NOSTR); ! 81: } else ! 82: logent(value(HOST), phnum, acu->acu_name, ! 83: "call failed"); ! 84: tried++; ! 85: } ! 86: } else { ! 87: if ((fd = fopen(PH, "r")) == NOFILE) { ! 88: printf("%s: ", PH); ! 89: return ("can't open phone number file"); ! 90: } ! 91: while (fgets(string, sizeof(string), fd) != NOSTR) { ! 92: for (cp = string; !any(*cp, " \t\n"); cp++) ! 93: ; ! 94: if (*cp == '\n') { ! 95: fclose(fd); ! 96: return ("unrecognizable host name"); ! 97: } ! 98: *cp++ = '\0'; ! 99: if (strcmp(string, value(HOST))) ! 100: continue; ! 101: while (any(*cp, " \t")) ! 102: cp++; ! 103: if (*cp == '\n') { ! 104: fclose(fd); ! 105: return ("missing phone number"); ! 106: } ! 107: for (phnum = cp; *cp && *cp != ',' && *cp != '\n'; cp++) ! 108: ; ! 109: if (*cp) ! 110: *cp++ = '\0'; ! 111: ! 112: if (conflag = (*acu->acu_dialer)(phnum, CU)) { ! 113: fclose(fd); ! 114: logent(value(HOST), phnum, acu->acu_name, ! 115: "call completed"); ! 116: return (NOSTR); ! 117: } else ! 118: logent(value(HOST), phnum, acu->acu_name, ! 119: "call failed"); ! 120: tried++; ! 121: } ! 122: fclose(fd); ! 123: } ! 124: if (!tried) ! 125: logent(value(HOST), "", acu->acu_name, "missing phone number"); ! 126: else ! 127: (*acu->acu_abort)(); ! 128: return (tried ? "call failed" : "missing phone number"); ! 129: } ! 130: ! 131: disconnect(reason) ! 132: char *reason; ! 133: { ! 134: if (!conflag) ! 135: return; ! 136: if (reason == NOSTR) { ! 137: logent(value(HOST), "", acu->acu_name, "call terminated"); ! 138: if (boolean(value(VERBOSE))) ! 139: printf("\r\ndisconnecting..."); ! 140: } else ! 141: logent(value(HOST), "", acu->acu_name, reason); ! 142: (*acu->acu_disconnect)(); ! 143: } ! 144: ! 145: static int ! 146: acuabort(s) ! 147: { ! 148: signal(s, SIG_IGN); ! 149: longjmp(jmpbuf, 1); ! 150: } ! 151: ! 152: static acu_t * ! 153: acutype(s) ! 154: register char *s; ! 155: { ! 156: register acu_t *p; ! 157: extern acu_t acutable[]; ! 158: ! 159: for (p = acutable; p->acu_name != '\0'; p++) ! 160: if (!strcmp(s, p->acu_name)) ! 161: return (p); ! 162: return (NOACU); ! 163: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.