get it to build

This commit is contained in:
Douglas Clowes
2012-11-27 13:34:05 +11:00
parent ca11a3cfe4
commit 27e89241cf
11 changed files with 502 additions and 196 deletions

View File

@ -20,6 +20,7 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#include "nserver.h" #include "nserver.h"
#include "servlog.h" #include "servlog.h"
@ -32,6 +33,12 @@ pServer pServ = NULL;
#define DEFAULTINIFILE "servo.tcl" #define DEFAULTINIFILE "servo.tcl"
int usage(const char *name)
{
fprintf(stderr, "usage: %s [-d] [-nolog] <config.tcl>\n", name);
return 1;
}
/*--------------------------------------------------------------------------- /*---------------------------------------------------------------------------
The Servers Main program. May take one argument: the name of an The Servers Main program. May take one argument: the name of an
initialisation file initialisation file
@ -40,22 +47,36 @@ pServer pServ = NULL;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int iRet; int iRet;
int daemonize = 0;
char *file = NULL; char *file = NULL;
int i; int i, firstArg = 1;
if (argc < 2)
return usage(argv[0]);
/* initialise, will die on you if problems */ /* initialise, will die on you if problems */
for (i = 1; i < argc; i++) { if (strcasecmp(argv[1], "-d") == 0) {
daemonize = 1;
firstArg = 2;
}
for (i = firstArg; i < argc; i++) {
if (strcmp(argv[i], "-nolog") == 0) { if (strcmp(argv[i], "-nolog") == 0) {
SICSLogEnable(0); SICSLogEnable(0);
} else if (file == NULL) { } else if (file == NULL) {
file = argv[i]; file = argv[i];
} }
} }
if (file == NULL)
return usage(argv[0]);
iRet = InitServer(file, &pServ); iRet = InitServer(file, &pServ);
if (!iRet) { if (!iRet) {
printf("Unrecoverable error on server startup, exiting.........\n"); printf("Unrecoverable error on server startup, exiting.........\n");
exit(1); exit(1);
} }
if (daemonize == 1)
daemon(1, 1);
RunServer(pServ); RunServer(pServ);

View File

