summaryrefslogtreecommitdiffstats
path: root/perl-install/devices.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/devices.pm')
-rw-r--r--perl-install/devices.pm106
1 files changed, 70 insertions, 36 deletions
diff --git a/perl-install/devices.pm b/perl-install/devices.pm
index 704b3d40d..a91e60ae9 100644
--- a/perl-install/devices.pm
+++ b/perl-install/devices.pm
@@ -1,4 +1,4 @@
-package devices;
+package devices; # $Id$
use diagnostics;
use strict;
@@ -17,15 +17,15 @@ sub size($) {
my $valid_offset = sub { sysseek(F, $_[0], 0) && sysread(F, my $a, 1) };
- # first try getting the size nicely
+ #- first try getting the size nicely
my $size = 0;
ioctl(F, c::BLKGETSIZE(), $size) and return unpack("i", $size) * $common::SECTORSIZE;
- # sad it didn't work, well searching the size using the dichotomy algorithm!
+ #- sad it didn't work, well searching the size using the dichotomy algorithm!
my $low = 0;
my ($high, $mid);
- # first find n where 2^n < size <= 2^n+1
+ #- first find n where 2^n < size <= 2^n+1
for ($high = 1; $high > 0 && &$valid_offset($high); $high *= 2) { $low = $high; }
while ($low < $high - 1) {
@@ -35,73 +35,107 @@ sub size($) {
$low + 1;
}
-sub make($) {
- local $_ = my $file = $_[0];
- my ($type, $major, $minor);
+sub set_loop {
+ my ($file) = @_;
- unless (s,^/(dev|tmp)/,,) {
- $file = -e "/dev/$file" ? "/dev/$file" : "/tmp/$file";
+ foreach (0..7) {
+ local *F;
+ my $dev = make("loop$_");
+ sysopen F, $dev, 2 or next;
+ !ioctl(F, c::LOOP_GET_STATUS(), my $tmp) && $! == 6 or next; #- 6 == ENXIO
+ log::l("trying with loop $dev");
+ return c::set_loop(fileno F, $file) && $dev;
}
+}
- -e $file and return $file; # assume nobody takes fun at creating files named as device
+sub entry {
+ my ($type, $major, $minor);
+ local ($_) = @_;
- if (/^sd(.)(\d\d)/) {
+ if (/^sd(.)(\d{0,2})/) {
$type = c::S_IFBLK();
$major = 8;
- $minor = ord($1) - ord('a') + $2;
+ $minor = 16 * (ord($1) - ord('a')) + ($2 || 0);
} elsif (/^hd(.)(\d{0,2})/) {
$type = c::S_IFBLK();
- ($major, $minor) =
+ ($major, $minor) =
@{ $ {{'a' => [3, 0], 'b' => [3, 64],
'c' => [22,0], 'd' => [22,64],
'e' => [33,0], 'f' => [33,64],
'g' => [34,0], 'h' => [34,64],
}}{$1} or die "unknown device $_" };
$minor += $2 || 0;
- } elsif (/^ram(.)/) {
+ } elsif (/^ram(.*)/) {
$type = c::S_IFBLK();
$major = 1;
$minor = $1 eq '' ? 1 : $1;
} elsif (m|^rd/c(\d+)d(\d+)(p(\d+))?|) {
- # dac 960 "/rd/cXdXXpX"
+ # dac 960 "rd/cXdXXpX"
$type = c::S_IFBLK();
$major = 48 + $1;
$minor = 8 * $2 + $4;
- } elsif (m|ida/c(\d+)d(\d+)(p(\d+))|) {
+ } elsif (m|ida/c(\d+)d(\d+)(p(\d+))?|) {
# Compaq Smart Array "ida/c0d0{p1}"
$type = c::S_IFBLK();
$major = 72 + $1;
- $minor = 16 * $2 + $4;
- } else {
- ($type, $major, $minor) =
- @{ $ {{"aztcd" => [ c::S_IFBLK(), 29, 0 ],
+ $minor = 16 * $2 + ($4 || 0);
+ } elsif (/(.*)(\d+)$/) {
+ ($type, $major, $minor) =
+ @{ ${{"fd" => [ c::S_IFBLK(), 2, 0 ],
+ "hidbp-mse-" => [ c::S_IFCHR(), 10, 32 ],
+ "lp" => [ c::S_IFCHR(), 6, 0 ],
+ "usb/lp" => [ c::S_IFCHR(), 180, 0 ],
+ "loop" => [ c::S_IFBLK(), 7, 0 ],
+ "md" => [ c::S_IFBLK(), 9, 0 ],
+ "nst" => [ c::S_IFCHR(), 9, 128],
+ "scd" => [ c::S_IFBLK(), 11, 0 ],
+ "ttyS" => [ c::S_IFCHR(), 4, 64 ],
+ }}{$1}};
+ $minor += $2;
+ }
+ unless ($type) {
+ ($type, $major, $minor) =
+ @{ ${{"aztcd" => [ c::S_IFBLK(), 29, 0 ],
"bpcd" => [ c::S_IFBLK(), 41, 0 ],
"cdu31a" => [ c::S_IFBLK(), 15, 0 ],
"cdu535" => [ c::S_IFBLK(), 24, 0 ],
"cm206cd" => [ c::S_IFBLK(), 32, 0 ],
- "tty" => [ c::S_IFCHR(), 5, 0 ],
- "fd0" => [ c::S_IFBLK(), 2, 0 ],
- "fd1" => [ c::S_IFBLK(), 2, 1 ],
"gscd" => [ c::S_IFBLK(), 16, 0 ],
- "lp0" => [ c::S_IFCHR(), 6, 0 ],
- "lp1" => [ c::S_IFCHR(), 6, 1 ],
- "lp2" => [ c::S_IFCHR(), 6, 2 ],
"mcd" => [ c::S_IFBLK(), 23, 0 ],
"mcdx" => [ c::S_IFBLK(), 20, 0 ],
- "nst0" => [ c::S_IFCHR(), 9, 128 ],
+ "mem" => [ c::S_IFCHR(), 1, 1 ],
"optcd" => [ c::S_IFBLK(), 17, 0 ],
+ "kbd" => [ c::S_IFCHR(), 11, 0 ],
+ "psaux" => [ c::S_IFCHR(), 10, 1 ],
+ "random" => [ c::S_IFCHR(), 1, 8 ],
"sbpcd" => [ c::S_IFBLK(), 25, 0 ],
- "scd0" => [ c::S_IFBLK(), 11, 0 ],
- "scd1" => [ c::S_IFBLK(), 11, 1 ],
"sjcd" => [ c::S_IFBLK(), 18, 0 ],
- }}{$_} or die "unknown device $type" };
+ "tty" => [ c::S_IFCHR(), 5, 0 ],
+ "usbmouse"=> [ c::S_IFCHR(), 13, 63], #- aka /dev/input/mice
+ "zero" => [ c::S_IFCHR(), 1, 5 ],
+ }}{$_} or die "unknown device $_ (caller is " . join(":", caller()) . ")" };
}
-
- # make a directory for this inode if needed.
- mkdir dirname($file), 0755;
-
- syscall_('mknod', $file, $type | 0600, makedev($major, $minor)) or die "mknod failed (dev:$_): $!";
+ ($type, $major, $minor);
+}
+
+
+sub make($) {
+ local $_ = my $file = $_[0];
+
+ if (m,^(.*/(?:dev|tmp))/(.*),) {
+ $_ = $2;
+ } else {
+ -e $file or $file = "/tmp/$_";
+ -e $file or $file = "/dev/$_";
+ }
+ -e $file and return $file; #- assume nobody takes fun at creating files named as device
+
+ my ($type, $major, $minor) = entry($_);
+
+ #- make a directory for this inode if needed.
+ mkdir dirname($file), 0755;
+
+ syscall_('mknod', $file, $type | 0600, makedev($major, $minor)) or die "mknod failed (dev $_): $!";
$file;
}
-