xref: /csrg-svn/usr.bin/uucp/libuu/systat.c (revision 33957)
113672Ssam #ifndef lint
2*33957Srick static char sccsid[] = "@(#)systat.c	5.5	(Berkeley) 04/05/88";
313672Ssam #endif
413672Ssam 
513672Ssam #include "uucp.h"
613672Ssam 
723675Sbloom #define STATNAME(f, n) sprintf(f, "%s/%s/%s", Spool, "STST", n)
813672Ssam #define S_SIZE 100
913672Ssam 
1023675Sbloom /*LINTLIBRARY*/
1123675Sbloom 
1218622Sralph /*
1318622Sralph  *	make system status entry
1413672Ssam  *	return codes:  none
1513672Ssam  */
1613672Ssam systat(name, type, text)
1713672Ssam char *name, *text;
1813672Ssam int type;
1913672Ssam {
2013672Ssam 	char filename[MAXFULLNAME], line[S_SIZE];
2117838Sralph 	int count, oldtype;
2213672Ssam 	register FILE *fp;
2317838Sralph 	time_t prestime, rtry;
2413672Ssam 
2513672Ssam 	if (type == 0)
2613672Ssam 		return;
2713672Ssam 	line[0] = '\0';
2813672Ssam 	time(&prestime);
2913672Ssam 	count = 0;
3013672Ssam 	STATNAME(filename, name);
3113672Ssam 
3213672Ssam 	fp = fopen(filename, "r");
3313672Ssam 	if (fp != NULL) {
3413672Ssam 		fgets(line, S_SIZE, fp);
3517838Sralph 		sscanf(line, "%d %d", &oldtype, &count);
3613672Ssam 		if (count <= 0)
3713672Ssam 			count = 0;
3813672Ssam 		fclose(fp);
3917838Sralph 		/* If merely 'wrong time', don't change existing STST */
4017838Sralph 		if (type == SS_WRONGTIME && oldtype != SS_INPROGRESS)
4117838Sralph 			return;
4213672Ssam 	}
4313672Ssam 
4417838Sralph 	rtry = Retrytime;
4517838Sralph 	/* if failures repeat, don't try so often,
4617838Sralph 	 * to forstall a 'MAX RECALLS' situation.
4717838Sralph 	 */
4817838Sralph 	if (type == SS_FAIL) {
4913672Ssam 		count++;
5017838Sralph 		if (count > 5) {
5117838Sralph 			rtry = rtry * (count-5);
5217838Sralph 			if (rtry > ONEDAY/2)
5317838Sralph 				rtry = ONEDAY/2;
5417838Sralph 		}
5517838Sralph 	}
5613672Ssam 
5717838Sralph 
5817838Sralph #ifdef VMS
5917838Sralph 	unlink(filename);
6017838Sralph #endif VMS
6113672Ssam 	fp = fopen(filename, "w");
62*33957Srick 	if (fp == NULL) {
63*33957Srick 		syslog(LOG_ERR, "fopen(%s) failed: %m", filename);
64*33957Srick 		cleanup(FAIL);
65*33957Srick 	}
6617838Sralph 	fprintf(fp, "%d %d %ld %ld %s %s\n", type, count, prestime, rtry, text, name);
6713672Ssam 	fclose(fp);
6813672Ssam }
6913672Ssam 
70*33957Srick /*
71*33957Srick  *	remove system status entry
7213672Ssam  *
7313672Ssam  *	return codes:  none
7413672Ssam  */
7513672Ssam rmstat(name)
7613672Ssam char *name;
7713672Ssam {
7813672Ssam 	char filename[MAXFULLNAME];
7913672Ssam 
8013672Ssam 	STATNAME(filename, name);
8113672Ssam 	unlink(filename);
8213672Ssam }
8313672Ssam 
8423675Sbloom /*
8523675Sbloom  *	check system status for call
8613672Ssam  *
8713672Ssam  *	return codes  0 - ok | >0 system status
8813672Ssam  */
8913672Ssam callok(name)
9013672Ssam char *name;
9113672Ssam {
9213672Ssam 	char filename[MAXFULLNAME], line[S_SIZE];
9313672Ssam 	register FILE *fp;
9417838Sralph 	time_t lasttime, prestime, retrytime;
9517838Sralph 	long t1, t2;
9613672Ssam 	int count, type;
9713672Ssam 
9813672Ssam 	STATNAME(filename, name);
9913672Ssam 	fp = fopen(filename, "r");
10013672Ssam 	if (fp == NULL)
10113672Ssam 		return(SS_OK);
10213672Ssam 
10313672Ssam 	if (fgets(line, S_SIZE, fp) == NULL) {
10413672Ssam 		/*  no data  */
10513672Ssam 		fclose(fp);
10613672Ssam 		unlink(filename);
10713672Ssam 		return(SS_OK);
10813672Ssam 	}
10913672Ssam 
11013672Ssam 	fclose(fp);
11113672Ssam 	time(&prestime);
11217838Sralph 	sscanf(line, "%d%d%ld%ld", &type, &count, &t1, &t2);
11317838Sralph 	lasttime = t1;
11417838Sralph 	retrytime = t2;
11513672Ssam 
11613672Ssam 	switch(type) {
11713672Ssam 	case SS_BADSEQ:
11813672Ssam 	case SS_CALLBACK:
11913672Ssam 	case SS_NODEVICE:
12013672Ssam 	case SS_INPROGRESS:	/*let LCK take care of it */
12113672Ssam 		return(SS_OK);
12213672Ssam 
12313672Ssam 	case SS_FAIL:
12413672Ssam 		if (count > MAXRECALLS) {
12513672Ssam 			logent("MAX RECALLS", "NO CALL");
12613672Ssam 			DEBUG(4, "MAX RECALL COUNT %d\n", count);
12717838Sralph 			if (Debug) {
12817838Sralph 				logent("debugging", "continuing anyway");
12917838Sralph 				return SS_OK;
13017838Sralph 			}
13117838Sralph 			return type;
13213672Ssam 		}
13313672Ssam 
13413672Ssam 		if (prestime - lasttime < retrytime) {
13513672Ssam 			logent("RETRY TIME NOT REACHED", "NO CALL");
13617838Sralph 			DEBUG(4, "RETRY TIME (%ld) NOT REACHED\n", retrytime);
13717838Sralph 			if (Debug) {
13817838Sralph 				logent("debugging", "continuing anyway");
13917838Sralph 				return SS_OK;
14017838Sralph 			}
14117838Sralph 			return type;
14213672Ssam 		}
14313672Ssam 
14417838Sralph 		return SS_OK;
14513672Ssam 	default:
14617838Sralph 		return SS_OK;
14713672Ssam 	}
14813672Ssam }
149