On Sat, Jun 25, 2011 at 11:08:44PM -0700, ben wrote:
> Using libparted is there a way to set the system ID of the partition, for 
> instance 0x83 for linux,  without using libparted to actualy write a 
> filesystem 
> to the partition?

As far as I know, this is not possible with vanilla parted. However,
you finally forced me to post here our SUSE patch that 'abuses'
partition flags in (lib)parted for setting partition types. Attaching
version that applies to parted-2.4.


------
# parted -s /dev/sdb set 1 type 0x83
# parted -s /dev/sdb print
Model: Linux scsi_debug (scsi)
Disk /dev/sdb: 8389kB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      32.8kB  5014kB  4981kB  primary               type=83
------

Jim, if I clean (at least the testsuite has to be adapted) the patch,
would you be willing to accept it?

Thanks,

Petr

--
Petr Uzel
IRC: ptr_uzl @ freenode
---
 include/parted/disk.h  |    9 +++++----
 libparted/disk.c       |    2 ++
 libparted/labels/dos.c |    8 ++++++++
 parted/parted.c        |   24 +++++++++++++++++++++---
 parted/ui.c            |    3 +++
 5 files changed, 39 insertions(+), 7 deletions(-)

Index: parted-2.4/libparted/disk.c
===================================================================
--- parted-2.4.orig/libparted/disk.c
+++ parted-2.4/libparted/disk.c
@@ -2425,6 +2425,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-2.4/libparted/labels/dos.c
===================================================================
--- parted-2.4.orig/libparted/labels/dos.c
+++ parted-2.4/libparted/labels/dos.c
@@ -1496,6 +1496,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 (
@@ -1591,6 +1595,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;
 
@@ -1617,6 +1624,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_DIAG:
Index: parted-2.4/parted/ui.c
===================================================================
--- parted-2.4.orig/parted/ui.c
+++ parted-2.4/parted/ui.c
@@ -917,6 +917,9 @@ command_line_get_integer (const char* pr
                                        NULL, 1);
         if (!input)
                 return 0;
+        if (strstr(input, "0x") == input)
+            valid = sscanf (input, "%x", value);
+        else
         valid = sscanf (input, "%d", value);
         free (input);
         return valid;
Index: parted-2.4/include/parted/disk.h
===================================================================
--- parted-2.4.orig/include/parted/disk.h
+++ parted-2.4/include/parted/disk.h
@@ -70,10 +70,11 @@ enum _PedPartitionFlag {
         PED_PARTITION_BIOS_GRUB=12,
         PED_PARTITION_APPLE_TV_RECOVERY=13,
         PED_PARTITION_DIAG=14,
-        PED_PARTITION_LEGACY_BOOT=15
+        PED_PARTITION_LEGACY_BOOT=15,
+        PED_PARTITION_TYPE=16
 };
 #define PED_PARTITION_FIRST_FLAG        PED_PARTITION_BOOT
-#define PED_PARTITION_LAST_FLAG         PED_PARTITION_LEGACY_BOOT
+#define PED_PARTITION_LAST_FLAG         PED_PARTITION_TYPE
 
 enum _PedDiskTypeFeature {
         PED_DISK_TYPE_EXTENDED=1,       /**< supports extended partitions */
Index: parted-2.4/parted/parted.c
===================================================================
--- parted-2.4.orig/parted/parted.c
+++ parted-2.4/parted/parted.c
@@ -1291,13 +1291,14 @@ partition_print_flags (PedPartition* par
         const char*             name;
         char*                   res = ped_malloc(1);
         void*                   _res = res;
+        int                     xtype;
 
         *res = '\0';
 
         first_flag = 1;
         for (flag = ped_partition_flag_next (0); flag;
              flag = ped_partition_flag_next (flag)) {
-                if (ped_partition_get_flag (part, flag)) {
+            if (xtype = ped_partition_get_flag (part, flag)) {
                         if (first_flag)
                                 first_flag = 0;
                         else {
@@ -1306,7 +1307,16 @@ partition_print_flags (PedPartition* par
                                 res = _res;
                                 strncat (res, ", ", 2);
                         }
-
+                if (flag == PED_PARTITION_TYPE) {
+                    char tmpstr[21];
+                    int len = snprintf(tmpstr,sizeof(tmpstr)-1,"type=%02x",xtype);
+                    _res = res;
+                    ped_realloc (&_res, strlen (res) + 1 + 
+                            ((len>sizeof(tmpstr))?sizeof(tmpstr):len) );
+                    res = _res;
+                    strncat (res, tmpstr, 21);
+                }
+                else {
                         name = _(ped_partition_flag_get_name (flag));
                         _res = res;
                         ped_realloc (&_res, strlen (res) + 1 + strlen (name));
@@ -1314,6 +1324,7 @@ partition_print_flags (PedPartition* par
                         strcat(res, name);
                 }
         }
+        }
 
         return res;
 }
@@ -2156,12 +2167,19 @@ do_set (PedDevice** dev)
                 goto error_destroy_disk;
         if (!command_line_get_part_flag (_("Flag to Invert?"), part, &flag))
                 goto error_destroy_disk;
+		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_destroy_disk;
         }
+		else if( flag == PED_PARTITION_TYPE ) {
+			if (!command_line_get_integer (_("New type?"), &state))
+				goto error_destroy_disk;
+		}
 
         if (!ped_partition_set_flag (part, flag, state))
 	        	goto error_destroy_disk;

Attachment: pgpm4reeT8exf.pgp
Description: PGP signature

_______________________________________________
parted-devel mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/parted-devel

Reply via email to