We lack of showing parttition type for part-list command. This patch will add support for this. Also 'parted -m' did not provide partition type info, remove code section for 'parted -m' process.
Signed-off-by: Chen Hanxiao <[email protected]> --- daemon/parted.c | 155 ++++++++++++++++++++++++++------------------------- generator/structs.ml | 1 + resize/resize.ml | 2 +- 3 files changed, 82 insertions(+), 76 deletions(-) diff --git a/daemon/parted.c b/daemon/parted.c index a7bcb99..312b15f 100644 --- a/daemon/parted.c +++ b/daemon/parted.c @@ -33,6 +33,10 @@ GUESTFSD_EXT_CMD(str_parted, parted); GUESTFSD_EXT_CMD(str_sfdisk, sfdisk); GUESTFSD_EXT_CMD(str_sgdisk, sgdisk); +#ifndef PARTED_NO_M +# define PARTED_NO_M 0 +#endif + /* Notes: * * Parted 1.9 sends error messages to stdout, hence use of the @@ -451,11 +455,7 @@ do_part_get_parttype (const char *device) guestfs_int_partition_list * do_part_list (const char *device) { - int parted_has_m_opt = test_parted_m_opt (); - if (parted_has_m_opt == -1) - return NULL; - - CLEANUP_FREE char *out = print_partition_table (device, parted_has_m_opt); + CLEANUP_FREE char *out = print_partition_table (device, PARTED_NO_M); if (!out) return NULL; @@ -466,88 +466,86 @@ do_part_list (const char *device) guestfs_int_partition_list *r; - if (parted_has_m_opt) { - /* New-style parsing using the "machine-readable" format from - * 'parted -m'. - * - * lines[0] is "BYT;", lines[1] is the device line which we ignore, - * lines[2..] are the partitions themselves. Count how many. - */ - size_t nr_rows = 0, row; - for (row = 2; lines[row] != NULL; ++row) - ++nr_rows; - - r = malloc (sizeof *r); - if (r == NULL) { - reply_with_perror ("malloc"); - return NULL; + /* Old-style. Start at the line following "^Number", up to the + * next blank line. + */ + size_t start = 0, end = 0, has_type = 0, row; + + for (row = 0; lines[row] != NULL; ++row) + if (STRPREFIX (lines[row], "Number")) { + start = row+1; + /* check whether output of parted has 'Type' field */ + if (strstr (lines[row], "Type")) + has_type = 1; + break; } - r->guestfs_int_partition_list_len = nr_rows; - r->guestfs_int_partition_list_val = - malloc (nr_rows * sizeof (guestfs_int_partition)); - if (r->guestfs_int_partition_list_val == NULL) { - reply_with_perror ("malloc"); - goto error2; + + if (start == 0) { + reply_with_error ("parted output has no \"Number\" line"); + return NULL; + } + + for (row = start; lines[row] != NULL; ++row) + if (STREQ (lines[row], "")) { + end = row; + break; } - /* Now parse the lines. */ - size_t i; - for (i = 0, row = 2; lines[row] != NULL; ++i, ++row) { - if (sscanf (lines[row], "%d:%" SCNi64 "B:%" SCNi64 "B:%" SCNi64 "B", + if (end == 0) { + reply_with_error ("parted output has no blank after end of table"); + return NULL; + } + + size_t nr_rows = end - start; + + r = malloc (sizeof *r); + if (r == NULL) { + reply_with_perror ("malloc"); + return NULL; + } + r->guestfs_int_partition_list_len = nr_rows; + r->guestfs_int_partition_list_val = + malloc (nr_rows * sizeof (guestfs_int_partition)); + if (r->guestfs_int_partition_list_val == NULL) { + reply_with_perror ("malloc"); + goto error2; + } + + /* Now parse the lines. */ + size_t i, k; + if (has_type) { + /* hold type such as primary, logical and extended */ + char type_temp[16]; + for (i = 0, row = start; row < end; ++i, ++row) { + if (sscanf (lines[row], " %d %" SCNi64 "B %" SCNi64 "B %" SCNi64 "B" "%s", &r->guestfs_int_partition_list_val[i].part_num, &r->guestfs_int_partition_list_val[i].part_start, &r->guestfs_int_partition_list_val[i].part_end, - &r->guestfs_int_partition_list_val[i].part_size) != 4) { + &r->guestfs_int_partition_list_val[i].part_size, + type_temp) != 5) { reply_with_error ("could not parse row from output of parted print command: %s", lines[row]); goto error3; } - } - } - else { - /* Old-style. Start at the line following "^Number", up to the - * next blank line. - */ - size_t start = 0, end = 0, row; - for (row = 0; lines[row] != NULL; ++row) - if (STRPREFIX (lines[row], "Number")) { - start = row+1; - break; + if (STRPREFIX (type_temp, "primary")) { + r->guestfs_int_partition_list_val[i].part_type = strdup("primary"); + if (r->guestfs_int_partition_list_val[i].part_type == NULL) + goto error4; + } else if (STRPREFIX (type_temp, "logical")) { + r->guestfs_int_partition_list_val[i].part_type = strdup("logical"); + if (r->guestfs_int_partition_list_val[i].part_type == NULL) + goto error4; + } else if (STRPREFIX (type_temp, "extended")) { + r->guestfs_int_partition_list_val[i].part_type = strdup("extended"); + if (r->guestfs_int_partition_list_val[i].part_type == NULL) + goto error4; + } else { + r->guestfs_int_partition_list_val[i].part_type = strdup(""); + if (r->guestfs_int_partition_list_val[i].part_type == NULL) + goto error4; } - - if (start == 0) { - reply_with_error ("parted output has no \"Number\" line"); - return NULL; } - - for (row = start; lines[row] != NULL; ++row) - if (STREQ (lines[row], "")) { - end = row; - break; - } - - if (end == 0) { - reply_with_error ("parted output has no blank after end of table"); - return NULL; - } - - size_t nr_rows = end - start; - - r = malloc (sizeof *r); - if (r == NULL) { - reply_with_perror ("malloc"); - return NULL; - } - r->guestfs_int_partition_list_len = nr_rows; - r->guestfs_int_partition_list_val = - malloc (nr_rows * sizeof (guestfs_int_partition)); - if (r->guestfs_int_partition_list_val == NULL) { - reply_with_perror ("malloc"); - goto error2; - } - - /* Now parse the lines. */ - size_t i; + } else { for (i = 0, row = start; row < end; ++i, ++row) { if (sscanf (lines[row], " %d %" SCNi64 "B %" SCNi64 "B %" SCNi64 "B", &r->guestfs_int_partition_list_val[i].part_num, @@ -557,11 +555,18 @@ do_part_list (const char *device) reply_with_error ("could not parse row from output of parted print command: %s", lines[row]); goto error3; } + + r->guestfs_int_partition_list_val[i].part_type = strdup(""); + if (r->guestfs_int_partition_list_val[i].part_type == NULL) + goto error4; } } return r; + error4: + for (k = 0; k <= i; k++) + free (r->guestfs_int_partition_list_val[k].part_type); error3: free (r->guestfs_int_partition_list_val); error2: diff --git a/generator/structs.ml b/generator/structs.ml index ea110a1..e7a9fa6 100644 --- a/generator/structs.ml +++ b/generator/structs.ml @@ -240,6 +240,7 @@ let structs = [ "part_start", FBytes; "part_end", FBytes; "part_size", FBytes; + "part_type", FString; ]; s_camel_name = "Partition" }; diff --git a/resize/resize.ml b/resize/resize.ml index 84fd6d4..8f8f67f 100644 --- a/resize/resize.ml +++ b/resize/resize.ml @@ -1078,7 +1078,7 @@ read the man page virt-resize(1). *) p_name = ""; p_part = { G.part_num = 0l; part_start = 0L; part_end = 0L; - part_size = 0L }; + part_size = 0L; part_type = "" }; p_bootable = false; p_id = No_ID; p_type = ContentUnknown; p_label = None; p_guid = None; -- 2.1.0 _______________________________________________ Libguestfs mailing list [email protected] https://www.redhat.com/mailman/listinfo/libguestfs
