- remob uses now two connections (spy/user), bug fixes

This commit is contained in:
zolliker
2005-11-17 07:51:16 +00:00
parent f6005c7c9b
commit afaeae0554

278
remob.c
View File

@ -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;
} }