|
|
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 p
Length: 28155 (0x6dfb)
Types: TextFile
Names: »pptox400.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Chans/x40088/pptox400.c«
/* pptox400.c: convert PP structures to X.400 88 structures */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/x40088/RCS/pptox400.c,v 5.0 90/09/20 15:57:33 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Chans/x40088/RCS/pptox400.c,v 5.0 90/09/20 15:57:33 pp Exp Locker: pp $
*
* $Log: pptox400.c,v $
* Revision 5.0 90/09/20 15:57:33 pp
* rcsforce : 5.0 public release
*
*/
#include "util.h"
#include "q.h"
#include "adr.h"
#include "dr.h"
#include "Transfer-types.h"
#include "or.h"
#include <isode/cmd_srch.h>
#include <rtsparams.h>
#define STR2QB(s) str2qb(s, strlen(s), 1)
static struct type_MTA_MessageTransferEnvelope *build_envelope ();
static struct type_MTA_MTSIdentifier *build_msgid ();
struct type_MTA_ORName *build_addr ();
static struct type_MTA_EncodedInformationTypes *build_eits ();
static struct type_MTA_BuiltInContentType *build_content ();
static PE build_pmf ();
struct type_UNIV_UTCTime *build_time ();
static struct element_MTA_5 *build_recips ();
static PE build_ri ();
static struct type_MTA_TraceInformation *build_trace ();
struct type_MTA_GlobalDomainIdentifier *build_gdi ();
struct type_MTA_Extensions *build_pm_extensions ();
struct type_MTA_Extensions *build_prf_ext ();
static struct type_MTA_ORName *conv_or ();
static struct type_MTA_ReportTransferEnvelope *build_drenvelope ();
static struct type_MTA_ReportTransferContent *build_drcontent ();
static struct element_MTA_10 *build_drc_pr_fields ();
static struct type_MTA_LastTraceInformation *build_lasttrace ();
static struct type_MTA_Report *build_report ();
struct type_MTA_ORName *build_fullname ();
static void add_eeit ();
struct type_Transfer_MtsAPDU *build_p1 (qp, adl)
Q_struct *qp;
ADDR *adl;
{
struct type_Transfer_MtsAPDU *p1;
p1 = (struct type_Transfer_MtsAPDU *) smalloc (sizeof *p1);
bzero ((char *)p1, sizeof *p1);
p1 -> offset = type_Transfer_MtsAPDU_message;
p1 -> un.message = (struct type_Transfer_MessageAPDU *)
smalloc (sizeof *p1 -> un.message);
p1 -> un.message -> envelope = build_envelope (qp, adl);
p1 -> un.message -> content = NULL;
return p1;
}
struct type_Transfer_MtsAPDU *build_dr (qp, recip, dr)
Q_struct *qp;
ADDR *recip;
DRmpdu *dr;
{
struct type_Transfer_MtsAPDU *p1dr;
p1dr = (struct type_Transfer_MtsAPDU *) smalloc (sizeof *p1dr);
bzero ((char *)p1dr, sizeof *p1dr);
p1dr -> offset = type_Transfer_MtsAPDU_report;
p1dr -> un.report = (struct type_Transfer_ReportAPDU *)
smalloc (sizeof *p1dr -> un.report);
p1dr -> un.report -> envelope = build_drenvelope (qp, dr);
p1dr -> un.report -> content = build_drcontent (qp, recip, dr);
return p1dr;
}
static struct type_MTA_MessageTransferEnvelope *build_envelope (qp, adl)
Q_struct *qp;
ADDR *adl;
{
struct type_MTA_MessageTransferEnvelope *env;
env = (struct type_MTA_MessageTransferEnvelope *)
smalloc (sizeof *env);
bzero ((char *)env, sizeof *env);
env -> message__identifier = build_msgid (&qp->msgid);
env -> originator__name = build_addr (qp -> Oaddress -> ad_r400adr);
env -> original__encoded__information__types =
build_eits (&qp -> encodedinfo);
env -> content__type = build_content (adl -> ad_content ?
adl -> ad_content :
qp -> cont_type);
if (qp -> ua_id)
env -> content__identifier =
STR2QB (qp -> ua_id);
env -> priority = (struct type_MTA_Priority *)
smalloc (sizeof *env -> priority);
env -> priority -> parm = qp -> priority;
env -> per__message__indicators = build_pmf (qp);
if (qp -> defertime)
env -> deferred__delivery__time =
build_time (qp -> defertime);
env -> per__domain__bilateral__information = NULL;
env -> extensions = build_pm_extensions (qp);
env -> trace__information = build_trace (qp->trace);
env -> per__recipient__fields = build_recips (qp -> Raddress, adl,
qp->disclose_recips);
return env;
}
static struct type_MTA_MTSIdentifier *build_msgid (mid)
MPDUid *mid;
{
struct type_MTA_MTSIdentifier *p1msgid;
p1msgid = (struct type_MTA_MTSIdentifier *) smalloc (sizeof *p1msgid);
bzero ((char *)p1msgid, sizeof *p1msgid);
if (mid -> mpduid_string)
p1msgid -> local__identifier =
STR2QB (mid -> mpduid_string);
p1msgid -> global__domain__identifier =
build_gdi (&mid -> mpduid_DomId);
return p1msgid;
}
struct type_MTA_ORName *build_addr (cp)
char *cp;
{
OR_ptr or;
struct type_MTA_ORName *orname;
if ((or = or_std2or (cp)) == NULLOR) {
PP_LOG (LLOG_EXCEPTIONS, ("Can't convert %s", cp));
return NULL;
}
orname = conv_or (or);
or_free (or);
return orname;
}
static struct type_MTA_EncodedInformationTypes *build_eits (eit)
EncodedIT *eit;
{
struct type_MTA_EncodedInformationTypes *p1eit;
LIST_BPT *ep;
int n, internal;
extern CMD_TABLE bptbl_body_parts88[];
if (eit == NULL)
return NULL;
p1eit = (struct type_MTA_EncodedInformationTypes *)
smalloc (sizeof *p1eit);
bzero ((char *)p1eit, sizeof *p1eit);
p1eit -> built__in__encoded__information__types = NULL;
p1eit -> external__encoded__information__types = NULL;
internal = 0;
for (ep = eit -> eit_types; ep; ep = ep -> li_next) {
if ((n = cmd_srch (ep -> li_name, bptbl_body_parts88)) != -1) {
if (n <= 15 )
internal |= n;
}
else
add_eeit (&p1eit -> external__encoded__information__types,
ep -> li_name);
}
{
char *str = int2strb (internal, 12);
p1eit -> built__in__encoded__information__types =
strb2bitstr (str, 12, PE_CLASS_UNIV, PE_PRIM_BITS);
}
return p1eit;
}
static void add_eeit (eep, oidn)
struct type_MTA_ExternalEncodedInformationTypes **eep;
char *oidn;
{
if (*eep == NULL) {
*eep = (struct type_MTA_ExternalEncodedInformationTypes *)
calloc (1, sizeof **eep);
(*eep) -> ExternalEncodedInformationType = str2oid (oidn);
}
else {
struct type_MTA_ExternalEncodedInformationTypes *ep;
for (ep = *eep; ep -> next; ep = ep -> next)
continue;
ep -> next = (struct type_MTA_ExternalEncodedInformationTypes *)
calloc (1, sizeof *ep);
ep -> next -> ExternalEncodedInformationType =
str2oid (oidn);
}
}
static struct type_MTA_BuiltInContentType *build_content (str)
char *str;
{
struct type_MTA_BuiltInContentType *bict;
bict = (struct type_MTA_BuiltInContentType *) smalloc (sizeof *bict);
bzero ((char *)bict, sizeof *bict);
if (lexequ (str, "p2") == 0)
bict -> parm =
int_MTA_BuiltInContentType_interpersonal__messaging__1984;
else if (lexequ (str, "p22") == 0)
bict -> parm =
int_MTA_BuiltInContentType_interpersonal__messaging__1988;
else if (lexequ (str, "external") == 0)
bict -> parm = int_MTA_BuiltInContentType_external;
else bict -> parm = int_MTA_BuiltInContentType_unidentified;
return bict;
}
static PE build_pmf (qp)
Q_struct *qp;
{
PE pe;
pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_BITS);
if (qp -> disclose_recips)
bit_on (pe, bit_MTA_PerMessageIndicators_disclosure__of__recipients);
if (qp -> implicit_conversion)
bit_on (pe, bit_MTA_PerMessageIndicators_implicit__conversion__prohibited);
if (qp -> alternate_recip_allowed)
bit_on (pe, bit_MTA_PerMessageIndicators_alternate__recipient__allowed);
if (qp -> content_return_request)
bit_on (pe, bit_MTA_PerMessageIndicators_content__return__request);
return pe;
}
struct type_UNIV_UTCTime *build_time (utc)
UTC utc;
{
struct type_UNIV_UTCTime *ut;
char *str;
str = utct2str (utc);
ut = STR2QB (str);
return ut;
}
static struct element_MTA_5 *build_recips (ad, adl, disclose)
ADDR *ad;
ADDR *adl;
int disclose;
{
struct element_MTA_5 *rl = NULL, *rlbase = NULL;
struct type_MTA_PerRecipientMessageTransferFields *prmtf;
ADDR *ap, *ap2;
int resp;
for (ap = ad; ap; ap = ap -> ad_next) {
for (ap2 = adl; ap2; ap2 = ap2 -> ad_next) {
if (ap2 -> ad_no == ap -> ad_no)
break;
}
if (ap2 == NULLADDR) {
if (disclose == 0)
continue;
else
resp = FALSE;
}
else resp = ap2 -> ad_resp;
if (rlbase == NULL)
rl = rlbase = (struct element_MTA_5 *)
smalloc (sizeof *rl);
else {
rl -> next = (struct element_MTA_5 *)
smalloc (sizeof *rl);
rl = rl -> next;
}
bzero ((char *)rl, sizeof *rl);
prmtf = rl -> PerRecipientMessageTransferFields =
(struct type_MTA_PerRecipientMessageTransferFields *)
smalloc (sizeof *prmtf);
prmtf -> recipient__name = build_addr (ap -> ad_r400adr);
prmtf -> originally__specified__recipient__number =
(struct type_MTA_OriginallySpecifiedRecipientNumber *)
smalloc (sizeof *prmtf ->
originally__specified__recipient__number);
prmtf -> originally__specified__recipient__number -> parm =
ap -> ad_extension;
if (ap -> ad_explicitconversion != AD_EXP_NONE) {
prmtf -> explicit__conversion =
(struct type_MTA_ExplicitConversion *)
smalloc (sizeof *prmtf -> explicit__conversion);
prmtf -> explicit__conversion -> parm =
ap -> ad_explicitconversion;
}
else prmtf -> explicit__conversion = NULL;
prmtf -> per__recipient__indicators = build_ri (resp,
ad -> ad_mtarreq,
ad -> ad_usrreq);
prmtf -> extensions = build_prf_ext (ap);
}
return rlbase;
}
static PE build_ri (resp, mta, usr)
int resp, mta, usr;
{
PE pe;
pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_BITS);
if (resp)
bit_on (pe,
bit_MTA_PerRecipientIndicators_responsibility);
switch (mta) {
case AD_MTA_NONE:
break;
case AD_MTA_BASIC:
bit_on (pe,
bit_MTA_PerRecipientIndicators_originating__MTA__non__delivery__report);
break;
case AD_MTA_CONFIRM:
bit_on (pe,
bit_MTA_PerRecipientIndicators_originating__MTA__report);
break;
case AD_MTA_AUDIT_CONFIRM:
bit_on (pe,
bit_MTA_PerRecipientIndicators_originating__MTA__non__delivery__report);
bit_on (pe,
bit_MTA_PerRecipientIndicators_originating__MTA__report);
break;
}
switch (usr) {
case AD_USR_NOREPORT:
break;
case AD_USR_BASIC:
bit_on (pe,
bit_MTA_PerRecipientIndicators_originator__non__delivery__report);
break;
case AD_USR_CONFIRM:
bit_on (pe,
bit_MTA_PerRecipientIndicators_originator__report);
}
return pe;
}
static struct type_MTA_TraceInformationElement *build_traceelement (tp)
Trace *tp;
{
struct type_MTA_TraceInformationElement *tie;
struct type_MTA_DomainSuppliedInformation *dsi;
DomSupInfo *dsp;
tie = (struct type_MTA_TraceInformationElement *)
smalloc (sizeof *tie);
bzero ((char *)tie, sizeof *tie);
tie -> global__domain__identifier =
build_gdi (&tp -> trace_DomId);
dsp = &tp -> trace_DomSinfo;
dsi = tie -> domain__supplied__information =
(struct type_MTA_DomainSuppliedInformation *)
smalloc (sizeof *tie ->
domain__supplied__information);
bzero ((char *)dsi, sizeof *dsi);
if (dsp -> dsi_time)
dsi -> arrival__time = build_time (dsp -> dsi_time);
dsi -> routing__action =
(struct type_MTA_RoutingAction *)
smalloc (sizeof *dsi -> routing__action);
if (dsp -> dsi_action)
dsi -> routing__action -> parm = dsp -> dsi_action;
else dsi -> routing__action -> parm =
int_MTA_RoutingAction_relayed;
if (dsp -> dsi_attempted_md.global_Country != NULLCP &&
dsp -> dsi_attempted_md.global_Admin != NULLCP)
dsi -> attempted__domain =
build_gdi (&dsp -> dsi_attempted_md);
if (dsp -> dsi_deferred)
dsi -> deferred__time =
build_time (dsp -> dsi_deferred);
if (dsp -> dsi_converted.eit_types)
dsi -> converted__encoded__information__types =
build_eits (&dsp -> dsi_converted);
if (dsp -> dsi_other_actions) {
dsi -> other__actions =
pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM,
PE_PRIM_BITS);
if (dsp -> dsi_other_actions & ACTION_REDIRECTED)
bit_on (dsi -> other__actions,
bit_MTA_OtherActions_redirected);
if (dsp -> dsi_other_actions & ACTION_EXPANDED)
bit_on (dsi -> other__actions,
bit_MTA_OtherActions_dl__operation);
}
return tie;
}
int same_prmd (tp1, tp2)
Trace *tp1, *tp2;
{
GlobalDomId *d1, *d2;
d1 = &tp1 -> trace_DomId;
d2 = &tp2 -> trace_DomId;
if (d1 -> global_Country && d2 -> global_Country &&
lexequ (d1 -> global_Country, d2 -> global_Country) == 0 &&
d1 -> global_Admin && d2 -> global_Admin &&
lexequ (d1 -> global_Admin, d2 -> global_Admin) == 0) {
if (d1 -> global_Private == NULL &&
d2 -> global_Private == NULL)
return 1;
if (d1 -> global_Private && d2 -> global_Private &&
lexequ (d1 -> global_Private, d2 -> global_Private) == 0)
return 1;
}
return 0;
}
static struct type_MTA_TraceInformation *build_trace (trp)
Trace *trp;
{
Trace *tp, *tlast;
struct type_MTA_TraceInformation *trace = NULL, *tbase = NULL;
extern int trace_type;
for (tlast = trp; tlast && tlast -> trace_next;
tlast = tlast -> trace_next)
continue;
if (trace_type == RTSP_TRACE_ADMD) {
if (tlast != trp && same_prmd (tlast, trp))
tp = trp;
else tp = tlast;
tbase = (struct type_MTA_TraceInformation *)
smalloc (sizeof *trace);
tbase -> next = NULL;
tbase -> TraceInformationElement =
build_traceelement (tp);
return tbase;
}
for (tp = trp; tp; tp = tp -> trace_next) {
if (tbase == NULL)
tbase = trace =
(struct type_MTA_TraceInformation *)
smalloc (sizeof *trace);
else {
trace -> next =
(struct type_MTA_TraceInformation *)
smalloc (sizeof *trace);
trace = trace -> next;
}
bzero ((char *)trace, sizeof *trace);
trace -> TraceInformationElement =
build_traceelement(tp);
}
return tbase;
}
struct type_MTA_GlobalDomainIdentifier *build_gdi (gdi)
GlobalDomId *gdi;
{
struct type_MTA_GlobalDomainIdentifier *p1gdi;
struct type_MTA_AdministrationDomainName *admd;
struct type_MTA_CountryName *co;
struct type_MTA_PrivateDomainIdentifier *prmd;
p1gdi = (struct type_MTA_GlobalDomainIdentifier *)
smalloc (sizeof *p1gdi);
bzero ((char *)p1gdi, sizeof *p1gdi);
if (gdi -> global_Country) {
p1gdi -> country__name = co =
(struct type_MTA_CountryName *)
smalloc (sizeof *co);
co -> offset = type_MTA_CountryName_iso__3166__alpha2__code;
co -> un.iso__3166__alpha2__code =
STR2QB (gdi -> global_Country);
}
else
PP_LOG (LLOG_EXCEPTIONS, ("Country missing from GDI"));
if (gdi -> global_Admin) {
p1gdi -> administration__domain__name = admd =
(struct type_MTA_AdministrationDomainName *)
smalloc (sizeof *admd);
admd -> offset = type_MTA_AdministrationDomainName_printable;
admd -> un.printable = STR2QB (gdi -> global_Admin);
}
else
PP_LOG (LLOG_EXCEPTIONS, ("ADMD missing from GDI"));
if (gdi -> global_Private) {
p1gdi -> private__domain__identifier = prmd =
(struct type_MTA_PrivateDomainIdentifier *)
smalloc (sizeof *prmd);
prmd -> offset = type_MTA_PrivateDomainIdentifier_printable;
prmd -> un.printable = STR2QB (gdi -> global_Private);
}
return p1gdi;
}
static struct type_MTA_ORName *conv_or (or_tree)
OR_ptr or_tree;
{
struct type_MTA_ORName *orname;
OR_ptr or;
orname = (struct type_MTA_ORName *) smalloc (sizeof *orname);
bzero ((char *)orname, sizeof *orname);
for (or = or_tree; or; or = or -> or_next) {
if (or -> or_type == OR_DD &&
or -> or_encoding == OR_ENC_PS)
build_dd_or (&orname -> domain__defined, or);
else if (or -> or_type < OR_GQ)
build_std_or (&orname -> standard__attributes, or);
else if (or -> or_type == OR_CN)
build_cn_or (&orname -> directory__name, or);
else
build_ext_or (&orname -> extension__attributes, or);
}
return orname;
}
build_std_or (std, or)
struct type_MTA_StandardAttributes **std;
OR_ptr or;
{
if (*std == NULL) {
*std = (struct type_MTA_StandardAttributes *)
smalloc (sizeof **std);
bzero ((char *)*std, sizeof **std);
}
switch (or -> or_type) {
case OR_C:
{
struct type_MTA_CountryName *co;
if ((*std) -> country__name) {
PP_LOG (LLOG_EXCEPTIONS,
("two country attribues"));
return;
}
co = (struct type_MTA_CountryName *)
smalloc (sizeof *co);
co -> offset = type_MTA_CountryName_iso__3166__alpha2__code;
co -> un.iso__3166__alpha2__code =
STR2QB (or -> or_value);
(*std) -> country__name = co;
}
break;
case OR_ADMD:
{
struct type_MTA_AdministrationDomainName *admd;
if ((*std) -> administration__domain__name != NULL) {
PP_LOG (LLOG_EXCEPTIONS,
("Already got an ADMD"));
return;
}
admd = (*std) -> administration__domain__name =
(struct type_MTA_AdministrationDomainName *)
smalloc (sizeof *admd);
admd -> offset =
type_MTA_AdministrationDomainName_printable;
admd -> un.printable = STR2QB (or -> or_value);
}
break;
case OR_PRMD:
{
struct type_MTA_PrivateDomainName *prmd;
if ((*std) -> private__domain__name != NULL ){
PP_LOG (LLOG_EXCEPTIONS,
("Already got a PRMD"));
return;
}
prmd = (*std) -> private__domain__name =
(struct type_MTA_PrivateDomainName *)
smalloc (sizeof *prmd);
prmd -> offset = type_MTA_PrivateDomainName_printable;
prmd -> un.printable = STR2QB (or-> or_value);
}
break;
case OR_O:
{
if ((*std) -> organization__name != NULL) {
PP_LOG (LLOG_EXCEPTIONS,
("Already got an Organization"));
return;
}
(*std) -> organization__name = STR2QB (or -> or_value);
}
break;
case OR_OU:
{
struct type_MTA_OrganizationalUnitNames *ou, **oup;
for (oup = &(*std) -> organizational__unit__names;
*oup; oup = &(*oup) -> next)
continue;
ou = (struct type_MTA_OrganizationalUnitNames *)
smalloc (sizeof *ou);
ou -> OrganizationUnitName = STR2QB (or -> or_value);
ou -> next = NULL;
*oup = ou;
}
break;
case OR_X121:
{
if ((*std) -> network__address == NULL) {
PP_LOG (LLOG_EXCEPTIONS,
("Extra X121 id"));
return;
}
(*std) -> network__address = STR2QB (or -> or_value);
}
break;
case OR_TID:
{
if ((*std) -> terminal__identifier != NULL) {
PP_LOG (LLOG_EXCEPTIONS,
("Extra terminal identifier"));
return;
}
(*std) -> terminal__identifier = STR2QB (or -> or_value);
}
break;
case OR_UAID:
{
if ((*std) -> numeric__user__identifier != NULL) {
PP_LOG (LLOG_EXCEPTIONS,
("extra numeric user id"));
return;
}
(*std) -> numeric__user__identifier =
STR2QB (or -> or_value);
}
break;
case OR_S:
case OR_G:
case OR_I:
case OR_GQ:
{
struct type_MTA_PersonalName *pn;
if ((*std) -> personal__name == NULL) {
pn = (*std) -> personal__name =
(struct type_MTA_PersonalName *)
smalloc (sizeof *pn);
bzero ((char *)pn, sizeof *pn);
}
else pn = (*std) -> personal__name;
switch (or -> or_type) {
case OR_S:
pn -> surname = STR2QB (or -> or_value);
break;
case OR_G:
pn -> given__name = STR2QB (or -> or_value);
break;
case OR_I:
pn -> initials = STR2QB (or -> or_value);
break;
case OR_GQ:
pn -> generation__qualifier =
STR2QB (or -> or_value);
break;
}
}
break;
default:
PP_LOG (LLOG_EXCEPTIONS, ("Bad type %d", or -> or_type));
break;
}
}
build_cn_or (dn, or) /* XXX */
OR_ptr or;
{
}
build_dd_or (domd, or)
struct type_MTA_DomainDefinedAttributes **domd;
OR_ptr or;
{
struct type_MTA_DomainDefinedAttributes **ddp, *dp;
for (ddp = domd; *ddp; ddp = &(*ddp) -> next)
continue;
dp = (struct type_MTA_DomainDefinedAttributes *)
smalloc (sizeof *dp);
dp -> DomainDefinedAttribute =
(struct type_MTA_DomainDefinedAttribute *)
smalloc (sizeof *dp -> DomainDefinedAttribute);
dp -> next = NULL;
dp -> DomainDefinedAttribute -> type = STR2QB (or -> or_ddname);
dp -> DomainDefinedAttribute -> value = STR2QB (or -> or_value);
*ddp = dp;
}
build_ext_or (ext, or) /* XXX */
OR_ptr or;
{
}
static struct type_MTA_ReportTransferEnvelope *build_drenvelope (qp, dr)
Q_struct *qp;
DRmpdu *dr;
{
struct type_MTA_ReportTransferEnvelope *env;
env = (struct type_MTA_ReportTransferEnvelope *)
smalloc (sizeof *env);
bzero ((char *)env, sizeof *env);
env -> report__identifier = build_msgid (dr -> dr_mpduid);
env -> report__destination__name = build_addr (qp -> Oaddress -> ad_r400adr);
env -> trace__information = build_trace (dr -> dr_trace);
env -> extensions = NULL;
return env;
}
static struct type_MTA_ReportTransferContent *build_drcontent (qp, recip, dr)
Q_struct *qp;
ADDR *recip;
DRmpdu *dr;
{
struct type_MTA_ReportTransferContent *drc;
drc = (struct type_MTA_ReportTransferContent *) smalloc (sizeof *drc);
bzero ((char *)drc, sizeof *drc);
drc -> subject__identifier = build_msgid (&qp -> msgid);
drc -> subject__intermediate__trace__information =
build_trace (dr -> dr_subject_intermediate_trace);
drc -> original__encoded__information__types =
build_eits (&qp -> encodedinfo);
if (qp -> cont_type || recip -> ad_content)
drc -> content__type = build_content (qp -> cont_type);
if (qp -> ua_id)
drc -> content__identifier = STR2QB (qp -> ua_id);
drc -> returned__content = NULL; /* XXX */
drc -> additional__information = NULLPE;
drc -> extensions = NULL;
drc -> per__recipient__fields =
build_drc_pr_fields (qp, recip, dr -> dr_recip_list);
return drc;
}
static struct element_MTA_10 *build_drc_pr_fields (qp, recip, rr)
Q_struct *qp;
ADDR *recip;
Rrinfo *rr;
{
struct element_MTA_10 *prf;
struct type_MTA_PerRecipientReportTransferFields *pr;
ADDR *ap;
if (rr == NULL)
return NULL;
for (ap = qp -> Raddress; ap; ap = ap -> ad_next)
if (ap -> ad_no == rr -> rr_recip)
break;
if (ap == NULLADDR)
return build_drc_pr_fields (qp, recip, rr -> rr_next);
prf = (struct element_MTA_10 *) smalloc (sizeof *prf);
prf -> PerRecipientReportTransferFields = pr =
(struct type_MTA_PerRecipientReportTransferFields *)
smalloc (sizeof *pr);
bzero ((char *)pr, sizeof *pr);
pr -> actual__recipient__name = build_addr (ap -> ad_r400adr);
pr -> originally__specified__recipient__number =
(struct type_MTA_OriginallySpecifiedRecipientNumber *)
smalloc (sizeof *pr ->
originally__specified__recipient__number);
pr -> originally__specified__recipient__number -> parm =
ap -> ad_extension;
pr -> per__recipient__indicators = build_ri (ap -> ad_resp,
ap -> ad_mtarreq,
ap -> ad_usrreq);
pr -> last__trace__information = build_lasttrace (rr);
if (rr -> rr_originally_intended_recip)
pr -> originally__intended__recipient__name =
build_fullname (rr -> rr_originally_intended_recip);
if (rr -> rr_supplementary)
pr -> supplementary__information =
STR2QB (rr -> rr_supplementary);
pr -> extensions = NULL;
prf -> next = build_drc_pr_fields (qp, recip, rr -> rr_next);
return prf;
}
static struct type_MTA_LastTraceInformation *build_lasttrace (rr)
Rrinfo *rr;
{
struct type_MTA_LastTraceInformation *lti;
lti = (struct type_MTA_LastTraceInformation *)
smalloc (sizeof *lti);
bzero ((char *)lti, sizeof *lti);
lti -> arrival__time = build_time (rr -> rr_arrival);
if (rr -> rr_converted)
lti -> converted__encoded__information__types =
build_eits (rr -> rr_converted);
lti -> report = build_report (&rr -> rr_report);
return lti;
}
static struct type_MTA_Report *build_report (rp)
Report *rp;
{
struct type_MTA_Report *rep;
rep = (struct type_MTA_Report *)
smalloc (sizeof *rep);
if (rp -> rep_type == DR_REP_SUCCESS) {
struct type_MTA_DeliveryReport *drp;
rep -> offset = type_MTA_Report_delivery;
rep -> un.delivery = drp =
(struct type_MTA_DeliveryReport *)
smalloc (sizeof *drp);
drp -> message__delivery__time =
build_time (rp->rep.rep_dinfo.del_time);
drp -> type__of__MTS__user =
(struct type_MTA_TypeOfMTSUser *)
smalloc (sizeof *drp -> type__of__MTS__user);
drp -> type__of__MTS__user -> parm =
rp -> rep.rep_dinfo.del_type;
}
else if (rp -> rep_type == DR_REP_FAILURE) {
struct type_MTA_NonDeliveryReport *ndr;
rep -> offset = type_MTA_Report_non__delivery;
rep -> un.non__delivery = ndr =
(struct type_MTA_NonDeliveryReport *)
smalloc (sizeof *ndr);
ndr -> non__delivery__reason__code =
(struct type_MTA_NonDeliveryReasonCode *)
smalloc (sizeof *ndr -> non__delivery__reason__code);
ndr -> non__delivery__reason__code -> parm =
rp -> rep.rep_ndinfo.nd_rcode;
ndr -> non__delivery__diagnostic__code =
(struct type_MTA_NonDeliveryDiagnosticCode *)
smalloc (sizeof *ndr -> non__delivery__diagnostic__code);
ndr -> non__delivery__diagnostic__code -> parm =
rp -> rep.rep_ndinfo.nd_dcode;
}
else
PP_LOG (LLOG_EXCEPTIONS, ("Bad delivery report type %d",
rp -> rep_type));
return rep;
}
struct type_MTA_ORName *build_fullname (fn)
FullName *fn;
{
OR_ptr or;
struct type_MTA_ORName *orname;
or = or_std2or (fn -> fn_addr);
if (or == NULLOR) {
PP_LOG (LLOG_EXCEPTIONS, ("Can't convert %s", fn -> fn_addr));
return NULL;
}
orname = conv_or (or);
or_free (or);
return orname;
}
static struct type_MTA_Extensions *build_pprf_ext (ap) /* XXX */
ADDR *ap;
{
return NULL;
}
static struct element_MTA_8 *build_prb_recips (ad, adl, disclose)
ADDR *ad;
ADDR *adl;
int disclose;
{
struct element_MTA_8 *rl = NULL, *rlbase = NULL;
struct type_MTA_PerRecipientProbeTransferFields *prmtf;
ADDR *ap, *ap2;
int resp;
for (ap = ad; ap; ap = ap -> ad_next) {
for (ap2 = adl; ap2; ap2 = ap2 -> ad_next) {
if (ap2 -> ad_no == ap -> ad_no)
break;
}
if (ap2 == NULLADDR) {
if (disclose == 0)
continue;
else
resp = FALSE;
}
else resp = ap2 -> ad_resp;
if (rlbase == NULL)
rl = rlbase = (struct element_MTA_8 *)
smalloc (sizeof *rl);
else {
rl -> next = (struct element_MTA_8 *)
smalloc (sizeof *rl);
rl = rl -> next;
}
bzero ((char *)rl, sizeof *rl);
prmtf = rl -> PerRecipientProbeTransferFields =
(struct type_MTA_PerRecipientProbeTransferFields *)
smalloc (sizeof *prmtf);
prmtf -> recipient__name = build_addr (ap -> ad_r400adr);
prmtf -> originally__specified__recipient__number =
(struct type_MTA_OriginallySpecifiedRecipientNumber *)
smalloc (sizeof *prmtf ->
originally__specified__recipient__number);
prmtf -> originally__specified__recipient__number -> parm =
ap -> ad_extension;
if (ap -> ad_explicitconversion != AD_EXP_NONE) {
prmtf -> explicit__conversion =
(struct type_MTA_ExplicitConversion *)
smalloc (sizeof *prmtf -> explicit__conversion);
prmtf -> explicit__conversion -> parm =
ap -> ad_explicitconversion;
}
else prmtf -> explicit__conversion = NULL;
prmtf -> per__recipient__indicators = build_ri (resp,
ad -> ad_mtarreq,
ad -> ad_usrreq);
prmtf -> extensions = build_pprf_ext (ap);
}
return rlbase;
}
static struct type_MTA_Extensions *build_pp_extensions (qp)
Q_struct *qp;
{
return NULL;
}
static struct type_MTA_ProbeTransferEnvelope *build_probe_envelope (qp, adl)
Q_struct *qp;
ADDR *adl;
{
struct type_MTA_ProbeTransferEnvelope *prb;
prb = (struct type_MTA_ProbeTransferEnvelope *) smalloc (sizeof *prb);
bzero ((char *)prb, sizeof *prb);
prb -> probe__identifier = build_msgid (&qp -> msgid);
prb -> originator__name = build_addr (qp -> Oaddress -> ad_r400adr);
prb -> original__encoded__information__types =
build_eits (&qp -> encodedinfo);
prb -> content__type = build_content (adl -> ad_content ?
adl -> ad_content :
qp -> cont_type);
if (qp -> ua_id)
prb -> content__identifier = STR2QB (qp -> ua_id);
prb -> content__length = (struct type_MTA_ContentLength *)
smalloc (sizeof *prb -> content__length);
prb -> content__length -> parm = qp -> msgsize;
prb -> per__message__indicators = build_pmf (qp);
prb -> per__domain__bilateral__information = NULL;
prb -> trace__information = build_trace (qp -> trace);
prb -> extensions = build_pp_extensions (qp);
prb -> per__recipient__fields = build_prb_recips (qp -> Raddress, adl,
qp -> disclose_recips);
return prb;
}
struct type_Transfer_MtsAPDU *build_probe (qp, recip)
Q_struct *qp;
ADDR *recip;
{
struct type_Transfer_MtsAPDU *p1;
p1 = (struct type_Transfer_MtsAPDU *) smalloc (sizeof *p1);
bzero ((char *)p1, sizeof *p1);
p1 -> offset = type_Transfer_MtsAPDU_probe;
p1 -> un.probe = build_probe_envelope (qp, recip);
return p1;
}