- messages from SICS should not be forwared to SEA
This commit is contained in:
115
remob.c
115
remob.c
@ -44,6 +44,7 @@ typedef struct RemServer {
|
|||||||
int matchMap;
|
int matchMap;
|
||||||
int taskActive;
|
int taskActive;
|
||||||
int interestActive;
|
int interestActive;
|
||||||
|
int forwardMessages;
|
||||||
SCStore conn;
|
SCStore conn;
|
||||||
} RemServer;
|
} RemServer;
|
||||||
|
|
||||||
@ -192,37 +193,42 @@ static int RemSetInterest(RemChannel *rc) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static void RemConnect(RemServer *remserver, RemChannel *rc) {
|
static void RemConnect(RemServer *remserver, int both) {
|
||||||
/* open channel rc, if not yet opened */
|
/* open channel 0 or both channels, if not yet opened */
|
||||||
int iRet;
|
int iRet;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
mkChannel *chan;
|
mkChannel *chan;
|
||||||
|
int i;
|
||||||
|
RemChannel *rc;
|
||||||
|
|
||||||
if (!rc->chan) {
|
for (i = 0; i <= both; i++) {
|
||||||
rc->timeout = 0;
|
rc = &remserver->rc[i];
|
||||||
chan = NETConnect(remserver->host, remserver->port);
|
if (!rc->chan) {
|
||||||
if (!chan) {
|
rc->timeout = 0;
|
||||||
return;
|
chan = NETConnect(remserver->host, remserver->port);
|
||||||
}
|
if (!chan) {
|
||||||
rc->chan = chan;
|
|
||||||
if (rc != &remserver->rc[0]) { /* open the user channel */
|
|
||||||
iRet = RemWrite(rc, "remuser sesam\n");
|
|
||||||
} else { /* open spy channel */
|
|
||||||
iRet = RemWrite(rc, "Spy 007\n");
|
|
||||||
}
|
|
||||||
if (iRet < 0) goto close;
|
|
||||||
iRet = RemRead(rc, 1000);
|
|
||||||
while (iRet > 0) { /* eat login response */
|
|
||||||
if (StartsWith(rc->line, "Login OK")) {
|
|
||||||
/* printf("connected\n"); */
|
|
||||||
if (remserver->interestActive && rc == &remserver->rc[0]) { /* open the user channel */
|
|
||||||
if (!RemSetInterest(rc)) goto close;
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
rc->chan = chan;
|
||||||
|
if (i != 0) { /* open the user channel */
|
||||||
|
iRet = RemWrite(rc, "remuser sesam\n");
|
||||||
|
} else { /* open spy channel */
|
||||||
|
iRet = RemWrite(rc, "Spy 007\n");
|
||||||
|
}
|
||||||
|
if (iRet < 0) goto close;
|
||||||
iRet = RemRead(rc, 1000);
|
iRet = RemRead(rc, 1000);
|
||||||
|
while (iRet > 0) { /* eat login response */
|
||||||
|
if (StartsWith(rc->line, "Login OK")) {
|
||||||
|
/* printf("connected\n"); */
|
||||||
|
if (remserver->interestActive && rc == &remserver->rc[0]) { /* open the user channel */
|
||||||
|
if (!RemSetInterest(rc)) goto close;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
iRet = RemRead(rc, 1000);
|
||||||
|
}
|
||||||
|
if (iRet <= 0) goto close;
|
||||||
}
|
}
|
||||||
goto close;
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
close:
|
close:
|
||||||
@ -253,16 +259,18 @@ static int RemServerTask(void *data) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* forward all other messages */
|
if (remserver->forwardMessages) {
|
||||||
pCon = SCLoad(&remserver->conn);
|
/* forward all other messages */
|
||||||
if (pCon) {
|
pCon = SCLoad(&remserver->conn);
|
||||||
RemCopy(rc, pCon);
|
if (pCon) {
|
||||||
|
RemCopy(rc, pCon);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static int RemTransact(RemServer *remserver, RemChannel *rc, SConnection *pCon,
|
static int RemTransact(RemServer *remserver, int nChan, SConnection *pCon,
|
||||||
char *cmd, ...) {
|
char *cmd, ...) {
|
||||||
/* the variable arguments are for filtering:
|
/* the variable arguments are for filtering:
|
||||||
|
|
||||||
@ -278,6 +286,7 @@ static int RemTransact(RemServer *remserver, RemChannel *rc, SConnection *pCon,
|
|||||||
va_list ap;
|
va_list ap;
|
||||||
int try;
|
int try;
|
||||||
int argMask;
|
int argMask;
|
||||||
|
RemChannel *rc = &remserver->rc[nChan];
|
||||||
|
|
||||||
try=2;
|
try=2;
|
||||||
if (rc->timeout) { /* eat old responses */
|
if (rc->timeout) { /* eat old responses */
|
||||||
@ -286,10 +295,8 @@ static int RemTransact(RemServer *remserver, RemChannel *rc, SConnection *pCon,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
tryagain:
|
tryagain:
|
||||||
strcpy(buf, "transact ");
|
snprintf(buf, sizeof buf, "transact %s\n", cmd);
|
||||||
strcat(buf, cmd);
|
RemConnect(remserver, nChan);
|
||||||
strcat(buf,"\n");
|
|
||||||
RemConnect(remserver, rc);
|
|
||||||
iRet = RemWrite(rc, buf);
|
iRet = RemWrite(rc, buf);
|
||||||
if (iRet < 0) goto close;
|
if (iRet < 0) goto close;
|
||||||
|
|
||||||
@ -365,8 +372,9 @@ static int RemobHalt(void *self) {
|
|||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
assert(remob);
|
assert(remob);
|
||||||
RemConnect(remserver, rc);
|
RemConnect(remserver, 1);
|
||||||
snprintf(buf, sizeof(buf), "stopexe %s\n", remob->name);
|
snprintf(buf, sizeof(buf), "stopexe %s\n", remob->name);
|
||||||
|
remob->status = HWFault;
|
||||||
return RemWrite(rc, buf);
|
return RemWrite(rc, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -394,7 +402,7 @@ static float RemobGetValue(void *pData, SConnection *pCon) {
|
|||||||
value= none;
|
value= none;
|
||||||
snprintf(buf, sizeof(buf), "<%s", remob->name);
|
snprintf(buf, sizeof(buf), "<%s", remob->name);
|
||||||
/* get value needs only spy priviledge */
|
/* get value needs only spy priviledge */
|
||||||
iRet = RemTransact(remserver, &remserver->rc[0], pCon, remob->name, buf, &value, ">", NULL);
|
iRet = RemTransact(remserver, 0, pCon, remob->name, buf, &value, ">", NULL);
|
||||||
if (iRet <= 0) {
|
if (iRet <= 0) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
@ -456,6 +464,7 @@ static long RemobRun(void *self, SConnection *pCon, float fNew) {
|
|||||||
float fDelta;
|
float fDelta;
|
||||||
int rights;
|
int rights;
|
||||||
RemChannel *rc;
|
RemChannel *rc;
|
||||||
|
int nChan;
|
||||||
|
|
||||||
remserver = remob->server;
|
remserver = remob->server;
|
||||||
SCSave(&remserver->conn, pCon);
|
SCSave(&remserver->conn, pCon);
|
||||||
@ -463,18 +472,19 @@ static long RemobRun(void *self, SConnection *pCon, float fNew) {
|
|||||||
assert(pCon);
|
assert(pCon);
|
||||||
|
|
||||||
rights = SCGetRights(pCon);
|
rights = SCGetRights(pCon);
|
||||||
rc = &remserver->rc[rights <= usUser];
|
nChan = rights <= usUser;
|
||||||
RemConnect(remserver, &remserver->rc[0]); /* connect spy for listexe interest */
|
rc = &remserver->rc[nChan];
|
||||||
|
RemConnect(remserver, 0); /* connect spy for listexe interest */
|
||||||
|
|
||||||
remob->status = HWIdle;
|
remob->status = HWIdle;
|
||||||
snprintf(buf, sizeof(buf), "run %s %f", remob->name, fNew);
|
snprintf(buf, sizeof(buf), "run %s %f", remob->name, fNew);
|
||||||
iRet = RemTransact(remserver, rc, pCon, buf, "!ERROR: somebody else", "!ERROR: cannot", ">", NULL);
|
iRet = RemTransact(remserver, nChan, pCon, buf, "!ERROR: somebody else", "!ERROR: cannot", ">", NULL);
|
||||||
if (iRet <= 0) return 0;
|
if (iRet <= 0) return 0;
|
||||||
|
|
||||||
if (remserver->matchMap & 1) { /* already running, stop first */
|
if (remserver->matchMap & 1) { /* already running, stop first */
|
||||||
remob->status = HWBusy;
|
remob->status = HWBusy;
|
||||||
snprintf(sBuf, sizeof(sBuf), "stopexe %s", remob->name);
|
snprintf(sBuf, sizeof(sBuf), "stopexe %s", remob->name);
|
||||||
iRet = RemTransact(remserver, rc, pCon, sBuf, ">", NULL);
|
iRet = RemTransact(remserver, nChan, pCon, sBuf, ">", NULL);
|
||||||
if (iRet <= 0) return 0;
|
if (iRet <= 0) return 0;
|
||||||
while (remob->status == HWBusy) {
|
while (remob->status == HWBusy) {
|
||||||
iRet = RemRead(rc, 1000);
|
iRet = RemRead(rc, 1000);
|
||||||
@ -483,7 +493,7 @@ static long RemobRun(void *self, SConnection *pCon, float fNew) {
|
|||||||
RemCopy(rc, pCon);
|
RemCopy(rc, pCon);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iRet = RemTransact(remserver, rc, pCon, buf, ">", NULL);
|
iRet = RemTransact(remserver, nChan, pCon, buf, ">", NULL);
|
||||||
if (iRet <= 0) return 0;
|
if (iRet <= 0) return 0;
|
||||||
}
|
}
|
||||||
/* wait for "started" message */
|
/* wait for "started" message */
|
||||||
@ -542,6 +552,7 @@ int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
char acce[128], inte[128];
|
char acce[128], inte[128];
|
||||||
*/
|
*/
|
||||||
int rights;
|
int rights;
|
||||||
|
int nChan;
|
||||||
RemChannel *rc;
|
RemChannel *rc;
|
||||||
|
|
||||||
assert(pCon);
|
assert(pCon);
|
||||||
@ -549,12 +560,13 @@ int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
assert(remob);
|
assert(remob);
|
||||||
|
|
||||||
rights = SCGetRights(pCon);
|
rights = SCGetRights(pCon);
|
||||||
rc = &remserver->rc[rights <= usUser];
|
nChan = (rights <= usUser);
|
||||||
|
rc = &remserver->rc[nChan];
|
||||||
if (rights >= usUser) {
|
if (rights >= usUser) {
|
||||||
SCSave(&remserver->conn, pCon);
|
SCSave(&remserver->conn, pCon);
|
||||||
}
|
}
|
||||||
if (argc == 1) {
|
if (argc == 1) {
|
||||||
iRet = RemTransact(remserver, rc, pCon, argv[0], ">", NULL);
|
iRet = RemTransact(remserver, nChan, pCon, argv[0], ">", NULL);
|
||||||
} else if (strcasecmp(argv[1],"list") == 0) {
|
} else if (strcasecmp(argv[1],"list") == 0) {
|
||||||
/*
|
/*
|
||||||
snprintf(acce, sizeof(acce), "!%s.accesscode", remob->name);
|
snprintf(acce, sizeof(acce), "!%s.accesscode", remob->name);
|
||||||
@ -563,7 +575,7 @@ int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
|
|
||||||
cmd = Arg2Tcl0(argc-1, argv+1, buf, sizeof buf, remob->name);
|
cmd = Arg2Tcl0(argc-1, argv+1, buf, sizeof buf, remob->name);
|
||||||
if (cmd) {
|
if (cmd) {
|
||||||
RemTransact(remserver, rc, pCon, cmd, ">", NULL);
|
RemTransact(remserver, nChan, pCon, cmd, ">", NULL);
|
||||||
if (cmd != buf) free(cmd);
|
if (cmd != buf) free(cmd);
|
||||||
}
|
}
|
||||||
iRet=1;
|
iRet=1;
|
||||||
@ -572,7 +584,7 @@ int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
for (i=1; i<argc; i++) {
|
for (i=1; i<argc; i++) {
|
||||||
pos+=snprintf(buf+pos, sizeof(buf)-pos, "%s ", argv[i]);
|
pos+=snprintf(buf+pos, sizeof(buf)-pos, "%s ", argv[i]);
|
||||||
}
|
}
|
||||||
iRet = RemTransact(remserver, rc, pCon, buf, ">", NULL);
|
iRet = RemTransact(remserver, nChan, pCon, buf, ">", NULL);
|
||||||
}
|
}
|
||||||
return iRet;
|
return iRet;
|
||||||
}
|
}
|
||||||
@ -629,7 +641,7 @@ int RemServerAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
struct sockaddr_in adr;
|
struct sockaddr_in adr;
|
||||||
struct hostent *thishost;
|
struct hostent *thishost;
|
||||||
Remob *p, *next;
|
Remob *p, *next;
|
||||||
int rights;
|
int rights, nChan;
|
||||||
RemChannel *rc;
|
RemChannel *rc;
|
||||||
|
|
||||||
assert(pCon);
|
assert(pCon);
|
||||||
@ -637,8 +649,9 @@ int RemServerAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
assert(remserver);
|
assert(remserver);
|
||||||
|
|
||||||
rights = SCGetRights(pCon);
|
rights = SCGetRights(pCon);
|
||||||
rc = &remserver->rc[rights <= usUser];
|
nChan = (rights <= usUser);
|
||||||
if (rights >= usUser) {
|
rc = &remserver->rc[nChan];
|
||||||
|
if (nChan) {
|
||||||
SCSave(&remserver->conn, pCon);
|
SCSave(&remserver->conn, pCon);
|
||||||
}
|
}
|
||||||
if (argc == 1) {
|
if (argc == 1) {
|
||||||
@ -658,7 +671,7 @@ int RemServerAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
SCPrintf(pCon, eStatus, "%s = %s:%d %s:%s",
|
SCPrintf(pCon, eStatus, "%s = %s:%d %s:%s",
|
||||||
argv[0], remserver->host, remserver->port, thishostname, serverport);
|
argv[0], remserver->host, remserver->port, thishostname, serverport);
|
||||||
} else if (argc>2 && strcasecmp(argv[1],"nowait") == 0) {
|
} else if (argc>2 && strcasecmp(argv[1],"nowait") == 0) {
|
||||||
RemConnect(remserver, rc);
|
RemConnect(remserver, nChan);
|
||||||
for (i=2; i<argc; i++) {
|
for (i=2; i<argc; i++) {
|
||||||
if (i>2) {
|
if (i>2) {
|
||||||
RemWrite(rc, " ");
|
RemWrite(rc, " ");
|
||||||
@ -690,7 +703,7 @@ int RemServerAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
for (i=1; i<argc; i++) {
|
for (i=1; i<argc; i++) {
|
||||||
pos+=snprintf(buf+pos, sizeof(buf)-pos, "%s ", argv[i]);
|
pos+=snprintf(buf+pos, sizeof(buf)-pos, "%s ", argv[i]);
|
||||||
}
|
}
|
||||||
iRet = RemTransact(remserver, rc, pCon, buf, ">", NULL);
|
iRet = RemTransact(remserver, nChan, pCon, buf, ">", NULL);
|
||||||
return iRet;
|
return iRet;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@ -826,6 +839,7 @@ static RemServer *RemServerInit(char *name, char *host, int port) {
|
|||||||
}
|
}
|
||||||
remserver->taskActive = 1;
|
remserver->taskActive = 1;
|
||||||
remserver->interestActive = 0;
|
remserver->interestActive = 0;
|
||||||
|
remserver->forwardMessages = 1;
|
||||||
TaskRegister(pServ->pTasker, RemServerTask, NULL, RemServerKill, remserver, 1);
|
TaskRegister(pServ->pTasker, RemServerTask, NULL, RemServerKill, remserver, 1);
|
||||||
return remserver;
|
return remserver;
|
||||||
}
|
}
|
||||||
@ -854,8 +868,11 @@ int RemobCreate(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
|
|
||||||
argtolower(argc,argv);
|
argtolower(argc,argv);
|
||||||
if (argc >= 4 && strcmp(argv[1], "server") == 0) {
|
if (argc >= 4 && strcmp(argv[1], "server") == 0) {
|
||||||
if (argc == 5) {
|
if (argc >= 5) {
|
||||||
remserver = RemServerInit(argv[2], argv[3], atoi(argv[4]));
|
remserver = RemServerInit(argv[2], argv[3], atoi(argv[4]));
|
||||||
|
if (remserver && argc > 5 && argv[5][0] == '0') {
|
||||||
|
remserver->forwardMessages = 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
p = strchr(argv[3], ':');
|
p = strchr(argv[3], ':');
|
||||||
if (!p) {
|
if (!p) {
|
||||||
|
Reference in New Issue
Block a user