fred.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 2,257 行 · 第 1/4 页
C
2,257 行
continue; for (bdn = (*b) -> dns_dn; bdn -> dn_parent; bdn = bdn -> dn_parent) continue; i = rdn_cmp (adn -> dn_rdn, bdn -> dn_rdn); return (i == (-1) || i == 1 ? i : 0);}static int dns_sort (dns, i)struct dn_seq **dns;int i;{ register struct dn_seq *ptr; if (i == 0) for (ptr = *dns; ptr; ptr = ptr -> dns_next) i++; if (i > 1) { struct dn_seq **base, **bp, **ep; if (base = (struct dn_seq **) malloc ((unsigned) (i * sizeof *base))) { ep = base; for (ptr = *dns; ptr; ptr = ptr -> dns_next) *ep++ = ptr; qsort ((char *) base, i, sizeof *base, (IFP) dns_compar); bp = base; ptr = *dns = *bp++; while (bp < ep) { ptr -> dns_next = *bp; ptr = *bp++; } ptr -> dns_next = NULL; free ((char *) base); } }}/* */static done_match (dns, fancy)struct dn_seq *dns;char *fancy;{ int i; register struct dn_seq *ptr; if (dns == NULL) { if (ufn_partials) { if (fred_list && frompipe && ufn_partials -> dns_next) { char buffer[BUFSIZ]; send_pipe_aux ("mUnable to resolve name, partial matches follow...\n"); if (read_pipe_aux (buffer, sizeof buffer) < 1) { (void) fprintf (stderr, "read failure\n"); remote_prob = TRUE; goto losing; } dns = ufn_partials, ufn_partials = NULL; goto fresh_start; } ps_printf (OPT, "Unable to resolve name, partial match%s available:\n", ufn_partials -> dns_next ? "es" : ""); for (ptr = ufn_partials; ptr; ptr = ptr -> dns_next) (void) showfred (ptr -> dns_dn, ufn_partials -> dns_next ? FALSE : TRUE, FALSE);losing: ; dn_seq_free (ufn_partials), ufn_partials = NULL; return; } ps_printf (OPT, "Search failed to find anything.\n"); return; }fresh_start: ; i = 0; for (ptr = dns; ptr; ptr = ptr -> dns_next) i++; fred_long = i == 1; fred_expand = fred_subdisplay = FALSE; fred_sequence = !fred_list; if (i > 1 || fancy) { PS aps;#ifndef SOCKETS if (frompipe) search_result = NOTOK; aps = OPT;#else if (frompipe && rps -> ps_byteno == 0 && opt -> ps_byteno == 0 && fdx_reset (opt) == OK) { /* MAJOR HACK */ char *cp = fancy ? fancy : "3"; (void) (*opt -> ps_writeP) (opt, cp, strlen (cp), 0); aps = opt; } else aps = RPS;#endif ps_printf (aps, "%d matches found.\n", i); (void) ps_flush (aps); dns_sort (&dns, i); } for (ptr = dns; ptr; ptr = ptr -> dns_next) (void) add_sequence (ptr -> dns_dn); if (i == 1 && !fancy && fred_list && frompipe && rps -> ps_byteno == 0 && opt -> ps_byteno == 0 && fdx_reset (rps) == OK) { /* MAJOR HACK */ showfredDNs (dns -> dns_dn, fred_long); (void) (*rps -> ps_writeP) (rps, "4", 1, 0); ufn_dn_print_aux (rps, dns -> dns_dn, NULLDN, 0); ps_print (RPS, "$"); dn_print (RPS, dns -> dns_dn, EDBOUT); ps_print (rps, "\n"); (void) ps_flush (rps); fred_list = FALSE; } for (i = 0, ptr = dns; ptr; ptr = ptr -> dns_next, i++) { if (fred_list) { ufn_dn_print_aux (RPS, ptr -> dns_dn, NULLDN, 0); ps_print (RPS, "$"); dn_print (RPS, ptr -> dns_dn, EDBOUT); ps_print (RPS, "\n"); continue; } if (i > 0) (void) ps_flush (RPS); (void) showfred (ptr -> dns_dn, fred_long, fred_subdisplay); } dn_seq_free (dns);}/* SHOWENTRY SUPPORT */extern int postal_indent;extern int qos_indent;extern int ufn_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, "documentVersion", "Version of: ", 1, NULL, "registeredAddress", "Registered Address: ", 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, "documentLocation", "Location: ", 3, NULL,#define LEVEL_MBOX 4 "rfc822Mailbox", " Mailbox: ", 4, NULL, "otherMailbox", " ", 4, NULL, "textEncodedORaddress", " ", 4, NULL,#ifdef USE_PP "mhsORAddresses", " X.400: ", 4, NULL,#endif "destinationIndicator", "Destination Indicator: ", 5, NULL, "preferredDeliveryMethod", "Preferred Delivery Method: ", 5, NULL, "supportedApplicationContext", "Supports: ", 5, NULL, "personalTitle", NULL, 6, NULL, "description", NULL, 6, NULL, "info", "Information: ", 7, NULL, "supplementaryInformation", "Note: ", 7, NULL, "businessCategory", "Business: ", 7, NULL, "localityName", "Locality: ", 7, NULL, "userClass", "User Class: ", 7, NULL, "owner", "Owner: ", 7, NULL, "documentAuthor", "Author: ", 7, NULL,#define LEVEL_AUTHOR 7 "documentAuthorCommonName", "Author: ", 7, NULL, "documentAuthorSurName", "Author: ", 7, NULL, "member", "Members: ", 8, NULL, "dSAQuality", "Server Quality: ", 8, NULL, "singleLevelQuality", "Subordinate Data Quality: ", 8, NULL, "subtreeMinimumQuality", "Minimum Data Quality: ", 8, NULL, "subtreeMaximumQuality", "Maximum Data Quality: ", 8, NULL, "aliasedObjectName", "Alias to: ", 9, NULL, "roleOccupant", "Occupant: ", 9, NULL, "seeAlso", "See Also: ", 9, NULL, "secretary", "Secretary: ", 9, NULL, "manager", "Manager: ", 9, NULL, "whoisIdent", "WHOIS: ", 9, NULL, "namingLink", "Link: ", 9, NULL, "reciprocalNamingLink", "R-Link: ", 9, NULL, "homePostalAddress", "Home Address: ", 10, NULL, "homePhone", "Home Phone: ", 10, NULL, "favouriteDrink", "Drinks: ", 10, NULL, "photo", "Picture: ", 10, NULL,#ifdef sparc "audio", "Audio: ", 10, NULL,#endif NULL};static int ava_compar (a, b)RDN *a, *b;{ /* tricky, just check 'a' part, no need to check 'v' part! */ return (*a) -> rdn_at - (*b) -> rdn_at;}/* */showfred (mydn, islong, subdisplay)DN mydn;char islong, subdisplay;{ int didtime, hasauthor, 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; PS ps = NULLPS; RDN myrdn; fred_init (); myentry = fredentry (mydn = dn_cpy (mydn), islong); 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;/* if (islong == FALSE) { ufn_dn_print_aux (RPS, mydn, NULLDN, 0); goto ufn_short; } */ for (adn = mydn; adn -> dn_parent; adn = adn -> dn_parent) continue; myrdn = adn -> dn_rdn; if (myrdn -> rdn_next) { register int i; RDN *base; i = 1; for (rdn = myrdn -> rdn_next; rdn; rdn = rdn -> rdn_next) i++; if (base = (RDN *) malloc ((unsigned) (i * sizeof *base))) { RDN *bp, *ep; ep = base; for (rdn = myrdn; rdn; rdn = rdn -> rdn_next) *ep++ = rdn; qsort ((char *) base, i, sizeof *base, (IFP) ava_compar); bp = base; rdn = myrdn = *bp++; while (bp < ep) { rdn -> rdn_next = *bp; rdn = *bp++; } rdn -> rdn_next = NULL; free ((char *) base); adn -> dn_rdn = myrdn; } } 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 (!fred_phone && 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; if (!fred_photo) 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; } hasauthor = haspost = 0; for (eptr = myentry -> e_attributes; eptr; eptr = eptr -> attr_link) if (AttrT_cmp (eptr -> attr_type, t_author) == 0) { if (eptr -> attr_value) hasauthor = 1; } else 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++) { RDN rdn; for (rdn = myrdn; rdn; rdn = rdn -> rdn_next) if (AttrT_cmp (t -> t_at, rdn -> rdn_at) == 0) break; if (rdn) continue; if (fred_photo && AttrT_cmp (t -> t_at, t_photo) == 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 (t -> t_level == LEVEL_AUTHOR) if (AttrT_cmp (eptr -> attr_type, t_authorCN) == 0) { if (hasauthor) continue; hasauthor = 1; } else if (hasauthor && AttrT_cmp (eptr -> attr_type, t_authorSN) == 0) 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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?