DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T t

⟦600b25b62⟧ TextFile

    Length: 2426 (0x97a)
    Types: TextFile
    Names: »t-tracecheck.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Src/submit/t-tracecheck.c« 

TextFile

/* t-tracecheck: small wrap around to test checking of traces */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Src/submit/RCS/t-tracecheck.c,v 5.0 90/09/20 16:23:35 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Src/submit/RCS/t-tracecheck.c,v 5.0 90/09/20 16:23:35 pp Exp Locker: pp $
 *
 * $Log:	t-tracecheck.c,v $
 * Revision 5.0  90/09/20  16:23:35  pp
 * rcsforce : 5.0 public release
 * 
 */



#include "head.h"
#include "q.h"
#include "prm.h"
#include "dr.h"

#define MAX_TRACE_HOPS  15

static int inTraceList (tp, list)
Trace	*tp, *list;
{
	int	retval = NOTOK;

	while (retval == NOTOK && list != NULL) {
		if (trace_equ(tp, list) == 0)
			retval = OK;
		else
			list = list -> trace_next;
	}
	return retval;
}

static void addToTraceList(this, to)
Trace	*this, **to;
{
	Trace	*next;
	if (this == NULL)
		return;
	next = this -> trace_next;
	this -> trace_next = NULL;
	trace_add(to, trace_dup(this));
	this -> trace_next = next;
}
      

void tracecheck_mgt (qp)
Q_struct	*qp;
{
	register Trace	*tp;
	Trace		*list = NULL;
	int		nhops = 0;
	char		buf[BUFSIZ];
	PP_DBG (("submit/tracecheck_mgt (qp)"));

	for (tp = qp->trace; tp; tp = tp -> trace_next) {
		/* -- too many hops -- */

		if (++nhops > MAX_TRACE_HOPS) {
			(void) sprintf (buf,
				"%s%s %d",
				"This Message has travelled a long time, ",
				"there are too many Trace hops", nhops);
/*			message_failure (DRR_UNABLE_TO_TRANSFER,
					 DRD_LOOP_DETECTED, buf);*/
			if (list != NULL) trace_free(list);
			return;
		}

		if (tp -> trace_mta != NULLCP) {
			/* can only check against those with mta specified */
			if (inTraceList(tp, list) == OK) {
				(void) sprintf (buf, "%s%s",
						"A Loop has been detected in the Trace ",
						"field for this Message");
/*				message_failure (DRR_UNABLE_TO_TRANSFER,
						 DRD_LOOP_DETECTED, buf);*/
				if (list != NULL) trace_free(list);
				return;
			} else
				addToTraceList(tp, &list);
		}
	}
	if (list != NULL) trace_free (list);
}

main (argc, argv)
int  argc;
char **argv;
{
	struct prm_vars	prm;
	Q_struct	que;
	ADDR		*sender = NULL;
	ADDR		*recips = NULL;
	int 		rcount;
	if (argc < 2) {
		printf("usage : %s msg", argv[0]);
		exit(0);
	}
	sys_init(argv[0]);

	if (rp_isbad(rd_msg(argv[1],&prm,&que,&sender,&recips,&rcount))) {
		printf("rd_msg err: '%s'",argv[1]);
		rd_end();
		exit(0);
	}
	tracecheck_mgt (&que);
	rd_end();
}