From 19f08301e30c28f3130a171b631d4e7a540e1697 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 20 Aug 1996 15:39:58 +0100 Subject: [PATCH] dpkg (1.3.6) experimental; urgency=low (HIGH for new source format) * dpkg-source now has broken argument unparsing for tar. (Bug#4195.) * dpkg-gencontrol writes to debian/tmp/DEBIAN/control by default. * dpkg-shlibdeps script added. * Back to old sh update-rc.d, and removed manpage, because new Perl version and the manpage have different syntax and semantics. * update-rc.d prints usage message for missing terminal `.'. (Bug#4122.) * Use rm -rf instead of just rm -r in dpkg-deb --info &c. (Bug#4200.) * Added support for Installed-Size to dpkg-gencontrol, and documented. * Source packaging substitution variables and name syntax rationalised. * dpkg-source scripts' usage messages improved slightly. * dpkg-source works with non-empty second (orig dir) argument. * Added rationale for copyright policy to manual. * More developers' PGP keys. * Control database handling cleanups (usu. Source field blanked). -- Ian Jackson Tue, 20 Aug 1996 15:39:58 +0100 --- debian/changelog | 24 + debian/control | 2 +- debian/rules | 16 +- debian/shlibs.default.i386 | 2 + debian/substvars | 1 + doc/developer-keys.bak | Bin 30648 -> 0 bytes doc/developer-keys.pgp | Bin 30807 -> 31039 bytes doc/policy.sgml | 14 + doc/policy.sgml.orig | 1222 ----------------- doc/programmer.sgml | 56 +- dpkg-deb/info.c | 2 +- include/dpkg-db.h | 2 +- lib/database.c | 3 +- lib/parse.c | 51 +- main/processarc.c | 2 + main/remove.c | 1 + scripts/Makefile.in | 4 +- scripts/controllib.pl | 24 +- scripts/dpkg-buildpackage.sh | 1 + scripts/dpkg-distaddfile.pl | 3 +- scripts/dpkg-genchanges.pl | 3 +- scripts/dpkg-gencontrol.pl | 39 +- scripts/dpkg-parsechangelog.pl | 8 +- scripts/dpkg-shlibdeps.pl | 198 +++ scripts/dpkg-source.1 | 157 ++- scripts/dpkg-source.8 | 249 ---- scripts/dpkg-source.pl | 9 +- scripts/update-rc.d.new-pl | 166 +++ scripts/update-rc.d.pl | 1 - .../{update-rc.d.old-sh => update-rc.d.sh} | 6 +- version.h | 2 +- 31 files changed, 716 insertions(+), 1552 deletions(-) create mode 100644 debian/shlibs.default.i386 create mode 100644 debian/substvars delete mode 100644 doc/developer-keys.bak delete mode 100644 doc/policy.sgml.orig create mode 100644 scripts/dpkg-shlibdeps.pl delete mode 100644 scripts/dpkg-source.8 create mode 100644 scripts/update-rc.d.new-pl rename scripts/{update-rc.d.old-sh => update-rc.d.sh} (93%) diff --git a/debian/changelog b/debian/changelog index 04292326..76bd8a1b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,27 @@ +dpkg (1.3.6) experimental; urgency=low (HIGH for new source format) + + * dpkg-source now has broken argument unparsing for tar. (Bug#4195.) + + * dpkg-gencontrol writes to debian/tmp/DEBIAN/control by default. + * dpkg-shlibdeps script added. + + * Back to old sh update-rc.d, and removed manpage, because new Perl + version and the manpage have different syntax and semantics. + * update-rc.d prints usage message for missing terminal `.'. (Bug#4122.) + + * Use rm -rf instead of just rm -r in dpkg-deb --info &c. (Bug#4200.) + + * Added support for Installed-Size to dpkg-gencontrol, and documented. + * Source packaging substitution variables and name syntax rationalised. + * dpkg-source scripts' usage messages improved slightly. + * dpkg-source works with non-empty second (orig dir) argument. + + * Added rationale for copyright policy to manual. + * More developers' PGP keys. + * Control database handling cleanups (usu. Source field blanked). + + -- Ian Jackson Tue, 20 Aug 1996 15:39:58 +0100 + dpkg (1.3.5) experimental; urgency=low (high for debian-changelog-mode) * 822-date script included. (Bug#4136.) diff --git a/debian/control b/debian/control index b55ec8b1..398698e1 100644 --- a/debian/control +++ b/debian/control @@ -7,7 +7,7 @@ Standards-Version: 0.1 Package: dpkg Architecture: any Essential: yes -Pre-Depends: libc5${libcver}, ncurses3.0 +Pre-Depends: ${shlibs:Pre-Depends} Conflicts: dpkgname Replaces: dpkgname Description: Package maintenance system for Debian Linux diff --git a/debian/rules b/debian/rules index 4fa10962..8dd1658f 100755 --- a/debian/rules +++ b/debian/rules @@ -21,17 +21,19 @@ clean: binary: checkroot build -rm -rf debian/tmp - install -d debian/tmp debian/tmp/DEBIAN + install -d debian/tmp debian/tmp/DEBIAN debian/tmp/etc/dpkg install -d debian/tmp/usr/doc/{copyright,dpkg} set -e; if [ $(arch) = i386 ]; then \ - dpkg-gencontrol -Vlibcver=' (>= 5.2.18-2)' >$(cidir)/control ; \ sed -e 's/^# i386elf: //' $(cidir)/preinst ; \ else \ - dpkg-gencontrol -Vlibcver='' >$(cidir)/control ; \ sed -e '/^# i386elf: /d' debian/preinst >$(cidir)/preinst ; \ fi - cp debian/{prerm,postinst} debian/tmp/DEBIAN/. - chmod +x debian/tmp/DEBIAN/{postinst,prerm,preinst} + set -e; if [ -f debian/shlibs.default.$(arch) ]; then \ + echo /etc/dpkg/shlibs.default >$(cidir)/conffiles ; \ + cp debian/shlibs.default.$(arch) debian/tmp/etc/dpkg/shlibs.default ; \ + fi + cp debian/{prerm,postinst} $(cidir)/. + chmod +x $(cidir)/{postinst,prerm,preinst} $(MAKE) prefix=$(DIR)/debian/tmp/usr \ datadir=$(DIR)/debian/tmp/var/lib/dpkg \ etcdir=$(DIR)/debian/tmp/etc \ @@ -39,8 +41,10 @@ binary: checkroot build cp debian/copyright debian/tmp/usr/doc/copyright/dpkg cp TODO debian/tmp/usr/doc/dpkg/WISHLIST touch debian/tmp/var/lib/dpkg/{status,available} + dpkg-shlibdeps -dPre-Depends main/dpkg dselect/dselect + dpkg-gencontrol chown -R root.root debian/tmp - chmod -R g-ws debian/tmp + chmod -R g-ws,a+r,u+w debian/tmp set -e; cd debian/tmp; \ version=`sed -n 's/^Version: //p' DEBIAN/control`; \ file=dpkg_$${version}_$(arch).nondebbin.tar; \ diff --git a/debian/shlibs.default.i386 b/debian/shlibs.default.i386 new file mode 100644 index 00000000..602cb89b --- /dev/null +++ b/debian/shlibs.default.i386 @@ -0,0 +1,2 @@ +libc 5 libc5 (>= 5.2.18) +libncurses 3.0 ncurses3.0 diff --git a/debian/substvars b/debian/substvars new file mode 100644 index 00000000..915d7d53 --- /dev/null +++ b/debian/substvars @@ -0,0 +1 @@ +shlibs:Pre-Depends=libc5 (>= 5.2.18), ncurses3.0 diff --git a/doc/developer-keys.bak b/doc/developer-keys.bak deleted file mode 100644 index dfbf9df139836cc7fe56c9be138abfe9e0b4b83b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30648 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 CUZ`9E diff --git a/doc/developer-keys.pgp b/doc/developer-keys.pgp index 10692b2c5b5cbf74bfda0cf7272d80708d0bb4b2..5ad9b5aec037e26c186787ff98cbcb7b1cb7a1a0 100644 GIT binary patch delta 233 zcmV6#)U-?gRkMEZeh_P}=&J9m2KI8Um;0nsbUxAP#?sARxH4 zU87ZgvQ1UWy2hAoY(O( +The aims of the policy detailed below are: + + +That any user be able to rebuild any package in the official Debian +distribution from the original source plus our patches. + +That we make available in our packaging formats as much software as we +can. + +That it be easy for people to make CDROMs of our distribution without +violating copyrights. + +

+ All packages in the Debian distribution proper must be freely useable, modifiable and redistributable in both source and binary form. It must be possible for anyone to distribute and use modified source code diff --git a/doc/policy.sgml.orig b/doc/policy.sgml.orig deleted file mode 100644 index e15c9394..00000000 --- a/doc/policy.sgml.orig +++ /dev/null @@ -1,1222 +0,0 @@ - - - - - - -Debian policy manual -<author>Ian Jackson <email/ijackson@gnu.ai.mit.edu/ -<version>version 0.1, <date> - -<abstract> -This manual describes the policy requirements which must be satisfied -for a package to be included in the Debian distribution. This -includes details of the permissions and ownerships of files in -packages and other technical requirements as well as information like -the upload procedure. -</abstract> - -<copyright>Copyright ©1996 Ian Jackson. -<p> - -This manual is free software; you may redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any -later version. -<p> - -This is distributed in the hope that it will be useful, but -<em>without any warranty</em>; without even the implied warranty of -merchantability or fitness for a particular purpose. See the GNU -General Public License for more details. -<p> - -You should have received a copy of the GNU General Public License with -your Debian GNU/Linux system, in <tt>/usr/doc/copyright/GPL</tt>, or -with the <prgn/dpkg/ source package as the file <tt>COPYING</tt>. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. - -<toc sect> - -<chapt id="scope">Introduction and scope of this manual -<p> - -This manual describes the criteria that a Debian-format package must -satisfy to be included in the Debian distribution. -<p> - -Much of this information will be useful even when building a package -which is to be distributed in some other way or is for local use. -<p> - -This manual does <em/not/ describe the technical mechanisms involved -in package creation, installation and removal. This information can -be found in the <prgn/dpkg/ programmers' manual and the <prgn/dpkg/ system -administrators' manual. -<p> - -This document assumes familiarity with these other two manuals. -<p> - -The Debian version of the FSF's GNU <prgn/hello/ program is provided -as an example for people wishing to create Debian packages. -<p> - -<em>Note that this document is still a draft!</em> - -<chapt id="pkgcopyright">Package copyright -<p> - -Please study the copyright of your submission <em/carefully/ and -understand it before proceeding. If you have doubts or questions, -please ask. -<p> - -All packages in the Debian distribution proper must be freely useable, -modifiable and redistributable in both source and binary form. It -must be possible for anyone to distribute and use modified source code -and their own own compiled binaries, at least when they do so as part -of a Debian distribution. -<p> - -Packages whose copyright permission notices (or patent problems) do -not allow distribution and copying for profit, without restriction on -the amount charged, or where distribution is restricted according to -the medium used, or where the distributor must ask any kind of special -permission of the authors, or with other onerous conditions, may only -be placed in the semi-supported non-free section of the Debian FTP -archives. This is important so that CDROM manufacturers can -distribute Debian without having to check the copyright of each -package individually, simply by leaving out the contents of the -non-free area; CDROM distributors are encouraged, though, to check the -copyrights on programs in non-free individually and include as many as -they can. -<p> - -Packages whose copyright permission notices (or patent problems) allow -only distribution of compiled binaries (and thus of which only -binaries are available), or where the source code which may be -distributed is not the complete source code required to compile the -program (ie, the program cannot be compiled using only packages in the -main Debian distribution), or which depend for their use on non-free -or contrib packages, or allow free use only for a trial period -(shareware), or are demonstration programs lacking vital functionality -(crippleware), or are only installer-packages which require the user -to supply a separate file to be installed, or which fail to meet some -other policy requirements, may only be placed in the semi-supported -contrib section of the Debian FTP archives (unless they need to be in -non-free - see above). -<p> - -Programs whose authors encourage the user to make donations are fine -for the main distribution, provided that the authors do not claim that -not donating is immoral, unethical, illegal or something similar; -otherwise they must go in contrib (or non-free, if even distribution -is restricted by such statements). -<p> - -Packages whose copyright permission notices (or patent problems) do -not allow redistribution even of only binaries, and where no special -permission has been obtained, cannot placed on the Debian FTP site and -its mirrors at all. -<p> - -Note that under international copyright law<footnote>This applies in -the United States, too.</footnote> <em/no/ distribution or modification -of a work is allowed without an explicit notice saying so. Therefore -a program without a copyright notice <em/is/ copyrighted and you may -not do anything to it without risking being sued! Likewise if a -program has a copyright notice but no statement saying what is -permitted then nothing is permitted. -<p> - -Many authors are unaware of the problems that restrictive copyrights -(or lack of copyright notices) can cause for the users of their -supposedly-free software. It is often worthwhile contacting such -authors diplomatically to ask them to modify their terms generally, or -specially for Debian. However, this is a politically difficult thing -to do and you should ask for advice on <prgn/debian-devel/ first. -<p> - -When in doubt, send mail to <email/debian-devel@lists.debian.org/. Be -prepared to provide us with the copyright statement. Software covered -by the GPL, public domain software and BSD-like copyrights are safe; -be wary of the phrases `commercial use prohibited' and `distribution -restricted'. -<p> - -Every package submission <em/must/ be accompanied by verbatim copy of -its copyright (with the exceptions of public domain packages and those -covered by the UCB BSD licence or the GNU GPL or LGPL; in these cases -simply indicate which is appropriate). This information must be -included in a file installed by the binary package - see <ref -id="copyrightfile">. - -<chapt id="binarypkg">Contents of the binary package - -<sect>Control file requirements - -<sect1><tt/Maintainer/ information -<p> - -All packages must have a <tt/Maintainer/ field with the correct name -and a working email address for the Debian maintainer of the package. -If one person maintains several packages they should try to avoid -having different forms of their name and address in different -<tt/Maintainer/ fields. - -<sect1>Dependencies and virtual packages -<p> - -Add a dependency for any shared libraries required by -dynamically-linked executable binaries in your package. Almost every -package containing compiled C code should therefore include a -<tt/Depends/ field which mentions the shared C library required for -the program to run. For ELF binaries linked against <tt/libc.so.5/ -the relevant package name is <tt/libc5/. -<p> - -All packages must use virtual package names where appropriate, and -arrange to create new ones if necessary. They must not use virtual -package names (except privately, amongst a cooperating group of -packages) unless they have been agreed upon and appear in the list of -virtual package names. -<p> - -The latest version of the authoritative list of virtual package names -can be found on <ftpsite>ftp.debian.org</> in -<ftppath>/debian/doc/package-developer/virtual-package-names-list.text</> -or your local mirror. The procedure for updating it is described at -the top of the file. - -<sect1><tt/Section/ and <tt/Priority/ -<p> - -Decide whether your package can go in <tt/non-free/, <tt/contrib/ or -the main distribution - see <ref id="pkgcopyright">, and put -an appropriate value for the distribution in the -<tt>debian/changelog</> file. -<p> - -The <tt/Priority/ and <tt/Section/ control file fields give -information for classifying the package in <prgn/dselect/ and say -which directory to place it in the FTP archive. -<p> - -They are ultimately the responsibility of the distribution -maintainers; however, you should suggest values for them in your -<tt/.changes/ information when you upload a package. You do this by -including appropriate information in the <tt>debian/control</tt> file -before building the packages. -<p> - -For a list of the currently in-use sections, please see the FTP -archive. Packages in the non-free and contrib areas should have -section <tt/non-free/ and <tt/contrib/, respectively. - -<sect2><tt/Priority/ values -<p> - -<taglist> -<tag><tt/required/ -<item> -<tt/required/ packages are necessary for the proper functioning of the -system. You must not remove these packages or your system may become -totally broken and you may probably not even be able to use -<prgn/dpkg/ to put things back. Systems with only the <tt/required/ -packages are probably unuseable, but they do have enough functionality -to allow the sysadmin to boot and install more software. - -<tag><tt/important/ -<item> -Important programs, including those which one would expect to find on -any Unix-like system. If the expectation is that an experienced Unix -person who found it missing would go `What the F*!@<+ is going on, -where is <prgn/foo/', it should be in <tt/important/. This is an -important criterion because we are trying to produce, amongst other -things, a free Unix. Other packages without which the system will not -run well or be useable should also be here. This does <em/not/ -include Emacs or X11 or TeX or any other large applications. The -<tt/important/ packages are just a bare minimum of commonly-expected -and necessary tools. - -<tag><tt/standard/ -<item> -These packages provide a reasonably small but not too limited -character-mode system. This is what will install by default if the -user doesn't select anything else. It doesn't include many large -applications, but it does include Emacs (this is more of a piece of -infrastructure than an application) and a reasonable subset of TeX and -LaTeX (if this is possible without X). - -<tag><tt/optional/<footnote>In a sense everything is optional that -isn't required, but that's not what is meant here.</footnote> -<item> -This is all the software that you might reasonably want to install if -you didn't know what it was or don't have specialised requirements. -This is a much larger system and includes X11, a full TeX -distribution, and lots of applications. - -<tag><tt/extra/ -<item> -This contains packages that conflict with others with higher -priorities, or are only likely to be useful if you already know what -they are or have specialised requirements. - -</taglist> -<p> - -Priority values are not case-sensitive. - -<sect2>Base packages -<p> - -Some packages have <tt/Section: base/ and are in the <tt/base/ -subdirectory on the FTP archives. These are the packages that are -supplied on the base disks. They are the minimum sensible set for -installing new packages (perhaps via a network). -<p> - -Most of these packages should have <tt/Priority: required/ or at least -<tt/Priority: important/. - -<sect1>The <tt/Essential/ flag -<p> - -The <tt/Essential: yes/ control file field should not be used unless -removing a package really will completely hose the system; nor should -it be used for a shared library package - the dependencies will -prevent its premature removal, and we need to be able to remove it -when it has been superseded. - -<sect1>Including <tt/Priority/ and <tt/Section/ in the <tt/.deb/ -control file -<p> - -If a user installs a package which is not part of the standard -distribution, or without downloading and updating from a new -<prgn/Packages/ file, the information about the priority and section -of a package will be absent, and the <prgn/dselect/ package listing -will have the package listed under `unclassified'. In order to -improve this it is permissible to use the <tt/-is/, <tt/-isp/ or -<tt/-ip/ option to <prgn/dpkg-gencontrol/, so that the <tt/Section/ -and/or <tt/Priority/ is copied into the actual control information in -the <tt/.deb/ file. However, if you do this you should make sure you -keep the information up to date so that users are not shown -conflicting information. - - -<sect1>Formatting of the <tt/Description/ control file field -<p> - -Every Debian package should have an extended description. -<p> - -The description should be written so that it tells the user what they -need to know to decide whether to install the package. This -description should not just be copied from the blurb for the program. -Instructions for configuring or using the package should not be -included - that is what installation scripts, manpages, Info files and -<tt>/usr/doc/<var/package/</> are for. Copyright statements and other -administrivia should not be included - that is what -<tt>/usr/doc/copyright</> is for. -<p> - -If you wish to include a list in your extended with entries which are -a line or more each you must indent each entry by one space to make -sure that it doesn't get wordwrapped. The start of each list entry -should be marked with an asterisk, followed by a single space. You -must wrap the list entries yourself to 75 columns, and should start -continuation lines indented by three spaces so that they line up with -the start of the text on the first line of each list entry. -<p> - -See the programmers' manual for further requirements and pitfalls. - -<sect>Locations of files -<p> - -The location of all installed files and directories must comply fully -with the Linux File System Standard (FSSTND). The latest version of -this document can be found alongside this manual or on -<ftpsite/tsx-11.mit.edu/ in -<ftppath>/pub/linux/docs/linux-standards/fsstnd/</>. Specific questions -about following the standard may be asked on <prgn/debian-devel/, or -referred to Daniel Quinlan, the FSSTND coordinator, at -<email/quinlan@yggdrasil.com/. -<p> - -<sect1>Manpages -<p> - -You must install manpages in <prgn/nroff/ source form, in appropriate -places under <tt>/usr/man</tt>. You should only use sections 1 to 9 -(see the FSSTND for more details). You must <em/not/ install a -preformatted `cat page'. -<p> - -If no manual page is available for a particular program, utility or -function and this is reported as a bug on debian-bugs, a symbolic link -from the requested manual page to the <manref name=undocumented -section=7> manual page should be provided. This symbolic link can be -created from <tt>debian/rules</> like this: -<example> -ln -s ../man7/undocumented.7 \ - debian/tmp/usr/man/man[1-9]/the_requested_manpage.[1-9] -</example> -This manpage claims that the lack of a manpage has been reported as a -bug, so you may only do this if it really has (you can report it -yourself, if you like). Do not close the bug report until a proper -manpage is available. -<p> - -You may forward a complaint about a missing manpage to the upstream -authors, and mark the bug as forwarded in the Debian bug tracking -system. Even though the GNU Project do not in general consider the -lack of a manpage to be a bug, we do - if they tell you that they -don't consider it a bug you should leave the bug in our bug tracking -system open anyway. -<p> - -Manpages should be installed uncompressed. -<p> - -If one manpage needs to be accesssible via several names it is better -to use a symbolic link than the <tt/.so/ feature, but there is no need -to fiddle with the relevant parts of the upstream source to change -from <tt/.so/ to symlinks - don't do it unless it's easy. Do not -create hard links in the manual page directories, and do not put -absolute filenames in <tt/.so/ directives. The filename in a -<tt/.so/ in a manpage should be relative to the base of the manpage -tree (usually <tt>/usr/man</tt>). - -<sect1>Info documents -<p> - -Info documents should be installed in <tt>/usr/info</tt>. They should -be compressed with <tt/gzip -9/. -<p> - -Your package must call <prgn/install-info/ to update the Info <tt/dir/ -file, in its post-installation script: -<example> -install-info --quiet --section Development Development \ - /usr/info/foobar.info -</example> -<p> - -It is a good idea to specify a section for the location of your -program; this is done with the <tt/--section/ switch. To determine -which section to use, you should use look at <tt>/usr/info/dir</> on -your system and choose the most relevant (or create a new section if -none of the current sections are relevant). Note that the -<tt/--section/ flag takes two arguments; the first is a regular -expression to match (case-insensitively) against an existing section, -the second is used when creating a new one. -<p> - -You must remove the entries in the pre-removal script: -<example> -install-info --quiet --remove /usr/info/foobar.info -</example> -<p> - -If <prgn/install-info/ cannot find a description entry in the Info file -you will have to supply one. See <manref name=install-info section=8> -for details. - -<sect1>Additional documentation -<p> - -Any additional documentation that comes with the package can be -installed at the discretion of the package maintainer. Text -documentation should be installed in a directory -<tt>/usr/doc/<var/package/</tt><footnote>Where <var/package/ is the -name of the package.</footnote> and compressed with <tt/gzip -9/ -unless it is small. -<p> - -If a package comes with large amounts of documentation which many -users of the package will not require you should create a separate -binary package to contain it, so that it does not take up disk space -on the machines of users who do not need or want it installed. -<p> - -It is often a good idea to put text information files that come with -the source package in <tt>/usr/doc/<var/package/</> in the binary -package. However, don't install the instructions for building and -installing the package, of course! - -<sect1>Preferred documentation formats -<p> - -The unification of Debian documentation is being carried out via HTML. -<p> - -If your package comes with extensive documentation in a markup format -that can be converted to various other formats you should if possible -ship HTML versions in the binary package, in the directory -<tt>/usr/doc/<var/package/</> or its subdirectories. -<p> - -Other formats such as PostScript may be provided at your option. - -<sect2>Examples -<p> - -Any examples (configurations, source files, whatever), should be -installed in a directory <tt>/usr/doc/<var/package//examples</tt>. -These files should not be referenced by any program - they're there -for the benefit of the system administrator and users, as -documentation only. - -<sect1 id="copyrightfile"><tt>/usr/doc/copyright/<var/package/</tt> -<p> - -This file must contain details of the authorship and copyright of the -package. It must say where the upstream sources (if any) were -obtained, and explain briefly what modifications were made in the -Debian version of the package compared to the upstream one. It must -name the original authors of the package and the Debian maintainer(s) -who were involved with its creation. -<p> - -It must contain the full text of the copyright notice and any -acknowledgements for the program and the licence terms under which the -program is distributed. If the package is distributed under the GNU -General Public Licence, the GNU Library General Public Licence, the -Regents of the University of California at Berkeley (BSD) licence or -Larry Wall's Artistic Licence please say so instead of including a -copy of the licence. The files <tt/BSD/, <tt/GPL/, <tt/LGPL/ and -<tt/Artistic/ are be available in <tt>/usr/doc/copyright</tt> for you -to refer to. The package's copyright file should not be compressed. -<p> - -Do not use the copyright file as a general <tt/README/ file. If your -package has such a file it should be installed in -<tt>/usr/doc/<var/package//README</> or <tt/README.Debian/ or some -other appropriate place. Do not make links between -<tt>/usr/doc/<var/package/</> and the <tt/copyright/ directory. - -<sect1>Symbolic links -<p> - -Most symbolic links should be relative, not absolute. Absolute links, -in general, cause problems when a file system is not mounted where it -"normally" resides (for example, when mounted via NFS). -<p> - -In particular, symlinks from one part of <tt>/usr</tt> to another -should be relative. -<p> - -In certain cases, however, relative links may cause more problems. -For example, links into <tt>/etc</tt> and <tt>/var</tt> should be -absolute. -<p> - -Note that when creating a relative link using <prgn/ln/ it is not -necessary for the target of the link to exist relative to the working -directory you're running <prgn/ln/ from; nor is it necessary to change -directory to the directory where the link is to be made. Simply -include the string that should appear as the target of the link (this -will be a pathname relative to the directory in which the link -resides) as the first argument to <prgn/ln/. -<p> - -For example, in your <prgn/Makefile/ or <tt>debian/rules</>, do things -like: -<example> -ln -fs gcc $(prefix)/bin/cc -ln -fs gcc debian/tmp/usr/bin/cc -ln -fs ../sbin/sendmail $(prefix)/bin/runq -ln -fs ../sbin/sendmail debian/tmp/usr/bin/runq -</example> - -<sect1>Logfiles -<p> - -Logfiles should usually be named -<tt>/var/log/<var/package/.log</tt>. If you have many logfiles, -or need a separate directory for permissions reasons -(<tt>/var/log</tt> is writeable only by <tt/root/), you should usually -create a directory named <tt>/var/log/<var/package/</tt>. -<p> - -Make sure that any logfiles are rotated occasionally using so that -they don't grow indefinitely; the best way to do this is to use -<prgn/savelog/ program in an <tt>/etc/cron.daily</>, -<tt>/etc/cron.weekly</> or <tt>/etc/cron.monthly</> script. -<p> - -Make sure that any logfiles are removed when the package is purged -(but not when it is only removed), by checking the argument to the -postrm script (see the programmer's manual for details). - -<sect1><tt>/usr/local</> - for the use of the system administrator -<p> - -As mandated by the FSSTND no package should place any files in -<tt>/usr/local</>, either by putting them in the filesystem archive to -be unpacked by <prgn/dpkg/ or by manipulating them in their maintainer -scripts. -<p> - -Every package that searches a number of directories or files for -something (for example, looking for shared libraries in <tt>/lib</> or -<tt>/usr/lib</>) should search an appropriate directory in -<tt>/usr/local</> too. -<p> - -In order that the system administrator may know where to place -additional files a package should create an empty directory in the -appropriate place in <tt>/usr/local</> by supplying it in the -filesystem archive for unpacking by <prgn/dpkg/. The -<tt>/usr/local</> directory itself and all the subdirectories created -by the package should have permissions 2775 (group-writeable and -set-group-id) and be owned by <tt/root.staff/. -<p> - -In the future it will be possible to tell <prgn/dpkg/ not to unpack -files matching certain patterns, so that system administrators who do -not wish these directories in <tt>/usr/local</> do not need to have -them. - -<sect>Permissions and ownerships -<p> - -The rules in this section are guidelines for general use. If -necessary you may deviate from the details below. However, if you do -so you must make sure that what is done is secure and you must try to -be as consistent as possible with the rest of the system. You should -probably also discuss it on <prgn/debian-devel/ first. -<p> - -Files should be owned by <tt/root.root/, and made writeable only by -the owner and universally readable (and executable, if appropriate). -<p> - -Directories should be mode 755 or (for group-writability) mode 2775. -The ownership of the directory should be consistent with its mode - -if a directory is mode 2775, it should be owned by the group that -needs write access to it. -<p> - -Setuid and setgid executables should be mode 4755 or 2755 -respectively, and owned by the appropriate user or group. They should -not be made unreadable (modes like 4711 or 2711 or even 4111); doing -so achieves no extra security, because anyone can find the binary in -the freely available Debian package - it is merely inconvenient. For -the same reason you should not restrict read or execute permissions on -non-set-id executables. -<p> - -Some setuid programs need to be restricted to particular sets of -users, using file permissions. In this case they should be owned by -the uid to which they are set-id, and by the group which should be -allowed to execute them. They should have mode 4754; there is no -point in making them unreadable to those users who must not be allowed -to execute them. -<p> - -Do not arrange that the system administrator can only reconfigure the -package to correspond to their local security policy by changing the -permissions on a binary. Ordinary files installed by <prgn/dpkg/ (as -opposed to conffiles and other similar objects) have their permissions -reset to the distributed permissions when the package is reinstalled. -Instead you should consider (for example) creating a group for people -allowed to use the program(s) and making any setuid executables -executable only by that group. -<p> - -Shared libraries should be installed executable. - -<sect>Configuration files -<p> - -Any configuration files created or used by your package should reside -in <tt>/etc</tt>. If there are several you should consider creating a -subdirectory named after your package. -<p> - -It is almost certain that any file in <tt>/etc</tt> that is in your -package's filesystem archive should be listed in <prgn/dpkg/'s -<tt/conffiles/ control area file. (See the <prgn/dpkg/ programmers' -manual). - -<sect>Maintainer scripts -<p> - -The package installation scripts should avoid producing output which -it is unnecessary for the user to see and should rely on <prgn/dpkg/ to -stave off boredom on the part of a user installing many packages. -This means, amongst other things, using the <tt/--quiet/ option on -<prgn/install-info/. -<p> - -Packages should try to minimise the amount of prompting they need to -do, and they should ensure that the user will only every be asked each -question once. This means that packages should try to use appropriate -shared configuration files (such as <tt>/etc/papersize</> and -<tt>/etc/news/server</>, rather than each prompting for their own -list of required pieces of information. -<p> - -It also means that an upgrade should not ask the same questions again, -unless the user has used <tt/dpkg --purge/ to remove the package's -configuration. The answers to configuration questions should be -stored in an appropriate place in <tt>/etc</> so that the user can -modify them, and how this has been done should be documented. -<p> - -If a package has a vitally important piece of information to pass to -the user (such as "don't run me as I am, you must edit the following -configuration files first or you risk your system emitting -badly-formatted messages"), it should display this in the -<prgn/postinst/ script and prompt the user to hit return to -acknowledge the message. Copyright messages do not count as vitally -important (they belong in <tt>/usr/doc/copyright</>); neither do -instructions on how to use a program (these should be in on line -documentation, where all the users can see them). -<p> - -Any necessary prompting should almost always be confined to the -post-installation script, and should be protected with a conditional -so that unnecssary prompting doesn't happen if a package's -installation fails and the <prgn/postinst/ is called with -<tt/abort-upgrade/, <tt/abort-remove/ or <tt/abort-deconfigure/. -<p> - -Errors which occur during the execution of an installation script -<em/must/ be checked and the installation <em/must not/ continue after -an error. -<p> - -The section below on scripts in general applies to package maintainer -scripts too. - -<sect>Scripts in general -<p> - -All command scripts, including the package maintainer scripts inside -the package and used by <prgn/dpkg/, should have a <tt/#!/ line naming -the shell to be used to interpret them. -<p> - -In the case of Perl scripts this should be <tt>#!/usr/bin/perl</tt>. -<p> - -Shell scripts (<prgn/sh/ and <prgn/bash/) should almost certainly -start with <tt>set -e</> so that errors are detected. Every script -<em/must/ use <tt/set -e/ or check the exit status of <em/every/ -command. -<p> - -Perl scripts should check for errors when making any system calls, -including <tt/open/, <tt/print/, <tt/close/, <tt/rename/ and -<tt/system/. -<p> - -<prgn/csh/ and <prgn/tcsh/ should be avoided as scripting languages. See -Csh Programming Considered Harmful, one of the <tt/comp.unix.*/ FAQs. -If an upstream package comes with <prgn/csh/ scripts then you must make -sure that they start with <tt>#!/bin/csh</tt> and make your package -depend on <prgn/csh/. -<p> - -<sect>Compilation options -<p> - -Generally the following compilation parameters should be used: -<example> -CC = gcc -CFLAGS = -O2 -g -Wall # sane warning options vary between programs -LDFLAGS = # none -install -s # (or use strip on the files in debian/tmp) -</example> -<p> - -Note that all installed binaries should be stripped, either by using -the <tt/-s/ flag to <prgn/install/, or by calling <prgn/strip/ on the -binaries after they have been copied into <tt>debian/tmp</> but -before the tree is made into a package. -<p> - -Make sure that you do not link with <tt/-g/, as this makes a.out -compilers produce huge statically linked binaries. The <tt/-g/ flag -is useful on compilation so that you have available a full set of -debugging symbols in your built source tree, in case anyone should -file a bug report involving (for example) a core dump. -<p> - -The <tt/-N/ flag should not be used. On a.out systems it may have -been useful for some very small binaries, but for ELF it has no good -effect. -<p> - -It is up to the package maintainer to decide what compilation options -are best for the package. Certain binaries (such as -computationally-intensive programs) may function better with certain -flags (<tt/-O3/, for example); feel free to use them. Please use good -judgment here. Don't use flags for the sake of it; only use them if -there is good reason to do so. Feel free to override the upstream -author's ideas about which compilation options are best - they are -often inappropriate for our environment. -<p> - -Please make sure that you use only released versions of shared -libraries to build your packages; otherwise other users will not be -able to run your binaries properly. Producing source packages that -depend on unreleased compilers is also usually a bad idea. - -<sect>Shared library packages -<p> - -Packages involving shared libraries should be split up into several -binary packages. -<p> - -For a straightforward library which has a development environment and -a runtime kit including just shared libraries you need to create two -packages: <tt/<var/libraryname/<var/soname//<footnote><var/soname/ is -the shared object name of the shared library - it's the thing that has -to match exactly between building an executable and running it for the -dynamic linker to be able run the program. Usually the <var/soname/ -is the major number of the library.</footnote> and -<tt/<var/libraryname/<var/soname/-dev/. -<p> - -If you prefer only to support one development version time you may -name the development package <tt/<var/libraryname/-dev/; otherwise you -may wish to use <prgn/dpkg/'s conflicts mechanism to ensure that the -user only installs one development version at a time (after all, -different development versions are likely to have the same header -files in them, causing a filename clash if both are installed). -Typically the development version will also need an exact version -dependency on the runtime library, to make sure that compilation and -linking happens correctly. -<p> - -Packages which use the shared library should have a dependency on the -name of the shared library package, -<tt/<var/libraryname/<var/soname//. When the <var/soname/ changes you -can have both versions of the library installed while moving from the -old library to the new. -<p> - -If your package has some run-time support programs which use the -shared library you must <em/not/ put them in the shared library -package. If you do that then you won't be able to install several -versions of the shared library without getting filename clashes. -Instead, either create a third package for the runtime binaries (this -package might typically be named <tt/<var/libraryname/-runtime/ - note -the absence of the <var/soname/ in the package name) or if the -development package is small include them in there. -<p> - -If you have several shared libraries built from the same source tree -you can lump them all togther into a single shared library package, -provided that you change all their <var/soname/s at once (so that you -don't get filename clashes if you try to install different versions of -the combined shared libraries package). -<p> - -Follow the directions in the <prgn/dpkg/ programmers' manual for -putting the shared library in its package. - -<sect>Application configuration files, dotfiles and <tt>/etc/skel</> -<p> - -Files in <tt>/etc/skel</> will automatically be copied into new user -accounts by <prgn/adduser/. They should not be referenced there by -any program. -<p> - -Therefore, if a program needs a dotfile to exist in advance in -<tt/$HOME/ to work sensibly that dotfile should be installed in -<tt>/etc/skel</> (and listed in conffiles, if it is not generated and -modified dynamically by the package's installation scripts). -<p> - -However, programs that require dotfiles in order to operate sensibly -(dotfiles that they do not create themselves automatically, that is) -are a bad thing, and programs should be configured by the Debian -default installation as close to normal as possible. -<p> - -Therefore, if a program in a Debian package needs to be configured in -some way in order to operate sensibly that configuration should be -done in a site-wide global configuration file elsewhere in -<tt>/etc</>. Only if the program doesn't support a site-wide default -configuration and the package maintainer doesn't have time to add it -should a default per-user file be placed in <tt>/etc/skel</>. -<p> - -<tt>/etc/skel</> should be as empty as we can make it. This is -particularly true because there is no easy mechanism for ensuring that -the appropriate dotfiles are copied into the accounts of existing -users when a package is installed. -<p> - -Ideally the sysadmin should ideally not have to do any configuration -other than that done (semi-)automatically by the postinst script. - -<sect id="mail">Mail processing on Debian systems -<p> - -Debian packages which process electronic mail, whether -mail-user-agents (MUAs) or mail-transport-agents (MTAs), <em/must/ -make sure that they are compatible with the configuration decisions -below. Failure to do this may result in lost mail, broken <tt/From:/ -lines, and other serious brain damage! -<p> - -The mail spool is <tt>/var/spool/mail</> and the interface to send a -mail message is <tt>/usr/sbin/sendmail</> (as per the FSSTND). The -mail spool is part of the base system and not part of the MTA package. -<p> - -Mailboxes are locked using the <tt/<var/username/.lock/ lockfile -convention, rather than <prgn/fcntl/, <prgn/flock/ or <prgn/lockf/. -<p> - -Mailboxes are generally 660 <tt/<var/user/.mail/ unless the user has -chosen otherwise. A MUA may remove a mailbox (unless it has -nonstandard permissions) in which case the MTA or another MUA must -recreate it if needed. Mailboxes must be writeable by group mail. -<p> - -The mail spool is 2775 <tt/mail.mail/, and MUA's need to be setgid -mail to do the locking mentioned above (and obviously need to avoid -accessing other users' mailboxes using this privilege). -<p> - -<tt>/etc/aliases</> is the source file for the system mail aliases -(e.g. postmaster, usenet, etc.) - it is the one which the sysadmin -and postinst scripts may edit. After <tt>/etc/aliases</> is edited -the program or human editing it must call <prgn/newaliases/. All MTA -packages should come with a <prgn/newaliases/ program, even if it does -nothing, but older MTA packages do not do this so programs should not -fail if <prgn/newaliases/ cannot be found. -<p> - -The convention of writing <tt/forward to <var/address// in the mailbox -itself is not supported. Use a <tt/.forward/ file instead. -<p> - -The location for the <prgn/rmail/ program used by UUCP for incoming -mail is <tt>/usr/sbin/rmail</>, as per the FSSTND. Likewise, -<prgn/rsmtp/, for receiving batch-SMTP-over-UUCP, is in -<tt>/usr/sbin/rsmtp</> if it is supported. -<p> - -Smail is not using HoneyDanBer UUCP, whose <prgn/uux/ apparently -accepts <tt/-a/ and <tt/-g/ options. -<p> - -If you need to know what name to use (for example) on outgoing news -and mail messages which are generated locally, you should use the file -<tt>/etc/mailname</>. It will contain the portion after the username -and <tt/@/ (at) sign for email addresses of users on the machine -(followed by a newline). -<p> - -A package should check for the existence of this file. If it exists -it should use it without comment.<footnote>An MTA's prompting -configuration script may wish to prompt the user even if it finds this -file exists.</footnote> If it does not exist it should prompt the user -for the value and store it in <tt>/etc/mailname</> as well as using it -in the package's configuration. The prompt should make it clear that -the name will not just be used by that package. E.g., in this -situation the INN package says: -<example> -Please enter the `mail name' of your system. This is the hostname -portion of the address to be shown on outgoing news and mail messages. -The default is <var/syshostname/, your system's host name. -Mail name [`<var/syshostname/']: -</example> -where <var/syshostname/ is the output of <tt/hostname -fqdn/. - - -<sect>Packages which can use the X shared libraries -<p> - -Some programs can be configured with or without support for X Windows. -Typically these binaries produced when configured for X will need the -X shared libraries to run. -<p> - -Such programs should be configured <em/with/ X support, and should -declare a dependency on <tt/elf-x11r6lib/ (for the X11R6 libraries). -Users who wish to use the program can install just the relatively -small <tt/xlib/ package, and do not need to install the whole of X. -<p> - -Do not create two versions (one with X support and one without) of -your package. - - -<sect>Games -<p> - -The permissions on /var/lib/games are 755 <tt/root.root/. -<p> - -Each game decides on its own security policy. -<p> - -Games which require protected, privileged access to high-score files, -savegames, &c, must be made set-<em/group/-id (mode 2755) and -owned by <tt/root.games/, and use files and directories with -appropriate permissions (770 <tt/root.games/, for example). They must -<em/not/ be made set-<em/user/-id, as this causes security -problems.<footnote>If an attacker can subvert any set-user-id game -they can overwrite the executable of any other, causing other players -of these cames to run a trojan. With a set-group-id game the attacker -only gets access to less important game data, and if they can get at -the other players' accounts at all it will take considerably more -effort.</footnote> -<p> - -Some packages, for example some fortune cookie programs, are -configured by the upstream authors to install with their data files or -other static information made unreadable so that they can only be -accessed through set-id programs provided. Do not do this in a Debian -package: anyone can download the <tt/.deb/ file and read the data from -it, so there is no point making the files unreadable. Not making the -files unreadable also means that you don't have to make so many -programs set-id, which reduces the risk of a security hole. - -<sect>Allocating package-specific users and groups -<p> - -If you need to create a new user or group for your package there are -two possibilities. Firstly, you may need to make some files in the -binary package be owned by this user or group, or you may need to -compile the user or group id (rather than just the name) into the -binary (though this latter should be avoided if possible). In this -case you need a statically allocated id. -<p> - -You must ask for a user or group id from the base system maintainer, -and must not release the package until you have been allocated one. -Once you have been allocated one you must make the package depend -on a version of the base system with the id present in -<tt>/etc/passwd</tt> or <tt>/etc/group</tt>, or alternatively arrange -for your package to create the user or group itself with the correct -id (using <tt/adduser/) in its pre- or post-installation script (the -latter is to be preferred if it is possible). -<p> - -On the other hand, the program may able to determine the uid or gid -from the group name at runtime, so that a dynamic id can be used. In -this case you must choose an appropriate user or group name, -discussing this on <prgn/debian-devel/ and checking with the base system -maintainer that it is unique and that they do not wish you to use a -statically allocated id instead. When this has been checked you must -arrange for your package to create the user or group if necessary -using <prgn/adduser/ in the pre- or post-installation script (again, the -latter is to be preferred if it is possible). -<p> - -Note that changing the numeric value of an id associated with a name -is very difficult, and involves searching the filesystem for all -appropriate files. You need to think carefully whether a static or -dynamic id is required, since changing your mind later will cause -problems. - -<chapt id="sourcepkg">Source package - -<sect>Documentation and the <tt/changelog/ -<p> - -Document your changes and updates to the source package properly in -the <tt>debian/changelog</tt> file. -<p> - -A copy of the file which will be installed in -<tt>/usr/doc/copyright/<var/package/</tt> should be in -<tt>debian/copyright</tt>. -<p> - -In non-experimental packages you may only use a format for -<tt>debian/changelog</> which is supported by the most recent released -version of <prgn/dpkg/. If your format is not supported and there is -general support for it you should contact the <prgn/dpkg/ maintainer -to have the parser script for your format included in the <prgn/dpkg/ -package.<footnote>You will need to agree that the parser and its -manpage may be distributed under the GNU GPL, just as the rest of -<prgn/dpkg/ is.</footnote> - -<sect>Changes to the upstream sources -<p> - -If you need to edit a <prgn/Makefile/ where GNU-style <prgn/configure/ -scripts are used, you should edit the <tt/.in/ files rather than -editing the <prgn/Makefile/ directly. This allows the user to -reconfigure the package if necessary. You should <em/not/ configure -the package and edit the generated <prgn/Makefile/! This makes it -impossible for someone else to later reconfigure the package. -<p> - -If changes to the source code are made that are generally applicable -please try to get them included in the upstream version of the package -by supplying the upstream authors with the changes in whatever form -they prefer. -<p> - -If you need to configure the package differently for Debian or for -Linux, and the upstream source doesn't provide a way to configure it -the way you need to, please add such configuration facilities (for -example, a new <prgn/autoconf/ test or <tt/#define/) and send the -patch to the upstream authors, with the default set to the way they -originally had it. You can then easily override the default in your -<tt>debian/rules</tt> or wherever is appropriate. - -<sect>Error trapping in makefiles -<p> - -When <prgn/make/ invokes a command in a makefile (including your -package's upstream makefiles and the <tt>debian/rules</>) it does so -using <tt/sh/. This means that <tt/sh/'s usual bad error handling -properties apply: if you include a miniature script as one of the -commands in your makefile you'll find that if you don't do anything -about it then errors are not detected and <prgn/make/ will blithely -continue after problems. -<p> - -Every time you put more than one shell command (this includes using a -loop) in a makefile command you <em/must/ make sure that errors are -trapped. For simple compound commands, such as changing directory and -then running a program, using <tt/&&/ rather than semicolon as -a command separator is sufficient. For more complex commands -including most loops and conditionals you must include a separate -<tt/set -e/ command at the start of every makefile command that's -actually one of these miniature shellscripts. - -<sect>Permissions -<p> - -All the files in the source package should be world-readable and -user-writeable. Directories and executable programs should be -world-exectuable. None of the files should be world-writeable. The -files may or may not be group-writeable, and directories may or may -not be setgid. Pipes should not be world-readable and should be -either both group readable and writeable or neither (and they should -not be executable). -<p> - -In summary: data files may be <tt/664/, <tt/644/. Executable files -may be <tt/775/ or <tt/755/. Directories may be <tt/775/, <tt/755/, -<tt/2775/ or <tt/2755/. Pipes may be <tt/660/ or <tt/600/. - -<chapt id="developer">How to become a Debian developer - -<sect>Before you start work -<p> - -So, you've read all the documentation, you understand what everything -in the <prgn/hello/ example package is for, and you're about to -Debianise your favourite package. How do you actually become a Debian -developer so that your work can be incorporated into the Project? -<p> - -Firstly, subscribe to <prgn/debian-devel/ if you haven't already. -Send the word <tt/subscribe/ in the <em/Subject/ of a mail to -<email/debian-devel-REQUEST@lists.debian.org/. In case of problems -contact the list administrator, Anders Chrigstrom <email/ac@netg.se/. -<p> - -You should to subscribe and lurk for a bit before doing any coding, -and you should post about your intentions to work on something to -avoid duplicated effort. -<p> - -If you do not have a PGP key yet generate one. You should probably -read the PGP manual, as it has much important information which is -critical to its security. Many more security failures are due to -human error than to software failure or high-powered spy techniques. - -<sect>When you have a package to upload -<p> - -When you have your package ready to be uploaded you must send a -message to the project leader, Bruce Perens <email/bruce@pixar.com/, -the administrator of <tt/master.debian.org/, Simon Shapiro -<email/shimon@i-connect.net/, the mailing list administrator, Anders -Chrigstrom <email/ac@netg.se/ and the <prgn/dpkg/ maintainer, Ian -Jackson <email/ijackson@gnu.ai.mit.edu/. -<p> - -The message should say what you've done and who you are, and should -ask for an account on <prgn/master/ and to be subscribed to -<prgn/debian-private/ (the developers-only mailing list). It should -contain your PGP key (extracted using <tt/pgp -kxa/) for the database -of keys which is shipped with <prgn/dpkg/. - -When you have your personal account on <prgn/master/ log in and -transfer the files to -<tt>/home/Debian/ftp/private/project/Incoming</>. You cannot upload -to <prgn/Incoming/ on <prgn/master/ using anonymous FTP. -<p> - -You can also upload files to <prgn/Incoming/ via a <prgn/cron/-driven -upload queue in Europe on <ftpsite/chiark.chu.cam.ac.uk/. For details -connect to <prgn/chiark/ using anonymous FTP and read -<ftppath>/pub/debian/private/project/README.how-to-upload</ftppath>. - -<sect id="changesfiles">Upload handling - <tt/.changes/ files -<p> - -When a package is uploaded to the Debian FTP archive, it must be -accompanied by a <tt/.changes/ file which gives directions for its -handling. This is usually generated by <prgn/dpkg-genchanges/. -<p> - -This file is a control file with the following fields: -<list compact> -<item><tt/Format/ -<item><tt/Date/ -<item><tt/Source/ -<item><tt/Binary/ -<item><tt/Architecture/ -<item><tt/Version/ -<item><tt/Distribution/ -<item><tt/Urgency/ -<item><tt/Maintainer/ -<item><tt/Description/ -<item><tt/Changes/ -<item><tt/Files/ -</list> -<p> - -All of them are mandatory for a Debian upload. See the list of -control fields in the <prgn/dpkg/ programmers' manual for the contents -of these fields. - - -<chapt id="mailinglists">The Debian mailing lists -<p> - -The mailing list server is at <tt/lists.debian.org/. Mail -<tt/debian-<var/foo/-REQUEST@lists.debian.org/<footnote>where -<tt/debian-<var/foo// is the name of the list</footnote> with the word -<tt/subscribe/ in the Subject to subscribe or <tt/unsubscribe/ to -unsubscribe. -<p> - -When replying to messages on the mailing list, please do not send a -carbon copy (<tt/CC/ - this does not mean `courtesy copy') to the -original poster. Anyone who posts to a mailing list should read it to -see the responses. -<p> - -As ever on the net, please trim down the quoting of articles you're -replying to. - -</book> diff --git a/doc/programmer.sgml b/doc/programmer.sgml index 6360d245..509e7159 100644 --- a/doc/programmer.sgml +++ b/doc/programmer.sgml @@ -259,6 +259,49 @@ This file contains a list of configuration files which are to be handled automatically by <prgn/dpkg/ (see <ref id="conffiles">). Note that not necessarily every configuration file should be listed here. +<tag><tt/shlibs/ +<item> + +This file contains a list of the shared libraries supplied by the +package, with dependency details for each. This is used by +<prgn/dpkg-shlibdeps/ when it determines what dependencies are +required in a package control file. +<p> + +Each line is of the form: +<example> +<var/library-name/ <var/version-or-soname/ <var/dependencies .../ +</example> +<p> + +<var/library-name/ is the name of the shared library, for example +<tt/libc5/. +<p> + +<var/version-or-soname/ is the soname of the library - ie, the thing +that must exactly match for the library to be recognised by +<prgn/ld.so/. Usually this is major version number of the library. +<p> + +<var/dependencies/ has the same syntax as a dependency field in a +binary package control file. It should give details of which +package(s) are required to satisfy a binary built against the version +of the library contained in the package. See <ref id="depsyntax">. +<p> + +For example, if the package <tt/foo/ contains <tt/libfoo.so.1.2.3/, +where the soname of the library is <tt/libfoo.so.1/, and the first +version of the package which contained a minor number of at least +<tt/2.3/ was <var/1.2.3-1/, then the package's <var/shlibs/ could +say: +<example> +libfoo 1 foo (>= 1.2.3-1) +</example> +<p> + +The version-specific dependency is to avoid warnings from <prgn/ld.so/ +about using older shared libraries with newer binaries. + </taglist> <sect id="controlfile">The main control information file: <tt/control/ @@ -292,6 +335,7 @@ installed.</footnote> <item><qref id="f-classification"><tt/Section/, <tt/Priority/</> <item><qref id="f-Source"><tt/Source/</> <item><qref id="descriptions"><tt/Description/</> +<item><qref id="f-Installed-Size"><tt/Installed-Size/</> </list> <p> @@ -1152,6 +1196,16 @@ commas.<footnote>A space after each comma is conventional.</footnote> Currently the packages must be separated using only spaces in the <tt/.changes/ file. +<sect1 id="f-Installed-Size"><tt/Installed-Size/ +<p> + +This field appears in the control files of binary packages, and in the +<tt/Packages/ files. It gives the total amount of disk space +required to install the named package. +<p> + +The disk space is represented in kilobytes as a simple decimal number. + <sect1 id="f-Files"><tt/Files/ <p> @@ -1989,7 +2043,7 @@ This is done using the <tt/Depends/, <tt/Recommends/, <tt/Suggests/, <tt/Conflicts/, <tt/Provides/ and <tt/Replaces/ control file fields. <p> -<sect>Syntax of relationship fields +<sect id="depsyntax">Syntax of relationship fields <p> These fields all have a uniform syntax. They are a list of package diff --git a/dpkg-deb/info.c b/dpkg-deb/info.c index 987a05bd..a3ddbc29 100644 --- a/dpkg-deb/info.c +++ b/dpkg-deb/info.c @@ -48,7 +48,7 @@ static void cu_info_prepare(int argc, void **argv) { if (lstat(directory,&stab) && errno==ENOENT) return; if ((c1= fork()) == -1) { perror("failed to fork for cleanup"); return; } if (!c1) { - execlp(RM,"rm","-r",directory,(char*)0); + execlp(RM,"rm","-rf",directory,(char*)0); perror("failed to exec " RM " for cleanup"); _exit(1); } if (waitpid(c1,&status,0) != c1) { perror("failed to wait for rm cleanup"); return; } diff --git a/include/dpkg-db.h b/include/dpkg-db.h index b2de971c..e84745d7 100644 --- a/include/dpkg-db.h +++ b/include/dpkg-db.h @@ -90,7 +90,7 @@ struct pkginfoperfile { /* pif */ struct dependency *depends; struct deppossi *depended; int essential; /* The `essential' flag, 1=yes, 0=no (absent) */ - char *description, *maintainer, *source, *architecture; + char *description, *maintainer, *source, *architecture, *installedsize; struct versionrevision version; struct conffile *conffiles; struct arbitraryfield *arbs; diff --git a/lib/database.c b/lib/database.c index 02c3c3cf..e2043116 100644 --- a/lib/database.c +++ b/lib/database.c @@ -129,7 +129,7 @@ void blankpackageperfile(struct pkginfoperfile *pifp) { pifp->essential= 0; pifp->depends= 0; pifp->depended= 0; - pifp->description= pifp->maintainer= pifp->source= 0; + pifp->description= pifp->maintainer= pifp->source= pifp->installedsize= 0; pifp->architecture= 0; blankversion(&pifp->version); pifp->conffiles= 0; @@ -155,6 +155,7 @@ int informative(struct pkginfo *pkg, struct pkginfoperfile *info) { if (info->depends || nes(info->description) || nes(info->maintainer) || + nes(info->installedsize) || nes(info->source) || nes(info->architecture) || informativeversion(&info->version) || diff --git a/lib/parse.c b/lib/parse.c index 499dddfc..728756ae 100644 --- a/lib/parse.c +++ b/lib/parse.c @@ -31,32 +31,33 @@ const struct fieldinfo fieldinfos[]= { /* NB: capitalisation of these strings is important. */ - { "Package", f_name, w_name }, - { "Essential", f_boolean, w_booleandefno, PKGIFPOFF(essential) }, - { "Status", f_status, w_status }, - { "Priority", f_priority, w_priority }, - { "Section", f_section, w_section }, - { "Maintainer", f_charfield, w_charfield, PKGIFPOFF(maintainer) }, - { "Architecture", f_charfield, w_charfield, PKGIFPOFF(architecture) }, - { "Source", f_charfield, w_charfield, PKGIFPOFF(source) }, - { "Version", f_version, w_version }, - { "Revision", f_revision, w_null }, - { "Config-Version", f_configversion, w_configversion }, - { "Replaces", f_dependency, w_dependency, dep_replaces }, - { "Provides", f_dependency, w_dependency, dep_provides }, - { "Depends", f_dependency, w_dependency, dep_depends }, - { "Pre-Depends", f_dependency, w_dependency, dep_predepends }, - { "Recommends", f_dependency, w_dependency, dep_recommends }, - { "Suggests", f_dependency, w_dependency, dep_suggests }, - { "Conflicts", f_dependency, w_dependency, dep_conflicts }, - { "Conffiles", f_conffiles, w_conffiles }, - { "Filename", f_filecharf, w_filecharf, FILEFOFF(name) }, - { "Size", f_filecharf, w_filecharf, FILEFOFF(size) }, - { "MD5sum", f_filecharf, w_filecharf, FILEFOFF(md5sum) }, - { "MSDOS-Filename", f_filecharf, w_filecharf, FILEFOFF(msdosname) }, - { "Description", f_charfield, w_charfield, PKGIFPOFF(description) }, + { "Package", f_name, w_name }, + { "Essential", f_boolean, w_booleandefno, PKGIFPOFF(essential) }, + { "Status", f_status, w_status }, + { "Priority", f_priority, w_priority }, + { "Section", f_section, w_section }, + { "Installed-Size", f_charfield, w_charfield, PKGIFPOFF(installedsize) }, + { "Maintainer", f_charfield, w_charfield, PKGIFPOFF(maintainer) }, + { "Architecture", f_charfield, w_charfield, PKGIFPOFF(architecture) }, + { "Source", f_charfield, w_charfield, PKGIFPOFF(source) }, + { "Version", f_version, w_version }, + { "Revision", f_revision, w_null }, + { "Config-Version", f_configversion, w_configversion }, + { "Replaces", f_dependency, w_dependency, dep_replaces }, + { "Provides", f_dependency, w_dependency, dep_provides }, + { "Depends", f_dependency, w_dependency, dep_depends }, + { "Pre-Depends", f_dependency, w_dependency, dep_predepends }, + { "Recommends", f_dependency, w_dependency, dep_recommends }, + { "Suggests", f_dependency, w_dependency, dep_suggests }, + { "Conflicts", f_dependency, w_dependency, dep_conflicts }, + { "Conffiles", f_conffiles, w_conffiles }, + { "Filename", f_filecharf, w_filecharf, FILEFOFF(name) }, + { "Size", f_filecharf, w_filecharf, FILEFOFF(size) }, + { "MD5sum", f_filecharf, w_filecharf, FILEFOFF(md5sum) }, + { "MSDOS-Filename", f_filecharf, w_filecharf, FILEFOFF(msdosname) }, + { "Description", f_charfield, w_charfield, PKGIFPOFF(description) }, /* Note that aliases are added to the nicknames table in parsehelp.c. */ - { 0 /* sentinel - tells code that list is ended */ } + { 0 /* sentinel - tells code that list is ended */ } }; #define NFIELDS (sizeof(fieldinfos)/sizeof(struct fieldinfo)) const int nfields= NFIELDS; diff --git a/main/processarc.c b/main/processarc.c index 8f77b542..ca542793 100644 --- a/main/processarc.c +++ b/main/processarc.c @@ -751,6 +751,7 @@ void process_archive(const char *filename) { pkg->installed.maintainer= pkg->available.maintainer; pkg->installed.source= pkg->available.source; pkg->installed.architecture= 0; /* This is irrelevant in the status file. */ + pkg->installed.installedsize= pkg->available.installedsize; pkg->installed.version= pkg->available.version; /* We have to generate our own conffiles structure. */ @@ -887,6 +888,7 @@ void process_archive(const char *filename) { otherpkg->installed.depends= 0; otherpkg->installed.essential= 0; otherpkg->installed.description= otherpkg->installed.maintainer= 0; + otherpkg->installed.installedsize= otherpkg->installed.source= 0; otherpkg->installed.conffiles= 0; blankversion(&otherpkg->installed.version); otherpkg->installed.arbs= 0; diff --git a/main/remove.c b/main/remove.c index 86bc81e3..993588d8 100644 --- a/main/remove.c +++ b/main/remove.c @@ -457,6 +457,7 @@ void removal_bulk(struct pkginfo *pkg) { pkg->installed.depends= 0; pkg->installed.essential= 0; pkg->installed.description= pkg->installed.maintainer= 0; + pkg->installed.source= pkg->installed.installedsize= 0; blankversion(&pkg->installed.version); pkg->installed.arbs= 0; } diff --git a/scripts/Makefile.in b/scripts/Makefile.in index a6d86781..fb60808d 100644 --- a/scripts/Makefile.in +++ b/scripts/Makefile.in @@ -39,8 +39,8 @@ perlpath = @perlpath@ MAN1 = dpkg-name dpkg-source 822-date LSMAN = dpkg-source.$(man1) LSMANL= dpkg-gencontrol dpkg-genchanges dpkg-buildpackage \ - dpkg-distaddfile dpkg-parsechangelog -EXC = dpkg-name dpkg-source dpkg-genchanges dpkg-gencontrol \ + dpkg-distaddfile dpkg-parsechangelog dpkg-shlibdeps +EXC = dpkg-name dpkg-source dpkg-genchanges dpkg-gencontrol dpkg-shlibdeps \ dpkg-buildpackage dpkg-parsechangelog dpkg-distaddfile 822-date MAN8 = update-rc.d start-stop-daemon update-alternatives install-info \ dpkg-scanpackages diff --git a/scripts/controllib.pl b/scripts/controllib.pl index 151a56e7..f662b6f8 100644 --- a/scripts/controllib.pl +++ b/scripts/controllib.pl @@ -1,11 +1,12 @@ $parsechangelog= 'dpkg-parsechangelog'; -grep($capit{lc $_}=$_, qw(Pre-Depends Standards-Version)); +grep($capit{lc $_}=$_, qw(Pre-Depends Standards-Version Installed-Size)); $substvar{'Format'}= 1.5; -$substvar{'newline'}= "\n"; -$substvar{'space'}= " "; -$substvar{'tab'}= "\t"; +$substvar{'Newline'}= "\n"; +$substvar{'Space'}= " "; +$substvar{'Tab'}= "\t"; +$maxsubsts=50; $progname= $0; $progname= $& if $progname =~ m,[^/]+$,; @@ -18,16 +19,20 @@ sub findarch { $arch=`dpkg --print-architecture`; $? && &subprocerr("dpkg --print-archictecture"); $arch =~ s/\n$//; - $substvar{'arch'}= $arch; + $substvar{'Arch'}= $arch; } sub substvars { my ($v) = @_; - my $lhs,$vn,$rhs; + my $lhs,$vn,$rhs,$count; + $count=0; while ($v =~ m/\$\{([-:0-9a-z]+)\}/i) { + $count < $maxsubsts || + &error("too many substitutions - recursive ? - in \`$v'"); $lhs=$`; $vn=$1; $rhs=$'; if (defined($substvar{$vn})) { $v= $lhs.$substvar{$vn}.$rhs; + $count++; } else { &warn("unknown substitution variable \${$vn}"); $v= $lhs.$rhs; @@ -37,14 +42,14 @@ sub substvars { } sub outputclose { - for $f (keys %f) { $substvar{"f:$f"}= $f{$f}; } + for $f (keys %f) { $substvar{"F:$f"}= $f{$f}; } if (length($varlistfile)) { $varlistfile="./$varlistfile" if $varlistfile =~ m/\s/; if (open(SV,"< $varlistfile")) { while (<SV>) { next if m/^\#/ || !m/\S/; s/\s*\n$//; - m/^(\w+)\=/ || + m/^(\w[-:0-9A-Za-z]*)\=/ || &error("bad line in substvars file $varlistfile at line $."); $substvar{$1}= $'; } @@ -56,6 +61,7 @@ sub outputclose { for $f (sort { $fieldimps{$b} <=> $fieldimps{$a} } keys %f) { $v= $f{$f}; $v= &substvars($v); + $v =~ m/\S/ || next; # delete whitespace-only fields $v =~ m/\n\S/ && &internerr("field $f has newline then non whitespace >$v<"); $v =~ m/\n[ \t]*\n/ && &internerr("field $f has blank lines >$v<"); $v =~ m/\n$/ && &internerr("field $f has trailing newline >$v<"); @@ -91,7 +97,7 @@ sub parsechangelog { } &parsecdata('L',0,"parsed version of changelog"); close(CDATA); $? && &subprocerr("parse changelog"); - $substvar{'sourceversion'}= $fi{"L Version"}; + $substvar{'Source-Version'}= $fi{"L Version"}; } diff --git a/scripts/dpkg-buildpackage.sh b/scripts/dpkg-buildpackage.sh index 024419bc..7b4d4402 100644 --- a/scripts/dpkg-buildpackage.sh +++ b/scripts/dpkg-buildpackage.sh @@ -18,6 +18,7 @@ Options: -r<gain-root-command> -B (binary-only, no arch-indep files) -us (unsigned source) -uc (unsigned changes) + -h print this message END } diff --git a/scripts/dpkg-distaddfile.pl b/scripts/dpkg-distaddfile.pl index ddbdb345..6bbfebca 100644 --- a/scripts/dpkg-distaddfile.pl +++ b/scripts/dpkg-distaddfile.pl @@ -18,8 +18,9 @@ Ian Jackson. This is free software; see the GNU General Public Licence version 2 or later for copying conditions. There is NO warranty. Usage: - dpkg-addfile <filename> <section> <priority> + dpkg-distaddfile <filename> <section> <priority> Options: -f<fileslistfile> write files here instead of debian/files + -h print this message "; } diff --git a/scripts/dpkg-genchanges.pl b/scripts/dpkg-genchanges.pl index 53d0ee3c..44a7bc9f 100644 --- a/scripts/dpkg-genchanges.pl +++ b/scripts/dpkg-genchanges.pl @@ -37,6 +37,7 @@ Options: -b binary-only build - no source files -T<varlistfile> read variables here, not debian/substvars -D<field>=<value> override or add a field and value -U<field> remove a field + -h print this message "; } @@ -70,7 +71,7 @@ while (@ARGV) { $override{$1}= $'; } elsif (m/^-U([^\=:]+)$/) { $remove{$1}= 1; - } elsif (m/^-V(\w+)[=:]/) { + } elsif (m/^-V(\w[-:0-9A-Za-z]*)[=:]/) { $substvar{$1}= $'; } elsif (m/^-h$/) { &usageversion; exit(0); diff --git a/scripts/dpkg-gencontrol.pl b/scripts/dpkg-gencontrol.pl index e2176b2e..4a8c28f6 100644 --- a/scripts/dpkg-gencontrol.pl +++ b/scripts/dpkg-gencontrol.pl @@ -7,6 +7,7 @@ $controlfile= 'debian/control'; $changelogfile= 'debian/changelog'; $fileslistfile= 'debian/files'; $varlistfile= 'debian/substvars'; +$packagebuilddir= 'debian/tmp'; use POSIX; use POSIX qw(:errno_h); @@ -28,6 +29,8 @@ Options: -p<package> print control file for package -F<changelogformat> force change log format -v<forceversion> set version of binary package -f<fileslistfile> write files here instead of debian/files + -P<packagebuilddir> temporary build dir instead of debian/tmp + -O write to stdout, not .../DEBIAN/control -is include section field -ip include priority field -isp|-ips include both section and priority @@ -35,13 +38,14 @@ Options: -p<package> print control file for package -U<field> remove a field -V<name>=<value> set a substitution variable -T<varlistfile> read variables here, not debian/substvars + -h print this message "; } $i=100;grep($fieldimps{$_}=$i--, qw(Package Version Section Priority Architecture Essential Pre-Depends Depends Recommends Suggests Optional Conflicts Replaces - Provides Maintainer Source Description)); + Provides Installed-Size Maintainer Source Description)); while (@ARGV) { $_=shift(@ARGV); @@ -51,10 +55,14 @@ while (@ARGV) { $controlfile= $'; } elsif (m/^-l/) { $changelogfile= $'; + } elsif (m/^-P/) { + $packagebuilddir= $'; } elsif (m/^-f/) { $fileslistfile= $'; } elsif (m/^-v(.+)$/) { $forceversion= $1; + } elsif (m/^-O$/) { + $stdout= 1; } elsif (m/^-is$/) { $spinclude{'Section'}=1; } elsif (m/^-ip$/) { @@ -68,7 +76,7 @@ while (@ARGV) { $override{$1}= $'; } elsif (m/^-U([^\=:]+)$/) { $remove{$1}= 1; - } elsif (m/^-V(\w+)[=:]/) { + } elsif (m/^-V(\w[-:0-9A-Za-z]*)[=:]/) { $substvar{$1}= $'; } elsif (m/^-T/) { $varlistfile= $'; @@ -173,6 +181,24 @@ if ($oppackage ne $sourcepackage || $verdiff) { $f{'Source'}.= " ($sourceversion)" if $verdiff; } +if (!defined($substvar{'Installed-Size'})) { + defined($c= open(DU,"-|")) || &syserr("fork for du"); + if (!$c) { + chdir("$packagebuilddir") || &syserr("chdir for du to \`$packagebuilddir'"); + exec("du","-k","-s","."); &syserr("exec du"); + } + $duo=''; while (<DU>) { $duo.=$_; } + close(DU); $? && &subprocerr("du in \`$packagebuilddir'"); + $duo =~ m/^(\d+)\s+\.$/ || &failure("du gave unexpected output \`$duo'"); + $substvar{'Installed-Size'}= $1; +} +if (defined($substvar{'Extra-Size'})) { + $substvar{'Installed-Size'} += $substvar{'Extra-Size'}; +} +if (length($substvar{'Installed-Size'})) { + $f{'Installed-Size'}= $substvar{'Installed-Size'}; +} + $fileslistfile="./$fileslistfile" if $fileslistfile =~ m/^\s/; open(Y,"> $fileslistfile.new") || &syserr("open new files list file"); if (open(X,"< $fileslistfile")) { @@ -194,7 +220,16 @@ rename("$fileslistfile.new",$fileslistfile) || &syserr("install new files list f for $f (keys %override) { $f{&capit($f)}= $override{$f}; } for $f (keys %remove) { delete $f{&capit($f)}; } +if (!$stdout) { + $cf= "$packagebuilddir/DEBIAN/control"; + $cf= "./$cf" if $cf =~ m/^\s/; + open(STDOUT,"> $cf.new") || + &syserr("cannot open new output control file \`$cf.new'"); +} &outputclose; +if (!$stdout) { + rename("$cf.new","$cf") || &syserr("cannot install output control file \`$cf'"); +} sub spfileslistvalue { $r= $spvalue{$_[0]}; diff --git a/scripts/dpkg-parsechangelog.pl b/scripts/dpkg-parsechangelog.pl index a663cd32..f5eeb5ea 100644 --- a/scripts/dpkg-parsechangelog.pl +++ b/scripts/dpkg-parsechangelog.pl @@ -20,8 +20,12 @@ sub usageversion { Ian Jackson. This is free software; see the GNU General Public Licence version 2 or later for copying conditions. There is NO warranty. -Usage: dpkg-parsechangelog [-L<libdir>] [-F<format>] [-v<version>] - [-lchangelogfile] +Usage: dpkg-parsechangelog [<option> ...] +Options: -l<changelogfile> get per-version info from this file + -v<sinceversion> include all changes later than version + -F<changelogformat> force change log format + -L<libdir> look for change log parsers in <libdir> + -h print this message "; } diff --git a/scripts/dpkg-shlibdeps.pl b/scripts/dpkg-shlibdeps.pl new file mode 100644 index 00000000..9a655ce9 --- /dev/null +++ b/scripts/dpkg-shlibdeps.pl @@ -0,0 +1,198 @@ +#!/usr/bin/perl + +$dpkglibdir= "."; +$version= '1.3.6'; # This line modified by Makefile + +use POSIX; +use POSIX qw(:errno_h :signal_h); + +$shlibsoverride= '/etc/dpkg/shlibs.override'; +$shlibsdefault= '/etc/dpkg/shlibs.default'; +$shlibsppdir= '/var/lib/dpkg/info'; +$shlibsppext= '.shlibs'; +$varnameprefix= 'shlibs'; +$dependencyfield= 'Depends'; +$varlistfile= 'debian/substvars'; + +@depfields= qw(Suggests Recommends Depends Pre-Depends); + +push(@INC,$dpkglibdir); +require 'controllib.pl'; + +sub usageversion { + print STDERR +"Debian GNU/Linux dpkg-shlibdeps $version. Copyright (C) 1996 +Ian Jackson. This is free software; see the GNU General Public Licence +version 2 or later for copying conditions. There is NO warranty. + +Usage: + dpkg-shlibdeps [<option> ...] <executable>|-e<executable> [<option>] ... +Positional arguments/options (order is significant): + <executable> } include dependencies for <executable> + -e<executable> } (use -e if <executable> starts with \`-') + -d<dependencyfield> next executable(s) set shlibs:<dependencyfield> +Overall options (have global effect no matter where placed): + -p<varnameprefix> set <varnameprefix>:* instead of shlibs:*. + -O print variable settings to stdout + -T<varlistfile> update variables here, not debian/substvars +Dependency fields recognised are ".join("/",@depfields)." +"; +} + +$i=0; grep($depstrength{$_}= ++$i, @depfields); + +while (@ARGV) { + $_=shift(@ARGV); + if (m/^-T/) { + $varlistfile= $'; + } elsif (m/^-p(\w[-:0-9A-Za-z]*)$/) { + $varnameprefix= $1; + } elsif (m/^-O$/) { + $stdout= 1; + } elsif (m/^-h$/) { + usageversion; exit(0); + } elsif (m/^-d/) { + $dependencyfield= capit($'); + defined($depstrength{$dependencyfield}) || + &warn("unrecognised dependency field \`$dependencyfield'"); + } elsif (m/^-e/) { + push(@exec,$'); push(@execf,$dependencyfield); + } elsif (m/^-/) { + usageerr("unknown option \`$_'"); + } else { + push(@exec,$_); push(@execf,$dependencyfield); + } +} + +@exec || usageerr("need at least one executable"); + +for ($i=0;$i<=$#exec;$i++) { + defined($c= open(P,"-|")) || syserr("cannot fork for ldd"); + if (!$c) { exec("ldd","--",$exec[$i]); syserr("cannot exec ldd"); } + $nthisldd=0; + while (<P>) { + s/\n$//; + if (m,^\t(\S+)\.so\.(\S+) \=\> (/\S+)$,) { + push(@libname,$1); push(@libsoname,$2); push(@libpath,$3); + push(@libf,$execf[$i]); + push(@libpaths,$3) if !$libpathadded{$3}++; + $nthisldd++; + } else { + &warn("unknown output from ldd on \`$exec[$i]': \`$_'"); + } + } + close(P); $? && subprocerr("ldd on \`$exec[$i]'"); + $nthisldd || &warn("ldd on \`$exec[$i]' gave nothing on standard output"); +} + +grep(s/\[\?\*/\\$&/g, @libpaths); +defined($c= open(P,"-|")) || syserr("cannot fork for dpkg --search"); +if (!$c) { exec("dpkg","--search","--",@libpaths); syserr("cannot exec dpkg"); } +while (<P>) { + s/\n$//; + if (m/^local diversion |^diversion by/) { + &warn("diversions involved - output may be incorrect"); + print(STDERR " $_\n") || syserr("write diversion info to stderr"); + } elsif (m=^(\S+(, \S+)*): (/.+)$=) { + $pathpackages{$+}= $1; + } else { + &warn("unknown output from dpkg --search: \`$_'"); + } +} +close(P); $? && subprocerr("dpkg --search"); + +for ($i=0;$i<=$#libname;$i++) { + scanshlibsfile($shlibsoverride,$libname[$i],$libsoname[$i],$libf[$i]) && next; + if (!defined($pathpackages{$libpath[$i]})) { + &warn("could not find any packages for $libpath[$i]". + " ($libname[$i].so.$libsoname[$i])"); + } else { + @packages= split(/, /,$pathpackages{$libpath[$i]}); + for $p (@packages) { + scanshlibsfile("$shlibsppdir/$p$shlibsppext", + $libname[$i],$libsoname[$i],$libf[$i]) && next; + } + } + scanshlibsfile($shlibsdefault,$libname[$i],$libsoname[$i],$libf[$i]) && next; + &warn("unable to find dependency information for ". + "shared library $libname[$i] (soname $libsoname[$i], path $libpath[$i], ". + "dependency field $libf[$i])"); +} + +sub scanshlibsfile { + my ($fn,$ln,$lsn,$lf) = @_; + my ($da,$dv,$dk); + $fn= "./$fn" if $fn =~ m/^\s/; + if (!open(SLF,"< $fn")) { + $! == ENOENT || syserr("unable to open shared libs info file \`$fn'"); +#print STDERR "scanshlibsfile($fn,$ln,$lsn,$lf) ... ENOENT\n"; + return 0; + } +#print STDERR "scanshlibsfile($fn,$ln,$lsn,$lf) ...\n"; + while (<SLF>) { + s/\s*\n$//; next if m/^\#/; + if (!m/^\s*(\S+)\s+(\S+)/) { + &warn("shared libs info file \`$fn' line $.: bad line \`$_'"); + next; + } + next if $1 ne $ln || $2 ne $lsn; + $da= $'; + for $dv (split(/,/,$da)) { + $dv =~ s/^\s+//; $dv =~ s/\s+$//; + if (defined($depstrength{$lf})) { + if (!defined($predefdepfdep{$dv}) || + $depstrength{$predefdepfdep{$dv}} < $depstrength{$lf}) { + $predefdepfdep{$dv}= $lf; + } + } else { + $dk= "$lf: $dv"; + if (!defined($unkdepfdone{$dk})) { + $unkdepfdone{$dk}= 1; + $unkdepf{$lf}.= ', ' if length($unkdepf{$lf}); + $unkdepf{$lf}.= $dv; + } + } + } + return 1; + } + close(SLF); + return 0; +} + +if (!$stdout) { + $varlistfile="./$varlistfile" if $fileslistfile =~ m/^\s/; + open(Y,"> $varlistfile.new") || + syserr("open new substvars file \`$varlistfile.new'"); + if (open(X,"< $varlistfile")) { + while (<X>) { + s/\n$//; + next if m/^(\w[-:0-9A-Za-z]*):/ && $1 eq $varnameprefix; + print(Y "$_\n") || + syserr("copy old entry to new varlist file \`$varlistfile.new'"); + } + } elsif ($! != ENOENT) { + syserr("open old varlist file \`$varlistfile' for reading"); + } + $fh= 'Y'; +} else { + $fh= 'STDOUT'; +} +for $dv (sort keys %predefdepfdep) { + $lf= $predefdepfdep{$dv}; + $defdepf{$lf}.= ', ' if length($defdepf{$lf}); + $defdepf{$lf}.= $dv; +} +for $lf (reverse @depfields) { + next unless defined($defdepf{$lf}); + print($fh "$varnameprefix:$lf=$defdepf{$lf}\n") + || syserr("write output entry"); +} +for $lf (sort keys %unkdepf) { + print($fh "$varnameprefix:$lf=$unkdepf{$lf}\n") + || syserr("write userdef output entry"); +} +close($fh) || syserr("close output"); +if (!$stdout) { + rename("$varlistfile.new",$varlistfile) || + syserr("install new varlist file \`$varlistfile'"); +} diff --git a/scripts/dpkg-source.1 b/scripts/dpkg-source.1 index fe9f73ae..bc548a8e 100644 --- a/scripts/dpkg-source.1 +++ b/scripts/dpkg-source.1 @@ -15,6 +15,9 @@ dpkg\-buildpackage, dpkg\-distaddfile, dpkg\-parsechangelog .B dpkg-gencontrol .RI [ options ] .br +.B dpkg-shlibdeps +.IR options +.br .B dpkg-genchanges .RI [ options ] .br @@ -36,6 +39,19 @@ binary package control file on standard output; it also adds an entry for the binary package to .BR debian/files . +.B dpkg-shlibdeps +calculates shared library dependencies for executables named in its +arguments. The dependencies are added to the substitution +variables file +.B debian/substvars +as variable names +.BI shlibs: dependencyfield +where +.I dependencyfield +is a dependency field name. Any other variables starting +.I shlibs: +are removed from the file. + .B dpkg-genchanges reads information from an unpacked and built Debian source tree and from the files it has generated and generates a Debian upload control @@ -43,7 +59,7 @@ file .RB ( .changes " file)." .B dpkg-buildpackage -Is a control script which can be used to help automate the building of +is a control script which can be used to help automate the building of a package. .B dpkg-distaddfile @@ -87,12 +103,14 @@ This option is understood by See below for a discussion of output substitution. .TP .BI -T substvarsfile -Read substitution variables from +Read (or, for +.BR dpkg-shlibdeps , +write) substitution variables in .IR substvarsfile ; the default is .BR debian/substvars . This option is understood by -.BR dpkg-source ", " dpkg-gencontrol " and " dpkg-genchanges . +.BR dpkg-source ", " dpkg-gencontrol ", " dpkg-shlibdeps " and " dpkg-genchanges . .TP .BI -D field = value Override or add an output control file field. @@ -196,6 +214,79 @@ file. .B -isp includes both fields, .BR -is " only the " Section " and " -ip " only the " Priority . +.TP +.BI -P packagebuilddir +Tells +.B dpkg-source +that the package is being built in +.I packagebuilddir +instead of +.BR debian/tmp . +This value is used to find the default value of the +.B Installed-Size +substitution variable and control file field (using +.BR du ), +and for the default location of the output file. +.TP +.B -O +Causes the control file to be printed to standard output, rather than +to +.B debian/tmp/DEBIAN/control +(or +.IB packagebuilddir /DEBIAN/control +if +.B -P +was used). +.SH DPKG-SHLIBDEPS OPTIONS +.B dpkg-shlibdeps +interprets non-option arguments as executable names, just as if they'd +been supplied as +.BI -e executable\fR. +.TP +.BI -e executable +Include dependencies appropriate for the shared libraries required by +.IR executable . +.TP +.BI -d dependencyfield +Add dependencies to be added to the control file dependency field +.IR dependencyfield . +(The dependencies for this field are placed in the variable +.BI shlibs: dependencyfield\fR.) + +The +.BI -d dependencyfield +option takes effect for all executables after the option, until the +next +.BI -d dependencyfield\fR. +The default +.I dependencyfield +is +.BR Depends . + +If the same dependency entry (or set of alternatives) appears in more +than one of the recognised dependency field names +.BR Pre-Depends ", " Depends ", " Recommends " or " Suggests +then +.B dpkg-shlibdeps +will automatically remove the dependency from all fields except the +one representing the most important dependencies. +.TP +.BI -p varnameprefix +Causes substitution variables to start with +.IB varnameprefix : +instead of +.BR shlib: . +Likewise, any existing substitution variables starting with +.IB varnameprefix : +(rather than +.BR shlib: ) +are removed from the the substitution variables file. +.TP +.B -O +Causes the substitution variable settings to be printed to standard +output, rather than being added to the substitution variables file +.RB ( debian/substvars +by default). .SH DPKG-GENCHANGES OPTIONS .B dpkg-gencontrol does not take any non-option arguments. @@ -293,9 +384,10 @@ they perform some variable substitutions on the output file. A variable substitution has the form .BI ${ variable-name }\fR. -Variable substitutions are performed repeatedly until none are left; -the full text of the field after the substitution is rescanned to look -for more substitutions. +Variable names consist of alphanumerics, hyphens and colons and start +with an alphanumeric. Variable substitutions are performed repeatedly +until none are left; the full text of the field after the substitution +is rescanned to look for more substitutions. After all the substitutions have been done each occurence of the string @@ -304,36 +396,52 @@ string .B $ sign. -Variables whose names consist entirely of alphanumerics can be set -using the +Variables can be set using the .B -V -common option. - -They can be also specified in the file +common option. They can be also specified in the file .B debian/substvars (or whatever other file is specified using the .B -T option). This file consists of lines of the form -.IB name = value -(where -.B name -is a string of alphanumerics). Trailing whitespace on each line, -blank lines, and lines starting with a +.IB name = value\fR. +Trailing whitespace on each line, blank lines, and +lines starting with a .B # symbol (comments) are ignored. Additionally, the following standard variables are available: .TP -.BI arch +.BI Arch The current build architecture (from .BR "dpkg \-\-print-architecture" ). .TP -.B sourceversion +.B Source-Version The source package version (from the changelog file). .TP -.BI f: fieldname +.B Installed-Size +The total size of the package's installed files. This value is copied +into the corresponding control file field; setting it will modify the +value of that field. If this variable isn't set +.B dpkg-gencontrol +will use +.B du -k debian/tmp +to find the default value. +.TP +.B Extra-Size +Additional disk space used when the package is installed. If this +variable is set its value is added to that of the +.B Installed-Size +variable (whether set explicitly or using the default value) before it +is copied into the +.B Installed-Size +control file field. +.TP +.BI F: fieldname The value of the output field -.IR fieldname . +.IR fieldname +(which must be given in the canonical capitalisation). Setting these +variables has no effect other than on places where they are expanded +explicitly. .TP .B Format The @@ -345,9 +453,14 @@ field in the .B .changes file will change too. .TP -.BR newline ", " space ", " tab +.BR Newline ", " Space ", " Tab These variables each hold the corresponding character. - +.TP +.BI shlibs: dependencyfield +Variable settings with names of this form are generated by +.B dpkg-shlibdeps +- see above. +.LP If a variable is referred to but not defined it generates a warning and an empty value is assumed. .SH FILES diff --git a/scripts/dpkg-source.8 b/scripts/dpkg-source.8 deleted file mode 100644 index c7d6951a..00000000 --- a/scripts/dpkg-source.8 +++ /dev/null @@ -1,249 +0,0 @@ -.\" Hey, Emacs! This is an -*- nroff -*- source file. -.\" Authors: Ian Jackson -.TH DPKG\-SOURCE 8 "7th Auguest" "Debian Project" "Debian GNU/Linux manual" -.SH NAME -dpkg\-source, dpkg\-genchanges, dpkg\-gencontrol, -dpkg\-buildpackage, dpkg\-distaddfile, dpkg\-parsechangelog -\- Debian source packaging tools -.SH SYNOPSIS -.B dpkg-deb -.BR -b | --build -.IR directory " [" archive | directory ] -.br -.B dpkg-deb -.BR -I | --info -.IR archive " [" control\-file\-name " ..]" -.br -.B dpkg-deb -.BR -f | --field -.IR archive " [" control\-field\-name " ...]" -.br -.B dpkg-deb -.BR -c | --contents -.I archive -.br -.B dpkg-deb -.BR -x | --extract | -X | --vextract -.I archive directory -.br -.B dpkg-deb --fsys-tarfile -.I archive -.br -.B dpkg-deb --control -.I archive directory -.SH DESCRIPTION -.B dpkg-deb -packs, unpacks and provides information about Debian archives. - -Use -.B dpkg -to install and remove packages from your system. - -You can also invoke -.B dpkg\-deb -by calling -.B dpkg -with whatever options you want to pass to -.BR dpkg\-deb ". " dpkg -will spot that you wanted -.B dpkg\-deb -and run it for you. -.SH ACTION OPTIONS -.TP -.BR --build ", " -b -Creates a debian archive from the filesystem tree stored in -.IR directory ". " directory -must have a -.B DEBIAN -subdirectory, which contains the control information files such -as the control file itself. This directory will -.I not -appear in the binary package's filesystem archive, but instead -the files in it will be put in the binary package's control -information area. - -Unless you specify -.BR \-\-no\-check ", " dpkg\-deb " -will read -.B DEBIAN/control -and parse it. It will check it for syntax errors and other problems, -and display the name of the binary package being built. -.B dpkg\-deb -will also check the permissions of the maintainer scripts and other -files found in the -.B DEBIAN -control information directory. - -If no -.I archive -is specified then -.B dpkg\-deb -will write the package into the file -.IR directory \fB.deb\fR. - -If the archive to be created already exists it will be overwritten. - -If the second argument is a directory then -.B dpkg\-deb -will write to the file -.IB package _ version _ arch .deb\fR, -or -.IB package _ version .deb -if no -.B Architecture -field is present in the package control file. When a target directory -is specified, rather than a file, the -.B \-\-no\-check -option may not be used (since -.B dpkg\-deb -needs to read and parse the package control file to determine which -filename to use). -.TP -.BR \-\-info ", " -I -Provides information about a binary package archive. - -If no -.IR control\-file\-name s -are specified then it will print a summary of the contents of the -package as well as its control file. - -If any -.IR control\-file\-name s -are specified then -.B dpkg\-deb -will print them in the order they were specified; if any of the -components weren't present it will print an error message to stderr -about each one and exit with status 2. -.TP -.BR \-\-field ", " -f -Extracts control file information from a binary package archive. - -If no -.BR control\-file\-field s -are specified then it will print the whole control file. - -If any are specified then -.B dpkg\-deb -will print their contents, in the order in which they appear in the -control file. If more than one -.BR control\-file\-field -is specified then -.B dpkg\-deb -will precede each with its field name (and a colon and space). - -No errors are reported for fields requested but not found. -.TP -.BR --contents ", " -c -Lists the contents of the filesystem tree archive portion of the -package archive. It is currently produced in the format generated by -.BR tar 's -verbose listing. -.TP -.BR --extract ", " -x ", " \-\-vextract ", " -X -Extracts the filesystem tree from a package archive into the specified -directory. - -.BR \-\-vextract " (" -X ")" -prints a listing of the files extracted as it goes, while -.BR \-\-extract " (" -x ")" -is silent unless an error occurs. - -Note that extracting a package to the root directory will -.I not -result in a correct installation ! Use -.B dpkg -to install packages. - -.I directory -(but not its parents) will be created if necessary. -.TP -.BR --fsys-tarfile -Extracts the filesystem tree data from a binary package and sends it -to standard output in -.B tar -format. Together with -.B tar -this can be used to extract a particular file from a package archive. -.TP -.BR --control ", " -e -Extracs the control information files from a package archive into the -specified directory. - -If no directory is specified then a subdirectory -.B DEBIAN -in the current directory is used. - -The target directory (but not its parents) will be created if -necessary. -.TP -.BR --help ", " -h -Prints -.BR dpkg\-deb 's -usage message, giving a summary of its options and their uses. -.TP -.BR --version -Prints -.BR dpkg\-deb 's -version number. -.TP -.BR --licence -Prints information about -.BR dpkg\-deb 's -copyright licensing and lack of warranty. (The American spelling -.B \-\-license -is also supported.) -.SH OTHER OPTIONS -.TP -.BR --new -Ensures that -.B dpkg\-deb -builds a `new' format archive. This is the default. -.TP -.BR --old -Forces -.B dpkg\-deb -to build an `old' format archive. This old archive format is less -easily parsed by non-Debian tools and is now obsolete; its only use is -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 --no-check -Inhibit's -.BR "dpkg\-deb \-\-build" 's -usual checks on the proposed contents of an archive. You can build -any archive you want, no matter how broken, this way. -.TP -.BR --debug ", " -D -Enables debugging output. This is not very interesting. -.SH BUGS -.B dpkg-deb -I -.IB package1 .deb -.IB package2 .deb -does the wrong thing. - -There is no authentication on -.B .deb -files; in fact, there isn't even a straightforward checksum. - -Do not attempt to use just -.B dpkg\-deb -to install software ! You must use -.B dpkg -proper to ensure that all the files are correctly placed and the -package's scripts run and its status and contents recorded. -.SH SEE ALSO -.BR deb (5), -.BR deb-control (5), -.BR dpkg (5), -.BR dpkg (8), -.BR dselect (8). -.SH AUTHOR -.B dpkg\-deb -and this manpage were written by Ian Jackson. They are -Copyright (C)1995-1996 -by him and released under the GNU General Public Licence; there is NO -WARRANTY. See -.B /usr/doc/copyright/dpkg -and -.B /usr/doc/copyright/GPL -for details. diff --git a/scripts/dpkg-source.pl b/scripts/dpkg-source.pl index 46110e8c..f3250a10 100644 --- a/scripts/dpkg-source.pl +++ b/scripts/dpkg-source.pl @@ -52,7 +52,7 @@ while (@ARGV && $ARGV[0] =~ m/^-/) { $override{$1}= $'; } elsif (m/^-U([^\=:]+)$/) { $remove{$1}= 1; - } elsif (m/^-V(\w+)[=:]/) { + } elsif (m/^-V(\w[-:0-9A-Za-z]*)[=:]/) { $substvar{$1}= $'; } elsif (m/^-T/) { $varlistfile= $'; @@ -76,9 +76,10 @@ if ($opmode eq 'build') { stat($dir) || &error("cannot stat directory $dir: $!"); -d $dir || &error("directory argument $dir is not a directory"); - $!=0; if (@ARGV) { + if (@ARGV) { $origdir= shift(@ARGV); if (length($origdir)) { + $origdir= "./$origdir" unless $origdir =~ m:^/:; stat($origdir) || &error("cannot find orig directory $origdir: $!"); -d $origdir || &error("orig directory argument $origdir is not a directory"); } @@ -90,6 +91,7 @@ if ($opmode eq 'build') { } else { &error("tentative orig directory $dir.orig is not a directory"); } +print STDERR ">$dir|$origdir<\n"; $changelogfile= "$dir/debian/changelog" unless defined($changelogfile); $controlfile= "$dir/debian/control" unless defined($controlfile); @@ -204,7 +206,8 @@ if ($opmode eq 'build') { if (!$c2) { chdir($tardirbase) || &syserr("chdir to above (orig) source $tardirbase"); open(STDOUT,">&GZIP") || &syserr("reopen gzip for tar"); - exec('tar','-cO','--',$tardirname); &syserr("exec tar"); + # FIXME: put `--' argument back when tar is fixed + exec('tar','-cO',$tardirname); &syserr("exec tar"); } close(GZIP); &reapgzip; diff --git a/scripts/update-rc.d.new-pl b/scripts/update-rc.d.new-pl new file mode 100644 index 00000000..7c8c9116 --- /dev/null +++ b/scripts/update-rc.d.new-pl @@ -0,0 +1,166 @@ +#! /usr/bin/perl +# +# update-rc.d Perl script to update links in /etc/rc?.d +# +# Usage: +# update-rc.d [-f] <basename> remove +# update-rc.d <basename> [options] +# +# Options are: +# start <codenumber> <runlevel> <runlevel> <runlevel> . +# stop <codenumber> <runlevel> <runlevel> <runlevel> . +# +# defaults [<codenumber> | <startcode> <stopcode>] +# (means start <startcode> 2 3 4 5 +# as well as stop <stopcode> 0 1 2 3 4 5 6 +# <codenumber> defaults to 20) +# +# Version: @(#)update-rc.d 1.02 11-Jul-1996 miquels@cistron.nl +# +# Changes: 1.00 Wrote perl version directly derived from shell version. +# 1.01 Fixed problem when dangling symlinks are found in +# /etc/rc?.d/. The shell version just exits silently! +# 1.02 More misc bugs fixed caused by sh -> perl translation +# + +$version= '1.3.2'; # This line modified by Makefile + +chdir('/etc') || die "chdir /etc: $!\n"; + +$initd='init.d'; + +sub usage { + print STDERR <<EOF; +Debian GNU/Linux update-rc.d $version. Copyright (C) 1996 Miquel van +Smoorenburg. This is free software; see the GNU General Public Licence +version 2 or later for copying conditions. There is NO warranty. + +update-rc.d: error: @_ +usage: update-rc.d [-f] <basename> remove + update-rc.d <basename> defaults [<cn> | <scn> <kcn>] + update-rc.d <basename> start|stop <cn> <r> <r> . ... +EOF + &leave(1); +} + + +sub getinode { + local @tmp; + + unless (@tmp = stat($_[0])) { + print STDERR "stat($_[0]): $!\n"; + $tmp[1] = 0; + } + $tmp[1]; +} + +sub leave { + eval $atexit if ($atexit ne ''); + exit($_[0]); +} + +$force = 0; +if ($ARGV[0] eq '-f') { + shift @ARGV; + $force = 1; +} + +&usage("too few arguments") if ($#ARGV < 1); + +$bn = shift @ARGV; +$action = shift @ARGV; + +if ($action eq 'remove') { + &usage("remove must be only action") if ($#ARGV > 0); + if (-f "$initd/$bn") { + unless ($force) { + print STDERR "update-rc.d: error: /etc/$initd/$bn exists during rc.d purge (use -f to force).\n"; + &leave(1); + } + } else { + $atexit = "unlink('$initd/$bn');"; + } + print " Removing any system startup links to /etc/$initd/$bn ...\n"; + open(FD, ">>$initd/$bn"); + close FD; + $own = &getinode("$initd/$bn"); + @files = split(/\s+/, `echo rc?.d/[SK]*`); + foreach $f (@files) { + $inode = &getinode($f); + if ($inode == $own) { + unless (unlink($f)) { + print STDERR "unlink($f): $!\n"; + &leave(1); + } + print " $f\n"; + } + } + &leave(0); +} elsif ($action eq 'defaults') { + if ($#ARGV < 0) { + $sn = $kn = 20; + } elsif ($#ARGV == 0) { + $sn = $kn = $ARGV[0]; + } elsif ($#ARGV == 1) { + $sn = $ARGV[0]; + $kn = $ARGV[1]; + } else { + &usage("defaults takes only one or two codenumbers"); + } + @ARGV = ('start', "$sn", '2', '3', '4', '5', 'stop', + "$kn", '0', '1', '6'); +} elsif ($action ne 'start' && $action ne 'stop') { + &usage("unknown mode or add action $action"); +} + +unless (-f "$initd/$bn") { + print STDERR "update-rc.d: warning /etc/$initd/$bn doesn't exist during rc.d setup.\n"; + exit(0); +} + +$own = &getinode("$initd/$bn"); + +@files = split(/\s+/, `echo rc?.d/[SK]*`); +foreach $f (@files) { + $inode = &getinode($f); + if ($inode == $own) { + print STDERR " System startup links pointing to /etc/$initd/$bn already exist.\n"; + exit(0); + } +} + + +print " Adding system startup links pointing to /etc/$initd/$bn ...\n"; +while ($#ARGV >= 1) { + if ($ARGV[0] eq 'start') { + $ks = 'S'; + } elsif ($ARGV[0] eq 'stop') { + $ks = 'K'; + } else { + &usage("unknown action $1"); + } + shift @ARGV; + $number = shift @ARGV; + while ($#ARGV >= 0) { + $_ = $ARGV[0]; + if (/^\.$/) { + shift @ARGV; + last; + } elsif (/^.$/) { + symlink("../$initd/$bn", "rc$_.d/$ks$number$bn") || + die "symlink: $!\n"; + print " rc$_.d/$ks$number$bn -> ../$initd/$bn\n"; + shift @ARGV; + next; + } elsif (/^(start|stop)$/) { + last; + } + &usage('runlevel is more than one character\n'); + } +} + +if ($#ARGV >= 0) { + &usage("surplus arguments, but not enough for an add action: @ARGV\n"); +} + +0; diff --git a/scripts/update-rc.d.pl b/scripts/update-rc.d.pl index 7c8c9116..2a38f9cf 100644 --- a/scripts/update-rc.d.pl +++ b/scripts/update-rc.d.pl @@ -129,7 +129,6 @@ foreach $f (@files) { } } - print " Adding system startup links pointing to /etc/$initd/$bn ...\n"; while ($#ARGV >= 1) { if ($ARGV[0] eq 'start') { diff --git a/scripts/update-rc.d.old-sh b/scripts/update-rc.d.sh similarity index 93% rename from scripts/update-rc.d.old-sh rename to scripts/update-rc.d.sh index d471cc17..bc51d150 100755 --- a/scripts/update-rc.d.old-sh +++ b/scripts/update-rc.d.sh @@ -91,9 +91,13 @@ while [ $# -ge 3 ]; do shift continue ;; + *) + usage "runlevel is more than one character (forgotten \`.' ?)" esac - usage 'runlevel is more than one character (forgotten . ?)' done + if [ $# -eq 0 ]; then + usage "action with list of runlevels not terminated by \`.'" + fi shift done diff --git a/version.h b/version.h index 85d37bc9..24361f98 100644 --- a/version.h +++ b/version.h @@ -1 +1 @@ -#define DPKG_VERSION "1.3.3" /* This line modified by Makefile */ +#define DPKG_VERSION "1.3.6" /* This line modified by Makefile */ -- 2.39.5