|
|
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: 9975 (0x26f7)
Types: TextFile
Names: »dsabuild.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.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 6.1 89/03/23 22:28:00 mrose Exp $";
#endif
/*
* $Header: /f/osi/support/RCS/dsabuild.c,v 6.1 89/03/23 22:28:00 mrose Exp $
*
*
* $Log: dsabuild.c,v $
* Revision 6.1 89/03/23 22:28:00 mrose
* out-the-door
*
* Revision 6.0 89/03/18 23:44:25 mrose
* Release 5.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;
(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_pe = NULLPE;
av -> av_syntax = AV_PRESENTATIONADDRESS;
av -> av_un.av_psap = 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;
if (dsap_tai_init (myname) != 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