PSI sics-cvs-psi-2008-10-02

This commit is contained in:
2008-10-02 00:00:00 +00:00
committed by Douglas Clowes
parent 6e926b813f
commit 4baffb9b7a
304 changed files with 77527 additions and 3612 deletions

152
remob.c
View File

@@ -19,6 +19,7 @@ M. Zolliker July 04
#include "status.h"
#include "servlog.h"
#include "site.h"
#include "commandlog.h"
/*-------------------------------------------------------------------------*/
#define INTERRUPTMODE 0
#define ACCESSCODE 1
@@ -43,7 +44,8 @@ typedef struct RemServer {
int matchMap;
int taskActive;
int interestActive;
SCStore conn;
int forwardMessages;
SCStore *conn;
} RemServer;
struct Remob {
@@ -191,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:
@@ -242,24 +249,29 @@ static int RemServerTask(void *data) {
rc = &remserver->rc[isUser];
if (RemRead(rc, 0) <= 0) continue;
/* printf("< %s\n", buf); */
if (strstr(rc->line, " ") == rc->line) {
WriteToCommandLog("REMOB>", "infinite echo loop detected");
continue;
}
if (isUser == 0) {
if (RemHandle(remserver)) { /* handle drivstat messages */
continue;
}
}
/* forward all other messages */
pCon = SCLoad(&remserver->conn);
if (pCon) {
RemCopy(rc, pCon);
if (remserver->forwardMessages) {
/* forward all other messages */
if (SCStoreConnected(remserver->conn)) {
pCon = SCStorePush(remserver->conn);
RemCopy(rc, pCon);
SCStorePop(remserver->conn);
}
}
}
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:
@@ -275,7 +287,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) {
@@ -283,10 +296,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;
@@ -362,8 +373,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);
}
@@ -386,12 +398,12 @@ static float RemobGetValue(void *pData, SConnection *pCon) {
assert(remob);
SCSave(&remserver->conn, pCon);
remserver->conn = SCSave(pCon, remserver->conn);
none = -1.25e6;
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;
}
@@ -437,7 +449,7 @@ static int RemobStatus(void *pData, SConnection *pCon) {
assert(remob);
SCSave(&remob->server->conn, pCon);
remob->server->conn = SCSave(pCon, remob->server->conn);
return remob->status;
}
/*---------------------------------------------------------------------------*/
@@ -453,25 +465,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);
remserver->conn = SCSave(pCon, remserver->conn);
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);
@@ -480,7 +494,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 */
@@ -534,12 +548,12 @@ int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData,
float fValue;
long lID;
char *endp;
char *argv0;
char *cmd;
/*
char acce[128], inte[128];
*/
int rights;
int nChan;
RemChannel *rc;
assert(pCon);
@@ -547,24 +561,25 @@ 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);
remserver->conn = SCSave(pCon, remserver->conn);
}
if (argc == 1) {
iRet = RemTransact(remserver, rc, pCon, argv[0], ">", NULL);
iRet = RemTransact(remserver, nChan, pCon, remob->name, ">", NULL);
} else if (strcasecmp(argv[1],"interest") == 0) {
/* ignore interest commands, as they would not work properly */
iRet=1;
} else if (strcasecmp(argv[1],"list") == 0) {
/*
snprintf(acce, sizeof(acce), "!%s.accesscode", remob->name);
snprintf(inte, sizeof(inte), "!%s.interruptmode", remob->name);
*/
argv0 = argv[0];
argv[0] = remob->name;
cmd = Arg2Tcl(argc, argv, buf, sizeof buf);
argv[0] = argv0;
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;
@@ -573,7 +588,7 @@ int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData,
for (i=1; i<argc; 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;
}
@@ -622,7 +637,7 @@ int RemServerAction(SConnection *pCon, SicsInterp *pSics, void *pData,
TokenList *pCurrent;
TokenList *pName;
int iRet;
int i;
socklen_t i;
int pos;
float fValue;
long lID;
@@ -630,7 +645,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);
@@ -638,9 +653,10 @@ int RemServerAction(SConnection *pCon, SicsInterp *pSics, void *pData,
assert(remserver);
rights = SCGetRights(pCon);
rc = &remserver->rc[rights <= usUser];
if (rights >= usUser) {
SCSave(&remserver->conn, pCon);
nChan = (rights <= usUser);
rc = &remserver->rc[nChan];
if (nChan) {
remserver->conn = SCSave(pCon, remserver->conn);
}
if (argc == 1) {
serverport = IFindOption(pSICSOptions,"ServerPort");
@@ -659,7 +675,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; i<argc; i++) {
if (i>2) {
RemWrite(rc, " ");
@@ -691,7 +707,7 @@ int RemServerAction(SConnection *pCon, SicsInterp *pSics, void *pData,
for (i=1; i<argc; 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 1;
@@ -718,6 +734,7 @@ static void RemServerKill(void *self) {
DeleteDescriptor(remserver->desc);
if (remserver->name) free(remserver->name);
if (remserver->host) free(remserver->host);
SCStoreFree(remserver->conn);
free(remserver);
}
/*-----------------------------------------------------------------------*/
@@ -818,6 +835,7 @@ static RemServer *RemServerInit(char *name, char *host, int port) {
rc->timeout = 0;
}
remserver->objList = NULL;
remserver->conn = NULL;
if (!remserver->name ||
!remserver->host ||
!remserver->port) {
@@ -827,6 +845,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;
}
@@ -855,8 +874,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) {