xref: /csrg-svn/usr.bin/uucp/libuu/systat.c (revision 17838)
113672Ssam #ifndef lint
2*17838Sralph static char sccsid[] = "@(#)systat.c	5.2 (Berkeley) 01/22/85";
313672Ssam #endif
413672Ssam 
513672Ssam #include "uucp.h"
613672Ssam #include <sys/types.h>
713672Ssam 
813672Ssam extern	time_t	time();
913672Ssam 
10*17838Sralph #define STATNAME(f, n) sprintf(f, "%s/%s/%.7s", Spool, "STST", n)
1113672Ssam #define S_SIZE 100
1213672Ssam 
1313672Ssam /*******
1413672Ssam  *	systat(name, type, text)	make system status entry
1513672Ssam  *	char *name, *text;
1613672Ssam  *	int type.
1713672Ssam  *
1813672Ssam  *	return codes:  none
1913672Ssam  */
2013672Ssam 
2113672Ssam systat(name, type, text)
2213672Ssam char *name, *text;
2313672Ssam int type;
2413672Ssam {
2513672Ssam 	char filename[MAXFULLNAME], line[S_SIZE];
26*17838Sralph 	int count, oldtype;
2713672Ssam 	register FILE *fp;
28*17838Sralph 	time_t prestime, rtry;
2913672Ssam 
3013672Ssam 	if (type == 0)
3113672Ssam 		return;
3213672Ssam 	line[0] = '\0';
3313672Ssam 	time(&prestime);
3413672Ssam 	count = 0;
3513672Ssam 	STATNAME(filename, name);
3613672Ssam 
3713672Ssam 	fp = fopen(filename, "r");
3813672Ssam 	if (fp != NULL) {
3913672Ssam 		fgets(line, S_SIZE, fp);
40*17838Sralph 		sscanf(line, "%d %d", &oldtype, &count);
4113672Ssam 		if (count <= 0)
4213672Ssam 			count = 0;
4313672Ssam 		fclose(fp);
44*17838Sralph 		/* If merely 'wrong time', don't change existing STST */
45*17838Sralph 		if (type == SS_WRONGTIME && oldtype != SS_INPROGRESS)
46*17838Sralph 			return;
4713672Ssam 	}
4813672Ssam 
49*17838Sralph 	rtry = Retrytime;
50*17838Sralph 	/* if failures repeat, don't try so often,
51*17838Sralph 	 * to forstall a 'MAX RECALLS' situation.
52*17838Sralph 	 */
53*17838Sralph 	if (type == SS_FAIL) {
5413672Ssam 		count++;
55*17838Sralph 		if (count > 5) {
56*17838Sralph 			rtry = rtry * (count-5);
57*17838Sralph 			if (rtry > ONEDAY/2)
58*17838Sralph 				rtry = ONEDAY/2;
59*17838Sralph 		}
60*17838Sralph 	}
6113672Ssam 
62*17838Sralph 
63*17838Sralph #ifdef VMS
64*17838Sralph 	unlink(filename);
65*17838Sralph #endif VMS
6613672Ssam 	fp = fopen(filename, "w");
67*17838Sralph 	ASSERT(fp != NULL, "SYSTAT OPEN FAIL", filename, 0);
68*17838Sralph 	fprintf(fp, "%d %d %ld %ld %s %s\n", type, count, prestime, rtry, text, name);
6913672Ssam 	fclose(fp);
7013672Ssam 	return;
7113672Ssam }
7213672Ssam 
7313672Ssam /***
7413672Ssam  *	rmstat(name)	remove system status entry
7513672Ssam  *	char *name;
7613672Ssam  *
7713672Ssam  *	return codes:  none
7813672Ssam  */
7913672Ssam 
8013672Ssam rmstat(name)
8113672Ssam char *name;
8213672Ssam {
8313672Ssam 	char filename[MAXFULLNAME];
8413672Ssam 
8513672Ssam 	STATNAME(filename, name);
8613672Ssam 	unlink(filename);
8713672Ssam }
8813672Ssam 
8913672Ssam /***
9013672Ssam  *	callok(name)	check system status for call
9113672Ssam  *	char *name;
9213672Ssam  *
9313672Ssam  *	return codes  0 - ok | >0 system status
9413672Ssam  */
9513672Ssam 
9613672Ssam callok(name)
9713672Ssam char *name;
9813672Ssam {
9913672Ssam 	char filename[MAXFULLNAME], line[S_SIZE];
10013672Ssam 	register FILE *fp;
101*17838Sralph 	time_t lasttime, prestime, retrytime;
102*17838Sralph 	long t1, t2;
10313672Ssam 	int count, type;
10413672Ssam 
10513672Ssam 	STATNAME(filename, name);
10613672Ssam 	fp = fopen(filename, "r");
10713672Ssam 	if (fp == NULL)
10813672Ssam 		return(SS_OK);
10913672Ssam 
11013672Ssam 	if (fgets(line, S_SIZE, fp) == NULL) {
11113672Ssam 		/*  no data  */
11213672Ssam 		fclose(fp);
11313672Ssam 		unlink(filename);
11413672Ssam 		return(SS_OK);
11513672Ssam 	}
11613672Ssam 
11713672Ssam 	fclose(fp);
11813672Ssam 	time(&prestime);
119*17838Sralph 	sscanf(line, "%d%d%ld%ld", &type, &count, &t1, &t2);
120*17838Sralph 	lasttime = t1;
121*17838Sralph 	retrytime = t2;
12213672Ssam 
12313672Ssam 	switch(type) {
12413672Ssam 	case SS_BADSEQ:
12513672Ssam 	case SS_CALLBACK:
12613672Ssam 	case SS_NODEVICE:
12713672Ssam 	case SS_INPROGRESS:	/*let LCK take care of it */
12813672Ssam 		return(SS_OK);
12913672Ssam 
13013672Ssam 	case SS_FAIL:
13113672Ssam 		if (count > MAXRECALLS) {
13213672Ssam 			logent("MAX RECALLS", "NO CALL");
13313672Ssam 			DEBUG(4, "MAX RECALL COUNT %d\n", count);
134*17838Sralph 			if (Debug) {
135*17838Sralph 				logent("debugging", "continuing anyway");
136*17838Sralph 				return SS_OK;
137*17838Sralph 			}
138*17838Sralph 			return type;
13913672Ssam 		}
14013672Ssam 
14113672Ssam 		if (prestime - lasttime < retrytime) {
14213672Ssam 			logent("RETRY TIME NOT REACHED", "NO CALL");
143*17838Sralph 			DEBUG(4, "RETRY TIME (%ld) NOT REACHED\n", retrytime);
144*17838Sralph 			if (Debug) {
145*17838Sralph 				logent("debugging", "continuing anyway");
146*17838Sralph 				return SS_OK;
147*17838Sralph 			}
148*17838Sralph 			return type;
14913672Ssam 		}
15013672Ssam 
151*17838Sralph 		return SS_OK;
15213672Ssam 	default:
153*17838Sralph 		return SS_OK;
15413672Ssam 	}
15513672Ssam }
156