QByteArray ElfReader::readCoreName(bool *isCore) { *isCore = false; readIt(); ElfMapper mapper(this); if (!mapper.map()) return QByteArray(); if (m_elfData.elftype != Elf_ET_CORE) return QByteArray(); *isCore = true; for (int i = 0, n = m_elfData.sectionHeaders.size(); i != n; ++i) if (m_elfData.sectionHeaders.at(i).type == Elf_SHT_NOTE) { const ElfSectionHeader &header = m_elfData.sectionHeaders.at(i); return cutout(mapper.start + header.offset + 0x40); } for (int i = 0, n = m_elfData.programHeaders.size(); i != n; ++i) if (m_elfData.programHeaders.at(i).type == Elf_PT_NOTE) { const ElfProgramHeader &header = m_elfData.programHeaders.at(i); return cutout(mapper.start + header.offset + 0xec); } return QByteArray(); }
QByteArray ElfReader::readSection(const QByteArray &name) { readIt(); int i = m_elfData.indexOf(name); if (i == -1) return QByteArray(); ElfMapper mapper(this); if (!mapper.map()) return QByteArray(); const ElfSectionHeader §ion = m_elfData.sectionHeaders.at(i); return QByteArray(mapper.start + section.offset, section.size); }
static asynStatus readOnce(const char *port, int addr, char *buffer, size_t buffer_len, double timeout, size_t *nbytesTransfered,int *eomReason,const char *drvInfo) { asynStatus status; asynUser *pasynUser; status = connect(port,addr,&pasynUser,drvInfo); if(status!=asynSuccess) { asynPrint(pasynUser, ASYN_TRACE_ERROR, "asynOctetSyncIO connect failed %s\n",pasynUser->errorMessage); disconnect(pasynUser); return status; } status = readIt(pasynUser,buffer,buffer_len, timeout,nbytesTransfered,eomReason); if(status!=asynSuccess) { asynPrint(pasynUser, ASYN_TRACE_ERROR, "asynOctetSyncIO read failed %s\n",pasynUser->errorMessage); } disconnect(pasynUser); return status; }
ElfData ElfReader::readHeaders() { readIt(); return m_elfData; }
static void callbackSiWriteRead(asynUser *pasynUser) { devPvt *pdevPvt = (devPvt *)pasynUser->userPvt; stringinRecord *precord = (stringinRecord *)pdevPvt->precord; asynStatus status; size_t nBytesRead; long dbStatus; char raw[MAX_STRING_SIZE]; char translate[MAX_STRING_SIZE]; size_t len = sizeof(precord->val); status = pasynManager->unblockProcessCallback(pasynUser,pdevPvt->blockAll); if(status!=asynSuccess) { asynPrint(pasynUser,ASYN_TRACE_ERROR, "%s pasynManager:unblockProcessCallback failed %s\n", precord->name,pasynUser->errorMessage); recGblSetSevr(precord,READ_ALARM,INVALID_ALARM); goto done; } switch(pdevPvt->state) { case stateIdle: dbStatus = dbGet(&pdevPvt->dbAddr,DBR_STRING,raw,0,0,0); if(dbStatus) { asynPrint(pasynUser,ASYN_TRACE_ERROR, "%s dbGet failed\n",precord->name); recGblSetSevr(precord,READ_ALARM,INVALID_ALARM); goto done; } dbTranslateEscape(translate,raw); status = writeIt(pasynUser,translate,strlen(translate)); if(status!=asynSuccess) { asynPrint(pasynUser,ASYN_TRACE_ERROR, "%s asynOctet:write failed %s\n", precord->name,pasynUser->errorMessage); recGblSetSevr(precord,READ_ALARM,INVALID_ALARM); goto done; } pdevPvt->state = stateWrite; status = queueIt(pdevPvt); if(status!=asynSuccess) goto done; return; case stateWrite: status = readIt(pasynUser,precord->val,len,&nBytesRead); if(status!=asynSuccess) { asynPrint(pasynUser,ASYN_TRACE_ERROR, "%s asynOctet:write failed %s\n", precord->name,pasynUser->errorMessage); recGblSetSevr(precord,READ_ALARM,INVALID_ALARM); goto done; } if(status==asynSuccess) { if(nBytesRead==len) nBytesRead--; precord->val[nBytesRead] = 0; } pdevPvt->state = stateIdle; break; /*all done*/ } done: pdevPvt->state = stateIdle; callbackRequestProcessCallback( &pdevPvt->processCallback,precord->prio,precord); }