| 1378 | } |
| 1379 | |
| 1380 | static void create_subpart(struct buffer *dst, struct buffer *info[], |
| 1381 | size_t count, const char *name) |
| 1382 | { |
| 1383 | struct buffer subpart_dir_buff; |
| 1384 | size_t size = SUBPART_DIR_HEADER_SIZE + count * SUBPART_DIR_ENTRY_SIZE; |
| 1385 | |
| 1386 | alloc_buffer(&subpart_dir_buff, size, "subpart-dir"); |
| 1387 | |
| 1388 | struct subpart_dir_header *h = buffer_get(&subpart_dir_buff); |
| 1389 | struct subpart_dir_entry *e = (struct subpart_dir_entry *)(h + 1); |
| 1390 | |
| 1391 | init_subpart_dir_header(h, count, name); |
| 1392 | |
| 1393 | size_t curr_offset = size; |
| 1394 | size_t i; |
| 1395 | |
| 1396 | for (i = 0; i < count; i++) { |
| 1397 | curr_offset = init_subpart_dir_entry(&e[i], info[i], |
| 1398 | curr_offset); |
| 1399 | } |
| 1400 | |
| 1401 | alloc_buffer(dst, curr_offset, name); |
| 1402 | uint8_t *data = buffer_get(dst); |
| 1403 | |
| 1404 | for (i = 0; i < count; i++) { |
| 1405 | memcpy(data + e[i].offset, buffer_get(info[i]), |
| 1406 | buffer_size(info[i])); |
| 1407 | } |
| 1408 | |
| 1409 | h->checksum = calc_checksum(buffer_get(&subpart_dir_buff)); |
| 1410 | |
| 1411 | struct subpart_dir *dir = buffer_get(&subpart_dir_buff); |
| 1412 | |
| 1413 | print_subpart_dir(dir); |
| 1414 | |
| 1415 | subpart_dir_fixup_write_buffer(&subpart_dir_buff); |
| 1416 | memcpy(data, dir, buffer_size(&subpart_dir_buff)); |
| 1417 | |
| 1418 | buffer_delete(&subpart_dir_buff); |
| 1419 | } |
| 1420 | |
| 1421 | static enum ifwi_ret ibbp_dir_add(int type) |
| 1422 | { |
no test coverage detected