Net2/usr/src/contrib/isode/dsap/common/ap.c

/* ap.c - Quipu access point syntax  */

#ifndef	lint
static char *rcsid = "$Header$";
#endif

/* 
 * $Header$
 *
 *
 * $Log$
 */

/*
 *				  NOTICE
 *
 *    Acquisition, use, and distribution of this module and related
 *    materials are subject to the restrictions of a license agreement.
 *    Consult the Preface in the User's Manual for the full terms of
 *    this agreement.
 *
 */


/* LINTLIBRARY */

#include "quipu/util.h"
#include "quipu/attr.h"
#include "psap.h"
#include "isoaddrs.h"
#include "../x500as/DO-types.h"

extern LLog * log_dsap;
extern char * index ();
extern struct PSAPaddr * psap_cpy ();
extern aps_free();

struct access_point * qap_cpy (a)
struct access_point * a;
{
struct access_point * r;

	r = (struct access_point *) smalloc (sizeof (struct access_point));
	bzero ((char *) r,sizeof (struct access_point));

	r -> ap_name = dn_cpy (a -> ap_name);
	if (a -> ap_address) 
		r -> ap_address = psap_cpy ( a -> ap_address );

	return (r);
}

static qap_cmp (r,a)
struct access_point *r, *a;
{
int res;

	if (( res = dn_cmp (r -> ap_name, a -> ap_name)) == 0) 
		if ( r -> ap_address && a -> ap_address )
		       return (bcmp ((char *) r -> ap_address,
				     (char *) a -> ap_address, 
				     sizeof *a -> ap_address) ? (-1) : 0);
		else 
			return ( r -> ap_address == a -> ap_address ? 0 :
				 r -> ap_address > a -> ap_address ? 1 : (-1));

	return res;
}
		

static PE qap_enc (p)
struct access_point *p;
{
PE ret_pe;

	if (encode_DO_QAccessPoint (&ret_pe,0,0,NULLCP,p) == NOTOK )
		return NULLPE;

	return (ret_pe);
}

static struct access_point * qap_dec (pe)
PE pe;
{
struct access_point *qap;

	if (decode_DO_QAccessPoint (pe,1,NULLIP,NULLVP,&qap) == NOTOK) {
		return (NULLACCESSPOINT);
	}
		
	return (qap);
}

static struct access_point * qap_parse (s)
char * s;
{
struct PSAPaddr *pa;
struct access_point *qap;
char * p;

	qap = (struct access_point *) calloc (1,sizeof (struct access_point));

	if ((p = index (s,'#')) != NULLCP) {
		*p++ = 0;
		if (pa=str2paddr(SkipSpace(p))) {
			qap->ap_address = (struct PSAPaddr *) calloc (1,sizeof (struct PSAPaddr));
			*qap->ap_address = *pa;  /* struct copy */
		} else {
			parse_error ("invalid presentation address in access point %s",p);
			free ((char *)qap);
			*(--p) = '#';
			return (NULLACCESSPOINT);
		}
		
	}

	if ((qap -> ap_name = str2dn (s)) == NULLDN) {
		if (qap->ap_address)
			free ((char *)qap->ap_address);
		free ((char *)qap);
		return NULLACCESSPOINT;
	}

	if (p)
		*--p = '#';

	return qap;
}

static qap_print (ps,p,format)
PS ps;
struct access_point *p;
int format;
{

	dn_print (ps, p -> ap_name, format);

	if ( p -> ap_address )
		if (format != READOUT)
			ps_printf (ps, " # %s", _paddr2str(p->ap_address,NULLNA,-1));
		else
			ps_printf (ps, " # %s", paddr2str(p->ap_address,NULLNA));

}

ap_syntax ()
{
	(void) add_attribute_syntax ("AccessPoint",
		(IFP) qap_enc,		(IFP) qap_dec,
		(IFP) qap_parse,	qap_print,
		(IFP) qap_cpy,		qap_cmp,
		aps_free,		NULLCP,
		NULLIFP,		TRUE );
}