From 47b3c68af1f72762e7bab618f3bb93952e445e8d Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 23 Mar 2016 20:46:48 -0400 Subject: [PATCH] dbLink: dbAddLinkHook hack Add a hook for outside code the hijack CA_LINKs --- src/ioc/db/dbLink.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/ioc/db/dbLink.c b/src/ioc/db/dbLink.c index a224eac0f..d543c106f 100644 --- a/src/ioc/db/dbLink.c +++ b/src/ioc/db/dbLink.c @@ -444,6 +444,8 @@ static lset dbDb_lset = { /***************************** Generic Link API *****************************/ +void (*dbAddLinkHook)(struct link *link, short dbfType); + void dbInitLink(struct link *plink, short dbfType) { struct dbCommon *precord = plink->precord; @@ -469,7 +471,17 @@ void dbInitLink(struct link *plink, short dbfType) if (dbfType == DBF_INLINK) plink->value.pv_link.pvlMask |= pvlOptInpNative; - dbCaAddLink(NULL, plink, dbfType); + plink->lset = NULL; + if(dbAddLinkHook) + (*dbAddLinkHook)(plink, dbfType); + if((plink->lset==NULL) ^ (plink->type==PV_LINK)) { + errlogPrintf("custom link types must set both type and lset.\n"); + plink->lset = NULL; + plink->type = PV_LINK; + plink->value.pv_link.pvt = NULL; // leaking + } + if(!plink->lset) + dbCaAddLink(NULL, plink, dbfType); if (dbfType == DBF_FWDLINK) { char *pperiod = strrchr(plink->value.pv_link.pvname, '.'); @@ -508,7 +520,11 @@ void dbAddLink(dbLocker *locker, struct link *plink, short dbfType, DBADDR *ptar if (dbfType == DBF_INLINK) plink->value.pv_link.pvlMask |= pvlOptInpNative; - dbCaAddLink(locker, plink, dbfType); + plink->lset = NULL; + if(dbAddLinkHook) + (*dbAddLinkHook)(plink, dbfType); + if(!plink->lset) + dbCaAddLink(locker, plink, dbfType); if (dbfType == DBF_FWDLINK) { char *pperiod = strrchr(plink->value.pv_link.pvname, '.');