|
|
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 a
Length: 16747 (0x416b)
Types: TextFile
Names: »attrv.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/dsap/common/attrv.c«
/* attrv.c - Attribute Value routines */
#ifndef lint
static char *rcsid = "$Header: /f/osi/dsap/common/RCS/attrv.c,v 6.0 89/03/18 23:27:23 mrose Rel $";
#endif
/*
* $Header: /f/osi/dsap/common/RCS/attrv.c,v 6.0 89/03/18 23:27:23 mrose Rel $
*
*
* $Log: attrv.c,v $
* Revision 6.0 89/03/18 23:27:23 mrose
* Release 5.0
*
*/
/*
* 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/entry.h"
#include "quipu/ds_error.h"
#include "cmd_srch.h"
#include <sys/stat.h>
extern int oidformat;
extern struct PSAPaddr * psap_cpy ();
extern LLog * log_dsap;
PE asn2pe();
char * parse_file = NULLCP;
RDN parse_rdn = NULLRDN;
static int dflt_attr_file ();
AttrV_free (x)
register AttributeValue x;
{
int x_syntax;
if (x == NULLAttrV)
return;
if (x->av_pe != NULLPE)
pe_free (x->av_pe);
if ( x->av_syntax >= AV_WRITE_FILE )
x_syntax = x->av_syntax - AV_WRITE_FILE;
else
x_syntax = x->av_syntax;
switch (x_syntax) {
case AV_UNKNOWN:
case AV_PHOTO:
break;
case AV_CASEEXACTSTRING:
case AV_CASEIGNORESTRING:
free (x->av_un.av_str);
break;
case AV_FILE:
free (x->av_un.av_file.fs_name);
break;
case AV_NUMERICSTRING:
free (x->av_un.av_num);
break;
case AV_ACL:
acl_free (x->av_un.av_acl);
break;
case AV_ASN:
break; /* same PE as above */
case AV_PRESENTATIONADDRESS:
psap_free (x->av_un.av_psap);
break;
case AV_DN:
dn_free (x->av_un.av_dn);
break;
case AV_SCHEMA:
tree_struct_free (x->av_un.av_tree);
break;
case AV_UPDATE:
edb_info_free (x->av_un.av_update);
break;
case AV_BOOLEAN:
case AV_INTEGER:
case AV_TIME:
break;
case AV_OID:
oid_free (x->av_un.av_oid);
break;
case AV_OBJECTCLASS:
break; /* pointer to static table */
default:
LLOG (log_dsap,LLOG_EXCEPTIONS,("Unknown AttrV type (%d)",x->av_syntax));
}
free ((char *) x);
}
AttributeValue str_at2AttrV (str,at)
char * str;
AttributeType at;
{
register char * ptr;
int syntax;
extern char * index();
static CMD_TABLE cmd_syntax [] = {
"N", AV_NUMERICSTRING,
"PSAP", AV_PRESENTATIONADDRESS,
"DN", AV_DN,
"ACL", AV_ACL,
"SCHEMA", AV_SCHEMA,
"UPDATE", AV_UPDATE,
"OID", AV_OID,
"FILE", AV_FILE,
"ASN", AV_ASN,
0, 0,
} ;
if (str == NULLCP)
return (NULLAttrV);
if (at == NULLAttrT)
return (NULLAttrV);
str = SkipSpace (str);
if (*str == 0)
return (NULLAttrV);
ptr = str;
if (*ptr++ == '{') {
/* look for syntax */
if (( str = index (ptr,'}')) == 0) {
parse_error ("invalid {syntax} '%s'",ptr);
return (NULLAttrV);
}
*str = 0;
if ((syntax = cmd_srch (ptr,cmd_syntax)) == 0) {
parse_error ("invalid syntax '%s'",ptr);
return (NULLAttrV);
}
if (syntax != AV_FILE) {
if (syntax != at->at_table->oa_syntax) {
if (at->at_table->oa_syntax >= AV_WRITE_FILE )
if (syntax != (at->at_table->oa_syntax - AV_WRITE_FILE)) {
parse_error ("file syntax mismatch '%s'",ptr);
return (NULLAttrV);
}
if ((syntax == AV_OID) && (at->at_table->oa_syntax == AV_OBJECTCLASS)) {
syntax = AV_OBJECTCLASS;
} else {
parse_error ("syntax mismatch '%s'",ptr);
return (NULLAttrV);
}
}
} else {
/* see if file exists */
AttributeValue x;
#ifdef CHECK_FILE_ATTRIBUTES
struct stat filestat;
#endif
x = AttrV_alloc();
x->av_pe = NULLPE;
x->av_syntax = syntax;
if ((x->av_un.av_file.fs_real_syntax = at->at_table->oa_syntax) >= AV_WRITE_FILE)
x->av_un.av_file.fs_real_syntax -= AV_WRITE_FILE;
if (*++str != 0) {
x->av_un.av_file.fs_default = FALSE;
x->av_un.av_file.fs_name = strdup (str);
} else {
if (dflt_attr_file (at,x) == NOTOK) {
*str = '}';
return (NULLAttrV);
}
}
#ifdef CHECK_FILE_ATTRIBUTES
/* now check the file is OK */
if (stat(x->av_un.av_file.fs_name,&filestat) != -1) {
*str = '}';
return (x);
} else {
*str = '}';
parse_error ("can't find attribute file %s",x->av_un.av_file.fs_name);
return (NULLAttrV);
}
/* NOTREACHED */
#else
*str = '}';
return (x);
#endif
}
*str++ = '}';
} else
syntax = at->at_table->oa_syntax;
return (str2AttrV (str,syntax));
}
AttributeValue str2AttrV (str,syntax)
register char * str;
int syntax;
{
AttributeValue x;
register char * ptr;
long atol();
if (str == NULLCP)
return (NULLAttrV);
x = AttrV_alloc();
x->av_pe = NULLPE;
x->av_syntax = syntax;
switch (syntax) {
case AV_NUMERICSTRING:
x->av_un.av_num = strdup (str);
break;
case AV_FILE:
x->av_un.av_file.fs_name = strdup (str);
x->av_un.av_file.fs_real_syntax = AV_UNKNOWN;
x->av_un.av_file.fs_default = FALSE;
break;
case AV_CASEEXACTSTRING:
case AV_CASEIGNORESTRING:
x->av_un.av_str = strdup (str);
break;
case AV_ACL:
if ((x->av_un.av_acl = str2acl (str)) == (struct acl *) NULL) {
free ((char *)x);
return (NULLAttrV);
}
break;
case AV_ASN:
case AV_PHOTO:
if ((x->av_un.av_asn = asn2pe (str)) == NULLPE) {
parse_error ("invalid ASN attribute",NULLCP);
free ((char *)x);
return (NULLAttrV);
}
x->av_pe = x->av_un.av_asn;
break;
case AV_PRESENTATIONADDRESS:
{
struct PSAPaddr *pa;
x -> av_un.av_psap = (struct PSAPaddr *) calloc (1,sizeof (struct PSAPaddr));
if (pa=str2paddr(str))
*x->av_un.av_psap = *pa;
else {
parse_error ("invalid presentation address %s",str);
free ((char *)x->av_un.av_psap);
free ((char *)x);
return (NULLAttrV);
}
break;
}
case AV_SCHEMA:
if ((x->av_un.av_tree = str2schema (str)) == NULLTREE) {
free ((char *)x);
return (NULLAttrV);
}
break;
case AV_UPDATE:
if ((x->av_un.av_update = str2update (str)) == NULLEDB) {
free ((char *)x);
return (NULLAttrV);
}
break;
case AV_BOOLEAN:
if (lexequ (str,"TRUE") == 0)
x->av_un.av_boolean = TRUE;
else if (lexequ (str,"FALSE") == 0)
x->av_un.av_boolean = FALSE;
else {
parse_error ("invalid boolean %s",str);
free ((char *)x);
return (NULLAttrV);
}
break;
case AV_INTEGER:
x->av_un.av_time = (time_t) atol (str);
break;
case AV_TIME:
x->av_un.av_integer = atoi (str);
break;
case AV_OBJECTCLASS:
if ((x->av_un.av_objectclass = name2oc (str)) == NULLOBJECTCLASS) {
parse_error ("invalid objectclass %s",str);
free ((char *)x);
return (NULLAttrV);
}
break;
case AV_OID:
if ((x->av_un.av_oid = oid_cpy(name2oid (str))) == NULLOID) {
parse_error ("invalid oid %s",str);
free ((char *)x);
return (NULLAttrV);
}
break;
case AV_DN:
if ((ptr = rindex (str,'#')) != 0) {
/* a bit or reverse compatability... */
if (*++ptr != 0) {
parse_error ("invalid # in '%s'",str);
free ((char *)x);
return (NULLAttrV);
} else
*--ptr = 0;
}
if ((x->av_un.av_dn = str2dn(str)) == NULLDN) {
free ((char *)x);
return (NULLAttrV);
}
break;
default:
parse_error ("unknown syntax %d",(char *)syntax);
free ((char *)x);
return (NULLAttrV);
}
return (x);
}
AttributeValue AttrV_cpy (x)
register AttributeValue x;
{
register AttributeValue y;
int x_syntax;
if ( x->av_syntax >= AV_WRITE_FILE )
x_syntax = x->av_syntax - AV_WRITE_FILE;
else
x_syntax = x->av_syntax;
y = (AttributeValue) smalloc (sizeof (attrVal));
y->av_pe = ( x->av_pe == NULLPE ) ? NULLPE : pe_cpy (x->av_pe);
y->av_syntax = x->av_syntax;
switch (x_syntax) {
case AV_UNKNOWN:
break;
case AV_CASEEXACTSTRING:
case AV_CASEIGNORESTRING:
y->av_un.av_str = strdup (x->av_un.av_str);
break;
case AV_FILE:
y->av_un.av_file.fs_name = strdup (x->av_un.av_file.fs_name);
y->av_un.av_file.fs_real_syntax = x->av_un.av_file.fs_real_syntax;
y->av_un.av_file.fs_default = x->av_un.av_file.fs_default;
break;
case AV_NUMERICSTRING:
y->av_un.av_str = strdup (x->av_un.av_num);
break;
case AV_ACL:
y->av_un.av_acl = acl_cpy (x->av_un.av_acl);
break;
case AV_ASN:
case AV_PHOTO:
y->av_un.av_asn = y->av_pe;
break; /* same PE as above */
case AV_PRESENTATIONADDRESS:
y->av_un.av_psap = psap_cpy (x->av_un.av_psap);
break;
case AV_DN:
y->av_un.av_dn = dn_cpy (x->av_un.av_dn);
break;
case AV_SCHEMA:
y->av_un.av_tree = tree_struct_cpy (x->av_un.av_tree);
break;
case AV_UPDATE:
y->av_un.av_update = edb_info_cpy(x->av_un.av_update);
break;
case AV_BOOLEAN:
y->av_un.av_boolean = x->av_un.av_boolean;
break;
case AV_INTEGER:
y->av_un.av_integer = x->av_un.av_integer;
break;
case AV_TIME:
y->av_un.av_time = x->av_un.av_time;
break;
case AV_OID:
y->av_un.av_oid = oid_cpy (x->av_un.av_oid);
break;
case AV_OBJECTCLASS:
y->av_un.av_objectclass = x->av_un.av_objectclass;
break;
default:
LLOG (log_dsap,LLOG_EXCEPTIONS,("Unknown AttrV type (%d)",x->av_syntax));
}
return (y);
}
AttrV_cmp (x,y,error)
register AttributeValue x,y;
struct DSError * error;
{
int x_syntax, y_syntax;
if ( x->av_syntax >= AV_WRITE_FILE )
x_syntax = x->av_syntax - AV_WRITE_FILE;
else
x_syntax = x->av_syntax;
if ( y->av_syntax >= AV_WRITE_FILE )
y_syntax = y->av_syntax - AV_WRITE_FILE;
else
y_syntax = y->av_syntax;
if (x_syntax != y_syntax) {
error->dse_type = DSE_ATTRIBUTEERROR;
error->ERR_ATTRIBUTE.DSE_at_name = NULLDN;
error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what = DSE_AT_INAPPROPRIATEMATCHING;
error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = NULLAttrT; /* set later */
error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_value = AttrV_cpy(x);
error->ERR_ATTRIBUTE.DSE_at_plist.dse_at_next = DSE_AT_NOPROBLEM;
return (-2);
}
switch (x_syntax) {
case AV_UNKNOWN:
return(quipu_pe_cmp(x->av_pe,y->av_pe));
case AV_FILE:
return (-1); /* cmp files or file names ??? */
case AV_CASEEXACTSTRING:
{
int res;
res = strcmp(x->av_un.av_str,y->av_un.av_str);
return (res == 0 ? 0 : res < 0 ? -1 : 1);
}
case AV_CASEIGNORESTRING:
return (lexequ(x->av_un.av_str,y->av_un.av_str));
case AV_NUMERICSTRING:
return (strcmp(x->av_un.av_str,y->av_un.av_num));
case AV_ASN:
case AV_PHOTO:
return(quipu_pe_cmp(x->av_un.av_asn,y->av_un.av_asn));
case AV_DN:
return (dn_cmp (y->av_un.av_dn,x->av_un.av_dn));
case AV_PRESENTATIONADDRESS:
return (psap_cmp (x->av_un.av_psap,y->av_un.av_psap));
case AV_BOOLEAN:
return (y->av_un.av_boolean == x->av_un.av_boolean);
case AV_INTEGER:
return ( (y->av_un.av_integer == x->av_un.av_integer) ? 0 : ((y->av_un.av_integer > x->av_un.av_integer) ? -1 : 1));
case AV_TIME:
return ( (y->av_un.av_time == x->av_un.av_time) ? 0 : ((y->av_un.av_time > x->av_un.av_time) ? -1 : 1));
case AV_OID:
return ( quipu_oid_cmp (y->av_un.av_oid, x->av_un.av_oid));
case AV_OBJECTCLASS:
return ( objclass_cmp (x->av_un.av_objectclass, y->av_un.av_objectclass));
case AV_UPDATE:
return ( edb_info_cmp (x->av_un.av_update, y->av_un.av_update));
case AV_ACL:
case AV_SCHEMA:
return (-1); /* just say they are different !!! */
default:
LLOG (log_dsap,LLOG_EXCEPTIONS,("Matching error (%d)",x->av_syntax));
return (-2);
}
/* NOT REACHED */
}
AttrV_print (ps,x,format)
register PS ps;
register AttributeValue x;
register int format;
{
extern int ps_printf ();
extern AttributeType last_at;
if ( x->av_syntax >= AV_WRITE_FILE ) {
x->av_syntax -= AV_WRITE_FILE;
if (format != EDBOUT) {
AttrV_print (ps,x,format);
} else {
FILE * fptr;
PS fps;
AttributeValue y;
ps_print (ps,"{FILE}");
y = AttrV_alloc ();
y->av_pe = NULLPE;
y->av_syntax = AV_FILE;
y->av_un.av_file.fs_real_syntax = x->av_syntax;
if (dflt_attr_file (last_at,y) == NOTOK) {
LLOG (log_dsap,LLOG_EXCEPTIONS,("Could not make default attribute file"));
x->av_syntax += AV_WRITE_FILE;
return;
}
if ((fptr = fopen (y->av_un.av_file.fs_name,"w")) != NULL) {
if ((fps = ps_alloc (std_open)) == NULLPS) {
(void) fclose (fptr);
LLOG (log_dsap,LLOG_EXCEPTIONS,("Could not alloc PS file '%s'",x->av_un.av_file.fs_name));
x->av_syntax += AV_WRITE_FILE;
return;
}
if ((std_setup (fps,fptr)) == NOTOK) {
(void) fclose (fptr);
ps_free (fps);
LLOG (log_dsap,LLOG_EXCEPTIONS,("Could not open PS file '%s'",x->av_un.av_file.fs_name));
x->av_syntax += AV_WRITE_FILE;
return;
}
} else {
LLOG ( log_dsap,LLOG_EXCEPTIONS,("Could not open attribute file '%s'",x->av_un.av_file.fs_name));
x->av_syntax += AV_WRITE_FILE;
return;
}
if ((x->av_syntax == AV_PHOTO) || (x->av_syntax == AV_ASN))
(void) pe2ps (fps,x->av_pe);
else
AttrV_print (fps,x,format);
(void) fclose (fptr);
ps_free (fps);
}
x->av_syntax += AV_WRITE_FILE;
return;
}
switch (x->av_syntax) {
case AV_UNKNOWN:
if (format == READOUT) {
vpushpp ((caddr_t) ps, ps_printf, x->av_pe, "(unknown syntax)...", 1);
vunknown (x->av_pe);
vpopp ();
}
else if (x->av_pe != NULLPE)
pe_print (ps,x->av_pe,format);
break;
case AV_PHOTO:
if (format == READOUT)
picture_print (ps,x->av_un.av_asn,format);
else
pe_print (ps,x->av_un.av_asn,format);
break;
case AV_FILE:
if (format == EDBOUT)
ps_print (ps,"{FILE}");
if ( ! x->av_un.av_file.fs_default)
ps_print (ps,x->av_un.av_file.fs_name);
/*
* else {
* check default file name - if OK fine,
* else copy file to new location !!!
* }
*/
break;
case AV_CASEEXACTSTRING:
case AV_CASEIGNORESTRING:
ps_print (ps,x->av_un.av_str);
break;
case AV_NUMERICSTRING:
ps_print (ps,x->av_un.av_num);
break;
case AV_ACL:
acl_print (ps,x->av_un.av_acl,format);
break;
case AV_ASN:
if (x->av_un.av_asn != NULLPE)
if (format == READOUT) {
vpushpp ((caddr_t) ps, ps_printf, x->av_pe, "(ASN syntax)...", 1);
vunknown (x->av_pe);
vpopp ();
} else
pe_print (ps,x->av_un.av_asn,format);
break;
case AV_PRESENTATIONADDRESS:
if (format == EDBOUT)
ps_printf (ps, "%s", _paddr2str(x->av_un.av_psap,NULLNA,-1));
else
ps_printf (ps, "%s", paddr2str(x->av_un.av_psap,NULLNA));
break;
case AV_DN:
dn_print (ps,x->av_un.av_dn,format);
if (format == EDBOUT)
ps_print (ps,"#");
break;
case AV_SCHEMA:
tree_struct_print (ps,x->av_un.av_tree,format);
break;
case AV_UPDATE:
edb_info_print (ps,x->av_un.av_update,format);
break;
case AV_BOOLEAN:
if ( x->av_un.av_boolean )
ps_print (ps,"TRUE");
else
ps_print (ps,"FALSE");
break;
case AV_INTEGER:
ps_printf (ps,"%d",x->av_un.av_integer);
break;
case AV_TIME:
ps_printf (ps,"%d",x->av_un.av_time);
break;
case AV_OID:
if ( format == READOUT)
ps_printf (ps,"%s",oid2name (x->av_un.av_oid,oidformat));
else
ps_printf (ps,"%s",oid2name (x->av_un.av_oid,OIDPART));
break ;
case AV_OBJECTCLASS:
if (x->av_un.av_objectclass == NULLOBJECTCLASS) {
/* print the oid from the PE */
if (x->av_pe != NULLPE)
ps_printf (ps,"%s",sprintoid(prim2oid(x->av_pe)));
else
LLOG(log_dsap,LLOG_EXCEPTIONS,("Object class botch"));
break;
}
if ( format != READOUT)
ps_printf (ps,"%s",oc2name (x->av_un.av_objectclass,OIDPART));
else
ps_printf (ps,"%s",oc2name (x->av_un.av_objectclass,oidformat));
break ;
default:
LLOG (log_dsap,LLOG_EXCEPTIONS,("Unknown attribute syntax %d",x->av_syntax));
if (x->av_pe != NULLPE)
pe_print (ps,x->av_pe,format);
break;
}
}
static int dflt_attr_file (at,x)
AttributeType at;
AttributeValue x;
{
/* make default file name */
char buffer [LINESIZE];
PS sps;
char *pathend, val, *_isodefile();
char *path = NULLCP;
x->av_un.av_file.fs_default = TRUE;
if ((parse_file != NULLCP) && ((pathend = rindex (parse_file,'/')) != NULLCP)) {
val = *++pathend;
*pathend = 0;
path = parse_file;
}
sps = ps_alloc (str_open);
if (str_setup (sps,buffer,LINESIZE,1) == NOTOK)
return (NOTOK);
if (parse_rdn == NULLRDN)
ps_print (sps,at->at_table->oa_ot.ot_name);
else {
rdn_print (sps,parse_rdn,EDBOUT);
ps_printf (sps,".%s",at->at_table->oa_ot.ot_name);
}
*sps->ps_ptr = 0;
ps_free (sps);
if (path != NULLCP)
x->av_un.av_file.fs_name = strdup (_isodefile(path,buffer));
else
x->av_un.av_file.fs_name = strdup (buffer);
if (pathend != NULLCP)
*pathend = val;
return (OK);
}