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 d

⟦75d0276b4⟧ TextFile

    Length: 3784 (0xec8)
    Types: TextFile
    Names: »dchan_acheck.c«

Derivation

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

TextFile

/* dchan_acheck.c: address checking for a channel allowing DR's */

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

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Lib/pp/RCS/dchan_acheck.c,v 5.0 90/09/20 16:10:41 pp Exp Locker: pp $
 *
 * $Log:	dchan_acheck.c,v $
 * Revision 5.0  90/09/20  16:10:41  pp
 * rcsforce : 5.0 public release
 * 
 */



#include "util.h"
#include "adr.h"
#include "qmgr.h"

int dchan_acheck (ap, asp, thechan, first, mta)
ADDR    *ap, *asp;
CHAN	*thechan;
int     first;
char	**mta;
{
	ADDR	*ac;
	LIST_RCHAN      *chan;
	int     	i;
	int		donealready = 0;
	static int	drwr = 0;
	static int	pend = 0;

	if (first)
		drwr = pend = 0;

	switch (ap -> ad_status) {
	    case AD_STAT_PEND:
		if (drwr) {
			PP_LOG (LLOG_EXCEPTIONS,
				("Recips have diff status"));
			(void) delivery_set (ap -> ad_no,
					     int_Qmgr_status_messageFailure);
			return NOTOK;
		}
		ac = ap;
		break;

	    case AD_STAT_DONE:
		(void) delivery_set (ap -> ad_no,
				     int_Qmgr_status_success);
		return NOTOK;
		
	    case AD_STAT_DRWRITTEN:
		if (pend) {
			PP_LOG (LLOG_EXCEPTIONS,
				("Recips have diff status"));
			delivery_set (ap -> ad_no,
				      int_Qmgr_status_messageFailure);
			return NOTOK;
		}
		if (first)
			drwr = ap->ad_no;
		else if (drwr != ap->ad_no) {
			PP_LOG (LLOG_EXCEPTIONS,
				("Mismatch on DR's %d & %d",
				 ap->ad_no, drwr));
			delivery_set (ap -> ad_no,
				      int_Qmgr_status_messageFailure);
			return NOTOK;
		}
		ac = asp;
		break;

	    default:
		PP_LOG (LLOG_EXCEPTIONS, ("adr_checks - wrong status"));
		(void) delivery_set (ap -> ad_no,
				     int_Qmgr_status_messageFailure);
		return NOTOK;
	}

	for (chan = ac -> ad_fmtchan, i = 0; i < ac -> ad_rcnt && chan;
	     chan = chan -> li_next, i++) {
		if (strcmp (chan->li_chan->ch_name, thechan->ch_name) == 0)
			donealready = 1;
	}

	if (chan == NULL)
		chan = ac -> ad_outchan;


	if (chan -> li_chan == NULLCHAN || 
		chan->li_chan->ch_name == NULLCP || 
		thechan->ch_name == NULLCP) 
	{
		PP_NOTICE (("Unable to compare channels - nullchan found"));
		(void) delivery_set (ap -> ad_no,
				     int_Qmgr_status_messageFailure);
		return NOTOK;
	}


	if (strcmp (chan -> li_chan -> ch_name, thechan -> ch_name) != 0) {
		if (donealready) {
			PP_NOTICE (("Done channel %s already",
				    thechan -> ch_name));
			(void) delivery_set (ap -> ad_no,
					     int_Qmgr_status_success);
			return NOTOK;
		}
		PP_LOG (LLOG_EXCEPTIONS,
			("adr %d not ready for channel %s yet",
			 ap -> ad_no, thechan -> ch_name));
		(void) delivery_set (ap -> ad_no,
				     int_Qmgr_status_messageFailure);
		return NOTOK;
	}

	if (ap -> ad_resp == 0) {
		PP_LOG (LLOG_EXCEPTIONS,
			("responsibility bit not set for addr %d",
			 ap -> ad_no));
		(void) delivery_set (ap -> ad_no,
				     int_Qmgr_status_messageFailure);
		return NOTOK;
	}

	if (mta == NULLVP)	/* mta check not required */
		return OK;

	if (thechan -> ch_mta) {
		*mta = strdup (thechan -> ch_mta);
		return OK;
	}

	if (ac -> ad_outchan -> li_mta == NULLCP) {
		PP_LOG (LLOG_EXCEPTIONS,
			("No mta for address %d", ap -> ad_no));
		(void) delivery_set (ap -> ad_no,
				     int_Qmgr_status_messageFailure);
		return NOTOK;
	}

	if (*mta == NULLCP)
		*mta = strdup (ac -> ad_outchan -> li_mta);
	else if (strcmp (*mta, ac -> ad_outchan -> li_mta) != 0) {
		if (first) {	/* ok to change here */
			free (*mta);
			*mta = strdup (ac -> ad_outchan -> li_mta);
		}
		else {
			PP_LOG (LLOG_EXCEPTIONS,
				("Mta changed from %s to %s", *mta,
				 ac -> ad_outchan -> li_mta));
			(void) delivery_set (ap -> ad_no,
					     int_Qmgr_status_messageFailure);
			return NOTOK;
		}
	}
	return OK;
}