void fw_cfg_add_file_callback(FWCfgState *s, const char *filename, FWCfgReadCallback callback, void *callback_opaque, void *data, size_t len) { int i, index; size_t dsize; if (!s->files) { dsize = sizeof(uint32_t) + sizeof(FWCfgFile) * FW_CFG_FILE_SLOTS; s->files = g_malloc0(dsize); fw_cfg_add_bytes(s, FW_CFG_FILE_DIR, s->files, dsize); } index = be32_to_cpu(s->files->count); assert(index < FW_CFG_FILE_SLOTS); fw_cfg_add_bytes_read_callback(s, FW_CFG_FILE_FIRST + index, callback, callback_opaque, data, len); pstrcpy(s->files->f[index].name, sizeof(s->files->f[index].name), filename); for (i = 0; i < index; i++) { if (strcmp(s->files->f[index].name, s->files->f[i].name) == 0) { trace_fw_cfg_add_file_dupe(s, s->files->f[index].name); return; } } s->files->f[index].size = cpu_to_be32(len); s->files->f[index].select = cpu_to_be16(FW_CFG_FILE_FIRST + index); trace_fw_cfg_add_file(s, index, s->files->f[index].name, len); s->files->count = cpu_to_be32(index+1); }
int fw_cfg_add_file_callback(fw_cfg_state_t *s, const char *filename, FWCfgReadCallback callback, void *callback_opaque, void *data, size_t len) { int i, index; size_t dsize; if (!s->files) { dsize = sizeof(u32) + sizeof(fw_cfg_file_t) * FW_CFG_FILE_SLOTS; s->files = vmm_zalloc(dsize); fw_cfg_add_bytes(s, FW_CFG_FILE_DIR, s->files, dsize); } index = vmm_be32_to_cpu(s->files->count); if (index >= FW_CFG_FILE_SLOTS) return VMM_EFAIL; fw_cfg_add_bytes_read_callback(s, FW_CFG_FILE_FIRST + index, callback, callback_opaque, data, len); strcpy(s->files->f[index].name, filename); for (i = 0; i < index; i++) { if (strcmp(s->files->f[index].name, s->files->f[i].name) == 0) { vmm_printf("%s: Duplicate entry\n", __func__); return VMM_OK; } } s->files->f[index].size = vmm_cpu_to_be32(len); s->files->f[index].select = vmm_cpu_to_be16(FW_CFG_FILE_FIRST + index); s->files->count = vmm_cpu_to_be32(index+1); return VMM_OK; }
int fw_cfg_add_bytes(fw_cfg_state_t *s, u16 key, void *data, size_t len) { return fw_cfg_add_bytes_read_callback(s, key, NULL, NULL, data, len); }
void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len) { fw_cfg_add_bytes_read_callback(s, key, NULL, NULL, data, len); }