Bug#291320: patch submission
> It would be nice if dpkg-deb could produce .deb archives where all
> files are owned by root:root, ignoring the ownership attributes from
> the filesystem.
Here is a patch for this, see rootowner.patch in the attachment.
It introduces options --root-owner, to create root-owned archives,
and --same-owner (the default).
The second patch is a usage example, it allows dpkg itself to be built
without (fake)root. It is relatively large as I had to remove all those
"-o root -g root" install arguments (useless anyway). Besides that, the
patch only deletes the `id -u` test and adds --root-owner to dpkg-deb.
Could you drop me a note on whether the feature is worth considering
for inclusion to dpkg, at some point in the future? (I don't know,
maybe I'm the only one who finds fakeroot inconvenient.)
Best regards,
Sergei Ivanov
--- dpkg-1.10.26/dpkg-deb/main.c.-rootowner 2005-01-11 19:55:11.000000000 +0300
+++ dpkg-1.10.26/dpkg-deb/main.c 2005-01-23 03:38:12.000000000 +0300
@@ -76,6 +76,7 @@
" --showformat=<format> use alternative format for --show\n"
" -D enable debugging output\n"
" --old, --new select archive format\n"
+" --root-owner, --same-owner set ownership of files in the archive\n"
" --nocheck suppress control file check (build bad package).\n"
" -z# to set the compression when building\n"
" -Z<type> set the compression type to use when building.\n"
@@ -101,6 +102,7 @@
"Type dpkg --help for help about installing and deinstalling packages.");
int debugflag=0, nocheckflag=0, oldformatflag=BUILDOLDPKGFORMAT;
+int sameownerflag=1;
const char* compression=NULL;
enum compression_type compress_type = GZ;
const struct cmdinfo *cipaction=0;
@@ -145,6 +147,8 @@
{ "show", 'W', 0, 0, 0, setaction },
{ "new", 0, 0, &oldformatflag, 0, 0, 0 },
{ "old", 0, 0, &oldformatflag, 0, 0, 1 },
+ { "root-owner", 0, 0, &sameownerflag, 0, 0, 0 },
+ { "same-owner", 0, 0, &sameownerflag, 0, 0, 1 },
{ "debug", 'D', 0, &debugflag, 0, 0, 1 },
{ "nocheck", 0, 0, &nocheckflag, 0, 0, 1 },
{ "compression", 'z', 1, 0, &compression, 0, 1 },
--- dpkg-1.10.26/dpkg-deb/dpkg-deb.h.-rootowner 2005-01-11 19:55:11.000000000 +0300
+++ dpkg-1.10.26/dpkg-deb/dpkg-deb.h 2005-01-23 03:38:12.000000000 +0300
@@ -28,6 +28,7 @@
dofunction do_info, do_field, do_extract, do_vextract, do_fsystarfile;
extern int debugflag, nocheckflag, oldformatflag;
+extern int sameownerflag;
extern const struct cmdinfo *cipaction;
extern dofunction *action;
--- dpkg-1.10.26/dpkg-deb/build.c.-rootowner 2005-01-11 19:55:11.000000000 +0300
+++ dpkg-1.10.26/dpkg-deb/build.c 2005-01-23 03:38:12.000000000 +0300
@@ -319,7 +319,11 @@
m_dup2(p1[1],1); close(p1[0]); close(p1[1]);
if (chdir(directory)) ohshite(_("failed to chdir to `%.255s'"),directory);
if (chdir(BUILDCONTROLDIR)) ohshite(_("failed to chdir to .../DEBIAN"));
- execlp(TAR,"tar","-cf","-",".",(char*)0); ohshite(_("failed to exec tar -cf"));
+ if (sameownerflag)
+ execlp(TAR,"tar","-cf","-",".",(char*)0);
+ else
+ execlp(TAR,"tar","-cf","-","--owner=root","--group=root",".",(char*)0);
+ ohshite(_("failed to exec tar -cf"));
}
close(p1[1]);
/* Create a temporary file to store the control data in. Immediately unlink
@@ -391,7 +395,10 @@
m_dup2(p1[0],0); close(p1[0]); close(p1[1]);
m_dup2(p2[1],1); close(p2[0]); close(p2[1]);
if (chdir(directory)) ohshite(_("failed to chdir to `%.255s'"),directory);
- execlp(TAR,"tar","-cf", "-", "-T", "-", "--null", "--no-recursion", (char*)0);
+ if (sameownerflag)
+ execlp(TAR,"tar","-cf", "-", "-T", "-", "--null", "--no-recursion", (char*)0);
+ else
+ execlp(TAR,"tar","-cf", "-", "-T", "-", "--null", "--no-recursion", "--owner=root", "--group=root", (char*)0);
ohshite(_("failed to exec tar -cf"));
}
close(p1[0]);
--- dpkg-1.10.26/dpkg-deb/dpkg-deb.1.-rootowner 2005-01-11 19:55:11.000000000 +0300
+++ dpkg-1.10.26/dpkg-deb/dpkg-deb.1 2005-01-23 20:59:26.000000000 +0300
@@ -209,6 +209,12 @@
when building packages to be parsed by versions of dpkg older than
0.93.76 (September 1995), which was released as i386 a.out only.
.TP
+.BR \-\-root\-owner
+Set user and group ownership of all files in the archive to "root".
+.TP
+.BR \-\-same\-owner
+Take ownership data from the filesystem. This is the default.
+.TP
.BR \-\-nocheck
Inhibits
.BR "dpkg\-deb \-\-build" 's
--- dpkg-1.10.26/debian/rules.-orig 2005-01-11 19:55:11.000000000 +0300
+++ dpkg-1.10.26/debian/rules 2005-01-23 22:09:13.000000000 +0300
@@ -86,7 +86,6 @@
stamp-binary-static: stamp-binary
stamp-binary: stamp-build
$(checkdir)
- test "`id -u`" -eq 0
rm -rf $(TMP)
$(MAKE) $(MFLAGS) -C $(BUILD)$* \
DESTDIR=$(INSTALL_TMP) \
@@ -101,13 +100,13 @@
binary-dpkg-most binary-dpkg-static-most: binary-dpkg%-most: stamp-binary%
rm -rf $(TMP_DPKG)
- install -d -m 755 -o root -g root $(TMP_DPKG)
+ install -d -m 755 $(TMP_DPKG)
chmod g-s $(TMP_DPKG)
- install -d -m 755 -o root -g root $(TMP_DPKG)/usr/share/doc/dpkg$(static)
- install -d -m 755 -o root -g root $(TMP_DPKG)/usr/lib/dpkg
- install -d -m 755 -o root -g root $(TMP_DPKG)/usr/bin
- install -d -m 755 -o root -g root $(TMP_DPKG)/sbin
- install -d -m 755 -o root -g root $(TMP_DPKG)/var/lib/dpkg
+ install -d -m 755 $(TMP_DPKG)/usr/share/doc/dpkg$(static)
+ install -d -m 755 $(TMP_DPKG)/usr/lib/dpkg
+ install -d -m 755 $(TMP_DPKG)/usr/bin
+ install -d -m 755 $(TMP_DPKG)/sbin
+ install -d -m 755 $(TMP_DPKG)/var/lib/dpkg
-test -d $(INSTALL_TMP)/etc && cp -a $(INSTALL_TMP)/etc $(TMP_DPKG)/
set -e ; for i in info alternatives parts updates ; do \
cp -a $(INSTALL_TMP)/var/lib/dpkg/$$i $(TMP_DPKG)/var/lib/dpkg/ ; \
@@ -129,19 +128,19 @@
done
cp -a debian/pseudo-tags $(TMP_DPKG)/usr/share/doc/dpkg$(static)/
set -e ; for i in "" $(MANDIRS) ; do \
- install -d -m 755 -o root -g root $(TMP_DPKG)/usr/share/man/$$i/man1 ; \
+ install -d -m 755 $(TMP_DPKG)/usr/share/man/$$i/man1 ; \
for m in md5sum.1 dpkg-deb.1 ; do \
if [ -f $(INSTALL_TMP)/usr/share/man/$$i/man1/$$m ] ; then \
cp -a $(INSTALL_TMP)/usr/share/man/$$i/man1/$$m $(TMP_DPKG)/usr/share/man/$$i/man1/$$m ; \
fi ; \
done ; \
- install -d -m 755 -o root -g root $(TMP_DPKG)/usr/share/man/$$i/man5 ; \
+ install -d -m 755 $(TMP_DPKG)/usr/share/man/$$i/man5 ; \
for m in dpkg.cfg.5 ; do \
if [ -f $(INSTALL_TMP)/usr/share/man/$$i/man5/$$m ] ; then \
cp -a $(INSTALL_TMP)/usr/share/man/$$i/man5/$$m $(TMP_DPKG)/usr/share/man/$$i/man5/$$m ; \
fi ; \
done ; \
- install -d -m 755 -o root -g root $(TMP_DPKG)/usr/share/man/$$i/man8 ; \
+ install -d -m 755 $(TMP_DPKG)/usr/share/man/$$i/man8 ; \
for m in dpkg.8 dpkg-query.8 dpkg-split.8 start-stop-daemon.8 \
cleanup-info.8 dpkg-divert.8 dpkg-statoverride.8 \
install-info.8 update-alternatives.8 ; do \
@@ -160,22 +159,22 @@
mv $(TMP_DPKG)/usr/share/doc/dpkg$(static)/ChangeLog \
$(TMP_DPKG)/usr/share/doc/dpkg$(static)/changelog
- install -p -m 644 -o root -g root debian/changelog \
+ install -p -m 644 debian/changelog \
$(TMP_DPKG)/usr/share/doc/dpkg$(static)/changelog.Debian
rm -f $(TMP_DPKG)/usr/share/doc/dpkg$(static)/copyright
gzip -9 $(TMP_DPKG)/usr/share/doc/dpkg$(static)/*
- install -p -m 644 -o root -g root debian/dpkg.cfg \
+ install -p -m 644 debian/dpkg.cfg \
$(TMP_DPKG)/usr/share/doc/dpkg$(static)/
- install -p -m 644 -o root -g root debian/copyright \
+ install -p -m 644 debian/copyright \
$(TMP_DPKG)/usr/share/doc/dpkg$(static)/
# Final package creation
- install -d -m 755 -o root -g root $(TMP_DPKG)/DEBIAN
- install -p -m 644 -o root -g root debian/dpkg.conffiles $(TMP_DPKG)/DEBIAN/conffiles
- install -p -m 755 -o root -g root debian/dpkg.preinst $(TMP_DPKG)/DEBIAN/preinst
- install -p -m 755 -o root -g root debian/dpkg.prerm $(TMP_DPKG)/DEBIAN/prerm
- install -p -m 755 -o root -g root debian/dpkg.postinst $(TMP_DPKG)/DEBIAN/postinst
- install -p -m 755 -o root -g root debian/dpkg.postrm $(TMP_DPKG)/DEBIAN/postrm
+ install -d -m 755 $(TMP_DPKG)/DEBIAN
+ install -p -m 644 debian/dpkg.conffiles $(TMP_DPKG)/DEBIAN/conffiles
+ install -p -m 755 debian/dpkg.preinst $(TMP_DPKG)/DEBIAN/preinst
+ install -p -m 755 debian/dpkg.prerm $(TMP_DPKG)/DEBIAN/prerm
+ install -p -m 755 debian/dpkg.postinst $(TMP_DPKG)/DEBIAN/postinst
+ install -p -m 755 debian/dpkg.postrm $(TMP_DPKG)/DEBIAN/postrm
$(SHLIBDEPS) -dPre-Depends -Tdebian/dpkg$(static).substvars \
$(TMP_DPKG)/sbin/start-stop-daemon \
@@ -183,20 +182,20 @@
binary-dpkg binary-dpkg-static: %: %-most
$(GENCONTROL) -Tdebian/dpkg$(static).substvars -pdpkg$(static) -P$(TMP_DPKG)
- dpkg --build $(TMP_DPKG) ..
+ dpkg-deb --build --root-owner $(TMP_DPKG) ..
binary-dpkg-dev: stamp-binary
rm -rf $(TMP_DPKG_DEV)
- install -d -m 755 -o root -g root $(TMP_DPKG_DEV)
+ install -d -m 755 $(TMP_DPKG_DEV)
chmod g-s $(TMP_DPKG_DEV)
- install -d -m 755 -o root -g root $(TMP_DPKG_DEV)/etc/dpkg
- install -p -m 644 -o root -g root debian/shlibs.default \
+ install -d -m 755 $(TMP_DPKG_DEV)/etc/dpkg
+ install -p -m 644 debian/shlibs.default \
$(TMP_DPKG_DEV)/etc/dpkg/
- install -p -m 644 -o root -g root debian/shlibs.override \
+ install -p -m 644 debian/shlibs.override \
$(TMP_DPKG_DEV)/etc/dpkg/
- install -d -m 755 -o root -g root $(TMP_DPKG_DEV)/usr/lib/dpkg
- install -d -m 755 -o root -g root $(TMP_DPKG_DEV)/usr/share
- install -d -m 755 -o root -g root $(TMP_DPKG_DEV)/usr/bin
+ install -d -m 755 $(TMP_DPKG_DEV)/usr/lib/dpkg
+ install -d -m 755 $(TMP_DPKG_DEV)/usr/share
+ install -d -m 755 $(TMP_DPKG_DEV)/usr/bin
mv $(INSTALL_TMP)/usr/lib/dpkg/parsechangelog $(TMP_DPKG_DEV)/usr/lib/dpkg/
mv $(INSTALL_TMP)/usr/lib/dpkg/controllib.pl $(TMP_DPKG_DEV)/usr/lib/dpkg/
set -e ; for i in dpkg-name dpkg-source dpkg-genchanges dpkg-gencontrol \
@@ -206,7 +205,7 @@
mv $(INSTALL_TMP)/usr/bin/$$i $(TMP_DPKG_DEV)/usr/bin/ ; \
done
set -e ; for i in "" $(MANDIRS) ; do \
- install -d -m 755 -o root -g root $(TMP_DPKG_DEV)/usr/share/man/$$i/man1 ; \
+ install -d -m 755 $(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 \
dpkg-gencontrol.1 dpkg-parsechangelog.1 dpkg-shlibdeps.1 \
@@ -215,7 +214,7 @@
mv $(INSTALL_TMP)/usr/share/man/$$i/man1/$$m $(TMP_DPKG_DEV)/usr/share/man/$$i/man1/$$m ; \
fi ; \
done ; \
- install -d -m 755 -o root -g root $(TMP_DPKG_DEV)/usr/share/man/$$i/man5 ; \
+ install -d -m 755 $(TMP_DPKG_DEV)/usr/share/man/$$i/man5 ; \
for m in deb.5 deb-control.5 deb-old.5 ; do \
if [ -e $(INSTALL_TMP)/usr/share/man/$$i/man5/$$m ] ; then \
mv $(INSTALL_TMP)/usr/share/man/$$i/man5/$$m $(TMP_DPKG_DEV)/usr/share/man/$$i/man5/$$m ; \
@@ -225,38 +224,38 @@
# Now that dpkg-dev has been installed, Debianize it
# Policy stuff
find $(TMP_DPKG_DEV)/usr/share/man -type f | xargs gzip -9f
- install -d -m 755 -o root -g root $(TMP_DPKG_DEV)/usr/share/doc
+ install -d -m 755 $(TMP_DPKG_DEV)/usr/share/doc
ln -s dpkg $(TMP_DPKG_DEV)/usr/share/doc/dpkg-dev
# Final package creation
- install -d -m 755 -o root -g root $(TMP_DPKG_DEV)/DEBIAN
- install -p -m 644 -o root -g root debian/dpkg-dev.conffiles $(TMP_DPKG_DEV)/DEBIAN/conffiles
+ install -d -m 755 $(TMP_DPKG_DEV)/DEBIAN
+ install -p -m 644 debian/dpkg-dev.conffiles $(TMP_DPKG_DEV)/DEBIAN/conffiles
$(GENCONTROL) -Tdebian/dpkg-dev.substvars -pdpkg-dev -P$(TMP_DPKG_DEV)
- dpkg --build $(TMP_DPKG_DEV) ..
+ dpkg-deb --build --root-owner $(TMP_DPKG_DEV) ..
binary-dselect: stamp-binary
rm -rf $(TMP_DSELECT)
- install -d -m 755 -o root -g root $(TMP_DSELECT)
+ install -d -m 755 $(TMP_DSELECT)
chmod g-s $(TMP_DSELECT)
- install -d -m 755 -o root -g root $(TMP_DSELECT)/usr/bin
+ install -d -m 755 $(TMP_DSELECT)/usr/bin
mv $(INSTALL_TMP)/usr/bin/dselect $(TMP_DSELECT)/usr/bin/
- install -d -m 755 -o root -g root $(TMP_DSELECT)/usr/lib/dpkg
+ install -d -m 755 $(TMP_DSELECT)/usr/lib/dpkg
mv $(INSTALL_TMP)/usr/lib/dpkg/methods $(TMP_DSELECT)/usr/lib/dpkg/
- install -d -m 755 -o root -g root $(TMP_DSELECT)/var/lib/dpkg
+ install -d -m 755 $(TMP_DSELECT)/var/lib/dpkg
mv $(INSTALL_TMP)/var/lib/dpkg/methods $(TMP_DSELECT)/var/lib/dpkg/
set -e ; for i in "" $(MANDIRS) ; do \
- install -d -m 755 -o root -g root $(TMP_DSELECT)/usr/share/man/$$i/man5 ; \
+ install -d -m 755 $(TMP_DSELECT)/usr/share/man/$$i/man5 ; \
for m in dselect.cfg.5 ; do \
if [ -f $(INSTALL_TMP)/usr/share/man/$$i/man5/$$m ] ; then \
cp -a $(INSTALL_TMP)/usr/share/man/$$i/man5/$$m $(TMP_DSELECT)/usr/share/man/$$i/man5/$$m ; \
fi ; \
done ; \
- install -d -m 755 -o root -g root $(TMP_DSELECT)/usr/share/man/$$i/man8 ; \
+ install -d -m 755 $(TMP_DSELECT)/usr/share/man/$$i/man8 ; \
for m in dselect.8 ; do \
if [ -f $(INSTALL_TMP)/usr/share/man/$$i/man8/$$m ] ; then \
cp -a $(INSTALL_TMP)/usr/share/man/$$i/man8/$$m $(TMP_DSELECT)/usr/share/man/$$i/man8/$$m ; \
@@ -264,31 +263,31 @@
done ; \
done
- install -d -m 755 -o root -g root $(TMP_DSELECT)/etc/dpkg
- install -p -m 644 -o root -g root debian/dselect.cfg \
+ install -d -m 755 $(TMP_DSELECT)/etc/dpkg
+ install -p -m 644 debian/dselect.cfg \
$(TMP_DSELECT)/etc/dpkg/
# Now do the usual Debian stuff
find $(TMP_DSELECT)/usr/share/man -type f | xargs gzip -9f
- install -d -m 755 -o root -g root $(TMP_DSELECT)/usr/share/doc
+ install -d -m 755 $(TMP_DSELECT)/usr/share/doc
ln -s dpkg $(TMP_DSELECT)/usr/share/doc/dselect
strip --remove-section=.comment --remove-section=.note \
--strip-unneeded $(TMP_DSELECT)/usr/bin/*
# Final package creation
- install -d -m 755 -o root -g root $(TMP_DSELECT)/DEBIAN
- install -p -m 644 -o root -g root debian/dselect.conffiles $(TMP_DSELECT)/DEBIAN/conffiles
+ install -d -m 755 $(TMP_DSELECT)/DEBIAN
+ install -p -m 644 debian/dselect.conffiles $(TMP_DSELECT)/DEBIAN/conffiles
$(SHLIBDEPS) -Tdebian/dselect.substvars \
$(TMP_DSELECT)/usr/bin/dselect
$(GENCONTROL) -Tdebian/dselect.substvars -pdselect -P$(TMP_DSELECT)
- dpkg --build $(TMP_DSELECT) ..
+ dpkg-deb --build --root-owner $(TMP_DSELECT) ..
binary-dpkg-doc: stamp-binary
rm -rf $(TMP_DPKG_DOC)
- install -d -m 755 -o root -g root $(TMP_DPKG_DOC)
+ install -d -m 755 $(TMP_DPKG_DOC)
chmod g-s $(TMP_DPKG_DOC)
- install -d -m 755 -o root -g root $(TMP_DPKG_DOC)/usr/share/doc/dpkg
+ install -d -m 755 $(TMP_DPKG_DOC)/usr/share/doc/dpkg
mv $(INSTALL_TMP)/usr/share/doc/dpkg/internals $(TMP_DPKG_DOC)/usr/share/doc/dpkg/
mv $(INSTALL_TMP)/usr/share/doc/dpkg/ChangeLog.manuals \
$(TMP_DPKG_DOC)/usr/share/doc/dpkg/changelog.manuals
@@ -299,17 +298,17 @@
ln -s dpkg $(TMP_DPKG_DOC)/usr/share/doc/dpkg-doc
# Register documentation with doc-base
- install -d -m 755 -o root -g root $(TMP_DPKG_DOC)/usr/share/doc-base
- install -p -m 644 -o root -g root debian/dpkg-doc.doc-base \
+ install -d -m 755 $(TMP_DPKG_DOC)/usr/share/doc-base
+ install -p -m 644 debian/dpkg-doc.doc-base \
$(TMP_DPKG_DOC)/usr/share/doc-base/dpkg-doc
# Final package creation
- install -d -m 755 -o root -g root $(TMP_DPKG_DOC)/DEBIAN
- install -p -m 755 -o root -g root debian/dpkg-doc.prerm $(TMP_DPKG_DOC)/DEBIAN/prerm
- install -p -m 755 -o root -g root debian/dpkg-doc.postinst $(TMP_DPKG_DOC)/DEBIAN/postinst
+ install -d -m 755 $(TMP_DPKG_DOC)/DEBIAN
+ install -p -m 755 debian/dpkg-doc.prerm $(TMP_DPKG_DOC)/DEBIAN/prerm
+ install -p -m 755 debian/dpkg-doc.postinst $(TMP_DPKG_DOC)/DEBIAN/postinst
$(GENCONTROL) -Tdebian/dpkg-doc.substvars -pdpkg-doc -P$(TMP_DPKG_DOC)
- dpkg --build $(TMP_DPKG_DOC) ..
+ dpkg-deb --build --root-owner $(TMP_DPKG_DOC) ..
binary-arch-static: binary-dpkg-static
binary-arch: binary-dpkg binary-dpkg-static-most binary-dselect
Reply to: