|
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 f
Length: 16975 (0x424f) Types: TextFile Names: »fred.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/quipu/dish/fred.c«
/* fred.c - DiSH support for FrED */ #ifndef lint static char *rcsid = "$Header: /f/osi/quipu/dish/RCS/fred.c,v 7.3 90/01/11 18:37:38 mrose Exp $"; #endif /* * $Header: /f/osi/quipu/dish/RCS/fred.c,v 7.3 90/01/11 18:37:38 mrose Exp $ * * * $Log: fred.c,v $ * Revision 7.3 90/01/11 18:37:38 mrose * real-sync * * Revision 7.2 89/12/19 16:21:03 mrose * sync * * Revision 7.1 89/11/26 14:25:47 mrose * sync * * Revision 7.0 89/11/23 22:20:08 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 <ctype.h> #include <stdio.h> #include "quipu/ds_search.h" #include "quipu/entry.h" #define OPT (!frompipe || rps -> ps_byteno == 0 ? opt : rps) #define RPS (!frompipe || opt -> ps_byteno == 0 ? rps : opt) extern char frompipe; extern PS opt, rps; static int dsa_status; struct dn_seq *dm2dn_seq (); struct dn_seq *dn_seq_push (); /* \f FRED BACK-END */ int call_fred (argc, argv) int argc; char **argv; { if (argc < 2) goto usage; if (test_arg (argv[1], "-dm2dn", 5)) { int seqno; register struct dn_seq *dlist, *dp; if (argc != 3) goto usage; if ((dlist = dm2dn_seq (argv[2])) == NULLDNSEQ) { if (dsa_status == OK) ps_printf (OPT, "Unable to resolve domain.\n"); return; } for (dp = dlist; dp; dp = dp -> dns_next) { if (seqno = add_sequence (dp -> dns_dn)) ps_printf (RPS, "%-3d ", seqno); dn_print (RPS, dp -> dns_dn, RDNOUT); ps_printf (RPS, "\n"); } dn_seq_free (dlist); return; } usage: ; Usage (argv[0]); } /* \f */ #define ADOMAIN "associatedDomain" static int dlevel = 0; struct dn_seq *dm2dn_seq_aux (); static struct dn_seq *dm2dn_seq (dm) char *dm; { register char *dp; for (dp = dm; *dp; dp++) if (isupper (*dp)) *dp = tolower (*dp); dlevel = 0; dsa_status = OK; return dm2dn_seq_aux (dm, NULLDN, NULLDNSEQ); } /* \f */ static struct dn_seq *dm2dn_seq_aux (dm, dn, dlist) char *dm; DN dn; struct dn_seq *dlist; { register char *dp; register CommonArgs *ca; struct ds_search_arg search_arg; register struct ds_search_arg *sa = &search_arg; struct ds_search_result search_result; register struct ds_search_result *sr = &search_result; struct DSError error; register struct DSError *se = &error; bzero ((char *) sa, sizeof *sa); /* perhaps later initialize this from user, etc. */ ca = &sa -> sra_common; ca -> ca_servicecontrol.svc_options = SVC_OPT_PREFERCHAIN; ca -> ca_servicecontrol.svc_prio = SVC_PRIO_LOW; ca -> ca_servicecontrol.svc_timelimit = SVC_NOTIMELIMIT; ca -> ca_servicecontrol.svc_sizelimit = SVC_NOSIZELIMIT; ca -> ca_servicecontrol.svc_scopeofreferral = SVC_REFSCOPE_NONE; sa -> sra_baseobject = dn; sa -> sra_subset = SRA_ONELEVEL; sa -> sra_searchaliases = FALSE; dp = dm; for (;;) { int i; EntryInfo *ptr; register filter *fi; register AttributeType at; if ((dsa_status = rebind ()) != OK) return dlist; if ((i = strlen (dp)) < dlevel) break; sa -> sra_filter = fi = filter_alloc (); bzero ((char *) fi, sizeof *fi); fi -> flt_type = FILTER_ITEM; fi -> FUITEM.fi_type = FILTERITEM_EQUALITY; if ((fi -> FUITEM.UNAVA.ava_type = at = AttrT_new (ADOMAIN)) == NULL) fatal (-100, "associatedDomain: invalid attribute type"); fi -> FUITEM.UNAVA.ava_value = str2AttrV (dp, at -> at_table -> oa_syntax); while (ds_search (sa, se, sr) != DS_OK) { if (dish_error (OPT, se) == 0) { dsa_status = NOTOK; goto free_filter; } sa -> sra_baseobject = se -> ERR_REFERRAL.DSE_ref_candidates -> cr_name; } if (sr -> srr_correlated != TRUE) correlate_search_results (sr); if (sr -> CSR_entries == NULLENTRYINFO) { filter_free (sa -> sra_filter); if (dp = index (dp, '.')) dp++; if (dp == NULL) break; continue; } if (i > dlevel) { dlevel = i; if (dlist) dn_seq_free (dlist), dlist = NULLDNSEQ; } if (i == dlevel) for (ptr = sr -> CSR_entries; ptr; ptr = ptr -> ent_next) { struct dn_seq *dprev = dlist; (void) dn_decode (ptr -> ent_dn); dlist = dm2dn_seq_aux (dm, ptr -> ent_dn, dlist); if (dprev == dlist) dlist = dn_seq_push (ptr -> ent_dn, dlist); else if (i < dlevel) break; } entryinfo_free (sr -> CSR_entries, 0); free_filter: ; filter_free (sa -> sra_filter); break; } return dlist; } /* \f SHOWENTRY SUPPORT */ #include "quipu/list.h" #include "quipu/read.h" char fred_flag; char fred_expand; char fred_long; char fred_sequence; char fred_subdisplay; /* \f */ static AttributeType t_mbox = NULLAttrT; static AttributeType t_phone = NULLAttrT; static AttributeType t_modtime = NULLAttrT; static AttributeType t_modwhom = NULLAttrT; static AttributeType t_postal = NULLAttrT; static AttributeType t_title = NULLAttrT; static AttributeType t_photo = NULLAttrT; extern int postal_indent; static struct template { char *t_name; char *t_prefix; int t_level; AttributeType t_at; } default_template[] = { "title", NULL, 0, NULL, "documentTitle", NULL, 0, NULL, #define LEVEL_POSTAL 0 "organizationName", NULL, 0, NULL, "organizationalUnitName", NULL, 0, NULL, "roomNumber", " Room ", 0, NULL, "streetAddress", " ", 0, NULL, "postOfficeBox", " POB ", 0, NULL, "physicalDeliveryOfficeName", " ", 0, NULL, "stateOrProvinceName", " ", 0, NULL, "postalCode", " ", 0, NULL, "postalAddress", NULL, 1, NULL, "documentAuthor", "Author: ", 1, NULL, "registeredAddress", "Registered Address: ", 2, NULL, "documentVersion", "Version of: ", 2, NULL, "telephoneNumber", "Telephone: ", 3, NULL, "mobileTelephoneNumber", "Mobile: ", 3, NULL, "pagerTelephoneNumber", "Pager: ", 3, NULL, "facsimileTelephoneNumber", "FAX: ", 3, NULL, "telexNumber", "Telex: ", 3, NULL, "teletexTerminalIdentifier", "Teletex: ", 3, NULL, "x121Address", "X.121: ", 3, NULL, "internationaliSDNNumber", "ISDN: ", 3, NULL, "presentationAddress", "OSI: ", 3, NULL, #define LEVEL_MBOX 4 "rfc822Mailbox", " Mailbox: ", 4, NULL, "otherMailbox", " ", 4, NULL, "textEncodedORaddress", " ", 4, NULL, "destinationIndicator", "Destination Indicator: ", 5, NULL, "preferredDeliveryMethod", "Preferred Delivery Method: ", 5, NULL, "description", NULL, 6, NULL, "info", "Information: ", 7, NULL, "businessCategory", "Business: ", 7, NULL, "userClass", "User Class: ", 7, NULL, "localityName", "Locality: ", 7, NULL, "documentLocation", "Location: ", 7, NULL, "aliasedObjectName", "Alias to: ", 8, NULL, "roleOccupant", "Occupant: ", 8, NULL, "seeAlso", "See Also: ", 8, NULL, "secretary", "Secretary: ", 8, NULL, "manager", "Manager: ", 8, NULL, "homePostalAddress", "Home Address: ", 9, NULL, "homePhone", "Home Phone: ", 9, NULL, "favouriteDrink", "Drinks: ", 9, NULL, "photo", "Picture: ", 9, NULL, NULL }; Entry fredentry (); /* \f */ showfred (mydn, islong, subdisplay) DN mydn; char islong, subdisplay; { int didtime, haspost, level, nchild, pos, seqno; register struct template *t; register Attr_Sequence eptr; register AV_Sequence avs, avp; AttributeType rdn_at, inf_at; AttributeValue rdn_av; Entry myentry = fredentry (mydn = dn_cpy (mydn), islong); PS ps = NULLPS; RDN myrdn; static int once_only = 0; if (once_only == 0) { once_only++; t_mbox = AttrT_new ("rfc822Mailbox"); t_phone = AttrT_new ("telephoneNumber"); t_modtime = AttrT_new ("lastModifiedTime"); t_modwhom = AttrT_new ("lastModifiedBy"); t_postal = AttrT_new ("postalAddress"); t_title = AttrT_new ("title"); t_photo = AttrT_new ("photo"); for (t = default_template; t -> t_name; t++) t -> t_at = AttrT_new (t -> t_name); } pos = RPS -> ps_byteno; seqno = fred_sequence ? add_sequence (mydn) : 0; if (islong == FALSE) { if (seqno) ps_printf (RPS, "%3d. ", seqno); else ps_printf (RPS, " "); } if (mydn) { register DN adn; register RDN rdn; for (adn = mydn; adn -> dn_parent; adn = adn -> dn_parent) continue; myrdn = adn -> dn_rdn; rdn_at = &myrdn -> rdn_at, rdn_av = &myrdn -> rdn_av; AttrV_print (RPS, rdn_av, EDBOUT); for (rdn = myrdn -> rdn_next; rdn; rdn = rdn -> rdn_next) { ps_print (RPS, " / "); AttrV_print (RPS, &rdn -> rdn_av, EDBOUT); } } else { myrdn = NULLRDN, rdn_at = NULLAttrT, rdn_av = NULLAttrV; ps_print (RPS, "@"); } if (islong == TRUE && seqno) ps_printf (RPS, " (%d)", seqno); if ((pos += 52 - RPS -> ps_byteno) <= 0) pos = 1; inf_at = NULLAttrT; if (myentry) { for (eptr = myentry -> e_attributes; eptr; eptr = eptr -> attr_link) if (AttrT_cmp (&eptr -> attr_type, t_mbox) == 0) { inf_at = t_mbox; if (avs = eptr -> attr_value) { ps_printf (RPS, "%*s", pos, ""); showfredattr (&avs -> avseq_av); } break; } else if (AttrT_cmp (&eptr -> attr_type, t_phone) == 0) { inf_at = t_phone; avp = eptr -> attr_value; } if (inf_at == t_phone && avp) { ps_printf (RPS, "%*s", pos, ""); showfredattr (&avp -> avseq_av); } } ps_print (RPS, "\n"); if (myentry == NULLENTRY) goto out; if (islong == FALSE) goto children; for (eptr = myentry -> e_attributes; eptr; eptr = eptr -> attr_link) if (AttrT_cmp (&eptr -> attr_type, t_photo) == 0) { if (eptr -> attr_value) { if (rdn_av && (ps = ps_alloc (str_open)) != NULLPS && str_setup (ps, NULLCP, 0, 0) != NOTOK) { register RDN rdn; AttrV_print (ps, rdn_av, EDBOUT); for (rdn = myrdn -> rdn_next; rdn; rdn = rdn -> rdn_next) { ps_print (ps, "/"); AttrV_print (ps, &rdn -> rdn_av, EDBOUT); } ps_print (ps, " "); *--ps -> ps_ptr = NULL, ps -> ps_cnt++; (void) setenv ("RDN", ps -> ps_base); } else (void) setenv ("RDN", "Photo"); } break; } level = 0; for (eptr = myentry -> e_attributes; eptr; eptr = eptr -> attr_link) if (AttrT_cmp (&eptr -> attr_type, rdn_at) == 0) { for (avp = eptr -> attr_value; avp; avp = avp -> avseq_next) if (AttrV_cmp (&avp -> avseq_av, rdn_av)) { ps_print (RPS, " aka: "); showfredattr (&avp -> avseq_av); ps_print (RPS, "\n"); level++; } break; } haspost = 0; for (eptr = myentry -> e_attributes; eptr; eptr = eptr -> attr_link) if (AttrT_cmp (&eptr -> attr_type, t_postal) == 0) { if (eptr -> attr_value) haspost = 1; } ps_print (RPS, "\n"); level = -1; for (t = default_template; t -> t_name; t++) { if (AttrT_cmp (t -> t_at, rdn_at) == 0) continue; for (eptr = myentry -> e_attributes; eptr; eptr = eptr -> attr_link) if (AttrT_cmp (&eptr -> attr_type, t -> t_at) == 0) { int i; if (AttrT_cmp (&eptr -> attr_type, inf_at) == 0 && (avs = eptr -> attr_value) && !avs -> avseq_next) continue; if (haspost && t -> t_level == LEVEL_POSTAL && AttrT_cmp (&eptr -> attr_type, t_title)) { level = t -> t_level + 1; continue; } if (t -> t_level != level) { if (level >= 0) ps_print (RPS, "\n"); if ((level = t -> t_level) == LEVEL_MBOX) ps_print (RPS, "Mailbox information:\n"); } if (t -> t_prefix) { i = strlen (t -> t_prefix); ps_printf (RPS, "%s", t -> t_prefix); } else i = 0; if (avs = eptr -> attr_value) { postal_indent = i; showfredattr (&avs -> avseq_av); ps_print (RPS, "\n"); for (avp = avs -> avseq_next; avp; avp = avp -> avseq_next) { if (t -> t_prefix) ps_printf (RPS, "%*s", i, ""); showfredattr (&avp -> avseq_av); ps_print (RPS, "\n"); } } else ps_print (RPS, "no value?!?\n"); break; } } if (mydn) { ps_print (RPS, "\nHandle: @"); dn_print (RPS, mydn, EDBOUT); if (seqno) ps_printf (RPS, " (%d)", seqno); } ps_print (RPS, "\n"); didtime = 0; for (eptr = myentry -> e_attributes; eptr; eptr = eptr -> attr_link) if (AttrT_cmp (&eptr -> attr_type, t_modtime) == 0) { if (avs = eptr -> attr_value) { ps_print (RPS, "Modified: "); showfredattr (&avs -> avseq_av); ps_print (RPS, "\n"); didtime = 1; } break; } if (didtime) for (eptr = myentry -> e_attributes; eptr; eptr = eptr -> attr_link) if (AttrT_cmp (&eptr -> attr_type, t_modwhom) == 0) { if ((avs = eptr -> attr_value) && dn_cmp ((DN) avs -> avseq_av.av_struct, mydn)) { ps_print (RPS, " by: "); showfredattr (&avs -> avseq_av); ps_print (RPS, "\n"); } break; } children: ; nchild = 0; if (subdisplay) { struct ds_list_arg list_arg; struct ds_list_result list_result; struct DSError list_error; struct list_cache *ptr; (void) ps_flush (RPS); (void) service_control (OPT, 0, NULLVP, &list_arg.lsa_common); list_arg.lsa_common.ca_servicecontrol.svc_options |= SVC_OPT_DONTDEREFERENCEALIAS; if (ptr = find_list_cache (list_arg.lsa_object = mydn, SVC_NOSIZELIMIT)) { if (ptr -> list_subs) nchild = fred_children (mydn, ptr -> list_subs, ptr -> list_problem, TRUE); goto out; } if (rebind () != OK) goto out; if (ds_list (&list_arg, &list_error, &list_result) != DS_OK) { ds_error (RPS, &list_error); goto out; } if (list_result.lsr_subordinates) nchild = fred_children (mydn, list_result.lsr_subordinates, list_result.lsr_limitproblem, FALSE); cache_list (list_result.lsr_subordinates, list_result.lsr_limitproblem, mydn, SVC_NOSIZELIMIT); subords_free (list_result.lsr_subordinates); } out: ; if (mydn) dn_free (mydn); if (ps) ps_free (ps); postal_indent = -1; return nchild; } /* \f */ static fred_children (parentdn, ptr, prob, cached) DN parentdn; register struct subordinate *ptr; int prob; char cached; { int i, nchild; register struct subordinate *qtr; register DN adn, newdn; newdn = dn_comp_new (rdn_comp_new (NULLAttrT, NULLAttrV)); if (adn = dn_cpy (parentdn)) dn_append (adn, newdn); else adn = newdn; i = 0; for (qtr = ptr; qtr; qtr = qtr -> sub_next) i++; nchild = i; if (i > 0) ps_printf (RPS, "%d child%s.\n-----\n", i, i != 1 ? "ren" : ""); for (i = 0; ptr; ptr = ptr -> sub_next, i++) { if (!cached) (void) rdn_decode (ptr -> sub_rdn); rdn_free (newdn -> dn_rdn); dn_comp_fill (newdn, rdn_cpy (ptr -> sub_rdn)); (void) add_sequence (adn); (void) showfred (adn, 0, FALSE); } dn_free (adn); if (prob != LSR_NOLIMITPROBLEM) ps_print (RPS, "(Limit problem)\n"); return nchild; } /* \f */ static showfredattr (av) register AttributeValue av; { int format, seqno; static int once_only = 0; static int s_dn; if (once_only == 0) { once_only++; s_dn = str2syntax ("DN"); } if (av -> av_syntax == s_dn) { ps_print (RPS, "@"); format = EDBOUT; } else format = READOUT; AttrV_print (RPS, av, format); if (av -> av_syntax == s_dn && fred_sequence && (seqno = add_sequence ((DN) av -> av_struct))) ps_printf (RPS, " (%d)", seqno); } /* \f */ static Entry fredentry (adn, islong) DN adn; char islong; { register Entry newentry; struct ds_read_arg read_arg; struct ds_read_result read_result; struct DSError read_error; if (adn == NULLDN) return NULLENTRY; if ((newentry = local_find_entry (read_arg.rda_object = adn, FALSE)) == NULLENTRY || !newentry -> e_lock || (islong && !newentry -> e_complete)) { if (rebind () != OK) return newentry; (void) service_control (OPT, 0, NULLVP, &read_arg.rda_common); read_arg.rda_common.ca_servicecontrol.svc_options |= SVC_OPT_DONTDEREFERENCEALIAS; read_arg.rda_eis.eis_infotypes = TRUE; read_arg.rda_eis.eis_allattributes = TRUE; read_arg.rda_eis.eis_select = NULLATTR; if (ds_read (&read_arg, &read_error, &read_result) != DS_OK) { #ifdef notdef ds_error (RPS, &read_error); #endif return newentry; } cache_entry (&read_result.rdr_entry, read_arg.rda_eis.eis_allattributes, read_arg.rda_eis.eis_infotypes); entryinfo_comp_free (&read_result.rdr_entry, 0); newentry = local_find_entry (adn, FALSE); } return newentry; }