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

⟦731f53dfc⟧ TextFile

    Length: 9073 (0x2371)
    Types: TextFile
    Names: »dl_util.c«

Derivation

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

TextFile

/* dl_util.c: */

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

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Chans/dirlist/RCS/dl_util.c,v 5.0 90/09/20 15:45:37 pp Exp Locker: pp $
 *
 * $Log:	dl_util.c,v $
 * Revision 5.0  90/09/20  15:45:37  pp
 * rcsforce : 5.0 public release
 * 
 */



#include "dlist.h"
#include "adr.h"
#include "or.h"
#include <isode/quipu/attrvalue.h>

extern AttributeType at_Member;
extern AttributeType at_Owner;
extern AttributeType at_Permit;
extern AttributeType at_ORAddress;
extern AttributeType at_RFC822;
extern AttributeType at_RoleOccupant;
extern OID dl_oc;

Attr_Sequence current_print = NULLATTR;

extern LLog * log_dsap;

ORName * addr2orname (addr)
ADDR * addr;
{
ORName * or;
OR_ptr por = NULLOR;

	or = (ORName *) smalloc (sizeof (ORName));
	or->on_dn = NULLDN;
	or->on_or = NULLOR;

	if (addr->ad_dn)
		or->on_dn = str2dn (addr->ad_dn);

	if (addr->ad_value) {
		
		if (addr->ad_r822adr)
			or_rfc2or(addr->ad_r822adr,&por);
		else
			por = or_std2or(addr->ad_value);
		
		if (por)
			or->on_or = or_default(por);
	}

	return (or);
}


OR_ptr as2or (as)
Attr_Sequence as;
{
Attr_Sequence tmp;
OR_ptr or_cpy ();

	if ((tmp = as_find_type(as,at_ORAddress)) != NULLATTR) 
		if (tmp->attr_value)
			return (or_cpy ((OR_ptr) tmp->attr_value->avseq_av.av_struct));
	if ((tmp = as_find_type(as,at_RFC822)) != NULLATTR) {
		OR_ptr or;
		if (tmp->attr_value)
			if (or_rfc2or((char *)tmp->attr_value->avseq_av.av_struct,&or) == OK)
				return (or);
	}

	return NULLOR;
}

static avs_seq_print (ps,avs,format) 
PS   ps;
AV_Sequence  avs;
int  format;
{
AV_Sequence eptr;

	for(eptr = avs; eptr != NULLAV; eptr = eptr->avseq_next) {
		ps_print (ps,"  ");
		AttrV_print (ps,&eptr->avseq_av,format);
		ps_print (ps,"\n");
	}
}

static int member_compar (a, b)
AV_Sequence *a, *b;
{
    ORName  * aor = (ORName *)((*a)->avseq_av.av_struct);
    ORName  * bor = (ORName *)((*b)->avseq_av.av_struct);

    return orName_cmp (aor,bor);

}

static avs_seq_print_members (ps,avs) 
PS   ps;
AV_Sequence  *avs;
{
AV_Sequence eptr;
int i=0;
DN tdn, marker, next, trail = NULLDN;
extern char * local_dit;
ORName * or;

	marker = str2dn (local_dit);

	for(eptr = *avs; eptr != NULLAV; eptr = eptr->avseq_next) {
		i++;
		or = (ORName *)eptr->avseq_av.av_struct;
		if ((tdn = or->on_dn) != NULLDN) {
			for (next=marker; 
				(tdn!= NULLDN) && (next != NULLDN); 
				next=next->dn_parent, tdn=tdn->dn_parent) {
				if (dn_comp_cmp(tdn,next) != 0) {
					if (trail == NULLDN) 
						marker = NULLDN;
					else 
						trail->dn_parent = NULLDN;
					dn_free (next);
					break;
				}
				trail = next;
			}
			if (tdn == NULLDN) {
				if (trail == NULLDN) 
					marker = NULLDN;
				else 
					trail->dn_parent = NULLDN;
				dn_free (next);
			}
		}
	}

	if (i>1) {

		AV_Sequence *base, *bp, *ep;

		base = (AV_Sequence *) smalloc ((int)i * sizeof *base);
		ep = base;
		for(eptr = *avs; eptr != NULLAV; eptr = eptr->avseq_next) 
			*ep++ = eptr;
		
		qsort ((char *) base, i, sizeof *base, member_compar);

		bp = base;
		eptr = *avs = *bp++;
		while (bp < ep) {
			eptr -> avseq_next = *bp;
			eptr = *bp++;
		    }
		eptr -> avseq_next = NULL;
		free ((char *) base);
	}

	i = 1;

	for(eptr = *avs; eptr != NULLAV; eptr = eptr->avseq_next) {
		ps_printf (ps,"%2d: ",i++);
		or = (ORName *)eptr->avseq_av.av_struct;
		if (or->on_dn != NULLDN) 
			(void) ufn_dn_print_aux (ps,or->on_dn,marker,TRUE);
		else {
			ps_print (ps,"X.400 Address: ");
			orAddr_print (ps,or->on_or,READOUT);
		}
		ps_print (ps,"\n");
	}
}

