2020-09-29 23:55:11 +01:00
/*
SPDX - FileCopyrightText : 2020 Gaël PORTAY < gael . portay @ collabora . com >
SPDX - License - Identifier : GPL - 3.0 - or - later
*/
Add new job to set the GPT partition UUID
The GPT partition layout supports unique GUID partitions.
The CLI sfdisk sets the partition UUID using the option --part-uuid.
See the examples below:
$ cat <<EOF | sfdisk disk.img
label: gpt
type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, size=64M
type=0FC63DAF-8483-4772-8E79-3D69D8477DE4
EOF
(...)
$ sfdisk --dump disk.img
(...)
disk.img1 : start= 2048, size= 131072, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, uuid=BBE806BB-8567-A843-9FF5-9B6B35D2908E
disk.img2 : start= 133120, size= 1963999, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=7DB39F08-C138-664B-B38E-ED2DEB549AA6
$ sfdisk --part-uuid disk.img 1 00000000^C000-0000-0000-000000000000
(...)
$ sfdisk --part-uuid disk.img 2 11111111-1111-1111-1111-111111111111
(...)
$ sfdisk --dump disk.img
(...)
disk.img1 : start= 2048, size= 131072, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, uuid=00000000-0000-0000-0000-000000000000
disk.img2 : start= 133120, size= 1963999, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=11111111-1111-1111-1111-111111111111
This commit introduces the new job set-partition-uuid that is used in
the new-operation to set the UUID of the partition. The job uses the
newly introduced method setPartitionUUID that is implemented by the
sfdisk and dummy backends.
Note: This is a copypaste of what was done for GTP partition label in
commit f585f6c (Add new job to set the GPT partition label).
2020-03-18 18:24:27 +00:00
# include "jobs/setpartitionuuidjob.h"
# include "backend/corebackend.h"
# include "backend/corebackendmanager.h"
# include "backend/corebackenddevice.h"
# include "backend/corebackendpartitiontable.h"
# include "core/partition.h"
# include "core/device.h"
# include "util/report.h"
# include <KLocalizedString>
# include <memory>
/** Creates a new SetPartitionUUIDJob (GPT only)
@ param d the Device the Partition to be created will be on
@ param p the Partition whose UUID is to be set is on
@ param newUUID the new UUID
*/
SetPartitionUUIDJob : : SetPartitionUUIDJob ( Device & d , Partition & p , const QString & newUUID ) :
Job ( ) ,
m_Device ( d ) ,
m_Partition ( p ) ,
m_UUID ( newUUID )
{
}
bool SetPartitionUUIDJob : : run ( Report & parent )
{
Q_ASSERT ( partition ( ) . devicePath ( ) = = device ( ) . deviceNode ( ) ) ;
bool rval = true ;
Report * report = jobStarted ( parent ) ;
// The UUID is supported by GPT only, if the partition table is not GPT, just ignore the
// request and say all is well. This helps in operations because we don't have to check for
// support to avoid having a failed job.
if ( m_Device . partitionTable ( ) - > type ( ) ! = PartitionTable : : gpt )
report - > line ( ) < < xi18nc ( " @info:progress " , " Partition table of partition <filename>%1</filename> does not support setting UUIDs. Job ignored. " , partition ( ) . deviceNode ( ) ) ;
else {
std : : unique_ptr < CoreBackendDevice > backendDevice = CoreBackendManager : : self ( ) - > backend ( ) - > openDevice ( m_Device ) ;
if ( backendDevice ) {
std : : unique_ptr < CoreBackendPartitionTable > backendPartitionTable = backendDevice - > openPartitionTable ( ) ;
if ( backendPartitionTable ) {
if ( backendPartitionTable - > setPartitionUUID ( * report , partition ( ) , m_UUID ) ) {
rval = true ;
partition ( ) . setUUID ( m_UUID ) ;
backendPartitionTable - > commit ( ) ;
} else
report - > line ( ) < < xi18nc ( " @info:progress " , " Failed to set the UUID for the partition <filename>%1</filename>. " , partition ( ) . deviceNode ( ) ) ;
} else
report - > line ( ) < < xi18nc ( " @info:progress " , " Could not open partition table on device <filename>%1</filename> to set the UUID for the partition <filename>%2</filename>. " , device ( ) . deviceNode ( ) , partition ( ) . deviceNode ( ) ) ;
} else
report - > line ( ) < < xi18nc ( " @info:progress " , " Could not open device <filename>%1</filename> to set the UUID for partition <filename>%2</filename>. " , device ( ) . deviceNode ( ) , partition ( ) . deviceNode ( ) ) ;
}
jobFinished ( * report , rval ) ;
return rval ;
}
QString SetPartitionUUIDJob : : description ( ) const
{
return xi18nc ( " @info:progress " , " Set the UUID on partition <filename>%1</filename> to \" %2 \" " , partition ( ) . deviceNode ( ) , uuid ( ) ) ;
}