|
|
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;
}