From 8597ae087b2fd2fe59156a247710d93bdb716750 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 5 Mar 2009 21:23:22 +0000 Subject: [PATCH] Allow getting a DBF_*LINK field using a DBR_CHAR array (put already done). Fetch options before SPC_ATTRIBUTE str; allow a DBR_CHAR array there too. --- src/db/dbAccess.c | 59 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/src/db/dbAccess.c b/src/db/dbAccess.c index 11499b678..550cd020f 100644 --- a/src/db/dbAccess.c +++ b/src/db/dbAccess.c @@ -922,8 +922,21 @@ long epicsShareAPI dbGetField(DBADDR *paddr,short dbrType, dbFldDes *pfldDes = paddr->pfldDes; char *rtnString; char *pbuf = (char *)pbuffer; + int maxlen; - if(dbrType!=DBR_STRING) { + switch (dbrType) { + case DBR_STRING: + maxlen = MAX_STRING_SIZE - 1; + break; + + case DBR_CHAR: + case DBR_UCHAR: + if (nRequest && *nRequest > 1) { + maxlen = *nRequest - 1; + break; + } + /* else fall through ... */ + default: status = S_db_badDbrtype; goto done; } @@ -936,14 +949,8 @@ long epicsShareAPI dbGetField(DBADDR *paddr,short dbrType, if (!status) status = dbFindField(&dbEntry, pfldDes->name); if (!status) { rtnString = dbGetString(&dbEntry); - /*begin kludge for old db_access MAX_STRING_SIZE*/ - if (strlen(rtnString) >= MAX_STRING_SIZE) { - strncpy(pbuf, rtnString, MAX_STRING_SIZE-1); - pbuf[MAX_STRING_SIZE-1] = 0; - } else { - strcpy(pbuf, rtnString); - } - /*end kludge for old db_access MAX_STRING_SIZE*/ + strncpy(pbuf, rtnString, maxlen - 1); + pbuf[maxlen - 1] = 0; } dbFinishEntry(&dbEntry); } else { @@ -964,13 +971,6 @@ long epicsShareAPI dbGet(DBADDR *paddr, short dbrType, struct rset *prset; long status = 0; - if (paddr->special == SPC_ATTRIBUTE) { - if (dbrType != DBR_STRING) return S_db_badDbrtype; - if (!paddr->pfield) return S_db_badField; - strcpy((char *)pbuffer, (char *)paddr->pfield); - return 0; - } - if (options && *options) { char *pbuf = pbuffer; @@ -979,6 +979,33 @@ long epicsShareAPI dbGet(DBADDR *paddr, short dbrType, } if (nRequest && *nRequest == 0) return 0; + if (paddr->special == SPC_ATTRIBUTE) { + char *pbuf = pbuffer; + int maxlen; + + if (!paddr->pfield) return S_db_badField; + + switch (dbrType) { + case DBR_STRING: + maxlen = MAX_STRING_SIZE - 1; + break; + + case DBR_CHAR: + case DBR_UCHAR: + if (nRequest && *nRequest > 1) { + maxlen = *nRequest - 1; + break; + } + /* else fall through ... */ + default: + return S_db_badDbrtype; + } + + strncpy(pbuf, (char *)paddr->pfield, maxlen - 1); + pbuf[maxlen - 1] = 0; + return 0; + } + /* Check for valid request */ if (INVALID_DB_REQ(dbrType) || field_type > DBF_DEVICE) { char message[80];