Ultrix-3.1/src/cmd/uucp/systat.c

Compare this file to the similar file:
Show the results in this format:


/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/

static char Sccsid[] = "@(#)systat.c	3.0	4/22/86";


/*******
 *	systat(name, type, text)	make system status entry
 *	char *name, *text;
 *	int type.
 *
 *	return codes:  none
 */


/******************
 * Mods:
 *	decvax!larry - clear count when conversation completes successfully
 *		     - place STST. files in SPOOL/STST. directory
 *	  3/8/84     - put last successful connect time in STST. file
 *****************/

#include "uucp.h"
#include <sys/types.h>
#include <errno.h>


extern	time_t	time();
extern int errno;

#define STATNAME(f, n) sprintf(f, "%s/STST./%s.%.7s", SPOOL, "STST", n)
#define S_SIZE 150


systat(name, type, text)
char *name, *text;
int type;
{
	char filename[MAXFULLNAME], line[S_SIZE];
	int count;
	FILE *fp;
	time_t lasttime, prestime, successtime;
	long retrytime;

	line[0] = '\0';
	time(&prestime);
	count = 0;
	successtime = (time_t)0;
	STATNAME(filename, name);

	fp = fopen(filename, "r");
	if (fp != NULL) {
		fseek(fp, 0L, 0);
		fscanf(fp, "%*d%d%*ld%*ld%ld", &count, &successtime); 
		if (count <= 0)
			count = 0;
		fclose(fp);
	}
	fp = fopen(filename, "w+");
	ASSERT2(fp != NULL, "SYSTAT OPEN FAIL", filename, errno);
		

	switch(type) {
	case SS_FAIL:
		count++;
		break;
	case SS_COMPLETE:
		count = 0;
		break;
	case SS_INPROGRESS:
		time(&successtime);
		count = 0;
		break;
	case SS_CONN_OK:
		time(&successtime);
		break;
	}


	fseek(fp, 0L, 0 );
	chmod(filename, 0666);
	fprintf(fp, "%d %d %ld %ld %ld %s %s\n", type, 
		count, prestime, Retrytime, successtime, text, name);
	fclose(fp);
	return;
}

/***
 *	rmstat(name)	remove system status entry
 *	char *name;
 *
 *	return codes:  none
 */

rmstat(name)
char *name;
{
	char filename[MAXFULLNAME];

	STATNAME(filename, name);
	unlink(filename);
}

/***
 *	callok(name)	check system status for call
 *	char *name;
 *
 *	return codes  0 - ok | >0 system status
 */

callok(name)
char *name;
{
	char filename[MAXFULLNAME], line[S_SIZE];
	FILE *fp;
	time_t lasttime, prestime;
	long retrytime;
	int count, type;

	STATNAME(filename, name);
	fp = fopen(filename, "r");
	if (fp == NULL)
		return(SS_OK);

	if (fgets(line, S_SIZE, fp) == NULL) {
		/*  no data  */
		fclose(fp);
		unlink(filename);
		return(SS_OK);
	}

	fclose(fp);
	time(&prestime);
	sscanf(line, "%d%d%ld%ld", &type, &count, &lasttime, &retrytime);

	switch(type) {
	case SS_BADSEQ:
	case SS_CALLBACK:
	case SS_NODEVICE:
	case SS_INPROGRESS:	/*let LCK take care of it */
		return(SS_OK);

	case SS_FAIL:
		if (count > MAXRECALLS) {
			logent("MAX RECALLS", "NO CALL");
			DEBUG(4, "MAX RECALL COUNT %d\n", count);
			return(type);
		}

		if (prestime - lasttime < retrytime) {
			logent("RETRY TIME NOT REACHED", "NO CALL");
			DEBUG(4, "RETRY TIME (%d) NOT REACHED\n", (long)  RETRYTIME);
			return(type);
		}

		return(SS_OK);
	default:
		return(SS_OK);
	}
}