diff --git a/remob.c b/remob.c index b565e0e6..ddc7a19b 100644 --- a/remob.c +++ b/remob.c @@ -44,6 +44,7 @@ typedef struct RemServer { int matchMap; int taskActive; int interestActive; + int forwardMessages; SCStore conn; } RemServer; @@ -192,37 +193,42 @@ static int RemSetInterest(RemChannel *rc) { return 0; } /*-------------------------------------------------------------------------*/ -static void RemConnect(RemServer *remserver, RemChannel *rc) { - /* open channel rc, if not yet opened */ +static void RemConnect(RemServer *remserver, int both) { + /* open channel 0 or both channels, if not yet opened */ int iRet; char buf[256]; mkChannel *chan; + int i; + RemChannel *rc; - if (!rc->chan) { - rc->timeout = 0; - chan = NETConnect(remserver->host, remserver->port); - if (!chan) { - return; - } - 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; - } + for (i = 0; i <= both; i++) { + rc = &remserver->rc[i]; + if (!rc->chan) { + rc->timeout = 0; + chan = NETConnect(remserver->host, remserver->port); + if (!chan) { 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); + 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; close: @@ -253,16 +259,18 @@ static int RemServerTask(void *data) { } } - /* forward all other messages */ - pCon = SCLoad(&remserver->conn); - if (pCon) { - RemCopy(rc, pCon); + if (remserver->forwardMessages) { + /* forward all other messages */ + pCon = SCLoad(&remserver->conn); + if (pCon) { + RemCopy(rc, pCon); + } } } return 1; } /*-------------------------------------------------------------------------*/ -static int RemTransact(RemServer *remserver, RemChannel *rc, SConnection *pCon, +static int RemTransact(RemServer *remserver, int nChan, SConnection *pCon, char *cmd, ...) { /* the variable arguments are for filtering: @@ -278,7 +286,8 @@ static int RemTransact(RemServer *remserver, RemChannel *rc, SConnection *pCon, va_list ap; int try; int argMask; - + RemChannel *rc = &remserver->rc[nChan]; + try=2; if (rc->timeout) { /* eat old responses */ while (RemRead(rc, 0) > 0) { @@ -286,10 +295,8 @@ static int RemTransact(RemServer *remserver, RemChannel *rc, SConnection *pCon, } } tryagain: - strcpy(buf, "transact "); - strcat(buf, cmd); - strcat(buf,"\n"); - RemConnect(remserver, rc); + snprintf(buf, sizeof buf, "transact %s\n", cmd); + RemConnect(remserver, nChan); iRet = RemWrite(rc, buf); if (iRet < 0) goto close; @@ -365,8 +372,9 @@ static int RemobHalt(void *self) { char buf[64]; assert(remob); - RemConnect(remserver, rc); + RemConnect(remserver, 1); snprintf(buf, sizeof(buf), "stopexe %s\n", remob->name); + remob->status = HWFault; return RemWrite(rc, buf); } @@ -394,7 +402,7 @@ static float RemobGetValue(void *pData, SConnection *pCon) { value= none; snprintf(buf, sizeof(buf), "<%s", remob->name); /* 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) { return 0.0; } @@ -456,25 +464,27 @@ static long RemobRun(void *self, SConnection *pCon, float fNew) { float fDelta; int rights; RemChannel *rc; - + int nChan; + remserver = remob->server; SCSave(&remserver->conn, pCon); assert(remob); assert(pCon); rights = SCGetRights(pCon); - rc = &remserver->rc[rights <= usUser]; - RemConnect(remserver, &remserver->rc[0]); /* connect spy for listexe interest */ + nChan = rights <= usUser; + rc = &remserver->rc[nChan]; + RemConnect(remserver, 0); /* connect spy for listexe interest */ remob->status = HWIdle; 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 (remserver->matchMap & 1) { /* already running, stop first */ remob->status = HWBusy; 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; while (remob->status == HWBusy) { iRet = RemRead(rc, 1000); @@ -483,7 +493,7 @@ static long RemobRun(void *self, SConnection *pCon, float fNew) { RemCopy(rc, pCon); } } - iRet = RemTransact(remserver, rc, pCon, buf, ">", NULL); + iRet = RemTransact(remserver, nChan, pCon, buf, ">", NULL); if (iRet <= 0) return 0; } /* wait for "started" message */ @@ -542,6 +552,7 @@ int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData, char acce[128], inte[128]; */ int rights; + int nChan; RemChannel *rc; assert(pCon); @@ -549,12 +560,13 @@ int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData, assert(remob); rights = SCGetRights(pCon); - rc = &remserver->rc[rights <= usUser]; + nChan = (rights <= usUser); + rc = &remserver->rc[nChan]; if (rights >= usUser) { SCSave(&remserver->conn, pCon); } 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) { /* 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); if (cmd) { - RemTransact(remserver, rc, pCon, cmd, ">", NULL); + RemTransact(remserver, nChan, pCon, cmd, ">", NULL); if (cmd != buf) free(cmd); } iRet=1; @@ -572,7 +584,7 @@ int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData, for (i=1; i", NULL); + iRet = RemTransact(remserver, nChan, pCon, buf, ">", NULL); } return iRet; } @@ -629,7 +641,7 @@ int RemServerAction(SConnection *pCon, SicsInterp *pSics, void *pData, struct sockaddr_in adr; struct hostent *thishost; Remob *p, *next; - int rights; + int rights, nChan; RemChannel *rc; assert(pCon); @@ -637,8 +649,9 @@ int RemServerAction(SConnection *pCon, SicsInterp *pSics, void *pData, assert(remserver); rights = SCGetRights(pCon); - rc = &remserver->rc[rights <= usUser]; - if (rights >= usUser) { + nChan = (rights <= usUser); + rc = &remserver->rc[nChan]; + if (nChan) { SCSave(&remserver->conn, pCon); } if (argc == 1) { @@ -658,7 +671,7 @@ int RemServerAction(SConnection *pCon, SicsInterp *pSics, void *pData, SCPrintf(pCon, eStatus, "%s = %s:%d %s:%s", argv[0], remserver->host, remserver->port, thishostname, serverport); } else if (argc>2 && strcasecmp(argv[1],"nowait") == 0) { - RemConnect(remserver, rc); + RemConnect(remserver, nChan); for (i=2; i2) { RemWrite(rc, " "); @@ -690,7 +703,7 @@ int RemServerAction(SConnection *pCon, SicsInterp *pSics, void *pData, for (i=1; i", NULL); + iRet = RemTransact(remserver, nChan, pCon, buf, ">", NULL); return iRet; } return 1; @@ -826,6 +839,7 @@ static RemServer *RemServerInit(char *name, char *host, int port) { } remserver->taskActive = 1; remserver->interestActive = 0; + remserver->forwardMessages = 1; TaskRegister(pServ->pTasker, RemServerTask, NULL, RemServerKill, remserver, 1); return remserver; } @@ -854,8 +868,11 @@ int RemobCreate(SConnection *pCon, SicsInterp *pSics, void *pData, argtolower(argc,argv); if (argc >= 4 && strcmp(argv[1], "server") == 0) { - if (argc == 5) { + if (argc >= 5) { remserver = RemServerInit(argv[2], argv[3], atoi(argv[4])); + if (remserver && argc > 5 && argv[5][0] == '0') { + remserver->forwardMessages = 0; + } } else { p = strchr(argv[3], ':'); if (!p) {