|
|
1.1 ! root 1: /* dased.c - stand-alone DASE */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/acsap/RCS/dased.c,v 7.2 90/07/27 08:41:41 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/acsap/RCS/dased.c,v 7.2 90/07/27 08:41:41 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: dased.c,v $ ! 12: * Revision 7.2 90/07/27 08:41:41 mrose ! 13: * update ! 14: * ! 15: * Revision 7.1 90/07/09 14:30:57 mrose ! 16: * sync ! 17: * ! 18: * Revision 7.0 90/07/07 16:11:31 mrose ! 19: * *** empty log message *** ! 20: * ! 21: */ ! 22: ! 23: /* ! 24: * NOTICE ! 25: * ! 26: * Acquisition, use, and distribution of this module and related ! 27: * materials are subject to the restrictions of a license agreement. ! 28: * Consult the Preface in the User's Manual for the full terms of ! 29: * this agreement. ! 30: * ! 31: */ ! 32: ! 33: ! 34: #include <signal.h> ! 35: #include <stdio.h> ! 36: #include <varargs.h> ! 37: #include "manifest.h" ! 38: #include <sys/ioctl.h> ! 39: #ifdef BSD42 ! 40: #include <sys/file.h> ! 41: #endif ! 42: #ifdef SYS5 ! 43: #include <fcntl.h> ! 44: #endif ! 45: #include "DASE-types.h" ! 46: #include "psap.h" ! 47: #include "tsap.h" ! 48: #include "dgram.h" ! 49: #include "tailor.h" ! 50: ! 51: #include "quipu/ufn.h" ! 52: #include "quipu/util.h" ! 53: #include "quipu/read.h" ! 54: #include "quipu/dua.h" ! 55: #include "quipu/bind.h" ! 56: ! 57: /* */ ! 58: ! 59: static int debug = 0; ! 60: static int nbits = FD_SETSIZE; ! 61: ! 62: static LLog _pgm_log = { ! 63: "dased.log", NULLCP, NULLCP, ! 64: LLOG_FATAL | LLOG_EXCEPTIONS | LLOG_NOTICE, LLOG_FATAL, ! 65: -1, LLOGCLS | LLOGCRT | LLOGZER, NOTOK ! 66: }; ! 67: ! 68: static LLog *pgm_log = &_pgm_log; ! 69: ! 70: static char *myname = "dased"; ! 71: ! 72: static struct TSAPaddr tas; ! 73: ! 74: static int isbound = 0; ! 75: extern int dsap_ad; ! 76: static PS ps; ! 77: static PS nps; ! 78: ! 79: ! 80: int dns_compar (); ! 81: DNS dase_interact (), just_say_no (); ! 82: PE name2psap (); ! 83: ! 84: void adios (), advise (), ts_adios (), ts_advise (); ! 85: ! 86: ! 87: char *dn2str (); ! 88: PE grab_pe (); ! 89: ! 90: /* */ ! 91: ! 92: /* ARGSUSED */ ! 93: ! 94: main (argc, argv, envp) ! 95: int argc; ! 96: char **argv, ! 97: **envp; ! 98: { ! 99: int vecp; ! 100: char *vec[4]; ! 101: struct TSAPdisconnect tds; ! 102: register struct TSAPdisconnect *td = &tds; ! 103: ! 104: arginit (argv); ! 105: envinit (); ! 106: ! 107: advise (LLOG_NOTICE, NULLCP, "listening on %s", taddr2str (&tas)); ! 108: if (TNetListen (&tas, td) == NOTOK) ! 109: ts_adios (td, "TNetListen failed"); ! 110: ! 111: for (;;) { ! 112: int nfds, ! 113: secs; ! 114: fd_set ifds, ! 115: *rfds; ! 116: ! 117: if (!isbound) ! 118: (void) bind_to_dsa (); ! 119: ! 120: if (isbound) { ! 121: rfds = &ifds; ! 122: ! 123: nfds = dsap_ad + 1; ! 124: ! 125: FD_ZERO (rfds); ! 126: FD_SET (dsap_ad, rfds); ! 127: ! 128: secs = NOTOK; ! 129: } ! 130: else ! 131: nfds = 0, rfds = NULLFD, secs = 5 * 60L; ! 132: ! 133: if (TNetAcceptAux (&vecp, vec, NULLIP, NULLTA, nfds, rfds, NULLFD, ! 134: NULLFD, secs, td) == NOTOK) { ! 135: ts_advise (td, LLOG_EXCEPTIONS, "TNetAccept failed"); ! 136: continue; ! 137: } ! 138: ! 139: if (rfds && FD_ISSET (dsap_ad, rfds)) { /* DSA timed us out... */ ! 140: if (debug) ! 141: advise (LLOG_DEBUG, NULLCP, "unbound from directory"); ! 142: ! 143: (void) ds_unbind (); ! 144: isbound = 0; ! 145: } ! 146: ! 147: if (vecp <= 0) ! 148: continue; ! 149: ! 150: switch (TNetFork (vecp, vec, td)) { ! 151: case OK: ! 152: ll_hdinit (pgm_log, myname); ! 153: dased (vecp, vec); ! 154: exit (1); ! 155: /* NOTREACHED */ ! 156: ! 157: case NOTOK: ! 158: ts_advise (td, LLOG_EXCEPTIONS, "TNetFork failed"); ! 159: break; ! 160: ! 161: default: ! 162: if (isbound) { ! 163: if (dsap_ad != NOTOK) ! 164: (void) close (dsap_ad); ! 165: isbound = 0; ! 166: } ! 167: break; ! 168: } ! 169: } ! 170: } ! 171: ! 172: /* DASE */ ! 173: ! 174: static dased (vecp, vec) ! 175: int vecp; ! 176: char **vec; ! 177: { ! 178: int sd; ! 179: struct TSAPstart tss; ! 180: register struct TSAPstart *ts = &tss; ! 181: struct TSAPdisconnect tds; ! 182: register struct TSAPdisconnect *td = &tds; ! 183: ! 184: if (TInit (vecp, vec, ts, td) == NOTOK) ! 185: ts_adios (td, "T-CONNECT.INDICATION failed"); ! 186: ! 187: sd = ts -> ts_sd; ! 188: advise (LLOG_NOTICE, NULLCP, "T-CONNECT.INDICATION: <%d, %s, %s, %d, %d>", ! 189: ts -> ts_sd, taddr2str (&ts -> ts_calling), ! 190: taddr2str (&ts -> ts_called), ts -> ts_expedited, ! 191: ts -> ts_tsdusize); ! 192: ! 193: if (TConnResponse (sd, NULLTA, 0, NULLCP, 0, NULLQOS, td) == NOTOK) ! 194: ts_adios (td, "T-CONNECT.RESPONSE failed"); ! 195: ! 196: if ((ps = ps_alloc (dg_open)) == NULLPS) ! 197: adios (NULLCP, "ps_alloc: out of memory"); ! 198: if (dg_setup (ps, sd, MAXDGRAM, ts_read, ts_write) == NOTOK) ! 199: adios (NULLCP, "dg_setup: %s", ps_error (ps -> ps_errno)); ! 200: ! 201: for (;;) { ! 202: struct type_DASE_Query__REQ *req; ! 203: PE pe; ! 204: ! 205: if (!isbound) ! 206: (void) bind_to_dsa (); ! 207: ! 208: if ((pe = ps2pe (ps)) == NULLPE) { ! 209: if (ps -> ps_errno == PS_ERR_NONE) { ! 210: advise (LLOG_NOTICE, NULLCP, "T-DISCONNECT.INDICATION"); ! 211: break; ! 212: } ! 213: else ! 214: adios (NULLCP, "ps2pe: %s", ps_error (ps -> ps_errno)); ! 215: } ! 216: ! 217: if (decode_DASE_Query__REQ (pe, 1, NULLIP, NULLVP, &req) == NOTOK) ! 218: adios (NULLCP, "decode_DASE_Query__REQ: %s", PY_pepy); ! 219: PLOGP (pgm_log,DASE_Message, pe, "message", 1); ! 220: ! 221: dase_aux (req); ! 222: ! 223: free_DASE_Query__REQ (req); ! 224: pe_free (pe); ! 225: } ! 226: ! 227: if (isbound) { ! 228: if (debug) ! 229: advise (LLOG_DEBUG, NULLCP, "unbound from directory"); ! 230: ! 231: (void) ds_unbind (); ! 232: } ! 233: ! 234: exit (0); ! 235: } ! 236: ! 237: /* */ ! 238: ! 239: static dase_aux (req) ! 240: register struct type_DASE_Query__REQ *req; ! 241: { ! 242: register int i; ! 243: int vecp; ! 244: register char **vp; ! 245: char *context, ! 246: **vec; ! 247: register struct type_DASE_Query__RSP *rsp; ! 248: register struct element_DASE_0 *d0; ! 249: register struct element_DASE_1 *d1; ! 250: envlist el; ! 251: register envlist en, ! 252: *ep; ! 253: DN *dn; ! 254: DNS dns; ! 255: PE pe; ! 256: ! 257: if ((rsp = (struct type_DASE_Query__RSP *) calloc (1, sizeof *rsp)) ! 258: == NULL) { ! 259: no_mem: ; ! 260: adios (NULLCP, "out of memory"); ! 261: } ! 262: ! 263: vec = NULL, el = NULL, context = NULL, dns = NULL; ! 264: if (!isbound) ! 265: goto send_rsp; ! 266: ! 267: i = 1; ! 268: for (d0 = req -> name; d0; d0 = d0 -> next) ! 269: i++; ! 270: if ((vec = (char **) calloc ((unsigned) i, sizeof *vec)) == NULL) ! 271: goto no_mem; ! 272: for (vp = vec, d0 = req -> name; d0; vp++, d0 = d0 -> next) ! 273: if ((*vp = qb2str (d0 -> IA5String)) == NULL) ! 274: goto no_mem; ! 275: vecp = i - 1; ! 276: ! 277: el = NULL, ep = ⪙ ! 278: for (d1 = req -> envlist; d1; d1 = d1 -> next) { ! 279: struct type_DASE_Environment *ev = d1 -> Environment; ! 280: register struct element_DASE_2 *d2; ! 281: register struct dn_seq **dp; ! 282: ! 283: if ((en = (envlist) calloc (1, sizeof *en)) == NULL) ! 284: goto no_mem; ! 285: *ep = en, ep = &en -> Next; ! 286: ! 287: en -> Upper = ev -> upper; ! 288: en -> Lower = ev -> lower; ! 289: ! 290: dp = &en -> Dns; ! 291: for (d2 = ev -> path; d2; d2 = d2 -> next) { ! 292: char *cp; ! 293: register struct dn_seq *ds; ! 294: ! 295: if ((ds = (struct dn_seq *) calloc (1, sizeof *ds)) == NULL) ! 296: goto no_mem; ! 297: *dp = ds, dp = &ds -> dns_next; ! 298: ! 299: if ((cp = qb2str (d2 -> IA5String)) == NULL) ! 300: goto no_mem; ! 301: if (*cp != '-') ! 302: ds -> dns_dn = str2dn (cp); ! 303: free (cp); ! 304: ! 305: if (*cp != '-' && ds -> dns_dn == NULLDN) { ! 306: PY_advise (NULLCP, "bad DN in environment: %s", cp); ! 307: goto send_rsp; ! 308: } ! 309: } ! 310: } ! 311: ! 312: if ((context = qb2str (req -> context)) == NULL) ! 313: goto no_mem; ! 314: ! 315: PY_pepy[0] = NULL; ! 316: if (!aet_match (vecp, vec, req -> interactive ? dase_interact ! 317: : just_say_no, ! 318: &dns, el, context)) { ! 319: if (PY_pepy[0] == NULL) ! 320: PY_advise (NULLCP, "unable to resolve name"); ! 321: goto send_rsp; ! 322: } ! 323: ! 324: if (dns == NULL) { ! 325: PY_advise (NULLCP, "search failed to find anything"); ! 326: goto send_rsp; ! 327: } ! 328: dn = NULL; ! 329: ! 330: pe = NULLPE; ! 331: if (dns -> dns_next) { ! 332: if (req -> interactive) ! 333: (void) dnSelect (vec[0], &dns, dase_interact, el -> Dns); ! 334: ! 335: for (; dns; dns = dns -> dns_next) { ! 336: dn = &dns -> dns_dn; ! 337: if (rsp -> value = name2psap (*dn)) ! 338: break; ! 339: } ! 340: } ! 341: else { ! 342: dn = &dns -> dns_dn; ! 343: rsp -> value = name2psap (*dn); ! 344: } ! 345: ! 346: if (*dn) { ! 347: (void) encode_IF_DistinguishedName (&rsp -> name, 1, NULL, NULLCP,*dn); ! 348: ! 349: ufn_dn_print_aux (nps, *dn, NULLDN, 0); ! 350: ps_print (nps, " "); ! 351: *--nps -> ps_ptr = NULL, nps -> ps_cnt++; ! 352: ! 353: rsp -> friendly = str2qb (nps -> ps_base, strlen (nps -> ps_base), 1); ! 354: ! 355: nps -> ps_ptr = nps -> ps_base, nps -> ps_cnt = nps -> ps_bufsiz; ! 356: ! 357: *dn = NULLDN; ! 358: } ! 359: ! 360: send_rsp: ; ! 361: if (PY_pepy[0]) { ! 362: advise (LLOG_NOTICE, NULLCP, "diagnostic: %s", PY_pepy); ! 363: ! 364: if ((rsp -> diagnostic = str2qb (PY_pepy, strlen (PY_pepy), 1)) ! 365: == NULL) ! 366: goto no_mem; ! 367: } ! 368: ! 369: if (encode_DASE_Query__RSP (&pe, 1, NULL, NULLCP, rsp) == NOTOK) ! 370: adios (NULLCP, "encode_DASE_Query__RSP: %s", PY_pepy); ! 371: if (pe2ps (ps, pe) == NOTOK) ! 372: adios (NULLCP, "pe2ps: %s", ps_error (ps -> ps_errno)); ! 373: PLOGP (pgm_log,DASE_Message, pe, "message", 0); ! 374: ! 375: free_DASE_Query__RSP (rsp); ! 376: pe_free (pe); ! 377: ! 378: if (vec) { ! 379: for (vp = vec; *vp; vp++) ! 380: free (*vp); ! 381: free ((char *) vec); ! 382: } ! 383: ! 384: for (; el; el = en) { ! 385: en = el -> Next; ! 386: ! 387: dn_seq_free (el -> Dns); ! 388: free ((char *) el); ! 389: } ! 390: ! 391: if (context) ! 392: free (context); ! 393: ! 394: if (dns) ! 395: dn_seq_free (dns); ! 396: } ! 397: ! 398: /* */ ! 399: ! 400: static bind_to_dsa () ! 401: { ! 402: struct ds_bind_arg ba; ! 403: struct ds_bind_arg br; ! 404: struct ds_bind_error be; ! 405: static int inited = FALSE; ! 406: ! 407: if (!inited) { ! 408: quipu_syntaxes (); ! 409: dsap_init ((int *) 0, (char ***) 0); ! 410: inited = TRUE; ! 411: } ! 412: ! 413: bzero ((char *) &ba, sizeof ba); ! 414: ! 415: isbound = 1; ! 416: if (ds_bind (&ba, &be, &br) == DS_OK) { ! 417: if (debug) ! 418: advise (LLOG_DEBUG, NULLCP, "bound to directory"); ! 419: ! 420: return OK; ! 421: } ! 422: ! 423: PY_advise (NULLCP, "unable to bind to directory: %s", ! 424: be.dbe_type == DBE_TYPE_SECURITY ? "security error" ! 425: : "DSA unavailable"); ! 426: advise (LLOG_EXCEPTIONS, NULLCP, "%s", PY_pepy); ! 427: ! 428: isbound = 0; ! 429: ! 430: return NOTOK; ! 431: } ! 432: ! 433: /* */ ! 434: ! 435: static DNS dase_interact (dns, dn, s) ! 436: DNS dns; ! 437: DN dn; ! 438: char *s; ! 439: { ! 440: register int i; ! 441: register struct type_DASE_Callback__REQ *req = NULL; ! 442: register struct element_DASE_3 **dp; ! 443: struct type_DASE_Callback__RSP *rsp = NULL; ! 444: register struct type_DASE_Callback__RSP *rp; ! 445: DNS ds, ! 446: *dq; ! 447: PE pe = NULLPE; ! 448: ! 449: if (dns == NULLDNS) ! 450: return NULL; ! 451: ! 452: i = 0; ! 453: for (ds = dns; ds; ds = ds -> dns_next) ! 454: i++; ! 455: ! 456: if (i > 1) { ! 457: struct dn_seq **base, ! 458: **bp, ! 459: **ep; ! 460: ! 461: if (base = (struct dn_seq **) malloc ((unsigned) (i * sizeof *base))) { ! 462: ep = base; ! 463: for (ds = dns; ds; ds = ds -> dns_next) ! 464: *ep++ = ds; ! 465: ! 466: qsort ((char *) base, i, sizeof *base, dns_compar); ! 467: ! 468: bp = base; ! 469: ds = dns = *bp++; ! 470: while (bp < ep) { ! 471: ds -> dns_next = *bp; ! 472: ds = *bp++; ! 473: } ! 474: ds -> dns_next = NULL; ! 475: ! 476: free ((char *) base); ! 477: } ! 478: } ! 479: ! 480: if ((req = (struct type_DASE_Callback__REQ *) calloc (1, sizeof *req)) ! 481: == NULL) { ! 482: no_mem: ; ! 483: advise (LLOG_EXCEPTIONS, NULLCP, "out of memory"); ! 484: out: ; ! 485: if (req) ! 486: free_DASE_Callback__REQ (req); ! 487: if (rsp) ! 488: free_DASE_Callback__RSP (rsp); ! 489: if (pe) ! 490: pe_free (pe); ! 491: ! 492: dn_seq_free (dns); ! 493: return NULL; ! 494: } ! 495: if ((req -> string = str2qb (s, strlen (s), 1)) == NULL) ! 496: goto no_mem; ! 497: ! 498: dp = &req -> choices; ! 499: for (; dns; dns = ds) { ! 500: register struct element_DASE_3 *d3; ! 501: register struct type_DASE_Pair *pair; ! 502: ! 503: if ((d3 = (struct element_DASE_3 *) calloc (1, sizeof *d3)) == NULL) ! 504: goto no_mem; ! 505: *dp = d3, dp = &d3 -> next; ! 506: ! 507: if ((pair = (struct type_DASE_Pair *) calloc (1, sizeof *pair)) ! 508: == NULL) ! 509: goto no_mem; ! 510: d3 -> Pair = pair; ! 511: ! 512: dn_print (nps, dns -> dns_dn, EDBOUT); ! 513: ps_print (nps, " "); ! 514: *--nps -> ps_ptr = NULL, nps -> ps_cnt++; ! 515: ! 516: pair -> complete = str2qb (nps -> ps_base, strlen (nps -> ps_base), 1); ! 517: ! 518: nps -> ps_ptr = nps -> ps_base, nps -> ps_cnt = nps -> ps_bufsiz; ! 519: ! 520: ufn_dn_print_aux (nps, dns -> dns_dn, dn, 0); ! 521: ps_print (nps, " "); ! 522: *--nps -> ps_ptr = NULL, nps -> ps_cnt++; ! 523: ! 524: pair -> friendly = str2qb (nps -> ps_base, strlen (nps -> ps_base), 1); ! 525: ! 526: nps -> ps_ptr = nps -> ps_base, nps -> ps_cnt = nps -> ps_bufsiz; ! 527: ! 528: if (pair -> complete == NULL || pair -> friendly == NULL) ! 529: goto no_mem; ! 530: ! 531: ds = dns -> dns_next; ! 532: ! 533: dn_free (dns -> dns_dn); ! 534: free ((char *) dns); ! 535: } ! 536: ! 537: dns = NULL; ! 538: ! 539: if (encode_DASE_Callback__REQ (&pe, 1, NULL, NULLCP, req) == NOTOK) { ! 540: advise (LLOG_EXCEPTIONS, NULLCP, "encode_DASE_Callback__REQ: %s", ! 541: PY_pepy); ! 542: goto out; ! 543: } ! 544: if (pe2ps (ps, pe) == NOTOK) ! 545: adios (NULLCP, "pe2ps: %s", ps_error (ps -> ps_errno)); ! 546: PLOGP (pgm_log,DASE_Message, pe, "message", 0); ! 547: ! 548: free_DASE_Callback__REQ (req); ! 549: req = NULL; ! 550: pe_free (pe); ! 551: ! 552: if ((pe = ps2pe (ps)) == NULLPE) ! 553: adios (NULLCP, "ps2pe: %s", ps_error (ps -> ps_errno)); ! 554: ! 555: if (decode_DASE_Callback__RSP (pe, 1, NULLIP, NULLVP, &rsp) == NOTOK) { ! 556: advise (LLOG_EXCEPTIONS, NULLCP, "decode_DASE_Callback__RSP: %s", ! 557: PY_pepy); ! 558: goto out; ! 559: } ! 560: PLOGP (pgm_log,DASE_Message, pe, "message", 1); ! 561: ! 562: dq = &dns; ! 563: for (rp = rsp; rp; rp = rp -> next) { ! 564: char *cp; ! 565: ! 566: if ((ds = (struct dn_seq *) calloc (1, sizeof *ds)) == NULL) ! 567: goto no_mem; ! 568: *dq = ds, dq = &ds -> dns_next; ! 569: ! 570: if ((cp = qb2str (rp -> IA5String)) == NULL) ! 571: goto no_mem; ! 572: ds -> dns_dn = str2dn (cp); ! 573: free (cp); ! 574: } ! 575: ! 576: free_DASE_Callback__RSP (rsp); ! 577: pe_free (pe); ! 578: ! 579: return dns; ! 580: } ! 581: ! 582: /* */ ! 583: ! 584: static int dns_compar (a, b) ! 585: struct dn_seq **a, ! 586: **b; ! 587: { ! 588: int i; ! 589: DN adn, ! 590: bdn; ! 591: ! 592: for (adn = (*a) -> dns_dn; adn -> dn_parent; adn = adn -> dn_parent) ! 593: continue; ! 594: for (bdn = (*b) -> dns_dn; bdn -> dn_parent; bdn = bdn -> dn_parent) ! 595: continue; ! 596: ! 597: i = rdn_cmp (adn -> dn_rdn, bdn -> dn_rdn); ! 598: return (i == (-1) || i == 1 ? i : 0); ! 599: } ! 600: ! 601: /* */ ! 602: ! 603: /* ARGSUSED */ ! 604: ! 605: static DNS just_say_no (dns, dn, s) ! 606: DNS dns; ! 607: DN dn; ! 608: char *s; ! 609: { ! 610: dn_seq_free (dns); ! 611: ! 612: return NULL; ! 613: } ! 614: ! 615: /* */ ! 616: ! 617: static PE name2psap (dn) ! 618: DN dn; ! 619: { ! 620: int i; ! 621: AttributeType at; ! 622: PE pe; ! 623: static struct ds_read_arg read_arg = ! 624: { ! 625: default_common_args, ! 626: NULLDN, /* read_arg DN */ ! 627: { /* entry info selection */ ! 628: FALSE, ! 629: NULLATTR, ! 630: EIS_ATTRIBUTESANDVALUES ! 631: } ! 632: }; ! 633: struct DSError error; ! 634: struct ds_read_result result; ! 635: ! 636: if ((at = AttrT_new (DSAADDRESS_OID)) == NULLAttrT) { ! 637: PY_advise (NULLCP, "build of attribute failed: %s", DSAADDRESS_OID); ! 638: return NULLPE; ! 639: } ! 640: ! 641: read_arg.rda_common.ca_servicecontrol.svc_prio = SVC_PRIO_HIGH; ! 642: read_arg.rda_object = dn; ! 643: read_arg.rda_eis.eis_select = as_comp_new (AttrT_cpy (at), NULLAV, ! 644: NULLACL_INFO); ! 645: ! 646: i = ds_read (&read_arg, &error, &result); ! 647: ! 648: AttrT_free (at); ! 649: as_free (read_arg.rda_eis.eis_select); ! 650: ! 651: if (i != DS_OK) { ! 652: PY_advise (NULLCP, "DAP lookup failed: %s", dn2str (dn)); ! 653: return NULLPE; ! 654: } ! 655: ! 656: if (result.rdr_entry.ent_attr == NULLATTR) { ! 657: PY_advise (NULLCP, "no '%s' attribute in entry '%s'", ! 658: DSAADDRESS_OID, dn2str (dn)); ! 659: return NULLPE; ! 660: } ! 661: ! 662: pe = grab_pe (&result.rdr_entry.ent_attr -> attr_value -> avseq_av); ! 663: as_free (result.rdr_entry.ent_attr); ! 664: return pe; ! 665: } ! 666: ! 667: /* INIT */ ! 668: ! 669: static arginit (vec) ! 670: char **vec; ! 671: { ! 672: register char *ap; ! 673: register struct TSAPaddr *ta = NULL; ! 674: ! 675: if (myname = rindex (*vec, '/')) ! 676: myname++; ! 677: if (myname == NULL || *myname == NULL) ! 678: myname = *vec; ! 679: ! 680: isodetailor (myname, 0); ! 681: ll_hdinit (pgm_log, myname); ! 682: ! 683: for (vec++; ap = *vec; vec++) { ! 684: if (*ap == '-') ! 685: switch (*++ap) { ! 686: case 'a': ! 687: if ((ap = *++vec) == NULL || *ap == '-') ! 688: adios (NULLCP, "usage: %s -a address", myname); ! 689: if ((ta = str2taddr (ap)) == NULLTA) ! 690: adios (NULLCP, "basd address \"%s\"", ap); ! 691: continue; ! 692: ! 693: case 'd': ! 694: debug++; ! 695: continue; ! 696: ! 697: default: ! 698: adios (NULLCP, "unknown switch -%s", ap); ! 699: } ! 700: ! 701: adios (NULLCP, "usage: %s [switches]", myname); ! 702: } ! 703: ! 704: if (ta == NULL && (ta = str2taddr (ns_address)) == NULLTA) ! 705: adios (NULLCP, "bad default address \"%s\"", ns_address); ! 706: tas = *ta; /* struct copy */ ! 707: ! 708: if ((nps = ps_alloc (str_open)) == NULLPS) ! 709: adios (NULLCP, "ps_alloc: out of memory"); ! 710: if (str_setup (nps, NULLCP, 0, 0) == NOTOK) ! 711: adios (NULLCP, "str_setup: %s", ps_error (ps -> ps_errno)); ! 712: } ! 713: ! 714: /* */ ! 715: ! 716: static envinit () { ! 717: int i, ! 718: sd; ! 719: ! 720: nbits = getdtablesize (); ! 721: ! 722: if (debug == 0 && !(debug = isatty (2))) { ! 723: for (i = 0; i < 5; i++) { ! 724: switch (fork ()) { ! 725: case NOTOK: ! 726: sleep (5); ! 727: continue; ! 728: ! 729: case OK: ! 730: break; ! 731: ! 732: default: ! 733: _exit (0); ! 734: } ! 735: break; ! 736: } ! 737: ! 738: (void) chdir ("/"); ! 739: ! 740: if ((sd = open ("/dev/null", O_RDWR)) == NOTOK) ! 741: adios ("/dev/null", "unable to read"); ! 742: if (sd != 0) ! 743: (void) dup2 (sd, 0), (void) close (sd); ! 744: (void) dup2 (0, 1); ! 745: (void) dup2 (0, 2); ! 746: ! 747: #ifdef SETSID ! 748: if (setsid () == NOTOK) ! 749: advise (LLOG_EXCEPTIONS, "failed", "setsid"); ! 750: #endif ! 751: #ifdef TIOCNOTTY ! 752: if ((sd = open ("/dev/tty", O_RDWR)) != NOTOK) { ! 753: (void) ioctl (sd, TIOCNOTTY, NULLCP); ! 754: (void) close (sd); ! 755: } ! 756: #else ! 757: #ifdef SYS5 ! 758: (void) setpgrp (); ! 759: (void) signal (SIGINT, SIG_IGN); ! 760: (void) signal (SIGQUIT, SIG_IGN); ! 761: #endif ! 762: #endif ! 763: } ! 764: else ! 765: ll_dbinit (pgm_log, myname); ! 766: ! 767: #ifndef sun /* damn YP... */ ! 768: for (sd = 3; sd < nbits; sd++) ! 769: if (pgm_log -> ll_fd != sd) ! 770: (void) close (sd); ! 771: #endif ! 772: ! 773: (void) signal (SIGPIPE, SIG_IGN); ! 774: ! 775: ll_hdinit (pgm_log, myname); ! 776: advise (LLOG_NOTICE, NULLCP, "starting"); ! 777: } ! 778: ! 779: /* ERRORS */ ! 780: ! 781: #ifndef lint ! 782: static void adios (va_alist) ! 783: va_dcl ! 784: { ! 785: va_list ap; ! 786: ! 787: va_start (ap); ! 788: ! 789: _ll_log (pgm_log, LLOG_FATAL, ap); ! 790: ! 791: va_end (ap); ! 792: ! 793: _exit (1); ! 794: } ! 795: #else ! 796: /* VARARGS */ ! 797: ! 798: static void adios (what, fmt) ! 799: char *what, ! 800: *fmt; ! 801: { ! 802: adios (what, fmt); ! 803: } ! 804: #endif ! 805: ! 806: ! 807: #ifndef lint ! 808: static void advise (va_alist) ! 809: va_dcl ! 810: { ! 811: int code; ! 812: va_list ap; ! 813: ! 814: va_start (ap); ! 815: ! 816: code = va_arg (ap, int); ! 817: ! 818: _ll_log (pgm_log, code, ap); ! 819: ! 820: va_end (ap); ! 821: } ! 822: #else ! 823: /* VARARGS */ ! 824: ! 825: static void advise (code, what, fmt) ! 826: char *what, ! 827: *fmt; ! 828: int code; ! 829: { ! 830: advise (code, what, fmt); ! 831: } ! 832: #endif ! 833: ! 834: /* */ ! 835: ! 836: static void ts_adios (td, event) ! 837: register struct TSAPdisconnect *td; ! 838: char *event; ! 839: { ! 840: ts_advise (td, LLOG_EXCEPTIONS, event); ! 841: ! 842: exit (1); ! 843: } ! 844: ! 845: /* */ ! 846: ! 847: static void ts_advise (td, code, event) ! 848: register struct TSAPdisconnect *td; ! 849: int code; ! 850: char *event; ! 851: { ! 852: char buffer[BUFSIZ]; ! 853: ! 854: if (td -> td_cc > 0) ! 855: (void) sprintf (buffer, "[%s] %*.*s", ! 856: TErrString (td -> td_reason), ! 857: td -> td_cc, td -> td_cc, td -> td_data); ! 858: else ! 859: (void) sprintf (buffer, "[%s]", TErrString (td -> td_reason)); ! 860: ! 861: advise (code, NULLCP, "%s: %s", event, buffer); ! 862: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.