@ -67,10 +67,13 @@ typedef struct __netwatchtimer {
struct timeval tv; /* time when event is due */ struct timeval tv; /* time when event is due */
pNWCallback func; /* function to call */ pNWCallback func; /* function to call */
void *cntx; /* abstract context to pass to callback */ void *cntx; /* abstract context to pass to callback */
long int tick; /* millisecond repeat rate */ int msec; /* millisecond delay time */
int tick; /* millisecond repeat rate */
long int vrfy; /* integrity check */ long int vrfy; /* integrity check */
} NWTimer; } NWTimer;
static pNWTimer activeTimer = NULL;
/* /*
* \brief private function to insert an entry into the sorted timer queue. * \brief private function to insert an entry into the sorted timer queue.
* *
@ -83,6 +86,7 @@ static int NetWatchTimerInsQue(pNetWatch self, pNWTimer handle)
if (self->tq_head == NULL) { if (self->tq_head == NULL) {
self->tq_head = self->tq_tail = handle; self->tq_head = self->tq_tail = handle;
handle->next = NULL; handle->next = NULL;
handle->vrfy = NWMAGIC;
return 1; return 1;
} }
/* if new one is not earlier than latest one, insert after latest */ /* if new one is not earlier than latest one, insert after latest */
@ -92,6 +96,7 @@ static int NetWatchTimerInsQue(pNetWatch self, pNWTimer handle)
self->tq_tail->next = handle; self->tq_tail->next = handle;
self->tq_tail = handle; self->tq_tail = handle;
handle->next = NULL; handle->next = NULL;
handle->vrfy = NWMAGIC;
return 1; return 1;
} }
/* if new one is not later than earliest one, insert before earliest */ /* if new one is not later than earliest one, insert before earliest */
@ -100,6 +105,7 @@ static int NetWatchTimerInsQue(pNetWatch self, pNWTimer handle)
handle->tv.tv_usec <= self->tq_head->tv.tv_usec)) { handle->tv.tv_usec <= self->tq_head->tv.tv_usec)) {
handle->next = self->tq_head; handle->next = self->tq_head;
self->tq_head = handle; self->tq_head = handle;
handle->vrfy = NWMAGIC;
return 1; return 1;
} else { } else {
/* must be in between two so start at the first entry */ /* must be in between two so start at the first entry */
@ -113,8 +119,10 @@ static int NetWatchTimerInsQue(pNetWatch self, pNWTimer handle)
/* slip new one in between this one and the next one */ /* slip new one in between this one and the next one */
handle->next = pNxt->next; handle->next = pNxt->next;
pNxt->next = handle; pNxt->next = handle;
handle->vrfy = NWMAGIC;
return 1;
} }
return 1; return 0;
} }
/* /*
@ -125,6 +133,7 @@ static int NetWatchTimerInsQue(pNetWatch self, pNWTimer handle)
*/ */
static int NetWatchTimerRemQue(pNetWatch self, pNWTimer handle) static int NetWatchTimerRemQue(pNetWatch self, pNWTimer handle)
{ {
assert(handle->vrfy == NWMAGIC);
/* handle the case of first and possibly only */ /* handle the case of first and possibly only */
if (handle == self->tq_head) { if (handle == self->tq_head) {
self->tq_head = self->tq_head->next; /* may be NULL */ self->tq_head = self->tq_head->next; /* may be NULL */
@ -145,12 +154,14 @@ static int NetWatchTimerRemQue(pNetWatch self, pNWTimer handle)
if (handle == self->tq_tail) if (handle == self->tq_tail)
self->tq_tail = pNxt; self->tq_tail = pNxt;
} }
handle->vrfy = 0;
return 1; return 1;
} }
int NetWatchRegisterTimer(pNWTimer * handle, int mSec, int NetWatchRegisterTimer(pNWTimer * handle, int mSec,
pNWCallback callback, void *context) pNWCallback callback, void *context)
{ {
assert(callback);
pNetWatch self = instance; pNetWatch self = instance;
if (!self || self->lMagic != NWMAGIC) if (!self || self->lMagic != NWMAGIC)
return 0; return 0;
@ -165,10 +176,10 @@ int NetWatchRegisterTimer(pNWTimer * handle, int mSec,
pNew->tv.tv_sec++; pNew->tv.tv_sec++;
pNew->tv.tv_usec -= 1000000; pNew->tv.tv_usec -= 1000000;
} }
pNew->msec = mSec;
pNew->tick = 0; pNew->tick = 0;
pNew->func = callback; pNew->func = callback;
pNew->cntx = context; pNew->cntx = context;
pNew->vrfy = NWMAGIC;
NetWatchTimerInsQue(self, pNew); NetWatchTimerInsQue(self, pNew);
*handle = pNew; *handle = pNew;
return 1; return 1;
@ -178,6 +189,7 @@ int NetWatchRegisterTimerPeriodic(pNWTimer * handle, int mSecInitial,
int mSecPeriod, pNWCallback callback, int mSecPeriod, pNWCallback callback,
void *context) void *context)
{ {
assert(callback);
if (NetWatchRegisterTimer(handle, mSecInitial, callback, context)) { if (NetWatchRegisterTimer(handle, mSecInitial, callback, context)) {
pNWTimer pNew = *handle; pNWTimer pNew = *handle;
if (pNew == NULL) if (pNew == NULL)
@ -189,16 +201,36 @@ int NetWatchRegisterTimerPeriodic(pNWTimer * handle, int mSecInitial,
return 0; return 0;
} }
pNWTimer NetWatchGetActiveTimer(void)
{
return activeTimer;
}
int NetWatchGetTimerInitial(pNWTimer handle)
{
if (handle == NULL
|| (handle->vrfy != NWMAGIC && handle->vrfy != ~NWMAGIC))
return 0;
return handle->msec;
}
int NetWatchGetTimerDelay(pNWTimer handle)
{
return NetWatchGetTimerInitial(handle);
}
int NetWatchGetTimerPeriod(pNWTimer handle) int NetWatchGetTimerPeriod(pNWTimer handle)
{ {
if (handle == NULL || handle->vrfy != NWMAGIC) if (handle == NULL
|| (handle->vrfy != NWMAGIC && handle->vrfy != ~NWMAGIC))
return 0; return 0;
return handle->tick; return handle->tick;
} }
int NetWatchSetTimerPeriod(pNWTimer handle, int mSecPeriod) int NetWatchSetTimerPeriod(pNWTimer handle, int mSecPeriod)
{ {
if (handle == NULL || handle->vrfy != NWMAGIC) if (handle == NULL
|| (handle->vrfy != NWMAGIC && handle->vrfy != ~NWMAGIC))
return 0; return 0;
handle->tick = mSecPeriod; handle->tick = mSecPeriod;
return 1; return 1;
@ -209,6 +241,8 @@ int NetWatchRemoveTimer(pNWTimer handle)
pNetWatch self = instance; pNetWatch self = instance;
if (!self || self->lMagic != NWMAGIC) if (!self || self->lMagic != NWMAGIC)
return 0; return 0;
if (handle == NULL || handle->vrfy != NWMAGIC)
return 0;
NetWatchTimerRemQue(self, handle); NetWatchTimerRemQue(self, handle);
handle->vrfy = 0; handle->vrfy = 0;
free(handle); free(handle);
@ -239,35 +273,10 @@ static int NetWatchContextInsQue(pNetWatch self, pNWContext handle)
self->cq_tail->next = handle; self->cq_tail->next = handle;
self->cq_tail = handle; self->cq_tail = handle;
} }
handle->vrfy = NWMAGIC;
return 1; return 1;
} }
/**
* \brief private function to remove entry from unsorted queue
*
* \param self singleton
* \param handle entry to insert
*/
static void NetWatchContextRemQue(pNetWatch self, pNWContext handle)
{
if (handle == self->cq_head) { /* if first */
self->cq_head = self->cq_head->next;
if (handle == self->cq_tail) /* if also last */
self->cq_tail = NULL;
} else {
pNWContext pNxt = self->cq_head;
while (pNxt) {
if (handle == pNxt->next) {
pNxt->next = pNxt->next->next;
break;
}
pNxt = pNxt->next;
}
if (handle == self->cq_tail) /* if last */
self->cq_tail = pNxt;
}
return;
}
/** /**
* \brief private function to purge invalid entries * \brief private function to purge invalid entries
@ -286,19 +295,19 @@ static void NetWatchContextPrgQue(pNetWatch self)
free(tmp); free(tmp);
} }
pNxt = self->cq_head; pNxt = self->cq_head;
while (pNxt) { while (pNxt && pNxt->next) {
if (pNxt->next && pNxt->next->sock < 0) { if (pNxt->next->sock < 0) {
pNWContext tmp = NULL; pNWContext tmp = NULL;
tmp = pNxt->next; tmp = pNxt->next;
pNxt->next = pNxt->next->next; pNxt->next = pNxt->next->next;
tmp->vrfy = 0; tmp->vrfy = 0;
free(tmp); free(tmp);
continue;
} }
pNxt = pNxt->next; pNxt = pNxt->next;
} }
/* if the queue is empty clear the tail */ /* if the queue is empty then pNxt is NULL else pNxt points to the tail */
if (self->cq_head == NULL) self->cq_tail = pNxt;
self->cq_tail = pNxt;
self->nInvalid = 0; self->nInvalid = 0;
return; return;
} }
@ -306,6 +315,7 @@ static void NetWatchContextPrgQue(pNetWatch self)
int NetWatchRegisterCallback(pNWContext * handle, int iSocket, int NetWatchRegisterCallback(pNWContext * handle, int iSocket,
pNWCallback callback, void *context) pNWCallback callback, void *context)
{ {
assert(callback);
pNWContext pNew = NULL; pNWContext pNew = NULL;
pNetWatch self = instance; pNetWatch self = instance;
if (!self || self->lMagic != NWMAGIC) if (!self || self->lMagic != NWMAGIC)
@ -320,7 +330,6 @@ int NetWatchRegisterCallback(pNWContext * handle, int iSocket,
pNew->mode = nwatch_read; pNew->mode = nwatch_read;
pNew->func = callback; pNew->func = callback;
pNew->cntx = context; pNew->cntx = context;
pNew->vrfy = NWMAGIC;
*handle = pNew; *handle = pNew;
NetWatchContextInsQue(self, pNew); NetWatchContextInsQue(self, pNew);
return 1; return 1;
@ -333,8 +342,11 @@ int NetWatchRemoveCallback(pNWContext handle)
return 0; return 0;
if (!self || self->lMagic != NWMAGIC) if (!self || self->lMagic != NWMAGIC)
return 0; return 0;
/* mark as invalid */
handle->sock = -1; handle->sock = -1;
/* increment count of invalid */
self->nInvalid++; self->nInvalid++;
/* leave for garbage collection */
return 1; return 1;
} }
@ -375,7 +387,7 @@ int NetWatchTask(void *pData)
if (self->nInvalid > 0) if (self->nInvalid > 0)
NetWatchContextPrgQue(self); NetWatchContextPrgQue(self);
/* build the select mask */ /* build the select mask */
FD_ZERO(&rMask); FD_ZERO(&rMask);
FD_ZERO(&wMask); FD_ZERO(&wMask);
pNWC = self->cq_head; pNWC = self->cq_head;
@ -430,7 +442,11 @@ int NetWatchTask(void *pData)
break; break;
} }
NetWatchTimerRemQue(self, pNew); NetWatchTimerRemQue(self, pNew);
activeTimer = pNew;
activeTimer->vrfy = ~NWMAGIC;
iStatus = pNew->func(pNew->cntx, 0); iStatus = pNew->func(pNew->cntx, 0);
activeTimer->vrfy = 0;
activeTimer = NULL;
/* /*
* If this is a recurrent timer and the function * If this is a recurrent timer and the function
* indicates to keep it going, put it back in * indicates to keep it going, put it back in

View File

@ -53,6 +53,10 @@ int NetWatchRegisterTimerPeriodic(pNWTimer * handle, int mSecInitial,
int mSecPeriod, pNWCallback callback, int mSecPeriod, pNWCallback callback,
void *context); void *context);
pNWTimer NetWatchGetActiveTimer(void);
int NetWatchGetTimerDelay(pNWTimer handle);
int NetWatchGetTimerInitial(pNWTimer handle);
int NetWatchGetTimerPeriod(pNWTimer handle); int NetWatchGetTimerPeriod(pNWTimer handle);
int NetWatchSetTimerPeriod(pNWTimer handle, int mSecPeriod); int NetWatchSetTimerPeriod(pNWTimer handle, int mSecPeriod);
/** /**

274
servlog.c
View File

@ -47,12 +47,15 @@
- NETWrites log message (if enabled) before attempt to write to file - NETWrites log message (if enabled) before attempt to write to file
- uses OpenVerifyLogFile helper function (removed duplicate code) - uses OpenVerifyLogFile helper function (removed duplicate code)
-----------------------------------------------------------------------------*/ -----------------------------------------------------------------------------*/
#include <stdarg.h>
#include "fortify.h" #include "fortify.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
#include <time.h>
#include <sys/time.h>
#include <strlutil.h> #include <strlutil.h>
#include "ifile.h" #include "ifile.h"
@ -126,7 +129,7 @@ int LogCapture(SConnection * pCon, SicsInterp * pSics, void *pData,
/* check no af args */ /* check no af args */
if (argc < 2) { if (argc < 2) {
snprintf(pBueffel,sizeof(pBueffel)-1, "Insufficient number of argumenst to %s", argv[0]); snprintf(pBueffel,sizeof(pBueffel)-1, "Insufficient number of arguments to %s", argv[0]);
SCWrite(pCon, pBueffel, eError); SCWrite(pCon, pBueffel, eError);
return 0; return 0;
} }
@ -203,8 +206,32 @@ static int HasLineFeed(char *pText)
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
#define MAXLOG 10000 static const char* timestamp(struct timeval *tp) {
#define MAXFILES 20 static char ts[80];
int year, month, day;
int hour, min, sec, usec;
struct timeval tv;
struct tm *time;
if (tp)
tv = *tp;
else
gettimeofday(&tv, NULL);
time = localtime(&tv.tv_sec);
year = 1900 + time->tm_year;
month = time->tm_mon + 1;
day = time->tm_mday;
hour = time->tm_hour;
min = time->tm_min;
sec = time->tm_sec;
usec = (int) tv.tv_usec;
snprintf(ts, 80, "%04d-%02d-%02dT%02d:%02d:%02d.%06d",
year, month, day, hour, min, sec, usec);
return ts;
}
/*---------------------------------------------------------------------------*/
#define MAXLOG 100000
#define MAXFILES 100
static FILE *fLogFile = NULL; static FILE *fLogFile = NULL;
static int iFile = 0; static int iFile = 0;
@ -217,6 +244,10 @@ int OpenVerifyLogFile()
char pFile[256]; char pFile[256];
char filnam[512]; char filnam[512];
char *pChar = NULL; char *pChar = NULL;
char fPath[1024];
/* snprintf(fPath, 1023, "%s/", getenv("SICS_INIT_LOGPATH")); */
snprintf(fPath, 1023, "%s/", "../log");
pChar = IFindOption(pSICSOptions, "LogFileBaseName"); pChar = IFindOption(pSICSOptions, "LogFileBaseName");
if (!pChar) { /* Try to write to file "server" in */ if (!pChar) { /* Try to write to file "server" in */
@ -224,7 +255,9 @@ int OpenVerifyLogFile()
} else { } else {
strlcpy(pFile, pChar, 255); strlcpy(pFile, pChar, 255);
} }
snprintf(filnam, 511, "%s%2.2d.log", pFile, iFile);
snprintf(filnam, 511, "%s%s_%19.19s.%02d.log", fPath, pFile, timestamp(NULL), iFile);
fLogFile = fopen(filnam, "w"); fLogFile = fopen(filnam, "w");
if (!fLogFile) { if (!fLogFile) {
fprintf(stderr, "ERROR: Cannot open logfile %s for writing\n", pFile); fprintf(stderr, "ERROR: Cannot open logfile %s for writing\n", pFile);
@ -242,23 +275,23 @@ void SICSLogEnable(int flag)
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void SICSLogWrite(char *pText, OutCode eOut) static void SICSLogWriteFile(char *pText, OutCode eOut, struct timeval *tp)
{ {
char pFile[256];
char *pChar = NULL;
pCaptureEntry pCurrent; pCaptureEntry pCurrent;
char pBueffel[256]; int text_len;
#ifdef NOLOG #ifdef NOLOG
return; return;
#endif #endif
text_len = strlen(pText);
/* do all captured */ /* do all captured */
pCurrent = pCapture; pCurrent = pCapture;
while (pCurrent) { while (pCurrent) {
if ((pCurrent->iOut == eOut) || (pCurrent->iAllFlag == 1)) { if ((pCurrent->iOut == eOut) || (pCurrent->iAllFlag == 1)) {
ANETwrite(pCurrent->pCon->sockHandle, pText, strlen(pText)); ANETwrite(pCurrent->pCon->sockHandle, pText, text_len);
ANETwrite(pCurrent->pCon->sockHandle, "\n", 1); if (pText[text_len - 1] != '\n')
ANETwrite(pCurrent->pCon->sockHandle, "\n", 1);
} }
pCurrent = pCurrent->pNext; pCurrent = pCurrent->pNext;
} }
@ -277,6 +310,7 @@ void SICSLogWrite(char *pText, OutCode eOut)
/* switch file if too many lines */ /* switch file if too many lines */
if (iLineCount >= MAXLOG) { if (iLineCount >= MAXLOG) {
fprintf(fLogFile,"%s: <<<close logfile>>>\n", timestamp(NULL));
fclose(fLogFile); fclose(fLogFile);
fLogFile = NULL; fLogFile = NULL;
iFile++; iFile++;
@ -287,9 +321,225 @@ void SICSLogWrite(char *pText, OutCode eOut)
iLogUsable = OpenVerifyLogFile(); iLogUsable = OpenVerifyLogFile();
} }
if (1 == iLogUsable) { if(1 == iLogUsable)
fprintf(fLogFile, "%s\n", pText); {
if (iLineCount == 0)
fprintf(fLogFile,"%s: <<<open logfile>>>\n", timestamp(NULL));
fprintf(fLogFile,"%s: ", timestamp(tp));
fprintf(fLogFile,"%s", pText);
if (text_len < 1 || pText[text_len - 1] != '\n')
fprintf(fLogFile,"\n");
fflush(fLogFile); fflush(fLogFile);
iLineCount++; iLineCount++;
} }
} }
void SICSLogWriteTime(char *pText, OutCode eOut, struct timeval *tp) {
char buf[200];
const char *cp = pText;
int idx = 0;
struct timeval tv;
if (tp == NULL) {
gettimeofday(&tv, NULL);
tp = &tv;
}
while (*cp) {
if (*cp == '\n') {
buf[idx++] = '\n';
buf[idx++] = '\0';
SICSLogWriteFile(buf, eOut, tp);
idx = 0;
}
else if (*cp == '\r') {
buf[idx++] = '\\';
buf[idx++] = 'r';
}
else if (*cp == '\t') {
buf[idx++] = '\\';
buf[idx++] = 't';
}
else if (*cp < ' ' || *cp > '~') {
const char hex[] = "0123456789ABCDEF";
buf[idx++] = '<';
buf[idx++] = hex[(*cp >> 4) & 0xF];
buf[idx++] = hex[(*cp) & 0xF];
buf[idx++] = '>';
}
else {
buf[idx++] = *cp;
}
cp++;
if (idx > 132) {
buf[idx++] = '\n';
buf[idx++] = '\0';
SICSLogWriteFile(buf, eOut, tp);
idx = 0;
}
}
if (idx > 0) {
buf[idx++] = '\n';
buf[idx++] = '\0';
SICSLogWriteFile(buf, eOut, tp);
}
}
void SICSLogWrite(char *pText, OutCode eOut) {
struct timeval tv;
gettimeofday(&tv, NULL);
SICSLogWriteTime(pText, eOut, &tv);
}
void SICSLogWriteHexTime(const char* text, int count, OutCode eOut, struct timeval *tp) {
const char hex[] = "0123456789ABCDEF";
char addr[20], left[80], right[80];
char *lp = left;
char *rp = right;
int i;
int duplicates;
/* Limit the output */
if (count > 1024)
count = 1024;
duplicates = 0;
for (i = 0; i < count; ++i) {
if ((i & 0xF) == 0) {
if (i > 0) {
char line[132];
snprintf(line, sizeof(line)-1, "%-6s: %-49s | %-17s |", addr, left, right);
SICSLogWriteTime(line, eOut, tp);
}
snprintf(addr, sizeof(addr)-1, "0x%04X", i);
while (i >= 16 && i + 16 < count) {
if (memcmp(&text[i-16], &text[i], 16) != 0)
break;
++duplicates;
i += 16;
}
if (duplicates > 0) {
if (duplicates > 1) {
char line[132];
snprintf(line, sizeof(line)-1, "%-6s: ... (%d duplicates)", addr, duplicates);
SICSLogWriteTime(line, eOut, tp);
}
else {
char line[132];
snprintf(line, sizeof(line)-1, "%-6s: %-49s | %-17s |", addr, left, right);
SICSLogWriteTime(line, eOut, tp);
}
duplicates = 0;
}
snprintf(addr, sizeof(addr)-1, "0x%04X", i);
lp = left;
rp = right;
}
*lp++ = hex[(text[i] >> 4) & 0xF];
*lp++ = hex[(text[i]) & 0xF];
*lp++ = ' ';
if (text[i]>= ' ' && text[i] <= '~')
*rp++ = text[i];
else
*rp++ = '.';
/* if we just did slot 7, insert an extra space */
if ((i & 0xF) == 7) {
*lp++ = ' ';
*rp++ = ' ';
}
*lp = *rp = '\0';
}
if (i > 0) {
char line[132];
snprintf(line, sizeof(line)-1, "%-6s: %-49s | %-17s |", addr, left, right);
SICSLogWriteTime(line, eOut, tp);
}
}
void SICSLogWriteHex(const char* text, int count, OutCode eOut) {
struct timeval tv;
gettimeofday(&tv, NULL);
SICSLogWriteHexTime(text, count, eOut, &tv);
}
void SICSLogTimePrintf(OutCode eOut, struct timeval *tp, const char *fmt, ...)
{
va_list ap;
char buf[256];
char *dyn;
unsigned int l;
int res;
va_start(ap, fmt);
l = vsnprintf(buf, sizeof buf, fmt, ap);
va_end(ap);
if (l >= sizeof buf) {
/* we have probably a C99 conforming snprintf and
need a larger buffer
*/
dyn = malloc(l+1);
if (dyn != NULL) {
va_start(ap, fmt);
vsnprintf(dyn, l+1, fmt, ap);
va_end(ap);
SICSLogWriteTime(dyn, eOut, tp);
free(dyn);
return;
}
}
SICSLogWriteTime(buf, eOut, tp);
return;
}
void SICSLogPrintf(OutCode eOut, const char *fmt, ...)
{
va_list ap;
char buf[256];
char *dyn;
unsigned int l;
int res;
va_start(ap, fmt);
l = vsnprintf(buf, sizeof buf, fmt, ap);
va_end(ap);
if (l >= sizeof buf) {
/* we have probably a C99 conforming snprintf and
need a larger buffer
*/
dyn = malloc(l+1);
if (dyn != NULL) {
va_start(ap, fmt);
vsnprintf(dyn, l+1, fmt, ap);
va_end(ap);
SICSLogWrite(dyn, eOut);
free(dyn);
return;
}
}
SICSLogWrite(buf, eOut);
return;
}
/* Test of the logging facilities */
int testLogCmd(SConnection *pCon, SicsInterp *pInter, void *pData, int argc, char *argv[]) {
char lbuf[2048];
char sbuf[1000];
int i;
SICSLogWrite("Multiline:\nLine 1\r\nLine 2\r\nLine 3\r\n", eStatus);
memset(lbuf, 0, sizeof(lbuf));
memset(sbuf, ' ', sizeof(sbuf));
SICSLogPrintf(eStatus, "Hexlog %d all zero bytes", sizeof(lbuf));
SICSLogWriteHex(lbuf, sizeof(lbuf), eStatus);
for (i = 0; i <= 128; ++i)
sbuf[i] = sbuf[sizeof(sbuf)-1 - i] = i;
sbuf[sizeof(sbuf)/2] = '!';
SICSLogPrintf(eStatus, "Hexlog %d mid space bytes", sizeof(sbuf));
SICSLogWriteHex(sbuf, sizeof(sbuf), eStatus);
for (i = 0; i < 1000; ++i)
sbuf[i] = ' ' + (i % 96);
sbuf[sizeof(sbuf)-1] = '\0';
SICSLogWrite("Very long line 1000 bytes", eStatus);
SICSLogWrite(sbuf, eStatus);
SCSendOK(pCon);
return OKOK;
}

View File

@ -16,6 +16,11 @@
#define SICSLOG #define SICSLOG
#include "Scommon.h" #include "Scommon.h"
void SICSLogWrite(char *ptext, OutCode eOut); void SICSLogWrite(char *ptext, OutCode eOut);
void SICSLogWriteTime(char *ptext, OutCode eOut, struct timeval *tp );
void SICSLogWriteHex(const char* text, int count, OutCode eOut);
void SICSLogWriteHexTime(const char* text, int count, OutCode eOut, struct timeval *tp);
void SICSLogPrintf(OutCode eOut, const char*fmt, ...);
void SICSLogTimePrintf(OutCode eOut, struct timeval *tp, const char *fmt, ...);
void SICSLogEnable(int flag); void SICSLogEnable(int flag);
int KillCapture(SConnection * pCon); int KillCapture(SConnection * pCon);

View File

@ -110,7 +110,8 @@ int LFGenWriteStart(Ascon *a) {
pNewBuffer[bufInd] = CRC; pNewBuffer[bufInd] = CRC;
bufInd++; bufInd++;
//pNewBuffer[bufSize-1] = '\r'; //pNewBuffer[bufSize-1] = '\r';
DynStringReplaceWithLen(a->wrBuffer, pNewBuffer, 0, bufInd); DynStringClear(a->wrBuffer);
DynStringConcatBytes(a->wrBuffer, pNewBuffer, bufInd);
a->wrPos = 0; a->wrPos = 0;
a->state = AsconWriting; a->state = AsconWriting;
/* if there is only the terminator, do not send it */ /* if there is only the terminator, do not send it */

View File

@ -168,7 +168,8 @@ int ModbusWriteStart(Ascon *a) {
if (debug_modbus > 0) { if (debug_modbus > 0) {
dbgprintx("modbus-xo", (unsigned char*)temp, idx); dbgprintx("modbus-xo", (unsigned char*)temp, idx);
} }
DynStringReplaceWithLen(a->wrBuffer, temp, 0, idx); DynStringClear(a->wrBuffer);
DynStringConcatBytes(a->wrBuffer, temp, idx);
a->state = AsconWriting; a->state = AsconWriting;
a->wrPos = 0; a->wrPos = 0;
return 1; return 1;
@ -230,7 +231,8 @@ int ModbusReading(Ascon *a) {
dbgprintx("modbus-xi", cp, blen); dbgprintx("modbus-xi", cp, blen);
} }
dbgprintf("modbus-rd:%s\n", temp); dbgprintf("modbus-rd:%s\n", temp);
DynStringReplaceWithLen(a->rdBuffer, temp, 0, rlen); DynStringClear(a->rdBuffer);
DynStringConcatBytes(a->rdBuffer, temp, rlen);
a->state = AsconReadDone; a->state = AsconReadDone;
return 1; return 1;
} }

View File

@ -153,7 +153,8 @@ int OrdHVPSWriteStart(Ascon *a) {
pcmdrspfmt++; // skip over the '-' separator into the response format pcmdrspfmt++; // skip over the '-' separator into the response format
cmd_len=pcmd-cmd; cmd_len=pcmd-cmd;
cmd[cmd_len] = '\0'; cmd[cmd_len] = '\0';
DynStringReplaceWithLen(a->wrBuffer,cmd,0,cmd_len); DynStringClear(a->wrBuffer);
DynStringConcatBytes(a->wrBuffer, cmd, cmd_len);
a->state = AsconWriting; a->state = AsconWriting;
a->wrPos = 0; a->wrPos = 0;
return 1; return 1;

View File

@ -1,24 +1,24 @@
/** /**
* @brief Protocol handler for Mirrotron RF power supplies * @brief Protocol handler for Mirrotron RF power supplies
Author: Ferdi Franceschini Author: Ferdi Franceschini
TODO: Provide acknowledgement when setting a parameter TODO: Provide acknowledgement when setting a parameter
"OK", when successful "OK", when successful
"ANSRFAMP: Set failed", on error "ANSRFAMP: Set failed", on error
Current should be ramped up in steps of 0.5A but it doesn't Current should be ramped up in steps of 0.5A but it doesn't
have to be ramped down. have to be ramped down.
Provides two commands (L)ist and (S)et Provides two commands (L)ist and (S)et
eg, eg,
The following command lists status info from the RF Amp at address 3. The following command lists status info from the RF Amp at address 3.
sct_rfamp send L:3 sct_rfamp send L:3
The reply string has the following form The reply string has the following form
address=1|type=L|curr=00|freq=170|voltage=50|K3=1|K2=1|K1=1|O=1|CC=1|CV=0|H=1 address=1|type=L|curr=00|freq=170|voltage=50|K3=1|K2=1|K1=1|O=1|CC=1|CV=0|H=1
The following command sets the current(I), frequency, switches(K1,K2,K3) and output(O). The following command sets the current(I), frequency, switches(K1,K2,K3) and output(O).
sct_rfamp send S:3:I=5:F=170:K3=0:K2=1:k1=0:O=1 sct_rfamp send S:3:I=5:F=170:K3=0:K2=1:k1=0:O=1
NOTE: The current is an integer which equals the desired current x10, ie 71 -> 7.1A NOTE: The current is an integer which equals the desired current x10, ie 71 -> 7.1A
*/ */
#include <errno.h> #include <errno.h>
@ -87,19 +87,20 @@ int RFAmpWriteStart (Ascon *a)
switch (ctype) { switch (ctype) {
case 'L': case 'L':
sprintf(data->rfCmd,"%c%c%c%c", 2, address, ctype, 3); sprintf(data->rfCmd,"%c%c%c%c", 2, address, ctype, 3);
DynStringReplaceWithLen(a->wrBuffer, data->rfCmd,0, LCMDLEN); DynStringClear(a->wrBuffer);
DynStringConcatBytes(a->wrBuffer, data->rfCmd, LCMDLEN);
a->state = AsconWriting; a->state = AsconWriting;
a->noResponse = 0; a->noResponse = 0;
a->wrPos = 0; a->wrPos = 0;
return 1; return 1;
break; break;
case 'S': case 'S':
if (ret < 8) { if (ret < 8) {
snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid command string %s", dynStrBuffer); snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid command string %s", dynStrBuffer);
a->state = AsconWriteDone; a->state = AsconWriteDone;
a->noResponse = 1; a->noResponse = 1;
AsconError(a, errMsg, 0); AsconError(a, errMsg, 0);
return 1; return 1;
} }
if (address < '1' || address > '9') { if (address < '1' || address > '9') {
snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid address %c, it should be between 1 and 9", address); snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid address %c, it should be between 1 and 9", address);
@ -110,7 +111,7 @@ int RFAmpWriteStart (Ascon *a)
} }
if (curr < MINCURRSPEC || curr > MAXCURRSPEC) { if (curr < MINCURRSPEC || curr > MAXCURRSPEC) {
snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid current specifier %d, it should be between %d and %d. NOTE:divide by 10 to convert to Amps", \ snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid current specifier %d, it should be between %d and %d. NOTE:divide by 10 to convert to Amps", \
curr, MINCURRSPEC, MAXCURRSPEC); curr, MINCURRSPEC, MAXCURRSPEC);
a->state = AsconWriteDone; a->state = AsconWriteDone;
a->noResponse = 1; a->noResponse = 1;
AsconError(a, errMsg, 0); AsconError(a, errMsg, 0);
@ -139,21 +140,22 @@ int RFAmpWriteStart (Ascon *a)
return 1; return 1;
} }
sprintf(data->statusCmd,"%c%c%c%c", 2, address, 'L', 3); sprintf(data->statusCmd,"%c%c%c%c", 2, address, 'L', 3);
DynStringReplaceWithLen(a->wrBuffer, data->statusCmd, 0, LCMDLEN); DynStringClear(a->wrBuffer);
DynStringConcatBytes(a->wrBuffer, data->statusCmd, LCMDLEN);
data->transactInProg = txPreSet; data->transactInProg = txPreSet;
data->targetCurrent = curr; data->targetCurrent = curr;
a->state = AsconWriting; a->state = AsconWriting;
a->noResponse = 0; a->noResponse = 0;
a->wrPos = 0; a->wrPos = 0;
return 1; return 1;
break; break;
default: default:
snprintf(errMsg, ERRLEN, "ANSRFAMP: Unknown command type %c, allowed types are 'L' or 'S'", ctype); snprintf(errMsg, ERRLEN, "ANSRFAMP: Unknown command type %c, allowed types are 'L' or 'S'", ctype);
a->state = AsconWriteDone; a->state = AsconWriteDone;
a->noResponse = 1; a->noResponse = 1;
AsconError(a, errMsg, 0); AsconError(a, errMsg, 0);
return 1; return 1;
break; break;
} }
} }
@ -172,62 +174,64 @@ int RFAmpReading (Ascon *a)
if(data->transactInProg == txPostSet){ if(data->transactInProg == txPostSet){
data->transactInProg = txCheckReply; data->transactInProg = txCheckReply;
//Jing: add delay to wait for ramping complete //Jing: add delay to wait for ramping complete
sleep(data->timeout); sleep(data->timeout);
DynStringReplaceWithLen(a->wrBuffer, data->statusCmd, 0, LCMDLEN); DynStringClear(a->wrBuffer);
a->state = AsconWriting; DynStringConcatBytes(a->wrBuffer, data->statusCmd, LCMDLEN);
a->noResponse = 0; a->state = AsconWriting;
a->wrPos = 0; a->noResponse = 0;
delay = 0; a->wrPos = 0;
}else{ delay = 0;
// Start reading when byte = 2 and stop when 3 } else {
while ( ( rdChRet = AsconReadChar(a->fd, &chr) ) > 0) { // Start reading when byte = 2 and stop when 3
a->start = DoubleTime(); while ( ( rdChRet = AsconReadChar(a->fd, &chr) ) > 0) {
if (a->readState) { a->start = DoubleTime();
if (a->readState >= LASTBYTENUM) { if (a->readState) {
a->readState = 0; if (a->readState >= LASTBYTENUM) {
if (a->readState > LASTBYTENUM) { a->readState = 0;
snprintf(errMsg, ERRLEN, "ANSRFAMP: Packet larger than expected, size exceeds %d", LASTBYTENUM); if (a->readState > LASTBYTENUM) {
GetReplyFailed = 1; snprintf(errMsg, ERRLEN, "ANSRFAMP: Packet larger than expected, size exceeds %d", LASTBYTENUM);
break; GetReplyFailed = 1;
} break;
if (chr != 3) { }
snprintf(errMsg, ERRLEN, "ANSRFAMP: Unexpected value %X for packet end signal", chr); if (chr != 3) {
GetReplyFailed = 1; snprintf(errMsg, ERRLEN, "ANSRFAMP: Unexpected value %X for packet end signal", chr);
break; GetReplyFailed = 1;
} break;
if (0 == DynStringConcatChar(a->rdBuffer, '\0')) { }
strcpy(errMsg, "ANSRFAMP: DynStringConcatChar failed:"); if (0 == DynStringConcatChar(a->rdBuffer, '\0')) {
errNum = ENOMEM; strcpy(errMsg, "ANSRFAMP: DynStringConcatChar failed:");
GetReplyFailed = 1; errNum = ENOMEM;
break; GetReplyFailed = 1;
} break;
address = GetCharArray(a->rdBuffer)[0]; }
ctype = GetCharArray(a->rdBuffer)[1]; address = GetCharArray(a->rdBuffer)[0];
ctype = GetCharArray(a->rdBuffer)[1];
memset(curr, 0, sizeof(curr)); memset(curr, 0, sizeof(curr));
memset(freq, 0, sizeof(freq)); memset(freq, 0, sizeof(freq));
memset(voltage, 0, sizeof(voltage)); memset(voltage, 0, sizeof(voltage));
strncpy(curr, &GetCharArray(a->rdBuffer)[2], 2); strncpy(curr, &GetCharArray(a->rdBuffer)[2], 2);
strncpy(freq, &GetCharArray(a->rdBuffer)[4], 3); strncpy(freq, &GetCharArray(a->rdBuffer)[4], 3);
strncpy(voltage, &GetCharArray(a->rdBuffer)[7], 2); strncpy(voltage, &GetCharArray(a->rdBuffer)[7], 2);
switches = (unsigned char)GetCharArray(a->rdBuffer)[9]; switches = (unsigned char)GetCharArray(a->rdBuffer)[9];
opstate = GetCharArray(a->rdBuffer)[10]; opstate = GetCharArray(a->rdBuffer)[10];
if (data->transactInProg == txPreSet) { if (data->transactInProg == txPreSet) {
data->transactInProg = txPostSet; data->transactInProg = txPostSet;
if (abs(data->targetCurrent - atoi(curr)) <= (5 + data->currTol)) { if (abs(data->targetCurrent - atoi(curr)) <= (5 + data->currTol)) {
DynStringReplaceWithLen(a->wrBuffer, data->rfCmd,0, SCMDLEN); DynStringClear(a->wrBuffer);
delay = round(abs(data->targetCurrent - atoi(curr))/0.5 + 0.5); DynStringConcatBytes(a->wrBuffer, data->rfCmd, SCMDLEN);
a->state = AsconWriting; delay = round(abs(data->targetCurrent - atoi(curr))/0.5 + 0.5);
a->noResponse = 0; a->state = AsconWriting;
a->wrPos = 0; a->noResponse = 0;
} else { a->wrPos = 0;
strcpy(errMsg, "ANSRFAMP: Step size should be <= 5 for current"); } else {
GetReplyFailed = 1; strcpy(errMsg, "ANSRFAMP: Step size should be <= 5 for current");
break; GetReplyFailed = 1;
break;
} }
} else if (data->transactInProg == txCheckReply) { } else if (data->transactInProg == txCheckReply) {
// TODO Compare rdBuffer to rfCmd if they match then set replyStr="OK" else set error message // TODO Compare rdBuffer to rfCmd if they match then set replyStr="OK" else set error message
@ -240,13 +244,13 @@ int RFAmpReading (Ascon *a)
strncpy(tmpFreq, &data->rfCmd[5], 3); strncpy(tmpFreq, &data->rfCmd[5], 3);
tmpSwitchs = (unsigned char)data->rfCmd[8]; tmpSwitchs = (unsigned char)data->rfCmd[8];
// TODO SICS-405 ffr Removed check because the read values don't immediately match the set values // TODO SICS-405 ffr Removed check because the read values don't immediately match the set values
if( (abs(atoi(curr) - atoi(tmpCurr)) > data->currTol) || if( (abs(atoi(curr) - atoi(tmpCurr)) > data->currTol) ||
(atoi(freq) != atoi(tmpFreq)) || (atoi(freq) != atoi(tmpFreq)) ||
((switches & 0x0F) != (tmpSwitchs & 0x0F)) ) { ((switches & 0x0F) != (tmpSwitchs & 0x0F)) ) {
strcpy(errMsg, "ANSRFAMP: the (S)ET command failed"); strcpy(errMsg, "ANSRFAMP: the (S)ET command failed");
GetReplyFailed = 1; GetReplyFailed = 1;
break; break;
} else { } else {
DynStringReplace(a->rdBuffer, "OK", 0); DynStringReplace(a->rdBuffer, "OK", 0);
} }
@ -257,37 +261,38 @@ int RFAmpReading (Ascon *a)
a->state = AsconReadDone; a->state = AsconReadDone;
data->transactInProg = txNormalRead; data->transactInProg = txNormalRead;
} else if (data->transactInProg == txNormalRead) { } else if (data->transactInProg == txNormalRead) {
K3 = (switches & 0x08) >> 3; K3 = (switches & 0x08) >> 3;
K2 = (switches & 0x04) >> 2; K2 = (switches & 0x04) >> 2;
K1 = (switches & 0x02) >> 1; K1 = (switches & 0x02) >> 1;
outOn = switches & 0x01; outOn = switches & 0x01;
CC = (opstate & 0x04) >> 2; CC = (opstate & 0x04) >> 2;
CV = (opstate & 0x02) >> 1; CV = (opstate & 0x02) >> 1;
heat = opstate & 0x01; heat = opstate & 0x01;
snprintf(replyStr, 128, "address=%c|type=%c|curr=%s|freq=%s|voltage=%s|K3=%d|K2=%d|K1=%d|O=%d|CC=%d|CV=%d|H=%d", \ snprintf(replyStr, 128, "address=%c|type=%c|curr=%s|freq=%s|voltage=%s|K3=%d|K2=%d|K1=%d|O=%d|CC=%d|CV=%d|H=%d", \
address, ctype, curr, freq, voltage, K3, K2, K1, outOn, CC, CV, heat); address, ctype, curr, freq, voltage, K3, K2, K1, outOn, CC, CV, heat);
if (0 == DynStringReplaceWithLen(a->rdBuffer, replyStr, 0, 128)) { DynStringClear(a->wrBuffer);
strcpy(errMsg, "ANSRFAMP: DynStringReplace failed:"); if (0 == DynStringConcatBytes(a->rdBuffer, replyStr, 128)) {
errNum = ENOMEM; strcpy(errMsg, "ANSRFAMP: DynStringReplace failed:");
GetReplyFailed = 1; errNum = ENOMEM;
break; GetReplyFailed = 1;
} break;
a->state = AsconReadDone; }
} a->state = AsconReadDone;
return 1; }
} return 1;
if (0 == DynStringConcatChar(a->rdBuffer, chr)) { }
strcpy(errMsg, "ANSRFAMP: DynStringConcatChar failed:"); if (0 == DynStringConcatChar(a->rdBuffer, chr)) {
errNum = ENOMEM; strcpy(errMsg, "ANSRFAMP: DynStringConcatChar failed:");
GetReplyFailed = 1; errNum = ENOMEM;
break; GetReplyFailed = 1;
} break;
a->readState++; }
} else if (chr == 2) { a->readState++;
a->readState = 1; } else if (chr == 2) {
} a->readState = 1;
} }
} }
}
if (rdChRet < 0) { if (rdChRet < 0) {
AsconError(a, "ANSRFAMP: AsconReadChar failed:", errno); AsconError(a, "ANSRFAMP: AsconReadChar failed:", errno);
return 1; return 1;
@ -318,11 +323,11 @@ int RFAmpProtHandler (Ascon *a)
case AsconWriteStart: case AsconWriteStart:
ret = RFAmpWriteStart(a); ret = RFAmpWriteStart(a);
return ret; return ret;
break; break;
case AsconReading: case AsconReading:
ret = RFAmpReading(a); ret = RFAmpReading(a);
return ret; return ret;
break; break;
default: default:
return AsconStdHandler(a); return AsconStdHandler(a);
} }
@ -345,11 +350,11 @@ int RFAmpInit(Ascon *a, SConnection *con, int argc, char *argv[])
void AddRFAmpProtocol() void AddRFAmpProtocol()
{ {
AsconProtocol *prot = NULL; AsconProtocol *prot = NULL;
prot = calloc(sizeof(AsconProtocol), 1); prot = calloc(sizeof(AsconProtocol), 1);
prot->name = strdup("rfamp"); prot->name = strdup("rfamp");
prot->init = RFAmpInit; prot->init = RFAmpInit;
prot->handler = RFAmpProtHandler; prot->handler = RFAmpProtHandler;
AsconInsertProtocol(prot); AsconInsertProtocol(prot);
} }

