fred.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 2,257 行 · 第 1/4 页
C
2,257 行
qos_indent = ufn_indent = postal_indent + 2; 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, ""); else ps_print (RPS, "\n"); showfredattr (&avp -> avseq_av); ps_print (RPS, "\n"); } } else ps_print (RPS, "no value?!?\n"); break; } } ufn_indent = (sizeof "Modified: " - 1) + 2; if (mydn) { ps_print (RPS, "\nName: "); ufn_dn_print_aux (RPS, mydn, NULLDN, 1); 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); goto out; } if (rebind () != OK) goto out; for (;;) { if (ds_list (&list_arg, &list_error, &list_result) == DS_OK) break; if (dish_error (OPT, &list_error) == NOTOK) goto out; list_arg.lsa_object = list_error.ERR_REFERRAL.DSE_ref_candidates -> cr_name; } if (list_result.lsr_subordinates) nchild = fred_children (mydn, list_result.lsr_subordinates, list_result.lsr_limitproblem); 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; qos_indent = 24; ufn_indent = 16; return nchild;}/* */static fred_children (parentdn, ptr, prob)DN parentdn;register struct subordinate *ptr;int prob;{ 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++) { 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;}/* */static showfredattr (av)register AttributeValue av;{ int seqno; if (av -> av_syntax == s_dn) { ufn_dn_print_aux (RPS, (DN) av -> av_struct, NULLDN, 1); if (fred_sequence && (seqno = add_sequence ((DN) av -> av_struct))) ps_printf (RPS, " (%d)", seqno); } else AttrV_print (RPS, av, READOUT);}/* MISC */static struct pair { char *p_name; AttributeType *p_at;} pairs[] = { "aliasedObjectName", &t_alias, "documentAuthor", &t_author, "documentAuthorCommonName", &t_authorCN, "documentAuthorSurName", &t_authorSN, "associatedDomain", &t_domain, "masterDSA", &t_master, "rfc822Mailbox", &t_mbox, "lastModifiedTime", &t_modtime, "lastModifiedBy", &t_modwhom, "objectClass", &t_object, "otherMailbox", &t_othermbox, "telephoneNumber", &t_phone, "photo", &t_photo, "postalAddress", &t_postal, "slaveDSA", &t_slave, "surName", &t_surname, "title", &t_title, NULL}; /* */static fred_init (){ register struct pair *p; register struct template *t; static int once_only = 1; if (!once_only) return; once_only = 0; s_dn = str2syntax ("DN"); s_photo = str2syntax ("Photo"); for (p = pairs; p -> p_name; p++) *p -> p_at = AttrT_new (p -> p_name); for (t = default_template; t -> t_name; t++) t -> t_at = AttrT_new (t -> t_name);}/* */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_allattributes = FALSE; read_arg.rda_eis.eis_select = islong ? fred_full () : fred_as (); read_arg.rda_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES; if (ds_read (&read_arg, &read_error, &read_result) != DS_OK) {#ifdef notdef dish_error (RPS, &read_error);#endif return newentry; } cache_entry (&read_result.rdr_entry, islong ? TRUE : FALSE, read_arg.rda_eis.eis_infotypes); entryinfo_comp_free (&read_result.rdr_entry, 0); newentry = local_find_entry (adn, FALSE); } return newentry;}/* */showfredDNs (dn, islong)DN dn;int islong;{ register Attr_Sequence eptr; register AV_Sequence avs; Entry theEntry; PS nps; fred_init (); if (!(theEntry = fredentry (dn, islong))) return; if ((nps = ps_alloc (str_open)) == NULLPS || str_setup (nps, NULLCP, 0, 0) == NOTOK) { if (nps) ps_free (nps); return; } for (eptr = theEntry -> e_attributes; eptr; eptr = eptr -> attr_link) if (eptr -> attr_type -> oa_syntax == s_dn) { if (AttrT_cmp (eptr -> attr_type, t_master) == 0 || AttrT_cmp (eptr -> attr_type, t_slave) == 0) continue; for (avs = eptr -> attr_value; avs; avs = avs -> avseq_next) { char buffer[BUFSIZ]; DN adn = (DN) avs -> avseq_av.av_struct; ufn_dn_print_aux (nps, adn, NULLDN, 0); ps_print (nps, "$"); dn_print (nps, adn, EDBOUT); ps_print (nps, " "); *--nps -> ps_ptr = NULL, nps -> ps_cnt++; (void) sprintf (buffer, "d%s\n", nps -> ps_base); nps -> ps_ptr = nps -> ps_base, nps -> ps_cnt = nps -> ps_bufsiz; send_pipe_aux (buffer); if (read_pipe_aux (buffer, sizeof buffer) < 1) { (void) fprintf (stderr, "read failure\n"); remote_prob = TRUE; goto losing; } } } else if (fred_photo && (eptr -> attr_type -> oa_syntax == s_photo || eptr -> attr_type -> oa_syntax - AV_WRITE_FILE == s_photo)) { int avsno; for (avs = eptr -> attr_value, avsno = 1; avs; avs = avs -> avseq_next, avsno++) { int cc, i, j; register char *cp, *dp; char buffer[BUFSIZ], faxtopbm[BUFSIZ], tmp1[BUFSIZ], tmp2[BUFSIZ]; AttributeValue av; FILE *fp; PE pe; PS ps; struct stat st; if ((av = &avs -> avseq_av) -> av_syntax != AV_FILE) av = ((struct file_syntax *) av -> av_struct) -> fs_attr; (void) strcpy (faxtopbm, isodefile ("g3fax/faxtopbm", 1)); if (access (faxtopbm, X_OK) == NOTOK) {#ifndef NO_STATS (void) ll_log (dad_log, LLOG_EXCEPTIONS, "failed", "check for X_OK access on %s", faxtopbm);#endif break; } (void) strcpy (tmp1, "/tmp/faxXXXXXX"); (void) unlink (mktemp (tmp1)); (void) strcpy (tmp2, "/tmp/pbmXXXXXX"); (void) unlink (mktemp (tmp2)); if ((fp = fopen (tmp1, "w")) == NULL) break; if ((ps = ps_alloc (std_open)) == NULLPS || std_setup (ps, fp) == NOTOK) { if (ps) ps_free (ps); (void) unlink (tmp1); (void) fclose (fp); break; } (void) pe2ps (ps, pe = grab_pe (av)); pe_free (pe); ps_free (ps); (void) fclose (fp); (void) sprintf (buffer, "%s < %s > %s", faxtopbm, tmp1, tmp2); i = system (buffer); (void) unlink (tmp1); if (i || (fp = fopen (tmp2, "r")) == NULL || fstat (fileno (fp), &st) == NOTOK || (cc = st.st_size) == 0) { if (!i && fp) (void) fclose (fp); (void) unlink (tmp2); continue; } if ((cp = malloc ((unsigned) (cc))) == NULL) { (void) fprintf (stderr, "out of memory\n"); goto out; } for (dp = cp, j = cc; j > 0; dp += i, j -= i) switch (i = fread (dp, sizeof *dp, j, fp)) { case NOTOK: (void) fprintf (stderr, "error reading %s: %s\n", tmp2, sys_errname (errno)); goto out2; case OK: (void) fprintf (stderr, "premature eof reading %s\n", tmp2);out2: ; free (cp); goto out; default: break; } (void) sprintf (buffer, "P%d %s", cc, attr2name (eptr -> attr_type, OIDPART)); if (avs != eptr -> attr_value || avs -> avseq_next) (void) sprintf (buffer + strlen (buffer), "#%d", avsno); ufn_dn_print_aux (nps, dn, NULLDN, 0); ps_print (nps, "$"); dn_print (nps, dn, EDBOUT); ps_print (nps, " "); *--nps -> ps_ptr = NULL, nps -> ps_cnt++; (void) sprintf (buffer + strlen (buffer), "$%s\n", nps -> ps_base); nps -> ps_ptr = nps -> ps_base, nps -> ps_cnt = nps -> ps_bufsiz; send_pipe_aux (buffer); if ((i = read_pipe_aux (buffer, sizeof buffer)) < 1) { (void) fprintf (stderr, "read failure\n"); remote_prob = TRUE;out: ; (void) fclose (fp); (void) unlink (tmp2); goto losing; } else if ((i == 1) && (*buffer == 'P')) { remote_prob = FALSE; (void) fclose (fp); (void) unlink (tmp2); break; } send_pipe_aux2 (cp, cc); free (cp); if ((i = read_pipe_aux (buffer, sizeof buffer)) < 1) { (void) ps_printf (OPT, "read failure\n"); remote_prob = TRUE; goto out; } (void) fclose (fp); (void) unlink (tmp2); } }losing: ; ps_free (nps);}/* */Attr_Sequence fred_as (){ static Attr_Sequence as = NULL; if (!as) { AttributeType at; fred_init (); if (at = t_mbox) as = as_merge (as, as_comp_new (AttrT_cpy (at), NULLAV, NULLACL_INFO)); if (at = t_phone) as = as_merge (as, as_comp_new (AttrT_cpy (at), NULLAV, NULLACL_INFO)); if (at = t_surname) as = as_merge (as, as_comp_new (AttrT_cpy (at), NULLAV, NULLACL_INFO)); if (at = t_alias) as = as_merge (as, as_comp_new (AttrT_cpy (at), NULLAV, NULLACL_INFO)); } return as;}/* */Attr_Sequence fred_full (){ static Attr_Sequence as = NULL; if (!as) { register struct pair *p; register struct template *t; AttributeType at; fred_init (); for (p = pairs; p -> p_name; p++) if (at = *p -> p_at) as = as_merge (as, as_comp_new (AttrT_cpy (at), NULLAV, NULLACL_INFO)); for (t = default_template; t -> t_name; t++) if (at = t -> t_at) as = as_merge (as, as_comp_new (AttrT_cpy (at), NULLAV, NULLACL_INFO)); } if (t_photo) { sntx_table *s; if (dad_flag || (s_photo && (s = get_syntax_table (s_photo)) && s -> s_pe_print)) as = as_merge (as, as_comp_new (AttrT_cpy (t_photo), NULLAV, NULLACL_INFO)); else { int i; register Attr_Sequence ptr, *pptr; for (pptr = &as, ptr = *pptr; ptr; pptr = &ptr -> attr_link, ptr = *pptr) { if ((i = AttrT_cmp (ptr -> attr_type, t_photo)) == 0) { *pptr = ptr -> attr_link; as_comp_free (ptr); } if (i <= 0) break; } } } return as;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?