|
|
1.1 ! root 1: /* /sccs/src/cmd/uucp/s.systat.c ! 2: systat.c 1.3 8/30/84 17:37:44 ! 3: */ ! 4: #include "uucp.h" ! 5: VERSION(@(#)systat.c 1.3); ! 6: ! 7: #define STATNAME(f, n) ((void)sprintf(f, "%s/%s", STATDIR, n)) ! 8: #define S_SIZE 100 ! 9: ! 10: /* ! 11: * make system status entry ! 12: * name -> system name ! 13: * text -> text string to read ! 14: * type -> ? ! 15: * return: ! 16: * none ! 17: */ ! 18: void ! 19: systat(name, type, text, retry) ! 20: register int type; ! 21: char *name, *text; ! 22: long retry; ! 23: { ! 24: register FILE *fp; ! 25: int count; ! 26: char filename[MAXFULLNAME], line[S_SIZE]; ! 27: time_t prestime; ! 28: long presretry = 0; ! 29: char *vec[5]; ! 30: ! 31: line[0] = '\0'; ! 32: (void) time(&prestime); ! 33: count = 0; ! 34: STATNAME(filename, name); ! 35: ! 36: fp = fopen(filename, "r"); ! 37: if (fp != NULL) { ! 38: if (fgets(line, S_SIZE, fp) != NULL) ! 39: if (getargs(line, vec, 4) == 4) { ! 40: count = atoi(vec[1]); ! 41: presretry = atol(vec[3]); ! 42: } ! 43: if (count <= 0) ! 44: count = 0; ! 45: fclose(fp); ! 46: } ! 47: ! 48: switch (type) { ! 49: /* if there is already a status file - don't change */ ! 50: case SS_TIME_WRONG: ! 51: case SS_LOCKED_DEVICE: ! 52: case SS_CANT_ACCESS_DEVICE: ! 53: if (count > 1) ! 54: return; ! 55: break; ! 56: ! 57: case SS_ASSERT_ERROR: ! 58: retry = 55*60; /* wait an hour after assertion fails */ ! 59: break; ! 60: ! 61: case SS_OK: /* delete record of OK transfers */ ! 62: unlink(filename); ! 63: return; ! 64: ! 65: case SS_INPROGRESS: /* preserve current record */ ! 66: retry = presretry; ! 67: break; ! 68: ! 69: /* Startup failure means protocol mismatch--some administrative ! 70: * action must be taken ! 71: */ ! 72: case SS_STARTUP: ! 73: retry = MAXRETRYTIME; ! 74: count = 0; ! 75: break; ! 76: ! 77: default: /* increment count and set up retry time */ ! 78: count++; ! 79: if (!retry) { /* use exponential backoff */ ! 80: if (presretry < RETRYTIME) ! 81: retry = RETRYTIME; ! 82: else { ! 83: retry = presretry + presretry; ! 84: if (retry > MAXRETRYTIME) ! 85: retry = MAXRETRYTIME; ! 86: } ! 87: } ! 88: else { /* use specified time */ ! 89: if (retry < RETRYTIME) ! 90: retry = RETRYTIME; ! 91: } ! 92: break; ! 93: } ! 94: ! 95: fp = fopen(filename, "w"); ! 96: /* can't ASSERT since assert() calls systat() */ ! 97: if (fp == NULL) { ! 98: errent(Ct_OPEN, filename, errno, sccsid, __FILE__, __LINE__); ! 99: cleanup(FAIL); ! 100: } ! 101: (void) chmod(filename, 0666); ! 102: (void) fprintf(fp, "%d %d %ld %ld %s %s\n", ! 103: type, count, prestime, retry, text, name); ! 104: (void) fclose(fp); ! 105: return; ! 106: } ! 107: ! 108: /* ! 109: * check system status for call ! 110: * name -> system to check ! 111: * return: ! 112: * 0 -> ok ! 113: * >0 -> system status ! 114: */ ! 115: callok(name) ! 116: char *name; ! 117: { ! 118: register FILE *fp; ! 119: register int t; ! 120: long retrytime; ! 121: int count, type; ! 122: char filename[MAXFULLNAME], line[S_SIZE]; ! 123: time_t lasttime, prestime; ! 124: ! 125: STATNAME(filename, name); ! 126: fp = fopen(filename, "r"); ! 127: if (fp == NULL) ! 128: return(SS_OK); ! 129: ! 130: if (fgets(line, S_SIZE, fp) == NULL) { ! 131: ! 132: /* no data */ ! 133: fclose(fp); ! 134: (void) unlink(filename); ! 135: return(SS_OK); ! 136: } ! 137: ! 138: fclose(fp); ! 139: (void) time(&prestime); ! 140: sscanf(line, "%d%d%ld%ld", &type, &count, &lasttime, &retrytime); ! 141: t = type; ! 142: ! 143: switch(t) { ! 144: case SS_SEQBAD: ! 145: case SS_LOGIN_FAILED: ! 146: case SS_DIAL_FAILED: ! 147: case SS_BAD_LOG_MCH: ! 148: case SS_BADSYSTEM: ! 149: case SS_CANT_ACCESS_DEVICE: ! 150: case SS_WRONG_MCH: ! 151: case SS_RLOCKED: ! 152: case SS_RUNKNOWN: ! 153: case SS_RLOGIN: ! 154: case SS_UNKNOWN_RESPONSE: ! 155: case SS_CHAT_FAILED: ! 156: case SS_ASSERT_ERROR: ! 157: case SS_CONVERSATION: ! 158: if (prestime - lasttime < retrytime) { ! 159: logent("RETRY TIME NOT REACHED", "NO CALL"); ! 160: DEBUG(4, "RETRY TIME (%ld) NOT REACHED\n", retrytime); ! 161: return(type); ! 162: } ! 163: ! 164: return(SS_OK); ! 165: default: ! 166: return(SS_OK); ! 167: } ! 168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.