check_ORName (ps,or,dncheck,orcheck,update,listname)
PS ps;
ORName * or;
char dncheck;
char orcheck;
char update;
DN listname;
{
OR_ptr newor = NULLOR; 
char buf [LINESIZE];
Attr_Sequence as, dn2addr();
char ret = TRUE;

	if (update)
		dncheck = TRUE;

	if (dncheck && (or->on_dn != NULLDN)) {
		ps_print (ps,"Checking '");
		ufn_dn_print (ps,or->on_dn,FALSE);
		ps_print (ps,"'... ");
		(void) ps_flush (ps);

		if ((as = dn2addr (or->on_dn)) != NULLATTR) 
			newor = as2or (as);

		if (newor == NULLOR) {
			ps_print (ps,"\n *** ORAddress lookup failed ***\n");
			ret = FALSE;
		} else if (orAddr_cmp (newor, or->on_or) == 0) {
			ps_print (ps,"OK\n");
		} else if (update) {	

			if (orAddr_check (newor,&buf[0]) == OK) {
				if (or->on_or == NULLOR) {
					ps_print (ps,"\n   Adding ORaddress ");
				} else {
					ps_print (ps,"\n   Changing ");
					orAddr_print (ps,or->on_or,READOUT);
					ps_print (ps," to ");
				}
				orAddr_print (ps,newor,READOUT);
				ps_print (ps,"... ");
				(void) ps_flush (ps);

				if (or_modify (ps,or,newor,at_Member,listname)) {
					ps_print (ps,"OK\n");
					or_free (or->on_or);
					or->on_or = newor;
				}
				(void) ps_flush (ps);
				return ret;
			} else {
				char buf2[BUFSIZ];
				or_or2std (newor,buf2,0);
				ps_printf (ps,"\n *** BAD ORAddress in DIT (%s): %s *** \n",buf,buf2);
				ret = FALSE;
			}
		} else if (orcheck && or->on_or != NULLOR) {
			if (orAddr_check (newor,&buf[0]) == OK) {
				ps_print (ps,"\n *** Error ***\n   X.500: ");
				orAddr_print (ps,newor,EDBOUT);
				ps_print (ps,"\n   X.400: ");
				orAddr_print (ps,or->on_or,EDBOUT);
				ps_print (ps,"\n");
				ret = FALSE;
			} else {
				char buf2[BUFSIZ];
				or_or2std (newor,buf2,0);
				ps_printf (ps,"\n *** BAD ORAddress in DIT (%s): %s ***\n",buf,buf2);
				ret = FALSE;
			}
		} else {
			ps_print (ps,"X.500 Name OK\n");
			if (or->on_or == NULLOR)
				or->on_or = newor;
		}
	}

	if ((orcheck) && (or->on_or != NULLOR)) {
		ps_print (ps,"Checking ");
		orAddr_print (ps,or->on_or,READOUT);
		ps_print (ps,"... ");

		if (orAddr_check (or->on_or,&buf[0]) == OK) {
			ps_printf (ps,"OK\n");
		} else {
			ps_printf (ps,"\n *** Error: %s *** \n",buf);
			ret = FALSE;
		}
	}
	(void) ps_flush (ps);
	return ret;
}

