void do_delete_partition(partition_map_header *map) { partition_map * cur; long ix; if (map == NULL) { bad_input("No partition map exists"); return; } if (!rflag && map->writable == 0) { printf("The map is not writable.\n"); } if (get_number_argument("Partition number: ", &ix, kDefault) == 0) { bad_input("Bad partition number"); return; } // find partition and delete it cur = find_entry_by_disk_address(ix, map); if (cur == NULL) { printf("No such partition\n"); } else { delete_partition_from_map(cur); } }
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 do_rename_partition(partition_map_header *map) { partition_map * entry; long ix; char *name; if (map == NULL) { bad_input("No partition map exists"); return; } if (!rflag && map->writable == 0) { printf("The map is not writable.\n"); } if (get_number_argument("Partition number: ", &ix, kDefault) == 0) { bad_input("Bad partition number"); return; } if (get_string_argument("New name of partition: ", &name, 1) == 0) { bad_input("Bad name"); return; } // find partition and change it entry = find_entry_by_disk_address(ix, map); if (entry == NULL) { printf("No such partition\n"); } else { // stuff name into partition map entry data strncpy(entry->data->dpme_name, name, DPISTRLEN); map->changed = 1; } free(name); return; }
int get_size_argument(long *number, partition_map_header *map) { partition_map * entry; int result = 0; unsigned long multiple; if (get_number_argument("Length in blocks: ", number, kDefault) == 0) { bad_input("Bad length"); } else { multiple = get_multiplier(map->logical_block); if (multiple == 0) { bad_input("Bad multiplier"); } else if (multiple != 1) { *number *= multiple; result = 1; } else if (get_partition_modifier()) { entry = find_entry_by_disk_address(*number, map); if (entry == NULL) { bad_input("Bad partition number"); } else { *number = entry->data->dpme_pblocks; result = 1; } } else { result = 1; } } return result; }
void full_dump_partition_entry(partition_map_header *map, int ix) { partition_map * cur; DPME *p; int i; uint32_t t; cur = find_entry_by_disk_address(ix, map); if (cur == NULL) { printf("No such partition\n"); return; } p = cur->data; printf(" signature: 0x%x\n", p->dpme_signature); printf(" reserved1: 0x%x\n", p->dpme_reserved_1); printf(" number of map entries: %"PRId32"\n", p->dpme_map_entries); printf(" physical start: %10"PRIu32" length: %10"PRIu32"\n", p->dpme_pblock_start, p->dpme_pblocks); printf(" logical start: %10"PRIu32" length: %10"PRIu32"\n", p->dpme_lblock_start, p->dpme_lblocks); printf(" flags: 0x%"PRIx32"\n", (uint32_t)p->dpme_flags); printf(" "); if (dpme_valid_get(p)) printf("valid "); if (dpme_allocated_get(p)) printf("alloc "); if (dpme_in_use_get(p)) printf("in-use "); if (dpme_bootable_get(p)) printf("boot "); if (dpme_readable_get(p)) printf("read "); if (dpme_writable_get(p)) printf("write "); if (dpme_os_pic_code_get(p)) printf("pic "); t = p->dpme_flags >> 7; for (i = 7; i <= 31; i++) { if (t & 0x1) { printf("%d ", i); } t = t >> 1; } printf("\n"); printf(" name: '%.32s'\n", p->dpme_name); printf(" type: '%.32s'\n", p->dpme_type); printf(" boot start block: %10"PRIu32"\n", p->dpme_boot_block); printf("boot length (in bytes): %10"PRIu32"\n", p->dpme_boot_bytes); printf(" load address: 0x%08"PRIx32" 0x%08"PRIx32"\n", (uint32_t)p->dpme_load_addr, (uint32_t)p->dpme_load_addr_2); printf(" start address: 0x%08"PRIx32" 0x%08"PRIx32"\n", (uint32_t)p->dpme_goto_addr, (uint32_t)p->dpme_goto_addr_2); printf(" checksum: 0x%08"PRIx32"\n", p->dpme_checksum); printf(" processor: '%.32s'\n", p->dpme_process_id); printf("boot args field -"); dump_block((uint8_t *)p->dpme_boot_args, 32*4); printf("dpme_reserved_3 -"); dump_block((uint8_t *)p->dpme_reserved_3, 62*4); }
/* * The operation to apply to each file ... */ void process(char *filename) { char *s; int index; partition_map_header *map; int valid_file; partition_map * entry; //printf("Processing %s\n", filename); // 1) strip off number from end of filename s = strdup(filename); index = trim_num(s); if (index < 0) { fatal(-1, "%s does not end in a number", filename); } // 2) open prefix of filename as partition map map = open_partition_map(s, &valid_file, 0); if (!valid_file) { fatal(-1, "%s does not have a partition map", s); return; } // 3) verify the type for the partition; if (map->writeable == 0) { fatal(-1, "The map is not writeable"); return; } // 4) find partition and change it entry = find_entry_by_disk_address(index, map); if (entry == NULL) { fatal(-1, "No such partition"); } else if (strcmp(entry->data->dpme_type, kHFSType) != 0) { fatal(-1, "Can't convert a partition with type %s", entry->data->dpme_type); } else { // 4a) modify the type strncpy(entry->data->dpme_type, kUnixType, DPISTRLEN); // 5) and write back. write_partition_map(map); } }
void move_entry_in_map(long old_index, long index, partition_map_header *map) { partition_map * cur; cur = find_entry_by_disk_address(old_index, map); if (cur == NULL) { printf("No such partition\n"); } else { remove_from_disk_order(cur); cur->disk_address = index; insert_in_disk_order(cur); renumber_disk_addresses(map); map->changed = 1; } }
void do_change_type(partition_map_header *map) { partition_map * entry; long ix; char *type = NULL; if (map == NULL) { bad_input("No partition map exists"); return; } if (!rflag && map->writable == 0) { printf("The map is not writeable.\n"); } if (get_number_argument("Partition number: ", &ix, kDefault) == 0) { bad_input("Bad partition number"); return; } entry = find_entry_by_disk_address(ix, map); if (entry == NULL ) { printf("No such partition\n"); goto out; } printf("Existing partition type ``%s''.\n", entry->data->dpme_type); if (get_string_argument("New type of partition: ", &type, 1) == 0) { bad_input("Bad type"); goto out; } strncpy(entry->data->dpme_type, type, DPISTRLEN); do_update_dpme(entry); map->changed = 1; out: if (type) free(type); return; }
int get_base_argument(long *number, partition_map_header *map) { partition_map * entry; int result = 0; if (get_number_argument("First block: ", number, kDefault) == 0) { bad_input("Bad block number"); } else { result = 1; if (get_partition_modifier()) { entry = find_entry_by_disk_address(*number, map); if (entry == NULL) { bad_input("Bad partition number"); result = 0; } else { *number = entry->data->dpme_pblock_start; } } } return result; }