summaryrefslogtreecommitdiffstats
path: root/perl-install/fs/wild_device.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/fs/wild_device.pm')
-rw-r--r--perl-install/fs/wild_device.pm56
1 files changed, 35 insertions, 21 deletions
diff --git a/perl-install/fs/wild_device.pm b/perl-install/fs/wild_device.pm
index 8fd38b0ce..ff5a32253 100644
--- a/perl-install/fs/wild_device.pm
+++ b/perl-install/fs/wild_device.pm
@@ -1,8 +1,8 @@
-package fs::wild_device; # $Id$
+package fs::wild_device;
use diagnostics;
use strict;
-
+use devices;
use common;
@@ -11,17 +11,19 @@ sub analyze {
if ($dev =~ m!^/u?dev/(.*)!) {
'dev', $dev;
- } elsif ($dev !~ m!^/! && (-e "/dev/$dev" || -e "$::prefix/dev/$dev")) {
+ } elsif ($dev !~ m!^/! && (-e "/dev/$dev" || -e "/dev/$dev")) {
'dev', "/dev/$dev";
} elsif ($dev =~ /^LABEL=(.*)/) {
'label', $1;
- } elsif ($dev eq 'none' || $dev eq 'rootfs') {
+ } elsif ($dev =~ /^UUID=(.*)/) {
+ 'uuid', $1;
+ } elsif (member($dev, qw(none rootfs))) {
'virtual';
- } elsif ($dev =~ m!^(\S+):/\w!) {
+ } elsif ($dev =~ m!^(\S+):/(\w|$)!) {
'nfs';
} elsif ($dev =~ m!^//\w!) {
'smb';
- } elsif ($dev =~ m!^http://!) {
+ } elsif ($dev =~ m!^https?://!) {
'dav';
}
}
@@ -34,32 +36,38 @@ sub to_subpart {
if (my ($kind, $val) = analyze($dev)) {
if ($kind eq 'label') {
$part->{device_LABEL} = $val;
+ } elsif ($kind eq 'uuid') {
+ $part->{device_UUID} = $val;
} elsif ($kind eq 'dev') {
my %part = (faked_device => 0);
- if (my $rdev = (stat "$::prefix$dev")[6]) {
+ if (my $rdev = (stat "$dev")[6]) {
($part{major}, $part{minor}) = unmakedev($rdev);
}
- my $symlink = readlink("$::prefix$dev");
+ my $symlink = $dev !~ m!mapper/! ? readlink("$dev") : undef;
$dev =~ s!/u?dev/!!;
- if ($symlink && $symlink =~ m|^[^/]+$|) {
- $part{device_alias} = $dev;
- $dev = $symlink;
+ if ($symlink && $symlink !~ m!^/!) {
+ my $keep = 1;
+ if ($symlink =~ m!/! || $dev =~ m!/!) {
+ $symlink = MDK::Common::File::concat_symlink("/dev/" . dirname($dev), $symlink);
+ $symlink =~ s!^/dev/!! or $keep = 0;
+ }
+ if ($keep) {
+ $part{device_LABEL} = $1 if $dev =~ m!^disk/by-label/(.*)!;
+ $part{device_UUID} = $1 if $dev =~ m!^disk/by-uuid/(.*)!;
+ $part{device_alias} = $dev;
+ $dev = $symlink;
+ }
}
-
- if (my (undef, $part_number) = $dev =~ m!/(disc|part(\d+))$!) {
- $part{part_number} = $part_number if $part_number;
- $part{devfs_device} = $dev;
- } else {
- my $part_number = devices::part_number(\%part);
- $part{part_number} = $part_number if $part_number;
+ if (my $part_number = devices::part_number(\%part)) {
+ $part{part_number} = $part_number;
}
$part{device} = $dev;
return \%part;
}
} else {
- if ($dev =~ m!^/! && -f "$::prefix$dev") {
+ if ($dev =~ m!^/! && -f "$dev") {
#- it must be a loopback file or directory to bind
} else {
log::l("part_from_wild_device_name: unknown device $dev");
@@ -68,15 +76,21 @@ sub to_subpart {
$part;
}
+sub _prefer_device_UUID {
+ my ($part) = @_;
+ $part->{prefer_device_UUID} ||
+ !$::no_uuid_by_default && devices::should_prefer_UUID($part->{device});
+}
+
sub from_part {
my ($prefix, $part) = @_;
if ($part->{prefer_device_LABEL}) {
'LABEL=' . $part->{device_LABEL};
- } elsif ($part->{prefer_devfs_name}) {
- "/dev/$part->{devfs_device}";
} elsif ($part->{device_alias}) {
"/dev/$part->{device_alias}";
+ } elsif (!$part->{prefer_device} && $part->{device_UUID} && _prefer_device_UUID($part)) {
+ 'UUID=' . $part->{device_UUID};
} else {
my $faked_device = exists $part->{faked_device} ?
$part->{faked_device} :