invoksch.c.txt
/*+
* File: invoksch.c
*
* Description: Invoker with call back ESROS API (with scheduler)
*
* Functions:
* G_heartBeat(void)
*
-*/
#include "estd.h"
#include "pf.h"
#include "eh.h"
#include "du.h"
#include "getopt.h"
#include "tm.h"
#include "addr.h"
#include "inetaddr.h"
#include "sch.h"
#include "esro_cb.h"
#include "target.h"
#include "extfuncs.h"
RC_DEBUG_ENABLE;
char *__applicationName = "invokesch";
PUBLIC DU_Pool *G_duMainPool;
typedef struct G_Env {
Char *progName;
/* Application Specific Information */
} G_Env;
PUBLIC TM_ModDesc G_tmDesc;
PUBLIC G_Env G_env;
/* Quick temorary tracing */
Void G_init(void);
Void G_exit(Int code);
Void G_usage(void);
Void G_sigIntr(Int unused);
extern Int G_heartBeat(void);
ESRO_SapSel locSapSel = 14;
ESRO_SapDesc locSapDesc;
ESRO_InvokeId invokeId;
ESRO_EncodingType encodingType;
ESRO_OperationValue operationValue;
#define SHELL_CMD_OP 2
ESRO_SapSel remEsroSapSel = 13;
T_SapSel remTsapSel = {2, {0x22, 0x22} }; /* UDP Port Number */
N_SapAddr remNsapAddr = {4, {198, 62, 92, 14} }; /* Remote IP Address */
ESRO_FunctionalUnit funcUnit = ESRO_3Way;
struct ESRO_Event event;
Bool reset = 0;
#ifdef TM_ENABLED
extern Void DU_init();
#endif
/*<
* Function: G_init
*
* Description: Initialize.
*
* Arguments: None.
*
* Returns: None.
*
>*/
Void
G_init(void)
{
G_tmDesc = TM_open("G_");
if (!G_tmDesc) {
EH_problem("G_init: TM_open G_ failed");
}
signal(SIGINT, G_sigIntr);
}
/*<
* Function: G_exit
*
* Description: Exit.
*
* Arguments: Exit code.
*
* Returns: None.
*
>*/
Void
G_exit(Int code)
{
exit(code);
}
/*<
* Function: G_usage
*
* Description: Usage.
*
* Arguments: None.
*
* Returns: None.
*
>*/
Void
G_usage(void)
{
String usage1 = "[-T G_,ffff]";
String usage2 = "-l localEsroSapSel -r remoteEsroSapSel -p remotePortNu -n remoteIPAdde";
printf("%s: Usage: %s\n", G_env.progName, usage1);
printf("%s: Usage: %s\n", G_env.progName, usage2);
}
/*<
* Function: G_sigIntr
*
* Description: Signal processing.
*
* Arguments: None.
*
* Returns: None.
*
>*/
Void
G_sigIntr(Int unused)
{
/*
ESRO_sapUnbind(locSapSel); commented out to test ill-behaved invokers
*/
signal(SIGINT, G_sigIntr);
G_exit(22);
}
/*<
* Function: G_heartBeat
*
* Description: Heart Beat for the stack.
*
* Arguments: None.
*
* Returns: 0 on successful completion, -1 on unsuccessful completion.
*
>*/
SuccFail
G_heartBeat(void)
{
if (SCH_block() < 0) {
EH_fatal("main: SCH_block returned negative value");
return (FAIL);
}
SCH_run();
return (SUCCESS);
}
int
resultInd (ESRO_InvokeId invokeId,
ESRO_EncodingType encodingType,
DU_View parameter)
{
char *duData;
if (parameter) {
duData = DU_data(parameter);
} else {
duData = "No parameter";
}
printf("-------------------------------------------------------------------\n");
printf("Invoker: Got Result Indication: invokeId=%d, paramter=%s\n",
invokeId, duData);
printf("-------------------------------------------------------------------\n");
reset = 1;
return 1;
}
int
errorInd (ESRO_InvokeId invokeId,
ESRO_EncodingType encodingType,
ESRO_ErrorValue errorValue,
DU_View parameter)
{
char *duData;
if (parameter) {
duData = DU_data(parameter);
} else {
duData = "No parameter";
}
printf("-------------------------------------------------------------------\n");
printf("Invoker: Got Error Indication: invokeId=%d, paramter=%s\n",
invokeId, duData);
printf("-------------------------------------------------------------------\n");
reset = 1;
return 1;
}
int
invokeIndication (ESRO_SapDesc locSapDesc, ESRO_SapSel remESROSap,
T_SapSel *remTsap, N_SapAddr *remNsap, ESRO_InvokeId invokeId,
ESRO_OperationValue opValue, ESRO_EncodingType encodingType,
DU_View parameter)
{
printf("\nInvoker: invokeIndication N/A\n");
return 1;
}
int
resultCnf(ESRO_InvokeId invokeId)
{
printf("\nInvoker: resultCnf N/A\n");
return 1;
}
int
errorCnf(ESRO_InvokeId invokeId)
{
printf("\nInvoker: errorCnf N/A\n");
return 1;
}
int
failureInd(ESRO_InvokeId invokeId, ESRO_FailureValue failureValue)
{
printf("\nInvoker: Failure Indication: InvokeId = %d \n", invokeId);
return 1;
}
/*<
* Function: main()
*
* Description: main function of invoksch.
*
* Arguments: argc, argv.
*
* Returns: None.
*
>*/
Int main(int argc, char **argv)
{
Int c;
Bool badUsage;
G_env.progName = argv[0];
TM_init();
badUsage = FALSE;
while ((c = getopt(argc, argv, "T:l:r:f:p:n:u")) != EOF) {
switch (c) {
case `T':
TM_setUp(optarg);
break;
case `l': /* Local ESRO Sap Selector */
{
Int gotVal;
if ( PF_getInt(optarg, &gotVal, 12, 0, 63) ) {
EH_problem("main: ");
badUsage = TRUE;
} else {
locSapSel = gotVal;
}
}
break;
case `r': /* Remore ESRO Sap Selector */
{
Int gotVal;
if ( PF_getInt(optarg, &gotVal, 13, 0, 63) ) {
EH_problem("main: ");
badUsage = TRUE;
} else {
remEsroSapSel = gotVal;
}
}
break;
case `p': /* Remore Transport Sap Selector, UDP PortNu */
{
Int portNu;
if ( PF_getInt(optarg, &portNu, 0, 0, 10000) ) {
EH_problem("main: ");
badUsage = TRUE;
} else {
INET_portNuToTsapSel((MdInt) portNu, &remTsapSel);
}
}
break;
case `n': /* Remore NSAP Address, NSAP Address */
{
struct in_addr inetAddr;
* ((LgInt *) &inetAddr) = inet_addr(optarg);
INET_in_addrToNsapAddr(&inetAddr, &remNsapAddr);
}
break;
case `f': /* ESRO functional unit */
{
Int gotVal;
if ( PF_getInt(optarg, &gotVal, 12, 0, 63) ) {
EH_problem("main: ");
badUsage = TRUE;
} else {
funcUnit = gotVal;
}
}
break;
case `u':
case `?':
default:
badUsage = TRUE;
break;
}
}
while ((c = getopt(argc, argv, "T:u")) != EOF) {
switch (c) {
case `T':
TM_setUp(optarg);
break;
case `u':
case `?':
default:
badUsage = TRUE;
break;
}
}
if (badUsage) {
G_usage();
G_exit(1);
}
G_init();
G_duMainPool = DU_buildPool(MAXBFSZ, BUFFERS, VIEWS); /* build buf pool */
/* Application Specific Code Goes Here */
{
String invokeParameter = "date";
DU_View invokeDU;
int paramLength;
printf("\nRemote Network Address: %d.%d.%d.%d\n", remNsapAddr.addr[0],
remNsapAddr.addr[1], remNsapAddr.addr,"RFC-2188"[2], remNsapAddr.addr,"RFC-2188"[3]);
printf("\nFunctional Unit: %d-Way handshaking\n", funcUnit);
/* Initialize All relevant modules */
ESRO_init();
TM_validate();
ESRO_CB_sapUnbind(locSapSel);
if (ESRO_CB_sapBind(&locSapDesc, locSapSel,
funcUnit,
invokeIndication,
resultInd,
errorInd, resultCnf,
errorCnf, failureInd) < 0) {
EH_problem("invoke: Could not activate local ESRO SAP.");
G_exit(13);
}
TM_TRACE((G_tmDesc, TM_ENTER,
"invoker: Issue InvokeReq: remSapSel=%d, locSapDesc=%d, param=%s\n",
remEsroSapSel, locSapDesc, invokeParameter));
paramLength = strlen(invokeParameter);
invokeDU = DU_alloc(G_duMainPool, paramLength);
OS_copy(DU_data(invokeDU), invokeParameter, paramLength);
if (ESRO_CB_invokeReq(&invokeId, locSapDesc, remEsroSapSel,
&remTsapSel, &remNsapAddr,
(ESRO_OperationValue) SHELL_CMD_OP,
(ESRO_EncodingType) 2, /* ASCII encoding */
invokeDU) < 0) {
EH_problem("invoke: Could not Invoke");
G_exit(11);
}
DU_free(invokeDU);
while (!reset) {
if (G_heartBeat()) {
G_exit(13);
}
}
ESRO_CB_sapUnbind(locSapSel);
}
exit (SUCCESS);
} /* main() */