]> err.no Git - dpkg/commitdiff
configure.in: generate doc/sv/Makefile as well
authorWichert Akkerman <wakkerma@debian.org>
Mon, 12 Jun 2000 16:17:41 +0000 (16:17 +0000)
committerWichert Akkerman <wakkerma@debian.org>
Mon, 12 Jun 2000 16:17:41 +0000 (16:17 +0000)
main/filesdb.c: fix logic when reading statusoverride-file
scripts/.cvsignore: add all the perl scripts
scripts/dpkg-divert.pl:
+ turn $admindir into $dpkglibdir, which the Makefile will handle
+ fix glob->regexp logic for --list
scripts/Makefile.in:
+ replace one `sed' with `$(SED)'
+ add dpkg-statoverride
scripts/dpkg-statoverride.pl: new util to manage statoverrides
debian/rules: move Swedish manpages into the package as well

19 files changed:
ChangeLog
configure.in
debian/rules
main/archives.c
main/filesdb.c
po/cs.po
po/dpkg.pot
po/en.po
po/es.po
po/fr.po
po/it.po
po/ja.po
po/pl.po
po/ru.po
po/sv.po
scripts/.cvsignore
scripts/Makefile.in
scripts/dpkg-divert.pl
scripts/dpkg-statoverride.pl [new file with mode: 0755]

index 298dc98127471d6db36970c53acfec1e87669128..ff7cfa28d7deb17cf22f61ec6a5ede1644afc328 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+Mon Jun 12 16:35:26 CEST 2000 Wichert Akkerman <wakkerma@debian.org>
+
+  * configure.in: generate doc/sv/Makefile as well
+  * main/filesdb.c: fix logic when reading statusoverride-file
+  * scripts/.cvsignore: add all the perl scripts
+  * scripts/dpkg-divert.pl:
+    + turn $admindir into $dpkglibdir, which the Makefile will handle
+    + fix glob->regexp logic for --list
+  * scripts/Makefile.in: 
+    + replace one `sed' with `$(SED)'
+    + add dpkg-statoverride
+  * scripts/dpkg-statoverride.pl: new util to manage statoverrides
+  * debian/rules: move Swedish manpages into the package as well
+
 Fri Jun  9 15:52:28 CEST 2000 Wichert Akkerman <wakkerma@debian.org>
 
   * Merge things from the potato branch:
index ba0abed0bd798e110cf4aedefe1ebbcc6ad67574..6795061e2acea58b48fee4f4e7a2a0c16669581d 100644 (file)
@@ -143,6 +143,7 @@ lib/Makefile
 optlib/Makefile
 doc/Makefile
 doc/ja/Makefile
+doc/sv/Makefile
 scripts/Makefile
 main/Makefile
 dselect/Makefile
index 22a144dd08708fabebb59c70e9e225a08bda8cc2..d91bafe2242bb76d8e4de5f8b85bf5eb5eba6b3b 100755 (executable)
@@ -89,7 +89,7 @@ binary-dpkg: stamp-binary
        set -e ; for i in ChangeLog THANKS TODO copyright ; do \
                mv $(TMP)/usr/share/doc/dpkg/$$i $(TMP_DPKG)/usr/share/doc/dpkg/ ; \
        done
-       set -e ; for i in "" ja ; do \
+       set -e ; for i in "" ja sv ; do \
                install -d -m 755 -o root -g root $(TMP_DPKG)/usr/share/man/$$i/man1 ; \
                for m in md5sum.1 dpkg-deb.1 ; do \
                        if [ -f $(TMP)/usr/share/man/$$i/man1/$$m ] ; then \
@@ -147,7 +147,7 @@ binary-dpkg-dev: stamp-binary
                dpkg-parsechangelog ; do \
                mv $(TMP)/usr/bin/$$i $(TMP_DPKG_DEV)/usr/bin/ ; \
        done
-       set -e ; for i in "" ja ; do \
+       set -e ; for i in "" ja sv ; do \
                install -d -m 755 -o root -g root $(TMP_DPKG_DEV)/usr/share/man/$$i/man1 ; \
                for m in dpkg-name.1 dpkg-source.1 822-date.1 dpkg-architecture.1 \
                        dpkg-buildpackage.1 dpkg-distaddfile.1 dpkg-genchanges.1 \
