File parted-type.patch of Package parted.15765

From: Petr Uzel <petr.uzel@suse.cz>
Subject: parted: Introduce a type flag
Patch-mainline: no, required by YaST

YaST requires a type flag in order to check the current partition
type for msdos partition tables.
---
 include/parted/disk.in.h |    5 ++-
 libparted/disk.c         |    2 +
 libparted/labels/dos.c   |    8 ++++++
 parted/parted.c          |   61 ++++++++++++++++++++++++++++++-----------------
 parted/ui.c              |    3 ++
 5 files changed, 56 insertions(+), 23 deletions(-)

Index: parted-3.2/include/parted/disk.in.h
===================================================================
--- parted-3.2.orig/include/parted/disk.in.h
+++ parted-3.2/include/parted/disk.in.h
@@ -75,10 +75,11 @@ enum _PedPartitionFlag {
         PED_PARTITION_LEGACY_BOOT=15,
         PED_PARTITION_MSFT_DATA=16,
         PED_PARTITION_IRST=17,
-        PED_PARTITION_ESP=18
+        PED_PARTITION_ESP=18,
+        PED_PARTITION_TYPE=19
 };
 #define PED_PARTITION_FIRST_FLAG        PED_PARTITION_BOOT
-#define PED_PARTITION_LAST_FLAG         PED_PARTITION_ESP
+#define PED_PARTITION_LAST_FLAG         PED_PARTITION_TYPE
 
 enum _PedDiskTypeFeature {
         PED_DISK_TYPE_EXTENDED=1,       /**< supports extended partitions */
Index: parted-3.2/libparted/disk.c
===================================================================
--- parted-3.2.orig/libparted/disk.c
+++ parted-3.2/libparted/disk.c
@@ -2388,6 +2388,8 @@ ped_partition_flag_get_name (PedPartitio
 		return N_("lba");
 	case PED_PARTITION_HPSERVICE:
 		return N_("hp-service");
+	case PED_PARTITION_TYPE:
+		return N_("type");
 	case PED_PARTITION_PALO:
 		return N_("palo");
 	case PED_PARTITION_PREP:
Index: parted-3.2/libparted/labels/dos.c
===================================================================
--- parted-3.2.orig/libparted/labels/dos.c
+++ parted-3.2/libparted/labels/dos.c
@@ -1550,6 +1550,10 @@ msdos_partition_set_flag (PedPartition*
 	disk = part->disk;
 
 	switch (flag) {
+	case PED_PARTITION_TYPE:
+		dos_data->system = state;
+		return 1;
+
 	case PED_PARTITION_HIDDEN:
 		if (part->type == PED_PARTITION_EXTENDED) {
 			ped_exception_throw (
@@ -1657,6 +1661,9 @@ msdos_partition_get_flag (const PedParti
 	case PED_PARTITION_LBA:
 		return dos_data->lba;
 
+	case PED_PARTITION_TYPE:
+		return dos_data->system;
+
 	case PED_PARTITION_PALO:
 		return dos_data->palo;
 
@@ -1689,6 +1696,7 @@ msdos_partition_is_flag_available (const
 	case PED_PARTITION_RAID:
 	case PED_PARTITION_LVM:
 	case PED_PARTITION_LBA:
+	case PED_PARTITION_TYPE:
 	case PED_PARTITION_PALO:
 	case PED_PARTITION_PREP:
 	case PED_PARTITION_IRST:
Index: parted-3.2/parted/parted.c
===================================================================
--- parted-3.2.orig/parted/parted.c
+++ parted-3.2/parted/parted.c
@@ -887,28 +887,40 @@ error:
 static char*
 partition_print_flags (PedPartition const *part)
 {
-  char *res = xstrdup ("");
-  if (!part)
-    return res;
-
-  PedPartitionFlag flag;
-  size_t res_buf_len = 1;
-  char const *sep = "";
-  for (flag = ped_partition_flag_next (0); flag;
-       flag = ped_partition_flag_next (flag))
-    {
-      if (ped_partition_get_flag (part, flag))
+        int  xtype;
+        char *res = xstrdup ("");
+        if (!part)
+                return res;
+
+        PedPartitionFlag flag;
+        size_t res_buf_len = 1;
+        char const *sep = "";
+        for (flag = ped_partition_flag_next (0); flag;
+             flag = ped_partition_flag_next (flag))
         {
-          const char *name = _(ped_partition_flag_get_name (flag));
-          size_t new_len = res_buf_len + strlen (sep) + strlen (name);
-          res = xrealloc (res, new_len);
-          stpcpy (stpcpy (res + res_buf_len - 1, sep), name);
-          res_buf_len = new_len;
-          sep = ", ";
+                if (xtype = ped_partition_get_flag (part, flag))
+                {
+                        if (flag == PED_PARTITION_TYPE) {
+                                char tmpstr[21];
+                                int len = snprintf(tmpstr, sizeof(tmpstr) - 1, "type=%02x", xtype);
+                                size_t new_len = res_buf_len + strlen(sep) + strlen(tmpstr);
+                                res = xrealloc(res, new_len);
+                                stpcpy (stpcpy (res + res_buf_len - 1, sep), tmpstr);
+                                res_buf_len = new_len;
+                                sep = ", ";
+                        }
+                        else {
+                                const char *name = _(ped_partition_flag_get_name (flag));
+                                size_t new_len = res_buf_len + strlen (sep) + strlen (name);
+                                res = xrealloc (res, new_len);
+                                stpcpy (stpcpy (res + res_buf_len - 1, sep), name);
+                                res_buf_len = new_len;
+                                sep = ", ";
+                        }
+                }
         }
-    }
 
-  return res;
+        return res;
 }
 
 static int
@@ -1726,12 +1738,19 @@ do_set (PedDevice** dev, PedDisk **diskp
                 goto error;
         if (!command_line_get_part_flag (_("Flag to Invert?"), part, &flag))
                 goto error;
-        state = (ped_partition_get_flag (part, flag) == 0 ? 1 : 0);
+        if( flag == PED_PARTITION_TYPE )
+                state = ped_partition_get_flag (part, flag);
+        else
+                state = (ped_partition_get_flag (part, flag) == 0 ? 1 : 0);
 
-        if (!is_toggle_mode) {
+        if (!is_toggle_mode && flag != PED_PARTITION_TYPE ) {
                 if (!command_line_get_state (_("New state?"), &state))
                         goto error;
         }
+        else if( flag == PED_PARTITION_TYPE ) {
+                if (!command_line_get_integer (_("New type?"), &state))
+                        goto error;
+        }
 
         if (!ped_partition_set_flag (part, flag, state))
                 goto error;
openSUSE Build Service is sponsored by