|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 9073 (0x2371) Types: TextFile Names: »dl_util.c«
└─⟦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«
/* 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; }