diff --git a/src/ioc/db/dbAccess.c b/src/ioc/db/dbAccess.c index 4ee2d677d..0b893eeb9 100644 --- a/src/ioc/db/dbAccess.c +++ b/src/ioc/db/dbAccess.c @@ -730,9 +730,18 @@ int dbLoadDatabase(const char *file, const char *path, const char *subs) int dbLoadRecords(const char* file, const char* subs) { int status = dbReadDatabase(&pdbbase, file, 0, subs); - - if (!status && dbLoadRecordsHook) - dbLoadRecordsHook(file, subs); + switch(status) + { + case 0: + if(dbLoadRecordsHook) + dbLoadRecordsHook(file, subs); + break; + case -2: + errlogPrintf("dbLoadRecords: failed to load %s - cannot load records after running iocBuild!\n", file); + break; + default: + errlogPrintf("dbLoadRecords: failed to load %s\n", file); + } return status; } diff --git a/src/ioc/dbStatic/dbLexRoutines.c b/src/ioc/dbStatic/dbLexRoutines.c index 3df3c7f3a..2be7b0d0c 100644 --- a/src/ioc/dbStatic/dbLexRoutines.c +++ b/src/ioc/dbStatic/dbLexRoutines.c @@ -35,6 +35,7 @@ #include "epicsExport.h" #include "link.h" #include "special.h" +#include "iocInit.h" @@ -215,6 +216,9 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, char *penv; char **macPairs; + if(getIocState() != iocVirgin) + return -2; + if(*ppdbbase == 0) *ppdbbase = dbAllocBase(); pdbbase = *ppdbbase; if(path && strlen(path)>0) { diff --git a/src/ioc/misc/iocInit.c b/src/ioc/misc/iocInit.c index a45770d9e..93d8908a8 100644 --- a/src/ioc/misc/iocInit.c +++ b/src/ioc/misc/iocInit.c @@ -70,9 +70,7 @@ #include "registryRecordType.h" #include "rsrv.h" -static enum { - iocVirgin, iocBuilding, iocBuilt, iocRunning, iocPaused, iocStopped -} iocState = iocVirgin; +static enum iocStateEnum iocState = iocVirgin; static enum { buildRSRV, buildIsolated } iocBuildMode; @@ -91,6 +89,11 @@ static void exitDatabase(void *dummy); int dbThreadRealtimeLock = 1; epicsExportAddress(int, dbThreadRealtimeLock); +enum iocStateEnum getIocState(void) +{ + return iocState; +} + /* * Initialize EPICS on the IOC. */ diff --git a/src/ioc/misc/iocInit.h b/src/ioc/misc/iocInit.h index 24ae45e06..3e711d6c5 100644 --- a/src/ioc/misc/iocInit.h +++ b/src/ioc/misc/iocInit.h @@ -13,10 +13,15 @@ #include "shareLib.h" +enum iocStateEnum { + iocVirgin, iocBuilding, iocBuilt, iocRunning, iocPaused, iocStopped +}; + #ifdef __cplusplus extern "C" { #endif +epicsShareFunc enum iocStateEnum getIocState(void); epicsShareFunc int iocInit(void); epicsShareFunc int iocBuild(void); epicsShareFunc int iocBuildIsolated(void); diff --git a/src/ioc/rsrv/caservertask.c b/src/ioc/rsrv/caservertask.c index 80310a422..24fa5859f 100644 --- a/src/ioc/rsrv/caservertask.c +++ b/src/ioc/rsrv/caservertask.c @@ -66,17 +66,6 @@ static void req_server (void *pParm) IOC_sock = conf->tcp; - /* listen and accept new connections */ - if ( listen ( IOC_sock, 20 ) < 0 ) { - char sockErrBuf[64]; - epicsSocketConvertErrnoToString ( - sockErrBuf, sizeof ( sockErrBuf ) ); - errlogPrintf ( "CAS: Listen error: %s\n", - sockErrBuf ); - epicsSocketDestroy (IOC_sock); - epicsThreadSuspendSelf (); - } - epicsEventSignal(castcp_startStopEvent); while (TRUE) { @@ -194,7 +183,7 @@ SOCKET* rsrv_grab_tcp(unsigned short *port) epicsSocketEnableAddressReuseDuringTimeWaitState ( tcpsock ); - if(bind(tcpsock, &scratch.sa, sizeof(scratch))==0) { + if(bind(tcpsock, &scratch.sa, sizeof(scratch))==0 && listen(tcpsock, 20)==0) { if(scratch.ia.sin_port==0) { /* use first socket to pick a random port */ osiSocklen_t alen = sizeof(ifaceAddr); diff --git a/src/std/rec/eventRecord.c b/src/std/rec/eventRecord.c index a135a3a37..2ba4859a5 100644 --- a/src/std/rec/eventRecord.c +++ b/src/std/rec/eventRecord.c @@ -106,10 +106,11 @@ static long init_record(eventRecord *prec, int pass) recGblInitConstantLink(&prec->siol,DBF_STRING,&prec->sval); } - prec->epvt = eventNameToHandle(prec->val); - if( (pdset=(struct eventdset *)(prec->dset)) && (pdset->init_record) ) status=(*pdset->init_record)(prec); + + prec->epvt = eventNameToHandle(prec->val); + return(status); }