|
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: P T
Length: 29393 (0x72d1) Types: TextFile Names: »P2toRFC.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Format/rfc1148/P2toRFC.c«
/* P2toRFC.c: p2 msg + optional p1 struct + optional bodypart -> RFC 822 hdr */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Format/rfc1148/RCS/P2toRFC.c,v 5.0 90/09/20 16:01:28 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Format/rfc1148/RCS/P2toRFC.c,v 5.0 90/09/20 16:01:28 pp Exp Locker: pp $ * * $Log: P2toRFC.c,v $ * Revision 5.0 90/09/20 16:01:28 pp * rcsforce : 5.0 public release * */ #include "head.h" #include "util.h" #include "P2-types.h" #include "q.h" #include <isode/cmd_srch.h> #include "tb_bpt88.h" #include "or.h" #include "ap.h" #include "oids.h" static FILE *fp_out; static int linelen = 0; static struct type_P2_Heading *head; static struct type_P2_IPN *ipn; static char ipn_body[FILNSIZE]; static char abuf [BUFSIZ]; extern CMD_TABLE bptbl_body_parts88[/* x400 88 body_parts */]; extern char *cont_p2, *cont_p22; extern char *hdr_822_bp, *hdr_p2_bp, *ia5_bp, *hdr_p22_bp; extern void msgid2rfc(), encinfo2rfc(); extern int order_pref; extern UTC utclocalise(); int convertresult; P2toRFC (p2_in, ext_in, qp, rfc_out, ipn_body_out, ep, x40084) char *p2_in; char *ext_in; Q_struct *qp; char *rfc_out; char *ipn_body_out; char **ep; int x40084; { FILE *fp_in; PE pe = NULLPE; PS ps = NULLPS; int retval, ishead; char *ix; char buf[BUFSIZ]; head = NULL; ipn = NULL; linelen = 0; convertresult = OK; if ((ix = rindex(p2_in, '/')) == NULL) ix = p2_in; else ix++; if (lexequ(ix, (x40084 == TRUE) ? hdr_p2_bp : hdr_p22_bp) == 0) ishead = OK; else ishead = NOTOK; if (rfc_out == NULLCP) fp_out = stdout; else if ((fp_out = fopen (rfc_out, "w")) == NULL) { PP_SLOG (LLOG_EXCEPTIONS, rfc_out, ("Can't open file")); (void) sprintf (buf, "Failed to open output file '%s'", rfc_out); *ep = strdup(buf); return (NOTOK); } if (ipn_body_out) strcpy(ipn_body, ipn_body_out); else ipn_body[0] = '\0'; if (p2_in == NULLCP) fp_in = stdin; else if ((fp_in = fopen (p2_in, "r")) == NULL) { PP_SLOG (LLOG_EXCEPTIONS, p2_in, ("Can't open file")); fclose (fp_out); (void) sprintf (buf, "Failed to open input file '%s'", p2_in); *ep = strdup(buf); return (NOTOK); } if (((ps = ps_alloc (std_open)) == NULLPS) || (std_setup (ps, fp_in) == NOTOK)) { PP_LOG (LLOG_EXCEPTIONS, ("RFC822toP2() failed to setup PS")); retval = NOTOK; *ep = strdup("Failed to set up PS"); goto cleanup; } if ((pe = ps2pe (ps)) == NULLPE) { PP_LOG (LLOG_EXCEPTIONS, ("ps2pe error on file '%s'", p2_in)); retval = NOTOK; goto cleanup; } PY_pepy[0] = 0; if (ishead == OK) { if (decode_P2_Heading (pe, 0, NULLIP, NULLVP, &head) != OK) { PP_OPER(NULLCP, ("decode_P2_heading() failed : [%s]", PY_pepy)); retval = NOTOK; convertresult = NOTOK; (void) sprintf(buf, "unable to decode P2 heading [%s]", PY_pepy); *ep = strdup(buf); goto cleanup; } if (PY_pepy[0] != 0) PP_LOG(LLOG_EXCEPTIONS, ("decode_P2_heading non-fatal failure [%s]", PY_pepy)); if (do_p1 (qp, ishead, ep) != OK) { PP_TRACE (("P1 output failure")); retval = NOTOK; goto cleanup; } if (do_p2_head (ep) != OK) { PP_TRACE (( "P2 output failure")); retval = NOTOK; goto cleanup; } } else { if (decode_P2_IPN (pe, 0, NULLIP, NULLVP, &ipn) != OK) { PP_OPER(NULLCP, ("decode_P2_IPN() failed : [%s]", PY_pepy)); retval = NOTOK; convertresult = NOTOK; (void) sprintf(buf, "unable to decode P2 IPN [%]", PY_pepy); *ep = strdup(buf); goto cleanup; } if (PY_pepy[0] != 0) PP_LOG(LLOG_EXCEPTIONS, ("decode_P2_IPN non-fatal failure [%s]", PY_pepy)); if (do_p1 (qp, ishead, ep) != OK) { PP_TRACE (("P1 output failure")); retval = NOTOK; goto cleanup; } if (do_p2_ipn(qp, ep) != OK) { PP_TRACE (("P2 output failure")); retval = NOTOK; goto cleanup; } } do_same_line ("\n"); /* Terminate header */ if (do_extra (ext_in, ep) != OK) { PP_TRACE (( "Extra bits output failure")); retval = NOTOK; goto cleanup; } if (ishead != OK && do_p2_ipn_body(ep) != OK) { PP_TRACE((" IPN body output failure")); retval = NOTOK; goto cleanup; } retval = OK; cleanup: fclose (fp_out); fclose (fp_in); if (pe != NULLPE) pe_free(pe); if (ps != NULLPS) ps_free(ps); if (head != NULL) free_P2_Heading (head); if (ipn != NULL) free_P2_IPN (ipn); return (retval); } /* \f */ /* ARGSUSED */ do_p2_head(ep) char **ep; { if (head -> authorizing__users == NULL) { if (head -> originator != NULL) { do_key ("From"); do_ORD (head -> originator); } } else { do_key ("From"); do_ORD_seq (head -> authorizing__users); if (head -> originator != NULL) { do_key ("Sender"); do_ORD (head -> originator); } } if (head -> this__IPM != NULL) { do_key ("Message-ID"); if (do_mid (head -> this__IPM) != OK) { *ep = strdup("Invalid message id"); return NOTOK; } } if (head -> primary__recipients != NULL) { do_key ("To"); do_recip_seq (head -> primary__recipients); } if (head -> copy__recipients != NULL) { do_key ("Cc"); do_recip_seq (head -> copy__recipients); } if (head -> blind__copy__recipients != NULL) { do_key ("Bcc"); do_recip_seq (head -> blind__copy__recipients); } if (head -> replied__to__IPM != NULL) { do_key ("In-Reply-To"); if (do_mid (head -> replied__to__IPM) != OK) { *ep = strdup("Invalid In-Reply-To message id"); return NOTOK; } } if (head -> obsoleted__IPMs != NULL) { do_key ("Obsoletes"); if (do_mid_seq (head -> obsoleted__IPMs) != OK) { *ep = strdup("Invalid Obsoletes message id"); return NOTOK; } } if (head -> related__IPMs != NULL) { do_key ("References"); if (do_mid_seq (head -> related__IPMs) != OK) { *ep = strdup("Invalid References message id"); return NOTOK; } } if (head -> subject != NULL) { do_key ("Subject"); do_qbuf (head -> subject); } if (head -> expiry__time != NULL) { do_key ("Expiry-Date"); do_utc (head -> expiry__time); } if (head -> reply__time != NULL) { do_key ("Reply-By"); do_utc (head -> reply__time); } if (head -> reply__recipients != NULL) { do_key ("Reply-To"); do_ORD_seq (head -> reply__recipients); } if (head -> importance != NULL && head -> importance -> parm != int_P2_ImportanceField_normal) { do_key ("Importance"); do_importance (head -> importance -> parm); } if (head -> sensitivity != NULL) { do_key ("Sensitivity"); do_sensitivity (head -> sensitivity -> parm); } if (head -> auto__forwarded != NULL && head -> auto__forwarded -> parm) { do_key ("Autoforwarded"); do_boolean (head -> auto__forwarded -> parm); } if (head -> extensions != NULL) do_extensions (head -> extensions); /* incomplete-copy */ /* language */ return (OK); } /* ARGSUSED */ do_p2_ipn(qp, ep) Q_struct *qp; char **ep; { do_key ("From"); do_p1_addrs (qp -> Oaddress); if (ipn -> ipn__originator != NULL) { do_key ("To"); do_ORD (ipn -> ipn__originator); } do_key ("Subject"); do_token ("X.400 Inter-Personal Receipt Notification"); do_key ("Message-Type"); do_token ("InterPersonal Notification"); if (ipn -> subject__ipm != NULL) { do_key ("References"); if (do_mid (ipn -> subject__ipm) != OK) { *ep = strdup("Invalid References message id"); return NOTOK; } } return OK; } do_p2_ipn_body (ep) char **ep; { FILE *fp; char buf[BUFSIZ]; if (ipn_body[0] != '\0') { if ((fp = fopen (ipn_body, "w")) == NULL) { PP_SLOG (LLOG_EXCEPTIONS, ipn_body, ("Can't open file")); (void) sprintf(buf, "Unable to open output file '%s' for IPN body", ipn_body); *ep = strdup(buf); return (NOTOK); } } else fp = stdout; fputs("Your message to: ", fp); if (ipn -> ipm__preferred__recipient != NULL) { get_ORD (ipn -> ipm__preferred__recipient, abuf); fputs(abuf, fp); } fputs("\n", fp); if (ipn -> choice != NULL) { if (ipn -> choice -> offset == choice_P2_0_non__receipt__fields) do_p2_ipn_body_non__receipt(ipn -> choice -> un.non__receipt__fields, fp); else do_p2_ipn_body_receipt (ipn -> choice -> un.receipt__fields, fp); } if (ipn -> conversion__eits != NULL) do_p2_ipn_body_eits (ipn -> conversion__eits, fp); if (ipn -> choice != NULL && ipn -> choice -> offset == choice_P2_0_non__receipt__fields && ipn -> choice -> un.non__receipt__fields -> returned__ipm != NULL) fputs("The Original Message follows: \n\n", fp); else fputs("The Original Message is not available\n", fp); fclose (fp); return (OK); } do_p2_ipn_body_non__receipt (non_receipt, fp) struct type_P2_NonReceiptFields *non_receipt; FILE *fp; { if (non_receipt -> non__receipt__reason -> parm == int_P2_NonReceiptReasonField_ipm__discarded) do_p2_ipn_discard (non_receipt, fp); else do_p2_ipn_auto_forward (non_receipt, fp); } do_p2_ipn_discard (non_receipt, fp) struct type_P2_NonReceiptFields *non_receipt; FILE *fp; { fputs("was discarded for the following reason: ", fp); switch (non_receipt -> discard__reason -> parm) { case int_P2_DiscardReasonField_ipm__expired: fputs ("Expired.\n", fp); break; case int_P2_DiscardReasonField_ipm__obsoleted: fputs ("Obsoleted.\n", fp); break; case int_P2_DiscardReasonField_user__subscription__terminated: fputs ("User Subscription Terminated.\n", fp); break; } } do_p2_ipn_auto_forward (non_receipt, fp) struct type_P2_NonReceiptFields *non_receipt; FILE *fp; { char *cp; fputs ("was automatically forwarded.\n", fp); if (non_receipt -> auto__forward__comment != NULL) { cp = qb2str(non_receipt -> auto__forward__comment); fputs ("The following comment was made: ", fp); fputs (cp, fp); fputs (".\n", fp); free (cp); } } do_p2_ipn_body_receipt (receipt, fp) struct type_P2_ReceiptFields *receipt; FILE *fp; { do_p2_utc (receipt -> receipt__time, fp); if (receipt -> acknowledgment__mode != NULL) do_p2_ack_mode (receipt -> acknowledgment__mode, fp); if (receipt -> suppl__receipt__info != NULL) do_p2_suppl_info (receipt -> suppl__receipt__info, fp); } do_p2_ack_mode (mode, fp) struct type_P2_AcknowledgmentModeField *mode; FILE *fp; { fputs ("This notification was generated ", fp); if (mode -> parm == int_P2_AcknowledgmentModeField_manual) fputs("Manually.\n", fp); else fputs ("Automatically.\n", fp); } do_p2_suppl_info (info, fp) struct type_P2_SupplReceiptInfoField *info; FILE *fp; { char *cp; fputs ("The following extra information was given:\n", fp); cp = qb2str (info); fputs ("\n", fp); free(cp); } do_p2_ipn_body_eits (eits, fp) struct type_P2_ConversionEITsField *eits; FILE *fp; { int first = OK; fputs ("The following information types were converted:", fp); if (bit_test (eits -> built__in__encoded__information__types, bit_P2_BuiltInEncodedInformationTypes_undefined) == 1) { if (first == OK) { fputs ("Undefined", fp); first = NOTOK; } else fputs (", Undefined", fp); } if (bit_test (eits -> built__in__encoded__information__types, bit_P2_BuiltInEncodedInformationTypes_telex) == 1) { if (first == OK) { fputs ("Telex", fp); first = NOTOK; } else fputs (", Telex", fp); } if (bit_test (eits -> built__in__encoded__information__types, bit_P2_BuiltInEncodedInformationTypes_ia5__text) == 1) { if (first == OK) { fputs ("IA5-Text", fp); first = NOTOK; } else fputs (", IA5-Text", fp); } if (bit_test (eits -> built__in__encoded__information__types, bit_P2_BuiltInEncodedInformationTypes_g3__facsimile) == 1) { if (first == OK) { fputs ("G3-Fax", fp); first = NOTOK; } else fputs (", G3-Fax", fp); } if (bit_test (eits -> built__in__encoded__information__types, bit_P2_BuiltInEncodedInformationTypes_g4__class__1) == 1) { if (first == OK) { fputs ("TIF0", fp); first = NOTOK; } else fputs (", TIF0", fp); } if (bit_test (eits -> built__in__encoded__information__types, bit_P2_BuiltInEncodedInformationTypes_teletex) == 1) { if (first == OK) { fputs ("Teletex", fp); first = NOTOK; } else fputs (", Teletex", fp); } if (bit_test (eits -> built__in__encoded__information__types, bit_P2_BuiltInEncodedInformationTypes_videotex) == 1) { if (first == OK) { fputs ("Videotex", fp); first = NOTOK; } else fputs (", Videotex", fp); } if (bit_test (eits -> built__in__encoded__information__types, bit_P2_BuiltInEncodedInformationTypes_voice) == 1) { if (first == OK) { fputs ("Voice", fp); first = NOTOK; } else fputs (", Voice", fp); } if (bit_test (eits -> built__in__encoded__information__types, bit_P2_BuiltInEncodedInformationTypes_sfd) == 1) { if (first == OK) { fputs ("SFD", fp); first = NOTOK; } else fputs (", SFD", fp); } if (bit_test (eits -> built__in__encoded__information__types, bit_P2_BuiltInEncodedInformationTypes_mixed__mode) == 1) { if (first == OK) { fputs ("TIF1", fp); first = NOTOK; } else fputs (", TIF1", fp); } if (eits -> external__encoded__information__types != NULL) { if (first == OK) { fputs (", ", fp); first = NOTOK; } fputs (sprintoid (eits -> external__encoded__information__types), fp); } fputs(".\n", fp); } do_p2_utc (utc_qb, fp) struct qbuf *utc_qb; FILE *fp; { char *cp; UTC ut, lut; fputs ("was received at", fp); cp = qb2str (utc_qb); ut = str2utct (cp, strlen(cp)); lut = utclocalise(ut); UTC2rfc (lut, abuf); fputs(abuf, fp); fputs(".\n", fp); free(cp); free ((char *)ut); free ((char *)lut); } /* \f */ static UTC oldestTrace(traces) Trace *traces; { Trace *ix; UTC ret; time_t tmp, oldest = 0; ix = traces; oldest = utc2time_t(ix->trace_DomSinfo.dsi_time); ret = ix->trace_DomSinfo.dsi_time; ix = ix->trace_next; while (ix != NULL) { tmp = utc2time_t(ix->trace_DomSinfo.dsi_time); if (tmp && (tmp < oldest || !oldest)) { oldest = tmp; ret = ix->trace_DomSinfo.dsi_time; } ix = ix->trace_next; } return ret; } static int moreThanHdrAndIa5(eit) EncodedIT *eit; { LIST_BPT *ix = eit->eit_types; int found = 0; while (found == 0 && ix != NULL) { if (strncmp(hdr_822_bp, ix->li_name, strlen(hdr_822_bp)) == 0 || strncmp("delivery.", ix->li_name, strlen("delivery.")) == 0 || strncmp(hdr_p2_bp, ix->li_name, strlen(hdr_p2_bp)) == 0 || strncmp(ia5_bp, ix->li_name, strlen(ia5_bp)) == 0) ix = ix->li_next; else /* not ia5 or hdr */ found = 1; } return found; } /* ARGSUSED */ do_p1 (qp, ishead, ep) Q_struct *qp; int ishead; char **ep; { if (qp == (Q_struct *) 0) return (OK); do_p1_trace (qp -> trace); do_key ("Date"); do_p1_utc (oldestTrace (qp -> trace)); if (ishead == OK && head -> originator == NULL) { if (head -> authorizing__users == NULL) do_key("From"); else do_key("Sender"); do_p1_addrs (qp -> Oaddress); } do_key ("X400-Originator"); do_p1_addrs (qp -> Oaddress); if (ishead == OK && head -> primary__recipients == NULL && head -> copy__recipients == NULL && head -> blind__copy__recipients == NULL) { do_key ("To"); if (qp -> disclose_recips) do_p1_addrs (qp -> Raddress); else do_token (":;"); } if (qp -> disclose_recips) { do_key ("X400-Recipients"); do_p1_addrs (qp -> Raddress); } do_key ("X400-MTS-Identifier"); do_p1_mid (&(qp -> msgid)); if (qp -> orig_encodedinfo.eit_types != NULL && moreThanHdrAndIa5 (&qp -> orig_encodedinfo)) { do_key ("Original-Encoded-Information-Types"); do_p1_eit (&(qp -> orig_encodedinfo)); } else if (qp -> encodedinfo.eit_types != NULL && moreThanHdrAndIa5 (&qp -> encodedinfo)) { /* not just ia5 bodypart */ do_key ("Original-Encoded-Information-Types"); do_p1_eit (&(qp -> encodedinfo)); } if (qp -> cont_type != NULLCP) { do_key ("X400-Content-Type"); if (lexequ (qp -> cont_type, cont_p2) == 0) do_token ("P2-1984 (2)"); else if (lexequ (qp -> cont_type, cont_p22) == 0) do_token ("P2-1988 (22)"); else do_token (qp -> cont_type); } if (qp -> ua_id != NULLCP) { do_key ("Content-Identifier"); do_token (qp -> ua_id); } if (qp -> priority != PRIO_NORMAL) { do_key ("Priority"); do_p1_priority (qp -> priority); } if (qp -> originator_return_address != NULL) { do_key ("Originator-Return-Address"); do_p1_fullname (qp -> originator_return_address); } if (qp -> dl_expansion_history != NULL) do_p1_DLHistory (qp -> dl_expansion_history); if (qp -> implicit_conversion == TRUE) { do_key("Conversion"); do_token("Prohibited"); } if (qp -> conversion_with_loss_prohibited) { do_key ("Conversion-With-Loss"); do_token ("Prohibited"); } if (qp -> defertime != 0) { do_key ("Deferred-Delivery"); do_p1_utc (qp -> defertime); } if (qp -> latest_time != 0 && qp -> latest_time_crit) { do_key ("Latest-Delivery-Time"); do_p1_utc (qp -> latest_time); } return (OK); } /* \f */ do_extra (extra, ep) char *extra; char **ep; { char buf [LINESIZE], tmp[BUFSIZ]; FILE *fp_extra; if (extra == NULLCP || extra [0] == '\0') return (OK); if ((fp_extra = fopen (extra, "r")) == NULL) { PP_SLOG (LLOG_EXCEPTIONS, extra, ("Can't open file")); (void) sprintf (tmp, "Unable to open extra input file '%s'", extra); *ep = strdup(tmp); return (NOTOK); } if (fgets (buf, LINESIZE - 1, fp_extra) == NULL) { PP_DBG (( "Null file '%s'", extra)); (void) sprintf (tmp, "Empty extra file '%s'", extra); *ep = strdup(tmp); fclose (fp_extra); return (NOTOK); } buf [strlen(buf) - 1] = '\0'; /* remvove \n */ if (lexnequ (buf, "RFC-822-HEADERS:", strlen("RFC-822-HEADERS")) != 0) { PP_DBG (( "Illegal first line '%s' in file '%s'", buf, extra)); (void) sprintf (tmp, "Illegal first line '%s' in file '%s'", buf, extra); fclose (fp_extra); *ep = strdup(tmp); return (NOTOK); } while (TRUE) { if ((fgets (buf, LINESIZE -1, fp_extra) == NULL) && !feof (fp_extra)) { PP_DBG (( "File read error")); fclose (fp_extra); return (NOTOK); } if (!feof (fp_extra)) fputs (buf, fp_out); else { fclose (fp_extra); return (OK); } } } /* \f */ /* P2 structure bits */ do_822_extension (pe) PE pe; { char *hdr_txt, *ix; struct type_P2_RFC822Field *hdr; PY_pepy[0] = 0; if (decode_P2_RFC822Field (pe, 0, NULLIP, NULLVP, &hdr) != OK) PP_OPER(NULLCP, ("decode_P2_RFC822Field () Failed : [%s]", PY_pepy)); else { hdr_txt = qb2str(hdr); if ((ix = index(hdr_txt, ':')) == NULLCP) { PP_LOG(LLOG_EXCEPTIONS, ("Unable to parse extra 822 hdr '%s'", hdr_txt)); free(hdr_txt); return; } *ix++ = '\0'; while (isspace(*ix)) ix++; do_key(hdr_txt); do_token (ix); free(hdr_txt); free_P2_RFC822Field(hdr); } } do_incomplete_copy() { do_key ("Incomplete-Copy"); do_token (""); } do_languages (pe) PE pe; { char *lang_txt; struct type_P2_Languages *lang, *ix; PY_pepy[0] = 0; if (decode_P2_Languages (pe, 0, NULLIP, NULLVP, &lang) != OK) PP_OPER(NULLCP, ("decode_P2_Languages () failed : [%s]", PY_pepy)); else { ix = lang; while (ix != NULL) { lang_txt = qb2str(ix -> Language); do_key ("Language"); do_token (lang_txt); free(lang_txt); ix = ix -> next; } free_P2_Languages(lang); } } do_extension (extension) struct type_P2_HeadingExtension *extension; { if (extension -> type == NULL) { PP_LOG(LLOG_EXCEPTIONS, ("NULL oid in header extension")); return; } if (oid_cmp (extension -> type, str2oid(id_rfc_822_field)) == 0) do_822_extension (extension -> value); else if (oid_cmp (extension -> type, str2oid(id_hex_incomplete_copy)) == 0) do_incomplete_copy(); else if (oid_cmp (extension -> type, str2oid(id_hex_languages)) == 0) do_languages (extension -> value); else PP_LOG(LLOG_EXCEPTIONS, ("Unrecognised oid '%s' in header extension", sprintoid(extension -> type))); } do_extensions (extensions) struct type_P2_ExtensionsField *extensions; { while (extensions != NULL) { do_extension (extensions -> HeadingExtension); extensions = extensions -> next; } } do_qbuf (qb) struct qbuf *qb; { char *cp; cp = qb2str (qb); do_string (cp); free (cp); } do_recip_seq (recip_seq) struct type_P2_RecipientSequence *recip_seq; { struct type_P2_RecipientSpecifier *recip; recip = recip_seq -> RecipientSpecifier; get_ORD (recip -> recipient, abuf); if (recip -> notification__requests != NULLPE && bit_test (recip -> notification__requests, bit_P2_NotificationRequests_rn) == 1) { strcat (abuf, " (Receipt Notification Requested)"); } if (recip -> notification__requests != NULLPE && bit_test (recip -> notification__requests, bit_P2_NotificationRequests_nrn) == 1) { strcat (abuf, " (Non Receipt Notification Requested)"); } if (recip -> notification__requests != NULLPE && bit_test (recip -> notification__requests, bit_P2_NotificationRequests_ipm__return) == 1) { strcat (abuf, " (IPM Return Requested)"); } if (recip -> reply__requested) strcat (abuf, " (Reply Requested)"); do_token (abuf); if (recip_seq -> next != NULL) { do_same_line (","); do_recip_seq (recip_seq -> next); } } do_ORD_seq (ord_seq) struct type_P2_ORDescriptorSequence *ord_seq; { get_ORD (ord_seq -> ORDescriptor, abuf); do_token (abuf); if (ord_seq -> next != NULL) { do_same_line (","); do_ORD_seq (ord_seq -> next); } } do_ORD (ord) struct type_P2_ORDescriptor *ord; { get_ORD (ord, abuf); do_token (abuf); } OR_ptr pe2or(); get_ORD (ord, buf) struct type_P2_ORDescriptor *ord; char *buf; { /* see rfc1138 4.7.2 */ OR_ptr or; char tbuf [BUFSIZ], asc[BUFSIZ]; char *cp, *str = NULLCP; if (ord -> formal__name != NULL && ord -> formal__name -> x1 != NULL) { ord -> formal__name -> x1 -> pe_next = ord -> formal__name -> x2; if ((or = pe2or (ord -> formal__name -> x1)) == NULLOR) { PP_DBG (("Failed to decode PE")); tbuf[0] = '\0'; } else if (or_or2rfc (or, tbuf) != OK) { PP_DBG (( "Failed to decode OR Name")); tbuf[0] = '\0'; } if (or != NULLOR) or_free(or); ord -> formal__name -> x1 -> pe_next = NULLPE; } else tbuf [0] = '\0'; if (ord -> free__form__name == NULL) if (tbuf[0] == '\0') strcpy (buf, "Empty Address :;"); else if (tbuf[0] == '@') sprintf (buf, "FOO <%s>", tbuf); else strcpy (buf, tbuf); else { cp = qb2str (ord -> free__form__name); or_ps2asc (cp, asc); if (tbuf [0] == '\0') sprintf (buf, "\"%s\" :;", asc); else sprintf (buf, "\"%s\" <%s>", asc, tbuf); free (cp); } if (ord -> telephone__number != NULL) { cp = qb2str (ord -> telephone__number); if (*cp != '\0') { strcat (buf, " (Tel "); strcat (buf, cp); strcat (buf, ")"); free(cp); } } ap_s2s (buf, &str, order_pref); if (str != NULLCP) { (void) strcpy(buf, str); free(str); } } do_mid_seq (mid_seq) struct type_P2_IPMIdentifierSequence *mid_seq; { if (do_mid (mid_seq -> IPMIdentifier) != OK) return NOTOK; if (mid_seq -> next != NULL) { do_same_line (","); return do_mid_seq (mid_seq -> next); } return OK; } extern char *loc_dom_site; do_mid (mid) struct type_P2_IPMIdentifier *mid; { char *midstring; OR_ptr or; char tbuf [LINESIZE], buf[BUFSIZ]; char *cp, *str = NULLCP; AP_ptr ap; AP_ptr local; AP_ptr domain; /* see rfc 1138 4.7.3.4 */ if (mid -> user__relative__identifier != NULL) { midstring = qb2str (mid -> user__relative__identifier); or_ps2asc (midstring, abuf); free(midstring); if (mid -> user == NULL) { (void) sprintf (buf, "<%s>", abuf); if ((index(buf, '@') != NULLCP) && (ap_s2p (buf, &ap, (AP_ptr *) 0, (AP_ptr *) 0, &local, &domain, (AP_ptr *) 0) != (char *) NOTOK)) { /* buf parses as 822.msg-id */ do_token (buf); ap_free(ap); return OK; } } } else abuf[0] = '\0'; /* try as x400 generated */ if (mid -> user != NULL && mid -> user -> x1 != NULL) { mid -> user -> x1 -> pe_next = mid -> user -> x2; if ((or = pe2or (mid -> user -> x1)) != NULLOR && or_or2rfc (or, tbuf) == OK) { if (abuf[0] != '\0') sprintf (buf, "%s*%s", abuf, tbuf); else sprintf (buf, "*%s", tbuf); local = ap_new (AP_MAILBOX, buf); domain = ap_new (AP_DOMAIN, "MHS"); cp = ap_p2s_nc (NULLAP, NULLAP, local, domain, NULLAP); sprintf (abuf, "<%s>", cp); free (cp); ap_free (local); ap_free (domain); do_token (abuf); return OK; } } if (abuf[0] != '\0') { (void) sprintf(buf, "%s*",abuf); local = ap_new(AP_MAILBOX, buf); domain = ap_new(AP_DOMAIN, "MHS"); cp = ap_p2s_nc (NULLAP, NULLAP, local, domain, NULLAP); sprintf (abuf, "<%s>", cp); free (cp); ap_free (local); ap_free (domain); do_token (abuf); return OK; } PP_DBG (( "Highly dubious ID")); (void) sprintf (abuf, "<FOO@%s>", loc_dom_site); do_token(abuf); /* gen mid */ return NOTOK; } do_utc (utc_qb) struct qbuf *utc_qb; { char *cp; UTC ut; cp = qb2str (utc_qb); ut = str2utct (cp, strlen(cp)); do_p1_utc (ut); free (cp); free ((char *)ut); } do_importance (importance) int importance; { switch (importance) { case int_P2_ImportanceField_low: do_token ("Low"); break; case int_P2_ImportanceField_normal: do_token ("Normal"); break; case int_P2_ImportanceField_high: do_token ("High"); break; default: sprintf(abuf, "Undefined (value=%d)", importance); do_token (abuf); break; } } do_sensitivity (sensitivity) int sensitivity; { switch (sensitivity) { case int_P2_SensitivityField_personal: do_token ("Personal"); break; case int_P2_SensitivityField_private: do_token ("Private"); break; case int_P2_SensitivityField_company__confidential: do_token ("Company-Confidential"); break; default: sprintf(abuf, "Undefined (value=%d)", sensitivity); do_token (abuf); break; } } do_boolean (bool) char bool; { if (bool) do_token ("TRUE"); else do_token ("FALSE"); } /* \f */ /* Stuff for P1 */ do_p1_utc (ut) UTC ut; { UTC lut; lut = utclocalise(ut); if (UTC2rfc (ut, abuf) == NOTOK) strcpy(abuf, ">>INVALID UTC TIME<<"); do_token (abuf); free((char *) lut); } do_p1_addrs (addr) ADDR *addr; { if (adr2rfc (addr, abuf, order_pref) == OK) do_token (abuf); if (addr -> ad_next != NULL) { do_same_line (","); do_p1_addrs (addr -> ad_next); } } do_p1_mid (mid) MPDUid *mid; { msgid2rfc (mid, abuf); do_token (abuf); } do_p1_eit (eit) EncodedIT *eit; { encinfo2rfc (eit, abuf); do_token (abuf); } do_p1_priority (priority) int priority; { switch (priority) { case PRIO_NORMAL: do_token ("Normal"); break; case PRIO_URGENT: do_token ("Urgent"); break; case PRIO_NONURGENT: do_token ("Non-Urgent"); break; } } do_p1_trace (trace) Trace *trace; { if (trace->trace_next != NULL) do_p1_trace(trace->trace_next); do_key ("X400-Received"); x400trace2rfc (trace,abuf); do_token (abuf); } do_p1_fullname (fullname) FullName *fullname; { do_token (fullname->fn_addr); } do_p1_DLHistory (history) DLHistory *history; { char temp[BUFSIZ]; UTC lut; if (history -> dlh_next != NULL) do_p1_DLHistory(history -> dlh_next); do_key ("DL-Expansion-History"); (void) sprintf (abuf, "%s", history -> dlh_addr); if (history -> dlh_time != 0) { lut = utclocalise(history -> dlh_time); UTC2rfc (lut, temp); free ((char *) lut); (void) sprintf (abuf, "%s (%s)", abuf, temp); } do_token (abuf); } /* \f */ /* General purpose header output */ #define FOLD_POINT 78 do_key (key) char *key; { if (linelen > 0) fputs ("\n", fp_out); fputs (key, fp_out); fputs (": ", fp_out); linelen = strlen (key) + 2; } do_string (string) /* fold string on spaces for unstructured */ char *string; { register char *p, *q; int gap; p = string; fputs (" ", fp_out); linelen++; while (TRUE) { gap = FOLD_POINT - linelen; if (strlen (p) <= gap) { fputs (p, fp_out); linelen += strlen (p); return; } q = p + gap; while (q-- > p) { if (isspace (*q)) { *q++ = '\0'; fputs (p, fp_out); if (*q == '\0') { linelen += strlen (p); return; } fputs ("\n ", fp_out); linelen = 1; p = q; goto endloop; } } /* Won't fit.... */ if (linelen > 1) { /* try next line */ fputs ("\n ", fp_out); linelen = 1; goto endloop; } q = p + gap; while (*q++ != '\0') { if (isspace(*q)) { *q++ = '\0'; fputs (p, fp_out); if (*q == '\0') { linelen += strlen (p); return; } fputs ("\n ", fp_out); linelen = 1; p = q; goto endloop; } } /* No spaces */ fputs (p, fp_out); linelen += strlen (p); return; endloop:; } } do_same_line (token) char *token; { linelen += strlen (token); fputs (token, fp_out); } do_token (token) char *token; { linelen += strlen (token) + 1; if (linelen < FOLD_POINT) fputs (" ", fp_out); else { fputs ("\n ", fp_out); linelen = strlen (token) + 1; } fputs (token, fp_out); }