check_dl_members (ps,dn,as,dncheck,orcheck,update)
PS ps;
DN dn;
Attr_Sequence as;
char dncheck;
char orcheck;
char update;
{
Attr_Sequence tmp;
AV_Sequence avs;

	if ((tmp = as_find_type (as,at_Member)) == NULLATTR) {
		ps_print (ps,"Can't find dl-members attribute!!!\n");
		return;
	}

#if ISODE < 65
	(void) avs_decode (at_Member,tmp->attr_value);
#endif

	for (avs=tmp->attr_value; avs!= NULLAV; avs=avs->avseq_next) 
		(void) check_ORName (ps,(ORName *)avs->avseq_av.av_struct,
						dncheck,orcheck,update,dn);
}

dl_print (ps,dn)
PS ps;
DN dn;
{
Attr_Sequence tmp;
Attr_Sequence as, dir_getdl_aux();
DN dnm, get_manager_dn();

	if (( as = dir_getdl_aux (dn)) == NULLATTR) {
		ps_print (ps,"Can't read the entry");		
		return;
	}

	current_print = as;

	if (( dnm = get_manager_dn(as,TRUE)) == NULLDN) 
		ps_print (ps,"\nEntry has no Owner !!!\n");
	else {
		ps_print (ps,"\nOwner: ");
		ufn_dn_print (ps,dnm,TRUE);
	}

	if ((tmp = as_find_type (as,at_Permit)) == NULLATTR) 
		ps_print (ps,"\n\nEntry has no mhsDLSubmitPermissions !!!\n");
	else {
		ps_print (ps,"\n\nSubmit Permissions,");
		avs_seq_print (ps,tmp->attr_value, UFNOUT);
	}

	if ((tmp = as_find_type (as,at_Member)) == NULLATTR) {
		ps_print (ps,"\nEntry has no dl-members !!!\n");
		return;
	}
	ps_print (ps,"\nMembers:\n");
	avs_seq_print_members (ps,&tmp->attr_value);

}


extern char	*postmaster;

ADDR * get_postmaster()
{
static ADDR *res = NULLADDR;
ADDR *dn2ADDR();
DN dn, search_postmaster();
static DN localdn = NULLDN;
extern char * local_dit;

	if (res != NULLADDR)
		return res;

	if ((localdn == NULLDN) && local_dit)
		localdn = str2dn (local_dit);

	if ((dn = search_postmaster(localdn)) == NULLDN) 
		return res = adr_new(postmaster, AD_822_TYPE, 0);

	if ((res = dn2ADDR (dn)) == NULLADDR)
		return res = adr_new(postmaster, AD_822_TYPE, 0);

	return res;
}

ADDR * get_manager(as)
Attr_Sequence as;
{
Attr_Sequence tmp;
Attr_Sequence dn2addr();
AV_Sequence avs;
ADDR * dn2ADDR();
ADDR 	*ret = NULLADDR;
ADDR    *next;
int num = 1;
int dn_print ();

	if ((tmp = as_find_type(as,at_Owner)) == NULLATTR)
		return get_postmaster();

	if ((avs = tmp->attr_value) == NULLAV)
		return get_postmaster();

	for (; avs!= NULLAV; avs=avs->avseq_next) {
		if ((next = dn2ADDR ((DN)(avs->avseq_av.av_struct))) == NULLADDR) {
			pslog (log_dsap,LLOG_NOTICE,"Bad address in DN",dn_print,avs->avseq_av.av_struct);
			continue;
		}
		next->ad_extension = num;
		next->ad_no = num++;
		adr_add(&ret, next);
	}
	return ret;
}

DN get_manager_dn (as,unwrap)
Attr_Sequence as;
char unwrap;		/* IF TRUE, and entry is a role, unwrap it */
{
Attr_Sequence tmp;
Attr_Sequence dn2addr();
AV_Sequence avs;

	if ((tmp = as_find_type(as,at_Owner)) == NULLATTR)
		return NULLDN;

	if ((avs = tmp->attr_value) == NULLAV)
		return NULLDN;

	if (unwrap) {
		if ((tmp = dn2addr((DN)avs->avseq_av.av_struct)) == NULLATTR)
			return (DN)avs->avseq_av.av_struct;

		if ((tmp = as_find_type (tmp,at_RoleOccupant)) == NULLATTR) 
			return (DN)avs->avseq_av.av_struct;
	
		if ((tmp->attr_value) == NULLAV)
			return (DN)avs->avseq_av.av_struct;
		avs = tmp->attr_value;
	}

	return (DN)avs->avseq_av.av_struct;
}