home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-2 / Inter.Net 55-2.iso / Mandrake / mdkinst / usr / bin / perl-install / devices.pm < prev    next >
Encoding:
Perl POD Document  |  2000-01-12  |  3.0 KB  |  121 lines

  1. package devices;
  2.  
  3.  
  4.  
  5.  
  6. use common qw(:system :file);
  7. use run_program;
  8. use log;
  9. use c;
  10.  
  11. 1;
  12.  
  13.  
  14. sub size($) {
  15.     local *F;
  16.     sysopen F, $_[0], 0 or log::l("open $_[0]: $!"), return 0;
  17.  
  18.     my $valid_offset = sub { sysseek(F, $_[0], 0) && sysread(F, my $a, 1) };
  19.  
  20.     
  21.     my $size = 0;
  22.     ioctl(F, c::BLKGETSIZE(), $size) and return unpack("i", $size) * $common::SECTORSIZE;
  23.  
  24.     
  25.     my $low = 0;
  26.     my ($high, $mid);
  27.  
  28.     
  29.     for ($high = 1; $high > 0 && &$valid_offset($high); $high *= 2) { $low = $high; }
  30.  
  31.     while ($low < $high - 1) {
  32.     $mid = int ($low + $high) / 2;
  33.     &$valid_offset($mid) ? $low : $high = $mid;
  34.     }
  35.     $low + 1;
  36. }
  37.  
  38. sub make($) {
  39.     local $_ = my $file = $_[0];
  40.     my ($type, $major, $minor);
  41.  
  42.     if (m,^(.*/(?:dev|tmp))/(.*),) {
  43.     $_ = $2;
  44.     } else {
  45.     
  46.     unless (-f $file) {
  47.         $file = "/tmp/$_";
  48.         -e $file or $file = "/dev/$_";
  49.     }
  50.     }
  51.     -e $file and return $file; 
  52.  
  53.     if (/^sd(.)(\d{0,2})/) {
  54.     $type = c::S_IFBLK();
  55.     $major = 8;
  56.     $minor = 16 * (ord($1) - ord('a')) + ($2 || 0);
  57.     } elsif (/^hd(.)(\d{0,2})/) {
  58.     $type = c::S_IFBLK();
  59.     ($major, $minor) =
  60.         @{ $ {{'a' => [3, 0], 'b' => [3, 64],
  61.            'c' => [22,0], 'd' => [22,64],
  62.            'e' => [33,0], 'f' => [33,64],
  63.            'g' => [34,0], 'h' => [34,64],
  64.            }}{$1} or die "unknown device $_" };
  65.     $minor += $2 || 0;
  66.     } elsif (/^ram(.*)/) {
  67.     $type = c::S_IFBLK();
  68.     $major = 1;
  69.     $minor = $1 eq '' ? 1 : $1;
  70.     } elsif (m|^rd/c(\d+)d(\d+)(p(\d+))?|) {
  71.     # dac 960 "/rd/cXdXXpX"
  72.         $type = c::S_IFBLK();
  73.     $major = 48 + $1;
  74.     $minor = 8 * $2 + $4;
  75.     } elsif (m|ida/c(\d+)d(\d+)(p(\d+))?|) {
  76.     # Compaq Smart Array "ida/c0d0{p1}"
  77.     $type = c::S_IFBLK();
  78.     $major = 72 + $1;
  79.     $minor = 16 * $2 + ($4 || 0);
  80.     } elsif (/(.*)(\d+)$/) {
  81.         ($type, $major, $minor) =
  82.          @{ ${{"fd"     => [ c::S_IFBLK(), 2,  0 ],
  83.            "hidbp-mse-" => [ c::S_IFCHR(), 10, 32 ],
  84.            "lp"     => [ c::S_IFCHR(), 6,  0 ],
  85.            "md"     => [ c::S_IFBLK(), 9,  0 ],
  86.            "nst"    => [ c::S_IFCHR(), 9, 128],
  87.            "scd"    => [ c::S_IFBLK(), 11, 0 ],
  88.            "ttyS"   => [ c::S_IFCHR(), 4, 64 ],
  89.            }}{$1}};
  90.         $minor += $2;
  91.     }
  92.     unless ($type) {
  93.     ($type, $major, $minor) =
  94.          @{ ${{"aztcd"   => [ c::S_IFBLK(), 29, 0 ],
  95.            "bpcd"    => [ c::S_IFBLK(), 41, 0 ],
  96.            "cdu31a"  => [ c::S_IFBLK(), 15, 0 ],
  97.            "cdu535"  => [ c::S_IFBLK(), 24, 0 ],
  98.            "cm206cd" => [ c::S_IFBLK(), 32, 0 ],
  99.            "gscd"    => [ c::S_IFBLK(), 16, 0 ],
  100.            "mcd"     => [ c::S_IFBLK(), 23, 0 ],
  101.            "mcdx"    => [ c::S_IFBLK(), 20, 0 ],
  102.            "mem"     => [ c::S_IFCHR(), 1,  1 ],
  103.            "optcd"   => [ c::S_IFBLK(), 17, 0 ],
  104.            "psaux"   => [ c::S_IFCHR(), 10, 1 ],
  105.            "random"  => [ c::S_IFCHR(), 1,  8 ],
  106.            "sbpcd"   => [ c::S_IFBLK(), 25, 0 ],
  107.            "sjcd"    => [ c::S_IFBLK(), 18, 0 ],
  108.            "tty"     => [ c::S_IFCHR(),  5, 0 ],
  109.            "usbmouse"=> [ c::S_IFCHR(), 10, 32], 
  110.            "zero"    => [ c::S_IFCHR(), 1,  5 ],             
  111.            }}{$_} or die "unknown device $_" };
  112.     }
  113.  
  114.     
  115.     mkdir dirname($file), 0755;
  116.  
  117.     syscall_('mknod', $file, $type | 0600, makedev($major, $minor)) or die "mknod failed (dev $_): $!";
  118.  
  119.     $file;
  120. }
  121.