示例#1
0
int dico_add_u64(cdico *d, u8 section, u16 key, u64 data)
{
    u64 ledata;
    assert (d);
    ledata=cpu_to_le64(data);
    return dico_add_generic(d, section, key, &ledata, sizeof(ledata), DICTYPE_U64);
}
示例#2
0
int dico_add_u32(cdico *d, u8 section, u16 key, u32 data)
{
    u32 ledata;
    assert(d);
    ledata=cpu_to_le32(data);
    return dico_add_generic(d, section, key, &ledata, sizeof(ledata), DICTYPE_U32);
}
示例#3
0
int dico_add_u16(cdico *d, u8 section, u16 key, u16 data)
{
    u16 ledata;
    assert(d);
    ledata=cpu_to_le16(data);
    return dico_add_generic(d, section, key, &ledata, sizeof(ledata), DICTYPE_U16);
}
示例#4
0
int dico_add_string(cdico *d, u8 section, u16 key, const char *szstring)
{
    u16 len;
    assert(d);
    assert(szstring);
    len=strlen(szstring);
    return dico_add_generic(d, section, key, szstring, len+1, DICTYPE_STRING);
}
示例#5
0
int dico_add_data(cdico *d, u8 section, u16 key, const void *data, u16 size)
{
    return dico_add_generic(d, section, key, data, size, DICTYPE_DATA);
}
示例#6
0
int archreader_read_dico(carchreader *ai, cdico *d)
{
    u16 size;
    u32 headerlen;
    u32 origsum;
    u32 newsum;
    u8 *buffer;
    u8 *bufpos;
    u16 temp16;
    u32 temp32;
    u8 section;
    u16 count;
    u8 type;
    u16 key;
    int i;
    
    assert(ai);
    assert(d);
    
    // header-len, header-data, header-checksum
    switch (ai->filefmtver)
    {
        case 1:
            if (archreader_read_data(ai, &temp16, sizeof(temp16))!=0)
            {   errprintf("imgdisk_read_data() failed\n");
                return OLDERR_FATAL;
            }
            headerlen=le16_to_cpu(temp16);
            break;
        case 2:
            if (archreader_read_data(ai, &temp32, sizeof(temp32))!=0)
            {   errprintf("imgdisk_read_data() failed\n");
                return OLDERR_FATAL;
            }
            headerlen=le32_to_cpu(temp32);
            break;
        default:
            errprintf("Fatal error: invalid file format version: ai->filefmtver=%d\n", ai->filefmtver);
            return OLDERR_FATAL;
    }
    
    bufpos=buffer=malloc(headerlen);
    if (!buffer)
    {   errprintf("cannot allocate memory for header\n");
        return FSAERR_ENOMEM;
    }
    
    if (archreader_read_data(ai, buffer, headerlen)!=0)
    {   errprintf("cannot read header data\n");
        free(buffer);
        return OLDERR_FATAL;
    }
    
    if (archreader_read_data(ai, &temp32, sizeof(temp32))!=0)
    {   errprintf("cannot read header checksum\n");
        free(buffer);
        return OLDERR_FATAL;
    }
    origsum=le32_to_cpu(temp32);
    
    // check header-data integrity using checksum    
    newsum=fletcher32(buffer, headerlen);
    
    if (newsum!=origsum)
    {   errprintf("bad checksum for header\n");
        free(buffer);
        return OLDERR_MINOR; // header corrupt --> skip file
    }
    
    // read count from buffer
    memcpy(&temp16, bufpos, sizeof(temp16));
    bufpos+=sizeof(temp16);
    count=le16_to_cpu(temp16);
    
    // read items
    for (i=0; i < count; i++)
    {
        // a. read type from buffer
        memcpy(&type, bufpos, sizeof(type));
        bufpos+=sizeof(section);
        
        // b. read section from buffer
        memcpy(&section, bufpos, sizeof(section));
        bufpos+=sizeof(section);
        
        // c. read key from buffer
        memcpy(&temp16, bufpos, sizeof(temp16));
        bufpos+=sizeof(temp16);
        key=le16_to_cpu(temp16);
        
        // d. read sizeof(data)
        memcpy(&temp16, bufpos, sizeof(temp16));
        bufpos+=sizeof(temp16);
        size=le16_to_cpu(temp16);
        
        // e. add item to dico
        if (dico_add_generic(d, section, key, bufpos, size, type)!=0)
            return OLDERR_FATAL;
        bufpos+=size;
    }
    
    free(buffer);
    return FSAERR_SUCCESS;
}