|
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: 23086 (0x5a2e) Types: TextFile Names: »P1_in.py«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Chans/x40084/P1_in.py«
-- P1: P1 MHS definitions -- @(#) $Header: /cs/research/pp/hubris/pp-beta/Chans/x40084/RCS/P1_in.py,v 5.0 90/09/20 15:56:44 pp Exp Locker: pp $ -- -- $Log: P1_in.py,v $ -- Revision 5.0 90/09/20 15:56:44 pp -- rcsforce : 5.0 public release -- -- P1 DEFINITIONS ::= %{ #ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/x40084/RCS/P1_in.py,v 5.0 90/09/20 15:56:44 pp Exp Locker: pp $"; #endif lint #include "head.h" #include "prm.h" #include "q.h" #include "or.h" #include "dr.h" #include <isode/cmd_srch.h> #define PPSTRUCT "/usr/pp/pp/logs/x400in84.pdus" extern void reverse_trace(); extern char *loc_dom_site; extern char *myname; extern char *remote_site; extern char *cont_p2; static DRmpdu DRstruct; DRmpdu *DRptr = &DRstruct; static OR_ptr orptr; static Q_struct Qstruct; Q_struct *PPQuePtr = &Qstruct; static int ad_no; ADDR *adr_new(); char *pe2str(); char *body_string; int body_len; #ifdef DEBUG int testdebug (pe, s) register PE pe; register char *s; { register PS ps; static int debug = OK; static FILE *fptrace; switch (debug) { case NOTOK: return; case OK: debug = 1; fflush (stdout); if (access (PPSTRUCT, 02) == NOTOK) { debug = NOTOK; break; } fptrace = fopen (PPSTRUCT, "a"); if (fptrace == NULL) { debug = NOTOK; break; } fprintf (fptrace, "testdebug made with %s\n", pepyid); /* and fall... */ default: fflush (stdout); fprintf (fptrace, "%s\n", s); if ((ps = ps_alloc (std_open)) == NULLPS) break; if (std_setup (ps, fptrace) != NOTOK) (void) pe2pl (ps, pe); fprintf (fptrace, "--------\n"); (void) fflush (fptrace); ps_free (ps); break; } } #endif /* DEBUG */ %} BEGIN DECODER do -- P1 makes use of types defined in the following module: -- Sa: Recommendation S.a[14] -- T73: T.73, Section 5 MPDU ::= %{ q_init (PPQuePtr); /* initialise Q struct */ dr_init (&DRstruct); /* initialise DR struct */ PPQuePtr->inbound = list_rchan_new (remote_site, myname); ad_no = 1; %} CHOICE { [0] IMPLICIT UserMPDU [[p PPQuePtr]], -- service mpdus are sent as ordinary messages ServiceMPDU [[p PPQuePtr]] } ServiceMPDU [[P Q_struct *]] ::= CHOICE { [1] IMPLICIT DeliveryReportMPDU [[p PPQuePtr]] %{ PPQuePtr->msgtype = MT_DMPDU; %}, [2] IMPLICIT ProbeMPDU [[p PPQuePtr]] %{ PPQuePtr->msgtype = MT_PMPDU; %} } UserMPDU [[P Q_struct *]] ::= SEQUENCE { envelope %{ PPQuePtr->msgtype = MT_UMPDU; ad_no = 1; %} UMPDUEnvelope [[p PPQuePtr]], content UMPDUContent %{ body_string = prim2str ($$, &body_len); PPQuePtr->msgsize = body_len; %} } UMPDUEnvelope [[P Q_struct *]] %{ ADDR *ad_link; char *sp; int n; %} ::= SET { mpduID MPDUIdentifier [[p &parm->msgid]], originator ORName [[p &sp]] %{ parm->Oaddress = adr_new (sp, AD_X400_TYPE, 0); %}, original EncodedInformationTypes [[p &parm->orig_encodedinfo]] OPTIONAL, ContentType [[i n]] %{ if (n != 2) { PP_OPER (NULLCP, ("Bad content type %d aborting",n)); exit (2); } parm->cont_type = strdup (cont_p2); %}, UAContentId [[s parm->ua_id]] OPTIONAL, Priority [[i parm->priority]] DEFAULT normal, PerMessageFlag [[p parm]] DEFAULT {}, deferredDelivery[0] IMPLICIT Time [[p &parm->defertime]] OPTIONAL, [1] IMPLICIT SEQUENCE OF PerDomainBilateralInfo OPTIONAL, [2] IMPLICIT SEQUENCE OF RecipientInfo [[p &ad_link]] %{ register ADDR **ap; for (ap = &(parm->Raddress); *ap; ap = &(*ap)->ad_next); *ap = ad_link; %}, TraceInformation [[p &parm->trace]], -- this one's for EAN [UNIVERSAL 17] IMPLICIT ANY OPTIONAL } UMPDUContent ::= OCTETSTRING -- time Time [[P UTC *]] ::= UniversalTime %{ char *p = pe2str ($$); UTC ut; ut = str2utct (p, strlen(p)); if (ut) { *parm = (UTC) smalloc (sizeof *ut); **parm = *ut; } free (p); %} -- various envelope information MPDUIdentifier [[P MPDUid *]] ::= [APPLICATION 4] IMPLICIT SEQUENCE { GlobalDomainIdentifier [[p &parm->mpduid_DomId]], IA5String [[s parm->mpduid_string]] } ContentType ::= [APPLICATION 6] IMPLICIT INTEGER { p2 (2) } UAContentId ::= [APPLICATION 10] IMPLICIT PrintableString Priority ::= [APPLICATION 7] IMPLICIT INTEGER { normal (0), nonUrgent (1), urgent (2) } PerMessageFlag [[P Q_struct *]] ::= [APPLICATION 8] IMPLICIT BITSTRING { discloseRecipients (0), conversionProhibited (1), alternateRecipientAllowed (2), contentReturnRequest (3) } %{ if (bit_test ($$, 0)) parm -> disclose_recips = 1; if (bit_test ($$, 1)) parm -> implicit_conversion = 1; if (bit_test ($$, 2)) parm -> alternate_recip_allowed = 1; if (bit_test ($$, 3)) parm -> content_return_request = 1; %} -- per-domain bilateral information -- IGNORED! PerDomainBilateralInfo ::= SEQUENCE { country CountryName, AdministrationDomainName, BilateralInfo } BilateralInfo ::= ANY -- recipient information RecipientInfo [[P ADDR **]] %{ char *sp; int anint; %} ::= SET { recipient ORName [[p &sp]] %{ *parm = adr_new (sp, AD_X400_TYPE, ad_no); ++ad_no; %}, [0] IMPLICIT ExtensionIdentifier [[i (*parm)->ad_extension]], [1] IMPLICIT PerRecipientFlag [[p &anint]] %{ prf2mem (anint, &(*parm)->ad_resp, &(*parm)->ad_mtarreq, &(*parm)->ad_usrreq); %}, [2] IMPLICIT ExplicitConversion [[i anint]] %{ (*parm)->ad_explicitconversion = anint; %} DEFAULT {} -- this one's for EAN --, [UNIVERSAL 2] IMPLICIT INTEGER OPTIONAL } ExtensionIdentifier ::= INTEGER PerRecipientFlag [[P int *]] ::= BITSTRING -- See Figure 23/X.411 %{ *parm = pe2bits ($$); %} ExplicitConversion ::= INTEGER { iA5TextTeletex (0), teletexTelex (1) } -- trace information TraceInformation [[P Trace **]] %{ Trace *newtrace; %} ::= [APPLICATION 9] IMPLICIT SEQUENCE OF SEQUENCE { domainid %{ Trace **tp; newtrace = (Trace *) smalloc (sizeof (*newtrace)); bzero ((char *) newtrace, sizeof (*newtrace)); for (tp = parm; *tp; tp = &(*tp)->trace_next); *tp = newtrace; newtrace->trace_next = (Trace *) NULL; %} GlobalDomainIdentifier [[p &newtrace->trace_DomId]], domaininfo DomainSuppliedInfo [[p &newtrace->trace_DomSinfo]] } DomainSuppliedInfo [[P DomSupInfo *]] ::= SET { arrival[0] IMPLICIT Time [[p &parm->dsi_time]], deferred[1] IMPLICIT Time [[p &parm->dsi_deferred]] OPTIONAL, action[2] IMPLICIT INTEGER [[i parm->dsi_action]] { relayed (0), rerouted (1) }, converted EncodedInformationTypes [[p &parm->dsi_converted]] OPTIONAL, previous GlobalDomainIdentifier [[p &parm->dsi_attempted_md]] OPTIONAL } -- global domain identifier GlobalDomainIdentifier [[P GlobalDomId *]] ::= [APPLICATION 3] IMPLICIT SEQUENCE { CountryName [[p &parm->global_Country]], AdministrationDomainName [[p &parm->global_Admin]], PrivateDomainIdentifier [[p &parm->global_Private]] OPTIONAL } CountryName [[P char **]] ::= [APPLICATION 1] CHOICE { NumericString [[s *parm]], PrintableString [[s *parm]] } AdministrationDomainName [[P char **]] ::= [APPLICATION 2] CHOICE { NumericString [[s *parm]], PrintableString [[s *parm]] } PrivateDomainIdentifier [[P char **]] ::= CHOICE { NumericString [[s *parm]], PrintableString [[s *parm]] } -- O/R name ORName [[P char **]] %{ PE pe_standard = NULLPE; PE pe_domain = NULLPE; char buf[1024]; %} ::= [APPLICATION 0] IMPLICIT SEQUENCE { standard ANY [[a pe_standard]], domaindefined ANY [[a pe_domain]] OPTIONAL } %{ *parm = NULLCP; if (decode_OR_StandardAttributeList (pe_standard, 1, NULLIP, NULLVP, &orptr) == NOTOK) { adios (NULLCP, "decode_OR_StandardAttributeList !!"); } if (pe_domain && decode_OR_DomainDefinedAttributeList (pe_domain, 1, NULLIP, NULLVP, &orptr) == NOTOK) { adios (NULLCP, "decode_OR_DomainDefinedAttributeList !!"); } or_or2std (orptr, buf, FALSE); *parm = strdup (buf); or_free (orptr); orptr = NULLOR; %} -- encoded information types EncodedInformationTypes [[P EncodedIT *]] ::= [APPLICATION 5] IMPLICIT SET { [0] IMPLICIT BITSTRING { undefined (0), tLX (1), iA5Text (2), g3Fax (3), tIF0 (4), tTX (5), videotex (6), voice (7), sFD (8), tIF1 (9) } %{ enctypes2mem (pe2bits ($$), &parm->eit_types); %} -- this OPTIONAL is for EAN -- OPTIONAL, [1] IMPLICIT G3NonBasicParams [[p &parm->eit_g3parms]] OPTIONAL, [2] IMPLICIT TeletexNonBasicParams OPTIONAL, [3] IMPLICIT PresentationCapabilities OPTIONAL -- other non-basic parameters are for further study -- but this one's for EAN --, [UNIVERSAL 3] IMPLICIT BITSTRING { undefined (0), tLX (1), iA5Text (2), g3Fax (3), tIF0 (4), tTX (5), videotex (6), voice (7), sFD (8), tIF1 (9) } %{ enctypes2mem (pe2bits($$), &parm->eit_types); %} OPTIONAL } G3NonBasicParams [[P long *]] ::= BITSTRING { twoDimensional (8), fineResolution (9), unlimitedLength (20), b4Length (21), a3Width (22), b4Width (23), uncompressed (30) } %{ *parm = pe2bits ($$); %} TeletexNonBasicParams ::= SET { graphicCharacterSets[0] IMPLICIT T61String OPTIONAL, controlCharacterSets[1] IMPLICIT T61String OPTIONAL, pageFormats[2] IMPLICIT OCTETSTRING OPTIONAL, miscTerminalCapabilities[3] IMPLICIT T61String OPTIONAL, privateUse[4] IMPLICIT OCTETSTRING OPTIONAL } PresentationCapabilities ::= T73PresentationCapabilities T73PresentationCapabilities ::= SET { --unimportant-- } -- Delivery Report MPDU DeliveryReportMPDU [[P Q_struct *]]::= %{ dr_init (&DRstruct); %} SEQUENCE { envelope DeliveryReportEnvelope [[p parm]], content DeliveryReportContent [[p parm]] } DeliveryReportEnvelope [[P Q_struct *]] %{ char *sp; %} ::= SET { report %{ DRptr -> dr_mpduid = (MPDUid *) smalloc (sizeof (MPDUid)); bzero ((char *)DRptr -> dr_mpduid, sizeof (MPDUid)); %} MPDUIdentifier [[p DRptr->dr_mpduid]], originator ORName [[p &sp]] %{ parm->Oaddress = adr_new (sp, AD_X400_TYPE, 0); parm->Oaddress->ad_resp = YES; %}, -- Should be RFC822 style TraceInformation [[p &DRptr->dr_trace]] %{ (void) reverse_trace (&DRptr->dr_trace); %} } DeliveryReportContent [[P Q_struct *]] ::= SET { original MPDUIdentifier [[p &parm->msgid]], intermediate TraceInformation [[p &DRptr -> dr_subject_intermediate_trace]] OPTIONAL, UAContentId [[s parm->ua_id]] OPTIONAL, [0] IMPLICIT SEQUENCE OF ReportedRecipientInfo [[p parm]], returned[1] IMPLICIT UMPDUContent OPTIONAL, billingInformation[2] ANY OPTIONAL } ReportedRecipientInfo [[P Q_struct *]] %{ int anint; Rrinfo *rr; ADDR *ap; %} ::= SET %{ Rrinfo **rp; rr = (Rrinfo *) smalloc (sizeof (*rr)); bzero ((char *) rr, sizeof (*rr)); for (rp = &DRptr -> dr_recip_list; *rp; rp = &(*rp)->rr_next); *rp = rr; %} { recipient[0] %{ if (orptr != NULLOR) { or_free (orptr); orptr = NULLOR; } ap = adr_new (NULLCP, AD_X400_TYPE, ad_no); rr -> rr_recip = ad_no ++; ap->ad_status = AD_STAT_DRWRITTEN; adr_add (&parm -> Raddress, ap); %} IMPLICIT ORName [[p &ap -> ad_value]], [1] IMPLICIT ExtensionIdentifier [[i ap->ad_extension]], [2] IMPLICIT PerRecipientFlag [[p &anint]] %{ prf2mem (anint, &ap->ad_resp, &ap->ad_mtarreq, &ap->ad_usrreq); %}, [3] IMPLICIT LastTraceInformation [[p rr]], intendedRecipient[4] %{ rr -> rr_originally_intended_recip = (FullName *) smalloc (sizeof (FullName)); %} IMPLICIT ORName [[p &rr->rr_originally_intended_recip -> fn_addr]] OPTIONAL, [5] IMPLICIT SupplementaryInformation [[s rr->rr_supplementary]] OPTIONAL } -- last trace information LastTraceInformation [[P Rrinfo *]] ::= SET { arrival[0] IMPLICIT Time [[p &parm->rr_arrival]], converted %{ parm->rr_converted = (EncodedIT *) smalloc (sizeof (*parm->rr_converted)); bzero ((char *) parm->rr_converted, sizeof (*parm->rr_converted)); %} EncodedInformationTypes [[p parm->rr_converted]] OPTIONAL, [1] Report [[p &parm->rr_report]] } Report [[P Report *]] ::= CHOICE { [0] IMPLICIT DeliveredInfo [[p &parm->rep.rep_dinfo]] %{ parm->rep_type = DR_REP_SUCCESS; %}, [1] IMPLICIT NonDeliveredInfo [[p &parm->rep.rep_ndinfo]] %{ parm->rep_type = DR_REP_FAILURE; %} } DeliveredInfo [[P Delinfo *]] ::= SET { delivery[0] IMPLICIT Time [[p &parm->del_time]], typeOfUA[1] %{ parm->del_type = 0; %} IMPLICIT INTEGER [[i parm->del_type]] { public (0), private (1) } DEFAULT public } NonDeliveredInfo [[P NonDelinfo *]] ::= SET { [0] IMPLICIT ReasonCode [[i parm->nd_rcode]], [1] IMPLICIT DiagnosticCode [[i parm->nd_dcode]] OPTIONAL } -- No ReasonCodes specifed because 84 should be able to accept 88 codes ReasonCode ::= INTEGER -- No DiagnosticCodes specifed because 84 should be able to accept 88 codes DiagnosticCode ::= INTEGER -- supplementary information SupplementaryInformation ::= PrintableString -- length limited and for further study -- Probe MPDU ProbeMPDU [[P Q_struct *]]::= ProbeEnvelope [[p parm]] ProbeEnvelope [[P Q_struct *]] %{ char *sp; ADDR *ad_link; int n; %} ::= SET { probe MPDUIdentifier [[p &parm->msgid]], originator ORName [[p &sp]] %{ parm->Oaddress = adr_new (sp, AD_X400_TYPE, 0); %}, ContentType [[i n]] %{ if (n != 2) { PP_OPER (NULLCP, ("Bad content type %d aborting", n)); exit (2); } parm->cont_type = strdup (cont_p2); %}, UAContentId [[s parm->ua_id]] OPTIONAL, original EncodedInformationTypes [[p &parm->orig_encodedinfo]] OPTIONAL, TraceInformation [[p &parm->trace]], PerMessageFlag [[p parm]] DEFAULT {}, contentLength[0] IMPLICIT INTEGER [[i parm->msgsize]] OPTIONAL, [1] IMPLICIT SEQUENCE OF PerDomainBilateralInfo OPTIONAL, [2] IMPLICIT SEQUENCE OF RecipientInfo [[p &ad_link]] %{ register ADDR **ap; for (ap = &(parm->Raddress); *ap; ap = &(*ap)->ad_next); *ap = ad_link; %} } END %{ int pe2bits (pe) register PE pe; { int i, j, k; j = 0; for (k = 1 << (i = 0); i < sizeof (j) * 8; i++, k <<= 1) { switch (bit_test (pe, i)) { case NOTOK: break; default: j |= k; /* fall */ case OK: continue; } break; } return (j); } char *pe2str (pe) PE pe; { int len; return prim2str (pe, &len); } dump_struct () { FILE *fp; if ((fp = fopen (PPSTRUCT, "a")) == NULL) { advise (NULLCP, "Can't open %s", PPSTRUCT); return; } if (rp_isbad (wr_q (PPQuePtr, fp)) ) advise (NULLCP, "Can't write Qstruct"); if (PPQuePtr->Oaddress != NULL) if (rp_isbad (wr_adr (PPQuePtr->Oaddress, fp, AD_ORIGINATOR))) advise (NULLCP, "Can't write Oaddress"); if (PPQuePtr->Raddress != NULL) if (rp_isbad (wr_adr (PPQuePtr->Raddress, fp, AD_RECIPIENT))) advise (NULLCP, "Can't write Raddress"); fputs ("-------------------------\n", fp); (void) fclose (fp); } %}