Ejemplo n.º 1
0
int write_mbr_partition_table(void)
{
	printf("write mbr partition \n");
	emmc_part_device_init();
	//write pmbr
	struct disk_info *device_disk_info;
	if (!(device_disk_info = load_diskconfig())) {
		printf("Errors encountered while loading disk  partation\n");
		return 1;
		}
       /* First, partition the drive */
	if (apply_disk_config(device_disk_info))
		printf("write partition list success\n");

	return 1;
}
int
main(int argc, char *argv[])
{
    struct disk_info *dinfo = NULL;
    int test = 0;
    int verbose = 0;
    int cnt;

    if (parse_args(argc, argv, &dinfo, &test, &verbose))
        return 1;

    if (process_disk_config(dinfo)) {
        fprintf(stderr, "Disk configuration is bad\n");
        return 1;
    }

    if (verbose)
        dump_disk_config(dinfo);

    if (test)
        printf("Test mode enabled. Actions will not be committed to disk!\n");

    if (apply_disk_config(dinfo, test)) {
        fprintf(stderr, "Could not apply disk configuration!\n");
        return 1;
    }

    printf("Copying images to specified partition offsets\n");
    /* now copy the images to their appropriate locations on disk */
    for (cnt = 0; cnt < MAX_NUM_PARTS && part_file_map[cnt].pinfo; ++cnt) {
        off64_t offs = part_file_map[cnt].pinfo->start_lba * dinfo->sect_size;
        const char *dest_fn = dinfo->device;
        if (write_raw_image(dest_fn, part_file_map[cnt].filename, offs, test)) {
            fprintf(stderr, "Could not write images after editing label.\n");
            return 1;
        }
    }
    printf("File edit complete. Wrote %d images.\n", cnt);

    return 0;
}
Ejemplo n.º 3
0
int Volume::initializeMbr(const char *deviceNode) {
    struct disk_info dinfo;

    memset(&dinfo, 0, sizeof(dinfo));

    if (!(dinfo.part_lst = (struct part_info *) malloc(MAX_NUM_PARTS * sizeof(struct part_info)))) {
        SLOGE("Failed to malloc prt_lst");
        return -1;
    }

    memset(dinfo.part_lst, 0, MAX_NUM_PARTS * sizeof(struct part_info));
    dinfo.device = strdup(deviceNode);
    dinfo.scheme = PART_SCHEME_MBR;
    dinfo.sect_size = 512;
    dinfo.skip_lba = 2048;
    dinfo.num_lba = 0;
    dinfo.num_parts = 1;

    struct part_info *pinfo = &dinfo.part_lst[0];

    pinfo->name = strdup("android_sdcard");
    pinfo->flags |= PART_ACTIVE_FLAG;
    pinfo->type = PC_PART_TYPE_FAT32;
    pinfo->len_kb = -1;

    int rc = apply_disk_config(&dinfo, 0);

    if (rc) {
        SLOGE("Failed to apply disk configuration (%d)", rc);
        goto out;
    }

 out:
    free(pinfo->name);
    free(dinfo.device);
    free(dinfo.part_lst);

    return rc;
}
Ejemplo n.º 4
0
void setup_disk_information(char *disk_layout_location)
{
	char *disk_force;
	/* Read the preos.fstab, which is used to for filesystem
	 * meta-data and also the sd card device node */
	load_volume_table();

	/*
	 * If all device nodes exist and disk_force set to no in
	 * config file, skip to load/write partition table
	 */
	disk_force = tboot_config_get(DISK_FORCE_KEY);
	if (!disk_force) {
		pr_error("Invalid tboot config disk_force.\n");
		tboot_config_set(DISK_FORCE_KEY, "yes");
	}

	if (!check_devnodes() && !strcasecmp(disk_force, "no")) {
		pr_debug("bypass load disk config\n");
		return;
	}

	/* Read disk_layout.conf, which provides physical partition
	 * layout information */
	pr_debug("Reading disk layout from %s\n", disk_layout_location);
	disk_info = load_diskconfig(disk_layout_location, NULL);
	if (!disk_info) {
		pr_error("Disk layout unreadable.\n");
		die();
	}
	process_disk_config(disk_info);
	dump_disk_config(disk_info);

	/* Set up the partition table */
	if (apply_disk_config(disk_info, 0)) {
		pr_error("Couldn't apply disk configuration.\n");
		die();
	}
}
Ejemplo n.º 5
0
int Volume::initializeMbr(const char *deviceNode) {
    struct disk_info dinfo;
    int ret = -1;
    struct timeval now;
    struct timespec outtime;

    SLOGI("Enter Volume::initializeMbr()\n");   

    memset(&dinfo, 0, sizeof(dinfo));

    if (!(dinfo.part_lst = (struct part_info *) malloc(MAX_NUM_PARTS * sizeof(struct part_info)))) {
        SLOGE("Failed to malloc prt_lst");
        return -1;
    }

    memset(dinfo.part_lst, 0, MAX_NUM_PARTS * sizeof(struct part_info));
    dinfo.device = strdup(deviceNode);
    dinfo.scheme = PART_SCHEME_MBR;
    dinfo.sect_size = 512;
    dinfo.skip_lba = 2048;
    dinfo.num_lba = 0;
    dinfo.num_parts = 1;

    struct part_info *pinfo = &dinfo.part_lst[0];

    pinfo->name = strdup("android_sdcard");
    pinfo->flags |= PART_ACTIVE_FLAG;
    pinfo->type = PC_PART_TYPE_FAT32;
    pinfo->len_kb = -1;
    SLOGI("Volume::initializeMbr() -- calls apply_disk_config()\n");
    int rc = apply_disk_config(&dinfo, 0);
    SLOGI("Volume::initializeMbr() -- exit apply_disk_config()\n");
    if (rc) {
        SLOGE("Failed to apply disk configuration (%d)", rc);
        goto out;
    }

    gettimeofday(&now, NULL);
    outtime.tv_sec = now.tv_sec + PART_RESCAN_UEVENT_TO;
    outtime.tv_nsec = now.tv_usec * 1000L; 
 
    pthread_mutex_lock(&part_rescan_mutex);
    part_rescan_wait = WAIT_ON_ADD_EVENT;
    if((ret = pthread_cond_timedwait(&part_rescan_cond, &part_rescan_mutex, &outtime))){
      SLOGE("Wait for partition rescan uevent %d seconds timeout. ret:%d, error:%s", PART_RESCAN_UEVENT_TO, ret, strerror(ret));
    }
    SLOGD("%s: return: %d(%s)", __FUNCTION__, ret, strerror(ret));

    part_rescan_wait = WAIT_ON_NO_EVENT;
    pthread_mutex_unlock(&part_rescan_mutex);

 out:
    SLOGI("Exit Volume::initializeMbr() -- free name\n");
    free(pinfo->name);
    SLOGI("Exit Volume::initializeMbr() -- free dinfo.device\n");
    free(dinfo.device);
    SLOGI("Exit Volume::initializeMbr() -- free dinfo.part_lst\n");
    free(dinfo.part_lst);
    SLOGI("Exit initializeMbr().\n");
    return rc;
}