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 s

⟦f5eab5731⟧ TextFile

    Length: 4588 (0x11ec)
    Types: TextFile
    Names: »syn_permit.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/syn_permit.c« 

TextFile

/* syn_permit.c: */ 

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

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



#include "dlist.h"
#include <isode/cmd_srch.h>

extern ORName * orName_cpy();
extern ORName * orName_parse();

static permit_free (ptr)
struct dl_permit * ptr;
{
	if (ptr->dp_type == DP_GROUP)
		dn_free (ptr->dp_dn);
	else
		orName_free (ptr->dp_or);
}


static struct dl_permit * permit_cpy (a)
struct dl_permit * a;
{
struct dl_permit * result;

	result = (struct dl_permit *) smalloc (sizeof (struct dl_permit));
	if ( (result->dp_type = a->dp_type) == DP_GROUP)
		result->dp_dn = dn_cpy (a->dp_dn);
	else
		result->dp_or = orName_cpy (a->dp_or);

	return (result);
}

static permit_cmp (a,b)
struct dl_permit * a;
struct dl_permit * b;
{	
	if (a->dp_type != b->dp_type)
		return (a->dp_type > b->dp_type ? 1 : -1);

	if (a->dp_type == DP_GROUP) 
		return (dn_cmp (a->dp_dn,b->dp_dn));
	else
		return (orName_cmp (a->dp_or,b->dp_or));
}


static permit_print (ps,p,format)
register PS ps;
struct   dl_permit* p;
int format;
{
	if ((format == READOUT) || (format == UFNOUT)) {
		if (p->dp_type == DP_GROUP) {
			ps_print (ps,"Members of the X.500 Group:\n   ");
			dn_print (ps,p->dp_dn,EDBOUT);
			return;
		}
		switch (p->dp_type) {
		case DP_INDIVIDUAL:
			ps_print (ps,"The individual:\n   ");
			break;
		case DP_MEMBER:
			ps_print (ps,"The members of the mail list:\n   ");
			break;
		case DP_PATTERN:
			if ((p->dp_or != NULLORName) && (p->dp_or->on_or == NULLOR)) {
				ps_print (ps,"Anybody");
				return;
			}
			ps_print (ps,"Entities matching the OR pattern:\n   ");
			break;
		}
		orName_print (ps, p->dp_or,UFNOUT);
	} else {
		switch (p->dp_type) {
		case DP_GROUP:
			ps_print (ps,"GROUP#");
			dn_print (ps,p->dp_dn,format);
			return;
		case DP_INDIVIDUAL:
			ps_print (ps,"INDIVIDUAL#");
			break;
		case DP_MEMBER:
			ps_print (ps,"MEMBER#");
			break;
		case DP_PATTERN:
			ps_print (ps,"PATTERN#");
			break;
		}
		orName_print (ps, p->dp_or,format);		
	}
}


static struct dl_permit* str2permit (str)
char * str;
{
struct dl_permit * result;
char * ptr;
static CMD_TABLE permit_table [] = {
	"GROUP",	DP_GROUP,
	"INDIVIDUAL",	DP_INDIVIDUAL,
	"MEMBER",	DP_MEMBER,
	"PATTERN",	DP_PATTERN,
	0,		-1,
};

	if ( (ptr=index (str,'#')) == NULLCP) {
		if (lexequ (str,"ALL") == 0) {
			result = (struct dl_permit *) smalloc (sizeof (struct dl_permit));
			result->dp_type = DP_PATTERN;
			result->dp_or = (ORName *) smalloc (sizeof (ORName));
			result->dp_or->on_dn = NULLDN;
			result->dp_or->on_or = NULLOR;
			return result;			
		}	
		parse_error ("seperator missing in permit '%s'",str);
		return ((struct dl_permit *) NULL);
	}

	result = (struct dl_permit *) smalloc (sizeof (struct dl_permit));
	*ptr-- = 0;
	if (isspace (*ptr)) 
		*ptr = 0;
	ptr++,ptr++;

	if ((result->dp_type = cmd_srch (str,permit_table)) == -1) {
		parse_error ("unknown permit choice '%s'",str);
 		return ((struct dl_permit *) NULL);
	}

	if (result->dp_type == DP_GROUP) {
		if ((result->dp_dn = str2dn(ptr)) == NULLDN) 
	 		return ((struct dl_permit *) NULL);
	} else {
		if ((result->dp_or = orName_parse(ptr)) == NULLORName)
	 		return ((struct dl_permit *) NULL);
	}

	if (result->dp_type == DP_MEMBER) {
		if (result->dp_or->on_dn == NULLDN) {
			parse_error ("Must specify X.500 name for member permission",NULLCP);
			return ((struct dl_permit *) NULL);
		}
	}

	return (result);
}

static PE permit_enc (m)
struct dl_permit * m;
{
PE ret_pe;

        (void) encode_MD_DLSubmitPermission (&ret_pe,0,0,NULLCP,m);

	return (ret_pe);
}

static struct dl_permit * permit_dec (pe)
PE pe;
{
struct dl_permit * m;

	m = (struct dl_permit *) smalloc (sizeof (struct dl_permit));
	bzero ((char *)m, sizeof (struct dl_permit));

	if (decode_MD_DLSubmitPermission (pe,1,NULLIP,NULLVP,m) == NOTOK) {
		free ((char *)m);
		return ((struct dl_permit *) NULL);
	}

#if ISODE < 65
        if (m->dp_type == DP_GROUP) 
		(void) dn_decode (m->dp_dn);
	else 
		if (m->dp_or->on_dn != NULLDN)
			(void) dn_decode (m->dp_or->on_dn);
#endif

	return (m);
}

permit_syntax ()
{
	(void) add_attribute_syntax ("DLSubmitPermission",
		(IFP) permit_enc,	(IFP) permit_dec,
		(IFP) str2permit,	permit_print,
		(IFP) permit_cpy,	permit_cmp,
		permit_free,		NULLCP,
		NULLIFP,		TRUE);
}