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); }
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); }
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); }
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); }
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); }
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(§ion, 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; }