diff --git a/tecs/coc_client.c b/tecs/coc_client.c index 1790e2a..c819deb 100644 --- a/tecs/coc_client.c +++ b/tecs/coc_client.c @@ -206,7 +206,7 @@ int CocPushArg(CocConn *conn, const char *name, void *value, int type, int size) assert(NULL==strchr(name, ' ')); buf=&conn->cmdbuf; n=conn->nargs; - if (n>=sizeof(conn->args)) ERR_MSG("too many return arguments"); + if (n>=sizeof(conn->args)/sizeof(conn->args[0])) ERR_MSG("too many return arguments"); conn->args[n].adr=value; conn->args[n].type=type; conn->args[n].size=size; diff --git a/tecs/instr_hosts.c b/tecs/instr_hosts.c index 098dae7..8465d1a 100644 --- a/tecs/instr_hosts.c +++ b/tecs/instr_hosts.c @@ -44,17 +44,14 @@ static char *getItem(char *line, char *name, char *value, int value_len) { return result; } -int InstrHost(char *service, char *input, char *instr, int instr_len, - char *host, int host_len, int *port) { +void scanHostList(void (*func)(char *)) { int i; FILE *fil, *lfil; char *hostlist; char localhostlist[512]; - char line[512], lline[512], hostport[64]; - char *found, *colon, *crit; - int dirty, home, finished; + char line[512], lline[512]; + int dirty; - home = 0; hostlist = getenv("InstrumentHostList"); if (!hostlist) { hostlist="/afs/psi.ch/project/sinq/common/lib/sea/hostlist"; @@ -66,44 +63,18 @@ int InstrHost(char *service, char *input, char *instr, int instr_len, if (fil) { if (!lfil) dirty = 1; } else { - if (!lfil) return 0; + if (!lfil) return; fil = lfil; lfil = NULL; } - *port = 0; - if (input == NULL || input[0] <= ' ') { - crit = "host"; - input = getenv("HOST"); - } else { - crit = "instr"; - } - finished = 0; while (NULL != fgets(line, sizeof line, fil)) { if (!dirty && lfil && (fgets(lline, sizeof lline, lfil) == NULL || strcmp(line, lline) != 0)) { dirty = 1; } - if (!finished && getItem(line, crit, input, 0) != NULL) { - hostport[0]='\0'; - found = getItem(line, service, hostport, sizeof hostport); - if (found) { - instr[0] = '\0'; - getItem(line, "instr", instr, instr_len); - colon = strchr(hostport, ':'); - if (colon) { - i = atoi(colon+1); - if (i > 0) { - *colon='\0'; - snprintf(host, host_len, "%s", hostport); - finished = 1; - *port = i; - if (getItem(line, "host", getenv("HOST"), 0) != NULL) { - home = 1; - } - } - } - } + if (line[0] != '#') { + func(line); } } if (fil) fclose(fil); @@ -121,9 +92,104 @@ int InstrHost(char *service, char *input, char *instr, int instr_len, fclose(fil); } } - return home; } +static char *service; +static char *crit; +static char *input; +static int finished; +static int home; +static char hostport[128]; +static char *instr; +static int instr_len; +static char *host; +static int host_len; +static int port; + +void findCrit(char *line) { + char *colon; + int i; + + if (getItem(line, crit, input, 0) != NULL) { + hostport[0]='\0'; + if (getItem(line, service, hostport, sizeof hostport) != NULL) { + instr[0] = '\0'; + if (finished == 0) { + getItem(line, "instr", instr, instr_len); + } + colon = strchr(hostport, ':'); + if (colon) { + i = atoi(colon+1); + if (i > 0) { + *colon='\0'; + if (finished == 0) { + snprintf(host, host_len, "%s", hostport); + port = i; + } + finished++; + if (getItem(line, "host", getenv("HOST"), 0) != NULL) { + home = 1; + } + } + } + } + } +} + +int InstrHost(char *serviceArg, char *inputArg, char *instrArg, int instr_lenArg, + char *hostArg, int host_lenArg, int *portArg) { + service = serviceArg; + input = inputArg; + instr = instrArg; + instr_len = instr_lenArg; + host = hostArg; + host_len = host_lenArg; + port = 0; + home = 0; + finished = 0; + + if (input == NULL || input[0] <= ' ') { + crit = "host"; + input = getenv("HOST"); + } else { + crit = "instr"; + } + + scanHostList(findCrit); + + *portArg = port; + return home * finished; +} + +static char *list; +static int list_len; + +void listInstr(char *line) { + int l; + *list='\0'; + if (getItem(line, service, "", 0) && + getItem(line, "instr", list, list_len)) { + l = strlen(list); + list += l; + list_len -= l; + } else if (line[0] > ' ') { + return; + } + if (list_len > 0) { + *list = ' '; + list++; + list_len--; + } +} + +void InstrList(char *serviceArg, char *listArg, int list_lenArg) { + service = serviceArg; + list = listArg; + list_len = list_lenArg; + scanHostList(listInstr); + if (list > listArg) list--; /* remove trailing blank */ + *list = '\0'; +} #ifdef MYC_FORTRAN /* compile only when fortran c interface stuff is defined */ diff --git a/tecs/instr_hosts.h b/tecs/instr_hosts.h index 4ce8140..1acb0fa 100644 --- a/tecs/instr_hosts.h +++ b/tecs/instr_hosts.h @@ -12,4 +12,7 @@ int InstrHost(char *service, char *input, char *instr, int instr_len, 0 else */ +void InstrList(char *service, char *list, int list_len); +/* get an instrument list supporting named service, separated with blanks */ + #endif /* _INSTR_HOSTS_H_ */ diff --git a/tecs/six.c b/tecs/six.c index 9f67952..92d7e3a 100644 --- a/tecs/six.c +++ b/tecs/six.c @@ -472,7 +472,7 @@ int setrights(int gotolevel) { } } level=3; - ERR_I(sendCmd(sock[0], "config list")); + ERR_I(sendCmd(sock[0], "config myrights")); ERR_P(p=readWrite(12000,1,"UserRights = ")); PutC("."); if (*p!='\0') { diff --git a/tecs/tecs.c b/tecs/tecs.c index 7e23f79..05a24bc 100644 --- a/tecs/tecs.c +++ b/tecs/tecs.c @@ -3359,6 +3359,8 @@ int main(int argc, char *argv[]) { CocDefStr(update, RW); CocHdl(UpdateHdl); CocDefStr(lscfg, RD); CocDefStr(ttp, RD); + CocDefStr(alarmChannels, RD); + CocDefStr(alarmHistory, RD); CocDefInt(cod1, RD); CocDefInt(cod2, RD);