|
|
1.1 ! root 1: /* aetufn.c - UFN-based DSE */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/aetufn.c,v 7.1 90/07/09 14:33:49 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/dsap/common/RCS/aetufn.c,v 7.1 90/07/09 14:33:49 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: aetufn.c,v $ ! 12: * Revision 7.1 90/07/09 14:33:49 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.0 90/07/06 23:18:10 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: /* LINTLIBRARY */ ! 32: ! 33: #include "quipu/ufn.h" ! 34: #include "quipu/util.h" ! 35: #include "quipu/read.h" ! 36: #include "quipu/dua.h" ! 37: #include "quipu/bind.h" ! 38: #include "tailor.h" ! 39: ! 40: extern LLog * addr_log; ! 41: ! 42: extern char * dn2str(); ! 43: extern char * dn2ufn(); ! 44: extern struct dn_seq *dn_seq_push (); ! 45: ! 46: ! 47: /* ARGSUSED */ ! 48: static DNS ufn_interact (dns,dn,s) ! 49: DNS dns; ! 50: DN dn; ! 51: char * s; ! 52: { ! 53: char buf[LINESIZE]; ! 54: DNS result = NULLDNS; ! 55: DNS newdns; ! 56: ! 57: if (dns == NULLDNS) ! 58: return NULLDNS; ! 59: ! 60: (void) printf ("Please select from the following (matching '%s'):\n",s); ! 61: while (dns != NULLDNS) { ! 62: (void) printf (" %s [y/n] ? ",dn2ufn(dns->dns_dn,FALSE)); ! 63: (void) fflush (stdout); ! 64: again:; ! 65: if (gets (buf) == NULL) { ! 66: clearerr (stdin); ! 67: (void) printf ("\n"); ! 68: return result; ! 69: } ! 70: ! 71: if ((buf[0] == NULL) ! 72: || (strlen(buf) != 1) ! 73: || ((buf[0] != 'y') && (buf[0] != 'n'))) { ! 74: (void) printf ("Please type 'y' or 'n': "); ! 75: (void) fflush (stdout); ! 76: goto again; ! 77: } ! 78: ! 79: if (buf[0] == 'y') { ! 80: newdns = dn_seq_alloc(); ! 81: newdns->dns_next = result; ! 82: newdns->dns_dn = dn_cpy (dns->dns_dn); ! 83: result = newdns; ! 84: dns = dns->dns_next; ! 85: } else { ! 86: DNS tmp; ! 87: tmp = dns; ! 88: dns = dns->dns_next; ! 89: tmp->dns_next = NULLDNS; ! 90: dn_seq_free (tmp); ! 91: } ! 92: } ! 93: return result; ! 94: } ! 95: ! 96: /* ARGSUSED */ ! 97: ! 98: static DNS just_say_no (dns,dn,s) ! 99: DNS dns; ! 100: DN dn; ! 101: char * s; ! 102: { ! 103: /* we only want good hits ! */ ! 104: ! 105: dn_seq_free (dns); ! 106: SLOG (addr_log, LLOG_NOTICE, NULLCP, ! 107: ("UFN asked for interactive response -- auto reply of NO")); ! 108: return NULLDNS; ! 109: } ! 110: ! 111: static bind_to_dsa () ! 112: { ! 113: struct ds_bind_arg bindarg; ! 114: struct ds_bind_arg bindresult; ! 115: struct ds_bind_error binderr; ! 116: ! 117: bindarg.dba_version = DBA_VERSION_V1988; ! 118: ! 119: bindarg.dba_passwd_len = 0; ! 120: bindarg.dba_passwd [0] = '\0'; ! 121: bindarg.dba_dn = NULLDN; ! 122: ! 123: if (ds_bind (&bindarg,&binderr,&bindresult) != DS_OK) ! 124: return FALSE; ! 125: else ! 126: return TRUE; ! 127: } ! 128: ! 129: static PE name2psap (dn) ! 130: DN dn; ! 131: { ! 132: AttributeType at; ! 133: extern PE grab_pe(); ! 134: PE res_pe; ! 135: static struct ds_read_arg read_arg = ! 136: { ! 137: default_common_args, ! 138: NULLDN, /* read_arg DN */ ! 139: { /* entry info selection */ ! 140: FALSE, ! 141: NULLATTR, ! 142: EIS_ATTRIBUTESANDVALUES ! 143: } ! 144: }; ! 145: struct DSError error; ! 146: struct ds_read_result result; ! 147: ! 148: ! 149: if ( (at = AttrT_new (DSAADDRESS_OID)) == NULLAttrT) { ! 150: PY_advise (NULLCP, "build of attribute failed: %s", ! 151: DSAADDRESS_OID); ! 152: out: ; ! 153: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ("%s", PY_pepy)); ! 154: return NULLPE; ! 155: } ! 156: ! 157: read_arg.rda_common.ca_servicecontrol.svc_prio = SVC_PRIO_HIGH; ! 158: read_arg.rda_object = dn; ! 159: read_arg.rda_eis.eis_select = as_comp_new (AttrT_cpy (at), NULLAV, NULLACL_INFO); ! 160: ! 161: if (ds_read (&read_arg,&error,&result) != DS_OK) { ! 162: PY_advise (NULLCP, "DAP lookup failed: %s",dn2str(dn)); ! 163: log_ds_error (&error); ! 164: ds_error_free (&error); ! 165: AttrT_free (at); ! 166: as_free (read_arg.rda_eis.eis_select); ! 167: goto out; ! 168: } else { ! 169: if (result.rdr_entry.ent_attr == NULLATTR) { ! 170: PY_advise (NULLCP, "No '%s' attribute in entry '%s'", ! 171: DSAADDRESS_OID,dn2str(dn)); ! 172: AttrT_free (at); ! 173: as_free (read_arg.rda_eis.eis_select); ! 174: goto out; ! 175: } ! 176: AttrT_free (at); ! 177: as_free (read_arg.rda_eis.eis_select); ! 178: res_pe = grab_pe(&result.rdr_entry.ent_attr->attr_value->avseq_av); ! 179: as_free (result.rdr_entry.ent_attr); ! 180: return (res_pe); ! 181: } ! 182: } ! 183: ! 184: static char bound = FALSE; ! 185: static char unbind = FALSE; ! 186: static envlist el = NULLEL; ! 187: ! 188: /* ARGSUSED */ ! 189: ! 190: static PE name2value_ufn (name, qualifier, context, ontty, real_name) ! 191: char *name, ! 192: *qualifier, ! 193: *context; ! 194: int ontty; ! 195: PE *real_name; ! 196: { ! 197: int n; ! 198: char * v[20],buffer[LINESIZE]; ! 199: DNS dns = NULLDNS; ! 200: DN *dn; ! 201: PE addr; ! 202: ! 203: *real_name = NULLPE; ! 204: ! 205: if (el == NULLEL) ! 206: set_el (); ! 207: ! 208: (void) strcpy (buffer, name); ! 209: if ((n = sstr2arg (buffer,20,v,",")) == NOTOK) { ! 210: PY_advise (NULLCP, "invalid name"); ! 211: out: ; ! 212: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ("%s", PY_pepy)); ! 213: return NULLPE; ! 214: } ! 215: ! 216: if (! bound) { ! 217: if (! bind_to_dsa()) { ! 218: PY_advise (NULLCP, "bind to directory failed"); ! 219: goto out; ! 220: } ! 221: bound = TRUE; ! 222: } ! 223: ! 224: PY_pepy[0] = NULL; ! 225: if ( ! aet_match (n, v, ontty ? ufn_interact : just_say_no, &dns, el, ! 226: context)) { ! 227: if (PY_pepy[0] == NULL) { ! 228: PY_advise (NULLCP, "unable to resolve name"); ! 229: goto out; ! 230: } ! 231: return NULLPE; ! 232: } ! 233: ! 234: if (dns == NULLDNS) { ! 235: PY_advise (NULLCP, "search failed to find anything"); ! 236: goto out; ! 237: } ! 238: dn = NULL; ! 239: ! 240: ! 241: addr = NULLPE; ! 242: if (dns->dns_next == NULLDNS) { ! 243: dn = &dns -> dns_dn; ! 244: addr = name2psap (*dn); ! 245: } ! 246: else { ! 247: /* Multiple hits */ ! 248: /* Continue until one works */ ! 249: if ( ontty ) ! 250: (void) dnSelect (name,&dns,ufn_interact,el->Dns); ! 251: ! 252: for (; dns!= NULLDNS; dns=dns->dns_next) { ! 253: dn = &dns -> dns_dn; ! 254: if (addr = name2psap (*dn)) ! 255: break; ! 256: } ! 257: } ! 258: ! 259: if (*dn) { ! 260: (void) encode_IF_DistinguishedName (real_name, 1, 0, NULLCP, *dn); ! 261: *dn = NULLDN; ! 262: } ! 263: dn_seq_free (dns); ! 264: ! 265: if (unbind) { ! 266: bound = FALSE; ! 267: ds_unbind (); ! 268: } ! 269: ! 270: return addr; ! 271: } ! 272: ! 273: ! 274: static set_el () ! 275: { ! 276: register envlist en, ! 277: *ep; ! 278: DN local_dn, ! 279: c_dn; ! 280: static int inited = FALSE; ! 281: extern char *local_dit; ! 282: ! 283: if (!inited) { ! 284: quipu_syntaxes (); ! 285: dsap_init ((int *)0,(char ***)0); ! 286: inited = TRUE; ! 287: } ! 288: if (el = read_envlist ()) ! 289: return; ! 290: ! 291: if (local_dn = str2dn (local_dit)) { ! 292: DN dn = local_dn -> dn_parent; ! 293: ! 294: local_dn -> dn_parent = NULLDN; ! 295: c_dn = dn_cpy (local_dn); ! 296: local_dn -> dn_parent = dn; ! 297: } ! 298: ! 299: ep = ⪙ ! 300: ! 301: if ((en = (envlist) calloc (1, sizeof **ep)) == NULL) { ! 302: no_mem: ; ! 303: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ("out of memory")); ! 304: if (el) { ! 305: for (; el; el = en) { ! 306: en = el -> Next; ! 307: ! 308: dn_seq_free (el -> Dns); ! 309: free ((char *) el); ! 310: } ! 311: ! 312: el = NULLEL; ! 313: } ! 314: goto done; ! 315: } ! 316: *ep = en, ep = &en -> Next; ! 317: en -> Dns = ! 318: dn_seq_push (local_dn, ! 319: dn_seq_push (c_dn, dn_seq_push (NULLDN, NULLDNSEQ))); ! 320: en -> Upper = en -> Lower = 1; ! 321: ! 322: if ((en = (envlist) calloc (1, sizeof **ep)) == NULL) ! 323: goto no_mem; ! 324: *ep = en, ep = &en -> Next; ! 325: en -> Dns = ! 326: dn_seq_push (c_dn, ! 327: dn_seq_push (local_dn, dn_seq_push (NULLDN, NULLDNSEQ))); ! 328: en -> Upper = en -> Lower = 2; ! 329: ! 330: if ((en = (envlist) calloc (1, sizeof **ep)) == NULL) ! 331: goto no_mem; ! 332: *ep = en, ep = &en -> Next; ! 333: en -> Dns = ! 334: dn_seq_push (NULLDN, ! 335: dn_seq_push (c_dn, dn_seq_push (local_dn, NULLDNSEQ))); ! 336: en -> Upper = 32767, en -> Lower = 3; ! 337: ! 338: done: ; ! 339: dn_free (local_dn); ! 340: dn_free (c_dn); ! 341: } ! 342: ! 343: set_lookup_ufn (flag) ! 344: char flag; /* if TRUE always unbind */ ! 345: { ! 346: unbind = flag; ! 347: ! 348: acsap_lookup = name2value_ufn; ! 349: ! 350: if (el == NULLEL) ! 351: set_el (); ! 352: } ! 353: ! 354: ! 355: #ifdef STANDALONE_AET_TEST ! 356: ! 357: main (argc,argv) ! 358: int argc; ! 359: char ** argv; ! 360: { ! 361: char buffer [1024]; ! 362: int ontty, n; ! 363: PE title, paddr; ! 364: ! 365: buffer[0] = NULL; ! 366: ! 367: ontty = isatty (fileno (stdin)); ! 368: for (n=1; n<argc; n++) { ! 369: (void) strcat (buffer," "); ! 370: (void) strcat (buffer, argv[n]); ! 371: } ! 372: ! 373: isodetailor ("ufn_aet",1); ! 374: ! 375: quipu_syntaxes (); ! 376: dsap_init ((int *)0,(char ***)0); ! 377: ! 378: addr_log -> ll_events |= LLOG_ALL, addr_log -> ll_stat |= LLOGTTY; ! 379: ! 380: if (pe = name2value_ufn (buffer, "iso ftam", ontty, &title)) { ! 381: struct PSAPaddr pas; ! 382: ! 383: if (parse_DSE_PSAPaddr (pe, 1, NULLIP, NULLVP, (char *) &pas) ! 384: == NOTOK) ! 385: fprintf (stderr, "parse of presentation address failed: %s", ! 386: PY_pepy); ! 387: else ! 388: printf ("%s\n", paddr2str (&pas)); ! 389: } ! 390: else ! 391: fprintf (stderr, "directory returns no value"); ! 392: ! 393: if (title) { ! 394: printf ("AETitle\n"); ! 395: vunknown (title); ! 396: } ! 397: ! 398: exit (0); ! 399: } ! 400: ! 401: advise () ! 402: { ! 403: ; ! 404: } ! 405: ! 406: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.