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