|
|
1.1 ! root 1: /* ufn_aei.c - user-friendly aei lookup */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/ufn_aet.c,v 7.1 90/07/09 14:35:17 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/dsap/common/RCS/ufn_aet.c,v 7.1 90/07/09 14:35:17 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: ufn_aet.c,v $ ! 12: * Revision 7.1 90/07/09 14:35:17 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.0 90/06/20 08:40:43 mrose ! 16: * *** empty log message *** ! 17: * ! 18: */ ! 19: ! 20: /* ! 21: * NOTICE ! 22: * ! 23: * Acquisition, use, and distribution of this module and related ! 24: * materials are subject to the restrictions of a license agreement. ! 25: * Consult the Preface in the User's Manual for the full terms of ! 26: * this agreement. ! 27: * ! 28: */ ! 29: ! 30: ! 31: #include "quipu/ufn.h" ! 32: #include "quipu/list.h" ! 33: #include "quipu/ds_search.h" ! 34: #include "quipu/connection.h" /* ds_search uses di_block - include this for lint !!! */ ! 35: #include "quipu/dua.h" ! 36: ! 37: extern LLog * log_dsap; ! 38: extern LLog * addr_log; ! 39: ! 40: extern Filter ocfilter (); ! 41: extern Filter joinfilter (); ! 42: ! 43: extern char PY_pepy[]; ! 44: void PY_advise (); ! 45: ! 46: ! 47: static Filter aet_filter (context) ! 48: char * context; ! 49: { ! 50: Filter a,b; ! 51: ! 52: if ((a = ocfilter ("ApplicationEntity")) == NULLFILTER) ! 53: return NULLFILTER; ! 54: ! 55: b = filter_alloc (); ! 56: b->flt_next = a; ! 57: b->flt_type = FILTER_ITEM; ! 58: b->FUITEM.fi_type = FILTERITEM_EQUALITY; ! 59: if ((b->FUITEM.UNAVA.ava_type = AttrT_new (APPLCTX_OID)) == NULLAttrT) { ! 60: LLOG (log_dsap,LLOG_EXCEPTIONS,("supported application context attribute unknown")) ! 61: return NULLFILTER; ! 62: } ! 63: b->FUITEM.UNAVA.ava_value = str2AttrV(context, ! 64: b->FUITEM.UNAVA.ava_type->oa_syntax); ! 65: if (b->FUITEM.UNAVA.ava_value == NULLAttrV) { ! 66: LLOG (log_dsap,LLOG_EXCEPTIONS,("'%s' unknown OID",context)); ! 67: return NULLFILTER; ! 68: } ! 69: ! 70: return joinfilter (b,FILTER_AND); ! 71: } ! 72: ! 73: static aet_search (base, subtree, filt, res) ! 74: DN base; ! 75: char subtree; ! 76: Filter filt; ! 77: DNS * res; ! 78: { ! 79: struct ds_search_arg search_arg; ! 80: static struct ds_search_result result; ! 81: struct DSError err; ! 82: static CommonArgs ca = default_common_args; ! 83: EntryInfo * ptr; ! 84: DNS newdns, r = NULLDNS; ! 85: ! 86: search_arg.sra_baseobject = base; ! 87: search_arg.sra_filter = filt; ! 88: if (subtree) ! 89: search_arg.sra_subset = SRA_WHOLESUBTREE; ! 90: else ! 91: search_arg.sra_subset = SRA_ONELEVEL; ! 92: search_arg.sra_searchaliases = TRUE; ! 93: search_arg.sra_common = ca; /* struct copy */ ! 94: search_arg.sra_eis.eis_infotypes = TRUE; ! 95: search_arg.sra_eis.eis_allattributes = TRUE; ! 96: search_arg.sra_eis.eis_select = NULLATTR; ! 97: ! 98: if (ds_search (&search_arg, &err, &result) != DS_OK) { ! 99: log_ds_error (&err); ! 100: ds_error_free (&err); ! 101: return FALSE; ! 102: } ! 103: ! 104: correlate_search_results (&result); ! 105: ! 106: if ( (result.CSR_limitproblem != LSR_NOLIMITPROBLEM) || (result.CSR_cr != NULLCONTINUATIONREF)) { ! 107: if ( ! result.CSR_entries) ! 108: return FALSE; ! 109: } ! 110: ! 111: for (ptr = result.CSR_entries; ptr != NULLENTRYINFO; ptr=ptr->ent_next) { ! 112: cache_entry (ptr,FALSE,TRUE); ! 113: newdns = dn_seq_alloc(); ! 114: newdns->dns_next = r; ! 115: newdns->dns_dn = dn_cpy (ptr->ent_dn); ! 116: r = newdns; ! 117: } ! 118: ! 119: *res = r; ! 120: ! 121: return TRUE; ! 122: } ! 123: ! 124: ! 125: aet_match (c,v,interact,result,el,context) ! 126: int c; ! 127: char ** v; ! 128: DNS *result; ! 129: DNS (* interact) (); ! 130: envlist el; ! 131: char * context; ! 132: { ! 133: DNS ufnr = NULLDNS; ! 134: DNS newap = NULLDNS; ! 135: DNS apps = NULLDNS; ! 136: DNS dns, DNS_append(); ! 137: Filter filt; ! 138: int ok = TRUE; ! 139: ! 140: if (!ufn_match (c,v,interact,&ufnr,el)) { ! 141: char buffer[BUFSIZ]; ! 142: ! 143: (void) sprintf (buffer, "ufn_match failed: %s", PY_pepy); ! 144: (void) strcpy (PY_pepy, buffer); ! 145: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ("%s", PY_pepy)); ! 146: *result = NULLDNS; ! 147: return FALSE; ! 148: } ! 149: ! 150: filt = aet_filter(context); ! 151: ! 152: for (dns = ufnr; dns != NULLDNS; dns=dns->dns_next) { ! 153: newap = NULLDNS; ! 154: if (aet_search (dns->dns_dn,FALSE,filt,&newap)) ! 155: apps = DNS_append (apps,newap); ! 156: else ! 157: ok = FALSE; ! 158: } ! 159: ! 160: if ((apps == NULLDNS) && ok) { ! 161: /* go deeper */ ! 162: for (dns = ufnr; dns != NULLDNS; dns=dns->dns_next) { ! 163: if (dns->dns_dn->dn_parent == NULLDN) ! 164: /* too high for subtree search */ ! 165: continue; ! 166: newap = NULLDNS; ! 167: if (aet_search (dns->dns_dn,TRUE,filt,&newap)) ! 168: apps = DNS_append (apps,newap); ! 169: else ! 170: ok = FALSE; ! 171: } ! 172: } ! 173: ! 174: if (!ok && !apps) { ! 175: PY_advise (NULLCP, ! 176: "search for applicationEntity supporting \"%s\" failed", ! 177: context); ! 178: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ("%s", PY_pepy)); ! 179: } ! 180: ! 181: filter_free (filt); ! 182: ! 183: dn_seq_free (ufnr); ! 184: ! 185: *result = apps; ! 186: ! 187: return ok; ! 188: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.