|
|
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.