diff --git a/pdbApp/pdbsingle.cpp b/pdbApp/pdbsingle.cpp index de138b2..b098cb1 100644 --- a/pdbApp/pdbsingle.cpp +++ b/pdbApp/pdbsingle.cpp @@ -400,7 +400,7 @@ void PDBSinglePut::put(pvd::PVStructure::shared_pointer const & value, p2p::auto_ptr putpvif(channel->pv->builder->attach(channel->pv->chan, value, FieldName())); try{ DBScanLocker L(chan); - putpvif->get(*changed, doProc); + ret = putpvif->get(*changed, doProc); }catch(std::runtime_error& e){ ret = pvd::Status::error(e.what()); diff --git a/pdbApp/pvif.cpp b/pdbApp/pvif.cpp index 5a705f3..2cc9fca 100644 --- a/pdbApp/pvif.cpp +++ b/pdbApp/pvif.cpp @@ -641,6 +641,14 @@ void findFormat(pvTimeAlarm& pvmeta, pdbRecordIterator& info, const epics::pvDat } } +pvd::Status checkDISP(dbChannel *chan) +{ + dbCommon *prec = dbChannelRecord(chan); + pvd::Status ret; + if(prec->disp && dbChannelField(chan)!=&prec->disp) + ret = pvd::Status::error("Put Disabled"); + return ret; +} template struct PVIFScalarNumeric : public PVIF @@ -698,7 +706,10 @@ struct PVIFScalarNumeric : public PVIF virtual pvd::Status get(const epics::pvData::BitSet& mask, proc_t proc, bool permit) OVERRIDE FINAL { - pvd::Status ret; + pvd::Status ret = checkDISP(chan); + if(!ret) + return ret; + bool newval = mask.logical_and(pvmeta.maskVALUEPut); if(newval) { if(permit) @@ -906,7 +917,10 @@ struct PVIFPlain : public PVIF virtual pvd::Status get(const epics::pvData::BitSet& mask, proc_t proc, bool permit) OVERRIDE FINAL { - pvd::Status ret; + pvd::Status ret = checkDISP(chan); + if(!ret) + return ret; + bool newval = mask.get(fieldOffset); if(newval) { if(permit)