|
|
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: /* reset count on successful call */
58: case SS_OK:
59: case SS_INPROGRESS:
60: case SS_CONVERSATION: /* failure during conversation - contact ok */
61: retry = 0;
62: count = 0;
63: break;
64:
65: /* Startup failure means protocol mismatch--some administrative
66: * action must be taken
67: */
68: case SS_STARTUP:
69: retry = MAXRETRYTIME;
70: count = 0;
71: break;
72: default: /* increment count and set up retry time */
73: count++;
74: if (!retry) { /* use exponential backoff */
75: if (presretry < RETRYTIME)
76: retry = RETRYTIME;
77: else {
78: retry = presretry + presretry;
79: if (retry > MAXRETRYTIME)
80: retry = MAXRETRYTIME;
81: }
82: }
83: else { /* use specified time */
84: if (retry < RETRYTIME)
85: retry = RETRYTIME;
86: }
87: break;
88: }
89:
90: fp = fopen(filename, "w");
91: /* can't ASSERT since assert() calls systat() */
92: if (fp == NULL) {
93: errent(Ct_OPEN, filename, errno, sccsid, __FILE__, __LINE__);
94: cleanup(FAIL);
95: }
96: (void) chmod(filename, 0666);
97: (void) fprintf(fp, "%d %d %ld %ld %s %s\n",
98: type, count, prestime, retry, text, name);
99: (void) fclose(fp);
100: return;
101: }
102:
103: /*
104: * check system status for call
105: * name -> system to check
106: * return:
107: * 0 -> ok
108: * >0 -> system status
109: */
110: callok(name)
111: char *name;
112: {
113: register FILE *fp;
114: register int t;
115: long retrytime;
116: int count, type;
117: char filename[MAXFULLNAME], line[S_SIZE];
118: time_t lasttime, prestime;
119:
120: STATNAME(filename, name);
121: fp = fopen(filename, "r");
122: if (fp == NULL)
123: return(SS_OK);
124:
125: if (fgets(line, S_SIZE, fp) == NULL) {
126:
127: /* no data */
128: fclose(fp);
129: (void) unlink(filename);
130: return(SS_OK);
131: }
132:
133: fclose(fp);
134: (void) time(&prestime);
135: sscanf(line, "%d%d%ld%ld", &type, &count, &lasttime, &retrytime);
136: t = type;
137:
138: switch(t) {
139: case SS_SEQBAD:
140: case SS_LOGIN_FAILED:
141: case SS_DIAL_FAILED:
142: case SS_BAD_LOG_MCH:
143: case SS_BADSYSTEM:
144: case SS_CANT_ACCESS_DEVICE:
145: case SS_WRONG_MCH:
146: case SS_RLOCKED:
147: case SS_RUNKNOWN:
148: case SS_RLOGIN:
149: case SS_UNKNOWN_RESPONSE:
150: case SS_CHAT_FAILED:
151:
152: if (prestime - lasttime < retrytime) {
153: logent("RETRY TIME NOT REACHED", "NO CALL");
154: DEBUG(4, "RETRY TIME (%ld) NOT REACHED\n", retrytime);
155: return(type);
156: }
157:
158: return(SS_OK);
159: default:
160: return(SS_OK);
161: }
162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.