View File

@ -263,7 +263,8 @@ int TCPMBWriteStart(Ascon *a) {
PDUlenPlusUID = ADUlen - 6; PDUlenPlusUID = ADUlen - 6;
ADU[4] = (PDUlenPlusUID & 0xFF00) >> 8; ADU[4] = (PDUlenPlusUID & 0xFF00) >> 8;
ADU[5] = PDUlenPlusUID & 0xFF; ADU[5] = PDUlenPlusUID & 0xFF;
DynStringReplaceWithLen(a->wrBuffer, ADU, 0, ADUlen); DynStringClear(a->wrBuffer);
DynStringConcatBytes(a->wrBuffer, ADU, ADUlen);
a->state = AsconWriting; a->state = AsconWriting;
a->wrPos = 0; a->wrPos = 0;
return 1; return 1;

View File

@ -1,29 +1,29 @@
# vim: ft=make ts=4 sw=4 noet cindent # vim: ft=make ts=4 sw=4 noet cindent
COBJ = Sclient.o network.o ifile.o intcli.o $(FORTIFYOBJ) COBJ = Sclient.o network.o ifile.o intcli.o $(FORTIFYOBJ)
SOBJ = access.o alias.o anticollider.o ascon.o asyncprotocol.o asyncqueue.o callback.o \ SOBJ = alias.o anticollider.o arrayutil.o ascon.o asyncprotocol.o asyncqueue.o asynnet.o background.o callback.o \
cell.o chadapter.o choco.o circular.o commandlog.o cone.o confvirtualmot.o \ cell.o chadapter.o choco.o circular.o commandlog.o cone.o confvirtualmot.o \
conman.o costa.o danu.o definealias.o devexec.o devser.o diffscan.o d_mod.o \ conman.o costa.o countersec.o danu.o definealias.o devexec.o devser.o diffscan.o d_mod.o \
drive.o d_sign.o dynstring.o emon.o errormsg.o evcontroller.o evdriver.o \ drive.o d_sign.o dynstring.o emon.o errormsg.o evcontroller.o evdriver.o \
event.o exebuf.o exeman.o fitcenter.o fomerge.o $(FORTIFYOBJ) fourlib.o \ event.o exebuf.o exeman.o fitcenter.o fomerge.o $(FORTIFYOBJ) fourlib.o fourmess.o \
fourtable.o fupa.o gpibcontroller.o help.o hipadaba.o \ fourtable.o fupa.o genbinprot.o gpibcontroller.o hdbtable.o help.o hipadaba.o \
histdriv.o histmem.o histregress.o histsim.o hklmot.o hkl.o \ histdriv.o histmem.o histmemsec.o histregress.o histsim.o hklmot.o hkl.o \
hmcontrol.o hmdata.o hmslave.o ifile.o initializer.o integrate.o interface.o \ hmcontrol.o hmdata.o hmslave.o ifile.o initializer.o integrate.o interface.o \
intserv.o lin2ang.o lld_blob.o lld.o logger.o logreader.o logsetup.o lomax.o \ intserv.o lin2ang.o lld_blob.o lld.o logger.o logreader.o logsetup.o lomax.o \
macro.o maximize.o mccontrol.o mcreader.o mcstascounter.o mcstashm.o \ macro.o maximize.o mccontrol.o mcreader.o mcstascounter.o mcstashm.o \
moregress.o motorlist.o motreglist.o motreg.o multicounter.o mumoconf.o mumo.o \ moregress.o motorlist.o motorsec.o motreglist.o motreg.o multicounter.o mumoconf.o mumo.o \
napi5.o napi.o network.o $(NIOBJ) nread.o nserver.o nwatch.o nxcopy.o \ napi5.o napi.o network.o $(NIOBJ) nread.o nserver.o nwatch.o nxcopy.o \
nxdataset.o nxdict.o nxinterhelper.o nxinter_wrap.o nxio.o nxscript.o nxstack.o \ nxdataset.o nxdict.o nxinterhelper.o nxinter_wrap.o nxio.o nxscript.o nxstack.o \
nxupdate.o nxutil.o nxxml.o o2t.o obdes.o obpar.o ofac.o optimise.o oscillate.o \ nxupdate.o nxutil.o nxxml.o o2t.o obdes.o obpar.o ofac.o optimise.o oscillate.o \
passwd.o perfmon.o polldriv.o protocol.o proxy.o regresscter.o remob.o \ passwd.o perfmon.o polldriv.o protocol.o proxy.o reflist.o regresscter.o remob.o \
rmtrail.o rs232controller.o savehdb.o scaldate.o scan.o scanvar.o SCinter.o \ rmtrail.o rs232controller.o rwpuffer.o sansbc.o savehdb.o scaldate.o scan.o scanvar.o SCinter.o \
scriptcontext.o script.o sctdriveadapter.o sctdriveobj.o sdynar.o selector.o \ scriptcontext.o script.o sctdriveadapter.o sctdriveobj.o sdynar.o selector.o \
selvar.o servlog.o sicscron.o sicsdata.o sicsexit.o sicshdbadapter.o \ selvar.o servlog.o sgclib.o sghkl.o sgio.o sicscron.o sicsdata.o sicsexit.o sicshdbadapter.o \
sicshdbfactory.o sicshipadaba.o sicslist.o SICSmain.o sicsobj.o sicspoll.o \ sicshdbfactory.o sicshipadaba.o sicslist.o SICSmain.o sicsobj.o sicspoll.o sicsutil.o \
sicvar.o sig_die.o simchop.o simev.o sinfox.o splitter.o s_rnge.o statemon.o \ sicvar.o sig_die.o simchop.o simev.o simidx.o simindex.o sinfox.o singlebi.o singlediff.o singlenb.o singlebinb.o singletas.o singlex.o splitter.o s_rnge.o statemon.o \
statistics.o statusfile.o status.o stdscan.o stptok.o stringdict.o strrepl.o \ statistics.o statusfile.o status.o stdscan.o stptok.o stringdict.o strlutil.o strrepl.o \
synchronize.o tasdrive.o task.o tasscanub.o tasublib.o tasub.o tcldrivable.o \ syncedprot.o synchronize.o tasdrive.o task.o tasscanub.o tasublib.o tasub.o tcldrivable.o \
tclev.o tclintimpl.o telnet.o token.o trigd.o trim.o ubcalc.o \ tclev.o tclintimpl.o tclmotdriv.o telnet.o testprot.o token.o trace.o trigd.o trim.o ubcalc.o \
ubfour.o udpquieck.o userscan.o uubuffer.o varlog.o vector.o wwildcard.o \ ubfour.o udpquieck.o uselect.o userscan.o uubuffer.o varlog.o vector.o velosec.o wwildcard.o \
xytable.o xytable.o
# These are intermediate files generated from .tc files, marking # These are intermediate files generated from .tc files, marking