|
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 n
Length: 9078 (0x2376) Types: TextFile Names: »nsa.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/quipu/nsa.c«
/* nsa.c - Name server access to the directory */ #ifndef lint static char *rcsid = "$Header: /f/osi/quipu/RCS/nsa.c,v 6.0 89/03/18 23:41:44 mrose Rel $"; #endif /* * $Header: /f/osi/quipu/RCS/nsa.c,v 6.0 89/03/18 23:41:44 mrose Rel $ * * * $Log: nsa.c,v $ * Revision 6.0 89/03/18 23:41:44 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 <signal.h> #include <stdio.h> #include <varargs.h> #include "psap.h" #include "rosap.h" #include "isoaddrs.h" #include "internet.h" #include "logger.h" #include "tailor.h" #include "quipu/util.h" #include "quipu/read.h" #include "quipu/dua.h" #include "quipu/connection.h" #include "quipu/entry.h" #include <sys/ioctl.h> #ifdef BSD42 #include <sys/file.h> #endif #ifdef SYS5 #include <fcntl.h> #endif #ifdef DSAP #ifndef NO_STATS LLog *log_stat; #endif #define DSA_WAIT 30 /* \f DATA */ extern LLog *log_dsap; extern int dn_print(); DN str2dn (); void advise (), adios(); static PE remote_resolve (); extern int dsap_ad; int nfds, nameservice; fd_set ifds, rfds; /* \f */ ns_init () { int i; register struct NSAPaddr *na; register struct PSAPaddr *pa; struct sockaddr_in in_socket; register struct sockaddr_in *isock = &in_socket; register struct hostent *hp; if ((pa = str2paddr (ns_address)) == NULL) adios (NULLCP, "unable to parse resolver address \"%s\"", ns_address); if ((i = pa -> pa_addr.sa_addr.ta_naddr) == 0) adios (NULLCP, "no network addresses present in \"%s\"", ns_address); for (na = pa -> pa_addr.sa_addr.ta_addrs; i-- > 0; na++) if (na -> na_type == NA_TCP) break; if (i < 0) adios (NULLCP, "no TCP-based network addresses present in \"%s\"", ns_address); if (na -> na_domain[0]) { if ((hp = gethostbystring (na -> na_domain)) == NULL) adios (NULLCP, "%s: unknown host", na -> na_domain); } else hp = NULL; if (na -> na_port == 0) adios (NULLCP, "UDP port not specified"); bzero ((char *) isock, sizeof *isock); isock -> sin_family = hp ? hp -> h_addrtype : AF_INET; isock -> sin_port = na -> na_port; if (hp) inaddr_copy (hp, isock); if ((nameservice = start_udp_server (isock, 0, 0, 0)) == NOTOK) adios ("failed", "start_udp_server"); if (nameservice >= id_st.nads) id_st.nads = nameservice + 1; FD_SET (nameservice,&id_st.iads); } /* \f */ ns_process (ud) int ud; { int fd; struct sockaddr_in out_socket; register struct sockaddr_in *osock = &out_socket; struct ns_query nss; register struct ns_query *ns = &nss; PE pe; PS ps; if ((fd = join_udp_client (ud, osock)) == NOTOK) { advise (LLOG_EXCEPTIONS, "failed", "join_udp_client"); return; } pe = NULLPE; bzero ((char *) ns, sizeof *ns); if ((ps = ps_alloc (dg_open)) == NULLPS || dg_setup (ps, fd, MAXUDP, read_udp_socket, write_udp_socket) == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "%s failed", ps ? "dg_setup" : "ps_alloc"); goto out; } if ((pe = ps2pe (ps)) == NULLPE) { advise (LLOG_NOTICE, NULLCP, "unable to read query: %s", ps_error (ps -> ps_errno)); goto out; } if (parse_NS_Query (pe, 1, NULLIP, NULLVP, (char *) ns) == NOTOK) { advise (LLOG_NOTICE, NULLCP, "parse of Query failed: %s", PY_pepy); goto out; } PLOG (log_dsap, print_NS_Message, pe, "message", 1); resolve (ps, ns -> ns_id, ns -> ns_name, ns -> ns_attribute); out: ; if (ns -> ns_name) free (ns -> ns_name); if (ns -> ns_attribute) free (ns -> ns_attribute); if (pe) pe_free (pe); if (ps) ps_free (ps); (void) close_udp_socket (fd); } /* \f */ static resolve (ps, id, name, attribute) register PS ps; int id; char *name, *attribute; { static struct ds_read_arg read_arg = { default_common_args, NULLDN, /* supplied */ { FALSE, NULLATTR, EIS_ATTRIBUTESANDVALUES } }; struct ds_read_result result; struct DSError error; int i; DN dn; struct ns_response nss; register struct ns_response *ns = &nss; PE pe; PE grab_pe(); AttributeType myattr; Attr_Sequence ap; bzero ((char *) ns, sizeof *ns); ns -> ns_id = id; if ((dn = str2dn (name)) == NULLDN) { advise (LLOG_EXCEPTIONS, NULLCP, "str2dn of \"%s\" failed", name); goto out1; } read_arg.rda_common.ca_requestor = NULLDN; read_arg.rda_object = dn; if ((myattr = AttrT_new (attribute)) == NULLAttrT) { advise (LLOG_EXCEPTIONS, NULLCP, "attribute \"%s\" unknown", attribute); goto out1; } read_arg.rda_eis.eis_select = as_comp_new (myattr, NULLAV, NULLACL_INFO); #ifndef NO_STATS LLOG (log_stat,LLOG_NOTICE,("Name server access...")); #endif if ((i = do_ds_read (&read_arg, &error, &result, NULLDN, NULLDN)) != DS_OK) { if (error.dse_type != DSE_REFERRAL) { advise (LLOG_EXCEPTIONS, NULLCP, "ds_read for \"%s\" failed: %d",name, i); goto out1; } if ((ns->ns_value = remote_resolve (dn,myattr, &(error.ERR_REFERRAL.DSE_ref_candidates->cr_accesspoints.ap_address),&result )) == NULLPE) { advise (LLOG_EXCEPTIONS, NULLCP, "remote ds_read for \"%s\" failed: %d",name, i); goto out1; } if (encode_IF_Name (&ns -> ns_name, 0, 0, NULLCP, result.rdr_entry.ent_dn) == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "encoding of remote Distinguished Name failed; %s", PY_pepy); goto out1; } goto remote_out; } #ifdef DEBUG if (result.rdr_entry.ent_next != NULL) DLOG (log_dsap, LLOG_EXCEPTIONS, ("multiple entries returned in read")); #endif if (encode_IF_Name (&ns -> ns_name, 0, 0, NULLCP, result.rdr_entry.ent_dn) == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "encoding of Distinguished Name failed; %s", PY_pepy); goto out1; } if ((ap = as_find_type (result.rdr_entry.ent_attr, myattr)) == NULLATTR) { advise (LLOG_EXCEPTIONS, NULLCP, "no \"%s\" attribute in result", attribute); entryinfo_comp_free (&result.rdr_entry, 1); goto out2; } ns->ns_value = grab_pe (ap->attr_value->avseq_av); if (ap -> attr_link != NULL) advise (LLOG_NOTICE, NULLCP, "multiple values for \"%s\" attribute", attribute); entryinfo_comp_free (&result.rdr_entry, 1); goto out2; out1: ; /* fill in original dn in result - can cope with possible aliases */ if (encode_IF_Name (&ns -> ns_name, 0, 0, NULLCP, dn) == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "encoding of Distinguished Name failed; %s", PY_pepy); } out2: ; if (dn) dn_free (dn); if (read_arg.rda_eis.eis_select) as_free (read_arg.rda_eis.eis_select); remote_out: ; pe = NULLPE; if (build_NS_Response (&pe, 1, NULL, NULLCP, (char *) ns) == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "build of Response failed: %s", PY_pepy); goto out; } PLOG (log_dsap, print_NS_Message, pe, "message", 0); if (pe2ps (ps, pe) == NOTOK) advise (LLOG_EXCEPTIONS, NULLCP, "unable to write Response: %s", ps_error (ps -> ps_errno)); out: ; if (pe) pe_free (pe); if (ns -> ns_name) pe_free (ns -> ns_name); if (ns -> ns_value) pe_free (ns -> ns_value); } static PE remote_resolve (dn,at,addr,result) DN dn; AttributeType at; struct PSAPaddr * addr; struct ds_read_result *result; { static struct ds_read_arg read_arg = { default_common_args, NULLDN, { /* entry info selection */ TRUE, NULLATTR, EIS_ATTRIBUTESANDVALUES } }; struct DSError error; extern Entry current_entry; static struct ds_bind_arg bindarg; static struct ds_bind_arg bindresult; static struct ds_bind_error binderr; Attr_Sequence as; int ad; /* read from of remote DSA */ /* Do synchronus read for now */ /* Async read eventually */ #ifndef NO_STATS dn_decode (dn); pslog (log_stat,LLOG_NOTICE,"remote ns lookup",dn_print,(caddr_t)dn); #endif make_dsa_bind_arg (&bindarg); if (dap_bind (&ad, &bindarg, &binderr, &bindresult,addr) != OK) { advise (LLOG_EXCEPTIONS, NULLCP, "Remote bind failure (NS)"); return (NULLPE); } read_arg.rda_object = dn; if (dap_read (ad,1,&read_arg, &error, result) != DS_OK) { log_ds_error (&error); ds_error_free (&error); advise (LLOG_NOTICE, NULLCP, "Remote read failure (NS)"); (void) dap_unbind (ad); return (NULLPE); } (void) dap_unbind (ad); cache_entry (&(result->rdr_entry), TRUE, EIS_ATTRIBUTESANDVALUES); if (unravel_attribute (current_entry,&error,TRUE) != OK) { log_ds_error (&error); ds_error_free (&error); advise (LLOG_EXCEPTIONS, NULLCP, "Unravel failure (NS)"); return (NULLPE); } if ((as = as_find_type (current_entry->e_attributes,at)) == NULLATTR) { advise (LLOG_NOTICE, NULLCP, "No attribute (NS)"); return (NULLPE); } return (grab_pe (as->attr_value->avseq_av)); } #else /* Dummy routine to prevent errors when DSAP is not defined */ ns_init () { ; } #endif