Merged changes from 3.15 branch, to revno 12807

This commit is contained in:
Andrew Johnson
2017-02-01 11:57:04 -06:00
90 changed files with 1401 additions and 959 deletions
+2 -2
View File
@@ -130,8 +130,8 @@ long dbcar(char *precordname, int level)
precord->name,
pdbFldDes->name,
plink->value.pv_link.pvname,
pca->nDisconnect,
pca->nNoWrite);
pca ? pca->nDisconnect : 0,
pca ? pca->nNoWrite : 0);
}
}
}
+2 -4
View File
@@ -3940,10 +3940,9 @@ static long putFloatString(
char *pdest = (char *) paddr->pfield;
long status = 0;
int precision = 6;
struct rset *prset = 0;
struct rset *prset = dbGetRset(paddr);
short size = paddr->field_size;
if (paddr) prset = dbGetRset(paddr);
if (prset && (prset->get_precision))
status = (*prset->get_precision)(paddr,&precision);
if (nRequest==1 && offset==0) {
@@ -4154,10 +4153,9 @@ static long putDoubleString(
char *pdest = (char *) paddr->pfield;
long status = 0;
int precision = 6;
struct rset *prset = 0;
struct rset *prset = dbGetRset(paddr);
short size = paddr->field_size;
if (paddr) prset = dbGetRset(paddr);
if (prset && (prset->get_precision))
status = (*prset->get_precision)(paddr,&precision);
if (nRequest==1 && offset==0) {
+72 -32
View File
@@ -159,8 +159,11 @@ void scanStop(void)
interruptAccept = FALSE;
for (i = 0; i < nPeriodic; i++) {
papPeriodic[i]->scanCtl = ctlExit;
epicsEventSignal(papPeriodic[i]->loopEvent);
periodic_scan_list *ppsl = papPeriodic[i];
if (!ppsl) continue;
ppsl->scanCtl = ctlExit;
epicsEventSignal(ppsl->loopEvent);
epicsEventWait(startStopEvent);
}
@@ -205,16 +208,24 @@ void scanRun(void)
interruptAccept = TRUE;
scanCtl = ctlRun;
for (i = 0; i < nPeriodic; i++)
papPeriodic[i]->scanCtl = ctlRun;
for (i = 0; i < nPeriodic; i++) {
periodic_scan_list *ppsl = papPeriodic[i];
if (!ppsl) continue;
ppsl->scanCtl = ctlRun;
}
}
void scanPause(void)
{
int i;
for (i = nPeriodic - 1; i >= 0; --i)
papPeriodic[i]->scanCtl = ctlPause;
for (i = nPeriodic - 1; i >= 0; --i) {
periodic_scan_list *ppsl = papPeriodic[i];
if (!ppsl) continue;
ppsl->scanCtl = ctlPause;
}
scanCtl = ctlPause;
interruptAccept = FALSE;
@@ -286,9 +297,11 @@ void scanAdd(struct dbCommon *precord)
}
addToList(precord, &piosh->iosl[prio].scan_list);
} else if (scan >= SCAN_1ST_PERIODIC) {
addToList(precord, &papPeriodic[scan - SCAN_1ST_PERIODIC]->scan_list);
periodic_scan_list *ppsl = papPeriodic[scan - SCAN_1ST_PERIODIC];
if (ppsl)
addToList(precord, &ppsl->scan_list);
}
return;
}
void scanDelete(struct dbCommon *precord)
@@ -352,28 +365,48 @@ void scanDelete(struct dbCommon *precord)
}
deleteFromList(precord, &piosh->iosl[prio].scan_list);
} else if (scan >= SCAN_1ST_PERIODIC) {
deleteFromList(precord, &papPeriodic[scan - SCAN_1ST_PERIODIC]->scan_list);
periodic_scan_list *ppsl = papPeriodic[scan - SCAN_1ST_PERIODIC];
if (ppsl)
deleteFromList(precord, &ppsl->scan_list);
}
return;
}
double scanPeriod(int scan) {
periodic_scan_list *ppsl;
scan -= SCAN_1ST_PERIODIC;
if (scan < 0 || scan >= nPeriodic)
return 0.0;
return papPeriodic[scan]->period;
ppsl = papPeriodic[scan];
return ppsl ? ppsl->period : 0.0;
}
int scanppl(double period) /* print periodic list */
int scanppl(double period) /* print periodic scan list(s) */
{
periodic_scan_list *ppsl;
dbMenu *pmenu = dbFindMenu(pdbbase, "menuScan");
char message[80];
int i;
if (!pmenu || !papPeriodic) {
printf("scanppl: dbScan subsystem not initialized\n");
return -1;
}
for (i = 0; i < nPeriodic; i++) {
ppsl = papPeriodic[i];
if (ppsl == NULL) continue;
if (period > 0.0 && (fabs(period - ppsl->period) >.05)) continue;
periodic_scan_list *ppsl = papPeriodic[i];
if (!ppsl) {
const char *choice = pmenu->papChoiceValue[i + SCAN_1ST_PERIODIC];
printf("Periodic scan list for SCAN = '%s' not initialized\n",
choice);
continue;
}
if (period > 0.0 &&
(fabs(period - ppsl->period) > 0.05))
continue;
sprintf(message, "Records with SCAN = '%s' (%lu over-runs):",
ppsl->name, ppsl->overruns);
printList(&ppsl->scan_list, message);
@@ -741,7 +774,7 @@ static void periodicTask(void *arg)
if (++overruns >= 10 &&
epicsTimeDiffInSeconds(&now, &reported) > report_delay) {
errlogPrintf("\ndbScan warning from '%s' scan thread:\n"
"\tScan processing averages %.2f seconds (%.2f .. %.2f).\n"
"\tScan processing averages %.3f seconds (%.3f .. %.3f).\n"
"\tOver-runs have now happened %u times in a row.\n"
"\tTo fix this, move some records to a slower scan rate.\n",
ppsl->name, ppsl->period + overtime / overruns,
@@ -788,12 +821,8 @@ static void initPeriodic(void)
char *unit;
int status = epicsParseDouble(choice, &number, &unit);
ppsl->scan_list.lock = epicsMutexMustCreate();
ellInit(&ppsl->scan_list.list);
ppsl->name = choice;
if (status || number == 0) {
if (status || number <= 0) {
errlogPrintf("initPeriodic: Bad menuScan choice '%s'\n", choice);
ppsl->period = i;
}
else if (!*unit ||
!epicsStrCaseCmp(unit, "second") ||
@@ -814,16 +843,24 @@ static void initPeriodic(void)
}
else {
errlogPrintf("initPeriodic: Bad menuScan choice '%s'\n", choice);
ppsl->period = i;
}
if (ppsl->period == 0) {
free(ppsl);
continue;
}
ppsl->scan_list.lock = epicsMutexMustCreate();
ellInit(&ppsl->scan_list.list);
ppsl->name = choice;
ppsl->scanCtl = ctlPause;
ppsl->loopEvent = epicsEventMustCreate(epicsEventEmpty);
number = ppsl->period / quantum;
if ((ppsl->period < 2 * quantum) ||
(number / floor(number) > 1.1)) {
errlogPrintf("initPeriodic: Scan rate '%s' is not achievable.\n",
choice);
}
ppsl->scanCtl = ctlPause;
ppsl->loopEvent = epicsEventMustCreate(epicsEventEmpty);
papPeriodic[i] = ppsl;
}
@@ -835,6 +872,8 @@ static void deletePeriodic(void)
for (i = 0; i < nPeriodic; i++) {
periodic_scan_list *ppsl = papPeriodic[i];
if (!ppsl) continue;
ellFree(&ppsl->scan_list.list);
epicsEventDestroy(ppsl->loopEvent);
epicsMutexDestroy(ppsl->scan_list.lock);
@@ -847,10 +886,11 @@ static void deletePeriodic(void)
static void spawnPeriodic(int ind)
{
periodic_scan_list *ppsl;
periodic_scan_list *ppsl = papPeriodic[ind];
char taskName[20];
ppsl = papPeriodic[ind];
if (!ppsl) return;
sprintf(taskName, "scan-%g", ppsl->period);
periodicTaskId[ind] = epicsThreadCreate(
taskName, epicsThreadPriorityScanLow + ind,
@@ -989,13 +1029,13 @@ static void addToList(struct dbCommon *precord, scan_list *psl)
pse->precord = precord;
}
pse->pscan_list = psl;
ptemp = (scan_element *)ellFirst(&psl->list);
ptemp = (scan_element *)ellLast(&psl->list);
while (ptemp) {
if (ptemp->precord->phas > precord->phas) {
ellInsert(&psl->list, ellPrevious(&ptemp->node), &pse->node);
if (ptemp->precord->phas <= precord->phas) {
ellInsert(&psl->list, &ptemp->node, &pse->node);
break;
}
ptemp = (scan_element *)ellNext(&ptemp->node);
ptemp = (scan_element *)ellPrevious(&ptemp->node);
}
if (ptemp == NULL) ellAdd(&psl->list, (void *)pse);
psl->modified = TRUE;
+4
View File
@@ -172,6 +172,7 @@ int pft(const char *pname, const char *pvalue)
ca_dump_dbr(DBR_ENUM,1, buffer);
}
printf("\n");
dbChannelDelete(chan);
return (0);
}
@@ -231,6 +232,7 @@ int tpn(const char *pname, const char *pvalue)
ppn = calloc(1, sizeof(processNotify));
if (!ppn) {
printf("calloc failed\n");
dbChannelDelete(chan);
return -1;
}
ppn->requestType = putProcessRequest;
@@ -241,6 +243,8 @@ int tpn(const char *pname, const char *pvalue)
ptpnInfo = calloc(1, sizeof(tpnInfo));
if (!ptpnInfo) {
printf("calloc failed\n");
free(ppn);
dbChannelDelete(chan);
return -1;
}
ptpnInfo->ppn = ppn;
+4 -1
View File
@@ -541,8 +541,11 @@ MAIN(chfPluginTest)
dbChannel *pch;
db_field_log *pfl;
#if defined(WIN32) && (!defined(_MINGW) || __MSVCRT_VERSION__ >= 0x0800)
#ifdef _WIN32
#if (defined(_MSC_VER) && _MSC_VER < 1900) || \
(defined(_MINGW) && defined(_TWO_DIGIT_EXPONENT))
_set_output_format(_TWO_DIGIT_EXPONENT);
#endif
#endif
testPlan(1433);
+19 -19
View File
@@ -133,25 +133,25 @@ typedef struct dbVariableDef {
}dbVariableDef;
typedef struct dbRecordType {
ELLNODE node;
ELLLIST attributeList; /*LIST head of attributes*/
ELLLIST recList; /*LIST head of sorted dbRecordNodes*/
ELLLIST devList; /*List of associated device support*/
ELLLIST cdefList; /*LIST of Cdef text items*/
char *name;
short no_fields; /* number of fields defined */
short no_prompt; /* number of fields to configure*/
short no_links; /* number of links */
short no_aliases; /* number of aliases in recList */
short *link_ind; /* addr of array of ind in papFldDes*/
char **papsortFldName;/* ptr to array of ptr to fld names*/
short *sortFldInd; /* addr of array of ind in papFldDes*/
dbFldDes *pvalFldDes; /*pointer dbFldDes for VAL field*/
short indvalFlddes; /*ind in papFldDes*/
dbFldDes **papFldDes; /* ptr to array of ptr to fldDes*/
/*The following are only available on run time system*/
struct rset *prset;
int rec_size; /*record size in bytes */
ELLNODE node;
ELLLIST attributeList; /*LIST head of attributes*/
ELLLIST recList; /*LIST head of sorted dbRecordNodes*/
ELLLIST devList; /*List of associated device support*/
ELLLIST cdefList; /*LIST of Cdef text items*/
char *name;
short no_fields; /* number of fields defined */
short no_prompt; /* number of fields to configure*/
short no_links; /* number of links */
short no_aliases; /* number of aliases in recList */
short *link_ind; /* addr of array of ind in papFldDes*/
char **papsortFldName;/* ptr to array of ptr to fld names*/
short *sortFldInd; /* addr of array of ind in papFldDes*/
dbFldDes *pvalFldDes; /*pointer dbFldDes for VAL field*/
short indvalFlddes; /*ind in papFldDes*/
dbFldDes **papFldDes; /* ptr to array of ptr to fldDes*/
/*The following are only available on run time system*/
struct rset *prset;
int rec_size; /*record size in bytes */
}dbRecordType;
struct dbPvd; /* Contents private to dbPvdLib code */
+36 -14
View File
@@ -50,6 +50,9 @@ epicsExportAddress(int,dbBptNotMonotonic);
epicsShareDef int dbQuietMacroWarnings=0;
epicsExportAddress(int,dbQuietMacroWarnings);
epicsShareDef int dbRecordsAbcSorted=0;
epicsExportAddress(int,dbRecordsAbcSorted);
/*private routines */
static void yyerrorAbort(char *str);
static void allocTemp(void *pvoid);
@@ -194,7 +197,16 @@ static void freeInputFileList(void)
free((void *)pinputFileNow);
}
}
static
int cmp_dbRecordNode(const ELLNODE *lhs, const ELLNODE *rhs)
{
dbRecordNode *LHS = (dbRecordNode*)lhs,
*RHS = (dbRecordNode*)rhs;
return strcmp(LHS->recordname, RHS->recordname);
}
static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp,
const char *path,const char *substitutions)
{
@@ -239,24 +251,25 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp,
macSuppressWarning(macHandle,dbQuietMacroWarnings);
}
pinputFile = dbCalloc(1,sizeof(inputFile));
if(filename) {
pinputFile->filename = macEnvExpand(filename);
if (filename) {
pinputFile->filename = macEnvExpand(filename);
}
if(!fp) {
FILE *fp1;
if (!fp) {
FILE *fp1 = 0;
if(pinputFile->filename) pinputFile->path = dbOpenFile(pdbbase,pinputFile->filename,&fp1);
if(!pinputFile->filename || !fp1) {
errPrintf(0,__FILE__, __LINE__,
"dbRead opening file %s",pinputFile->filename);
free((void *)pinputFile->filename);
free((void *)pinputFile);
if (pinputFile->filename)
pinputFile->path = dbOpenFile(pdbbase, pinputFile->filename, &fp1);
if (!pinputFile->filename || !fp1) {
errPrintf(0, __FILE__, __LINE__,
"dbRead opening file %s",pinputFile->filename);
free(pinputFile->filename);
free(pinputFile);
status = -1;
goto cleanup;
}
pinputFile->fp = fp1;
}
pinputFile->fp = fp1;
} else {
pinputFile->fp = fp;
pinputFile->fp = fp;
}
pinputFile->line_num = 0;
pinputFileNow = pinputFile;
@@ -294,6 +307,15 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp,
dbFinishEntry(pdbEntry);
}
cleanup:
if(dbRecordsAbcSorted) {
ELLNODE *cur;
for(cur = ellFirst(&pdbbase->recordTypeList); cur; cur=ellNext(cur))
{
dbRecordType *rtype = CONTAINER(cur, dbRecordType, node);
ellSortStable(&rtype->recList, &cmp_dbRecordNode);
}
}
if(macHandle) macDeleteHandle(macHandle);
macHandle = NULL;
if(mac_input_buffer) free((void *)mac_input_buffer);
+3 -73
View File
@@ -1418,7 +1418,6 @@ long dbCreateRecord(DBENTRY *pdbentry,const char *precordName)
dbFldDes *pdbFldDes;
PVDENTRY *ppvd;
ELLLIST *preclist = NULL;
dbRecordNode *precnode = NULL;
dbRecordNode *pNewRecNode = NULL;
long status = 0;
@@ -1426,7 +1425,7 @@ long dbCreateRecord(DBENTRY *pdbentry,const char *precordName)
/*Get size of NAME field*/
pdbFldDes = precordType->papFldDes[0];
if(!pdbFldDes || (strcmp(pdbFldDes->name,"NAME")!=0))
return(S_dbLib_nameLength);
return(S_dbLib_nameLength);
if((int)strlen(precordName)>=pdbFldDes->size) return(S_dbLib_nameLength);
/* clear callers entry */
zeroDbentry(pdbentry);
@@ -1441,18 +1440,7 @@ long dbCreateRecord(DBENTRY *pdbentry,const char *precordName)
if((status = dbAllocRecord(pdbentry,precordName))) return(status);
pNewRecNode->recordname = dbRecordName(pdbentry);
ellInit(&pNewRecNode->infoList);
/* install record node in list in sorted postion */
status = dbFirstRecord(pdbentry);
while(status==0) {
if(strcmp(precordName,dbGetRecordName(pdbentry)) < 0) break;
status = dbNextRecord(pdbentry);
}
if(status==0) {
precnode = pdbentry->precnode;
ellInsert(preclist,ellPrevious(&precnode->node),&pNewRecNode->node);
} else {
ellAdd(preclist,&pNewRecNode->node);
}
ellAdd(preclist, &pNewRecNode->node);
pdbentry->precnode = pNewRecNode;
ppvd = dbPvdAdd(pdbentry->pdbbase,precordType,pNewRecNode);
if(!ppvd) {errMessage(-1,"Logic Err: Could not add to PVD");return(-1);}
@@ -1630,52 +1618,6 @@ char * dbGetRecordName(DBENTRY *pdbentry)
return precnode->recordname;
}
long dbRenameRecord(DBENTRY *pdbentry,const char *newName)
{
dbBase *pdbbase = pdbentry->pdbbase;
dbRecordType *precordType = pdbentry->precordType;
dbFldDes *pdbFldDes;
dbRecordNode *precnode = pdbentry->precnode;
PVDENTRY *ppvd;
ELLLIST *preclist;
dbRecordNode *plistnode;
long status;
DBENTRY dbentry;
if(!precordType) return(S_dbLib_recordTypeNotFound);
/*Get size of NAME field*/
pdbFldDes = precordType->papFldDes[0];
if(!pdbFldDes || (strcmp(pdbFldDes->name,"NAME")!=0))
return(S_dbLib_nameLength);
if((int)strlen(newName)>=pdbFldDes->size) return(S_dbLib_nameLength);
if (!precnode || dbIsAlias(pdbentry)) return S_dbLib_recNotFound;
dbInitEntry(pdbentry->pdbbase,&dbentry);
status = dbFindRecord(&dbentry,newName);
dbFinishEntry(&dbentry);
if(!status) return(S_dbLib_recExists);
dbPvdDelete(pdbbase,precnode);
pdbentry->pflddes = precordType->papFldDes[0];
if((status = dbGetFieldAddress(pdbentry))) return(status);
strcpy(pdbentry->pfield,newName);
ppvd = dbPvdAdd(pdbbase,precordType,precnode);
if(!ppvd) {errMessage(-1,"Logic Err: Could not add to PVD");return(-1);}
/*remove from record list and reinstall in sorted order*/
preclist = &precordType->recList;
ellDelete(preclist,&precnode->node);
plistnode = (dbRecordNode *)ellFirst(preclist);
while(plistnode) {
pdbentry->precnode = plistnode;
if(strcmp(newName,dbGetRecordName(pdbentry)) >=0) break;
plistnode = (dbRecordNode *)ellNext(&plistnode->node);
}
if(plistnode)
ellInsert(preclist,ellPrevious(&plistnode->node),&precnode->node);
else
ellAdd(preclist,&precnode->node);
/*Leave pdbentry pointing to newly renamed record*/
return(dbFindRecord(pdbentry,newName));
}
long dbVisibleRecord(DBENTRY *pdbentry)
{
dbRecordNode *precnode = pdbentry->precnode;
@@ -1709,7 +1651,6 @@ long dbCreateAlias(DBENTRY *pdbentry, const char *alias)
dbRecordNode *pnewnode;
PVDENTRY *ppvd;
ELLLIST *preclist = NULL;
long status;
if (!precordType) return S_dbLib_recordTypeNotFound;
if (!precnode) return S_dbLib_recNotFound;
@@ -1725,18 +1666,7 @@ long dbCreateAlias(DBENTRY *pdbentry, const char *alias)
if (!(precnode->flags & DBRN_FLAGS_ISALIAS))
precnode->flags |= DBRN_FLAGS_HASALIAS;
ellInit(&pnewnode->infoList);
/* install record node in list in sorted postion */
status = dbFirstRecord(pdbentry);
while (!status) {
if (strcmp(alias, dbGetRecordName(pdbentry)) < 0) break;
status = dbNextRecord(pdbentry);
}
if (!status) {
precnode = pdbentry->precnode;
ellInsert(preclist, ellPrevious(&precnode->node), &pnewnode->node);
} else {
ellAdd(preclist, &pnewnode->node);
}
ellAdd(preclist, &pnewnode->node);
precordType->no_aliases++;
pdbentry->precnode = pnewnode;
ppvd = dbPvdAdd(pdbentry->pdbbase, precordType, pnewnode);
-2
View File
@@ -146,8 +146,6 @@ epicsShareFunc long dbNextRecord(DBENTRY *pdbentry);
epicsShareFunc int dbGetNRecords(DBENTRY *pdbentry);
epicsShareFunc int dbGetNAliases(DBENTRY *pdbentry);
epicsShareFunc char * dbGetRecordName(DBENTRY *pdbentry);
epicsShareFunc long dbRenameRecord(DBENTRY *pdbentry,
const char *newName);
epicsShareFunc long dbCopyRecord(DBENTRY *pdbentry,
const char *newRecordName, int overWriteOK);
+1
View File
@@ -11,6 +11,7 @@ variable(asCaDebug,int)
# Static database access variables
variable(dbRecordsOnceOnly,int)
variable(dbRecordsAbcSorted,int)
variable(dbBptNotMonotonic,int)
variable(dbQuietMacroWarnings,int)
+12 -10
View File
@@ -26,6 +26,7 @@
#include "epicsEvent.h"
#include "epicsMutex.h"
#include "epicsStdio.h"
#include "epicsString.h"
#include "epicsThread.h"
#include "epicsTime.h"
#include "errlog.h"
@@ -663,7 +664,7 @@ static void read_reply ( void *pArg, struct dbChannel *dbch,
static int read_action ( caHdrLargeArray *mp, void *pPayloadIn, struct client *pClient )
{
struct channel_in_use *pciu = MPTOPCIU ( mp );
const int readAccess = asCheckGet ( pciu->asClientPVT );
int readAccess;
ca_uint32_t payloadSize;
void *pPayload;
int status;
@@ -675,6 +676,7 @@ static int read_action ( caHdrLargeArray *mp, void *pPayloadIn, struct client *p
logBadId ( pClient, mp, 0 );
return RSRV_ERROR;
}
readAccess = asCheckGet ( pciu->asClientPVT );
SEND_LOCK ( pClient );
@@ -748,7 +750,7 @@ static int read_action ( caHdrLargeArray *mp, void *pPayloadIn, struct client *p
*/
if ( mp->m_dataType == DBR_STRING && mp->m_count == 1 ) {
char * pStr = (char *) pPayload;
size_t strcnt = strlen ( pStr );
size_t strcnt = epicsStrnLen( pStr, payloadSize );
if ( strcnt < payloadSize ) {
payloadSize = ( ca_uint32_t ) ( strcnt + 1u );
}
@@ -883,7 +885,7 @@ static int write_action ( caHdrLargeArray *mp,
static int host_name_action ( caHdrLargeArray *mp, void *pPayload,
struct client *client )
{
size_t size;
ca_uint32_t size;
char *pName;
char *pMalloc;
int chanCount;
@@ -907,9 +909,9 @@ static int host_name_action ( caHdrLargeArray *mp, void *pPayload,
}
pName = (char *) pPayload;
size = strlen(pName)+1;
if (size > 512) {
log_header ( "bad (very long) host name",
size = epicsStrnLen(pName, mp->m_postsize)+1;
if (size > 512 || size > mp->m_postsize) {
log_header ( "bad (very long) host name",
client, mp, pPayload, 0 );
SEND_LOCK(client);
send_err(
@@ -962,7 +964,7 @@ static int host_name_action ( caHdrLargeArray *mp, void *pPayload,
static int client_name_action ( caHdrLargeArray *mp, void *pPayload,
struct client *client )
{
size_t size;
ca_uint32_t size;
char *pName;
char *pMalloc;
int chanCount;
@@ -986,9 +988,9 @@ static int client_name_action ( caHdrLargeArray *mp, void *pPayload,
}
pName = (char *) pPayload;
size = strlen(pName)+1;
if (size > 512) {
log_header ("a very long user name was specified",
size = epicsStrnLen(pName, mp->m_postsize)+1;
if (size > 512 || size > mp->m_postsize) {
log_header ("a very long user name was specified",
client, mp, pPayload, 0);
SEND_LOCK(client);
send_err(
+6 -5
View File
@@ -232,16 +232,17 @@ SOCKET* rsrv_grab_tcp(unsigned short *port)
ok = 0;
break;
}
/* if SOCK_EADDRINUSE then try again with a different port number.
* otherwise, fail hard
/* if SOCK_EADDRINUSE or SOCK_EACCES try again with a different
* port number, otherwise fail hard.
*/
if(errcode!=SOCK_EADDRINUSE) {
if (errcode != SOCK_EADDRINUSE &&
errcode != SOCK_EACCES) {
char name[40];
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
ipAddrToDottedIP(&scratch.ia, name, sizeof(name));
cantProceed( "CAS: Socket bind %s error was \"%s\"\n",
cantProceed( "CAS: Socket bind %s error was %s\n",
name, sockErrBuf );
}
ok = 0;
@@ -852,7 +853,7 @@ static void log_one_client (struct client *client, unsigned level)
printf(
"\tUnprocessed request bytes = %u, Undelivered response bytes = %u\n",
client->recv.cnt - client->recv.stk,
client->send.stk );
client->send.stk );
printf(
"\tState = %s%s%s\n",
state[client->disconnect?1:0],