|
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 s
Length: 9855 (0x267f) Types: TextFile Names: »submit_chk.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Src/submit/submit_chk.c«
/* submit_chk.c: checks done by submit */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Src/submit/RCS/submit_chk.c,v 5.0 90/09/20 16:23:15 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Src/submit/RCS/submit_chk.c,v 5.0 90/09/20 16:23:15 pp Exp Locker: pp $ * * $Log: submit_chk.c,v $ * Revision 5.0 90/09/20 16:23:15 pp * rcsforce : 5.0 public release * */ #include "head.h" #include "q.h" #include "dr.h" /* -- externals -- */ extern char *cont_p22; extern Q_struct Qstruct; extern void message_failure(); /* -- local routines -- */ void check_conversions(); void check_crits(); void check_dr_crits(); int check_crit(); static void check_extn_crits(); static void check_q_crits(); static void check_rrinfo_crits(); /* --------------------- Begin Routines -------------------------------- */ int check_crit (this, mask, qp, adr, str) char this, mask; Q_struct *qp; ADDR *adr; /* if NULLADDR and fail, fail total message */ char *str; { char buf[BUFSIZ]; (void) sprintf (buf, "We do not support criticality of '%s'", str); if (this != 0 && (this & (~mask))) { /* fail on critical */ if (adr == NULLADDR) message_failure (DRR_UNABLE_TO_TRANSFER, DRD_UNSUPPORTED_CRITICAL_FUNCTION, buf); else { if (adr -> ad_status == AD_STAT_PEND) { adr -> ad_status = AD_STAT_DRREQUIRED; adr -> ad_reason = DRR_UNABLE_TO_TRANSFER; adr -> ad_diagnostic = DRD_UNSUPPORTED_CRITICAL_FUNCTION; adr -> ad_add_info = strdup(buf); } } return NOTOK; } return OK; } void check_crits (qp) register Q_struct *qp; { ADDR *ix = qp -> Raddress; check_extn_crits (qp, qp -> per_message_extensions, "per_message_extensions"); while (ix != NULLADDR) { if (ix -> ad_status == AD_STAT_PEND) check_q_crits (qp, ix); ix = ix -> ad_next; } } void check_dr_crits (dr) DRmpdu *dr; { Rrinfo *ix = dr -> dr_recip_list; check_extn_crits (&Qstruct, dr->dr_per_envelope_extensions, "per_envelope_extensions"); check_extn_crits (&Qstruct, dr -> dr_per_report_extensions, "per_report_extensions"); while (ix != (Rrinfo *) NULL) { check_rrinfo_crits (dr, ix); ix = ix -> rr_next; } } void check_conversions (qp) register Q_struct *qp; { ADDR *ix; LIST_RCHAN *chan; int cont; if (qp -> implicit_conversion == TRUE) { ix = qp -> Raddress; while (ix != NULLADDR) { if (ix -> ad_status == AD_STAT_PEND && ix -> ad_fmtchan != NULLIST_RCHAN) { chan = ix -> ad_fmtchan; cont = TRUE; while (cont == TRUE && chan != NULLIST_RCHAN) { switch (chan -> li_chan -> ch_conversion) { case CH_CONV_CONVERT: case CH_CONV_WITHLOSS: /* fail this recipient */ ix -> ad_status = AD_STAT_DRREQUIRED; ix -> ad_reason = DRR_UNABLE_TO_TRANSFER; ix -> ad_diagnostic = DRD_CONVERSION_PROHIBITED; ix -> ad_add_info = strdup("Conversion of this message was prohibited"); cont = FALSE; default: break; } chan = chan -> li_next; } } ix = ix -> ad_next; } } if (qp -> conversion_with_loss_prohibited == TRUE) { ix = qp -> Raddress; while (ix != NULLADDR) { if (ix -> ad_status == AD_STAT_PEND && ix -> ad_fmtchan != NULLIST_RCHAN) { chan = ix -> ad_fmtchan; cont = TRUE; while (cont == TRUE && chan != NULLIST_RCHAN) { if (chan -> li_chan -> ch_conversion == CH_CONV_WITHLOSS) { /* fail this recipient */ ix -> ad_status = AD_STAT_DRREQUIRED; ix -> ad_reason = DRR_UNABLE_TO_TRANSFER; ix -> ad_diagnostic = DRD_CONVERSION_PROHIBITED; ix -> ad_add_info = strdup("Conversion of this message would incur loss of information"); cont = FALSE; } chan = chan -> li_next; } } ix = ix -> ad_next; } } } /* --------------------- Static Routines -------------------------------- */ static void check_rrinfo_crits (dr, rr) register DRmpdu *dr; register Rrinfo *rr; { char mask = CRITICAL_SUBMISSION; ADDR *adr = Qstruct.Raddress; CHAN *outchan; Extension *ix; while (adr != NULLADDR && adr -> ad_no != rr -> rr_recip) adr = adr -> ad_next; if (adr == NULLADDR) return; /* --- *** --- ad_outchan may be missing if msg is a x400 DR & its Recip is invalid --- *** --- */ if (adr -> ad_outchan == NULLIST_RCHAN || adr -> ad_outchan -> li_chan == NULLCHAN) return; outchan = adr -> ad_outchan -> li_chan; if (lexequ (outchan -> ch_content_out, cont_p22) == 0) mask = mask | CRITICAL_TRANSFER | CRITICAL_DELIVERY; else if (outchan -> ch_access == CH_MTS) mask = mask | CRITICAL_DELIVERY; if (check_crit (dr -> dr_dl_history_crit, mask, &Qstruct, adr, "dr_dl_history_crit") == NOTOK) return; if (check_crit (dr -> dr_reporting_dl_name_crit, mask, &Qstruct, adr, "dr_reporting_dl_name_crit") == NOTOK) return; if (check_crit (dr -> dr_security_label_crit, mask, &Qstruct, adr, "dr_security_label_crit") == NOTOK) return; if (check_crit (dr -> dr_reporting_mta_certificate_crit, mask, &Qstruct, adr, "dr_reporting_mta_certificate_crit") == NOTOK) return; if (check_crit (dr -> dr_report_origin_auth_check_crit, mask, &Qstruct, adr, "dr_report_origin_auth_check_crit") == NOTOK) return; if (check_crit (rr -> rr_redirect_history_crit, mask, &Qstruct, adr, "rr_redirect_history_crit") == NOTOK) return; if (check_crit (rr -> rr_physical_fwd_addr_crit, mask, &Qstruct, adr, "rr_physical_fwd_addr_crit") == NOTOK) return; if (check_crit (rr -> rr_recip_certificate_crit, mask, &Qstruct, adr, "rr_recip_certificate_crit") == NOTOK) return; if (check_crit (rr -> rr_report_origin_authentication_check_crit, mask, &Qstruct, adr, "rr_report_origin_authentication_check_crit") == NOTOK) return; ix = rr -> rr_per_recip_extensions; while (ix != NULL) { if (check_crit (ix -> ext_criticality, CRITICAL_SUBMISSION, &Qstruct, adr, "rr_per_recip_extensions") == NOTOK) return; ix = ix -> ext_next; } } static void check_q_crits (qp, adr) register Q_struct *qp; register ADDR *adr; { char mask = CRITICAL_SUBMISSION; CHAN *outchan = adr -> ad_outchan -> li_chan; Extension *ix; if (lexequ (outchan -> ch_content_out, cont_p22) == 0) mask = mask | CRITICAL_TRANSFER | CRITICAL_DELIVERY; else if (outchan -> ch_access == CH_MTS) mask = mask | CRITICAL_DELIVERY; if (check_crit (qp -> latest_time_crit, mask, qp, adr, "latest_time") == NOTOK) return; if (check_crit(qp -> recip_reassign_crit, mask, qp, adr, "recipient reassignment") == NOTOK) return; if (check_crit (qp -> dl_expansion_crit, mask, qp, adr, "dl expansion") == NOTOK) return; if (check_crit (qp -> conversion_with_loss_crit, mask, qp, adr, "conversion_with_loss") == NOTOK) return; if (check_crit (qp -> content_correlator_crit, mask, qp, adr, "content_correlator") == NOTOK) return; if (check_crit(qp -> originator_return_address_crit, mask, qp, adr, "originator_return_address") == NOTOK) return; if (check_crit(qp -> forwarding_request_crit, mask, qp, adr, "forwarding_request") == NOTOK) return; if (check_crit(qp -> originator_certificate_crit, mask, qp, adr, "originator_certificate") == NOTOK) return; if (check_crit(qp -> algorithm_identifier_crit, mask, qp, adr, "algorithm_identifier") == NOTOK) return; if (check_crit(qp -> message_origin_auth_check_crit, mask, qp, adr, "message_origin_auth_check") == NOTOK) return; if (check_crit(qp -> security_label_crit, mask, qp, adr, "security_label") == NOTOK) return; if (check_crit(qp -> proof_of_submission_crit, mask, qp, adr, "proof_of_submission") == NOTOK) return; if (check_crit (qp -> dl_expansion_history_crit, mask, qp, adr, "dl_expansion_history") == NOTOK) return; /* now do addr crits */ if (check_crit( adr -> ad_orig_req_alt_crit, mask, qp, adr, "ad_orig_req_alt") == NOTOK) return; if (check_crit (adr -> ad_req_del_crit, mask, qp, adr, "ad_req_del_crit") == NOTOK) return; if (check_crit (adr -> ad_phys_forward_crit, mask, qp, adr, "ad_phys_forward") == NOTOK) return; if (check_crit (adr -> ad_phys_fw_ad_crit, mask, qp, adr, "ad_phys_fw_ad") == NOTOK) return; if (check_crit (adr -> ad_phys_modes_crit, mask, qp, adr, "ad_phys_modes") == NOTOK) return; if (check_crit (adr -> ad_reg_mail_type_crit, mask, qp, adr, "ad_reg_mail_type") == NOTOK) return; if (check_crit (adr -> ad_recip_number_for_advice_crit, mask, qp, adr, "ad_recip_number_for_advice") == NOTOK) return; if (check_crit (adr -> ad_phys_rendition_attribs_crit, mask, qp, adr, "ad_phys_rendition_attribs") == NOTOK) return; if (check_crit (adr -> ad_pd_report_request_crit, mask, qp, adr, "ad_pd_report_request") == NOTOK) return; if (check_crit (adr -> ad_redirection_history_crit, mask, qp, adr, "ad_redirection_history") == NOTOK) return; if (check_crit (adr -> ad_message_token_crit, mask, qp, adr, "ad_message_token") == NOTOK) return; if (check_crit (adr -> ad_content_integrity_crit, mask, qp, adr, "ad_content_integrity") == NOTOK) return; if (check_crit (adr -> ad_proof_delivery_crit, mask, qp, adr, "ad_proof_delivery") == NOTOK) return; ix = adr -> ad_per_recip_ext_list; while (ix != NULL) { if (check_crit (ix -> ext_criticality, CRITICAL_SUBMISSION, qp, adr, "ad_per_recip_ext") == NOTOK) return; ix = ix -> ext_next; } } static void check_extn_crits (qp, ix, buf) Q_struct *qp; register Extension *ix; char *buf; { while (ix != NULL) { if (check_crit(ix -> ext_criticality, CRITICAL_SUBMISSION, qp, NULLADDR, buf) == NOTOK) return; ix = ix -> ext_next; } }