This commit was manufactured by cvs2svn to create tag
[opensuse:installation-images.git] / lib / Conv2Image.pm
1 #! /usr/bin/perl
2
3 # Usage:
4 #
5 #   use Conv2Image;
6 #
7 #   exported functions:
8 #     Conv2Image();
9
10
11 =head1 Conv2Image
12
13 =cut
14
15
16 require Exporter;
17 @ISA = qw ( Exporter );
18 @EXPORT = qw ( Conv2Image );
19
20 use strict 'vars';
21 use integer;
22
23 sub Conv2Image
24 {
25   my (
26     $image, $dir, $fs, $x_k, $x_inodes, $c_k, $c_inodes, $blk_size, $blks,
27     $ublks, $inds, $uinds, $tmp_k, $tmp_inodes, $cnt, $size, $name, $mkcramfs
28   );
29
30   ($image, $dir, $fs, $c_k, $c_inodes, $x_k, $x_inodes) = @_;
31
32   $cnt = 1;
33
34   SUSystem "umount /mnt 2>/dev/null";
35
36   if($fs eq 'cramfs') {
37     $mkcramfs = "/usr/bin/mkcramfs" if -x "/usr/bin/mkcramfs";
38     $mkcramfs = "/sbin/mkfs.cramfs" if -x "/sbin/mkfs.cramfs";
39
40     die "$Script: no mkfs.cramfs\n" unless $mkcramfs;
41
42     SUSystem "rm -f $image";
43     system "touch $image";      # just to ensure the image gets the correct owner
44     SUSystem "sh -c '$mkcramfs $dir $image >$image.cramfs.log'" and die "$Script: mkfs.cramfs failed";
45     $size = -s $image;
46     die "$Script: no image?" if $size == 0;
47     $name = $image;
48     $name =~ s#^.*/##;
49     die "$Script: strange image name" if $name eq "";
50     $name .= " " . ($size >> 10);
51     SUSystem "pcramfs '$name' $image" and die "$Script: pcramfs failed";
52     return;
53   }
54
55   if($fs eq 'minix' && !-x('/sbin/mkfs.minix')) {
56     $fs = 'ext2';
57     print STDERR "WARNING: no support for minix fs; using ext2!\n"
58   }
59
60   while($cnt <= 2) {
61 #    print ">>$c_k, $c_inodes\n";
62     ( $tmp_k, $blk_size, $tmp_inodes ) = $fs eq 'minix' ? MakeMinixImage($image, $c_k, $c_inodes) : MakeExt2Image($image, $c_k, $c_inodes);
63
64     die "$Script: failed to create a $fs fs on \"$image\"" unless $tmp_inodes;
65
66     print STDERR "$Script: Warning: inode number much smaller than expected ($tmp_inodes < $c_inodes)!\n" if $tmp_inodes < $c_inodes - 100;
67
68 #    printf "$Script: created ${cnt}. image \"%s\": %u kbyte, %u inodes\n", $image, $tmp_k, $tmp_inodes;
69     if($cnt == 2) {
70       printf "$Script: created \"%s\": %u kbyte, %u inodes\n", $image, $tmp_k, $tmp_inodes;
71     }
72
73     SUSystem "mount -oloop $image /mnt" and die "$Script: mount failed";
74
75     # copy everything
76     if(SUSystem "sh -c 'tar -C $dir -cf - . | tar -C /mnt -xpf -'") {
77       SUSystem "umount /mnt" and warn "$Script: umount failed";
78       die "$Script: could not add all files to image";
79     }
80
81     # check the current disk usage
82     for ( `df -Pk /mnt 2>/dev/null` ) {
83       ($blks, $ublks) = ($1, $2) if /^\S+\s+(\d+)\s+(\d+)/;
84     }
85
86     for ( `df -Pki /mnt 2>/dev/null` ) {
87       ($inds, $uinds) = ($1, $2) if /^\S+\s+(\d+)\s+(\d+)/;
88     }
89
90     # unmount it
91     SUSystem "umount /mnt" and die "$Script: umount failed";
92
93 #    print "$Script: $image: ${ublks}k/${blks}k used ($uinds/$inds inodes)\n";
94
95     $c_k += $x_k - ($blks - $ublks);
96     $c_inodes += $x_inodes - ($inds - $uinds);
97
98     $cnt++;
99   }
100
101   print "$Script: $image: ${ublks}k/${blks}k used ($uinds/$inds inodes)\n";
102 }
103
104 1;