index 6ff310e70c1794673d73b6b73a3c768de2414a3d..0e87865bbde8eed644fc94e386b8c112dbc6dc88 100644 (file)
@@ -3,6 +3,7 @@
  * archives.c - actions that process archive files, mainly unpack
  *
  * Copyright (C) 1994,1995 Ian Jackson <iwj10@cus.cam.ac.uk>
+ * Copyright (C) 2000 Wichert Akkerman <wakkerma@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as
index 0702ddea0e134ebd8afd9839db6ce42ff329006d..182e130d4f99d02dd51bba71a3634529bdc61481 100644 (file)
@@ -3,6 +3,7 @@
  * filesdb.c - management of database of files installed on system
  *
  * Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
+ * Copyright (C) 2000 Wichert Akkerman <wakkerma@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as
@@ -338,13 +339,15 @@ void ensure_statoverrides(void) {
   if (!file) {
     if (errno != ENOENT) ohshite(_("failed to open statoverride file"));
     if (!statoverridefile) { onerr_abort--; return; }
-  } else if (statoverridefile) {
-    if (fstat(fileno(statoverridefile),&stab1))
-      ohshite(_("failed to fstat previous statoverride file"));
+  } else {
     if (fstat(fileno(file),&stab2))
       ohshite(_("failed to fstat statoverride file"));
-    if (stab1.st_dev == stab2.st_dev && stab1.st_ino == stab2.st_ino) {
-      fclose(file); onerr_abort--; return;
+    if (statoverridefile) {
+      if (fstat(fileno(statoverridefile),&stab1))
+       ohshite(_("failed to fstat previous statoverride file"));
+      if (stab1.st_dev == stab2.st_dev && stab1.st_ino == stab2.st_ino) {
+       fclose(file); onerr_abort--; return;
+      }
     }
   }
   if (statoverridefile) fclose(statoverridefile);
@@ -352,12 +355,12 @@ void ensure_statoverrides(void) {
 
   push_cleanup(cu_closefile,ehflag_bombout, 0,0,1,(void*)file);
 
-  loaded_list = nfmalloc(stab1.st_size);
-  loaded_list_end = loaded_list + stab1.st_size;
+  loaded_list = nfmalloc(stab2.st_size);
+  loaded_list_end = loaded_list + stab2.st_size;
   readden=0;
-  while (readden<stab1.st_size) {
+  while (readden<stab2.st_size) {
     bytes = read(fileno(file),
-       loaded_list + readden, stab1.st_size - readden);
+       loaded_list + readden, stab2.st_size - readden);
     if (bytes < 0) {
       if (errno == EINTR) continue;
       ohshite("unable to read statoverride file `%.250s'",vb.buf);
index 41bc749f8c8c7d86d4262a48c112103bcd405453..f8c0e2b7f338991571e5c04bbdf75910984424f3 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -8,7 +8,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: dpkg 1.6.13\n"
-"POT-Creation-Date: 2000-06-09 16:31+0200\n"
+"POT-Creation-Date: 2000-06-12 16:12+0200\n"
 "PO-Revision-Date: 2000-04-21 14:11+02:00\n"
 "Last-Translator: Petr Cech <cech@debian.org>\n"
 "Language-Team: Czech <cs@li.org>\n"
index 86fc795c528ab200799b16c091ddc27a16876842..7cc84f3f6abcef2bb723b80b8cca2bf08b0879c8 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-06-09 16:31+0200\n"
+"POT-Creation-Date: 2000-06-12 14:26+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index 19aa13f5aef54abbf08a66ac08610966916846a3..b5b12c8135363336f23f8c9a574bbdb9fb8d55e0 100644 (file)
--- a/po/en.po
+++ b/po/en.po
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-06-09 16:31+0200\n"
+"POT-Creation-Date: 2000-06-12 16:12+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index 49d8cbbbf2a2418d572ef8a07cf7ebe3d71f7921..56995163fedda5bdc19aad66dfabe27269367d82 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -9,7 +9,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: Debian dpkg 1.6.13\n"
-"POT-Creation-Date: 2000-06-09 16:31+0200\n"
+"POT-Creation-Date: 2000-06-12 16:12+0200\n"
 "PO-Revision-Date: 2000-04-23 23:50+0200\n"
 "Last-Translator: Santiago Vila <sanvila@debian.org>\n"
 "Language-Team: Spanish <debian-l10n-spanish@lists.debian.org>\n"
index b96d9279fc63485abd74388023221e831481c41c..dd10d476cf78953986a7bc1771c4dd0cb03f09bf 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -19,7 +19,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: Debian dpkg 1.6.13\n"
-"POT-Creation-Date: 2000-06-09 16:31+0200\n"
+"POT-Creation-Date: 2000-06-12 16:12+0200\n"
 "PO-Revision-Date: 2000-04-29 00:48+02:00\n"
 "Last-Translator: Jérôme Marant <jerome.marant@free.fr>\n"
 "Language-Team: French\n"
index 55868ac2ac42aef6400a8c6ee07c91ad5851f213..a346e49cc97eed21317a8cd38ec9802079f1c3ca 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -37,7 +37,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: dpkg 1.6.13\n"
-"POT-Creation-Date: 2000-06-09 16:31+0200\n"
+"POT-Creation-Date: 2000-06-12 16:12+0200\n"
 "PO-Revision-Date: 2000-05-24 01:19+02:00\n"
 "Last-Translator: Lele Gaifax <lele@seldati.it>\n"
 "Language-Team: italian <li@li.org>\n"
index a7978916e4750f019f3d19bdc60b94fbb0a2aae4..b737a404cccaeff8cbe8e244a64842cd35f501fb 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -17,7 +17,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: 1.6.7\n"
-"POT-Creation-Date: 2000-06-09 16:31+0200\n"
+"POT-Creation-Date: 2000-06-12 16:12+0200\n"
 "PO-Revision-Date: 2000-03-04 14:39+09:00\n"
 "Last-Translator: Keita Maehara <maehara@debian.org>\n"
 "Language-Team: Debian Japanease List <debian-japanese@lists.debian.org>\n"
index afdbcfb2384449f775a9997359d31f3a3e5843f8..4d1a3facfdf9881d4c6d3a5984c934f44560826b 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: dpkg 1.6.12\n"
-"POT-Creation-Date: 2000-06-09 16:31+0200\n"
+"POT-Creation-Date: 2000-06-12 16:12+0200\n"
 "PO-Revision-Date: 2000-04-19 16:44+0100\n"
 "Last-Translator: Piotr Roszatycki <dexter@debian.org>\n"
 "Language-Team: Polish\n"
index 0de523b374a015d2dcc01ffb07b4607ef2098289..7a28c83895f37367bc8086f8eaf540df6e5044f2 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: dpkg 1.6.5\n"
-"POT-Creation-Date: 2000-06-09 16:31+0200\n"
+"POT-Creation-Date: 2000-06-12 16:12+0200\n"
 "PO-Revision-Date: $Date$\n"
 "Last-Translator: Michael Sobolev <mss@transas.com>\n"
 "Language-Team: ru <debian-russian@lists.debian.org>\n"
index bc75bbcc90f5a6e4d2c881a0844a3339bc329c36..e949463db38a4d7f754d3c9d078f28dfacf120fc 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: dpkg 1.6.12\n"
-"POT-Creation-Date: 2000-06-09 16:31+0200\n"
+"POT-Creation-Date: 2000-06-12 16:12+0200\n"
 "PO-Revision-Date: 2000-05-16 20:28+0200\n"
 "Last-Translator: Peter Karlsson <peter@softwolves.pp.se>\n"
 "MIME-Version: 1.0\n"
index 8d678982c7e8179306eab0fd1992d598a1f88791..8e985cea346cd6398d3b72f3b3e3fbe64990a995 100644 (file)
@@ -1,2 +1,20 @@
 Makefile.in
 elisp-comp
+822-date
+cl-debian
+cleanup-info
+controllib
+dpkg-architecture
+dpkg-distaddfile
+dpkg-divert
+dpkg-genchanges
+dpkg-gencontrol
+dpkg-parsechangelog
+dpkg-scanpackages
+dpkg-scansources
+dpkg-shlibdeps
+dpkg-source
+dpkg-statoverride
+install-info
+update-alternatives
+update-rc.d
index db49dd263ff9376e547cd100beaea6fc17054337..1a437dc967b612d2dfdd0d0f8aa5aa591ba0b557 100644 (file)
@@ -10,7 +10,7 @@ BIN_SCRIPTS           = dpkg-name dpkg-source dpkg-genchanges \
                          dpkg-scanpackages dpkg-scansources dpkg-architecture
 
 SBIN_SCRIPTS           = update-rc.d update-alternatives install-info \
-                         dpkg-divert cleanup-info
+                         dpkg-divert dpkg-statoverride cleanup-info
 
 MAN1PAGES              = dpkg-name.1 dpkg-source.1 822-date.1 dpkg-architecture.1
 MAN8PAGES              = update-rc.d.8 update-alternatives.8 install-info.8  \
@@ -62,7 +62,7 @@ install-program:
        $(mkinstalldirs) $(DESTDIR)/$(parsechangelogdir)
        set -e ; for i in $(CHANGELOG_PARSERS) ; do \
                if test -f $$i ; then d= ; else d="$(srcdir)/" ; fi ; \
-               rn=`echo $$i | sed -e 's/^cl-//'` ; \
+               rn=`echo $$i | $(SED) -e 's/^cl-//'` ; \
                $(INSTALL_SCRIPT) $$d$$i $(DESTDIR)/$(parsechangelogdir)/$$rn ; \
        done
        $(mkinstalldirs) $(DESTDIR)/$(dpkglibdir)
index aa456684a30d83f35e2dcdf224b254607c13620d..7b68d61c75310578cca31352680730c3b626fe24 100755 (executable)
@@ -5,15 +5,21 @@ sub ENOENT { 2; }
 # Sorry about this, but the errno-part of POSIX.pm isn't in perl-*-base
 
 $version= '1.0.11'; # This line modified by Makefile
+$dpkglibdir= "."; # This line modified by Makefile
+
 sub showversion {
     print("Debian GNU/Linux dpkg-divert $version.\n") || &quit("failed to write version: $!");
 }
 
 sub usage {
     &showversion;
-    print(STDOUT <<END)
-Copyright (C) 1995 Ian Jackson.  This is free software; see the GNU General
-Public Licence version 2 or later for copying conditions. There is NO warranty.
+    print(STDERR <<END)
+"Debian dpkg-divert $version.
+Copyright (C) 1995 Ian Jackson.
+Copyright (C) 2000 Wichert Akkerman
+
+This is free software; see the GNU General Public Licence version 2 or later
+for copying conditions. There is NO warranty.
 
 Usage:
 
@@ -40,7 +46,6 @@ END
         || &quit("failed to write usage: $!");
 }
 
-$admindir= '/var/lib/dpkg';
 $testmode= 0;
 $dorename= 0;
 $verbose= 1;
@@ -88,7 +93,7 @@ while (@ARGV) {
         $divertto =~ m/\n/ && &badusage("package may not contain newlines");
     } elsif (m/^--admindir$/) {
         @ARGV || &badusage("--admindir needs a directory argument");
-        $admindir= shift(@ARGV);
+        $dpkglibdir= shift(@ARGV);
     } else {
         &badusage("unknown option \`$_'");
     }
@@ -96,7 +101,7 @@ while (@ARGV) {
 
 $mode='add' unless $mode;
 
-open(O,"$admindir/diversions") || &quit("cannot open diversions: $!");
+open(O,"$dpkglibdir/diversions") || &quit("cannot open diversions: $!");
 while(<O>) {
     s/\n$//; push(@contest,$_);
     $_=<O>; s/\n$// || &badfmt("missing altname");
@@ -165,7 +170,7 @@ if ($mode eq 'add') {
         s/\\\*/.*/g;
         push(@list,"^$_\$");
     }
-    $pat= join('$|^',@list);
+    $pat= join('|',@list);
     for ($i=0; $i<=$#contest; $i++) {
         next unless ($contest[$i] =~ m/$pat/o ||
                      $altname[$i] =~ m/$pat/o ||
@@ -229,18 +234,18 @@ sub dorename {
     
 sub save {
     return if $testmode;
-    open(N,"> $admindir/diversions-new") || &quit("create diversions-new: $!");
-    chmod 0644, "$admindir/diversions-new";
+    open(N,"> $dpkglibdir/diversions-new") || &quit("create diversions-new: $!");
+    chmod 0644, "$dpkglibdir/diversions-new";
     for ($i=0; $i<=$#contest; $i++) {
         print(N "$contest[$i]\n$altname[$i]\n$package[$i]\n")
             || &quit("write diversions-new: $!");
     }
     close(N) || &quit("close diversions-new: $!");
-    unlink("$admindir/diversions-old") ||
+    unlink("$dpkglibdir/diversions-old") ||
         $! == &ENOENT || &quit("remove old diversions-old: $!");
-    link("$admindir/diversions","$admindir/diversions-old") ||
+    link("$dpkglibdir/diversions","$dpkglibdir/diversions-old") ||
         $! == &ENOENT || &quit("create new diversions-old: $!");
-    rename("$admindir/diversions-new","$admindir/diversions")
+    rename("$dpkglibdir/diversions-new","$dpkglibdir/diversions")
         || &quit("install new diversions: $!");
 }
 
@@ -249,4 +254,4 @@ sub infon { &infol($contest[$i],$altname[$i],$package[$i]); }
 
 sub quit { print STDERR "dpkg-divert: @_\n"; exit(2); }
 sub badusage { print STDERR "dpkg-divert: @_\n\n"; print("You need --help.\n"); exit(2); }
-sub badfmt { &quit("internal error: $admindir/diversions corrupt: $_[0]"); }
+sub badfmt { &quit("internal error: $dpkglibdir/diversions corrupt: $_[0]"); }
diff --git a/scripts/dpkg-statoverride.pl b/scripts/dpkg-statoverride.pl
new file mode 100755 (executable)
index 0000000..8e3a626
--- /dev/null
@@ -0,0 +1,166 @@
+#! /usr/bin/perl
+
+$dpkglibdir= "/var/lib/dpkg"; # This line modified by Makefile
+$version= '1.3.0'; # This line modified by Makefile
+
+$verbose= 1;
+$force= 0;
+$doupdate= 0;
+$mode= "";
+
+sub UsageVersion {
+       print STDERR <<EOF || &quit("failed to write usage: $!");
+"Debian dpkg-statoverride $version.
+Copyright (C) 2000 Wichert Akkerman.
+
+This is free software; see the GNU General Public Licence version 2 or later
+for copying conditions.  There is NO warranty.
+
+Usage:
+
+  dpkg-statoverride [options] --add <owner> <group> <mode> <file>
+  dpkg-statoverride [options] --remove <file>
+  dpkg-statoverride [options] --list [<glob-pattern>]
+
+Options:
+  --update                 immediately update file permissions
+  --force                  force an action even if a sanity check fails
+  --quiet                  quiet operation, minimal output
+  --help                   print this help screenm and exit
+  --admindir <directory>   set the directory with the statoverride file
+EOF
+}
+
+sub CheckModeConflict {
+       return unless $mode;
+       &badusage("two modes specified: $_ and --$mode");
+}
+
+while (@ARGV) {
+       $_=shift(@ARGV);
+       last if m/^--$/;
+       if (!m/^-/) {
+               unshift(@ARGV,$_); last;
+       } elsif (m/^--help$/) {
+               &UsageVersion; exit(0);
+       } elsif (m/^--update$/) {
+               $doupdate=1;
+       } elsif (m/^--quiet$/) {
+               $verbose=1;
+       } elsif (m/^--force$/) {
+               $force=1;
+       } elsif (m/^--admindir$/) {
+               @ARGV || &badusage("--admindir needs a directory argument");
+               $dpkglibdir= shift(@ARGV);
+       } elsif (m/^--add$/) {
+               &CheckModeConflict;
+               $mode= 'add';
+       } elsif (m/^--remove$/) {
+               &CheckModeConflict;
+               $mode= 'remove';
+       } elsif (m/^--list$/) {
+               &CheckModeConflict;
+               $mode= 'list';
+       } else {
+               &badusage("unknown option \`$_'");
+       }
+}
+
+$dowrite=0;
+
+&badusage("no mode specified") unless $mode;
+&ReadOverrides;
+
+if ($mode eq "add") {
+       @ARGV==4 || &badusage("--add needs four arguments");
+       $user=$ARGV[0];
+       ($user =~ m/^#[0-9]*/ or (($tmp)=getpwnam($user))) || &badusage("illegal user $user");
+       $group=$ARGV[1];
+       ($group =~ m/^#[0-9]*/ or (($tmp)=getgrnam($group))) || &badusage("illegal group $group");
+       $mode= $ARGV[2];
+       (($mode<0) or ($mode>07777)) && &badusage("illegal mode $mode");
+       $file= $ARGV[3];
+       $file =~ m/\n/ && &badusage("file may not contain newlines");
+
+       if (defined $user{$file}) {
+               print STDERR "An override for \"$file\" already exists, ";
+               if ($doforce) {
+                       print STDERR "but --force specified so lets ignore it.\n";
+               } else {
+                       print STDERR "aborting\n";
+                       exit(3);
+               }
+       }
+       $user{$file}=$user;
+       $group{$file}=$group;
+       $mode{$file}=$mode;
+       $dowrite=1;
+} elsif ($mode eq "remove") {
+       @ARGV==1 || &badusage("--remove needs four arguments");
+       $file=$ARGV[0];
+       if (not defined $user{$file}) {
+               print "No override present.";
+               exit(0);
+       }
+       delete $user{$file};
+       delete $group{$file};
+       delete $mode{$file};
+       $dowrite=1;
+} elsif ($mode eq "list") {
+       my (@list,@ilist,$pattern,$file);
+       
+       @ilist= @ARGV ? @ARGV : ('*');
+       while (defined($_=shift(@ilist))) {
+               s/\W/\\$&/g;
+               s/\\\?/./g;
+               s/\\\*/.*/g;
+               push(@list,"^$_\$");
+       }
+       $pat= join('|',@list);
+       for $file (keys %owner) {
+               next unless ($file =~ m/$pat/o);
+               print "$owner{$file} $group{$file} $mode{$file} $file\n";
+       }
+}
+
+&WriteOverrides if ($dowrite);
+
+exit(0);
+
+sub ReadOverrides {
+       open(SO,"$dpkglibdir/statoverride") || &quit("cannot open statoverride: $!");
+       while (<SO>) {
+               my ($owner,$group,$mode,$file);
+               chomp;
+
+               ($owner,$group,$mode,$file)=split(' ', $_, 4);
+               die "Multiple overrides for \"$file\", aborting"
+                       if defined $owner{$file};
+               $owner{$file}=$owner;
+               $group{$file}=$group;
+               $mode{$file}=$mode;
+       }
+       close(SO);
+}
+
+
+sub WriteOverrides {
+       my ($file);
+
+       open(SO,"$dpkglibdir/statoverride-new") || &quit("cannot open new statoverride file: $!");
+       foreach $file (keys %owner) {
+               print SO "$owner{$file} $group{$file} $mode{$file} $file\n";
+       }
+       close(SO);
+       chmod(0644, "$dpkglibdir/statoverride-new");
+       unlink("$dpkglibdir/statoverride-old") ||
+               $! == &ENOENT || &quit("error removing statoverride-old: $!");
+       link("$dpkglibdir/statoverride","$dpkglibdir/statoverride-old") ||
+               $! == &ENOENT || &quit("error creating new statoverride-old: $!");
+       rename("$dpkglibdir/statoverride-new","$dpkglibdir/statoverride")
+               || &quit("error installing new statoverride: $!");
+}
+
+
+sub quit { print STDERR "dpkg-statoverride: @_\n"; exit(2); }
+sub badusage { print STDERR "dpkg-statoverride: @_\n\n"; print("You need --help.\n"); exit(2); }