xref: /original-bsd/usr.bin/uucp/libuu/systat.c (revision a4d3ae46)
1 #ifndef lint
2 static char sccsid[] = "@(#)systat.c	5.5	(Berkeley) 04/05/88";
3 #endif
4 
5 #include "uucp.h"
6 
7 #define STATNAME(f, n) sprintf(f, "%s/%s/%s", Spool, "STST", n)
8 #define S_SIZE 100
9 
10 /*LINTLIBRARY*/
11 
12 /*
13  *	make system status entry
14  *	return codes:  none
15  */
16 systat(name, type, text)
17 char *name, *text;
18 int type;
19 {
20 	char filename[MAXFULLNAME], line[S_SIZE];
21 	int count, oldtype;
22 	register FILE *fp;
23 	time_t prestime, rtry;
24 
25 	if (type == 0)
26 		return;
27 	line[0] = '\0';
28 	time(&prestime);
29 	count = 0;
30 	STATNAME(filename, name);
31 
32 	fp = fopen(filename, "r");
33 	if (fp != NULL) {
34 		fgets(line, S_SIZE, fp);
35 		sscanf(line, "%d %d", &oldtype, &count);
36 		if (count <= 0)
37 			count = 0;
38 		fclose(fp);
39 		/* If merely 'wrong time', don't change existing STST */
40 		if (type == SS_WRONGTIME && oldtype != SS_INPROGRESS)
41 			return;
42 	}
43 
44 	rtry = Retrytime;
45 	/* if failures repeat, don't try so often,
46 	 * to forstall a 'MAX RECALLS' situation.
47 	 */
48 	if (type == SS_FAIL) {
49 		count++;
50 		if (count > 5) {
51 			rtry = rtry * (count-5);
52 			if (rtry > ONEDAY/2)
53 				rtry = ONEDAY/2;
54 		}
55 	}
56 
57 
58 #ifdef VMS
59 	unlink(filename);
60 #endif VMS
61 	fp = fopen(filename, "w");
62 	if (fp == NULL) {
63 		syslog(LOG_ERR, "fopen(%s) failed: %m", filename);
64 		cleanup(FAIL);
65 	}
66 	fprintf(fp, "%d %d %ld %ld %s %s\n", type, count, prestime, rtry, text, name);
67 	fclose(fp);
68 }
69 
70 /*
71  *	remove system status entry
72  *
73  *	return codes:  none
74  */
75 rmstat(name)
76 char *name;
77 {
78 	char filename[MAXFULLNAME];
79 
80 	STATNAME(filename, name);
81 	unlink(filename);
82 }
83 
84 /*
85  *	check system status for call
86  *
87  *	return codes  0 - ok | >0 system status
88  */
89 callok(name)
90 char *name;
91 {
92 	char filename[MAXFULLNAME], line[S_SIZE];
93 	register FILE *fp;
94 	time_t lasttime, prestime, retrytime;
95 	long t1, t2;
96 	int count, type;
97 
98 	STATNAME(filename, name);
99 	fp = fopen(filename, "r");
100 	if (fp == NULL)
101 		return(SS_OK);
102 
103 	if (fgets(line, S_SIZE, fp) == NULL) {
104 		/*  no data  */
105 		fclose(fp);
106 		unlink(filename);
107 		return(SS_OK);
108 	}
109 
110 	fclose(fp);
111 	time(&prestime);
112 	sscanf(line, "%d%d%ld%ld", &type, &count, &t1, &t2);
113 	lasttime = t1;
114 	retrytime = t2;
115 
116 	switch(type) {
117 	case SS_BADSEQ:
118 	case SS_CALLBACK:
119 	case SS_NODEVICE:
120 	case SS_INPROGRESS:	/*let LCK take care of it */
121 		return(SS_OK);
122 
123 	case SS_FAIL:
124 		if (count > MAXRECALLS) {
125 			logent("MAX RECALLS", "NO CALL");
126 			DEBUG(4, "MAX RECALL COUNT %d\n", count);
127 			if (Debug) {
128 				logent("debugging", "continuing anyway");
129 				return SS_OK;
130 			}
131 			return type;
132 		}
133 
134 		if (prestime - lasttime < retrytime) {
135 			logent("RETRY TIME NOT REACHED", "NO CALL");
136 			DEBUG(4, "RETRY TIME (%ld) NOT REACHED\n", retrytime);
137 			if (Debug) {
138 				logent("debugging", "continuing anyway");
139 				return SS_OK;
140 			}
141 			return type;
142 		}
143 
144 		return SS_OK;
145 	default:
146 		return SS_OK;
147 	}
148 }
149