]> git.saurik.com Git - apt.git/blob - doc/dpkg-tech.dbk
Merge branch 'debian/sid' into debian/experimental
[apt.git] / doc / dpkg-tech.dbk
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- -*- DocBook -*- -->
3 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
4 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
5 <!ENTITY % aptverbatiment SYSTEM "apt-verbatim.ent"> %aptverbatiment;
6 ]>
7
8 <book lang="en">
9
10 <title>dpkg technical manual</title>
11
12 <bookinfo>
13
14 <authorgroup>
15 <author>
16 <personname>Tom Lees</personname><email>tom@lpsg.demon.co.uk</email>
17 </author>
18 </authorgroup>
19
20 <releaseinfo>Version &apt-product-version;</releaseinfo>
21
22 <abstract>
23 <para>
24 This document describes the minimum necessary workings for the APT dselect
25 replacement. It gives an overall specification of what its external interface
26 must look like for compatibility, and also gives details of some internal
27 quirks.
28 </para>
29 </abstract>
30
31 <copyright><year>1997</year><holder>Tom Lees</holder></copyright>
32
33 <legalnotice>
34 <title>License Notice</title>
35 <para>
36 APT and this document are free software; you can redistribute them and/or
37 modify them under the terms of the GNU General Public License as published by
38 the Free Software Foundation; either version 2 of the License, or (at your
39 option) any later version.
40 </para>
41 <para>
42 For more details, on Debian systems, see the file
43 /usr/share/common-licenses/GPL for the full license.
44 </para>
45 </legalnotice>
46
47 </bookinfo>
48
49 <chapter id="ch1"><title>Quick summary of dpkg's external interface</title>
50
51 <section id="control"><title>Control files</title>
52 <para>
53 The basic dpkg package control file supports the following major features:-
54 </para>
55 <itemizedlist>
56 <listitem>
57 <para>
58 5 types of dependencies:-
59 </para>
60 <itemizedlist>
61 <listitem>
62 <para>
63 Pre-Depends, which must be satisfied before a package may be unpacked
64 </para>
65 </listitem>
66 <listitem>
67 <para>
68 Depends, which must be satisfied before a package may be configured
69 </para>
70 </listitem>
71 <listitem>
72 <para>
73 Recommends, to specify a package which if not installed may severely limit the
74 usefulness of the package
75 </para>
76 </listitem>
77 <listitem>
78 <para>
79 Suggests, to specify a package which may increase the productivity of the
80 package
81 </para>
82 </listitem>
83 <listitem>
84 <para>
85 Conflicts, to specify a package which must NOT be installed in order for the
86 package to be configured
87 </para>
88 </listitem>
89 <listitem>
90 <para>
91 Breaks, to specify a package which is broken by the package and which should
92 therefore not be configured while broken
93 </para>
94 </listitem>
95 </itemizedlist>
96 <para>
97 Each of these dependencies can specify a version and a depedency on that
98 version, for example "&lt;= 0.5-1", "== 2.7.2-1", etc. The comparators
99 available are:-
100 </para>
101 <itemizedlist>
102 <listitem>
103 <para>
104 "&lt;&lt;" - less than
105 </para>
106 </listitem>
107 <listitem>
108 <para>
109 "&lt;=" - less than or equal to
110 </para>
111 </listitem>
112 <listitem>
113 <para>
114 "&gt;&gt;" - greater than
115 </para>
116 </listitem>
117 <listitem>
118 <para>
119 "&gt;=" - greater than or equal to
120 </para>
121 </listitem>
122 <listitem>
123 <para>
124 "==" - equal to
125 </para>
126 </listitem>
127 </itemizedlist>
128 </listitem>
129 <listitem>
130 <para>
131 The concept of "virtual packages", which many other packages may provide,
132 using the Provides mechanism. An example of this is the "httpd" virtual
133 package, which all web servers should provide. Virtual package names may be
134 used in dependency headers. However, current policy is that virtual packages
135 do not support version numbers, so dependencies on virtual packages with
136 versions will always fail.
137 </para>
138 </listitem>
139 <listitem>
140 <para>
141 Several other control fields, such as Package, Version, Description, Section,
142 Priority, etc., which are mainly for classification purposes. The package
143 name must consist entirely of lowercase characters, plus the characters '+',
144 '-', and '.'. Fields can extend across multiple lines - on the second and
145 subsequent lines, there is a space at the beginning instead of a field name
146 and a ':'. Empty lines must consist of the text " .", which will be ignored,
147 as will the initial space for other continuation lines. This feature is
148 usually only used in the Description field.
149 </para>
150 </listitem>
151 </itemizedlist>
152 </section>
153
154 <section id="s1.2"><title>The dpkg status area</title>
155 <para>
156 The "dpkg status area" is the term used to refer to the directory where dpkg
157 keeps its various status files (GNU would have you call it the dpkg shared
158 state directory). This is always, on Debian systems, /var/lib/dpkg. However,
159 the default directory name should not be hard-coded, but #define'd, so that
160 alteration is possible (it is available via configure in dpkg 1.4.0.9 and
161 above). Of course, in a library, code should be allowed to override the
162 default directory, but the default should be part of the library (so that
163 the user may change the dpkg admin dir simply by replacing the library).
164 </para>
165 <para>
166 Dpkg keeps a variety of files in its status area. These are discussed later
167 on in this document, but a quick summary of the files is here:-
168 </para>
169 <itemizedlist>
170 <listitem>
171 <para>
172 available - this file contains a concatenation of control information from all
173 the packages which dpkg knows about. This is updated using the dpkg commands
174 "--update-avail &lt;file&gt;", "--merge-avail &lt;file&gt;", and
175 "--clear-avail".
176 </para>
177 </listitem>
178 <listitem>
179 <para>
180 status - this file contains information on the following things for every
181 package:-
182 </para>
183 <itemizedlist>
184 <listitem>
185 <para>
186 Whether it is installed, not installed, unpacked, removed, failed
187 configuration, or half-installed (deconfigured in favour of another package).
188 </para>
189 </listitem>
190 <listitem>
191 <para>
192 Whether it is selected as install, hold, remove, or purge.
193 </para>
194 </listitem>
195 <listitem>
196 <para>
197 If it is "ok" (no installation problems), or "not-ok".
198 </para>
199 </listitem>
200 <listitem>
201 <para>
202 It usually also contains the section and priority (so that dselect may classify
203 packages not in available)
204 </para>
205 </listitem>
206 <listitem>
207 <para>
208 For packages which did not initially appear in the "available" file when they
209 were installed, the other control information for them.
210 </para>
211 </listitem>
212 </itemizedlist>
213 <para>
214 The exact format for the "Status:" field is:
215 </para>
216 <screen>
217 Status: Want Flag Status
218 </screen>
219 <para>
220 Where <replaceable>Want</replaceable> may be one of
221 <emphasis>unknown</emphasis>, <emphasis>install</emphasis>,
222 <emphasis>hold</emphasis>, <emphasis>deinstall</emphasis>,
223 <emphasis>purge</emphasis>. <replaceable>Flag</replaceable> may
224 be one of <emphasis>ok</emphasis>, <emphasis>reinstreq</emphasis>,
225 <emphasis>hold</emphasis>,
226 <emphasis>hold-reinstreq</emphasis>. <replaceable>Status</replaceable> may
227 be one of <emphasis>not-installed</emphasis>, <emphasis>unpacked</emphasis>,
228 <emphasis>half-configured</emphasis>, <emphasis>installed</emphasis>,
229 <emphasis>half-installed</emphasis> <emphasis>config-files</emphasis>,
230 <emphasis>post-inst-failed</emphasis>, <emphasis>removal-failed</emphasis>.
231 The states are as follows:-
232 </para>
233 <variablelist>
234 <varlistentry>
235 <term>not-installed</term>
236 <listitem>
237 <para>
238 No files are installed from the package, it has no config files left, it
239 uninstalled cleanly if it ever was installed.
240 </para>
241 </listitem>
242 </varlistentry>
243 <varlistentry>
244 <term>unpacked</term>
245 <listitem>
246 <para>
247 The basic files have been unpacked (and are listed in
248 /var/lib/dpkg/info/[package].list. There are config files present, but the
249 postinst script has _NOT_ been run.
250 </para>
251 </listitem>
252 </varlistentry>
253 <varlistentry>
254 <term>half-configured</term>
255 <listitem>
256 <para>
257 The package was installed and unpacked, but the postinst script failed in some
258 way.
259 </para>
260 </listitem>
261 </varlistentry>
262 <varlistentry>
263 <term>installed</term>
264 <listitem>
265 <para>
266 All files for the package are installed, and the configuration was also
267 successful.
268 </para>
269 </listitem>
270 </varlistentry>
271 <varlistentry>
272 <term>half-installed</term>
273 <listitem>
274 <para>
275 An attempt was made to remove the packagem but there was a failure in the
276 prerm script.
277 </para>
278 </listitem>
279 </varlistentry>
280 <varlistentry>
281 <term>config-files</term>
282 <listitem>
283 <para>
284 The package was "removed", not "purged". The config files are left, but
285 nothing else.
286 </para>
287 </listitem>
288 </varlistentry>
289 <varlistentry>
290 <term>post-inst-failed</term>
291 <listitem>
292 <para>
293 Old name for half-configured. Do not use.
294 </para>
295 </listitem>
296 </varlistentry>
297 <varlistentry>
298 <term>removal-failed</term>
299 <listitem>
300 <para>
301 Old name for half-installed. Do not use.
302 </para>
303 </listitem>
304 </varlistentry>
305 </variablelist>
306 <para>
307 The two last items are only left in dpkg for compatibility - they are
308 understood by it, but never written out in this form.
309 </para>
310 <para>
311 Please see the dpkg source code, <literal>lib/parshelp.c</literal>,
312 <emphasis>statusinfos</emphasis>, <emphasis>eflaginfos</emphasis> and
313 <emphasis>wantinfos</emphasis> for more details.
314 </para>
315 </listitem>
316 <listitem>
317 <para>
318 info - this directory contains files from the control archive of every
319 package currently installed. They are installed with a prefix of
320 "&lt;packagename&gt;.". In addition to this, it also contains a file
321 called &lt;package&gt;.list for every package, which contains a list
322 of files. Note also that the control file is not copied into here; it
323 is instead found as part of status or available.
324 </para>
325 </listitem>
326 <listitem>
327 <para>
328 methods - this directory is reserved for "method"-specific files - each
329 "method" has a subdirectory underneath this directory (or at least,
330 it can have). In addition, there is another subdirectory "mnt", where
331 misc. filesystems (floppies, CD-ROMs, etc.) are mounted.
332 </para>
333 </listitem>
334 <listitem>
335 <para>
336 alternatives - directory used by the "update-alternatives" program. It
337 contains one file for each "alternatives" interface, which contains
338 information about all the needed symlinked files for each alternative.
339 </para>
340 </listitem>
341 <listitem>
342 <para>
343 diversions - file used by the "dpkg-divert" program. Each diversion takes
344 three lines. The first is the package name (or ":" for user diversion), the
345 second the original filename, and the third the diverted filename.
346 </para>
347 </listitem>
348 <listitem>
349 <para>
350 updates - directory used internally by dpkg. This is discussed later, in the
351 section <xref linkend="updates"/>.
352 </para>
353 </listitem>
354 <listitem>
355 <para>
356 parts - temporary directory used by dpkg-split
357 </para>
358 </listitem>
359 </itemizedlist>
360 </section>
361
362 <section id="s1.3"><title>The dpkg library files</title>
363 <para>
364 These files are installed under /usr/lib/dpkg (usually), but
365 /usr/local/lib/dpkg is also a possibility (as Debian policy dictates). Under
366 this directory, there is a "methods" subdirectory. The methods subdirectory in
367 turn contains any number of subdirectories for each general method processor
368 (note that one set of method scripts can, and is, used for more than one of
369 the methods listed under dselect).
370 </para>
371 <para>
372 The following files may be found in each of these subdirectories:-
373 </para>
374 <itemizedlist>
375 <listitem>
376 <para>
377 names - One line per method, two-digit priority to appear on menu at
378 beginning, followed by a space, the name, and then another space and
379 the short description.
380 </para>
381 </listitem>
382 <listitem>
383 <para>
384 desc.&lt;name&gt; - Contains the long description displayed by dselect
385 when the cursor is put over the &lt;name&gt; method.
386 </para>
387 </listitem>
388 <listitem>
389 <para>
390 setup - Script or program which sets up the initial values to be used
391 by this method. Called with first argument as the status area directory
392 (/var/lib/dpkg), second argument as the name of the method (as in the
393 directory name), and the third argument as the option (as in the names file).
394 </para>
395 </listitem>
396 <listitem>
397 <para>
398 install - Script/program called when the "install" option of dselect is run
399 with this method. Same arguments as for setup.
400 </para>
401 </listitem>
402 <listitem>
403 <para>
404 update - Script/program called when the "update" option of dselect is
405 run. Same arguments as for setup/install.
406 </para>
407 </listitem>
408 </itemizedlist>
409 </section>
410
411 <section id="s1.4"><title>The "dpkg" command-line utility</title>
412
413 <section id="s1.4.1"><title>"Documented" command-line interfaces</title>
414 <para>
415 As yet unwritten. You can refer to the other manuals for now. See
416 <citerefentry><refentrytitle>dpkg</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
417 </para>
418 </section>
419
420 <section id="s1.4.2"><title>Environment variables which dpkg responds to</title>
421 <itemizedlist>
422 <listitem>
423 <para>
424 DPKG_NO_TSTP - if set to a non-null value, this variable causes dpkg to run a
425 child shell process instead of sending itself a SIGTSTP, when the user selects
426 to background the dpkg process when it asks about conffiles.
427 </para>
428 </listitem>
429 <listitem>
430 <para>
431 SHELL - used to determine which shell to run in the case when DPKG_NO_TSTP
432 is set.
433 </para>
434 </listitem>
435 <listitem>
436 <para>
437 CC - used as the C compiler to call to determine the target architecture. The
438 default is "gcc".
439 </para>
440 </listitem>
441 <listitem>
442 <para>
443 PATH - dpkg checks that it can find at least the following files in the path
444 when it wants to run package installation scripts, and gives an error if it
445 cannot find all of them:-
446 </para>
447 <itemizedlist>
448 <listitem>
449 <para>
450 ldconfig
451 </para>
452 </listitem>
453 <listitem>
454 <para>
455 start-stop-daemon
456 </para>
457 </listitem>
458 <listitem>
459 <para>
460 install-info
461 </para>
462 </listitem>
463 <listitem>
464 <para>
465 update-rc.d
466 </para>
467 </listitem>
468 </itemizedlist>
469 </listitem>
470 </itemizedlist>
471 </section>
472
473 <section id="s1.4.3"><title>Assertions</title>
474 <para>
475 The dpkg utility itself is required for quite a number of packages, even if
476 they have been installed with a tool totally separate from dpkg. The reason
477 for this is that some packages, in their pre-installation scripts, check that
478 your version of dpkg supports certain features. This was broken from the
479 start, and it should have actually been a control file header "Dpkg-requires",
480 or similar. What happens is that the configuration scripts will abort or
481 continue according to the exit code of a call to dpkg, which will stop them
482 from being wrongly configured.
483 </para>
484 <para>
485 These special command-line options, which simply return as true or false are
486 all prefixed with "--assert-". Here is a list of them (without the prefix):-
487 </para>
488 <itemizedlist>
489 <listitem>
490 <para>
491 support-predepends - Returns success or failure according to whether a version
492 of dpkg which supports predepends properly (1.1.0 or above) is installed,
493 according to the database.
494 </para>
495 </listitem>
496 <listitem>
497 <para>
498 working-epoch - Return success or failure according to whether a version of
499 dpkg which supports epochs in version properly (1.4.0.7 or above) is installed,
500 according to the database.
501 </para>
502 </listitem>
503 </itemizedlist>
504 <para>
505 Both these options check the status database to see what version of the
506 "dpkg" package is installed, and check it against a known working version.
507 </para>
508 </section>
509
510 <section id="s1.4.4"><title>--predep-package</title>
511 <para>
512 This strange option is described as follows in the source code:
513 </para>
514 <screen>
515 /* Print a single package which:
516 * (a) is the target of one or more relevant predependencies.
517 * (b) has itself no unsatisfied pre-dependencies.
518 * If such a package is present output is the Packages file entry,
519 * which can be massaged as appropriate.
520 * Exit status:
521 * 0 = a package printed, OK
522 * 1 = no suitable package available
523 * 2 = error
524 */
525 </screen>
526 <para>
527 On further inspection of the source code, it appears that what is does is
528 this:-
529 </para>
530 <itemizedlist>
531 <listitem>
532 <para>
533 Looks at the packages in the database which are selected as "install",
534 and are installed.
535 </para>
536 </listitem>
537 <listitem>
538 <para>
539 It then looks at the Pre-Depends information for each of these packages
540 from the available file. When it find a package for which any of the
541 pre-dependencies are not satisfied, it breaks from the loop through the
542 packages.
543 </para>
544 </listitem>
545 <listitem>
546 <para>
547 It then looks through the unsatisfied pre-dependencies, and looks for
548 packages which would satisfy this pre-dependency, stopping on the first
549 it finds. If it finds none, it bombs out with an error.
550 </para>
551 </listitem>
552 <listitem>
553 <para>
554 It then continues this for every dependency of the initial package.
555 </para>
556 </listitem>
557 </itemizedlist>
558 <para>
559 Eventually, it writes out the record of all the packages to satisfy the
560 pre-dependencies. This is used by the disk method to make sure that its
561 dependency ordering is correct. What happens is that all pre-depending
562 packages are first installed, then it runs dpkg -iGROEB on the directory,
563 which installs in the order package files are found. Since pre-dependencies
564 mean that a package may not even be unpacked unless they are satisfied, it
565 is necessary to do this (usually, since all the package files are unpacked
566 in one phase, the configured in another, this is not needed).
567 </para>
568 </section>
569
570 </section>
571
572 </chapter>
573
574 <chapter id="ch2"><title>dpkg-deb and .deb file internals</title>
575 <para>
576 This chapter describes the internals to the "dpkg-deb" tool, which is used by
577 "dpkg" as a back-end. dpkg-deb has its own tar extraction functions, which is
578 the source of many problems, as it does not support long filenames, using
579 extension blocks.
580 </para>
581
582 <section id="s2.1"><title>The .deb archive format</title>
583 <para>
584 The main principal of the new-format Debian archive (I won't describe the old
585 format - for that have a look at deb-old.5), is that the archive really is an
586 archive - as used by "ar" and friends. However, dpkg-deb uses this format
587 internally, rather than calling "ar". Inside this archive, there are usually
588 the following members:-
589 </para>
590 <itemizedlist>
591 <listitem>
592 <para>
593 debian-binary
594 </para>
595 </listitem>
596 <listitem>
597 <para>
598 control.tar.gz
599 </para>
600 </listitem>
601 <listitem>
602 <para>
603 data.tar.gz
604 </para>
605 </listitem>
606 </itemizedlist>
607 <para>
608 The debian-binary member consists simply of the string "2.0", indicating
609 the format version. control.tar.gz contains the control files (and scripts),
610 and the data.tar.gz contains the actual files to populate the filesystem
611 with. Both tarfiles extract straight into the current directory. Information
612 on the tar formats can be found in the GNU tar info page. Since dpkg-deb
613 calls "tar -cf" to build packages, the Debian packages use the GNU extensions.
614 </para>
615 </section>
616
617 <section id="s2.2"><title>The dpkg-deb command-line</title>
618 <para>
619 dpkg-deb documents itself thoroughly with its '--help' command-line
620 option. However, I am including a reference to these for
621 completeness. dpkg-deb supports the following options:-
622 </para>
623 <itemizedlist>
624 <listitem>
625 <para>
626 --build (-b) &lt;dir&gt; - builds a .deb archive, takes a directory which
627 contains all the files as an argument. Note that the directory
628 &lt;dir&gt;/DEBIAN will be packed separately into the control archive.
629 </para>
630 </listitem>
631 <listitem>
632 <para>
633 --contents (-c) &lt;debfile&gt; - Lists the contents of the "data.tar.gz"
634 member.
635 </para>
636 </listitem>
637 <listitem>
638 <para>
639 --control (-e) &lt;debfile&gt; - Extracts the control archive into a directory
640 called DEBIAN. Alternatively, with another argument, it will extract it into a
641 different directory.
642 </para>
643 </listitem>
644 <listitem>
645 <para>
646 --info (-I) &lt;debfile&gt; - Prints the contents of the "control" file in the
647 control archive to stdout. Alternatively, giving it other arguments will cause
648 it to print the contents of those files instead.
649 </para>
650 </listitem>
651 <listitem>
652 <para>
653 --field (-f) &lt;debfile&gt; &lt;field&gt; ... - Prints any number of fields
654 from the "control" file. Giving it extra arguments limits the fields it prints
655 to only those specified. With no command-line arguments other than a filename,
656 it is equivalent to -I and just the .deb filename.
657 </para>
658 </listitem>
659 <listitem>
660 <para>
661 --extract (-x) &lt;debfile&gt; &lt;dir&gt; - Extracts the data archive of a
662 debian package under the directory &lt;dir&gt;.
663 </para>
664 </listitem>
665 <listitem>
666 <para>
667 --vextract (-X) &lt;debfile&gt; &lt;dir&gt; - Same as --extract, except it
668 is equivalent of giving tar the '-v' option - it prints the filenames as it
669 extracts them.
670 </para>
671 </listitem>
672 <listitem>
673 <para>
674 --fsys-tarfile &lt;debfile&gt; - This option outputs a gunzip'd version of
675 data.tar.gz to stdout.
676 </para>
677 </listitem>
678 <listitem>
679 <para>
680 --new - sets the archive format to be used to the new Debian format
681 </para>
682 </listitem>
683 <listitem>
684 <para>
685 --old - sets the archive format to be used to the old Debian format
686 </para>
687 </listitem>
688 <listitem>
689 <para>
690 --debug - Tells dpkg-deb to produce debugging output
691 </para>
692 </listitem>
693 <listitem>
694 <para>
695 --nocheck - Tells dpkg-deb not to check the sanity of the control file
696 </para>
697 </listitem>
698 <listitem>
699 <para>
700 --help (-h) - Gives a help message
701 </para>
702 </listitem>
703 <listitem>
704 <para>
705 --version - Shows the version number
706 </para>
707 </listitem>
708 <listitem>
709 <para>
710 --licence/--license (UK/US spellings) - Shows a brief outline of the GPL
711 </para>
712 </listitem>
713 </itemizedlist>
714
715 <section id="s2.2.1"><title>Internal checks used by dpkg-deb when building packages</title>
716 <para>
717 Here is a list of the internal checks used by dpkg-deb when building
718 packages. It is in the order they are done.
719 </para>
720 <itemizedlist>
721 <listitem>
722 <para>
723 First, the output Debian archive argument, if it is given, is checked using
724 stat. If it is a directory, an internal flag is set. This check is only made
725 if the archive name is specified explicitly on the command-line. If the
726 argument was not given, the default is the directory name, with ".deb"
727 appended.
728 </para>
729 </listitem>
730 <listitem>
731 <para>
732 Next, the control file is checked, unless the --nocheck flag was specified on
733 the command-line. dpkg-deb will bomb out if the second argument to --build was
734 a directory, and --nocheck was specified. Note that dpkg-deb will not be able
735 to determine the name of the package in this case. In the control file, the
736 following things are checked:-
737 </para>
738 <itemizedlist>
739 <listitem>
740 <para>
741 The package name is checked to see if it contains any invalid characters (see
742 <xref linkend="control"/> for this).
743 </para>
744 </listitem>
745 <listitem>
746 <para>
747 The priority field is checked to see if it uses standard values, and
748 user-defined values are warned against. However, note that this check is now
749 redundant, since the control file no longer contains the priority - the
750 changes file now does this.
751 </para>
752 </listitem>
753 <listitem>
754 <para>
755 The control file fields are then checked against the standard list of fields
756 which appear in control files, and any "user-defined" fields are reported as
757 warnings.
758 </para>
759 </listitem>
760 <listitem>
761 <para>
762 dpkg-deb then checks that the control file contains a valid version number.
763 </para>
764 </listitem>
765 </itemizedlist>
766 </listitem>
767 <listitem>
768 <para>
769 After this, in the case where a directory was specified to build the .deb file
770 in, the filename is created as "directory/pkg_ver.deb" or
771 "directory/pkg_ver_arch.deb", depending on whether the control file contains
772 an architecture field.
773 </para>
774 </listitem>
775 <listitem>
776 <para>
777 Next, dpkg-deb checks for the &lt;dir&gt;/DEBIAN directory. It complains if it
778 doesn't exist, or if it has permissions &lt; 0755, or &gt; 0775.
779 </para>
780 </listitem>
781 <listitem>
782 <para>
783 It then checks that all the files in this subdir are either symlinks or plain
784 files, and have permissions between 0555 and 0775.
785 </para>
786 </listitem>
787 <listitem>
788 <para>
789 The conffiles file is then checked to see if the filenames are too
790 long. Warnings are produced for each that is. After this, it checks
791 that the package provides initial copies of each of these conffiles,
792 and that they are all plain files.
793 </para>
794 </listitem>
795 </itemizedlist>
796 </section>
797
798 </section>
799
800 </chapter>
801
802 <chapter id="ch3"><title>dpkg internals</title>
803 <para>
804 This chapter describes the internals of dpkg itself. Although the low-level
805 formats are quite simple, what dpkg does in certain cases often does not make
806 sense.
807 </para>
808
809 <section id="updates"><title>Updates</title>
810 <para>
811 This describes the /var/lib/dpkg/updates directory. The function of this
812 directory is somewhat strange, and seems only to be used internally. A
813 function called cleanupdates is called whenever the database is scanned. This
814 function in turn uses
815 <citerefentry><refentrytitle>scandir</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
816 to sort the files in this directory. Files who names do not consist entirely
817 of digits are discarded. dpkg also causes a fatal error if any of the
818 filenames are different lengths.
819 </para>
820 <para>
821 After having scanned the directory, dpkg in turn parses each file the same way
822 it parses the status file (they are sorted by the scandir to be in numerical
823 order). After having done this, it then writes the status information back to
824 the "status" file, and removes all the "updates" files.
825 </para>
826 <para>
827 These files are created internally by dpkg's "checkpoint" function, and are
828 cleaned up when dpkg exits cleanly.
829 </para>
830 <para>
831 Juding by the use of the updates directory I would call it a Journal. Inorder
832 to efficiently ensure the complete integrity of the status file dpkg will
833 "checkpoint" or journal all of it's activities in the updates directory. By
834 merging the contents of the updates directory (in order!!) against the original
835 status file it can get the precise current state of the system, even in the
836 event of a system failure while dpkg is running.
837 </para>
838 <para>
839 The other option would be to sync-rewrite the status file after each operation,
840 which would kill performance.
841 </para>
842 <para>
843 It is very important that any program that uses the status file abort if the
844 updates directory is not empty! The user should be informed to run dpkg
845 manually (what options though??) to correct the situation.
846 </para>
847 </section>
848
849 <section id="s3.2"><title>What happens when dpkg reads the database</title>
850 <para>
851 First, the status file is read. This gives dpkg an initial idea of the
852 packages that are there. Next, the updates files are read in, overriding the
853 status file, and if necessary, the status file is re-written, and updates files
854 are removed. Finally, the available file is read. The available file is read
855 with flags which preclude dpkg from updating any status information from it,
856 though - installed version, etc., and is also told to record that the packages
857 it reads this time are available, not installed.
858 </para>
859 <para>
860 More information on updates is given above.
861 </para>
862 </section>
863
864 <section id="s3.3"><title>How dpkg compares version numbers</title>
865 <para>
866 Version numbers consist of three parts: the epoch, the upstream version, and
867 the Debian revision. Dpkg compares these parts in that order. If the epochs
868 are different, it returns immediately, and so on.
869 </para>
870 <para>
871 However, the important part is how it compares the versions which are
872 essentially stored as just strings. These are compared in two distinct
873 parts: those consisting of numerical characters (which are evaluated, and
874 then compared), and those consisting of other characters. When comparing
875 non-numerical parts, they are compared as the character values (ASCII),
876 but non-alphabetical characters are considered "greater than" alphabetical
877 ones. Also note that longer strings (after excluding differences where
878 numerical values are equal) are considered "greater than" shorter ones.
879 </para>
880 <para>
881 Here are a few examples of how these rules apply:-
882 </para>
883 <screen>
884 15 &gt; 10
885 0010 == 10
886
887 d.r &gt; dsr
888 32.d.r == 0032.d.r
889 d.rnr &lt; d.rnrn
890 </screen>
891 </section>
892
893 </chapter>
894
895 </book>