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 s

⟦fe6964e5b⟧ TextFile

    Length: 6198 (0x1836)
    Types: TextFile
    Names: »submit_mgt.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/submit_mgt.c« 

TextFile

/* submit_mgt.c: management stuff */

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

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



#include "head.h"
#include "prm.h"
#include "q.h"
#include "dr.h"
#include <sys/time.h>

/* -- defines  -- */
#define MAX_TRACE_HOPS		25
#define MAX_NUM_LOCAL_MTA	5


/* -- externals -- */
extern  time_t          time();
extern  Q_struct        Qstruct;
extern  int             privileged;
extern	int		return_interval_norm,
	return_interval_low,
	return_interval_high;
extern  int             accept_all;
extern	int		notrace;
extern  char            *loc_dom_site, *loc_dom_mta,
			*ia5_bp, *hdr_822_bp,
			io_fpart[];

/* -- globals -- */
CHAN                    *ch_inbound;
char                    *mgt_inhost;
int                     mgt_adtype = AD_822_TYPE;
void			message_failure();



/* -- local routines -- */
int			cntrl_mgt();
int			q_mgt();
void			message_failure();
void			msg_mgt();
void			time_mgt();
void			txt_mgt();

static void		tracecheck_mgt();




/* ---------------------  Begin  Routines  -------------------------------- */




int cntrl_mgt (prm, qp)
register struct prm_vars        *prm;
register Q_struct               *qp;
{
	CHAN                    *ch = NULLCHAN;


	PP_TRACE (("submit/cntrl_mgt (type = %d)", mgt_adtype));

	accept_all = (prm -> prm_opts & PRM_ACCEPTALL) == PRM_ACCEPTALL;
	notrace = (prm -> prm_opts & PRM_NOTRACE) == PRM_NOTRACE;

	/* -- what incomming channel is calling submit -- */

	if (qp -> inbound == NULL ||
	    (ch_inbound = ch = qp -> inbound -> li_chan) == NULLCHAN)
		err_abrt (RP_MECH, "No channel given");

	if (ch -> ch_access == CH_MTA) {
		if (!privileged)
			err_abrt (RP_USER, "Privileged channel");
	}

	if (ch_inbound -> ch_domain_norm == CH_DOMAIN_NORM_ALL)
		ap_norm_all_domains();
	else
		ap_norm_first_domain();

	if ((mgt_inhost = qp -> inbound -> li_mta) == NULLCP) {
		if (ch -> ch_chan_type != CH_IN)
			err_abrt (RP_USER, "Incomming chan required");
		mgt_inhost = loc_dom_site;
	} else {
		char    official[LINESIZE], *subdom;

		/* normalise inbound mta */
		if (tb_getdomain (mgt_inhost, NULLCP, official, 
				  ch_inbound -> ch_ad_order,
				  &subdom) == OK 
		    && official[0]) {
			free(qp->inbound->li_mta);
			mgt_inhost = qp->inbound->li_mta = strdup(official);
		}
		if (subdom != NULLCP) free (subdom);
	}
			
	mgt_adtype = ch -> ch_ad_type;

	if (mgt_adtype == AD_822_TYPE)
                qp -> content_return_request = TRUE;

	PP_TRACE (("submit/cntrl_mgt (type='%d', order='%d')",
		mgt_adtype, ch_inbound -> ch_ad_order));

	return (RP_OK);
}




int q_mgt (qp)
register Q_struct       *qp;
{
	PP_TRACE (("submit/q_mgt (qp)"));

	/* -- generate a submit-event-id -- */
	if (mgt_adtype == AD_822_TYPE || qp -> msgid.mpduid_string == NULLCP)
		MPDUid_new (&qp -> msgid);

	/* -- add trace info -- */
	trace_add (&qp -> trace, trace_new());

	if (qp -> retinterval == 0) {
		switch (qp -> priority) {
		    case PRIO_URGENT:
			qp -> retinterval = return_interval_high;
			break;
		    case PRIO_NONURGENT:
			qp -> retinterval = return_interval_low;
			break;
		    default:
			qp -> retinterval = return_interval_norm;
			break;
		}
	}
	return (RP_OK);
}




void time_mgt()
{
	time_t	then, now;
	char	buf[BUFSIZ];

	if (Qstruct.latest_time != NULLUTC) {
		then = utc2time_t(Qstruct.latest_time);
		(void) time(&now);
		if (then < now) {
			(void) sprintf (buf, "This message's latest time has been exceeded");
			message_failure (DRR_UNABLE_TO_TRANSFER,
					 DRD_MAX_TIME_EXPIRED,
					 buf);
		}
	}
}




void msg_mgt()
{
	PP_TRACE (("submit/msg_mgt()"));
	ch_inbound = NULLCHAN;
	mgt_inhost = NULLCP;
}




void txt_mgt()   /* -- management tasks on the input text -- */
{
	PP_TRACE (("submit/txt_mgt()"));

	if (isnull (*io_fpart))
		err_abrt (RP_MECH, "Help - lost io_part");

	/* -- if its an 822 body, check it's parts -- */
	if (Qstruct.msgtype == MT_UMPDU &&
	    list_bpt_find (Qstruct.encodedinfo.eit_types, hdr_822_bp) != NULLIST_BPT)
		rd_rfchdr (io_fpart);
	if (Qstruct.encodedinfo.eit_types == NULLIST_BPT)
		Qstruct.encodedinfo.eit_types = list_bpt_dup (Qstruct.orig_encodedinfo.eit_types);

	/* -- check for trace looping -- */
	tracecheck_mgt(&Qstruct);
	/* -- currently ok -- */
	pro_reply (RP_OK, "text input successful");
}




void message_failure (reason, diag, str)
int	reason, diag;
char	*str;
{
	ADDR	*ap, *apf = NULLADDR;
	extern ADDR *ad_recip;

	for (ap = ad_recip; ap; ap = ap -> ad_next) {
		if (ap -> ad_resp == FALSE)
			continue;
		if (ap -> ad_status != AD_STAT_PEND)
			continue;
		if (apf == NULLADDR)
			apf = ap;
		ap -> ad_status = AD_STAT_DRREQUIRED;
	}
	if (apf) {
		apf -> ad_reason = reason;
		apf -> ad_diagnostic = diag;
		apf -> ad_add_info = strdup (str);
	}
}





/* ---------------------  Static  Routines  ------------------------------- */




static void tracecheck_mgt (qp)
Q_struct	*qp;
{
	register Trace	*tp;
	int		nhops = 0, first = 0;
	char		buf[BUFSIZ];
	PP_TRACE (("submit/tracecheck_mgt (qp)"));

	for (tp = qp -> trace; tp != NULL; 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);
			PP_LOG(LLOG_EXCEPTIONS,
			       ("%s", buf));
			return;
		}

		if (tp -> trace_mta != NULLCP) {
			/* can only check against those with mta specified */
			if (lexequ(tp -> trace_mta, loc_dom_mta) == 0) {
				if (first >= MAX_NUM_LOCAL_MTA) {
					(void) sprintf (buf, "%s%s",
							"A loop has been detected in the Trace at ",
						"field for this Message");
					PP_LOG(LLOG_EXCEPTIONS,
					       ("tracecheck_mgt(%s)", buf));
					message_failure (DRR_UNABLE_TO_TRANSFER,
							 DRD_LOOP_DETECTED, buf);
					return;
				} else
					first++;
			}
		}
	}
}