/* ryinitiator.c - generic interactive initiator */
static char *rcsid
= "$Header: /f/osi/imisc/RCS/ryinitiator.c,v 7.6 91/02/22 09:26:25 mrose Interim $";
* $Header: /f/osi/imisc/RCS/ryinitiator.c,v 7.6 91/02/22 09:26:25 mrose Interim $
* $Log: ryinitiator.c,v $
* Revision 7.6 91/02/22 09:26:25 mrose
* Revision 7.5 90/12/23 18:41:55 mrose
* Revision 7.4 90/12/11 10:52:56 mrose
* Revision 7.3 90/10/29 18:38:16 mrose
* Revision 7.2 90/07/09 14:38:52 mrose
* Revision 7.1 90/07/01 21:04:09 mrose
* Revision 7.0 89/11/23 21:57:42 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
#define DS_RESULT(ds) (timing ? timing_result : (ds) -> ds_result)
#define DS_RESULT(ds) ((ds) -> ds_result)
static char *myname
= "ryinitiator";
extern char *isodeversion
;
ryinitiator (argc
, argv
, myservice
, mycontext
, mypci
, ops
, dispatches
, quit
)
struct RyOperation ops
[];
struct dispatch
*dispatches
;
register struct dispatch
*ds
;
register struct SSAPref
*sf
;
register struct PSAPaddr
*pa
;
struct AcSAPconnect accs
;
register struct AcSAPconnect
*acc
= &accs
;
struct AcSAPindication acis
;
register struct AcSAPindication
*aci
= &acis
;
register struct AcSAPabort
*aca
= &aci
-> aci_abort
;
register struct PSAPctxlist
*pc
= &pcs
;
struct RoSAPindication rois
;
register struct RoSAPindication
*roi
= &rois
;
register struct RoSAPpreject
*rop
= &roi
-> roi_preject
;
if (myname
= rindex (argv
[0], '/'))
if (myname
== NULL
|| *myname
== NULL
)
qos
.qos_reliability
= HIGH_QUALITY
;
for (ap
= argv
+ 1; cp
= *ap
; ap
++) {
if (strcmp (cp
, "-low") == 0) {
qos
.qos_reliability
= LOW_QUALITY
;
if (strcmp (cp
, "-high") == 0) {
qos
.qos_reliability
= HIGH_QUALITY
;
if (strcmp (cp
, "-c") == 0) {
|| sscanf (cp
, "%d", &count
) != 1
adios (NULLCP
, "usage: %s -c count", myname
);
if (strcmp (cp
, "-l") == 0) {
|| sscanf (cp
, "%d", &length
) != 1
adios (NULLCP
, "usage: %s -l length", myname
);
adios (NULLCP
, "%s: unknown switch", cp
);
if ((cp
= *ap
++) == NULL
)
adios (NULLCP
, "usage: %s host [operation [ arguments ... ]]", myname
);
if ((aei
= _str2aei (cp
, myservice
, mycontext
, *ap
== NULL
, NULLCP
,
adios (NULLCP
, "unable to resolve service: %s", PY_pepy
);
if ((pa
= aei2addr (aei
)) == NULLPA
)
adios (NULLCP
, "address translation failed");
if ((ctx
= ode2oid (mycontext
)) == NULLOID
)
adios (NULLCP
, "%s: unknown object descriptor", mycontext
);
if ((ctx
= oid_cpy (ctx
)) == NULLOID
)
adios (NULLCP
, "out of memory");
if ((pci
= ode2oid (mypci
)) == NULLOID
)
adios (NULLCP
, "%s: unknown object descriptor", mypci
);
if ((pci
= oid_cpy (pci
)) == NULLOID
)
adios (NULLCP
, "out of memory");
pc
-> pc_ctx
[0].pc_id
= 1;
pc
-> pc_ctx
[0].pc_asn
= pci
;
pc
-> pc_ctx
[0].pc_atn
= NULLOID
;
if ((sf
= addr2ref (PLocalHostName ())) == NULL
) {
(void) bzero ((char *) sf
, sizeof *sf
);
printf (" running on host %s", sf
-> sr_udata
+ 2);
printf (" at %s", sf
-> sr_cdata
+ 2);
printf (" [%s, ", oid2ode (ctx
));
printf ("%s]\n", oid2ode (pci
));
printf ("using %s\n", isodeversion
);
for (ds
= dispatches
; ds
-> ds_name
; ds
++)
if (strcmp (ds
-> ds_name
, cp
) == 0)
if (ds
-> ds_name
== NULL
)
adios (NULLCP
, "unknown operation \"%s\"", cp
);
if (AcAssocRequest (ctx
, NULLAEI
, aei
, NULLPA
, pa
, pc
, NULLOID
,
0, ROS_MYREQUIRE
, SERIAL_NONE
, 0, sf
, NULLPEP
, 0, &qos
,
acs_adios (aca
, "A-ASSOCIATE.REQUEST");
if (acc
-> acc_result
!= ACS_ACCEPT
) {
adios (NULLCP
, "association rejected: [%s]",
AcErrString (acc
-> acc_result
));
if (RoSetService (sd
, RoPService
, roi
) == NOTOK
)
ros_adios (rop
, "set RO/PS fails");
if (getline (buffer
) == NOTOK
)
if (str2vec (buffer
, vec
) < 1)
for (ds
= dispatches
; ds
-> ds_name
; ds
++)
if (strcmp (ds
-> ds_name
, vec
[0]) == 0)
if (ds
-> ds_name
== NULL
) {
advise (NULLCP
, "unknown operation \"%s\"", vec
[0]);
invoke (sd
, ops
, ds
, vec
+ 1);
invoke (sd
, ops
, ds
, ap
);
(*quit
) (sd
, (struct dispatch
*) NULL
, (char **) NULL
, (caddr_t
*) NULL
);
static invoke (sd
, ops
, ds
, args
)
struct RyOperation ops
[];
register struct dispatch
*ds
;
struct RoSAPindication rois
;
register struct RoSAPindication
*roi
= &rois
;
register struct RoSAPpreject
*rop
= &roi
-> roi_preject
;
if (ds
-> ds_argument
&& (*ds
-> ds_argument
) (sd
, ds
, args
, &in
) == NOTOK
)
register struct RyOperation
*ryo
= ops
;
for (; ryo
-> ryo_name
; ryo
++)
if (ryo
-> ryo_op
== ds
-> ds_operation
)
if (!ryo
-> ryo_name
|| !ryo
-> ryo_arg_mod
)
if (enc_f (ryo
-> ryo_arg_index
, ryo
-> ryo_arg_mod
, &pe
, 1, NULL
,
for (i
= 0; i
< count
; i
++)
switch (result
= RyStub (sd
, ops
, ds
-> ds_operation
, RyGenID (sd
),
NULLIP
, in
, DS_RESULT (ds
), ds
-> ds_error
,
case NOTOK
: /* failure */
if (ROS_FATAL (rop
-> rop_reason
))
ros_advise (rop
, "STUB");
case OK
: /* got a result/error response */
case DONE
: /* got RO-END? */
adios (NULLCP
, "got RO-END.INDICATION");
adios (NULLCP
, "unknown return from RyStub=%d", result
);
if (ds
-> ds_fr_mod
&& in
)
(void) fre_obj (in
, ds
-> ds_fr_mod
-> md_dtab
[ds
-> ds_fr_index
],
static int getline (buffer
)
for (ep
= (cp
= buffer
) + BUFSIZ
- 1; (i
= getchar ()) != '\n';) {
static timer (bytes
, pkts
)
static struct timeval start
;
(void) gettimeofday (&start
, (struct timezone
*) 0);
(void) gettimeofday (&stop
, (struct timezone
*) 0);
tvsub (&td
, &stop
, &start
);
ms
= (td
.tv_sec
* 1000) + (td
.tv_usec
/ 1000);
bs
= (((float) bytes
* pkts
* NBBY
* 1000) / (float) (ms
? ms
: 1)) / NBBY
;
ps
= ((float) pkts
* 1000) / (float) (ms
? ms
: 1);
printf ("%d operations in %d.%02d seconds (%.2f ops/s)",
pkts
, td
.tv_sec
, td
.tv_usec
/ 10000, ps
);
printf ("; %d bytes/op for %.2f Kbytes/s", bytes
, bs
/ 1024);
static tvsub (tdiff
, t1
, t0
)
register struct timeval
*tdiff
,
tdiff
-> tv_sec
= t1
-> tv_sec
- t0
-> tv_sec
;
tdiff
-> tv_usec
= t1
-> tv_usec
- t0
-> tv_usec
;
if (tdiff
-> tv_usec
< 0)
tdiff
-> tv_sec
--, tdiff
-> tv_usec
+= 1000000;
static timer (bytes
, pkts
)
secs
= td
/ 60, msecs
= (td
% 60) * 1000 / 60;
ms
= (secs
* 1000) + msecs
;
bs
= (((float) bytes
* pkts
* NBBY
* 1000) / (float) (ms
? ms
: 1)) / NBBY
;
ps
= ((float) pkts
* 1000) / (float) (ms
? ms
: 1);
printf ("%d operations in %d.%02d seconds (%.2f ops/s)",
pkts
, secs
, msecs
/ 10, ps
);
printf ("; %d bytes/op for %.2f Kbytes/s", bytes
, bs
/ 1024);
static int timing_result (sd
, id
, dummy
, result
, roi
)
struct RoSAPindication
*roi
;
void ros_adios (rop
, event
)
register struct RoSAPpreject
*rop
;
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 (NULLCP
, "%s: %s", event
, buffer
);
void acs_adios (aca
, event
)
register struct AcSAPabort
*aca
;
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 (NULLCP
, "%s: %s (source %d)", event
, buffer
,
fprintf (stderr
, "%s: ", myname
);
(void) fputs (buffer
, stderr
);
(void) fputc ('\n', stderr
);
void ryr_advise (va_alist
)
void ryr_advise (what
, fmt
)