int main(int argc, char *argv[]) { int i; int ret; char input_file[100]; char output_file[100]; off_t bs = 1, seek = 0, skip = 0, count = 0; assert(argc >= 3); for (i = 1; i < argc; i++) { char c, *p; parse_parameter(argv[i]); c = para_option[0]; p = para_option + 1; switch (c) { case 'i': if (strcmp(p, "f") == 0) { strcpy(input_file, para_value); } else { goto out_unknown_option; } break; case 'o': if (strcmp(p, "f") == 0) { strcpy(output_file, para_value); } else { goto out_unknown_option; } break; case 'b': if (strcmp(p, "s") == 0) { bs = text2size(para_value, NULL); } else { goto out_unknown_option; } break; case 's': if (strcmp(p, "kip") == 0) { skip = text2size(para_value, NULL); } else if (strcmp(p, "eek") == 0) { seek = text2size(para_value, NULL); } else { goto out_unknown_option; } break; case 'c': if (strcmp(p, "ount") == 0) { count = text2size(para_value, NULL); } else { goto out_unknown_option; } break; default: goto out_unknown_option; } } ret = cavan_dd(input_file, output_file, skip * bs, seek * bs, count * bs); if (ret < 0) { pr_err_info("cavan_dd"); return ret; } return 0; out_unknown_option: pr_err_info("unknown option \"%s\"", para_option); return -EINVAL; }
int main(int argc, char *argv[]) { int ret; int i, j; int dev_fd; struct master_boot_sector mbs; struct hd_geometry geo; u32 total_secs; u64 total_bytes; u32 part_secs; u32 sec_size; u32 start_sec; assert(argc > 2); dev_fd = open(argv[1], O_RDWR | O_BINARY); if (dev_fd < 0) { print_error("open device \"%s\"", argv[1]); return -1; } ret = fread_master_boot_sector(dev_fd, &mbs); if (ret < 0) { error_msg("fread_master_boot_sector"); goto out_close_dev; } ret = fget_device_geometry(dev_fd, &geo); if (ret < 0) { error_msg("fget_device_geometry"); goto out_close_dev; } ret = get_sector_size(dev_fd, &sec_size); if (ret < 0) { error_msg("get_sector_size"); goto out_close_dev; } ret = fget_device_size(dev_fd, &total_bytes); if (ret < 0) { error_msg("fget_device_size"); goto out_close_dev; } total_secs = total_bytes / sec_size; println("device size = %s = %d(sector)", size2text(total_bytes), total_secs); show_geometry(&geo); memset(mbs.disk_part_tables, 0, 64); start_sec = sector_cylinder_lalignment(text2size(argv[2], NULL) / sec_size, &geo); println("start_sec = %d(sector)", start_sec); if (start_sec == 0) { start_sec = 1; } for (i = 0, j = 3; i < 4 && j < argc; i++, j++) { part_secs = sector_cylinder_alignment_auto(text2size(argv[j], NULL) / sec_size, &geo); println("partition start address = %d(sector), size = %d(sector)", start_sec, part_secs); if (start_sec + part_secs > total_secs) { ret = -1; error_msg("partition size is too large"); goto out_close_dev; } set_part_address(mbs.disk_part_tables + i, &geo, start_sec, calculate_partition_size(start_sec, part_secs, &geo)); mbs.disk_part_tables[i].file_system_mark = 0x83; start_sec += part_secs; } if (i < 4 && start_sec < total_secs) { part_secs = sector_cylinder_lalignment(total_secs - start_sec, &geo); set_part_address(mbs.disk_part_tables + i, &geo, start_sec, calculate_partition_size(start_sec, part_secs, &geo)); mbs.disk_part_tables[i].file_system_mark = 0x83; } mbs.magic_number = 0xAA55; ret = fwrite_master_boot_sector(dev_fd, &mbs); if (ret < 0) { error_msg("fwrite_master_boot_sector"); goto out_close_dev; } ret = freread_part_table(dev_fd); if (ret < 0) { error_msg("freread_part_table_retry"); goto out_close_dev; } out_close_dev: close(dev_fd); return ret; }