From 30268e35774775f29738b4391028bb07366fb280 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Sun, 4 Nov 2018 11:43:38 -0800 Subject: [PATCH] ioc/db: dbRegisterServer() only warn on actual redefinition avoid noise when simply run twice. --- modules/database/src/ioc/db/dbServer.c | 14 ++++++++++---- modules/database/test/ioc/db/dbServerTest.c | 10 ++++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/modules/database/src/ioc/db/dbServer.c b/modules/database/src/ioc/db/dbServer.c index 5374f02ad..ec89f4fec 100644 --- a/modules/database/src/ioc/db/dbServer.c +++ b/modules/database/src/ioc/db/dbServer.c @@ -12,6 +12,7 @@ #include #include +#include "dbDefs.h" #include "ellLib.h" #include "envDefs.h" #include "epicsStdio.h" @@ -29,6 +30,7 @@ static char *stateNames[] = { int dbRegisterServer(dbServer *psrv) { const char * ignore = envGetConfigParamPtr(&EPICS_IOC_IGNORE_SERVERS); + ELLNODE *node; if (!psrv || !psrv->name || state != registering) return -1; @@ -55,10 +57,14 @@ int dbRegisterServer(dbServer *psrv) } } - if (ellNext(&psrv->node) || ellLast(&serverList) == &psrv->node) { - fprintf(stderr, "dbRegisterServer: '%s' registered twice?\n", - psrv->name); - return -1; + for(node=ellFirst(&serverList); node; node = ellNext(node)) { + dbServer *cur = CONTAINER(node, dbServer, node); + if(cur==psrv) { + return 0; /* already registered identically. */ + } else if(strcmp(cur->name, psrv->name)==0) { + fprintf(stderr, "dbRegisterServer: Can't redefine '%s'.\n", cur->name); + return -1; + } } ellAdd(&serverList, &psrv->node); diff --git a/modules/database/test/ioc/db/dbServerTest.c b/modules/database/test/ioc/db/dbServerTest.c index f0d5bf6ac..ddb22339f 100644 --- a/modules/database/test/ioc/db/dbServerTest.c +++ b/modules/database/test/ioc/db/dbServerTest.c @@ -79,6 +79,11 @@ dbServer one = { oneInit, oneRun, onePause, oneStop }; +dbServer one2 = { + ELLNODE_INIT, "one", + oneReport, oneStats, oneClient, + oneInit, oneRun, onePause, oneStop +}; /* Server layer for testing NULL methods */ @@ -123,7 +128,7 @@ MAIN(dbServerTest) char *theName = "The One"; int status; - testPlan(24); + testPlan(25); /* Prove that we handle substring names properly */ epicsEnvSet("EPICS_IOC_IGNORE_SERVERS", "none ones"); @@ -132,7 +137,8 @@ MAIN(dbServerTest) testOk(dbRegisterServer(&one) == 0, "Registered 'one'"); testOk1(oneState == NOTHING_CALLED); - testOk(dbRegisterServer(&one) != 0, "Duplicate registration rejected"); + testOk(dbRegisterServer(&one) == 0, "Duplicate registration accepted"); + testOk(dbRegisterServer(&one2) != 0, "change registration rejected"); testOk(dbRegisterServer(&illegal) != 0, "Illegal registration rejected"); testDiag("Registering dbServer 'no-routines'");