*** empty log message ***

This commit is contained in:
cvs
2000-03-08 13:41:57 +00:00
parent d50d83f2e7
commit 749772c6ae
13 changed files with 1197 additions and 0 deletions

180
tecs/client.c Normal file
View File

@@ -0,0 +1,180 @@
#include <assert.h>
#include "client.h"
#include "util.h"
/*-------------------------------------------------------------------------*/
int CocOpen(CocConn *conn)
{
int i, cnt, try, port, tryConn, tmo;
struct sockaddr_in sadr;
char *p, *q;
try=2;
tryConn=1;
tmo=0;
while (try>0) {
try--;
while (tryConn>0) {
port=CocPORT;
cnt=CocPORTS;
tryConn--;
while (cnt>0) {
ERR_SI(conn->fd=socket(AF_INET, SOCK_STREAM, 0));
ERR_I(CocCreateSockAdr(&sadr, conn->host, port));
i=connect(conn->fd, (struct sockaddr *)&sadr, sizeof(sadr));
if (i>=0) return(0);
if (errno!=ECONNREFUSED) { ERR_COD(errno); }
port++; cnt--;
}
util_delay(tmo); tmo+=100;
}
if (conn->startcmd[0]=='\0' || try<=0) { ERR_COD(ECONNREFUSED); }
p=conn->startcmd;
q=strchr(p,' ');
while (q!=NULL) {
p=q+1;
q=strchr(p,' ');
};
printf("start server %s\n", p);
ERR_I(system(conn->startcmd));
util_delay(100); tmo=200;
tryConn=5;
}
ERR_COD(ECONNREFUSED);
OnError: return(-1);
}
/*-------------------------------------------------------------------------*/
void CocInitClient(CocConn *conn, char *host, char *magic, int bufsize, char *startcmd)
{ void *e;
if (bufsize==0) bufsize=1024;
conn->cmdbuf=buf_create(bufsize);
conn->resbuf=buf_create(bufsize);
str_copy(conn->host, host);
str_copy(conn->magic, magic);
str_copy(conn->startcmd, startcmd);
conn->fd=-1;
conn->varList=NULL;
CocVarList(&conn->varList);
}
/*-------------------------------------------------------------------------*/
int CocSendMagic(CocConn *conn, char *magic) {
char *err;
if (magic[0]!='#') ERR_MSG("magic must start with '#'");
buf_put_start(conn->resbuf); /* use return buffer for command in order to preserve command buffer */
buf_put_str(conn->resbuf, magic);
buf_put_end(conn->resbuf);
if (conn->resbuf->buf==NULL) ERR_MSG("buffer full");
ERR_SI(send(conn->fd, conn->resbuf->buf, conn->resbuf->size, 0));
ERR_I(CocRecv(conn->fd, conn->resbuf));
err=buf_get_str(conn->resbuf);
if (*err!='\0') { ErrMsg(err); ErrTxt(": (response from server)",0); goto OnError; }
if (buf_size(conn->resbuf)!=0) ERR_MSG("syntax error");
return(0);
OnError: return(-1);
}
/*-------------------------------------------------------------------------*/
int CocTryCmd(CocConn *conn)
{ if (conn->fd<0) {
ERR_I(CocOpen(conn));
ERR_I(CocSendMagic(conn, conn->magic));
}
ERR_SI(send(conn->fd, conn->cmdbuf->buf, conn->cmdbuf->size, 0));
ERR_I(CocRecv(conn->fd, conn->resbuf));
return(0);
OnError: return(-1);
}
/*-------------------------------------------------------------------------*/
int CocCmd(CocConn *conn, const char *rwList)
{ int iret, cnt, setmode, i;
char *err;
const char *t, *s;
char nam[32];
CocVar *var;
buf_put_start(conn->cmdbuf);
s=rwList;
setmode=0;
do {
t=strchr(s, ',');
if (t==NULL) t=s+strlen(s);
if (*s=='[') {
if (!setmode) buf_put_str(conn->cmdbuf, "[");
s++;
setmode=1;
}
i=t-s;
assert(i<32);
str_ncpy(nam, s, i+1);
if (setmode) {
if (nam[i-1]==']') { nam[i-1]='\0'; setmode=0; }
buf_put_str(conn->cmdbuf, nam);
ERR_I(CocPutVar(conn->varList, conn->cmdbuf, nam));
if (!setmode) buf_put_str(conn->cmdbuf, "]");
} else {
var=CocFindVar(conn->varList, nam);
if (var==NULL) ERR_MSG("variable not found");
buf_put_str(conn->cmdbuf, nam);
}
s=t+1;
} while (*t!='\0');
buf_put_end(conn->cmdbuf);
if (conn->cmdbuf->buf==NULL) ERR_MSG("out buffer full");
cnt=3;
while (1) {
cnt--;
if (cnt<=0) {
ERR_I(CocTryCmd(conn));
break;
}
iret=CocTryCmd(conn);
if (iret>=0) break;
close(conn->fd);
conn->fd=-1;
if (ErrCode!=ECONNRESET && ErrCode!=EPIPE) goto OnError;
ErrShow("try again, error was");
}
err=buf_get_str(conn->resbuf);
if (*err!='\0') { ErrMsg(err); ErrTxt(": (response from server)",0 ); goto OnError; }
/* read values */
s=rwList;
setmode=0;
do {
t=strchr(s, ',');
if (t==NULL) t=s+strlen(s);
if (*s=='[') {
s++;
setmode=1;
}
i=t-s;
if (!setmode) {
str_ncpy(nam, s, i+1);
if (nam[i-1]==']') { nam[i-1]='\0'; setmode=0; }
ERR_I(CocGetVar(conn->varList, conn->resbuf, nam));
}
s=t+1;
} while (*t!='\0');
if (buf_size(conn->resbuf)!=0) ERR_MSG("syntax error");
return(0);
OnError: return(-1);
}
void CocCloseClient(CocConn *conn) {
close(conn->fd);
buf_free(conn->cmdbuf);
buf_free(conn->resbuf);
CocFreeVarList(&conn->varList);
}