asn_ext.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 1,278 行 · 第 1/3 页
C
1,278 行
* [1] SET OF * OBJECT IDENTIFIER [[O oid_tmp]] * %{ * if(is_first != 0) * { * (*parm) = tree_struct_alloc(); * if (((*parm)->tree_object = oid2oc(oid_tmp)) == NULLOBJECTCLASS) * (*parm)->tree_object = oc_add (oid_tmp); * is_first = 0; * } * else * { * LLOG(log_dsap, LLOG_EXCEPTIONS, ("Multiple mandatory object classes")); * } * %} , * optionalObjectClasses * [2] SET OF * OBJECT IDENTIFIER * OPTIONAL , * permittedRDNs * [3] SET OF * SET OF * AttributeType [[p & at_tmp]] * %{ * %} * } * %{ * DLOG(log_dsap, LLOG_PDUS, ("Done decode TreeStructureSyntax")); * %} * * */treestruct_decode (parm,pe)struct tree_struct ** parm;PE pe;{AttributeType at_tmp;OID oid_tmp;int is_first;objectclass * oc_add();char explicit = 0; int p34_count = 0; register PE p34;#ifdef DEBUG (void) testdebug (pe, "Quipu.TreeStructureSyntax");#endif if (explicit) { if (pe -> pe_class != PE_CLASS_UNIV || pe -> pe_form != PE_FORM_CONS || pe -> pe_id != PE_CONS_SET) { advise (NULLCP, "TreeStructureSyntax bad class/form/id: %s/%d/0x%x", pe_classlist[pe -> pe_class], pe -> pe_form, pe -> pe_id); return NOTOK; } } else if (pe -> pe_form != PE_FORM_CONS) { advise (NULLCP, "TreeStructureSyntax bad form: %d", pe -> pe_form); return NOTOK; } { is_first = 1; } if ((p34 = prim2set (pe)) == NULLPE) { advise (NULLCP, "TreeStructureSyntax %s%s", PEPY_ERR_BAD_SET, pe_error (pe -> pe_errno)); return NOTOK; } pe = p34; if (p34 = set_find (pe, PE_CLASS_CONT, 1)) { register PE p35 = p34; { /* mandatoryObjectClasses TAG PULLUP */ register PE p36; if ((p36 = prim2set (p35)) == NULLPE) { advise (NULLCP, "mandatoryObjectClasses %smandatoryObjectClasses: %s", PEPY_ERR_BAD, pe_error (p35 -> pe_errno)); return NOTOK; } if (p36 -> pe_cardinal != 1) { advise (NULLCP, "mandatoryObjectClasses %s mandatoryObjectClasses: %d", PEPY_ERR_TOO_MANY_TAGGED, p36 -> pe_cardinal); return NOTOK; } p35 = first_member (p36); } { register PE p37;#ifdef DEBUG (void) testdebug (p35, "mandatoryObjectClasses");#endif if (p35 -> pe_class != PE_CLASS_UNIV || p35 -> pe_form != PE_FORM_CONS || p35 -> pe_id != PE_CONS_SET) { advise (NULLCP, "mandatoryObjectClasses bad class/form/id: %s/%d/0x%x", pe_classlist[p35 -> pe_class], p35 -> pe_form, p35 -> pe_id); return NOTOK; } if ((p37 = prim2set (p35)) == NULLPE) { advise (NULLCP, "mandatoryObjectClasses %s%s", PEPY_ERR_BAD_SET, pe_error (p35 -> pe_errno)); return NOTOK; } p35 = p37; for (p37 = first_member (p35); p37; p37 = next_member (p35, p37)) { register OID p38;#ifdef DEBUG (void) testdebug (p37, "member");#endif if (p37 -> pe_class != PE_CLASS_UNIV || p37 -> pe_form != PE_FORM_PRIM || p37 -> pe_id != PE_PRIM_OID) { advise (NULLCP, "member bad class/form/id: %s/%d/0x%x", pe_classlist[p37 -> pe_class], p37 -> pe_form, p37 -> pe_id); return NOTOK; } if ((p38 = prim2oid (p37)) == NULLOID) { advise (NULLCP, "member %s%s", PEPY_ERR_BAD_OID, pe_error (p37 -> pe_errno)); return NOTOK; }/* Spurious copy noticed by Jim Reed oid_tmp = oid_cpy (p38);*/ oid_tmp = p38; { if(is_first != 0) { (*parm) = tree_struct_alloc(); if (((*parm)->tree_object = oid2oc(oid_tmp)) == NULLOBJECTCLASS) (*parm)->tree_object = oc_add (oid_tmp); is_first = 0; } else { LLOG(log_dsap, LLOG_EXCEPTIONS, ("Multiple mandatory object classes")); } } } } p34_count ++; } else { advise (NULLCP, "mandatoryObjectClasses %s mandatoryObjectClasses member", PEPY_ERR_MISSING); return NOTOK; } if (p34 = set_find (pe, PE_CLASS_CONT, 2)) { register PE p39 = p34; { /* optionalObjectClasses TAG PULLUP */ register PE p40; if ((p40 = prim2set (p39)) == NULLPE) { advise (NULLCP, "optionalObjectClasses %soptionalObjectClasses: %s", PEPY_ERR_BAD, pe_error (p39 -> pe_errno)); return NOTOK; } if (p40 -> pe_cardinal != 1) { advise (NULLCP, "optionalObjectClasses %s optionalObjectClasses: %d", PEPY_ERR_TOO_MANY_TAGGED, p40 -> pe_cardinal); return NOTOK; } p39 = first_member (p40); } { register PE p41;#ifdef DEBUG (void) testdebug (p39, "optionalObjectClasses");#endif if (p39 -> pe_class != PE_CLASS_UNIV || p39 -> pe_form != PE_FORM_CONS || p39 -> pe_id != PE_CONS_SET) { advise (NULLCP, "optionalObjectClasses bad class/form/id: %s/%d/0x%x", pe_classlist[p39 -> pe_class], p39 -> pe_form, p39 -> pe_id); return NOTOK; } if ((p41 = prim2set (p39)) == NULLPE) { advise (NULLCP, "optionalObjectClasses %s%s", PEPY_ERR_BAD_SET, pe_error (p39 -> pe_errno)); return NOTOK; } p39 = p41; for (p41 = first_member (p39); p41; p41 = next_member (p39, p41)) {#ifdef DEBUG (void) testdebug (p41, "member");#endif if (p41 -> pe_class != PE_CLASS_UNIV || p41 -> pe_form != PE_FORM_PRIM || p41 -> pe_id != PE_PRIM_OID) { advise (NULLCP, "member bad class/form/id: %s/%d/0x%x", pe_classlist[p41 -> pe_class], p41 -> pe_form, p41 -> pe_id); return NOTOK; } if (prim2oid (p41) == NULLOID) { advise (NULLCP, "member %s%s", PEPY_ERR_BAD_OID, pe_error (p41 -> pe_errno)); return NOTOK; } } } p34_count ++; } if (p34 = set_find (pe, PE_CLASS_CONT, 3)) { register PE p42 = p34; { /* permittedRDNs TAG PULLUP */ register PE p43; if ((p43 = prim2set (p42)) == NULLPE) { advise (NULLCP, "permittedRDNs %spermittedRDNs: %s", PEPY_ERR_BAD, pe_error (p42 -> pe_errno)); return NOTOK; } if (p43 -> pe_cardinal != 1) { advise (NULLCP, "permittedRDNs %s permittedRDNs: %d", PEPY_ERR_TOO_MANY_TAGGED, p43 -> pe_cardinal); return NOTOK; } p42 = first_member (p43); } { register PE p44;#ifdef DEBUG (void) testdebug (p42, "permittedRDNs");#endif if (p42 -> pe_class != PE_CLASS_UNIV || p42 -> pe_form != PE_FORM_CONS || p42 -> pe_id != PE_CONS_SET) { advise (NULLCP, "permittedRDNs bad class/form/id: %s/%d/0x%x", pe_classlist[p42 -> pe_class], p42 -> pe_form, p42 -> pe_id); return NOTOK; } if ((p44 = prim2set (p42)) == NULLPE) { advise (NULLCP, "permittedRDNs %s%s", PEPY_ERR_BAD_SET, pe_error (p42 -> pe_errno)); return NOTOK; } p42 = p44; for (p44 = first_member (p42); p44; p44 = next_member (p42, p44)) { register PE p45;#ifdef DEBUG (void) testdebug (p44, "member");#endif if (p44 -> pe_class != PE_CLASS_UNIV || p44 -> pe_form != PE_FORM_CONS || p44 -> pe_id != PE_CONS_SET) { advise (NULLCP, "member bad class/form/id: %s/%d/0x%x", pe_classlist[p44 -> pe_class], p44 -> pe_form, p44 -> pe_id); return NOTOK; } if ((p45 = prim2set (p44)) == NULLPE) { advise (NULLCP, "member %s%s", PEPY_ERR_BAD_SET, pe_error (p44 -> pe_errno)); return NOTOK; } p44 = p45; for (p45 = first_member (p44); p45; p45 = next_member (p44, p45)) {#ifdef DEBUG (void) testdebug (p45, "member");#endif if (decode_IF_AttributeType (p45, 1, (int *)0, NULLVP, & at_tmp) == NOTOK) return NOTOK; } } } p34_count ++; } else { advise (NULLCP, "permittedRDNs %s permittedRDNs member", PEPY_ERR_MISSING); return NOTOK; } if (p34_count != pe -> pe_cardinal) advise (NULLCP, "%s", PEPY_ERR_EXTRA_MEMBERS); return OK;}EDB_encode (parm,pe)struct getedb_result *parm;PE *pe;{struct entry *ent_tmp;PE p31 = NULLPE;PE p32_z = NULLPE;register PE *p32 = &p32_z; if (parm->gr_encoded) { *pe = parm->gr_pe; return OK; } if (((*pe) = pe_alloc (PE_CLASS_UNIV, PE_FORM_CONS, PE_CONS_SEQ)) == NULLPE) { advise (NULLCP, "EntryDataBlock: %s", PEPY_ERR_NOMEM); return NOTOK; } for (ent_tmp = (Entry) avl_getfirst(parm->gr_edb); ent_tmp != NULLENTRY; ent_tmp = (Entry) avl_getnext()) { if ((ent_tmp -> e_data != E_DATA_MASTER) && (ent_tmp -> e_data != E_TYPE_SLAVE)) continue; if (encode_Quipu_RelativeEntry (p32, 0, NULL, NULLCP, ent_tmp) == NOTOK) return NOTOK; (void) seq_addon ((*pe), p31, (*p32)); p31 = (*p32);} return OK;}EDB_decode_force (pparm,pe)struct getedb_result ** pparm;PE pe;{Avlnode **tree;struct entry *tmp;int entry_cmp();register PE p46; if (pe -> pe_class != PE_CLASS_UNIV || pe -> pe_form != PE_FORM_CONS || pe -> pe_id != PE_CONS_SEQ) { advise (NULLCP, "EntryDataBlock bad class/form/id: %s/%d/0x%x", pe_classlist[pe -> pe_class], pe -> pe_form, pe -> pe_id); return NOTOK; } if ((p46 = prim2seq (pe)) == NULLPE) { advise (NULLCP, "EntryDataBlock %s%s", PEPY_ERR_BAD_SEQ, pe_error (pe -> pe_errno)); return NOTOK; } pe = p46; (*pparm)->gr_encoded = FALSE; (*pparm)->gr_edb = NULLAVL; tree = &((*pparm)->gr_edb); for (p46 = first_member (pe); p46; p46 = next_member (pe, p46)) { if (decode_Quipu_RelativeEntry (p46, 1, NULLIP, NULLVP, &tmp)== NOTOK) return NOTOK; tmp->e_leaf = TRUE; tmp->e_complete = TRUE; tmp->e_data = E_TYPE_SLAVE; if (avl_insert(tree, tmp, entry_cmp, avl_dup_error) == NOTOK) LLOG(log_dsap, LLOG_EXCEPTIONS, ("Bad EDB update (contains duplicates)")); } return OK;}EDB_decode (pparm,pe)struct getedb_result ** pparm;PE pe;{ if (pe -> pe_class != PE_CLASS_UNIV || pe -> pe_form != PE_FORM_CONS || pe -> pe_id != PE_CONS_SEQ) { advise (NULLCP, "EntryDataBlock bad class/form/id: %s/%d/0x%x", pe_classlist[pe -> pe_class], pe -> pe_form, pe -> pe_id); return NOTOK; } (*pparm)->gr_pe = pe; pe -> pe_refcnt++; (*pparm)->gr_encoded = TRUE; return OK;}EDB_free (parm)struct getedb_result *parm;{ /* All done for us at some other time (hopefully) */ return OK;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?