V10/cmd/daemon/fgdemon.c

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

/*
 * Retrieve files from GCOS via Spider or dataphone
 */

#include	<errno.h>
#include	<setjmp.h>

char	dpd[]	= "/usr/spool/dpd";
char	lock[]	= "/usr/spool/dpd/glock";
char	error[]	= "/usr/spool/dpd/errors";

#include	"daemon0.c"

#define MINUTES 60

#define OKTRB 0
#define BADTRB 1
#define FATTRB 2

char	zfname[]	= "/usr/spool/dpd/zf";
int	LZFNAME	= 0;	/*length of pathname of zf-file thru 'f'. MRW */
char	badbuf[]	= "/usr/spool/dpd/fget.badbuf";
char	okmes[] = "OK nd =%3d, nf = %-19d";
char	fgeto[]	= "fget.odemon";
char	*argvo[] = {fgeto, NULL, NULL};

FILE	*ofd = NULL;		/*data file*/
FILE	*tfd = NULL;		/*badbuf file*/
int	tlaps = 0;
int	tlimit = 6*MINUTES;
int	tfac = 1;
int	nbaderr = 0;
int	gotit = 0;
int	nfiles = 0;
int	ndelim = 0;
long	nnull = 0;		/*count of consecutive nulls*/
char	fname[108];
jmp_buf	env;

int	(*output)();


main(argc, argv)

int argc;
char *argv[];

{

int i;
extern	ignore();

	dem_setup();
	LZFNAME = 0;		/*calculate length of zfname. MRW*/
	while(zfname[LZFNAME])  LZFNAME++;

	if (argc == 2) {
		argvo[1] = argv[1];
		tlimit = 0;
		i = 0;
		while ( argv[1][i] ) tlimit = 10*tlimit +  argv[1][i++] - '0' ;
		}

#ifdef	DEBUG
	fprintf(stderr, "tlimit = %d\n",tlimit); /* PRINTF */
#endif

	setjmp(env);

	ofd = NULL;
	output = ignore;

	fgd_read();	/*perform input appropriate to device.*/

	if (gotit == 0)
		trouble(OKTRB, -20, "no output");

	if (gotit == 1) {
		gotit = 2;
		trouble(OKTRB, 20, okmes, ndelim, nfiles);
		}

	trouble(OKTRB, 0, okmes, ndelim, nfiles);
}



/* VARARGS */
trouble(lev, t, s, a1, a2, a3)
int	lev;
int	t;
char	*s;
int	a1, a2, a3;
{

#ifdef	DEBUG
	fprintf(stderr, s, a1, a2, a3); putc('\n', stderr); /* PRINTF */
#endif
	alarm(0);
	dem_dis();	/*close appropriate device.*/
	if ( lev >= BADTRB ) nbaderr++;

	if ( lev <= BADTRB && nbaderr < 2 && t != 0 && tlaps < tlimit ) {
		if (t < 0) t = -t;
		t *= tfac;
		if (t > 4*MINUTES) t = 4*MINUTES;
#ifdef	DEBUG
		fprintf(stderr, "holding, t = %d, tlaps =  %d\n",t,tlaps); /* PRINTF */
#endif
		sleep(t);
		tlaps += t;
		tfac += tfac;
		if(access(lock, 0) == 0)
			longjmp(env, 1);
		logerr("glock has disappeared");
	}

	if(gotit)
		logerr(okmes, ndelim, nfiles);
	if(t >= 0 && lev > OKTRB)
		logerr(s, a1, a2, a3);

	if ( lev >= BADTRB ) {
		sleep(20);
		unlink(lock);
#ifndef DEBUG
#if SPIDER
		execv("/etc/fget.odemon", argvo);
		execv("/usr/lib/fget.odemon", argvo);
#endif
#endif
		}

	unlink(lock);
	exit(0);
}




ignore(b, i)
{
}


outputa(b, i)
char	*b;
int	i;
{
	for ( ; i -- > 0; b++ ) {
		if (*b == '\0') nnull++;
		else {
			for ( ; nnull > 0; nnull -- ) putc( '\0', ofd );
			putc( *b, ofd );
			}
		}
}


outputb(b, i)
char	*b;
int	i;
{
	for ( ; i-- > 0; b++ ) putc( *b, ofd );
}


firstln(b, i)
char	b[];
int	i;
{
	char	*fp, *sp;
	extern	ignore(), outputa(), outputb();

	output = ignore;
	if ( i == 0 ) return;
	b[i-1] = '\0';
	if (i < 104 || b[1] != ' ') {
		logerr("illeg contr line  %s", b);
		return;
		}

	switch (b[0]) {

		case 'a':
		case 'A':
			output = outputa;
			break;

		case 'b':
		case 'B':
			output = outputb;
			break;

		default:
			logerr("illegal control char - %s\n", b);
			return;

		}

	fp = fname;
	sp = &b[2];
	while (*fp++ = *sp++);

#ifdef	DEBUG
	fprintf(stderr, "file = %s\n",fname); /* PRINTF */
#endif

	if ( (ofd = fopen(fname, "w")) == NULL) {
		output = ignore;
		logerr("cannot open: %s",  fname);
		}

	nnull = 0;
}



endfile()
{
int	n;
char	*fp;
extern	firstln();

	gotit = 1;
	ndelim++;
	output = firstln;
	if (ofd == NULL) return;
	FCLOSE(ofd);

	nfiles++;
	nnull = 0;

	n = 0;
	fp = fname;
	while (n  < LZFNAME) {
		if (*fp++ != zfname[n++]) return;
		}

	unlink(fname);


}