- remob uses now two connections (spy/user), bug fixes
This commit is contained in:
278
remob.c
278
remob.c
@ -26,19 +26,23 @@ M. Zolliker July 04
|
|||||||
/*------------------------------------------------------------------------ */
|
/*------------------------------------------------------------------------ */
|
||||||
typedef struct Remob Remob;
|
typedef struct Remob Remob;
|
||||||
|
|
||||||
|
typedef struct RemChannel {
|
||||||
|
mkChannel *chan;
|
||||||
|
int timeout;
|
||||||
|
int incomplete;
|
||||||
|
char line[256];
|
||||||
|
} RemChannel;
|
||||||
|
|
||||||
typedef struct RemServer {
|
typedef struct RemServer {
|
||||||
pObjectDescriptor desc;
|
pObjectDescriptor desc;
|
||||||
char *name;
|
char *name;
|
||||||
char *host;
|
char *host;
|
||||||
int port;
|
int port;
|
||||||
int actChan; /* 0 or 1 */
|
RemChannel rc[2];
|
||||||
mkChannel *chans[2]; /* 0: Spy, 1: User */
|
|
||||||
int incomplete;
|
|
||||||
char line[256];
|
|
||||||
Remob *objList;
|
Remob *objList;
|
||||||
int matchMap;
|
int matchMap;
|
||||||
int timeout;
|
|
||||||
int taskActive;
|
int taskActive;
|
||||||
|
int interestActive;
|
||||||
SCStore conn;
|
SCStore conn;
|
||||||
} RemServer;
|
} RemServer;
|
||||||
|
|
||||||
@ -80,14 +84,12 @@ static char *StartsWith(char *line, char *name) {
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static int RemWrite(RemServer *remserver, char *line) {
|
static int RemWrite(RemChannel *rc, char *line) {
|
||||||
int iret;
|
int iret;
|
||||||
mkChannel *chan;
|
|
||||||
|
|
||||||
chan = remserver->chans[remserver->actChan];
|
if (rc->chan) {
|
||||||
if (chan) {
|
|
||||||
/* printf("> %s\n", line); */
|
/* printf("> %s\n", line); */
|
||||||
iret = NETWrite(chan, line, strlen(line));
|
iret = NETWrite(rc->chan, line, strlen(line));
|
||||||
if (iret == 0) iret = -1;
|
if (iret == 0) iret = -1;
|
||||||
return iret;
|
return iret;
|
||||||
} else {
|
} else {
|
||||||
@ -95,19 +97,17 @@ static int RemWrite(RemServer *remserver, char *line) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static int RemRead(RemServer *remserver, long tmo) {
|
static int RemRead(RemChannel *rc, long tmo) {
|
||||||
int iRet;
|
int iRet;
|
||||||
mkChannel *chan;
|
|
||||||
|
|
||||||
chan = remserver->chans[remserver->actChan];
|
if (rc->chan == NULL) return 0; /* no data */
|
||||||
if (chan == NULL) return 0; /* no data */
|
iRet = NETReadTillTermNew(rc->chan, tmo, "\n", rc->line + rc->incomplete,
|
||||||
iRet = NETReadTillTermNew(chan, tmo, "\n",
|
sizeof(rc->line) - rc->incomplete);
|
||||||
remserver->line+remserver->incomplete, sizeof(remserver->line)-remserver->incomplete);
|
|
||||||
if (iRet == 0) {
|
if (iRet == 0) {
|
||||||
remserver->incomplete = strlen(remserver->line); /* number of chars already received */
|
rc->incomplete = strlen(rc->line); /* number of chars already received */
|
||||||
return 0; /* timeout */
|
return 0; /* timeout */
|
||||||
} else {
|
} else {
|
||||||
remserver->incomplete=0;
|
rc->incomplete=0;
|
||||||
}
|
}
|
||||||
return iRet;
|
return iRet;
|
||||||
}
|
}
|
||||||
@ -115,16 +115,21 @@ static int RemRead(RemServer *remserver, long tmo) {
|
|||||||
static int RemHandle(RemServer *remserver) {
|
static int RemHandle(RemServer *remserver) {
|
||||||
char *line, *par, *str;
|
char *line, *par, *str;
|
||||||
Remob *remob;
|
Remob *remob;
|
||||||
|
RemChannel *rc;
|
||||||
|
|
||||||
|
rc = &remserver->rc[0]; /* drivstat messages appear only on the spy channel */
|
||||||
|
|
||||||
/* skip whitespace at the beginning */
|
/* skip whitespace at the beginning */
|
||||||
line=remserver->line;
|
line=rc->line;
|
||||||
|
if (line[0] == '\0') return 0; /* return when line is empty */
|
||||||
while (*line < ' ' && *line != '\0') {
|
while (*line < ' ' && *line != '\0') {
|
||||||
line++;
|
line++;
|
||||||
}
|
}
|
||||||
memmove(remserver->line, line, strlen(line));
|
memmove(rc->line, line, strlen(line));
|
||||||
|
|
||||||
/* handle drivstat messages */
|
/* handle drivstat messages */
|
||||||
line = remserver->line;
|
line = rc->line;
|
||||||
|
|
||||||
for (remob = remserver->objList; remob != NULL; remob = remob->next) {
|
for (remob = remserver->objList; remob != NULL; remob = remob->next) {
|
||||||
par=StartsWith(line, remob->name);
|
par=StartsWith(line, remob->name);
|
||||||
if (par != NULL) {
|
if (par != NULL) {
|
||||||
@ -147,51 +152,74 @@ static int RemHandle(RemServer *remserver) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static void RemCopy(RemServer *remserver, SConnection *pCon) {
|
static void RemCopy(RemChannel *rc, SConnection *pCon) {
|
||||||
if (pCon != NULL && remserver->line[0] != '\0') {
|
if (pCon != NULL && rc->line[0] != '\0') {
|
||||||
SCPrintf(pCon, eStatus, " %s", remserver->line);
|
SCPrintf(pCon, eStatus, " %s", rc->line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static void RemDisconnect(RemServer *remserver) {
|
static void RemDisconnect(RemServer *remserver) {
|
||||||
int i;
|
int isUser;
|
||||||
|
RemChannel *rc;
|
||||||
|
|
||||||
for (i=0; i<2; i++) {
|
for (isUser=0; isUser<=1; isUser++) {
|
||||||
if (remserver->chans[i] != NULL) {
|
rc = &remserver->rc[isUser];
|
||||||
NETClosePort(remserver->chans[i]);
|
if (rc->chan != NULL) {
|
||||||
free(remserver->chans[i]);
|
NETClosePort(rc->chan);
|
||||||
remserver->chans[i]=NULL;
|
free(rc->chan);
|
||||||
|
rc->chan = NULL;
|
||||||
/* printf("disconnected\n"); */
|
/* printf("disconnected\n"); */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static void RemConnect(RemServer *remserver) {
|
static int RemSetInterest(RemChannel *rc) {
|
||||||
|
int iRet;
|
||||||
|
|
||||||
|
if (rc->chan != NULL) { /* already connected */
|
||||||
|
iRet = RemWrite(rc, "transact listexe interest\n");
|
||||||
|
if (iRet >= 0) {
|
||||||
|
iRet = RemRead(rc, 1000);
|
||||||
|
while (iRet > 0) { /* eat response */
|
||||||
|
if (StartsWith(rc->line, "TRANSACTIONFINISHED")) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
iRet = RemRead(rc, 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*-------------------------------------------------------------------------*/
|
||||||
|
static void RemConnect(RemServer *remserver, RemChannel *rc) {
|
||||||
|
/* open channel rc, if not yet opened */
|
||||||
int iRet;
|
int iRet;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
mkChannel *chan;
|
mkChannel *chan;
|
||||||
|
|
||||||
chan = remserver->chans[remserver->actChan];
|
if (!rc->chan) {
|
||||||
if (!chan) {
|
rc->timeout = 0;
|
||||||
remserver->timeout = 0;
|
|
||||||
chan = NETConnect(remserver->host, remserver->port);
|
chan = NETConnect(remserver->host, remserver->port);
|
||||||
if (!chan) {
|
if (!chan) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
remserver->chans[remserver->actChan] = chan;
|
rc->chan = chan;
|
||||||
if (remserver->actChan == 0) {
|
if (rc != &remserver->rc[0]) { /* open the user channel */
|
||||||
iRet = RemWrite(remserver, "Spy 007\ntransact listexe interest\n");
|
iRet = RemWrite(rc, "remuser sesam\n");
|
||||||
} else {
|
} else { /* open spy channel */
|
||||||
iRet = RemWrite(remserver, "remuser sesam\ntransact listexe interest\n");
|
iRet = RemWrite(rc, "Spy 007\n");
|
||||||
}
|
}
|
||||||
if (iRet < 0) goto close;
|
if (iRet < 0) goto close;
|
||||||
iRet = RemRead(remserver, 1000);
|
iRet = RemRead(rc, 1000);
|
||||||
while (iRet > 0) { /* eat login response */
|
while (iRet > 0) { /* eat login response */
|
||||||
if (StartsWith(remserver->line, "TRANSACTIONFINISHED")) {
|
if (StartsWith(rc->line, "Login OK")) {
|
||||||
/* printf("connected\n"); */
|
/* printf("connected\n"); */
|
||||||
|
if (remserver->interestActive && rc == &remserver->rc[0]) { /* open the user channel */
|
||||||
|
if (!RemSetInterest(rc)) goto close;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
iRet = RemRead(remserver, 1000);
|
iRet = RemRead(rc, 1000);
|
||||||
}
|
}
|
||||||
goto close;
|
goto close;
|
||||||
}
|
}
|
||||||
@ -205,25 +233,34 @@ static int RemServerTask(void *data) {
|
|||||||
RemServer *remserver=data;
|
RemServer *remserver=data;
|
||||||
int iRet;
|
int iRet;
|
||||||
SConnection *pCon;
|
SConnection *pCon;
|
||||||
|
int isUser;
|
||||||
|
RemChannel *rc;
|
||||||
|
|
||||||
if (!remserver->taskActive) return 0; /* remove task */
|
if (!remserver->taskActive) return 0; /* remove task */
|
||||||
if (RemRead(remserver, 0) <= 0) return 1; /* continue */
|
|
||||||
|
for (isUser = 0; isUser <= 1; isUser++) {
|
||||||
|
rc = &remserver->rc[isUser];
|
||||||
|
if (RemRead(rc, 0) <= 0) continue;
|
||||||
|
|
||||||
/* printf("< %s\n", buf); */
|
/* printf("< %s\n", buf); */
|
||||||
|
|
||||||
if (RemHandle(remserver)) { /* handle drivstat messages */
|
if (isUser == 0) {
|
||||||
return 1;
|
if (RemHandle(remserver)) { /* handle drivstat messages */
|
||||||
}
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* forward oll other messages */
|
/* forward all other messages */
|
||||||
pCon = SCLoad(&remserver->conn);
|
pCon = SCLoad(&remserver->conn);
|
||||||
if (pCon) {
|
if (pCon) {
|
||||||
RemCopy(remserver, pCon);
|
RemCopy(rc, pCon);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static int RemTransact(RemServer *remserver, SConnection *pCon, char *cmd, ...) {
|
static int RemTransact(RemServer *remserver, RemChannel *rc, SConnection *pCon,
|
||||||
|
char *cmd, ...) {
|
||||||
/* the variable arguments are for filtering:
|
/* the variable arguments are for filtering:
|
||||||
|
|
||||||
"<name", &val get float value named name
|
"<name", &val get float value named name
|
||||||
@ -240,8 +277,8 @@ static int RemTransact(RemServer *remserver, SConnection *pCon, char *cmd, ...)
|
|||||||
int argMask;
|
int argMask;
|
||||||
|
|
||||||
try=2;
|
try=2;
|
||||||
if (remserver->timeout) { /* eat old responses */
|
if (rc->timeout) { /* eat old responses */
|
||||||
while (RemRead(remserver, 0) > 0) {
|
while (RemRead(rc, 0) > 0) {
|
||||||
RemHandle(remserver);
|
RemHandle(remserver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -249,13 +286,13 @@ tryagain:
|
|||||||
strcpy(buf, "transact ");
|
strcpy(buf, "transact ");
|
||||||
strcat(buf, cmd);
|
strcat(buf, cmd);
|
||||||
strcat(buf,"\n");
|
strcat(buf,"\n");
|
||||||
RemConnect(remserver);
|
RemConnect(remserver, rc);
|
||||||
iRet = RemWrite(remserver, buf);
|
iRet = RemWrite(rc, buf);
|
||||||
if (iRet < 0) goto close;
|
if (iRet < 0) goto close;
|
||||||
|
|
||||||
iRet = RemRead(remserver, 2000);
|
iRet = RemRead(rc, 2000);
|
||||||
if (iRet <= 0) goto close;
|
if (iRet <= 0) goto close;
|
||||||
while (!StartsWith(remserver->line, "TRANSACTIONFINISHED")) {
|
while (!StartsWith(rc->line, "TRANSACTIONFINISHED")) {
|
||||||
RemHandle(remserver);
|
RemHandle(remserver);
|
||||||
va_start(ap, cmd);
|
va_start(ap, cmd);
|
||||||
arg = va_arg(ap, char *);
|
arg = va_arg(ap, char *);
|
||||||
@ -263,10 +300,10 @@ tryagain:
|
|||||||
remserver->matchMap = 0;
|
remserver->matchMap = 0;
|
||||||
while (arg != NULL) {
|
while (arg != NULL) {
|
||||||
if (*arg == '>') {
|
if (*arg == '>') {
|
||||||
RemCopy(remserver, pCon);
|
RemCopy(rc, pCon);
|
||||||
} else if (*arg == '<') {
|
} else if (*arg == '<') {
|
||||||
f = va_arg(ap, float *);
|
f = va_arg(ap, float *);
|
||||||
val = StartsWith(remserver->line, arg+1);
|
val = StartsWith(rc->line, arg+1);
|
||||||
if (val != NULL) {
|
if (val != NULL) {
|
||||||
val = StartsWith(val, "=");
|
val = StartsWith(val, "=");
|
||||||
if (val != NULL) {
|
if (val != NULL) {
|
||||||
@ -275,7 +312,7 @@ tryagain:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (*arg == '!') {
|
} else if (*arg == '!') {
|
||||||
if (StartsWith(remserver->line, arg+1)) {
|
if (StartsWith(rc->line, arg+1)) {
|
||||||
remserver->matchMap |= argMask;
|
remserver->matchMap |= argMask;
|
||||||
argMask = argMask*2;
|
argMask = argMask*2;
|
||||||
break;
|
break;
|
||||||
@ -287,7 +324,7 @@ tryagain:
|
|||||||
arg = va_arg(ap, char *);
|
arg = va_arg(ap, char *);
|
||||||
}
|
}
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
iRet = RemRead(remserver, 2000);
|
iRet = RemRead(rc, 2000);
|
||||||
if (iRet <= 0) goto close;
|
if (iRet <= 0) goto close;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@ -295,7 +332,7 @@ close:
|
|||||||
if (iRet == 0) {
|
if (iRet == 0) {
|
||||||
snprintf(buf, sizeof(buf), "ERROR: timeout on %s", remserver->name);
|
snprintf(buf, sizeof(buf), "ERROR: timeout on %s", remserver->name);
|
||||||
SCWrite(pCon,buf,eError);
|
SCWrite(pCon,buf,eError);
|
||||||
remserver->timeout = 1;
|
rc->timeout = 1;
|
||||||
return iRet;
|
return iRet;
|
||||||
}
|
}
|
||||||
RemDisconnect(remserver);
|
RemDisconnect(remserver);
|
||||||
@ -320,14 +357,14 @@ static void *RemobGetInterface(void *pData, int iID) {
|
|||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
||||||
static int RemobHalt(void *self) {
|
static int RemobHalt(void *self) {
|
||||||
Remob *remob=self;
|
Remob *remob=self;
|
||||||
RemServer *remserver;
|
RemServer *remserver = remob->server;
|
||||||
|
RemChannel *rc = &remserver->rc[1]; /* Halt is only called with at least user priv. */
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
assert(remob);
|
assert(remob);
|
||||||
remserver = remob->server;
|
RemConnect(remserver, rc);
|
||||||
RemConnect(remserver);
|
|
||||||
snprintf(buf, sizeof(buf), "stopexe %s\n", remob->name);
|
snprintf(buf, sizeof(buf), "stopexe %s\n", remob->name);
|
||||||
return RemWrite(remserver, buf);
|
return RemWrite(rc, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
@ -336,23 +373,25 @@ static int RemobLimits(void *self, float fVal, char *error, int iErrLen) {
|
|||||||
Remob *remob=self;
|
Remob *remob=self;
|
||||||
|
|
||||||
assert(remob);
|
assert(remob);
|
||||||
/* check is done one remote server */
|
/* check is done on remote server */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static float RemobGetValue(void *pData, SConnection *pCon) {
|
static float RemobGetValue(void *pData, SConnection *pCon) {
|
||||||
Remob *remob=pData;
|
Remob *remob=pData;
|
||||||
|
RemServer *remserver = remob->server;
|
||||||
char buf[80];
|
char buf[80];
|
||||||
float none, value;
|
float none, value;
|
||||||
int iRet;
|
int iRet;
|
||||||
|
|
||||||
assert(remob);
|
assert(remob);
|
||||||
|
|
||||||
SCSave(&remob->server->conn, pCon);
|
SCSave(&remserver->conn, pCon);
|
||||||
none = -1.25e6;
|
none = -1.25e6;
|
||||||
value= none;
|
value= none;
|
||||||
snprintf(buf, sizeof(buf), "<%s", remob->name);
|
snprintf(buf, sizeof(buf), "<%s", remob->name);
|
||||||
iRet = RemTransact(remob->server, pCon, remob->name, buf, &value, ">", NULL);
|
/* get value needs only spy priviledge */
|
||||||
|
iRet = RemTransact(remserver, &remserver->rc[0], pCon, remob->name, buf, &value, ">", NULL);
|
||||||
if (iRet <= 0) {
|
if (iRet <= 0) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
@ -384,7 +423,11 @@ static int RemServerSaveStatus(void *pData, char *name, FILE *fil) {
|
|||||||
assert(fil);
|
assert(fil);
|
||||||
|
|
||||||
for (remob = remserver->objList; remob != NULL; remob = remob->next) {
|
for (remob = remserver->objList; remob != NULL; remob = remob->next) {
|
||||||
fprintf(fil, "catch { remob new %s %s }\n", remob->name, remserver->name);
|
if (remob->pDrivInt) {
|
||||||
|
fprintf(fil, "catch { remob drv %s %s }\n", remob->name, remserver->name);
|
||||||
|
} else {
|
||||||
|
fprintf(fil, "catch { remob obj %s %s }\n", remob->name, remserver->name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -408,30 +451,46 @@ static long RemobRun(void *self, SConnection *pCon, float fNew) {
|
|||||||
RemServer *remserver;
|
RemServer *remserver;
|
||||||
long lTime;
|
long lTime;
|
||||||
float fDelta;
|
float fDelta;
|
||||||
|
int rights;
|
||||||
|
RemChannel *rc;
|
||||||
|
|
||||||
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);
|
||||||
|
rc = &remserver->rc[rights <= usUser];
|
||||||
|
RemConnect(remserver, &remserver->rc[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, pCon, buf, "!ERROR: somebody else", "!ERROR: cannot", ">", NULL);
|
iRet = RemTransact(remserver, rc, 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, pCon, sBuf, ">", NULL);
|
iRet = RemTransact(remserver, rc, pCon, sBuf, ">", NULL);
|
||||||
if (iRet <= 0) return 0;
|
if (iRet <= 0) return 0;
|
||||||
while (remob->status == HWBusy) {
|
while (remob->status == HWBusy) {
|
||||||
iRet = RemRead(remserver, 1000);
|
iRet = RemRead(rc, 1000);
|
||||||
if (iRet <= 0) break;
|
if (iRet <= 0) break;
|
||||||
RemCopy(remserver, pCon);
|
if (! RemHandle(remserver)) {
|
||||||
|
RemCopy(rc, pCon);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
iRet = RemTransact(remserver, pCon, buf, ">", NULL);
|
iRet = RemTransact(remserver, rc, pCon, buf, ">", NULL);
|
||||||
if (iRet <= 0) return 0;
|
if (iRet <= 0) return 0;
|
||||||
}
|
}
|
||||||
|
/* wait for "started" message */
|
||||||
|
while (remob->status != HWBusy) {
|
||||||
|
iRet = RemRead(&remserver->rc[0], 1000);
|
||||||
|
if (iRet <= 0) break;
|
||||||
|
if (! RemHandle(remserver)) {
|
||||||
|
RemCopy(&remserver->rc[0], pCon);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (remob->status != HWBusy) {
|
if (remob->status != HWBusy) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -464,6 +523,7 @@ static int InterestCallback(int iEvent, void *pEvent, void *pUser) {
|
|||||||
int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||||
int argc, char *argv[]) {
|
int argc, char *argv[]) {
|
||||||
Remob *remob = pData;
|
Remob *remob = pData;
|
||||||
|
RemServer *remserver = remob->server;
|
||||||
char buf[512];
|
char buf[512];
|
||||||
TokenList *pList = NULL;
|
TokenList *pList = NULL;
|
||||||
TokenList *pCurrent;
|
TokenList *pCurrent;
|
||||||
@ -475,19 +535,20 @@ int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
long lID;
|
long lID;
|
||||||
char *endp;
|
char *endp;
|
||||||
char acce[128], inte[128];
|
char acce[128], inte[128];
|
||||||
|
int rights;
|
||||||
|
RemChannel *rc;
|
||||||
|
|
||||||
assert(pCon);
|
assert(pCon);
|
||||||
assert(pSics);
|
assert(pSics);
|
||||||
assert(remob);
|
assert(remob);
|
||||||
|
|
||||||
if (SCGetRights(pCon) > usUser) {
|
rights = SCGetRights(pCon);
|
||||||
remob->server->actChan = 0;
|
rc = &remserver->rc[rights <= usUser];
|
||||||
} else {
|
if (rights >= usUser) {
|
||||||
remob->server->actChan = 1;
|
SCSave(&remserver->conn, pCon);
|
||||||
}
|
}
|
||||||
SCSave(&remob->server->conn, pCon);
|
|
||||||
if (argc == 1) {
|
if (argc == 1) {
|
||||||
iRet = RemTransact(remob->server, pCon, argv[0], ">", NULL);
|
iRet = RemTransact(remserver, rc, pCon, argv[0], ">", NULL);
|
||||||
} else if (strcasecmp(argv[1],"list") == 0) {
|
} else if (strcasecmp(argv[1],"list") == 0) {
|
||||||
snprintf(buf, sizeof(buf), "%s ", remob->name);
|
snprintf(buf, sizeof(buf), "%s ", remob->name);
|
||||||
i = strlen(buf);
|
i = strlen(buf);
|
||||||
@ -497,7 +558,7 @@ int RemobAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
snprintf(inte, sizeof(inte), "!%s.interruptmode", remob->name);
|
snprintf(inte, sizeof(inte), "!%s.interruptmode", remob->name);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
RemTransact(remob->server, pCon, buf, ">", NULL);
|
RemTransact(remserver, rc, pCon, buf, ">", NULL);
|
||||||
|
|
||||||
iRet=1;
|
iRet=1;
|
||||||
} else {
|
} else {
|
||||||
@ -505,7 +566,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(remob->server, pCon, buf, ">", NULL);
|
iRet = RemTransact(remserver, rc, pCon, buf, ">", NULL);
|
||||||
}
|
}
|
||||||
return iRet;
|
return iRet;
|
||||||
}
|
}
|
||||||
@ -562,25 +623,25 @@ int RemServerAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
char acce[128], inte[128];
|
char acce[128], inte[128];
|
||||||
struct sockaddr_in adr;
|
struct sockaddr_in adr;
|
||||||
struct hostent *thishost;
|
struct hostent *thishost;
|
||||||
mkChannel *chan;
|
|
||||||
Remob *p, *next;
|
Remob *p, *next;
|
||||||
|
int rights;
|
||||||
|
RemChannel *rc;
|
||||||
|
|
||||||
assert(pCon);
|
assert(pCon);
|
||||||
assert(pSics);
|
assert(pSics);
|
||||||
assert(remserver);
|
assert(remserver);
|
||||||
|
|
||||||
if (SCGetRights(pCon) > usUser) {
|
rights = SCGetRights(pCon);
|
||||||
remserver->actChan = 0;
|
rc = &remserver->rc[rights <= usUser];
|
||||||
} else {
|
if (rights >= usUser) {
|
||||||
remserver->actChan = 1;
|
SCSave(&remserver->conn, pCon);
|
||||||
}
|
}
|
||||||
chan = remserver->chans[remserver->actChan];
|
|
||||||
if (argc == 1) {
|
if (argc == 1) {
|
||||||
serverport = IFindOption(pSICSOptions,"ServerPort");
|
serverport = IFindOption(pSICSOptions,"ServerPort");
|
||||||
i = sizeof adr;
|
i = sizeof adr;
|
||||||
thishostname = NULL;
|
thishostname = NULL;
|
||||||
if (chan) {
|
if (rc->chan) {
|
||||||
if (getsockname(chan->sockid, (void *)&adr, &i) >= 0) {
|
if (getsockname(rc->chan->sockid, (void *)&adr, &i) >= 0) {
|
||||||
thishost = gethostbyaddr((char *)&adr.sin_addr,
|
thishost = gethostbyaddr((char *)&adr.sin_addr,
|
||||||
sizeof adr.sin_addr, AF_INET);
|
sizeof adr.sin_addr, AF_INET);
|
||||||
if (thishost) {
|
if (thishost) {
|
||||||
@ -592,14 +653,14 @@ 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);
|
RemConnect(remserver, rc);
|
||||||
for (i=2; i<argc; i++) {
|
for (i=2; i<argc; i++) {
|
||||||
if (i>2) {
|
if (i>2) {
|
||||||
RemWrite(remserver, " ");
|
RemWrite(rc, " ");
|
||||||
}
|
}
|
||||||
RemWrite(remserver, argv[i]);
|
RemWrite(rc, argv[i]);
|
||||||
}
|
}
|
||||||
RemWrite(remserver, "\n");
|
RemWrite(rc, "\n");
|
||||||
} else if (argc==2 && strcasecmp(argv[1],"markForDel") == 0) {
|
} else if (argc==2 && strcasecmp(argv[1],"markForDel") == 0) {
|
||||||
p = remserver->objList;
|
p = remserver->objList;
|
||||||
while (p) {
|
while (p) {
|
||||||
@ -624,7 +685,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, pCon, buf, ">", NULL);
|
iRet = RemTransact(remserver, rc, pCon, buf, ">", NULL);
|
||||||
return iRet;
|
return iRet;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@ -655,6 +716,8 @@ static void RemServerKill(void *self) {
|
|||||||
}
|
}
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
static int RemobSetDriveable(Remob *remob, int driveable) {
|
static int RemobSetDriveable(Remob *remob, int driveable) {
|
||||||
|
RemChannel *rc;
|
||||||
|
|
||||||
if (driveable) {
|
if (driveable) {
|
||||||
/* initialise Drivable interface */
|
/* initialise Drivable interface */
|
||||||
remob->pDrivInt = CreateDrivableInterface();
|
remob->pDrivInt = CreateDrivableInterface();
|
||||||
@ -664,6 +727,13 @@ static int RemobSetDriveable(Remob *remob, int driveable) {
|
|||||||
remob->pDrivInt->CheckStatus = RemobStatus;
|
remob->pDrivInt->CheckStatus = RemobStatus;
|
||||||
remob->pDrivInt->GetValue = RemobGetValue;
|
remob->pDrivInt->GetValue = RemobGetValue;
|
||||||
remob->pDrivInt->Halt = RemobHalt;
|
remob->pDrivInt->Halt = RemobHalt;
|
||||||
|
if (remob->server->interestActive == 0) {
|
||||||
|
rc = &remob->server->rc[0];
|
||||||
|
remob->server->interestActive = 1;
|
||||||
|
if (! RemSetInterest(rc)) {
|
||||||
|
RemDisconnect(remob->server); /* disconnect on error, RemSetInterest will be called again on connect */
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (remob->pDrivInt) {
|
} else if (remob->pDrivInt) {
|
||||||
free(remob->pDrivInt);
|
free(remob->pDrivInt);
|
||||||
remob->pDrivInt = NULL;
|
remob->pDrivInt = NULL;
|
||||||
@ -715,7 +785,9 @@ killit:
|
|||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
static RemServer *RemServerInit(char *name, char *host, int port) {
|
static RemServer *RemServerInit(char *name, char *host, int port) {
|
||||||
RemServer *remserver = NULL;
|
RemServer *remserver = NULL;
|
||||||
|
RemChannel *rc;
|
||||||
|
int isUser;
|
||||||
|
|
||||||
assert(name);
|
assert(name);
|
||||||
|
|
||||||
remserver = calloc(1, sizeof(RemServer));
|
remserver = calloc(1, sizeof(RemServer));
|
||||||
@ -733,10 +805,13 @@ static RemServer *RemServerInit(char *name, char *host, int port) {
|
|||||||
remserver->name = strdup(name);
|
remserver->name = strdup(name);
|
||||||
remserver->host = strdup(host);
|
remserver->host = strdup(host);
|
||||||
remserver->port = port;
|
remserver->port = port;
|
||||||
remserver->incomplete = 0;
|
for (isUser=0; isUser <= 1; isUser++) {
|
||||||
|
rc = &remserver->rc[isUser];
|
||||||
|
rc->incomplete = 0;
|
||||||
|
rc->chan = NULL;
|
||||||
|
rc->timeout = 0;
|
||||||
|
}
|
||||||
remserver->objList = NULL;
|
remserver->objList = NULL;
|
||||||
remserver->chans[0] = NULL;
|
|
||||||
remserver->chans[1] = NULL;
|
|
||||||
if (!remserver->name ||
|
if (!remserver->name ||
|
||||||
!remserver->host ||
|
!remserver->host ||
|
||||||
!remserver->port) {
|
!remserver->port) {
|
||||||
@ -745,6 +820,7 @@ static RemServer *RemServerInit(char *name, char *host, int port) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
remserver->taskActive = 1;
|
remserver->taskActive = 1;
|
||||||
|
remserver->interestActive = 0;
|
||||||
TaskRegister(pServ->pTasker, RemServerTask, NULL, RemServerKill, remserver, 1);
|
TaskRegister(pServ->pTasker, RemServerTask, NULL, RemServerKill, remserver, 1);
|
||||||
return remserver;
|
return remserver;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user