|
|
1.1 ! root 1: /* attrv.c - Attribute Value routines */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/attrv.c,v 7.4 90/07/09 14:34:00 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/dsap/common/RCS/attrv.c,v 7.4 90/07/09 14:34:00 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: attrv.c,v $ ! 12: * Revision 7.4 90/07/09 14:34:00 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.3 90/04/18 08:50:00 mrose ! 16: * 6.2 ! 17: * ! 18: * Revision 7.2 90/03/15 11:17:26 mrose ! 19: * quipu-sync ! 20: * ! 21: * Revision 7.1 90/01/11 18:35:30 mrose ! 22: * real-sync ! 23: * ! 24: * Revision 7.0 89/11/23 21:41:44 mrose ! 25: * Release 6.0 ! 26: * ! 27: */ ! 28: ! 29: /* ! 30: * NOTICE ! 31: * ! 32: * Acquisition, use, and distribution of this module and related ! 33: * materials are subject to the restrictions of a license agreement. ! 34: * Consult the Preface in the User's Manual for the full terms of ! 35: * this agreement. ! 36: * ! 37: */ ! 38: ! 39: ! 40: /* LINTLIBRARY */ ! 41: ! 42: #include "quipu/util.h" ! 43: #include "quipu/entry.h" ! 44: #include "quipu/ds_error.h" ! 45: #include "quipu/malloc.h" ! 46: #include "cmd_srch.h" ! 47: #include <sys/stat.h> ! 48: ! 49: extern int oidformat; ! 50: extern struct PSAPaddr * psap_cpy (); ! 51: extern str2asn (), pe_print() ; ! 52: AttributeValue str2file (); ! 53: extern LLog * log_dsap; ! 54: PE asn2pe(); ! 55: int quipu_pe_cmp(); ! 56: char t61_flag; ! 57: char crypt_flag; ! 58: char allow_crypt = FALSE; ! 59: extern int file_cmp (); ! 60: ! 61: static short num_syntax = 1; ! 62: static sntx_table syntax_table [MAX_AV_SYNTAX] = { { ! 63: "ASN", /* ASN - default type */ ! 64: (IFP)pe_cpy, /* default encode */ ! 65: NULLIFP, /* no decoding needed */ ! 66: NULLIFP, /* default parse */ ! 67: NULLIFP, /* default print */ ! 68: (IFP)pe_cpy, /* default copy */ ! 69: quipu_pe_cmp, /* default compare */ ! 70: pe_free, /* default free */ ! 71: NULLCP, /* no pe_printer */ ! 72: NULLIFP, /* NO approx matching */ ! 73: TRUE, /* one per line */ ! 74: } }; ! 75: ! 76: ! 77: short add_attribute_syntax (sntx,enc,dec,parse,print,cpy,cmp,sfree,print_pe,approx,multiline) ! 78: char * sntx; ! 79: IFP enc,dec,parse,print,cpy,cmp,sfree,approx; ! 80: char * print_pe; ! 81: char multiline; ! 82: { ! 83: if (num_syntax >= MAX_AV_SYNTAX) ! 84: return (-1); ! 85: ! 86: syntax_table[num_syntax].s_sntx = sntx; ! 87: set_attribute_syntax (num_syntax,enc,dec,parse,print,cpy,cmp,sfree,print_pe,approx,multiline); ! 88: ! 89: return (num_syntax++); ! 90: } ! 91: ! 92: set_attribute_syntax (sntx,enc,dec,parse,print,cpy,cmp,sfree,print_pe,approx,multiline) ! 93: short sntx; ! 94: IFP enc,dec,parse,print,cpy,cmp,sfree,approx; ! 95: char * print_pe; ! 96: char multiline; ! 97: { ! 98: syntax_table[sntx].s_encode = enc; ! 99: syntax_table[sntx].s_decode = dec; ! 100: syntax_table[sntx].s_parse = parse; ! 101: syntax_table[sntx].s_print = print; ! 102: syntax_table[sntx].s_copy = cpy; ! 103: syntax_table[sntx].s_compare = cmp; ! 104: syntax_table[sntx].s_free = sfree; ! 105: syntax_table[sntx].s_pe_print= print_pe; ! 106: syntax_table[sntx].s_approx = approx; ! 107: syntax_table[sntx].s_multiline = multiline; ! 108: } ! 109: ! 110: set_av_pe_print (sntx,print_pe) ! 111: short sntx; ! 112: char * print_pe; ! 113: { ! 114: syntax_table[sntx].s_pe_print= print_pe; ! 115: } ! 116: ! 117: split_attr (as) ! 118: Attr_Sequence as; ! 119: { ! 120: ! 121: if (as->attr_type == NULLTABLE_ATTR) ! 122: return (TRUE); ! 123: else ! 124: return (syntax_table[as->attr_type->oa_syntax].s_multiline); ! 125: } ! 126: ! 127: IFP approxfn (x) ! 128: int x; ! 129: { ! 130: return (syntax_table[x].s_approx); ! 131: } ! 132: ! 133: char * syntax2str (sntx) ! 134: short sntx; ! 135: { ! 136: return (syntax_table[sntx].s_sntx); ! 137: } ! 138: ! 139: short str2syntax (str) ! 140: char * str; ! 141: { ! 142: sntx_table * ptr; ! 143: register int i; ! 144: ! 145: for (i=0, ptr = &syntax_table[0] ; i<num_syntax; i++,ptr++) ! 146: if ( lexequ (ptr->s_sntx,str) == 0) ! 147: return (i); ! 148: ! 149: return (0); ! 150: } ! 151: ! 152: sntx_table * get_syntax_table (x) ! 153: short x; ! 154: { ! 155: return ( &syntax_table[x]); ! 156: } ! 157: ! 158: AttrV_free (x) ! 159: register AttributeValue x; ! 160: { ! 161: AttrV_free_aux (x); ! 162: free ((char *) x); ! 163: } ! 164: ! 165: AttrV_free_aux (x) ! 166: register AttributeValue x; ! 167: { ! 168: if (x == NULLAttrV) ! 169: return; ! 170: ! 171: if (x->av_syntax == AV_FILE) { ! 172: file_free ((struct file_syntax *)x->av_struct); ! 173: return; ! 174: } ! 175: ! 176: if (( x->av_syntax < AV_WRITE_FILE ) ! 177: && (syntax_table[x->av_syntax].s_free != NULLIFP) ! 178: && (x->av_struct != NULL)) ! 179: (*syntax_table[x->av_syntax].s_free) (x->av_struct); ! 180: } ! 181: ! 182: PE grab_pe(av) ! 183: AttributeValue av; ! 184: { ! 185: PE ret_pe = NULLPE; ! 186: PE grab_filepe (); ! 187: ! 188: if (av->av_syntax == AV_FILE) ! 189: ret_pe = grab_filepe (av); ! 190: else if (syntax_table[av->av_syntax].s_encode != NULLIFP) ! 191: ret_pe = (PE)((*syntax_table[av->av_syntax].s_encode) (av->av_struct)); ! 192: ! 193: return (ret_pe); ! 194: } ! 195: ! 196: AttrV_decode(x,y) ! 197: register AttributeType x; ! 198: register AttributeValue y; ! 199: { ! 200: int y_syntax; ! 201: ! 202: if (x == NULLAttrT) ! 203: return (NOTOK); ! 204: ! 205: if ((y == NULLAttrV) || (y->av_syntax != 0)) ! 206: return (OK); ! 207: ! 208: if (y->av_struct == NULL) ! 209: return (OK); ! 210: ! 211: y->av_syntax = x->oa_syntax; ! 212: if ( (y_syntax = y->av_syntax) >= AV_WRITE_FILE ) ! 213: y_syntax = y->av_syntax - AV_WRITE_FILE; ! 214: ! 215: ATTRIBUTE_HEAP; ! 216: ! 217: if (syntax_table[y_syntax].s_decode != NULLIFP) { ! 218: PE oldpe = (PE)y->av_struct; ! 219: if ((y->av_struct = (caddr_t)((*syntax_table[y_syntax].s_decode) (oldpe))) == NULL) { ! 220: RESTORE_HEAP; ! 221: y->av_struct = (caddr_t)oldpe; ! 222: y->av_syntax = 0; ! 223: return (NOTOK); ! 224: } ! 225: pe_free (oldpe); ! 226: } ! 227: ! 228: if ( y->av_syntax >= AV_WRITE_FILE ) ! 229: file_decode (y); ! 230: ! 231: RESTORE_HEAP; ! 232: ! 233: return (OK); ! 234: } ! 235: ! 236: static strip_header(str) ! 237: char ** str; ! 238: { ! 239: register char * ptr, *save, val; ! 240: int syntax; ! 241: extern char * index(); ! 242: static CMD_TABLE cmd_syntax [] = { ! 243: "FILE", 1, ! 244: "ASN", 2, ! 245: "T.61", 3, ! 246: "CRYPT", 4, ! 247: 0, 0, ! 248: } ; ! 249: ! 250: ! 251: if (*str == NULLCP) ! 252: return (0); ! 253: ! 254: *str = SkipSpace (*str); ! 255: if (**str == 0) ! 256: return (0); ! 257: ptr = *str; ! 258: ! 259: t61_flag = FALSE; ! 260: crypt_flag = FALSE; ! 261: ! 262: if (*ptr++ == '{') { ! 263: /* look for syntax */ ! 264: if (( *str = index (ptr,'}')) == 0) { ! 265: parse_error ("syntax close bracket missing '%s'",--ptr); ! 266: return (0); ! 267: } ! 268: save = *str; ! 269: val = **str; ! 270: ! 271: *(*str)++ = 0; ! 272: *str = SkipSpace (*str); ! 273: ! 274: if ((syntax = cmd_srch (ptr,cmd_syntax)) == 0) { ! 275: parse_error ("unknown syntax '%s'",ptr); ! 276: return (0); ! 277: } ! 278: *save = val; ! 279: ! 280: if ((syntax == 4) && ! allow_crypt) { ! 281: parse_error ("{CRYPT} not allowed",ptr); ! 282: return (0); ! 283: } ! 284: return (syntax); ! 285: ! 286: } ! 287: return (5); ! 288: } ! 289: ! 290: str_at2AttrV_aux (str,at,rav) ! 291: char * str; ! 292: AttributeType at; ! 293: AttributeValue rav; ! 294: { ! 295: if (at == NULLAttrT) ! 296: return (NOTOK); ! 297: ! 298: switch (strip_header (&str)) { ! 299: case 0: /* error */ ! 300: return (NOTOK); ! 301: case 1: /* FILE */ ! 302: return (str2file_aux (str,at,rav)); ! 303: case 2: /* ASN */ ! 304: (void) str2AttrV_aux (str,0,rav); ! 305: return (AttrV_decode (at,rav)); ! 306: case 3: /* T.61 */ ! 307: t61_flag = TRUE; ! 308: return (str2AttrV_aux (SkipSpace(str),at->oa_syntax,rav)); ! 309: case 4: ! 310: crypt_flag = TRUE; ! 311: /* fall */ ! 312: case 5: ! 313: return (str2AttrV_aux (str,at->oa_syntax,rav)); ! 314: } ! 315: return (NOTOK); ! 316: } ! 317: ! 318: ! 319: AttributeValue str_at2AttrV (str,at) ! 320: char * str; ! 321: AttributeType at; ! 322: { ! 323: AttributeValue av; ! 324: ! 325: if (at == NULLAttrT) ! 326: return (NULLAttrV); ! 327: ! 328: switch (strip_header(&str)) { ! 329: case 0: /* error */ ! 330: return (NULLAttrV); ! 331: case 1: /* FILE */ ! 332: return (str2file (str,at)); ! 333: case 2: /* ASN */ ! 334: av = str2AttrV (str,0); ! 335: if (AttrV_decode (at,av) == NOTOK) ! 336: return (NULLAttrV); ! 337: return (av); ! 338: case 3: /* T.61 */ ! 339: t61_flag = TRUE; ! 340: return (str2AttrV (str,at->oa_syntax)); ! 341: case 4: ! 342: crypt_flag = TRUE; ! 343: /* fall */ ! 344: case 5: ! 345: return (str2AttrV (str,at->oa_syntax)); ! 346: } ! 347: return (NULLAttrV); ! 348: } ! 349: ! 350: AttributeValue str2AttrV (str,syntax) ! 351: register char * str; ! 352: short syntax; ! 353: { ! 354: AttributeValue x; ! 355: ! 356: x = AttrV_alloc(); ! 357: if (str2AttrV_aux (str,syntax,x) == OK) ! 358: return (x); ! 359: free ((char *)x); ! 360: return NULLAttrV; ! 361: } ! 362: ! 363: str2AttrV_aux (str,syntax,x) ! 364: register char * str; ! 365: short syntax; ! 366: AttributeValue x; ! 367: { ! 368: ! 369: if (str == NULLCP) ! 370: return (NOTOK); ! 371: ! 372: if ((x->av_syntax = syntax) > AV_WRITE_FILE) ! 373: x->av_syntax = syntax - AV_WRITE_FILE; ! 374: x->av_struct = NULL; ! 375: ! 376: if (syntax_table[syntax].s_parse != NULLIFP) { ! 377: if ((x->av_struct = (caddr_t)(*syntax_table[syntax].s_parse) (str)) == NULL) ! 378: return (NOTOK); ! 379: if (t61_flag) { ! 380: parse_error ("invalid use of {T.61}",NULLCP); ! 381: return (NOTOK); ! 382: } ! 383: if (crypt_flag) { ! 384: parse_error ("invalid use of {CRYPT}",NULLCP); ! 385: return (NOTOK); ! 386: } ! 387: } else if ((x->av_struct = (caddr_t) asn2pe (str)) == NULL) { ! 388: parse_error ("invalid ASN attribute",NULLCP); ! 389: return NOTOK; ! 390: } ! 391: return (OK); ! 392: } ! 393: ! 394: AttributeValue AttrV_cpy (x) ! 395: register AttributeValue x; ! 396: { ! 397: register AttributeValue y = NULLAttrV; ! 398: ! 399: y = AttrV_alloc(); ! 400: AttrV_cpy_aux (x,y); ! 401: return (y); ! 402: } ! 403: ! 404: AttrV_cpy_aux (x,y) ! 405: register AttributeValue x; ! 406: register AttributeValue y; ! 407: { ! 408: struct file_syntax * fileattr_cpy(); ! 409: ! 410: y->av_syntax = x->av_syntax; ! 411: ! 412: if (x->av_struct == NULL) { ! 413: y->av_struct = NULL; ! 414: return; ! 415: } ! 416: ! 417: if (x->av_syntax == AV_FILE) ! 418: y->av_struct = (caddr_t) fileattr_cpy ((struct file_syntax *)x->av_struct); ! 419: else if (syntax_table[x->av_syntax].s_copy != NULLIFP) ! 420: y->av_struct = (caddr_t)(*syntax_table[x->av_syntax].s_copy) (x->av_struct); ! 421: else ! 422: y->av_struct = NULL; ! 423: } ! 424: ! 425: ! 426: rdn_cmp (a,b) ! 427: register RDN a,b; ! 428: { ! 429: register int i; ! 430: ! 431: for (; (a != NULLRDN) && (b != NULLRDN) ; a = a->rdn_next, b = b->rdn_next) { ! 432: if (a->rdn_at != b->rdn_at) ! 433: return ((a->rdn_at > b->rdn_at) ? 1 : -1); ! 434: ! 435: if (syntax_table[a->rdn_av.av_syntax].s_compare == NULLIFP) ! 436: return (2); /* can't compare */ ! 437: else ! 438: if (( i = (*syntax_table[a->rdn_av.av_syntax].s_compare) (a->rdn_av.av_struct,b->rdn_av.av_struct)) != 0) ! 439: return i; ! 440: } ! 441: ! 442: if ( (a == NULLRDN) && (b == NULLRDN) ) { ! 443: return 0; ! 444: } else { ! 445: return ( a ? 1 : -1); ! 446: } ! 447: ! 448: } ! 449: ! 450: AttrV_cmp (x,y) ! 451: register AttributeValue x,y; ! 452: { ! 453: if (x->av_syntax != y->av_syntax) ! 454: return (-2); ! 455: ! 456: if (x->av_syntax == AV_FILE) ! 457: return (file_cmp ((struct file_syntax *)x->av_struct,(struct file_syntax *)y->av_struct)); ! 458: ! 459: if (syntax_table[x->av_syntax].s_compare != NULLIFP) ! 460: return ((*syntax_table[x->av_syntax].s_compare) (x->av_struct,y->av_struct)); ! 461: else ! 462: return (2); /* can't compare */ ! 463: } ! 464: ! 465: IFP av_cmp_fn (syntax) ! 466: int syntax; ! 467: { ! 468: if ( syntax >= AV_WRITE_FILE ) ! 469: return NULLIFP; ! 470: ! 471: if (syntax == AV_FILE) ! 472: return (file_cmp); ! 473: ! 474: if (syntax_table[syntax].s_compare != NULLIFP) ! 475: return (syntax_table[syntax].s_compare); ! 476: else ! 477: return NULLIFP; ! 478: } ! 479: ! 480: AttrV_print (ps,x,format) ! 481: register PS ps; ! 482: register AttributeValue x; ! 483: register int format; ! 484: { ! 485: extern int ps_printf (); ! 486: ! 487: if (format == RDNOUT) ! 488: format = READOUT; ! 489: ! 490: if (x->av_syntax == AV_FILE) ! 491: fileattr_print (ps,x,format); ! 492: else if ((format == READOUT) && (syntax_table[x->av_syntax].s_pe_print != NULLCP)) ! 493: exec_print (ps,x,syntax_table[x->av_syntax].s_pe_print); ! 494: else if (syntax_table[x->av_syntax].s_print != NULLIFP) { ! 495: if (x->av_struct != NULL) ! 496: (*syntax_table[x->av_syntax].s_print) (ps,x->av_struct,format); ! 497: } else if (format == READOUT) { ! 498: vpushquipu (ps); ! 499: vunknown ((PE)x->av_struct); ! 500: vpopquipu (); ! 501: } else ! 502: pe_print (ps,(PE)x->av_struct,format); ! 503: ! 504: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.