From c34e26e7e160797d65cfffa0f7b8ed20b01fc6eb4ad62333168b92295d3f24c9 Mon Sep 17 00:00:00 2001 From: Arvin Schnell Date: Thu, 21 Apr 2022 05:58:32 +0000 Subject: [PATCH] Accepting request 971201 from home:aschnell:branches:Base:System - update to version 3.5: * Add support for JSON output. * Add support for linux-home flag for GPT. * Add --fix option. added patches: - direct-handling-of-partition-type-id-and-uuid.patch - parted-json-no-type-flag.patch refreshed patches: - libparted-open-the-device-RO-and-lazily-switch-to-RW.patch - parted-2.4-ncursesw6.patch - parted-add-ignore-busy-option.patch - parted-fix-resizepart-and-rm-command.patch - parted-implement-wipesignatures-option.patch - parted-print-max-partitions-for-yast.patch - parted-type.patch - tests-disable.patch removed patches: - parted-escape-printed-device-path.patch - parted-mkpart-allow-empty-gpt-part-name.patch OBS-URL: https://build.opensuse.org/request/show/971201 OBS-URL: https://build.opensuse.org/package/show/Base:System/parted?expand=0&rev=152 --- ...ndling-of-partition-type-id-and-uuid.patch | 557 ++++++++++++++++++ ...he-device-RO-and-lazily-switch-to-RW.patch | 2 +- parted-2.4-ncursesw6.patch | 6 +- parted-3.4.tar.xz | 3 - parted-3.4.tar.xz.sig | 11 - parted-3.5.tar.xz | 3 + parted-3.5.tar.xz.sig | 11 + parted-add-ignore-busy-option.patch | 11 +- parted-escape-printed-device-path.patch | 79 --- parted-fix-resizepart-and-rm-command.patch | 30 +- parted-implement-wipesignatures-option.patch | 8 +- parted-json-no-type-flag.patch | 14 + parted-mkpart-allow-empty-gpt-part-name.patch | 68 --- parted-print-max-partitions-for-yast.patch | 10 +- parted-type.patch | 18 +- parted.changes | 23 + parted.spec | 14 +- tests-disable.patch | 2 +- 18 files changed, 652 insertions(+), 218 deletions(-) create mode 100644 direct-handling-of-partition-type-id-and-uuid.patch delete mode 100644 parted-3.4.tar.xz delete mode 100644 parted-3.4.tar.xz.sig create mode 100644 parted-3.5.tar.xz create mode 100644 parted-3.5.tar.xz.sig delete mode 100644 parted-escape-printed-device-path.patch create mode 100644 parted-json-no-type-flag.patch delete mode 100644 parted-mkpart-allow-empty-gpt-part-name.patch diff --git a/direct-handling-of-partition-type-id-and-uuid.patch b/direct-handling-of-partition-type-id-and-uuid.patch new file mode 100644 index 0000000..627d901 --- /dev/null +++ b/direct-handling-of-partition-type-id-and-uuid.patch @@ -0,0 +1,557 @@ +From 1d798715b5998cd4afd184beb88ebdbe1a2642e8 Mon Sep 17 00:00:00 2001 +From: Arvin Schnell +Date: Thu, 14 Oct 2021 16:29:06 +0200 +Subject: [PATCH] allow direct handling of partition type id and uuid + +--- + include/parted/disk.in.h | 23 +++++- + libparted/disk.c | 86 ++++++++++++++++++++++ + libparted/labels/dasd.c | 4 ++ + libparted/labels/dos.c | 30 +++++++- + libparted/labels/gpt.c | 40 ++++++++++- + parted/parted.c | 146 +++++++++++++++++++++++++++++++++++++- + tests/t0800-json-gpt.sh | 2 + + tests/t0801-json-msdos.sh | 5 +- + 8 files changed, 329 insertions(+), 7 deletions(-) + +diff --git a/include/parted/disk.in.h b/include/parted/disk.in.h +index 303f59c..d7fde12 100644 +--- a/include/parted/disk.in.h ++++ b/include/parted/disk.in.h +@@ -32,6 +32,7 @@ + */ + #include + #include ++#include + + /** + * Disk flags +@@ -91,9 +92,11 @@ enum _PedPartitionFlag { + PED_DISK_TYPE_EXTENDED=1, /**< supports extended partitions */ + PED_DISK_TYPE_PARTITION_NAME=2, /**< supports partition names */ +- PED_DISK_TYPE_SYSTEM_NAME=4 /**< supports system names */ ++ PED_DISK_TYPE_SYSTEM_NAME=4, /**< supports system names */ ++ PED_DISK_TYPE_PARTITION_TYPE_ID=8, /**< supports partition type-ids */ ++ PED_DISK_TYPE_PARTITION_TYPE_UUID=16, /**< supports partition type-uuids */ + }; + #define PED_DISK_TYPE_FIRST_FEATURE PED_DISK_TYPE_EXTENDED +-#define PED_DISK_TYPE_LAST_FEATURE PED_DISK_TYPE_SYSTEM_NAME ++#define PED_DISK_TYPE_LAST_FEATURE PED_DISK_TYPE_PARTITION_TYPE_UUID + + struct _PedDisk; + struct _PedPartition; +@@ -247,6 +250,13 @@ struct _PedDiskOps { + PedPartitionFlag flag); + void (*partition_set_name) (PedPartition* part, const char* name); + const char* (*partition_get_name) (const PedPartition* part); ++ ++ int (*partition_set_type_id) (PedPartition* part, uint8_t id); ++ uint8_t (*partition_get_type_id) (const PedPartition* part); ++ ++ int (*partition_set_type_uuid) (PedPartition* part, const uint8_t* uuid); ++ uint8_t* (*partition_get_type_uuid) (const PedPartition* part); ++ + int (*partition_align) (PedPartition* part, + const PedConstraint* constraint); + int (*partition_enumerate) (PedPartition* part); +@@ -347,6 +357,10 @@ extern int ped_partition_set_system (PedPartition* part, + extern int ped_partition_set_system_name (PedPartition* part, const char* name); + extern const char* ped_partition_get_name (const PedPartition* part); + extern const char* ped_partition_get_system_name (const PedPartition* part); ++extern int ped_partition_set_type_id (PedPartition* part, uint8_t id); ++extern uint8_t ped_partition_get_type_id (const PedPartition* part); ++extern int ped_partition_set_type_uuid (PedPartition* part, const uint8_t* uuid); ++extern uint8_t* ped_partition_get_type_uuid (const PedPartition* part); + extern int ped_partition_is_busy (const PedPartition* part); + extern char* ped_partition_get_path (const PedPartition* part); + +diff --git a/libparted/disk.c b/libparted/disk.c +index 8496fc0..80f3154 100644 +--- a/libparted/disk.c ++++ b/libparted/disk.c +@@ -1458,6 +1458,36 @@ _assert_partition_name_feature (const PedDiskType* disk_type) + return 1; + } + ++static int ++_assert_partition_type_id_feature (const PedDiskType* disk_type) ++{ ++ if (!ped_disk_type_check_feature ( ++ disk_type, PED_DISK_TYPE_PARTITION_TYPE_ID)) { ++ ped_exception_throw ( ++ PED_EXCEPTION_ERROR, ++ PED_EXCEPTION_CANCEL, ++ "%s disk labels do not support partition type-ids.", ++ disk_type->name); ++ return 0; ++ } ++ return 1; ++} ++ ++static int ++_assert_partition_type_uuid_feature (const PedDiskType* disk_type) ++{ ++ if (!ped_disk_type_check_feature ( ++ disk_type, PED_DISK_TYPE_PARTITION_TYPE_UUID)) { ++ ped_exception_throw ( ++ PED_EXCEPTION_ERROR, ++ PED_EXCEPTION_CANCEL, ++ "%s disk labels do not support partition type-uuids.", ++ disk_type->name); ++ return 0; ++ } ++ return 1; ++} ++ + /** + * Sets the name of a partition. + * +@@ -1510,6 +1540,62 @@ ped_partition_get_name (const PedPartition* part) + return part->disk->type->ops->partition_get_name (part); + } + ++int ++ped_partition_set_type_id (PedPartition *part, uint8_t id) ++{ ++ PED_ASSERT (part != NULL); ++ PED_ASSERT (part->disk != NULL); ++ PED_ASSERT (ped_partition_is_active (part)); ++ ++ if (!_assert_partition_type_id_feature (part->disk->type)) ++ return 0; ++ ++ PED_ASSERT (part->disk->type->ops->partition_set_type_id != NULL); ++ return part->disk->type->ops->partition_set_type_id (part, id); ++} ++ ++uint8_t ++ped_partition_get_type_id (const PedPartition *part) ++{ ++ PED_ASSERT (part != NULL); ++ PED_ASSERT (part->disk != NULL); ++ PED_ASSERT (ped_partition_is_active (part)); ++ ++ if (!_assert_partition_type_id_feature (part->disk->type)) ++ return 0; ++ ++ PED_ASSERT (part->disk->type->ops->partition_set_type_id != NULL); ++ return part->disk->type->ops->partition_get_type_id (part); ++} ++ ++int ++ped_partition_set_type_uuid (PedPartition *part, const uint8_t* uuid) ++{ ++ PED_ASSERT (part != NULL); ++ PED_ASSERT (part->disk != NULL); ++ PED_ASSERT (ped_partition_is_active (part)); ++ ++ if (!_assert_partition_type_uuid_feature (part->disk->type)) ++ return 0; ++ ++ PED_ASSERT (part->disk->type->ops->partition_set_type_uuid != NULL); ++ return part->disk->type->ops->partition_set_type_uuid (part, uuid); ++} ++ ++uint8_t* ++ped_partition_get_type_uuid (const PedPartition *part) ++{ ++ PED_ASSERT (part != NULL); ++ PED_ASSERT (part->disk != NULL); ++ PED_ASSERT (ped_partition_is_active (part)); ++ ++ if (!_assert_partition_type_uuid_feature (part->disk->type)) ++ return NULL; ++ ++ PED_ASSERT (part->disk->type->ops->partition_set_type_uuid != NULL); ++ return part->disk->type->ops->partition_get_type_uuid (part); ++} ++ + /** @} */ + + /** +diff --git a/libparted/labels/dasd.c b/libparted/labels/dasd.c +index 6b0b10d..1747202 100644 +--- a/libparted/labels/dasd.c ++++ b/libparted/labels/dasd.c +@@ -117,6 +117,10 @@ static PedDiskOps dasd_disk_ops = { + + partition_set_name: NULL, + partition_get_name: NULL, ++ partition_set_type_id: NULL, ++ partition_get_type_id: NULL, ++ partition_set_type_uuid: NULL, ++ partition_get_type_uuid: NULL, + disk_set_flag: dasd_disk_set_flag, + disk_get_flag: dasd_disk_get_flag, + disk_is_flag_available: dasd_disk_is_flag_available, +diff --git a/libparted/labels/dos.c b/libparted/labels/dos.c +index b44ccaf..44c8cfc 100644 +--- a/libparted/labels/dos.c ++++ b/libparted/labels/dos.c +@@ -1754,6 +1754,30 @@ msdos_partition_is_flag_available (const PedPartition* part, + } + } + ++ ++int ++msdos_partition_set_type_id (PedPartition *part, uint8_t id) ++{ ++ DosPartitionData *dos_part_data = part->disk_specific; ++ ++ dos_part_data->system = id; ++ ++ // TODO set the correct flag but there is no function for that. better cleanup flags ++ // and use system directly (like in gpt.c) ++ ++ return 1; ++} ++ ++ ++uint8_t _GL_ATTRIBUTE_PURE ++msdos_partition_get_type_id (const PedPartition *part) ++{ ++ const DosPartitionData *dos_part_data = part->disk_specific; ++ ++ return dos_part_data->system; ++} ++ ++ + static PedGeometry* + _try_constraint (const PedPartition* part, const PedConstraint* external, + PedConstraint* internal) +@@ -2590,6 +2614,10 @@ static PedDiskOps msdos_disk_ops = { + + partition_set_name: NULL, + partition_get_name: NULL, ++ partition_set_type_id: msdos_partition_set_type_id, ++ partition_get_type_id: msdos_partition_get_type_id, ++ partition_set_type_uuid: NULL, ++ partition_get_type_uuid: NULL, + + PT_op_function_initializers (msdos) + }; +@@ -2598,7 +2626,7 @@ static PedDiskType msdos_disk_type = { + next: NULL, + name: "msdos", + ops: &msdos_disk_ops, +- features: PED_DISK_TYPE_EXTENDED ++ features: PED_DISK_TYPE_EXTENDED | PED_DISK_TYPE_PARTITION_TYPE_ID + }; + + void +diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c +index c5d7bb3..db18790 100644 +--- a/libparted/labels/gpt.c ++++ b/libparted/labels/gpt.c +@@ -1685,6 +1685,45 @@ gpt_partition_get_name (const PedPartition *part) + return gpt_part_data->translated_name; + } + ++ ++static int ++gpt_partition_set_type_uuid (PedPartition *part, const uint8_t* uuid) ++{ ++ GPTPartitionData *gpt_part_data = part->disk_specific; ++ ++ efi_guid_t* type_uuid = &gpt_part_data->type; ++ memcpy(type_uuid, uuid, sizeof (efi_guid_t)); ++ ++ /* type_uuid is always LE, while uint8_t is always kind of BE */ ++ ++ type_uuid->time_low = PED_SWAP32(type_uuid->time_low); ++ type_uuid->time_mid = PED_SWAP16(type_uuid->time_mid); ++ type_uuid->time_hi_and_version = PED_SWAP16(type_uuid->time_hi_and_version); ++ ++ return 1; ++} ++ ++ ++static uint8_t* ++gpt_partition_get_type_uuid (const PedPartition *part) ++{ ++ const GPTPartitionData *gpt_part_data = part->disk_specific; ++ ++ efi_guid_t type_uuid = gpt_part_data->type; ++ ++ /* type_uuid is always LE, while uint8_t is always kind of BE */ ++ ++ type_uuid.time_low = PED_SWAP32(type_uuid.time_low); ++ type_uuid.time_mid = PED_SWAP16(type_uuid.time_mid); ++ type_uuid.time_hi_and_version = PED_SWAP16(type_uuid.time_hi_and_version); ++ ++ uint8_t* buf = ped_malloc(sizeof (uuid_t)); ++ memcpy(buf, &type_uuid, sizeof (uuid_t)); ++ ++ return buf; ++} ++ ++ + static int + gpt_get_max_primary_partition_count (const PedDisk *disk) + { +@@ -1780,6 +1814,10 @@ static PedDiskOps gpt_disk_ops = + + partition_set_name: gpt_partition_set_name, + partition_get_name: gpt_partition_get_name, ++ partition_set_type_id: NULL, ++ partition_get_type_id: NULL, ++ partition_set_type_uuid: gpt_partition_set_type_uuid, ++ partition_get_type_uuid: gpt_partition_get_type_uuid, + disk_set_flag: gpt_disk_set_flag, + disk_get_flag: gpt_disk_get_flag, + disk_is_flag_available: gpt_disk_is_flag_available, +@@ -1792,7 +1830,7 @@ static PedDiskType gpt_disk_type = + next: NULL, + name: "gpt", + ops: &gpt_disk_ops, +- features: PED_DISK_TYPE_PARTITION_NAME ++ features: PED_DISK_TYPE_PARTITION_NAME | PED_DISK_TYPE_PARTITION_TYPE_UUID + }; + + void +diff --git a/parted/parted.c b/parted/parted.c +index 310f011..f840037 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -19,6 +19,7 @@ + + #include + #include ++#include + + #include "argmatch.h" + #include "closeout.h" +@@ -174,6 +175,8 @@ static const char* end_msg = N_("END is disk location, such as " + static const char* state_msg = N_("STATE is one of: on, off\n"); + static const char* device_msg = N_("DEVICE is usually /dev/hda or /dev/sda\n"); + static const char* name_msg = N_("NAME is any word you want\n"); ++static const char* type_id_msg = N_("TYPE_ID is a value between 0x01 and 0xff\n"); ++static const char* type_uuid_msg = N_("TYPE_UUID is a non-null uuid\n"); + + static const char* copyright_msg = N_( + "Copyright (C) 1998 - 2006 Free Software Foundation, Inc.\n" +@@ -917,6 +920,110 @@ error: + return 0; + } + ++static int ++do_type_id (PedDevice** dev, PedDisk** diskp) ++{ ++ PedPartition* part = NULL; ++ char* input = NULL; ++ ++ if (!*diskp) ++ *diskp = ped_disk_new (*dev); ++ if (!*diskp) ++ goto error; ++ ++ if (!ped_disk_type_check_feature((*diskp)->type, PED_DISK_TYPE_PARTITION_TYPE_ID)) { ++ ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL, ++ _("%s disk labels do not support partition type-id."), ++ (*diskp)->type->name); ++ goto error; ++ } ++ ++ if (!command_line_get_partition (_("Partition number?"), *diskp, &part)) ++ goto error; ++ ++ uint8_t type_id = ped_partition_get_type_id (part); ++ ++ static char buf[8]; ++ snprintf(buf, 8, "0x%02x", type_id); ++ ++ input = command_line_get_word (_("Partition type-id?"), buf, NULL, 0); ++ if (!input) ++ goto error; ++ ++ unsigned int tmp = strtol (input, (char**) NULL, 0); ++ if (tmp == 0 || tmp > 0xff) { ++ ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL, ++ _("Invalid id.")); ++ goto error; ++ } ++ ++ if (!ped_partition_set_type_id (part, tmp)) ++ goto error_free_input; ++ ++ free (input); ++ ++ if (!ped_disk_commit (*diskp)) ++ goto error; ++ return 1; ++ ++error_free_input: ++ free (input); ++error: ++ return 0; ++} ++ ++static int ++do_type_uuid (PedDevice** dev, PedDisk** diskp) ++{ ++ PedPartition* part = NULL; ++ char* input = NULL; ++ ++ if (!*diskp) ++ *diskp = ped_disk_new (*dev); ++ if (!*diskp) ++ goto error; ++ ++ if (!ped_disk_type_check_feature((*diskp)->type, PED_DISK_TYPE_PARTITION_TYPE_UUID)) { ++ ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL, ++ _("%s disk labels do not support partition type-uuid."), ++ (*diskp)->type->name); ++ goto error; ++ } ++ ++ if (!command_line_get_partition (_("Partition number?"), *diskp, &part)) ++ goto error; ++ ++ uint8_t* type_uuid = ped_partition_get_type_uuid (part); ++ static char buf[UUID_STR_LEN]; ++ uuid_unparse_lower (type_uuid, buf); ++ free (type_uuid); ++ ++ input = command_line_get_word (_("Partition type-uuid?"), buf, NULL, 0); ++ if (!input) ++ goto error; ++ ++ uuid_t tmp; ++ if (uuid_parse (input, tmp) != 0 || uuid_is_null (tmp)) { ++ ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL, ++ _("Invalid uuid.")); ++ goto error; ++ } ++ ++ if (!ped_partition_set_type_uuid (part, tmp)) ++ goto error_free_input; ++ ++ free (input); ++ ++ if (!ped_disk_commit (*diskp)) ++ goto error; ++ return 1; ++ ++error_free_input: ++ free (input); ++error: ++ return 0; ++} ++ + static char* + partition_print_flags (PedPartition const *part) + { +@@ -1161,6 +1268,8 @@ do_print (PedDevice** dev, PedDisk** diskp) + Table* table; + int has_extended; + int has_name; ++ int has_id; ++ int has_uuid; + int has_devices_arg = 0; + int has_free_arg = 0; + int has_list_arg = 0; +@@ -1270,6 +1379,10 @@ do_print (PedDevice** dev, PedDisk** diskp) + PED_DISK_TYPE_EXTENDED); + has_name = ped_disk_type_check_feature ((*diskp)->type, + PED_DISK_TYPE_PARTITION_NAME); ++ has_id = ped_disk_type_check_feature ((*diskp)->type, ++ PED_DISK_TYPE_PARTITION_TYPE_ID); ++ has_uuid = ped_disk_type_check_feature ((*diskp)->type, ++ PED_DISK_TYPE_PARTITION_TYPE_UUID); + + PedPartition* part; + if (opt_output_mode == HUMAN) { +@@ -1407,6 +1520,21 @@ do_print (PedDevice** dev, PedDisk** diskp) + + if (!(part->type & PED_PARTITION_FREESPACE)) { + ++ if (has_id) { ++ uint8_t type_id = ped_partition_get_type_id (part); ++ static char buf[8]; ++ snprintf(buf, 8, "0x%02x", type_id); ++ ul_jsonwrt_value_s (&json, "type-id", buf); ++ } ++ ++ if (has_uuid) { ++ uint8_t* type_uuid = ped_partition_get_type_uuid (part); ++ static char buf[UUID_STR_LEN]; ++ uuid_unparse_lower (type_uuid, buf); ++ ul_jsonwrt_value_s (&json, "type-uuid", buf); ++ free (type_uuid); ++ } ++ + if (has_name) { + name = ped_partition_get_name (part); + if (strcmp (name, "") != 0) +@@ -2218,6 +2346,22 @@ _("name NUMBER NAME name partition NUMBER as NAME"), + NULL), + str_list_create (_(number_msg), _(name_msg), NULL), 1)); + ++command_register (commands, command_create ( ++ str_list_create_unique ("type-id", _("type-id"), NULL), ++ do_type_id, ++ str_list_create ( ++_("type-id NUMBER TYPE-ID type-id set TYPE-ID of partition NUMBER"), ++NULL), ++ str_list_create (_(number_msg), _(type_id_msg), NULL), 1)); ++ ++command_register (commands, command_create ( ++ str_list_create_unique ("type-uuid", _("type-uuid"), NULL), ++ do_type_uuid, ++ str_list_create ( ++_("type-uuid NUMBER TYPE-UUID type-uuid set TYPE-UUID of partition NUMBER"), ++NULL), ++ str_list_create (_(number_msg), _(type_uuid_msg), NULL), 1)); ++ + command_register (commands, command_create ( + str_list_create_unique ("print", _("print"), NULL), + do_print, +diff --git a/tests/t0800-json-gpt.sh b/tests/t0800-json-gpt.sh +index 8dd1862..354c0bd 100755 +--- a/tests/t0800-json-gpt.sh ++++ b/tests/t0800-json-gpt.sh +@@ -62,6 +62,7 @@ cat < exp || fail=1 + "end": "20479s", + "size": "10240s", + "type": "primary", ++ "type-uuid": "0fc63daf-8483-4772-8e79-3d69d8477de4", + "name": "test1" + },{ + "number": 2, +@@ -69,6 +70,7 @@ cat < exp || fail=1 + "end": "61439s", + "size": "40960s", + "type": "primary", ++ "type-uuid": "a19d880f-05fc-4d3b-a006-743f0f84911e", + "name": "test2", + "flags": [ + "raid" +diff --git a/tests/t0801-json-msdos.sh b/tests/t0801-json-msdos.sh +index a14a5af..c5446d8 100755 +--- a/tests/t0801-json-msdos.sh ++++ b/tests/t0801-json-msdos.sh +@@ -52,13 +52,15 @@ cat < exp || fail=1 + "start": "5.00MiB", + "end": "10.0MiB", + "size": "5.00MiB", +- "type": "primary" ++ "type": "primary", ++ "type-id": "0x83" + },{ + "number": 2, + "start": "10.0MiB", + "end": "30.0MiB", + "size": "20.0MiB", + "type": "extended", ++ "type-id": "0x0f", + "flags": [ + "lba" + ] +@@ -68,6 +70,7 @@ cat < exp || fail=1 + "end": "20.0MiB", + "size": "10.0MiB", + "type": "logical", ++ "type-id": "0x8e", + "flags": [ + "lvm" + ] diff --git a/libparted-open-the-device-RO-and-lazily-switch-to-RW.patch b/libparted-open-the-device-RO-and-lazily-switch-to-RW.patch index f99d1a1..567e69e 100644 --- a/libparted-open-the-device-RO-and-lazily-switch-to-RW.patch +++ b/libparted-open-the-device-RO-and-lazily-switch-to-RW.patch @@ -61,7 +61,7 @@ Index: parted-3.3/libparted/arch/linux.c if (!_partition_is_mounted_by_path (name)) { - fd = open (name, WR_MODE, 0); + fd = open (name, RD_MODE, 0); - if (fd > 0) { + if (fd > -1) { ioctl (fd, BLKFLSBUF); retry: @@ -1709,7 +1728,7 @@ _device_open_ro (PedDevice* dev) diff --git a/parted-2.4-ncursesw6.patch b/parted-2.4-ncursesw6.patch index 1484782..e2918bd 100644 --- a/parted-2.4-ncursesw6.patch +++ b/parted-2.4-ncursesw6.patch @@ -9,17 +9,17 @@ Index: parted-3.3/configure.ac =================================================================== --- parted-3.3.orig/configure.ac +++ parted-3.3/configure.ac -@@ -151,7 +151,8 @@ AM_CPPFLAGS="$AM_CPPFLAGS -D_REENTRANT" +@@ -147,7 +147,8 @@ AM_CPPFLAGS="$AM_CPPFLAGS -D_REENTRANT" dnl Check for programs. - AC_ISC_POSIX + AC_SEARCH_LIBS([strerror],[cposix]) -AC_PROG_CC +AC_PROG_CC_STDC +AC_USE_SYSTEM_EXTENSIONS AC_PROG_GCC_TRADITIONAL AM_PROG_CC_C_O -@@ -331,7 +332,7 @@ dnl Check for termcap +@@ -320,7 +321,7 @@ dnl Check for termcap if test "$with_readline" = yes; then OLD_LIBS="$LIBS" LIBS="" diff --git a/parted-3.4.tar.xz b/parted-3.4.tar.xz deleted file mode 100644 index 190f56c..0000000 --- a/parted-3.4.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1298022472da5589b7f2be1d5ee3c1b66ec3d96dfbad03dc642afd009da5342 -size 1860300 diff --git a/parted-3.4.tar.xz.sig b/parted-3.4.tar.xz.sig deleted file mode 100644 index dfa470a..0000000 --- a/parted-3.4.tar.xz.sig +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQFDBAABCgAtFiEEtMa0UeT6i0IyyhkeEX6MFo7+On8FAmASBNUPHGJjbEByZWRo -YXQuY29tAAoJEBF+jBaO/jp/blAH+gNmum3xO2/fZhwRUo1mmb+qP9MlAexjt9VJ -KX79/5ICIFSubVLxzsJTN5g3hZQUoui3qcgdJhnp14bK3hSsvBKtvAAUp+myB+1t -9aypzK+qvw32aaCtPfS00qe4Re2ry6LyuW7hsATPIvcQWF/Xc76FLzG6ilzshxS0 -iftCM/NSp3aGBcNa4Ru3TkbQ1vFtuKYkt24hItODtrYAMGb2IQzSPHCbZw1kfV/J -pypllYB7A6ykr9xqhXPW30d3hERmvcJS0LoUzzEmHRf4YYkYk2N0BQoa4KYI1ULX -rlpG+iJSc0RN8EgHwecdHfPN3umE2UXn3aYCS5GX2Dn9xPsjaSM= -=HdSF ------END PGP SIGNATURE----- diff --git a/parted-3.5.tar.xz b/parted-3.5.tar.xz new file mode 100644 index 0000000..c683390 --- /dev/null +++ b/parted-3.5.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4938dd5c1c125f6c78b1f4b3e297526f18ee74aa43d45c248578b1d2470c05a2 +size 1871824 diff --git a/parted-3.5.tar.xz.sig b/parted-3.5.tar.xz.sig new file mode 100644 index 0000000..40b9245 --- /dev/null +++ b/parted-3.5.tar.xz.sig @@ -0,0 +1,11 @@ +-----BEGIN PGP SIGNATURE----- + +iQEzBAABCgAdFiEEtMa0UeT6i0IyyhkeEX6MFo7+On8FAmJduCkACgkQEX6MFo7+ +On9cLAgAmAn86lYjZj+Ka5EHrVtaFgh1Nvz84EOwZd0TVRTJyP/u56QrOXxRYFFr +6SiJuI1sWfpkzMGG8RYhcr/hu0Os4rtDdhwXXA75QexpSZamPRSo/EU7skrPW0ZD +ycw6jUIBO5de4kCLmM/4byl6LV5eFixJYJ5zfD+SnQsMJvO6/fBo0Dv+pNGF/m5F +mQeLWmgfqCNZ3INoHLPxuP08gpA9aELp6UFipbqBZqeRIk4K+jGSWlLu62mwl2sQ +1OYIIdKacBrh14ZhRqXZKGKHk94RxiFtD/7CLXK/qzEFylKUMQ/XpUB0QkZNHVZW +l2kRXsEGC1c7dWSbMX8lgy02HjfuVQ== +=7scj +-----END PGP SIGNATURE----- diff --git a/parted-add-ignore-busy-option.patch b/parted-add-ignore-busy-option.patch index 5d72971..b4e313a 100644 --- a/parted-add-ignore-busy-option.patch +++ b/parted-add-ignore-busy-option.patch @@ -37,7 +37,7 @@ Index: parted-3.3/parted/parted.c =================================================================== --- parted-3.3.orig/parted/parted.c +++ parted-3.3/parted/parted.c -@@ -76,7 +76,8 @@ static int MEGABYTE_SECTORS (PedDevice* +@@ -76,8 +76,9 @@ static int MEGABYTE_SECTORS (PedDevice* enum { PRETEND_INPUT_TTY = CHAR_MAX + 1, @@ -45,10 +45,11 @@ Index: parted-3.3/parted/parted.c + IGNORE_BUSY = CHAR_MAX + 2, + WIPESIGNATURES = CHAR_MAX + 3, }; - + + /* Output modes */ enum @@ -118,6 +119,7 @@ static struct option const options[] = { - {"script", 0, NULL, 's'}, + {"fix", 0, NULL, 'f'}, {"version", 0, NULL, 'v'}, {"align", required_argument, NULL, 'a'}, + {"ignore-busy", 0, NULL, IGNORE_BUSY}, @@ -56,7 +57,7 @@ Index: parted-3.3/parted/parted.c {"-pretend-input-tty", 0, NULL, PRETEND_INPUT_TTY}, {NULL, 0, NULL, 0} @@ -130,10 +132,13 @@ static const char *const options_help [] - {"script", N_("never prompts for user intervention")}, + {"fix", N_("in script mode, fix instead of abort when asked")}, {"version", N_("displays the version")}, {"align=[none|cyl|min|opt]", N_("alignment for new partitions")}, + {"ignore-busy", N_("perform action although partition is busy")}, @@ -67,8 +68,8 @@ Index: parted-3.3/parted/parted.c +#define LONGOPT_HELP_START 6 /* index to first long option help */ + int opt_script_mode = 0; + int opt_fix_mode = 0; int pretend_input_tty = 0; - int wipesignatures = 0; @@ -141,6 +146,7 @@ int opt_machine_mode = 0; int disk_is_modified = 0; int is_toggle_mode = 0; diff --git a/parted-escape-printed-device-path.patch b/parted-escape-printed-device-path.patch deleted file mode 100644 index bd784d3..0000000 --- a/parted-escape-printed-device-path.patch +++ /dev/null @@ -1,79 +0,0 @@ -From: Sebastian Parschauer -Date: Tue, 7 Nov 2017 20:14:06 +0100 -Subject: parted: Escape printed device path in machine mode -References: bsc#1066467 -Patch-mainline: submitted, 2017-11-07 - -The function _print_disk_info() uses the colon ':' as the separator -but the device path it prints can contain that character as well. -In that case parsing fails. -So introduce the function _escape_machine_string() to allocate an -output string twice as big as the input string and escape ':' and -'\' with a '\'. Print the escaped path and free it again. Ignore -the NULL pointer dereference in out-of-memory situation like it -is done for the other allocations in _print_disk_info() as well. - -Resolves: bsc#1066467 - -Reported-by: Arvin Schnell -Signed-off-by: Sebastian Parschauer ---- - parted/parted.c | 29 ++++++++++++++++++++++++++++- - 1 file changed, 28 insertions(+), 1 deletion(-) - -Index: parted-3.3/parted/parted.c -=================================================================== ---- parted-3.3.orig/parted/parted.c -+++ parted-3.3/parted/parted.c -@@ -1053,6 +1053,30 @@ _print_disk_geometry (const PedDevice *d - free (cyl_size); - } - -+static char * -+_escape_machine_string (const char *str) -+{ -+ size_t i, j; -+ char *dest; -+ -+ dest = ped_malloc ((strlen(str) + 1) * 2); -+ if (!dest) -+ return NULL; -+ -+ for (i = 0, j = 0; str[i] != '\0'; i++, j++) { -+ switch (str[i]) { -+ case ':': -+ case '\\': -+ dest[j++] = '\\'; -+ default: -+ dest[j] = str[i]; -+ break; -+ } -+ } -+ dest[j] = '\0'; -+ return dest; -+} -+ - static void - _print_disk_info (const PedDevice *dev, const PedDisk *diskp) - { -@@ -1073,6 +1097,8 @@ _print_disk_info (const PedDevice *dev, - char *disk_flags = disk_print_flags (diskp); - - if (opt_machine_mode) { -+ char *path = _escape_machine_string (dev->path); -+ - switch (default_unit) { - case PED_UNIT_CHS: puts ("CHS;"); - break; -@@ -1083,9 +1109,10 @@ _print_disk_info (const PedDevice *dev, - - } - printf ("%s:%s:%s:%lld:%lld:%s:%s:%s;\n", -- dev->path, end, transport[dev->type], -+ path, end, transport[dev->type], - dev->sector_size, dev->phys_sector_size, - pt_name, dev->model, disk_flags); -+ free(path); - } else { - printf (_("Model: %s (%s)\n"), - dev->model, transport[dev->type]); diff --git a/parted-fix-resizepart-and-rm-command.patch b/parted-fix-resizepart-and-rm-command.patch index d8fa1bb..31b70d1 100644 --- a/parted-fix-resizepart-and-rm-command.patch +++ b/parted-fix-resizepart-and-rm-command.patch @@ -77,38 +77,28 @@ Index: parted-3.3/parted/parted.c goto error; /* Push the End value back onto the command_line, if it exists */ -@@ -1681,19 +1693,32 @@ do_resizepart (PedDevice** dev, PedDisk* - goto error; - _adjust_end_if_iec(&start, &end, range_end, end_input); - free(end_input); -+ if (cmdline_words >= end_idx && !_partition_warn_busy (part, danger_if_busy)) -+ goto error; -+ - /* Do not move start of the partition */ - constraint = constraint_from_start_end_fixed_start (*dev, start, range_end); - if (!ped_disk_set_partition_geom (disk, part, constraint, +@@ -1871,13 +1873,23 @@ do_resizepart (PedDevice** dev, PedDisk* start, end)) goto error_destroy_constraint; /* warn when shrinking partition - might lose data */ - if (part->geom.end < oldend) - if (ped_exception_throw ( + if (part->geom.end < oldend) { -+ if (opt_script_mode && (!ped_partition_is_busy (part) || ignore_busy)) { -+ char *path = ped_partition_get_path (part); ++ if (opt_script_mode && (!ped_partition_is_busy (part) || ignore_busy)) { ++ char *path = ped_partition_get_path (part); + ped_exception_throw ( -+ PED_EXCEPTION_WARNING, -+ PED_EXCEPTION_UNHANDLED, -+ _("Shrinking partition %s, data loss possible."), path); -+ free(path); ++ PED_EXCEPTION_WARNING, ++ PED_EXCEPTION_UNHANDLED, ++ _("Shrinking partition %s, data loss possible."), path); ++ free(path); + } else if (ped_exception_throw ( PED_EXCEPTION_WARNING, PED_EXCEPTION_YES_NO, _("Shrinking a partition can cause data loss, " \ "are you sure you want to continue?")) != PED_EXCEPTION_YES) -- goto error_destroy_constraint; -+ { -+ goto error_destroy_constraint; -+ } ++ { + goto error_destroy_constraint; ++ } + } ped_disk_commit (disk); diff --git a/parted-implement-wipesignatures-option.patch b/parted-implement-wipesignatures-option.patch index b64ff30..da1b2ab 100644 --- a/parted-implement-wipesignatures-option.patch +++ b/parted-implement-wipesignatures-option.patch @@ -148,9 +148,9 @@ Index: parted-3.3/parted/parted.c + WIPESIGNATURES = CHAR_MAX + 2, }; - enum + /* Output modes */ @@ -117,6 +118,7 @@ static struct option const options[] = { - {"script", 0, NULL, 's'}, + {"fix", 0, NULL, 'f'}, {"version", 0, NULL, 'v'}, {"align", required_argument, NULL, 'a'}, + {"wipesignatures", 0, NULL, WIPESIGNATURES}, @@ -158,7 +158,6 @@ Index: parted-3.3/parted/parted.c {NULL, 0, NULL, 0} }; @@ -128,11 +130,13 @@ static const char *const options_help [] - {"script", N_("never prompts for user intervention")}, {"version", N_("displays the version")}, {"align=[none|cyl|min|opt]", N_("alignment for new partitions")}, + {"wipesignatures", N_("wipe superblock signatures when creating partition")}, @@ -166,9 +165,10 @@ Index: parted-3.3/parted/parted.c }; int opt_script_mode = 0; + int opt_fix_mode = 0; int pretend_input_tty = 0; + int opt_output_mode = HUMAN; +int wipesignatures = 0; - int opt_machine_mode = 0; int disk_is_modified = 0; int is_toggle_mode = 0; @@ -651,6 +655,7 @@ _adjust_end_if_iec (PedSector* start, Pe diff --git a/parted-json-no-type-flag.patch b/parted-json-no-type-flag.patch new file mode 100644 index 0000000..5158666 --- /dev/null +++ b/parted-json-no-type-flag.patch @@ -0,0 +1,14 @@ +diff --git a/parted/parted.c b/parted/parted.c +index 5c7c270..aa68d58 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -956,6 +956,9 @@ partition_print_flags_json (PedPartition const *part) + for (flag = ped_partition_flag_next (0); flag; + flag = ped_partition_flag_next (flag)) + { ++ if (flag == PED_PARTITION_TYPE) ++ continue; ++ + if (ped_partition_get_flag (part, flag)) + { + if (!did_open_array) diff --git a/parted-mkpart-allow-empty-gpt-part-name.patch b/parted-mkpart-allow-empty-gpt-part-name.patch deleted file mode 100644 index 969b4d6..0000000 --- a/parted-mkpart-allow-empty-gpt-part-name.patch +++ /dev/null @@ -1,68 +0,0 @@ -From: Sebastian Parschauer -Date: Fri, 11 Aug 2017 12:46:42 +0200 -Subject: parted/ui: Count empty quoted strings as words in multi_word - mode -References: bsc#1023818, boo#1032562 -Patch-mainline: submitted, 2017-08-11 - -In non-interactive mode, the command line arguments are appended -to a string list with command_line_push_line() in multi_word mode. -That mode does not count empty strings as a word. -For mkpart and a GPT disk label, the partition name is picked up -from that string list. The partition name is mandatory and we -cannot make it optional. So it is not possible to set an empty -partition name from command line this way. -Also setting a default name is no option as this causes duplicate -/dev/disk/by-partlabel/ symlinks and systemd errors this way. - -So count empty quoted strings as words in multi_word mode to allow -the following commands to set an empty partition name. - -parted -s /dev/vdb mkpart "''" 1MiB 100% -parted -s /dev/vdb mkpart '""' ext3 1MiB 100% -parted -s /dev/vdb name 1 "''" - -The quoting is required as in interactive mode the command -"mkpart " (with a trailing space) would set the partition name to -an empty string already. - -Signed-off-by: Sebastian Parschauer ---- - parted/ui.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/parted/ui.c b/parted/ui.c -index 752860baa087..9991596a3a5a 100644 ---- a/parted/ui.c -+++ b/parted/ui.c -@@ -719,6 +719,7 @@ void - command_line_push_line (const char* line, int multi_word) - { - int quoted = 0; -+ int quotes_empty = 0; - char quote_char = 0; - char this_word [256]; - int i; -@@ -746,6 +747,9 @@ command_line_push_line (const char* line, int multi_word) - - if (quoted && *line == quote_char) { - quoted = 0; -+ /* allow empty partition name in script mode */ -+ if (!i) -+ quotes_empty = 1; - continue; - } - -@@ -753,9 +757,11 @@ command_line_push_line (const char* line, int multi_word) - if (quoted && line[0] == '\\' && line[1]) - line++; - -+ quotes_empty = 0; - this_word [i++] = *line; - } -- if (i || !multi_word) { -+ if (i || !multi_word || quotes_empty) { -+ quotes_empty = 0; - this_word [i] = 0; - command_line_push_word (this_word); - } diff --git a/parted-print-max-partitions-for-yast.patch b/parted-print-max-partitions-for-yast.patch index b3ffb60..db78694 100644 --- a/parted-print-max-partitions-for-yast.patch +++ b/parted-print-max-partitions-for-yast.patch @@ -13,12 +13,12 @@ Index: parted-3.3/parted/parted.c } - printf ("%s:%s:%s:%lld:%lld:%s:%s:%s;\n", + printf ("%s:%s:%s:%lld:%lld:%s:%s:%s", - path, end, transport[dev->type], + escaped_path, end, transport[dev->type], dev->sector_size, dev->phys_sector_size, - pt_name, dev->model, disk_flags); + pt_name, escaped_model, disk_flags); + if (getenv("PARTED_PRINT_NUMBER_OF_PARTITION_SLOTS")) + printf(":%lld", diskp && diskp->type->ops->get_max_primary_partition_count ? diskp->type->ops->get_max_primary_partition_count(diskp) : 0); + printf(";\n"); - free(path); - } else { - printf (_("Model: %s (%s)\n"), + free (escaped_path); + free (escaped_model); + } else if (opt_output_mode == JSON) { diff --git a/parted-type.patch b/parted-type.patch index e3a8e25..15f4524 100644 --- a/parted-type.patch +++ b/parted-type.patch @@ -16,16 +16,14 @@ Index: parted-3.3/include/parted/disk.in.h =================================================================== --- parted-3.3.orig/include/parted/disk.in.h +++ parted-3.3/include/parted/disk.in.h -@@ -78,10 +78,11 @@ - PED_PARTITION_IRST=17, - PED_PARTITION_ESP=18, +@@ -86,9 +86,10 @@ PED_PARTITION_CHROMEOS_KERNEL=19, -- PED_PARTITION_BLS_BOOT=20 -+ PED_PARTITION_BLS_BOOT=20, -+ PED_PARTITION_TYPE=21 + PED_PARTITION_BLS_BOOT=20, + PED_PARTITION_LINUX_HOME=21, ++ PED_PARTITION_TYPE=22, }; #define PED_PARTITION_FIRST_FLAG PED_PARTITION_BOOT --#define PED_PARTITION_LAST_FLAG PED_PARTITION_BLS_BOOT +-#define PED_PARTITION_LAST_FLAG PED_PARTITION_LINUX_HOME +#define PED_PARTITION_LAST_FLAG PED_PARTITION_TYPE enum _PedDiskTypeFeature { @@ -69,8 +67,8 @@ Index: parted-3.3/libparted/labels/dos.c return dos_data->palo; @@ -1728,6 +1735,7 @@ msdos_partition_is_flag_available (const - case PED_PARTITION_RAID: case PED_PARTITION_LVM: + case PED_PARTITION_SWAP: case PED_PARTITION_LBA: + case PED_PARTITION_TYPE: case PED_PARTITION_PALO: @@ -80,7 +78,7 @@ Index: parted-3.3/parted/parted.c =================================================================== --- parted-3.3.orig/parted/parted.c +++ parted-3.3/parted/parted.c -@@ -928,28 +928,40 @@ error: +@@ -946,28 +946,40 @@ error: static char* partition_print_flags (PedPartition const *part) { @@ -139,7 +137,7 @@ Index: parted-3.3/parted/parted.c + return res; } - static int + static void @@ -1808,12 +1820,19 @@ do_set (PedDevice** dev, PedDisk **diskp goto error; if (!command_line_get_part_flag (_("Flag to Invert?"), part, &flag)) diff --git a/parted.changes b/parted.changes index cd0dbc3..bdbd8c7 100644 --- a/parted.changes +++ b/parted.changes @@ -1,3 +1,26 @@ +------------------------------------------------------------------- +Wed Apr 20 09:11:11 CEST 2022 - aschnell@suse.com + +- update to version 3.5: + * Add support for JSON output. + * Add support for linux-home flag for GPT. + * Add --fix option. + added patches: + - direct-handling-of-partition-type-id-and-uuid.patch + - parted-json-no-type-flag.patch + refreshed patches: + - libparted-open-the-device-RO-and-lazily-switch-to-RW.patch + - parted-2.4-ncursesw6.patch + - parted-add-ignore-busy-option.patch + - parted-fix-resizepart-and-rm-command.patch + - parted-implement-wipesignatures-option.patch + - parted-print-max-partitions-for-yast.patch + - parted-type.patch + - tests-disable.patch + removed patches: + - parted-escape-printed-device-path.patch + - parted-mkpart-allow-empty-gpt-part-name.patch + ------------------------------------------------------------------- Tue Oct 19 13:16:11 CEST 2021 - aschnell@suse.com diff --git a/parted.spec b/parted.spec index e0e5dc6..307b0d0 100644 --- a/parted.spec +++ b/parted.spec @@ -1,7 +1,7 @@ # # spec file for package parted # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: parted -Version: 3.4 +Version: 3.5 Release: 0 Summary: GNU partitioner License: GPL-3.0-or-later @@ -53,19 +53,17 @@ Patch24: libparted-fix-nvme-partition-naming.patch Patch25: libparted-dasd-improve-lvm-raid-flag-handling.patch Patch26: parted-mkpart-set-a-swap-flag-if-available.patch Patch27: libparted-dasd-add-swap-flag-handling-for-DASD-CDL.patch -Patch28: parted-mkpart-allow-empty-gpt-part-name.patch Patch29: libparted-fix-NVDIMM-partition-naming.patch -Patch30: parted-escape-printed-device-path.patch Patch31: parted-add-ignore-busy-option.patch Patch32: parted-fix-resizepart-and-rm-command.patch Patch33: libparted-use-BLKRRPART-only-when-needed.patch Patch34: libparted-canonicalize-dev-md-paths.patch - +Patch35: parted-json-no-type-flag.patch # bsc#1168756 Patch36: libparted-linux-pmem-path.patch - # bsc#1164260 Patch37: parted-print-max-partitions-for-yast.patch +Patch38: direct-handling-of-partition-type-id-and-uuid.patch # bsc#1164907 Patch64: parted-type-accept-hex.patch # Fatresize @@ -155,15 +153,15 @@ to develop applications that require these. %patch25 -p1 %patch26 -p1 %patch27 -p1 -%patch28 -p1 %patch29 -p1 -%patch30 -p1 %patch31 -p1 %patch32 -p1 %patch33 -p1 %patch34 -p1 +%patch35 -p1 %patch36 -p1 %patch37 -p1 +%patch38 -p1 %patch64 -p1 %patch100 -p1 %patch101 -p1 diff --git a/tests-disable.patch b/tests-disable.patch index 56f952b..8154233 100644 --- a/tests-disable.patch +++ b/tests-disable.patch @@ -16,8 +16,8 @@ index f9340aa..9d0d08f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -60,7 +60,6 @@ TESTS = \ - t3200-resize-partition.sh \ t3200-type-change.sh \ + t3210-gpt-type-change.sh \ t3300-palo-prep.sh \ - t3310-flags.sh \ t3400-whole-disk-FAT-partition.sh \