From 8e26dbb360b8cb3ec5373f685abbeb83c5f98551 Mon Sep 17 00:00:00 2001 From: codehelp Date: Mon, 31 May 2010 17:17:06 +0000 Subject: [PATCH] Extend device table format to support creating symlinks and hardlinks. git-svn-id: http://emdebian.org/svn/current@7259 563faec7-e20c-0410-992a-a66f704d0ccd --- debian/changelog | 4 +- debian/copyright | 1 + device-table.pl | 96 +++++++++++++++++++++++++++++---------- examples/device_table.txt | 12 ++++- 4 files changed, 88 insertions(+), 25 deletions(-) diff --git a/debian/changelog b/debian/changelog index 452c4ba..ec6ea75 100644 --- a/debian/changelog +++ b/debian/changelog @@ -12,8 +12,10 @@ multistrap (2.1.5) unstable; urgency=low * When moving downloaded packages to a sourcedir, also download the source packages for GPL compliance. * Handle fakeroot with native architectures. + * Extend device table format to support creating symlinks and + hardlinks. - -- Neil Williams Fri, 28 May 2010 22:07:18 +0100 + -- Neil Williams Mon, 31 May 2010 18:15:06 +0100 multistrap (2.1.4) unstable; urgency=low diff --git a/debian/copyright b/debian/copyright index 5f3aee4..ba67c0b 100644 --- a/debian/copyright +++ b/debian/copyright @@ -11,6 +11,7 @@ Copyright: Copyright 2006-2010 Neil Williams Copyright 2008 Hands.com Ltd Copyright 2006-2007 Wookey Copyright 2001-2006 Junichi Uekawa + Copyright 2001-2002 Erik Andersen License: diff --git a/device-table.pl b/device-table.pl index 0548fe2..cb019a8 100755 --- a/device-table.pl +++ b/device-table.pl @@ -35,8 +35,12 @@ $file = "/usr/share/multistrap/device-table.txt"; $dir = `pwd`; chomp ($dir); $dir .= "/tmp/"; -$fakeroot = "fakeroot"; - +my $e=`LC_ALL=C printenv`; +if ($e !~ /\nFAKEROOTKEY=[0-9]+\n/) { + $fakeroot = "fakeroot"; +} else { + $fakeroot=""; +} while( @ARGV ) { $_= shift( @ARGV ); last if m/^--$/; @@ -68,35 +72,56 @@ while( @ARGV ) { $msg = sprintf (_g("Need a configuration file - use %s -f\n"), $progname); die ($msg) if (not -f $file); - -my $ret = 0; -$ret = mkdir ("$dir") if (not -d "$dir"); -$dir = `realpath $dir`; -chomp ($dir); -$dir .= ($dir =~ m:/$:) ? '' : "/"; - printf (_g("%s %s using %s\n"), $progname, $ourversion, $file); open (TABLE, "<", $file) or die ("$file: $!\n"); @list=; close (TABLE); + +my $ret = 0; +if (not defined $dry) { + $ret = mkdir ("$dir") if (not -d "$dir"); + $dir = `realpath $dir`; + chomp ($dir); + $dir .= ($dir =~ m:/$:) ? '' : "/"; + chdir ($dir); +} else { + push @seq, "mkdir $dir"; + push @seq, "cd $dir"; +} + foreach $line (@list) { chomp ($line); next if ($line =~ /^#/); next if ($line =~ /^$/); @cmd = split (/\t/, $line); - next if ($cmd[2] eq "d"); + next if (not defined $cmd[1]); + next if (scalar @cmd != 10); + if ($cmd[1] eq "s") { + push @seq, "ln -s $cmd[0] $cmd[2]"; + next; + } + if ($cmd[1] eq "h") { + push @seq, "ln $cmd[0] $cmd[2]"; + next; + } + if ($cmd[1] eq "d"){ + push @seq, "mkdir -m $cmd[2] -p .$cmd[0]"; + next; + } if ($cmd[9] =~ /-/) { - push @seq, "mknod -m $cmd[2] $cmd[0] $cmd[1] $cmd[5] $cmd[6]"; - push @seq, "chown $cmd[3]:$cmd[4] $cmd[0]"; + push @seq, "mknod .$cmd[0] $cmd[1] $cmd[5] $cmd[6]"; + push @seq, "chmod $cmd[2] .$cmd[0]"; + push @seq, "chown $cmd[3]:$cmd[4] .$cmd[0]"; } else { for ($i = 0; $i < $cmd[9]; $i += $cmd[8]) { - push @seq, "mknod -m $cmd[2] $cmd[0]$i $cmd[1] $cmd[5] $i"; - push @seq, "chown $cmd[3]:$cmd[4] $cmd[0]$i"; + push @seq, "mknod .$cmd[0]$i $cmd[1] $cmd[5] $i"; + push @seq, "chmod $cmd[2] .$cmd[0]$i"; + push @seq, "chown $cmd[3]:$cmd[4] .$cmd[0]$i"; } } } @@ -107,8 +132,6 @@ if (defined $dry) } else { - chdir ("$dir"); - system ("pwd"); foreach my $node (@seq) { system ("$fakeroot $node"); @@ -116,7 +139,7 @@ else } sub our_version { - my $query = `dpkg-query -W -f='\${Version}' multistrap`; + my $query = `dpkg-query -W -f='\${Version}' multistrap 2>/dev/null`; (defined $query) ? return $query : return "0.0.9"; } @@ -124,7 +147,7 @@ sub usageversion { printf STDERR (_g(" %s version %s - %s [-d DIR] [-f FILE] + %s [-n|--dry-run] [-d DIR] [-f FILE] %s -?|-h|--help|--version "), $progname, $ourversion, $progname, $progname); } @@ -141,21 +164,48 @@ device-table.pl - parses simple device tables and passes to mknod =head1 Synopsis - device-table.pl [-d DIR] [-f FILE] + device-table.pl [-n|--dry-run] [-d DIR] [-f FILE] device-table.pl -?|-h|--help|--version =head1 Options -By default, device-table.pl writes out the device nodes in the current +By default, F writes out the device nodes in the current working directory. Use the directory option to write out elsewhere. multistrap contains a default device-table file, use the file option -to override the default /usr/share/multistrap/device-table.txt +to override the default F Use the dry-run option to see the commands that would be run. -Device nodes needs fakeroot or another way to use root access. If -device-table.pl is already being run under fakeroot or equivalent, +Device nodes need fakeroot or another way to use root access. If +F is already being run under fakeroot or equivalent, +the existing fakeroot session will be used, alternatively, use the no-fakeroot option to drop the internal fakeroot usage. +Note that fakeroot does not support changing the actual ownerships, +for that, run the final packing into a tarball under fakeroot as well, +or use C when running F + +=head1 Device table format + +Device table files are tab separated value files (TSV). All lines in the +device table must have exactly 10 entries, each separated by a single +tab, except comments - which must start with # + +Device table entries take the form of: + + + +where name is the file name, type can be one of: + + f A regular file + d Directory + s symlink + h hardlink + c Character special device file + b Block special device file + p Fifo (named pipe) + +See http://wiki.debian.org/DeviceTableScripting + =cut diff --git a/examples/device_table.txt b/examples/device_table.txt index 74fdc56..68b6bc6 100644 --- a/examples/device_table.txt +++ b/examples/device_table.txt @@ -11,12 +11,19 @@ # where name is the file name, type can be one of: # f A regular file # d Directory +# s symlink +# h hardlink # c Character special device file # b Block special device file # p Fifo (named pipe) # uid is the user id for the target file, gid is the group id for the # target file. The rest of the entried apply only to device special # file. +# For a symlink or hardlink, specify the target name: +# /dev/random s urandom - - - - - - - +# mode (or the other fields) make no sense with links +# For a directory, specify the mode, uid and gid +# /dev/mtdblock d 755 0 0 - - - - - # When building a target filesystem, it is desirable to not have to # become root and then run 'mknod' a thousand times. Using a device @@ -29,10 +36,13 @@ # # Have fun # -Erik Andersen +# extended to support links +# -Neil Williams # +# All lines must have exactly 10 entries, except comments # -/dev d 755 0 0 - - - - - +/dev d 755 0 0 - - - - - /dev/mem c 640 0 0 1 1 0 0 - /dev/kmem c 640 0 0 1 2 0 0 - /dev/null c 640 0 0 1 3 0 0 -