void write_partition_map(partition_map_header *map) { MEDIA m; char *block; partition_map * entry; int i = 0; int result = 0; m = map->m; if (map->misc != NULL) { convert_block0(map->misc, 0); result = write_block(map, 0, (char *)map->misc); convert_block0(map->misc, 1); } else { block = (char *) calloc(1, PBLOCK_SIZE); if (block != NULL) { result = write_block(map, 0, block); free(block); } } if (result == 0) { error(errno, "Unable to write block zero"); } for (entry = map->disk_order; entry != NULL; entry = entry->next_on_disk) { convert_dpme(entry->data, 0); result = write_block(map, entry->disk_address, (char *)entry->data); convert_dpme(entry->data, 1); i = entry->disk_address; if (result == 0) { error(errno, "Unable to write block %d", i); } } #ifdef __linux__ // zap the block after the map (if possible) to get around a bug. if (map->maximum_in_map > 0 && i < map->maximum_in_map) { i += 1; block = (char *) malloc(PBLOCK_SIZE); if (block != NULL) { if (read_block(map, i, block)) { block[0] = 0; write_block(map, i, block); } free(block); } } #endif if (interactive) printf("The partition table has been altered!\n\n"); os_reload_media(map->m); }
int get_block_n(int n) { partition_map * entry; int rtn_value; if (the_map != NULL) { entry = find_entry_by_disk_address(n, the_map); if (entry != 0) { mb = entry->data; rtn_value = 1; } else { rtn_value = 0; } } else { if (read_media(the_media, ((long long) n) * g, PBLOCK_SIZE, (void *)buffer) == 0) { rtn_value = 0; } else { mb = (DPME *) buffer; convert_dpme(mb, 1); rtn_value = 1; } } return rtn_value; }
void write_partition_map(partition_map_header *map) { int fd; char *block; partition_map * entry; int i = 0; fd = map->fd->fd; if (map->misc != NULL) { convert_block0(map->misc, 0); write_block(map, 0, (char *)map->misc); convert_block0(map->misc, 1); } else { block = (char *) calloc(1, PBLOCK_SIZE); if (block != NULL) { write_block(map, 0, block); free(block); } } for (entry = map->disk_order; entry != NULL; entry = entry->next_on_disk) { convert_dpme(entry->data, 0); write_block(map, entry->disk_address, (char *)entry->data); convert_dpme(entry->data, 1); i = entry->disk_address; } #ifdef __linux__ // zap the block after the map (if possible) to get around a bug. if (map->maximum_in_map > 0 && i < map->maximum_in_map) { i += 1; block = (char *) malloc(PBLOCK_SIZE); if (block != NULL) { if (read_block(map, i, block, 1)) { block[0] = 0; write_block(map, i, block); } free(block); } } #endif /* __linux __ */ if (interactive) printf("The partition table has been altered!\n\n"); #ifdef __linux__ if (map->regular_file) { close_media(map->fd); } else { // printf("Calling ioctl() to re-read partition table.\n" // "(Reboot to ensure the partition table has been updated.)\n"); sync(); sleep(2); if ((i = ioctl(fd, BLKRRPART)) != 0) { saved_errno = errno; } else { // some kernel versions (1.2.x) seem to have trouble // rereading the partition table, but if asked to do it // twice, the second time works. - [email protected] */ sync(); sleep(2); if ((i = ioctl(fd, BLKRRPART)) != 0) { saved_errno = errno; } } close_media(map->fd); // printf("Syncing disks.\n"); sync(); sleep(4); /* for sync() */ if (i < 0) { error(saved_errno, "Re-read of partition table failed"); printf("Reboot your system to ensure the " "partition table is updated.\n"); } } #else close_media(map->fd); #endif map->fd = open_media(map->name, (map->writeable)?O_RDWR:O_RDONLY); if (map->fd == 0) { fatal(errno, "can't re-open file '%s' for %sing", map->name, (rflag)?"read":"writ"); } }
int read_partition_map(partition_map_header *map) { DPME *data; u32 limit; int index; int old_logical; double d; data = (DPME *) malloc(PBLOCK_SIZE); if (data == NULL) { error(errno, "can't allocate memory for disk buffers"); return -1; } if (read_block(map, 1, (char *)data, 0) == 0) { free(data); return -1; } else if (convert_dpme(data, 1) || data->dpme_signature != DPME_SIGNATURE) { old_logical = map->logical_block; map->logical_block = 512; while (map->logical_block <= map->physical_block) { if (read_block(map, 1, (char *)data, 0) == 0) { free(data); return -1; } else if (convert_dpme(data, 1) == 0 && data->dpme_signature == DPME_SIGNATURE) { d = map->media_size; map->media_size = (d * old_logical) / map->logical_block; break; } map->logical_block *= 2; } if (map->logical_block > map->physical_block) { free(data); return -1; } } limit = data->dpme_map_entries; index = 1; while (1) { if (add_data_to_map(data, index, map) == 0) { free(data); return -1; } if (index >= limit) { break; } else { index++; } data = (DPME *) malloc(PBLOCK_SIZE); if (data == NULL) { error(errno, "can't allocate memory for disk buffers"); return -1; } if (read_block(map, index, (char *)data, 0) == 0) { free(data); return -1; } else if (convert_dpme(data, 1) || data->dpme_signature != DPME_SIGNATURE || data->dpme_map_entries != limit) { free(data); return -1; } } return 0; }
int read_partition_map(partition_map_header *map) { DPME *data; u32 limit; unsigned int ix; int old_logical; double d; //printf("called read_partition_map\n"); //printf("logical = %d, physical = %d\n", map->logical_block, map->physical_block); data = (DPME *) malloc(PBLOCK_SIZE); if (data == NULL) { error(errno, "can't allocate memory for disk buffers"); return -1; } if (read_block(map, 1, (char *)data) == 0) { error(-1, "Can't read block 1 from '%s'", map->name); free(data); return -1; } else if (convert_dpme(data, 1) || data->dpme_signature != DPME_SIGNATURE) { old_logical = map->logical_block; map->logical_block = 512; while (map->logical_block <= map->physical_block) { if (read_block(map, 1, (char *)data) == 0) { error(-1, "Can't read block 1 from '%s'", map->name); free(data); return -1; } else if (convert_dpme(data, 1) == 0 && data->dpme_signature == DPME_SIGNATURE) { d = map->media_size; map->media_size = (d * old_logical) / map->logical_block; break; } map->logical_block *= 2; } if (map->logical_block > map->physical_block) { error(-1, "No valid block 1 on '%s'", map->name); free(data); return -1; } } //printf("logical = %d, physical = %d\n", map->logical_block, map->physical_block); limit = data->dpme_map_entries; ix = 1; while (1) { if (add_data_to_map(data, ix, map) == 0) { free(data); return -1; } if (ix >= limit) { break; } else { ix++; } data = (DPME *) malloc(PBLOCK_SIZE); if (data == NULL) { error(errno, "can't allocate memory for disk buffers"); return -1; } if (read_block(map, ix, (char *)data) == 0) { error(-1, "Can't read block %u from '%s'", ix, map->name); free(data); return -1; } else if (convert_dpme(data, 1) || (data->dpme_signature != DPME_SIGNATURE && dflag == 0) || (data->dpme_map_entries != limit && dflag == 0)) { error(-1, "Bad data in block %u from '%s'", ix, map->name); free(data); return -1; } } return 0; }