|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 9966 (0x26ee) Types: TextFile Names: »dsabuild.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/support/dsabuild.c«
/* dsabuild.c - build the isoentities database for DSA access */ #ifndef lint static char *rcsid = "$Header: /f/osi/support/RCS/dsabuild.c,v 7.0 89/11/23 22:27:09 mrose Rel $"; #endif /* * $Header: /f/osi/support/RCS/dsabuild.c,v 7.0 89/11/23 22:27:09 mrose Rel $ * * * $Log: dsabuild.c,v $ * Revision 7.0 89/11/23 22:27:09 mrose * Release 6.0 * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ #include <stdio.h> #include <varargs.h> #include "psap2.h" #include "logger.h" #include "tailor.h" #include "quipu/common.h" #include "quipu/util.h" #include "quipu/dua.h" /* \f DATA */ static char *myname = "dsabuild"; static int verbose = 0; char *pflag = NULLCP; char *defname = "default"; void adios (), advise (); DN str2dn (); DN dq2dn (); #ifdef AETDBM #define fetch_aet str2aet_dbm #else #define fetch_aet str2aet_seq #endif #ifdef STRING_ATTRIBUTES #define PRESENTATION_ADDRESS "presentationAddress" #define ENTITY_OBJECT "applicationEntity & quipuObject" #define PROCESS_OBJECT "applicationProcess & quipuObject" #else #define PRESENTATION_ADDRESS "2.5.4.29" #define ENTITY_OBJECT "2.5.6.12 & 0.9.2342.19200300.99.3.2" #define PROCESS_OBJECT "2.5.6.11 & 0.9.2342.19200300.99.3.2" #endif /* \f MAIN */ /* ARGSUSED */ main (argc, argv, envp) int argc; char **argv, **envp; { arginit (argv); (void) build_dsa (); exit (0); } /* \f BUILD */ static build_dsa () { static int passes = 2; static char *manager = NULL; static char *password = NULL; char prompt[BUFSIZ]; char *alias, *designator, *qualifier; DN dn, dnpfx; struct isoentity *ie; PS ps; int pass; struct ds_bind_arg bindarg; struct ds_bind_arg bindresult; struct ds_bind_error binderr; if ((ps = ps_alloc (std_open)) == NULLPS) adios (NULLCP, "ps_alloc failed"); if (std_setup (ps, stdout) == NOTOK) adios (NULLCP, "std_setup failed"); bindarg.dba_version = DBA_VERSION_V1988; if (manager == NULL) { if ((manager = malloc (BUFSIZ)) == NULL) adios (NULLCP, "malloc failed"); (void) sprintf (prompt, "manager: "); if (getline (prompt, manager) == NOTOK) return NOTOK; } if ((bindarg.dba_dn = str2dn (manager)) == NULLDN) adios (NULLCP, "Invalid manager name, \"%s\"", manager); if (password == NULL) { (void) sprintf (prompt, "password: "); password = getpassword (prompt); } (void)strcpy( bindarg.dba_passwd, password ); bindarg.dba_passwd_len = strlen (password); if (verbose) advise (NULLCP, "Binding to DSA"); if (ds_bind (&bindarg,&binderr,&bindresult) != OK) adios (NULLCP, "Bind Failed"); alias = alias2name (pflag); if ((dnpfx = str2dn (alias == NULL ? pflag : alias)) == NULLDN) adios (NULLCP, "Prefix of \"%s\" is invalid directory name.", pflag); if (verbose) advise (NULLCP, "Building Application Process Name"); (void) add_to_directory (ps, dnpfx, PROCESS_OBJECT, NULLATTR); for (pass = 1; pass <= passes; pass++) { if (verbose) advise (NULLCP, "Pass: %d", pass); if (!setisoentity (pass == 1 ? TRUE : FALSE)) adios (NULLCP, "setisoentity failed"); while (ie = getisoentity ()) { if ((explode_ie (&ie, &designator, &qualifier, (pass != passes ? NULL : pflag)) == OK) && strcmp (qualifier, "default") != 0) { if ((dn = dq2dn(designator,qualifier)) != NULLDN) { if (dn_cmp_prefix (dnpfx, dn) == OK) { if (verbose) { advise (NULLCP, "Adding: %s-%s", designator, qualifier); printent (ie, oid2aei (&ie->ie_identifier), &ie->ie_addr); } if (add_ae_to_directory(ps,dn,&ie->ie_addr) == NOTOK) advise (NULLCP, "add failed for \"%s\" \"%s\"", designator, qualifier); } dn_free (dn); } } } (void) endisoentity (); } (void) ds_unbind (); ps_free (ps); return OK; } /* \f */ int explode_ie (ie, designator, qualifier, dflt) struct isoentity **ie; char **designator, **qualifier, *dflt; { if ((*qualifier = rindex ((*ie) -> ie_descriptor, '-')) == NULL) { advise (NULLCP, "unable to seperate \"%s\" into descriptor/qualifier", (*ie) -> ie_descriptor); return NOTOK; } *(*qualifier)++ = NULL; *designator = (*ie)->ie_descriptor; if ((dflt) && strcmp(*designator, defname) == 0) { *designator = dflt; /* get fully defined ie for this default entry */ if (fetch_aet (*designator, *qualifier, *ie) == NOTOK) return NOTOK; } /* for entities with no naddrs add a default tcp address */ { struct PSAPaddr *pa = &(*ie)->ie_addr; struct SSAPaddr *sa = &pa->pa_addr; struct TSAPaddr *ta = &sa->sa_addr; int n = ta -> ta_naddr - 1; struct NSAPaddr *na = ta->ta_addrs; if (n < 0) { ta -> ta_naddr = 1, n = 0; bzero ((char *) na, sizeof *na); na -> na_type = NA_TCP; na -> na_subnet = ts_comm_tcp_default; (void) strncpy (na -> na_domain, *designator, sizeof na -> na_domain); } } return OK; } /* \f */ int add_to_directory (ps,dn,objc,as) PS ps; DN dn; char *objc; Attr_Sequence as; { AV_Sequence avs, rdn_avs; Attr_Sequence as_objectclass, rdn_attr; struct DSError error; AttributeType oc; DN eptr, ptr; int aresult; static struct ds_addentry_arg add_arg = { default_common_args, NULLDN, /* add_arg DN */ NULLATTR /* attr seq */ }; add_arg.ada_object = dn; oc = AttrT_new(OBJECTCLASS_OID); if ((avs = str2avs (objc,oc)) == NULLAV){ advise (NULLCP,"object class '%s' failed",objc); AttrT_free (oc); return (NOTOK); } as_objectclass = as_comp_new (oc,avs,NULLACL_INFO); for (eptr = dn ; eptr != NULLDN ; eptr = eptr->dn_parent) ptr = eptr; /* go to end of name */ rdn_avs = avs_comp_new (AttrV_cpy (&ptr -> dn_rdn -> rdn_av)); rdn_attr = as_comp_new (AttrT_cpy (&ptr -> dn_rdn -> rdn_at), rdn_avs, NULLACL_INFO); as_objectclass = as_merge (rdn_attr, as_objectclass); add_arg.ada_entry = as_merge (as, as_objectclass); if (aresult = ds_addentry (&add_arg, &error) != DS_OK) ds_error (ps,&error); AttrT_free (oc); avs_free (rdn_avs); as_free (rdn_attr); return aresult; } /* \f ADD_AE_TO_DIRECTORY */ int add_ae_to_directory (ps,dn,pa) PS ps; DN dn; struct PSAPaddr *pa; { AV_Sequence avs; Attr_Sequence as; AttributeType at; AttributeValue av; int aresult; if ((at = AttrT_new (PRESENTATION_ADDRESS)) == NULLAttrT) { advise (NULLCP, "presentationAddress attribute not found"); return NOTOK; } av = AttrV_alloc (); av -> av_syntax = str2syntax("PresentationAddress"); av -> av_struct = (caddr_t) pa; avs = avs_comp_new (av); as = as_comp_new (at, avs, NULLACL_INFO); if (aresult = add_to_directory (ps, dn, ENTITY_OBJECT, as) != OK) if (verbose) advise (NULLCP, "Failed"); else if (verbose) advise (NULLCP, "Stored"); as_free (as); AttrV_free (av); AttrT_free (at); return aresult; } /* \f */ static printent (ie, aei, pa) register struct isoentity *ie; AEI aei; register struct PSAPaddr *pa; { if (ie) (void) printf ("Entity: %s (%s)\n", ie -> ie_descriptor, oid2ode (&ie -> ie_identifier)); if (aei) (void) printf ("AE info: %s\n", sprintaei (aei)); if (pa) (void) printf ("Address: %s\n", paddr2str (pa, NULLNA)); if (ie || aei || pa) (void) printf ("\n"); } /* \f ARGINIT */ static arginit (vec) char **vec; { register char *ap; if (myname = rindex (*vec, '/')) myname++; if (myname == NULL || *myname == NULL) myname = *vec; isodetailor (myname, 1); for (vec++; ap = *vec; vec++) { if (*ap == '-') switch (*++ap) { case 'v': verbose++; continue; case 'p': vec++; if ((pflag = *vec) == NULL || *pflag == '-') goto usage; continue; default: adios (NULLCP, "-%s: unknown switch", ap); } usage: ; adios (NULLCP, "usage: %s [switches]", myname); } if (pflag == NULLCP) pflag = PLocalHostName (); { extern char *oidtable; quipu_syntaxes (); if (dsap_tai_init () != OK) adios (NULLCP, "Tailoring failed"); load_oid_table (oidtable); get_default_acl (); } } /* \f INTERACTIVE */ static int getline (prompt, buffer) char *prompt, *buffer; { register int i; register char *cp, *ep; static int sticky = 0; if (sticky) { sticky = 0; return NOTOK; } (void) printf ("%s ", prompt); (void) fflush (stdout); for (ep = (cp = buffer) + BUFSIZ - 1; (i = getchar ()) != '\n';) { if (i == EOF) { (void) printf ("\n"); clearerr (stdin); if (cp != buffer) { sticky++; break; } return NOTOK; } if (cp < ep) *cp++ = i; } *cp = NULL; return OK; } /* \f ERRORS */ #ifndef lint void _advise (); void adios (va_alist) va_dcl { va_list ap; va_start (ap); _advise (ap); va_end (ap); _exit (1); } #else /* VARARGS */ void adios (what, fmt) char *what, *fmt; { adios (what, fmt); } #endif #ifndef lint void advise (va_alist) va_dcl { va_list ap; va_start (ap); _advise (ap); va_end (ap); } static void _advise (ap) va_list ap; { char buffer[BUFSIZ]; asprintf (buffer, ap); (void) fflush (stdout); fprintf (stderr, "%s: ", myname); (void) fputs (buffer, stderr); (void) fputc ('\n', stderr); (void) fflush (stderr); } #else /* VARARGS */ void advise (what, fmt) char *what, *fmt; { advise (what, fmt); } #endif