|
|
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 g
Length: 4741 (0x1285)
Types: TextFile
Names: »gen_ndr.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Src/submit/gen_ndr.c«
/* gen_ndr.c: generate the Non Delivery Notifications from submit */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Src/submit/RCS/gen_ndr.c,v 5.0 90/09/20 16:23:02 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Src/submit/RCS/gen_ndr.c,v 5.0 90/09/20 16:23:02 pp Exp Locker: pp $
*
* $Log: gen_ndr.c,v $
* Revision 5.0 90/09/20 16:23:02 pp
* rcsforce : 5.0 public release
*
*/
#include "head.h"
#include "q.h"
#include "dr.h"
#include <isode/cmd_srch.h>
extern Q_struct Qstruct;
extern char msg_fullpath[];
extern char *loc_dom_site;
extern CMD_TABLE rr_tcode[],
rr_dcode[],
rr_rcode[];
/* -- local routines -- */
void gen_ndr();
static void gen_ndrFORrecip();
static void gen_ndrFORsender();
static void set_DRvalues();
/*---------------------- Begin Routines -------------------------------- */
void gen_ndr()
{
register Q_struct *qp = &Qstruct;
PP_TRACE (("submit/gen_ndr()"));
if (qp -> Oaddress -> ad_status == AD_STAT_DRREQUIRED)
gen_ndrFORsender();
else
gen_ndrFORrecip();
}
static void gen_ndrFORsender()
{
register Q_struct *qp = &Qstruct;
register ADDR *ad,
*sender;
char errbuf[LINESIZE];
PP_TRACE (("submit/gen_ndrFORsender()"));
sender = qp -> Oaddress;
sender -> ad_status = AD_STAT_DONE;
(void) sprintf (errbuf,
"Bad sender address '%s' [%s], all recips are rejected",
sender -> ad_value, sender -> ad_parse_message);
if (qp -> queuetime == NULLUTC)
qp -> queuetime = utcnow();
for (ad = qp -> Raddress; ad != NULLADDR; ad = ad -> ad_next) {
if (ad -> ad_status == AD_STAT_DONE)
continue;
ad -> ad_status = AD_STAT_DRREQUIRED;
ad -> ad_reason = DRR_NO_REASON;
if (ad -> ad_add_info)
free (ad -> ad_add_info);
ad -> ad_add_info = NULLCP;
set_DRvalues (sender, ad, errbuf);
}
if (wr_q2drsubmit (qp, msg_fullpath) != RP_OK)
PP_LOG (LLOG_EXCEPTIONS, ("wr_q2drsubmit failed"));
return;
}
static void gen_ndrFORrecip()
{
register Q_struct *qp = &Qstruct;
register ADDR *ad,
*sender;
int recip_err = FALSE;
PP_TRACE (("submit/gen_ndrFORrecip()"));
sender = qp -> Oaddress;
if (qp -> queuetime == NULLUTC)
qp -> queuetime = utcnow();
for (ad = qp -> Raddress; ad != NULLADDR; ad = ad -> ad_next) {
if (ad -> ad_status != AD_STAT_PEND &&
ad -> ad_status != AD_STAT_DRREQUIRED)
continue;
if (rp_isbad (ad -> ad_parse_stat) ||
ad -> ad_status == AD_STAT_DRREQUIRED)
{
recip_err = TRUE;
set_DRvalues (sender, ad, NULLCP);
}
}
if (recip_err == FALSE) {
PP_TRACE (("submit/gen_ndrFORrecip (not generated)"));
return;
}
if (wr_q2drsubmit (qp, msg_fullpath) != RP_OK)
PP_LOG (LLOG_EXCEPTIONS, ("wr_q2drsubmit failed"));
return;
}
#define gval(x) ((x -> ad_type) == AD_X400_TYPE ? \
(x -> ad_r400adr) : (x -> ad_r822adr))
static void set_DRvalues (sender, recip, errstr)
ADDR *sender;
ADDR *recip;
char *errstr;
{
int maxl = LINESIZE;
char rdl, sdl, boundadd[BUFSIZ];
register Q_struct *qp = &Qstruct;
recip -> ad_type = sender -> ad_type;
if (recip -> ad_reason == DRR_NO_REASON) {
recip -> ad_reason = DRR_UNABLE_TO_TRANSFER;
recip -> ad_diagnostic = DRD_UNRECOGNISED_OR;
}
if (recip -> ad_add_info == NULLCP) {
recip -> ad_add_info = malloc ((unsigned)maxl);
bzero (recip -> ad_add_info, maxl);
if (errstr)
(void) sprintf (recip -> ad_add_info, errstr);
else
(void) sprintf (recip -> ad_add_info,
"Bad recipient address '%s' [%s]",
recip -> ad_value,
rp_valstr (recip -> ad_parse_stat));
}
if (index (gval (qp->Oaddress), '"') == NULLCP)
sdl = '"';
else if (index (gval (qp->Oaddress), '\'') == NULLCP)
sdl = '\'';
else
sdl = '`';
if (index (gval (recip), '"') == NULLCP)
rdl = '"';
else if (index (gval (recip), '\'') == NULLCP)
rdl = '\'';
else
rdl = '`';
if (recip->ad_add_info != NULLCP)
sprintf (boundadd, "reason=\"%s\" ", recip->ad_add_info);
PP_STAT (("DR chan=\"%s\" sender=%c%s%c \"%s\" recip=%c%s%c on %s \"%s\" channel=%s %s reason-code=\"%s (%d)\", diag-code=\"%s (%d)\"",
qp->inbound->li_chan->ch_name,
sdl, gval(qp->Oaddress), sdl,
qp->inbound->li_mta,
rdl, gval(recip), rdl,
(recip->ad_outchan && recip->ad_outchan->li_chan) ? recip->ad_outchan->li_chan->ch_name : "submission",
(recip->ad_outchan) ? recip->ad_outchan->li_mta : loc_dom_site,
"submit",
(recip->ad_add_info != NULLCP) ? boundadd : "",
rcmd_srch(recip->ad_reason, rr_rcode), recip->ad_reason,
rcmd_srch(recip->ad_diagnostic, rr_dcode), recip->ad_diagnostic));
}