/* 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 ); }