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 r

⟦27434872d⟧ TextFile

    Length: 3721 (0xe89)
    Types: TextFile
    Names: »rfc822_parse.c«

Derivation

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

TextFile

/* rfc822_parse.c: 822 address parsing & handling */

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

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



#include "head.h"
#include "adr.h"
#include "ap.h"


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



/* --- *** ---
Parse an rfc822 address and convert the value into a list of address parts
	E.g user%xxx.yyy.zzz%aaa.sss.ddd@qqq.www.eee
--- *** --- */

static void strip_excess_domains_from_route();

rfc822_parse (ad, order_pref, full, 
	      pgroup, pname, plocal, pdomain, proute)
ADDR    *ad;
int	order_pref;
int	full;
AP_ptr	*pgroup,
	*pname,
	*plocal,
	*pdomain,
	*proute;
{
	AP_ptr          tree;
	char		*cp;
	PP_DBG (("Lib/parse/rfc822_parse/ad_rfc822='%s', ad_value='%s'",
		 ad->ad_r822adr, ad->ad_value));

	tree = ap_s2t (ad->ad_r822adr ? ad->ad_r822adr : ad->ad_value);

	switch ((int)tree) {
	    case 0:
		/* -- could parse it and found it to be duff -- */
		ad->ad_parse_message = strdup("Bad address");
		return RP_NO;

	    case NOTOK:
		/* -- couldn't parse it (x400 ??)  -- */
		ad->ad_parse_message = strdup("822 parse error");
		return RP_PARSE;
	    
	    default:
		break;
	}


	/* -- set order pref set from inound channel -- */
	tree = ap_normalize (tree, order_pref);

	/* -- split into parts for ad_check. -- */

	(void) ap_t2p (tree, pgroup, pname, plocal, pdomain, 
					proute);

	strip_excess_domains_from_route(tree, pgroup, pname, plocal, pdomain,
			    proute);

	/* -- parsed okay so fill in ad->rfc822 to pass this up */

	/* -- convert back to a string -- */
	if (full == OK)
		cp = ap_p2s (*pgroup, *pname, *plocal, *pdomain, *proute);
	else 
		cp = ap_p2s_nc (NULLAP, NULLAP, *plocal, *pdomain, *proute);
	/* -- Put the address into the ad structure -- */
	ad->ad_r822adr = cp;

	return RP_OK;
}

extern char	*loc_dom_site, *loc_dom_mta;
extern int	all_domain_norm;

static int isLocal(ap)
AP_ptr	ap;
{
	return (lexequ (ap->ap_obvalue, loc_dom_site) == 0
		|| lexequ (ap->ap_obvalue, loc_dom_mta) == 0);
}

static void strip_excess_domains_from_route (tree, group, name, local, domain, route)
register AP_ptr         tree;           /* -- the parse tree -- */
AP_ptr                  *group,         /* -- start of group name -- */
			*name,          /* -- start of person name -- */
			*local,         /* -- start of local-part -- */
			*domain,        /* -- basic domain reference -- */
			*route;         /* -- start of 822 reverse route -- */
{
	if (*route == NULLAP)
		return;

	while (*route != NULLAP
	       && *route != *domain
	       && *route != *local
	       && *route != *name
	       && *route != *group) {
		if (isLocal(*route)
		    || (all_domain_norm == TRUE && (*route)->ap_next 
			&& (*route)->ap_next->ap_obvalue
			&& (lexequ ((*route)->ap_obvalue, (*route)->ap_next->ap_obvalue) == 0)))
			*route = (*route)->ap_next;
		else
			break;
	}
	if (all_domain_norm == TRUE && *route != NULLAP 
	    && ((*route) -> ap_next == *local
		|| (*route) -> ap_next == *name
		|| (*route) -> ap_next == *group
		|| (*route) -> ap_next == NULLAP)) {
		/* only one in route test to see if matches with domain */
		if (*domain && (*domain) -> ap_obvalue
		    && lexequ ((*route) -> ap_obvalue, (*domain) -> ap_obvalue) == 0)
			*route = (*route) -> ap_next;
	}

	if (*route == *domain 
	    || *route == *local
	    || *route == *name
	    || *route == *group)
		*route = NULLAP;
}