示例#1
0
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();
}
示例#2
0
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 &section = m_elfData.sectionHeaders.at(i);
    return QByteArray(mapper.start + section.offset, section.size);
}
示例#3
0
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;
}
示例#4
0
ElfData ElfReader::readHeaders()
{
    readIt();
    return m_elfData;
}
示例#5
0
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);
}