- messages from SICS should not be forwared to SEA

This commit is contained in:
zolliker
2007-02-23 12:44:36 +00:00
parent 7d41d94bdc
commit 388cc4bdeb

119
remob.c
View File

@ -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,7 +286,8 @@ 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 */
while (RemRead(rc, 0) > 0) { while (RemRead(rc, 0) > 0) {
@ -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,25 +464,27 @@ 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);
assert(remob); assert(remob);
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) {