/* isod.c - "minimal" ISODE server for testing */
static char *rcsid
= "$Header: /f/osi/support/RCS/isod.c,v 7.2 91/02/22 09:46:37 mrose Interim $";
* $Header: /f/osi/support/RCS/isod.c,v 7.2 91/02/22 09:46:37 mrose Interim $
* Revision 7.2 91/02/22 09:46:37 mrose
* Revision 7.1 90/07/01 21:07:50 mrose
* Revision 7.0 89/11/23 22:27:27 mrose
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
"isod.log", NULLCP
, NULLCP
, LLOG_FATAL
| LLOG_EXCEPTIONS
| LLOG_NOTICE
,
LLOG_FATAL
, -1, LLOGCLS
| LLOGCRT
| LLOGZER
, NOTOK
LLog
*pgm_log
= &_pgm_log
;
static char *myname
= "isod";
static enum mode
{ echo
, sink
, XXX
} mymode
= XXX
;
void adios (), advise ();
void ts_adios (), ts_advise ();
int ts_dataindication (), ts_discindication ();
static struct dispatch ts_dispatches
[] = {
void ss_adios (), ss_advise ();
int ss_dataindication (), ss_tokenindication (), ss_syncindication (),
ss_actindication (), ss_reportindication (), ss_finishindication (),
static struct dispatch
*ss_dispatches
= ts_dispatches
;
void ps_adios (), ps_advise ();
int ps_dataindication (), ps_tokenindication (), ps_syncindication (),
ps_actindication (), ps_reportindication (), ps_finishindication (),
static struct dispatch
*ps_dispatches
= ts_dispatches
;
void acs_adios (), acs_advise ();
static struct dispatch acs_dispatches
[] = {
void rts_adios (), rts_advise ();
static struct dispatch rts_dispatches
[] = {
static struct dispatch rtse_dispatches
[] = {
static PE apdupe
= NULLPE
;
void ros_adios (), ros_advise ();
static struct dispatch
*ros_dispatches
= ts_dispatches
;
static PE nullpe
= NULLPE
;
if (myname
= rindex (argv
[0], '/'))
if (myname
== NULL
|| *myname
== NULL
)
if (debug
= isatty (fileno (stderr
)))
ll_dbinit (pgm_log
, myname
);
ll_hdinit (pgm_log
, myname
);
advise (LLOG_NOTICE
, NULLCP
, "starting");
if (cp
= rindex (*argv
, '.'))
/* cheat! should do this after calling the init function (sigh!) */
if (argc
> 1 && strcmp (argv
[1], "-rtse") == 0)
if (cp
== NULL
|| strcmp (cp
, "tsap") == 0)
if (strcmp (cp
, "ssap") == 0)
if (strcmp (cp
, "psap") == 0)
if (strcmp (cp
, "acsap") == 0) {
if (strcmp (cp
, "rtsap") == 0) {
if (strcmp (cp
, "rosap") == 0)
adios (NULLCP
, "unknown provider: \"%s\"", cp
);
exit (0); /* NOTREACHED */
static int ts_main (argc
, argv
)
register struct dispatch
*ds
;
register struct isoservent
*is
;
register struct TSAPstart
*ts
= &tss
;
register struct TSAPdata
*tx
= &txs
;
struct TSAPdisconnect tds
;
register struct TSAPdisconnect
*td
= &tds
;
if (TInit (argc
, argv
, ts
, td
) == NOTOK
)
ts_adios (td
, "(T)initialization fails");
advise (LLOG_NOTICE
, NULLCP
,
"T-CONNECT.INDICATION: <%d, %s, %s, %d, %d>",
taddr2str (&ts
-> ts_calling
), taddr2str (&ts
-> ts_called
),
ts
-> ts_expedited
, ts
-> ts_tsdusize
);
advise (LLOG_DEBUG
, NULLCP
, "greetings: %d octets", ts
-> ts_cc
);
if (is
= getisoserventbyselector ("tsap", ts
-> ts_called
.ta_selector
,
ts
-> ts_called
.ta_selectlen
))
for (ds
= ts_dispatches
; ds
-> ds_entity
; ds
++)
if (strcmp (ds
-> ds_entity
, is
-> is_entity
) == 0) {
for (argv
++; *argv
; argv
++) {
if (strcmp (*argv
, "-async") == 0) {
if (strcmp (*argv
, "-sync") == 0) {
advise (LLOG_NOTICE
, NULLCP
, "unknown argument \"%s\"", *argv
);
if (TConnResponse (sd
, NULLTA
, ts
-> ts_expedited
,
mymode
== echo
? ts
-> ts_data
: NULLCP
,
mymode
== echo
? ts
-> ts_cc
: 0, NULLQOS
, td
) == NOTOK
)
ts_adios (td
, "T-CONNECT.RESPONSE");
(void) strcpy (buffer
, "entity unknown or unavailable");
if (TDiscRequest (sd
, buffer
, strlen (buffer
) + 1, td
) == NOTOK
)
ts_adios (td
, "T-DISCONNECT.REQUEST");
advise (LLOG_NOTICE
, NULLCP
, "rejected");
if (TSetIndications (sd
, ts_dataindication
, ts_discindication
, td
)
ts_adios (td
, "set ASYNC fails");
if (TReadRequest (sd
, tx
, NOTOK
, td
) == NOTOK
)
ts_discindication (sd
, td
);
ts_dataindication (sd
, tx
);
static int ts_dataindication (sd
, tx
)
register struct TSAPdata
*tx
;
struct TSAPdisconnect tds
;
register struct TSAPdisconnect
*td
= &tds
;
register char *p
= qb2str (&tx
-> tx_qbuf
);
? TExpdRequest (sd
, p
, tx
-> tx_cc
, td
)
: TDataRequest (sd
, p
, tx
-> tx_cc
, td
))
if (td
-> td_reason
== DR_NORMAL
)
ts_discindication (sd
, td
);
ts_adios (td
, tx
-> tx_expedited
? "T-EXPEDITED-DATA.REQUEST"
static int ts_discindication (sd
, td
)
register struct TSAPdisconnect
*td
;
if (td
-> td_reason
!= DR_NORMAL
)
ts_adios (td
, "T-DISCONNECT.INDICATION");
ts_advise (td
, "T-DISCONNECT.INDICATION");
advise (LLOG_NOTICE
, NULLCP
, "T-DISCONNECT.INDICATION");
static void ts_adios (td
, event
)
register struct TSAPdisconnect
*td
;
static void ts_advise (td
, event
)
register struct TSAPdisconnect
*td
;
(void) sprintf (buffer
, "[%s] %*.*s",
TErrString (td
-> td_reason
),
td
-> td_cc
, td
-> td_cc
, td
-> td_data
);
(void) sprintf (buffer
, "[%s]", TErrString (td
-> td_reason
));
advise (LLOG_NOTICE
, NULLCP
, "%s: %s", event
, buffer
);
"\020\01HALFDUPLEX\02DUPLEX\03EXPEDITED\04MINORSYNC\05MAJORSYNC\06RESYNC\
\07ACTIVITY\010NEGOTIATED\011CAPABILITY\012EXCEPTIONS\013TYPEDATA"
#define TMASK "\020\01DATA\03SYNC\05ACTIVITY\07RELEASE"
#define dotoken(requires,shift,bit,type) \
if (requirements & requires) \
switch (ss -> ss_settings & (ST_MASK << shift)) { \
case ST_CALL_VALUE << shift: \
advise (LLOG_DEBUG, NULLCP, "%s token: choice", type); \
ss -> ss_settings &= ~(ST_MASK << shift); \
ss -> ss_settings |= ST_INIT_VALUE << shift; \
advise (LLOG_DEBUG, NULLCP, "%s token: initiator", type); \
advise (LLOG_DEBUG, NULLCP, "%s token: responder", type); \
adios (NULLCP, "%s token: reserved", type); \
static int requirements
= 0;
static struct SSAPdata hxs
;
static struct SSAPdata
*hx
= &hxs
;
static int ss_main (argc
, argv
)
register struct dispatch
*ds
;
register struct isoservent
*is
;
register struct SSAPstart
*ss
= &sss
;
register struct SSAPdata
*sx
= &sxs
;
struct SSAPindication sis
;
register struct SSAPindication
*si
= &sis
;
register struct SSAPabort
*sa
= &si
-> si_abort
;
if (SInit (argc
, argv
, ss
, si
) == NOTOK
)
ss_adios (sa
, "(S)initialization fails");
advise (LLOG_NOTICE
, NULLCP
,
"S-CONNECT.INDICATION: <%d, %s, %s, %s, %s, %ld, %d>",
ss
-> ss_sd
, sprintref (&ss
-> ss_connect
),
saddr2str (&ss
-> ss_calling
), saddr2str (&ss
-> ss_called
),
sprintb (ss
-> ss_requirements
, RMASK
), ss
-> ss_isn
,
advise (LLOG_DEBUG
, NULLCP
, "greetings: %d octets", ss
-> ss_cc
);
ss
-> ss_requirements
&= SR_HALFDUPLEX
| SR_DUPLEX
| SR_EXPEDITED
| SR_MINORSYNC
| SR_MAJORSYNC
| SR_RESYNC
| SR_ACTIVITY
| SR_NEGOTIATED
| SR_CAPABILITY
| SR_EXCEPTIONS
| SR_TYPEDATA
;
if ((ss
-> ss_requirements
& SR_HALFDUPLEX
)
&& (ss
-> ss_requirements
& SR_DUPLEX
))
ss
-> ss_requirements
&= ~SR_DUPLEX
;
requirements
= ss
-> ss_requirements
;
advise (LLOG_DEBUG
, NULLCP
, "new requirements: %s",
sprintb (ss
-> ss_requirements
, RMASK
));
advise (LLOG_DEBUG
, NULLCP
, "initial tokens: %s", sprintb (owned
, TMASK
));
if (!(ss
-> ss_requirements
& (SR_MINORSYNC
| SR_MAJORSYNC
| SR_RESYNC
)))
ss
-> ss_isn
= SERIAL_NONE
;
if (is
= getisoserventbyselector ("ssap", ss
-> ss_called
.sa_selector
,
ss
-> ss_called
.sa_selectlen
))
for (ds
= ss_dispatches
; ds
-> ds_entity
; ds
++)
if (strcmp (ds
-> ds_entity
, is
-> is_entity
) == 0) {
for (argv
++; *argv
; argv
++) {
if (strcmp (*argv
, "-async") == 0) {
if (strcmp (*argv
, "-sync") == 0) {
advise (LLOG_NOTICE
, NULLCP
, "unknown argument \"%s\"", *argv
);
if (SConnResponse (sd
, &ss
-> ss_connect
, NULLSA
,
SC_ACCEPT
, ss
-> ss_requirements
, ss
-> ss_settings
,
ss
-> ss_isn
, mymode
== echo
? ss
-> ss_data
: NULLCP
,
mymode
== echo
? ss
-> ss_cc
: 0, si
) == NOTOK
)
ss_adios (sa
, "S-CONNECT.RESPONSE (accept)");
(void) strcpy (buffer
, "entity unknown or unavailable");
if (SConnResponse (sd
, &ss
-> ss_connect
, NULLSA
,
SC_REJECTED
, 0, 0, SERIAL_NONE
, buffer
,
ss_adios (sa
, "S-CONNECT.RESPONSE (reject)");
advise (LLOG_NOTICE
, NULLCP
, "rejected");
if (SSetIndications (sd
, ss_dataindication
, ss_tokenindication
,
ss_syncindication
, ss_actindication
, ss_reportindication
,
ss_finishindication
, ss_abortindication
, si
) == NOTOK
)
ss_adios (sa
, "set ASYNC fails");
switch (result
= SReadRequest (sd
, sx
, NOTOK
, si
)) {
ss_abortindication (sd
, sa
);
ss_dataindication (sd
, sx
);
ss_tokenindication (sd
, &si
-> si_token
);
ss_syncindication (sd
, &si
-> si_sync
);
ss_actindication (sd
, &si
-> si_activity
);
ss_reportindication (sd
, &si
-> si_report
);
ss_finishindication (sd
, &si
-> si_finish
);
adios (NULLCP
, "unknown indication type=0x%x",
adios (NULLCP
, "unknown return from SReadRequest=%d", result
);
static int ss_dataindication (sd
, sx
)
register struct SSAPdata
*sx
;
struct SSAPindication sis
;
register struct SSAPindication
*si
= &sis
;
register struct SSAPabort
*sa
= &si
-> si_abort
;
advise (LLOG_DEBUG
, NULLCP
, "normal data, %d bytes", sx
-> sx_cc
);
advise (LLOG_DEBUG
, NULLCP
, "expedited data, %d bytes",
advise (LLOG_DEBUG
, NULLCP
, "typed data, %d bytes", sx
-> sx_cc
);
advise (LLOG_DEBUG
, NULLCP
, "capability data, %d bytes",
advise (LLOG_DEBUG
, NULLCP
, "capability data ack, %d bytes",
advise (LLOG_DEBUG
, NULLCP
,
"unknown data indication type=0x%x, %d bytes",
sx
-> sx_type
, sx
-> sx_cc
);
if (requirements
& SR_HALFDUPLEX
) {
(void) strcpy (buffer
, "protocol screw-up");
if (SUAbortRequest (sd
, buffer
, strlen (buffer
) + 1, si
) == NOTOK
)
ss_adios (sa
, "S-U-ABORT.REQUEST");
adios (NULLCP
, "protocol screw-up");
*hx
= *sx
; /* struct copy */
hx
-> sx_qbuf
.qb_forw
-> qb_back
=
hx
-> sx_qbuf
.qb_back
-> qb_forw
= &hx
-> sx_qbuf
;
bzero ((char *) sx
, sizeof *sx
);
sx
-> sx_qbuf
.qb_back
= &sx
-> sx_qbuf
;
if (!(owned
& ST_DAT_TOKEN
)
&& SPTokenRequest (sd
, ST_DAT_TOKEN
, NULLCP
,
ss_adios (sa
, "S-TOKEN-PLEASE.REQUEST");
if (SDataRequest (sd
, p
= qb2str (&sx
-> sx_qbuf
), sx
-> sx_cc
,
ss_adios (sa
, "S-DATA.REQUEST");
if (SExpdRequest (sd
, p
= qb2str (&sx
-> sx_qbuf
), sx
-> sx_cc
,
ss_adios (sa
, "S-EXPEDITED-DATA.REQUEST");
if (STypedRequest (sd
, p
= qb2str (&sx
-> sx_qbuf
), sx
-> sx_cc
,
ss_adios (sa
, "S-TYPED-DATA.REQUEST");
if (SCapdResponse (sd
, p
= qb2str (&sx
-> sx_qbuf
), sx
-> sx_cc
,
ss_adios (sa
, "S-CAPABILITY-DATA.REQUEST");
adios (NULLCP
, "got capability data response");
adios (NULLCP
, "unknown data indication type=0x%x", sx
-> sx_type
);
static int ss_tokenindication (sd
, st
)
register struct SSAPtoken
*st
;
struct SSAPindication sis
;
register struct SSAPindication
*si
= &sis
;
register struct SSAPabort
*sa
= &si
-> si_abort
;
advise (LLOG_DEBUG
, NULLCP
, "%s tokens: %s, %d bytes",
st
-> st_type
== ST_PLEASE
? "please"
: st
-> st_type
== ST_GIVE
? "give" : "control",
sprintb ((int) st
-> st_tokens
, TMASK
), st
-> st_cc
);
adios (NULLCP
, "unknown token indication type=0x%x",
if ((owned
& ST_DAT_TOKEN
) && hx
-> sx_cc
> 0) {
if (SDataRequest (sd
, p
= qb2str (&hx
-> sx_qbuf
), hx
-> sx_cc
, si
)
ss_adios (sa
, "S-DATA.REQUEST");
bzero ((char *) hx
, sizeof *hx
);
hx
-> sx_qbuf
.qb_back
= &hx
-> sx_qbuf
;
if (SGTokenRequest (sd
, (int) st
-> st_tokens
, si
) == NOTOK
)
ss_adios (sa
, "S-TOKEN-GIVE.REQUEST");
owned
&= ~st
-> st_tokens
;
static int ss_syncindication (sd
, sn
)
register struct SSAPsync
*sn
;
struct SSAPindication sis
;
register struct SSAPindication
*si
= &sis
;
register struct SSAPabort
*sa
= &si
-> si_abort
;
advise (LLOG_DEBUG
, NULLCP
, "majorsync indication %d, %d bytes",
sn
-> sn_ssn
, sn
-> sn_cc
);
advise (LLOG_DEBUG
, NULLCP
, "majorsync confirmation %d, %d bytes",
sn
-> sn_ssn
, sn
-> sn_cc
);
advise (LLOG_DEBUG
, NULLCP
, "minorsync indication %d%s, %d bytes",
sn
-> sn_ssn
, sn
-> sn_options
== SYNC_CONFIRM
? " (wants confirmation)" : NULLCP
, sn
-> sn_cc
);
advise (LLOG_DEBUG
, NULLCP
, "minorsync confirmation %d, %d bytes",
sn
-> sn_ssn
, sn
-> sn_cc
);
advise (LLOG_DEBUG
, NULLCP
,
"resync indication type=%d %d, %d bytes",
sn
-> sn_options
, sn
-> sn_ssn
, sn
-> sn_cc
);
advise (LLOG_DEBUG
, NULLCP
, "resync confirmation %d, %d bytes",
sn
-> sn_ssn
, sn
-> sn_cc
);
advise (LLOG_DEBUG
, NULLCP
,
"unknown sync indication=0x%x, ssn=%d, %d bytes",
sn
-> sn_type
, sn
-> sn_ssn
, sn
-> sn_cc
);
if (SMajSyncResponse (sd
,
mymode
== echo
? sn
-> sn_data
: NULL
,
mymode
== echo
? sn
-> sn_cc
: 0, si
) == NOTOK
)
ss_adios (sa
, "S-MAJOR-SYNC.RESPONSE");
adios (NULLCP
, "got majorsync confirmation");
if (sn
-> sn_options
== SYNC_CONFIRM
)
if (SMinSyncResponse (sd
, sn
-> sn_ssn
,
mymode
== echo
? sn
-> sn_data
: NULL
,
mymode
== echo
? sn
-> sn_cc
: 0, si
) == NOTOK
)
ss_adios (sa
, "S-MINOR-SYNC.RESPONSE");
adios (NULLCP
, "got minorsync confirmation");
#define dotoken(requires,shift,bit,type) \
if (requirements & requires) \
switch (sn -> sn_settings & (ST_MASK << shift)) { \
case ST_CALL_VALUE << shift: \
sn -> sn_settings &= ~(ST_MASK << shift); \
sn -> sn_settings |= ST_RESP_VALUE << shift; \
case ST_RESP_VALUE << shift: \
case ST_INIT_VALUE << shift: \
adios (NULLCP, "%s token: reserved", type); \
if (SReSyncRequest (sd
, SYNC_ABANDON
, SERIAL_NONE
,
mymode
== echo
? sn
-> sn_data
: NULL
,
mymode
== echo
? sn
-> sn_cc
: 0, si
) == NOTOK
)
ss_adios (sa
, "S-RESYNCHRONIZE.REQUEST");
adios (NULLCP
, "unknown sync indication type=0x%x", sn
-> sn_type
);
static int ss_actindication (sd
, sv
)
register struct SSAPactivity
*sv
;
struct SSAPindication sis
;
register struct SSAPindication
*si
= &sis
;
register struct SSAPabort
*sa
= &si
-> si_abort
;
advise (LLOG_DEBUG
, NULLCP
,
"activity start indication: %*.*s, %d bytes",
sv
-> sv_id
.sd_len
, sv
-> sv_id
.sd_len
,
sv
-> sv_id
.sd_data
, sv
-> sv_cc
);
advise (LLOG_DEBUG
, NULLCP
,
"activity resume indication: id=%*.*s oid=%*.*s connect=%s ssn=%d, %d bytes",
sv
-> sv_id
.sd_len
, sv
-> sv_id
.sd_len
,
sv
-> sv_id
.sd_data
, sv
-> sv_oid
.sd_len
,
sv
-> sv_oid
.sd_len
, sv
-> sv_oid
.sd_data
,
sprintref (&sv
-> sv_connect
), sv
-> sv_ssn
, sv
-> sv_cc
);
advise (LLOG_DEBUG
, NULLCP
,
"activity interrupt indication %d, %d bytes",
sv
-> sv_reason
, sv
-> sv_cc
);
advise (LLOG_DEBUG
, NULLCP
,
"activity interrupt confirmation, %d bytes", sv
-> sv_cc
);
advise (LLOG_DEBUG
, NULLCP
,
"activity discard indication %d, %d bytes",
sv
-> sv_reason
, sv
-> sv_cc
);
advise (LLOG_DEBUG
, NULLCP
,
"activity discard confirmation, %d bytes", sv
-> sv_cc
);
advise (LLOG_DEBUG
, NULLCP
, "activity end indication %d, %d bytes",
sv
-> sv_ssn
, sv
-> sv_cc
);
advise (LLOG_DEBUG
, NULLCP
, "activity end confirmation, %d bytes",
advise (LLOG_DEBUG
, NULLCP
,
"unknown activity indication=0x%x, %d bytes",
sv
-> sv_type
, sv
-> sv_cc
);
if (SActIntrResponse (sd
, si
) == NOTOK
)
ss_adios (sa
, "S-ACTIVITY-INTERRUPT.RESPONSE");
adios (NULLCP
, "got activity interrupt confirmation");
if (SActDiscResponse (sd
, si
) == NOTOK
)
ss_adios (sa
, "S-ACTIVITY-DISCARD.RESPONSE");
adios (NULLCP
, "got activity discard confirmation");
if (SActEndResponse (sd
, mymode
== echo
? sv
-> sv_data
: NULLCP
,
mymode
== echo
? sv
-> sv_cc
: 0, si
) == NOTOK
)
ss_adios (sa
, "S-ACTIVITY-END.RESPONSE");
adios (NULLCP
, "got activity end confirmation");
adios (NULLCP
, "unknown activity indication=0x%x", sv
-> sv_type
);
static int ss_reportindication (sd
, sp
)
struct SSAPindication sis
;
register struct SSAPindication
*si
= &sis
;
register struct SSAPabort
*sa
= &si
-> si_abort
;
advise (LLOG_DEBUG
, NULLCP
, "%s report %d, %d bytes",
sp
-> sp_peer
? "user" : "provider", sp
-> sp_reason
, sp
-> sp_cc
);
if (requirements
& SR_DAT_EXISTS
) {
if (SGTokenRequest (sd
, ST_DAT_TOKEN
, si
) == NOTOK
)
ss_adios (sa
, "S-TOKEN-GIVE.REQUEST");
advise (LLOG_DEBUG
, NULLCP
, "cleared");
if (SUAbortRequest (sd
, NULLCP
, 0, si
) == NOTOK
)
ss_adios (sa
, "S-U-ABORT.REQUEST");
adios (NULLCP
, "aborted");
static int ss_finishindication (sd
, sf
)
register struct SSAPfinish
*sf
;
struct SSAPindication sis
;
register struct SSAPindication
*si
= &sis
;
register struct SSAPabort
*sa
= &si
-> si_abort
;
advise (LLOG_NOTICE
, NULLCP
, "S-RELEASE.INDICATION: %d bytes",
advise (LLOG_NOTICE
, NULLCP
, "S-RELEASE.INDICATION");
if (SRelResponse (sd
, SC_ACCEPT
, mymode
== echo
? sf
-> sf_data
: NULL
,
mymode
== echo
? sf
-> sf_cc
: 0, si
) == NOTOK
)
ss_adios (sa
, "S-RELEASE.RESPONSE");
static int ss_abortindication (sd
, sa
)
register struct SSAPabort
*sa
;
ss_adios (sa
, "S-P-ABORT.INDICATION");
ss_advise (sa
, "S-U-ABORT.INDICATION");
advise (LLOG_NOTICE
, NULLCP
, "S-U-ABORT.INDICATION");
static void ss_adios (sa
, event
)
register struct SSAPabort
*sa
;
static void ss_advise (sa
, event
)
register struct SSAPabort
*sa
;
(void) sprintf (buffer
, "[%s] %*.*s",
SErrString (sa
-> sa_reason
),
sa
-> sa_cc
, sa
-> sa_cc
, sa
-> sa_data
);
(void) sprintf (buffer
, "[%s]", SErrString (sa
-> sa_reason
));
advise (LLOG_NOTICE
, NULLCP
, "%s: %s", event
, buffer
);
"\020\01MANAGEMENT\02RESTORATION"
#define dotoken(requires,shift,bit,type) \
if (srequirements & requires) \
switch (ps -> ps_settings & (ST_MASK << shift)) { \
case ST_CALL_VALUE << shift: \
advise (LLOG_DEBUG, NULLCP, "%s token: choice", type); \
ps -> ps_settings &= ~(ST_MASK << shift); \
ps -> ps_settings |= ST_INIT_VALUE << shift; \
advise (LLOG_DEBUG, NULLCP, "%s token: initiator", type); \
advise (LLOG_DEBUG, NULLCP, "%s token: responder", type); \
adios (NULLCP, "%s token: reserved", type); \
static int prequirements
= 0;
#define srequirements requirements
static struct PSAPdata ixs
;
static struct PSAPdata
*ix
= &ixs
;
static int ps_main (argc
, argv
)
register struct dispatch
*ds
;
register struct isoservent
*is
;
register struct PSAPdata
*px
= &pxs
;
struct PSAPindication pis
;
register struct PSAPindication
*pi
= &pis
;
register struct PSAPabort
*pa
= &pi
-> pi_abort
;
register struct AcSAPstart
*acs
= &acss
;
register struct PSAPstart
*ps
= &acs
-> acs_start
;
register struct PSAPctxlist
*pl
= &ps
-> ps_ctxlist
;
struct AcSAPindication acis
;
register struct AcSAPindication
*aci
= &acis
;
register struct AcSAPabort
*aca
= &aci
-> aci_abort
;
if (AcInit (argc
, argv
, acs
, aci
) == NOTOK
)
acs_adios (aca
, "(Ac)initialization fails");
advise (LLOG_NOTICE
, NULLCP
,
"A-ASSOCIATE.INDICATION: <%d, %s, %s, %s, %d>",
acs
-> acs_sd
, oid2ode (acs
-> acs_context
),
sprintaei (&acs
-> acs_callingtitle
),
sprintaei (&acs
-> acs_calledtitle
), acs
-> acs_ninfo
);
advise (LLOG_NOTICE
, NULLCP
,
"PSAP: <%d, %s, %s, %d, %s,",
paddr2str (&ps
-> ps_calling
, NULLNA
),
paddr2str (&ps
-> ps_called
, NULLNA
),
pl
-> pc_nctx
, sprintb (ps
-> ps_prequirements
, PMASK
));
advise (LLOG_NOTICE
, NULLCP
,
sprintb (ps
-> ps_srequirements
, RMASK
), ps
-> ps_isn
,
if (PInit (argc
, argv
, ps
, pi
) == NOTOK
)
ps_adios (pa
, "(P)initialization fails");
advise (LLOG_NOTICE
, NULLCP
,
"P-CONNECT.INDICATION: <%d, %s, %s, %d, %s,",
paddr2str (&ps
-> ps_calling
, NULLNA
),
paddr2str (&ps
-> ps_called
, NULLNA
),
sprintb (ps
-> ps_prequirements
, PMASK
));
advise (LLOG_NOTICE
, NULLCP
,
sprintb (ps
-> ps_srequirements
, RMASK
), ps
-> ps_isn
,
advise (LLOG_DEBUG
, NULLCP
, "greetings: %d elements", ps
-> ps_ninfo
);
for (i
= 0; i
< pl
-> pc_nctx
; i
++)
advise (LLOG_DEBUG
, NULLCP
, " ctx %d: %d %s 0x%x %d",
i
, pl
-> pc_ctx
[i
].pc_id
, sprintoid (pl
-> pc_ctx
[i
].pc_asn
),
pl
-> pc_ctx
[i
].pc_atn
, pl
-> pc_ctx
[i
].pc_result
);
advise (LLOG_DEBUG
, NULLCP
, " default: %s %d",
sprintoid (ps
-> ps_defctx
), ps
-> ps_defctxresult
);
ps
-> ps_prequirements
&= PR_MANAGEMENT
| PR_RESTORATION
;
prequirements
= ps
-> ps_prequirements
;
advise (LLOG_DEBUG
, NULLCP
, "new presentation requirements: %s",
sprintb (ps
-> ps_prequirements
, PMASK
));
ps
-> ps_srequirements
&= SR_HALFDUPLEX
| SR_DUPLEX
| SR_EXPEDITED
| SR_MINORSYNC
| SR_MAJORSYNC
| SR_RESYNC
| SR_ACTIVITY
| SR_NEGOTIATED
| SR_CAPABILITY
| SR_EXCEPTIONS
| SR_TYPEDATA
;
if ((ps
-> ps_srequirements
& SR_HALFDUPLEX
)
&& (ps
-> ps_srequirements
& SR_DUPLEX
))
ps
-> ps_srequirements
&= ~SR_DUPLEX
;
srequirements
= ps
-> ps_srequirements
;
advise (LLOG_DEBUG
, NULLCP
, "new session requirements: %s",
sprintb (ps
-> ps_srequirements
, RMASK
));
advise (LLOG_DEBUG
, NULLCP
, "initial tokens: %s", sprintb (owned
, TMASK
));
if (!(ps
-> ps_srequirements
& (SR_MINORSYNC
| SR_MAJORSYNC
| SR_RESYNC
)))
ps
-> ps_isn
= SERIAL_NONE
;
struct TSAPaddr
*ta
= &ps
-> ps_called
.pa_addr
.sa_addr
;
if (is
= getisoserventbyselector ("tsap", ta
-> ta_selector
,
for (ds
= acs_dispatches
; ds
-> ds_entity
; ds
++)
if (strcmp (ds
-> ds_entity
, is
-> is_entity
) == 0) {
if (is
= getisoserventbyselector ("psap", ps
-> ps_called
.pa_selector
,
ps
-> ps_called
.pa_selectlen
))
for (ds
= ps_dispatches
; ds
-> ds_entity
; ds
++)
if (strcmp (ds
-> ds_entity
, is
-> is_entity
) == 0) {
for (argv
++; *argv
; argv
++) {
if (strcmp (*argv
, "-async") == 0) {
if (strcmp (*argv
, "-sync") == 0) {
advise (LLOG_NOTICE
, NULLCP
, "unknown argument \"%s\"", *argv
);
if (AcAssocResponse (sd
, ACS_ACCEPT
, ACS_USER_NULL
,
NULLOID
, NULLAEI
, NULLPA
, pl
,
ps
-> ps_defctxresult
, ps
-> ps_prequirements
,
ps
-> ps_srequirements
, ps
-> ps_isn
,
ps
-> ps_settings
, &ps
-> ps_connect
,
acs
-> acs_info
, acs
-> acs_ninfo
, aci
) == NOTOK
)
acs_adios (aca
, "A-ASSOCIATE.RESPONSE (accept)");
if (AcAssocResponse (sd
, ACS_ACCEPT
, ACS_USER_NULL
,
NULLOID
, NULLAEI
, NULLPA
, pl
,
ps
-> ps_defctxresult
, ps
-> ps_prequirements
,
ps
-> ps_srequirements
, ps
-> ps_isn
,
ps
-> ps_settings
, &ps
-> ps_connect
,
NULLPEP
, 0, aci
) == NOTOK
)
acs_adios (aca
, "A-ASSOCIATE.RESPONSE (accept)");
if (AcAssocResponse (sd
, ACS_PERMANENT
, ACS_CONTEXT
,
NULLOID
, NULLAEI
, NULLPA
, pl
,
ps
-> ps_defctxresult
, 0, 0, SERIAL_NONE
, 0,
&ps
-> ps_connect
, NULLPEP
, 0, aci
) == NOTOK
)
acs_adios (aca
, "A-ASSOCIATE.RESPONSE (reject)");
advise (LLOG_NOTICE
, NULLCP
, "rejected");
struct RoSAPindication rois
;
register struct RoSAPpreject
*rop
= &rois
.roi_preject
;
if (RoSetService (sd
, RoPService
, &rois
) == NOTOK
)
ros_adios (rop
, "set RO/PS fails");
if (PConnResponse (sd
, PC_ACCEPT
, NULLPA
,
pl
, ps
-> ps_defctxresult
,
ps
-> ps_prequirements
, ps
-> ps_srequirements
,
ps
-> ps_isn
, ps
-> ps_settings
, &ps
-> ps_connect
,
ps
-> ps_info
, ps
-> ps_ninfo
, pi
) == NOTOK
)
ps_adios (pa
, "P-CONNECT.RESPONSE (accept)");
if (PConnResponse (sd
, PC_ACCEPT
, NULLPA
,
pl
, ps
-> ps_defctxresult
,
ps
-> ps_prequirements
, ps
-> ps_srequirements
,
ps
-> ps_isn
, ps
-> ps_settings
, &ps
-> ps_connect
,
NULLPEP
, 0, pi
) == NOTOK
)
ps_adios (pa
, "P-CONNECT.RESPONSE (accept)");
if (PConnResponse (sd
, PC_REJECTED
, NULLPA
,
pl
, ps
-> ps_defctxresult
, 0, 0, SERIAL_NONE
, 0,
&ps
-> ps_connect
, NULLPEP
, 0, pi
) == NOTOK
)
ps_adios (pa
, "P-CONNECT.RESPONSE (reject)");
advise (LLOG_NOTICE
, NULLCP
, "rejected");
if (PSetIndications (sd
, ps_dataindication
, ps_tokenindication
,
ps_syncindication
, ps_actindication
, ps_reportindication
,
ps_finishindication
, ps_abortindication
, pi
) == NOTOK
)
ps_adios (pa
, "set ASYNC fails");
switch (result
= PReadRequest (sd
, px
, NOTOK
, pi
)) {
ps_abortindication (sd
, pa
);
ps_dataindication (sd
, px
);
ps_tokenindication (sd
, &pi
-> pi_token
);
ps_syncindication (sd
, &pi
-> pi_sync
);
ps_actindication (sd
, &pi
-> pi_activity
);
ps_reportindication (sd
, &pi
-> pi_report
);
ps_finishindication (sd
, &pi
-> pi_finish
);
adios (NULLCP
, "unknown indication type=0x%x",
adios (NULLCP
, "unknown return from PReadRequest=%d", result
);
static int ps_dataindication (sd
, px
)
register struct PSAPdata
*px
;
struct PSAPindication pis
;
register struct PSAPindication
*pi
= &pis
;
register struct PSAPabort
*pa
= &pi
-> pi_abort
;
advise (LLOG_DEBUG
, NULLCP
, "normal data, %d elements",
advise (LLOG_DEBUG
, NULLCP
, "expedited data, %d elements",
advise (LLOG_DEBUG
, NULLCP
, "typed data, %d elements",
advise (LLOG_DEBUG
, NULLCP
, "capability data, %d elements",
advise (LLOG_DEBUG
, NULLCP
, "capability data ack, %d elements",
advise (LLOG_DEBUG
, NULLCP
,
"unknown data indication type=0x%x, %d elements",
px
-> px_type
, px
-> px_ninfo
);
if (srequirements
& SR_HALFDUPLEX
) {
if (PUAbortRequest (sd
, NULLPEP
, 0, pi
) == NOTOK
)
ps_adios (pa
, "P-U-ABORT.REQUEST");
adios (NULLCP
, "protocol screw-up");
*ix
= *px
; /* struct copy */
bzero ((char *) px
, sizeof *px
);
if (!(owned
& ST_DAT_TOKEN
)
&& PPTokenRequest (sd
, ST_DAT_TOKEN
, NULLPEP
,
ps_adios (pa
, "P-TOKEN-PLEASE.REQUEST");
if (PDataRequest (sd
, px
-> px_info
, px
-> px_ninfo
, pi
)
ps_adios (pa
, "P-DATA.REQUEST");
if (PExpdRequest (sd
, px
-> px_info
, px
-> px_ninfo
, pi
) == NOTOK
)
ps_adios (pa
, "P-EXPEDITED-DATA.REQUEST");
if (PTypedRequest (sd
, px
-> px_info
, px
-> px_ninfo
, pi
) == NOTOK
)
ps_adios (pa
, "P-TYPED-DATA.REQUEST");
if (PCapdResponse (sd
, px
-> px_info
, px
-> px_ninfo
, pi
) == NOTOK
)
ps_adios (pa
, "P-CAPABILITY-DATA.REQUEST");
adios (NULLCP
, "got capability data response");
adios (NULLCP
, "unknown data indication type=0x%x", px
-> px_type
);
static int ps_tokenindication (sd
, pt
)
register struct PSAPtoken
*pt
;
struct PSAPindication pis
;
register struct PSAPindication
*pi
= &pis
;
register struct PSAPabort
*pa
= &pi
-> pi_abort
;
advise (LLOG_DEBUG
, NULLCP
, "%s tokens: %s, %d elements",
pt
-> pt_type
== ST_PLEASE
? "please"
: pt
-> pt_type
== ST_GIVE
? "give" : "control",
sprintb ((int) pt
-> pt_tokens
, TMASK
),
adios (NULLCP
, "unknown token indication type=0x%x",
if ((owned
& ST_DAT_TOKEN
) && ix
-> px_ninfo
)
if (PDataRequest (sd
, ix
-> px_info
, ix
-> px_ninfo
, pi
) == NOTOK
)
ps_adios (pa
, "P-DATA.REQUEST");
bzero ((char *) ix
, sizeof *ix
);
if (PGTokenRequest (sd
, (int) pt
-> pt_tokens
, pi
) == NOTOK
)
ps_adios (pa
, "P-TOKEN-GIVE.REQUEST");
owned
&= ~pt
-> pt_tokens
;
static int ps_syncindication (sd
, pn
)
register struct PSAPsync
*pn
;
struct PSAPindication pis
;
register struct PSAPindication
*pi
= &pis
;
register struct PSAPabort
*pa
= &pi
-> pi_abort
;
advise (LLOG_DEBUG
, NULLCP
, "majorsync indication %d",
advise (LLOG_DEBUG
, NULLCP
, "majorsync confirmation %d",
advise (LLOG_DEBUG
, NULLCP
, "minorsync indication %d%s",
pn
-> pn_ssn
, pn
-> pn_options
== SYNC_CONFIRM
? " (wants confirmation)" : NULLCP
);
advise (LLOG_DEBUG
, NULLCP
, "minorsync confirmation %d",
advise (LLOG_DEBUG
, NULLCP
, "resync indication type=%d %d",
pn
-> pn_options
, pn
-> pn_ssn
);
advise (LLOG_DEBUG
, NULLCP
, "resync confirmation %d",
advise (LLOG_DEBUG
, NULLCP
, "unknown sync indication=0x%x, ssn=%d",
pn
-> pn_type
, pn
-> pn_ssn
);
advise (LLOG_DEBUG
, NULLCP
, "%d elements", pn
-> pn_ninfo
);
if (PMajSyncResponse (sd
,
mymode
== echo
? pn
-> pn_info
: NULLPEP
,
mymode
== echo
? pn
-> pn_ninfo
: 0, pi
) == NOTOK
)
ps_adios (pa
, "P-MAJOR-SYNC.RESPONSE");
adios (NULLCP
, "got majorsync confirmation");
if (pn
-> pn_options
== SYNC_CONFIRM
)
if (PMinSyncResponse (sd
, pn
-> pn_ssn
,
mymode
== echo
? pn
-> pn_info
: NULLPEP
,
mymode
== echo
? pn
-> pn_ninfo
: 0, pi
) == NOTOK
)
ps_adios (pa
, "P-MINOR-SYNC.RESPONSE");
adios (NULLCP
, "got minorsync confirmation");
#define dotoken(requires,shift,bit,type) \
if (srequirements & requires) \
switch (pn -> pn_settings & (ST_MASK << shift)) { \
case ST_CALL_VALUE << shift: \
pn -> pn_settings &= ~(ST_MASK << shift); \
pn -> pn_settings |= ST_RESP_VALUE << shift; \
case ST_RESP_VALUE << shift: \
case ST_INIT_VALUE << shift: \
adios (NULLCP, "%s token: reserved", type); \
if (PReSyncRequest (sd
, SYNC_ABANDON
, SERIAL_NONE
,
mymode
== echo
? pn
-> pn_info
: NULLPEP
,
mymode
== echo
? pn
-> pn_ninfo
: 0, pi
) == NOTOK
)
ps_adios (pa
, "P-RESYNCHRONIZE.REQUEST");
adios (NULLCP
, "unknown sync indication type=0x%x", pn
-> pn_type
);
static int ps_actindication (sd
, pv
)
register struct PSAPactivity
*pv
;
struct PSAPindication pis
;
register struct PSAPindication
*pi
= &pis
;
register struct PSAPabort
*pa
= &pi
-> pi_abort
;
advise (LLOG_DEBUG
, NULLCP
, "activity start indication: %*.*s",
pv
-> pv_id
.sd_len
, pv
-> pv_id
.sd_len
,
advise (LLOG_DEBUG
, NULLCP
,
"activity resume indication: id=%*.*s oid=%*.*s connect=%s ssn=%d",
pv
-> pv_id
.sd_len
, pv
-> pv_id
.sd_len
,
pv
-> pv_id
.sd_data
, pv
-> pv_oid
.sd_len
,
pv
-> pv_oid
.sd_len
, pv
-> pv_oid
.sd_data
,
sprintref (&pv
-> pv_connect
), pv
-> pv_ssn
);
advise (LLOG_DEBUG
, NULLCP
, "activity interrupt indication %d",
advise (LLOG_DEBUG
, NULLCP
, "activity interrupt confirmation");
advise (LLOG_DEBUG
, NULLCP
, "activity discard indication %d",
advise (LLOG_DEBUG
, NULLCP
, "activity discard confirmation");
advise (LLOG_DEBUG
, NULLCP
, "activity end indication %d",
advise (LLOG_DEBUG
, NULLCP
, "activity end confirmation");
advise (LLOG_DEBUG
, NULLCP
, "unknown activity indication=0x%x",
advise (LLOG_DEBUG
, NULLCP
, "%d elements", pv
-> pv_ninfo
);
if (PActIntrResponse (sd
, pi
) == NOTOK
)
ps_adios (pa
, "P-ACTIVITY-INTERRUPT.RESPONSE");
adios (NULLCP
, "got activity interrupt confirmation");
if (PActDiscResponse (sd
, pi
) == NOTOK
)
ps_adios (pa
, "P-ACTIVITY-DISCARD.RESPONSE");
adios (NULLCP
, "got activity discard confirmation");
if (PActEndResponse (sd
, mymode
== echo
? pv
-> pv_info
: NULLPEP
,
mymode
== echo
? pv
-> pv_ninfo
: 0, pi
) == NOTOK
)
ps_adios (pa
, "P-ACTIVITY-END.RESPONSE");
adios (NULLCP
, "got activity end confirmation");
adios (NULLCP
, "unknown activity indication=0x%x", pv
-> pv_type
);
static int ps_reportindication (sd
, pp
)
register struct PSAPreport
*pp
;
struct PSAPindication pis
;
register struct PSAPindication
*pi
= &pis
;
register struct PSAPabort
*pa
= &pi
-> pi_abort
;
advise (LLOG_NOTICE
, NULLCP
, "%s report %d, %d elements",
pp
-> pp_peer
? "user" : "provider", pp
-> pp_reason
,
if (srequirements
& SR_DAT_EXISTS
) {
if (PGTokenRequest (sd
, ST_DAT_TOKEN
, pi
) == NOTOK
)
ps_adios (pa
, "P-TOKEN-GIVE.REQUEST");
advise (LLOG_DEBUG
, NULLCP
, "cleared");
if (PUAbortRequest (sd
, NULLPEP
, 0, pi
) == NOTOK
)
ps_adios (pa
, "P-U-ABORT.REQUEST");
adios (NULLCP
, "aborted");
static int ps_finishindication (sd
, pf
)
register struct PSAPfinish
*pf
;
struct PSAPindication pis
;
register struct PSAPindication
*pi
= &pis
;
register struct PSAPabort
*pa
= &pi
-> pi_abort
;
struct AcSAPindication acis
;
register struct AcSAPabort
*aca
= &acis
.aci_abort
;
register struct AcSAPfinish
*acf
= &acis
.aci_finish
;
if (AcFINISHser (sd
, pf
, &acis
) == NOTOK
)
acs_adios (aca
, "AcFINISHser");
advise (LLOG_NOTICE
, NULLCP
, "P-RELEASE.INDICATION: %d elements",
if (PRelResponse (sd
, SC_ACCEPT
, mymode
== echo
? pf
-> pf_info
: NULLPEP
,
mymode
== echo
? pf
-> pf_ninfo
: 0, pi
) == NOTOK
)
ps_adios (pa
, "P-RELEASE.RESPONSE");
static int ps_abortindication (sd
, pa
)
register struct PSAPabort
*pa
;
struct AcSAPindication acis
;
register struct AcSAPindication
*aci
= &acis
;
register struct AcSAPabort
*aca
= &aci
-> aci_abort
;
if (AcABORTser (sd
, pa
, aci
) == NOTOK
)
acs_adios (aca
, "AcABORTser");
advise (LLOG_NOTICE
, NULLCP
, "A-%sABORT.INDICATION: [%s] %d elements",
aca
-> aca_source
!= ACA_USER
? "P-" : "",
AcErrString (aca
-> aca_reason
), aca
-> aca_ninfo
);
ps_adios (pa
, "P-P-ABORT.INDICATION");
advise (LLOG_NOTICE
, NULLCP
, "P-U-ABORT.INDICATION: %d elements",
static void ps_adios (pa
, event
)
register struct PSAPabort
*pa
;
static void ps_advise (pa
, event
)
register struct PSAPabort
*pa
;
(void) sprintf (buffer
, "[%s] %*.*s",
PErrString (pa
-> pa_reason
),
pa
-> pa_cc
, pa
-> pa_cc
, pa
-> pa_data
);
(void) sprintf (buffer
, "[%s]", PErrString (pa
-> pa_reason
));
advise (LLOG_NOTICE
, NULLCP
, "%s: %s", event
, buffer
);
static void acs_adios (aca
, event
)
register struct AcSAPabort
*aca
;
static void acs_advise (aca
, event
)
register struct AcSAPabort
*aca
;
(void) sprintf (buffer
, "[%s] %*.*s",
AcErrString (aca
-> aca_reason
),
aca
-> aca_cc
, aca
-> aca_cc
, aca
-> aca_data
);
(void) sprintf (buffer
, "[%s]", AcErrString (aca
-> aca_reason
));
advise (LLOG_NOTICE
, NULLCP
, "%s: %s (source %d)", event
, buffer
,
static int rts_main (argc
, argv
)
register struct RtSAPstart
*rts
= &rtss
;
struct RtSAPindication rtis
;
register struct RtSAPindication
*rti
= &rtis
;
register struct RtSAPabort
*rta
= &rti
-> rti_abort
;
register struct AcSAPstart
*acs
= &rts
-> rts_start
;
register struct PSAPstart
*ps
= &acs
-> acs_start
;
register struct PSAPctxlist
*pl
= &ps
-> ps_ctxlist
;
if (RtInit (argc
, argv
, rts
, rti
) == NOTOK
)
rts_adios (rta
, "(Rt)initialization fails");
advise (LLOG_NOTICE
, NULLCP
, "RT-OPEN.INDICATION: <%d, %s, %s, 0x%x>",
rts
-> rts_mode
== RTS_TWA
? "twa" : "mono",
rts
-> rts_turn
== RTS_RESPONDER
? "responder" : "initiator",
advise (LLOG_NOTICE
, NULLCP
, "ACSE: <%d, %s, %s, %s, %d>",
acs
-> acs_sd
, oid2ode (acs
-> acs_context
),
sprintaei (&acs
-> acs_callingtitle
),
sprintaei (&acs
-> acs_calledtitle
), acs
-> acs_ninfo
);
advise (LLOG_NOTICE
, NULLCP
,
"PSAP: <%d, %s, %s, %d, %s,",
paddr2str (&ps
-> ps_calling
, NULLNA
),
paddr2str (&ps
-> ps_called
, NULLNA
),
pl
-> pc_nctx
, sprintb (ps
-> ps_prequirements
, PMASK
));
advise (LLOG_NOTICE
, NULLCP
,
sprintb (ps
-> ps_srequirements
, RMASK
), ps
-> ps_isn
,
advise (LLOG_DEBUG
, NULLCP
, "greetings: %d elements",
for (i
= 0; i
< pl
-> pc_nctx
; i
++)
advise (LLOG_DEBUG
, NULLCP
, " ctx %d: %d %s 0x%x %d",
i
, pl
-> pc_ctx
[i
].pc_id
,
sprintoid (pl
-> pc_ctx
[i
].pc_asn
),
pl
-> pc_ctx
[i
].pc_atn
, pl
-> pc_ctx
[i
].pc_result
);
advise (LLOG_DEBUG
, NULLCP
, " default: %s %d",
sprintoid (ps
-> ps_defctx
), ps
-> ps_defctxresult
);
if (RtBInit (argc
, argv
, rts
, rti
) == NOTOK
)
rts_adios (rta
, "(RtB)initialization fails");
advise (LLOG_NOTICE
, NULLCP
,
"RT-BEGIN.INDICATION: <%d, %s, %s, <%d, %s>, 0x%x>",
rts
-> rts_sd
, rts
-> rts_mode
== RTS_TWA
? "twa" :"monologue",
rts
-> rts_turn
== RTS_RESPONDER
? "responder" : "initiator",
saddr2str (&rts
-> rts_initiator
.rta_addr
),
if ((result
= prim2num (rts
-> rts_data
)) == NOTOK
&& rts
-> rts_data
-> pe_errno
!= PE_ERR_NONE
)
adios (NULLCP
, "error decoding hello: %s",
pe_error (rts
-> rts_data
-> pe_errno
));
advise (LLOG_DEBUG
, NULLCP
, "received greetings of %d", result
);
pe_free (rts
-> rts_data
);
if ((rts
-> rts_data
= int2prim (result
= getpid ())) == NULLPE
)
adios (NULLCP
, "unable to allocate hello");
struct TSAPaddr
*ta
= &ps
-> ps_called
.pa_addr
.sa_addr
;
if (is
= getisoserventbyselector ("tsap", ta
-> ta_selector
,
for (ds
= rtse_dispatches
; ds
-> ds_entity
; ds
++)
if (strcmp (ds
-> ds_entity
, is
-> is_entity
) == 0) {
if (is
= getisoserventbyport ("rtsap", rts
-> rts_port
))
for (ds
= rts_dispatches
; ds
-> ds_entity
; ds
++)
if (strcmp (ds
-> ds_entity
, is
-> is_entity
) == 0) {
ros
= !isacs
&& strncmp (is
-> is_entity
, "ros_", strlen ("ros_")) == 0;
for (argv
++; *argv
; argv
++) {
if (strcmp (*argv
, "-async") == 0) {
if (strcmp (*argv
, "-sync") == 0) {
if (strcmp (*argv
, "-rtse") == 0)
if (strcmp (*argv
, "-rose") == 0) {
advise (LLOG_NOTICE
, NULLCP
, "unknown argument \"%s\"", *argv
);
if (rts
-> rts_mode
== RTS_TWA
)
if (RtOpenResponse (sd
, ACS_USER_NOREASON
, NULLOID
, NULLAEI
,
NULLPA
, NULLPC
, ps
-> ps_defctxresult
, NULLPE
, rti
)
rts_adios (rta
, "RT-OPEN.RESPONSE (reject)");
advise (LLOG_NOTICE
, NULLCP
, "rejected");
if (rts
-> rts_mode
!= RTS_TWA
&& rts
-> rts_turn
!= RTS_INITIATOR
)
if (RtOpenResponse (sd
, ACS_ACCEPT
, NULLOID
, NULLAEI
,
NULLPA
, pl
, ps
-> ps_defctxresult
,
rts
-> rts_data
, rti
) == NOTOK
)
rts_adios (rta
, "RT-OPEN.RESPONSE (accept)");
advise (LLOG_DEBUG
, NULLCP
, "sent greetings of %d", result
);
if (rts
-> rts_mode
== RTS_TWA
)
if (RtBeginResponse (sd
, RTS_MODE
, NULLPE
, rti
) == NOTOK
)
rts_adios (rta
, "RT-BEGIN.RESPONSE (reject)");
advise (LLOG_NOTICE
, NULLCP
, "rejected");
if (rts
-> rts_mode
!= RTS_TWA
&& rts
-> rts_turn
!= RTS_INITIATOR
)
if (RtBeginResponse (sd
, RTS_ACCEPT
, rts
-> rts_data
, rti
)
rts_adios (rta
, "RT-BEGIN.RESPONSE (accept)");
advise (LLOG_DEBUG
, NULLCP
, "sent greetings of %d", result
);
if (RtBeginResponse (sd
, RTS_VALIDATE
, NULLPE
, rti
) == NOTOK
)
rts_adios (rta
, "RT-BEGIN.RESPONSE (reject)");
advise (LLOG_NOTICE
, NULLCP
, "rejected");
struct RoSAPindication rois
;
register struct RoSAPpreject
*rop
= &rois
.roi_preject
;
if (RoSetService (sd
, RoRtService
, &rois
) == NOTOK
)
ros_adios (rop
, "set RO/RT fails");
if (RtSetIndications (sd
, rts_indication
, rti
) == NOTOK
)
rts_adios (rta
, "set ASYNC fails");
switch (result
= RtWaitRequest (sd
, NOTOK
, rti
)) {
rts_indication (sd
, rti
);
adios (NULLCP
, "unknown return from RtWaitRequest=%d", result
);
static int rts_indication (sd
, rti
)
register struct RtSAPindication
*rti
;
switch (rti
-> rti_type
) {
rts_turn (sd
, &rti
-> rti_turn
);
rts_transfer (sd
, &rti
-> rti_transfer
);
rts_abort (sd
, &rti
-> rti_abort
);
rts_close (sd
, &rti
-> rti_close
);
rts_finish (sd
, &rti
-> rti_finish
);
adios (NULLCP
, "unknown indication type=%d", rti
-> rti_type
);
static int rts_turn (sd
, rtu
)
register struct RtSAPturn
*rtu
;
struct RtSAPindication rtis
;
register struct RtSAPindication
*rti
= &rtis
;
register struct RtSAPabort
*rta
= &rti
-> rti_abort
;
if (RtGTurnRequest (sd
, rti
) == NOTOK
)
rts_adios (rta
, "RT-TURN-GIVE.REQUEST");
if (RtTransferRequest (sd
, apdupe
, NOTOK
, rti
) == NOTOK
)
rts_adios (rta
, "RT-TRANSFER.REQUEST");
static int rts_transfer (sd
, rtt
)
register struct RtSAPtransfer
*rtt
;
struct RtSAPindication rtis
;
register struct RtSAPindication
*rti
= &rtis
;
register struct RtSAPabort
*rta
= &rti
-> rti_abort
;
adios (NULLCP
, "protocol screw-up");
if (RtPTurnRequest (sd
, priority
++, rti
) == NOTOK
)
rts_adios (rta
, "RT-TURN-PLEASE.REQUEST");
apdupe
= rtt
-> rtt_data
;
static int rts_abort (sd
, rta
)
register struct RtSAPabort
*rta
;
rts_adios (rta
, "RT-U-ABORT.INDICATION");
if (RTS_FATAL (rta
-> rta_reason
))
rts_adios (rta
, "RT-P-ABORT.INDICATION");
rts_advise (rta
, "RT-P-ABORT.INDICATION");
static int rts_close (sd
, rtc
)
struct RtSAPindication rtis
;
register struct RtSAPindication
*rti
= &rtis
;
register struct RtSAPabort
*rta
= &rti
-> rti_abort
;
advise (LLOG_NOTICE
, NULLCP
, "RT-END.INDICATION");
if (RtEndResponse (sd
, rti
) == NOTOK
)
rts_adios (rta
, "RT-END.RESPONSE");
static int rts_finish (sd
, acf
)
register struct AcSAPfinish
*acf
;
struct RtSAPindication rtis
;
register struct RtSAPindication
*rti
= &rtis
;
register struct RtSAPabort
*rta
= &rti
-> rti_abort
;
advise (LLOG_NOTICE
, NULLCP
, "RT-CLOSE.INDICATION: %d, %d elements",
acf
-> acf_reason
, acf
-> acf_ninfo
);
if (RtCloseResponse (sd
, ACR_NORMAL
, mymode
== echo
? acf
-> acf_info
[0] : NULLPE
, rti
) == NOTOK
)
rts_adios (rta
, "RT-CLOSE.RESPONSE");
static void rts_adios (rta
, event
)
register struct RtSAPabort
*rta
;
static void rts_advise (rta
, event
)
register struct RtSAPabort
*rta
;
(void) sprintf (buffer
, "[%s] %*.*s", RtErrString (rta
-> rta_reason
),
rta
-> rta_cc
, rta
-> rta_cc
, rta
-> rta_data
);
(void) sprintf (buffer
, "[%s]", RtErrString (rta
-> rta_reason
));
advise (LLOG_NOTICE
, NULLCP
, "%s: %s", event
, buffer
);
static int ros_main (argc
, argv
)
register struct RoSAPstart
*ros
= &ross
;
struct RoSAPindication rois
;
register struct RoSAPindication
*roi
= &rois
;
register struct RoSAPpreject
*rop
= &roi
-> roi_preject
;
if (RoInit (argc
, argv
, ros
, roi
) == NOTOK
)
ros_adios (rop
, "(Ro)initialization fails");
advise (LLOG_NOTICE
, NULLCP
, "RO-BEGIN.INDICATION: <%d, <%d, %s>, 0x%x>",
saddr2str (&ros
-> ros_initiator
.roa_addr
),
if ((result
= prim2num (ros
-> ros_data
)) == NOTOK
&& ros
-> ros_data
-> pe_errno
!= PE_ERR_NONE
)
adios (NULLCP
, "error decoding hello: %s",
pe_error (ros
-> ros_data
-> pe_errno
));
advise (LLOG_DEBUG
, NULLCP
, "received greetings of %d", result
);
pe_free (ros
-> ros_data
);
if ((ros
-> ros_data
= int2prim (result
= getpid ())) == NULLPE
)
adios (NULLCP
, "unable to allocate hello");
if (is
= getisoserventbyport ("rosap", ros
-> ros_port
))
for (ds
= ros_dispatches
; ds
-> ds_entity
; ds
++)
if (strcmp (ds
-> ds_entity
, is
-> is_entity
) == 0) {
for (argv
++; *argv
; argv
++) {
if (strcmp (*argv
, "-async") == 0) {
if (strcmp (*argv
, "-sync") == 0) {
advise (LLOG_NOTICE
, NULLCP
, "unknown argument \"%s\"", *argv
);
if (RoBeginResponse (sd
, ROS_ACCEPT
, ros
-> ros_data
, roi
)
ros_adios (rop
, "RO-BEGIN.RESPONSE (accept)");
advise (LLOG_DEBUG
, NULLCP
, "sent greetings of %d", result
);
if (RoBeginResponse (sd
, ROS_VALIDATE
, NULLPE
, roi
) == NOTOK
)
ros_adios (rop
, "RO-BEGIN.RESPONSE (reject)");
advise (LLOG_NOTICE
, NULLCP
, "rejected");
static int do_ros (sd
, async
)
struct RoSAPindication rois
;
register struct RoSAPindication
*roi
= &rois
;
register struct RoSAPpreject
*rop
= &roi
-> roi_preject
;
if ((nullpe
= pe_alloc (PE_CLASS_UNIV
, PE_FORM_PRIM
, PE_PRIM_NULL
))
adios (NULLCP
, "unable to allocate NULL PE");
if (RoSetIndications (sd
, ros_indication
, roi
) == NOTOK
)
ros_adios (rop
, "set ASYNC fails");
switch (result
= RoWaitRequest (sd
, NOTOK
, roi
)) {
ros_indication (sd
, roi
);
adios (NULLCP
, "unknown return from RoWaitRequest=%d", result
);
static int ros_indication (sd
, roi
)
register struct RoSAPindication
*roi
;
switch (roi
-> roi_type
) {
ros_invoke (sd
, &roi
-> roi_invoke
);
ros_result (sd
, &roi
-> roi_result
);
ros_error (sd
, &roi
-> roi_error
);
ros_ureject (sd
, &roi
-> roi_ureject
);
ros_preject (sd
, &roi
-> roi_preject
);
ros_end (sd
, &roi
-> roi_end
);
ros_finish (sd
, &roi
-> roi_finish
);
adios (NULLCP
, "unknown indication type=%d", roi
-> roi_type
);
static int ros_invoke (sd
, rox
)
register struct RoSAPinvoke
*rox
;
struct RoSAPindication rois
;
register struct RoSAPindication
*roi
= &rois
;
register struct RoSAPpreject
*rop
= &roi
-> roi_preject
;
if (RoErrorRequest (sd
, rox
-> rox_id
, ff
,
mymode
== echo
? rox
-> rox_args
: nullpe
, ROS_NOPRIO
,
ros_adios (rop
, "RO-ERROR.REQUEST");
if (RoResultRequest (sd
, rox
-> rox_id
, rox
-> rox_op
,
mymode
== echo
? rox
-> rox_args
: nullpe
, ROS_NOPRIO
,
ros_adios (rop
, "RO-RESULT.REQUEST");
static int ros_result (sd
, ror
)
register struct RoSAPresult
*ror
;
struct RoSAPindication rois
;
register struct RoSAPindication
*roi
= &rois
;
register struct RoSAPpreject
*rop
= &roi
-> roi_preject
;
if (RoURejectRequest (sd
, &ror
-> ror_id
, ROS_RRP_UNRECOG
, ROS_NOPRIO
, roi
)
ros_adios (rop
, "RO-REJECT-U.REQUEST");
static int ros_error (sd
, roe
)
register struct RoSAPerror
*roe
;
struct RoSAPindication rois
;
register struct RoSAPindication
*roi
= &rois
;
register struct RoSAPpreject
*rop
= &roi
-> roi_preject
;
if (RoURejectRequest (sd
, &roe
-> roe_id
, ROS_REP_UNRECOG
, ROS_NOPRIO
, roi
)
ros_adios (rop
, "RO-REJECT-U.REQUEST");
static int ros_ureject (sd
, rou
)
register struct RoSAPureject
*rou
;
advise (LLOG_NOTICE
, NULLCP
, "RO-REJECT-U.INDICATION: %s",
RoErrString (rou
-> rou_reason
));
advise (LLOG_NOTICE
, NULLCP
, "RO-REJECT-U.INDICATION: %s (id=%d)",
RoErrString (rou
-> rou_reason
), rou
-> rou_id
);
static int ros_preject (sd
, rop
)
register struct RoSAPpreject
*rop
;
if (ROS_FATAL (rop
-> rop_reason
))
ros_adios (rop
, "RO-REJECT-P.INDICATION");
ros_advise (rop
, "RO-REJECT-P.INDICATION");
static int ros_end (sd
, roe
)
struct RtSAPindication rtis
;
register struct RtSAPindication
*rti
= &rtis
;
register struct RtSAPabort
*rta
= &rti
-> rti_abort
;
advise (LLOG_NOTICE
, NULLCP
, "RT-END.INDICATION");
if (RtEndResponse (sd
, rti
) == NOTOK
)
rts_adios (rta
, "RT-END.RESPONSE");
struct RoSAPindication rois
;
register struct RoSAPindication
*roi
= &rois
;
register struct RoSAPpreject
*rop
= &roi
-> roi_preject
;
advise (LLOG_NOTICE
, NULLCP
, "RO-END.INDICATION");
if (RoEndResponse (sd
, roi
) == NOTOK
)
ros_adios (rop
, "RO-END.RESPONSE");
static int ros_finish (sd
, acf
)
register struct AcSAPfinish
*acf
;
struct RtSAPindication rtis
;
register struct RtSAPabort
*rta
= &rtis
.rti_abort
;
advise (LLOG_NOTICE
, NULLCP
, "RT-CLOSE.INDICATION: %d, %d elements",
acf
-> acf_reason
, acf
-> acf_ninfo
);
if (RtCloseResponse (sd
, ACR_NORMAL
, mymode
== echo
? acf
-> acf_info
[0] : NULLPE
, &rtis
) == NOTOK
)
rts_adios (rta
, "RT-CLOSE.RESPONSE");
struct AcSAPindication acis
;
register struct AcSAPabort
*aca
= &acis
.aci_abort
;
advise (LLOG_NOTICE
, NULLCP
, "A-RELEASE.INDICATION: %d, %d elements",
acf
-> acf_reason
, acf
-> acf_ninfo
);
if (AcRelResponse (sd
, ACS_ACCEPT
, ACR_NORMAL
, mymode
== echo
? acf
-> acf_info
: NULLPEP
, mymode
== echo
? acf
-> acf_ninfo
: 0, &acis
) == NOTOK
)
acs_adios (aca
, "A-RELEASE.RESPONSE");
static void ros_adios (rop
, event
)
register struct RoSAPpreject
*rop
;
static void ros_advise (rop
, event
)
register struct RoSAPpreject
*rop
;
(void) sprintf (buffer
, "[%s] %*.*s", RoErrString (rop
-> rop_reason
),
rop
-> rop_cc
, rop
-> rop_cc
, rop
-> rop_data
);
(void) sprintf (buffer
, "[%s]", RoErrString (rop
-> rop_reason
));
advise (LLOG_NOTICE
, NULLCP
, "%s: %s", event
, buffer
);
_ll_log (pgm_log
, LLOG_FATAL
, ap
);
_ll_log (pgm_log
, code
, ap
);
void advise (code
, what
, fmt
)
advise (code
, what
, fmt
);