~ubuntu-branches/ubuntu/lucid/dpkg/lucid

« back to all changes in this revision

Viewing changes to src/main.c

  • Committer: Bazaar Package Importer
  • Author(s): Guillem Jover, Guillem Jover, Raphael Hertzog, Modestas Vainius, Updated dpkg translations, Updated dselect translations, Updated man page translations, Updated scripts translations
  • Date: 2009-09-06 09:37:45 UTC
  • mto: (1.4.1 squeeze)
  • mto: This revision was merged to the branch mainline in revision 68.
  • Revision ID: james.westby@ubuntu.com-20090906093745-orb3im04ozfxypis
Tags: 1.15.4
[ Guillem Jover ]
* Call _g instead of g_ in dpkg-name.
* Fix inverted logic when deciding to assume the architecture in dpkg-name
  when the package didn't have such field.
* Do not take into account Revision and Package_Revision fields in dpkg-name
  and dpkg-scanpackages as they have been handled already by “dpkg-deb -I”.
* Switch dpkg-scansources to use Dpkg::Cdata instead of duplicating the
  .dsc parsing code. As a side effect it now handles properly bogus files.
* Do not remap obsolete fields in dpkg-scanpackages as they have been
  handled already by “dpkg-deb -I”.
* Properly mark packages being purged for disappearance from the database.
  This will make the status database not be left behind with traces of old
  not-installed packages. Closes: #472208
* On parse mark not-installed leftover packages for automatic removal from
  the database on next dump. This obsoletes the --forget-old-unavail option,
  thus making it now a no-op. Closes: #33394, #429262
* Document “hold” under package selection states instead of flags in dpkg(1).
* Remove trailing ‘/’ and ‘/.’ from the directory name to be used as the
  package name on “dpkg-deb -b”. Closes: #218018, #373602
* Remove obsolete ‘hold’ and ‘hold-reinstreq’ internal status flags.
* Add fakeroot to dpkg-dev Recommends. Closes: #536821
* Fix an always false test when trying to decide which package to deselect
  to resolve a dependency problem in dselect.
* Add uClibc Linux support to ostable and triplettable. Closes: #455501
* Add uClinux support to ostable and triplettable.
  Thanks to Simon Richter <sjr@debian.org>.
* When aborting due to file conflicts print the version of the conflicted
  package. Closes: #540019
* Remove double slash in database path visible to the user in some error
  conditions.
* Stop macthing sparc64-*-* GNU triplets with sparc Debian architecture.
* Add support for config.d style directories in dpkg and dselect,
  (/etc/dpkg/dpkg.cfg.d and /etc/dpkg/dselect.cfg.d respectively).
* Define DPKG_MAINTSCRIPT_ARCH on the maintainer script environment to the
  architecture the package got built for.
* Document DPKG_MAINTSCRIPT_PACKAGE maintainer script environment variable
  in dpkg man page.
* Document DPKG_RUNNING_VERSION maintainer script environment variable
  in dpkg man page.
* Change po4a usage to not create unwated changes depending if doing out or
  in-tree builds.
* Use po4a “--previous” support when updating the man pages.
  Suggested by Christian Perrier <bubulle@debian.org>.
* On configuration error print file name and line number.
* Allow quoting values in configuration file options.
* Add new --pre-invoke and --post-invoke hooks in dpkg.
* Add new --control-path command to dpkg-query.
* Use ohshit on bad version syntax in --compare-versions.
* Add Multi-Arch to the list of known binary package fields for dpkg-dev.
  Thanks to Steve Langasek <vorlon@debian.org>.

[ Raphael Hertzog ]
* Replace install-info by a wrapper around GNU's install-info. The wrapper
  will be dropped in squeeze+1. dpkg now Breaks: old versions of
  info-browsers that do not depend on the new install-info package
  that provides the real functionality. Closes: #9771, #523980
  See http://wiki.debian.org/Transitions/DpkgToGnuInstallInfo for details.
* Fix dpkg's preinst in case /var/lib/dpkg/alternatives contains unexpected
  sub-directories. Closes: #535138
  And also when one of the file doesn't contain correct alternatives
  information (improper number of lines). Closes: #537558
* Upgrade Standards-Version to 3.8.2 (no changes).
* Update deb-substvars(5) to list fields that do not support substvars.
  Closes: #535353
* Fix dpkg-parsechangelog to include all entries with -v0 parameter.
  Closes: #537800
* Fix update-alternatives to mention the correct slave link that can't
  be installed due to a conflicting file instead of quoting the master link.
* Add support for extra override file in dpkg-scanpackages. Thanks to Robert
  Millan for the patch. Closes: #537559
* Add support for extra override file in dpkg-scansources.
* Document format of extra override file in a new manual page
  deb-extra-override(5).
* Update sample in dpkg-gensymbols(1) to give an accurate listing of
  64 bit arches. Thanks to Julien Cristau for the patch. Closes: #540382
* Create /etc/cron.daily/dpkg to handle the backup of
  /var/lib/dpkg/status in /var/backups. This is taken out of the cron
  package and need no conflicts/breaks as the code does nothing if
  the current status file is already backupped. Thanks to Leo 'costela'
  Antunes <costela@debian.org> for the patch. Closes: #541412
* Change behaviour of dpkg --merge-avail to not update a package's
  information if the version provided is older than the one already listed
  in the available file. Thanks to Ian Jackson
  <ian@davenant.greenend.org.uk> for the patch. Closes: #496114
* dpkg-architecture can now export DEB_{HOST,BUILD}_ARCH_{BITS,ENDIAN}
  (pointer size and endianness):
  - cputable (in dpkg) modified to contain those information
  - dpkg-dev depends on dpkg (>= 1.15.4) to ensure that we have an updated
    cputable (and so that a versioned build-dependency on dpkg-dev is enough
    to use this new feature)
  Closes: #531307
* Split overly long Binary: field values over multiple lines. This is
  allowed since policy 3.8.3. Closes: #494714
* Improve performance of dpkg-shlibdeps by caching minimal version
  associated to each library in Dpkg::Shlib::SymbolFile. Thanks to
  Jiří Paleček <jpalecek@web.de> for the patch.
* Slightly improve dpkg-source(1) by giving the section name that we're
  referring to. Closes: #544037
* Fix translation error in german manpage of dpkg-buildpackage. Thanks
  to Joachim Breitner <nomeata@debian.org>. Closes: #541829

[ Modestas Vainius ]
* Provide a meaningful label for dpkg-gensymbols diff.

[ Updated dpkg translations ]
* Asturian (Marcos Alvarez Costales). Closes: #535327
* French (Christian Perrier).
* German (Sven Joachim).
* Italian (Milo Casagrande). Closes: #536538
* Russian (Yuri Kozlov). Closes: #542254
* Slovak (Ivan Masár). Closes: #537742
* Swedish (Peter Krefting).

[ Updated dselect translations ]
* Russian (Yuri Kozlov). Closes: #542254
* Slovak (Ivan Masár). Closes: #537741

[ Updated man page translations ]
* French (Christian Perrier).
* German (Helge Kreutzmann), proofread by Jens Seidel.
* Swedish (Peter Krefting).

[ Updated scripts translations ]
* French completed (Christian Perrier).
* German (Helge Kreutzmann).
* Russian (Yuri Kozlov). Closes: #542254
* Swedish (Peter Krefting).

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
 * main.c - main program
4
4
 *
5
5
 * Copyright © 1994,1995 Ian Jackson <ian@chiark.greenend.org.uk>
 
6
 * Copyright © 2006-2009 Guillem Jover <guillem@debian.org>
6
7
 *
7
8
 * This is free software; you can redistribute it and/or modify
8
9
 * it under the terms of the GNU General Public License as
21
22
#include <config.h>
22
23
#include <compat.h>
23
24
 
24
 
#include <dpkg-i18n.h>
 
25
#include <dpkg/i18n.h>
25
26
 
26
27
#include <stdio.h>
27
28
#include <string.h>
41
42
#include <locale.h>
42
43
#endif
43
44
 
44
 
#include <dpkg.h>
45
 
#include <dpkg-db.h>
46
 
#include <dpkg-priv.h>
47
 
#include <myopt.h>
 
45
#include <dpkg/macros.h>
 
46
#include <dpkg/dpkg.h>
 
47
#include <dpkg/dpkg-db.h>
 
48
#include <dpkg/myopt.h>
48
49
 
49
50
#include "main.h"
 
51
#include "filesdb.h"
50
52
 
51
53
void
52
54
printversion(void)
53
55
{
54
 
  if (printf(_("Debian `%s' package management program version %s.\n"),
55
 
             DPKG, DPKG_VERSION_ARCH) < 0) werr("stdout");
56
 
  if (printf(_("This is free software; see the GNU General Public License version 2 or\n"
57
 
               "later for copying conditions. There is NO warranty.\n"
58
 
               "See %s --license for copyright and license details.\n"),
59
 
             DPKG) < 0) werr("stdout");
 
56
  printf(_("Debian `%s' package management program version %s.\n"),
 
57
         DPKG, DPKG_VERSION_ARCH);
 
58
  printf(_(
 
59
"This is free software; see the GNU General Public License version 2 or\n"
 
60
"later for copying conditions. There is NO warranty.\n"
 
61
"See %s --license for copyright and license details.\n"), DPKG);
 
62
 
 
63
  m_output(stdout, _("<standard output>"));
60
64
}
61
65
/*
62
66
   options that need fixing:
65
69
void
66
70
usage(void)
67
71
{
68
 
  if (fprintf (stdout, _(
 
72
  printf(_(
69
73
"Usage: %s [<option> ...] <command>\n"
70
 
"\n"), DPKG) < 0) werr ("stdout");
 
74
"\n"), DPKG);
71
75
 
72
 
  if (fprintf (stdout, _(
 
76
  printf(_(
73
77
"Commands:\n"
74
78
"  -i|--install       <.deb file name> ... | -R|--recursive <directory> ...\n"
75
79
"  --unpack           <.deb file name> ... | -R|--recursive <directory> ...\n"
95
99
"  --compare-versions <a> <op> <b>  Compare version numbers - see below.\n"
96
100
"  --force-help                     Show help on forcing.\n"
97
101
"  -Dh|--debug=help                 Show help on debugging.\n"
98
 
"\n")) < 0) werr ("stdout");
 
102
"\n"));
99
103
 
100
 
  if (fprintf (stdout, _(
 
104
  printf(_(
101
105
"  -h|--help                        Show this help message.\n"
102
106
"  --version                        Show the version.\n"
103
107
"  --license|--licence              Show the copyright licensing terms.\n"
104
 
"\n")) < 0) werr ("stdout");
 
108
"\n"));
105
109
 
106
 
  if (fprintf (stdout, _(
 
110
  printf(_(
107
111
"Use dpkg -b|--build|-c|--contents|-e|--control|-I|--info|-f|--field|\n"
108
112
" -x|--extract|-X|--vextract|--fsys-tarfile  on archives (type %s --help).\n"
109
 
"\n"), BACKEND) < 0) werr ("stdout");
 
113
"\n"), BACKEND);
110
114
 
111
 
  if (fprintf (stdout, _(
 
115
  printf(_(
112
116
"For internal use: dpkg --assert-support-predepends | --predep-package |\n"
113
117
"  --assert-working-epoch | --assert-long-filenames | --assert-multi-conrep.\n"
114
 
"\n")) < 0) werr ("stdout");
 
118
"\n"));
115
119
 
116
 
  if (fprintf (stdout, _(
 
120
  printf(_(
117
121
"Options:\n"
118
122
"  --admindir=<directory>     Use <directory> instead of %s.\n"
119
123
"  --root=<directory>         Install on a different root directory.\n"
135
139
"  --no-force-...|--refuse-...\n"
136
140
"                             Stop when problems encountered.\n"
137
141
"  --abort-after <n>          Abort after encountering <n> errors.\n"
138
 
"\n"), ADMINDIR) < 0) werr ("stdout");
 
142
"\n"), ADMINDIR);
139
143
 
140
 
  if (fprintf (stdout, _(
 
144
  printf(_(
141
145
"Comparison operators for --compare-versions are:\n"
142
146
"  lt le eq ne ge gt       (treat empty version as earlier than any version);\n"
143
147
"  lt-nl le-nl ge-nl gt-nl (treat empty version as later than any version);\n"
144
148
"  < << <= = >= >> >       (only for compatibility with control file syntax).\n"
145
 
"\n")) < 0) werr ("stdout");
146
 
 
147
 
  if (fprintf (stdout, _(
148
 
"Use `dselect' or `aptitude' for user-friendly package management.\n")) < 0)
149
 
  werr ("stdout");
 
149
"\n"));
 
150
 
 
151
  printf(_(
 
152
"Use `dselect' or `aptitude' for user-friendly package management.\n"));
 
153
 
 
154
  m_output(stdout, _("<standard output>"));
150
155
}
151
156
 
152
157
const char thisname[]= "dpkg";
221
226
  char *endp;
222
227
 
223
228
  if (*value == 'h') {
224
 
    if (printf(_(
 
229
    printf(_(
225
230
"%s debugging option, --debug=<octal> or -D<octal>:\n"
226
231
"\n"
227
232
" number  ref. in source   description\n"
240
245
"   2000   stupidlyverbose   Insane amounts of drivel\n"
241
246
"\n"
242
247
"Debugging options are be mixed using bitwise-or.\n"
243
 
"Note that the meanings and values are subject to change.\n"),
244
 
             DPKG) < 0) werr("stdout");
 
248
"Note that the meanings and values are subject to change.\n"), DPKG);
 
249
    m_output(stdout, _("<standard output>"));
245
250
    exit(0);
246
251
  }
247
252
  
314
319
  *pipe_head = pipe_new;
315
320
}
316
321
 
 
322
static int
 
323
is_invoke_action(enum action action)
 
324
{
 
325
  switch (action) {
 
326
  case act_unpack:
 
327
  case act_configure:
 
328
  case act_install:
 
329
  case act_triggers:
 
330
  case act_remove:
 
331
  case act_purge:
 
332
    return 1;
 
333
  default:
 
334
    return 0;
 
335
  }
 
336
}
 
337
 
 
338
struct invoke_hook *pre_invoke_hooks = NULL;
 
339
struct invoke_hook **pre_invoke_hooks_tail = &pre_invoke_hooks;
 
340
struct invoke_hook *post_invoke_hooks = NULL;
 
341
struct invoke_hook **post_invoke_hooks_tail = &post_invoke_hooks;
 
342
 
 
343
static void
 
344
set_invoke_hook(const struct cmdinfo *cip, const char *value)
 
345
{
 
346
  struct invoke_hook ***hook_tail = cip->parg;
 
347
  struct invoke_hook *hook_new;
 
348
 
 
349
  hook_new = nfmalloc(sizeof(struct invoke_hook));
 
350
  hook_new->command = nfstrsave(value);
 
351
  hook_new->next = NULL;
 
352
 
 
353
  /* Add the new hook at the tail of the list to preserve the order. */
 
354
  **hook_tail = hook_new;
 
355
  *hook_tail = &hook_new->next;
 
356
}
 
357
 
 
358
static void
 
359
run_invoke_hooks(const char *action, struct invoke_hook *hook_head)
 
360
{
 
361
  struct invoke_hook *hook;
 
362
 
 
363
  setenv("DPKG_HOOK_ACTION", action, 1);
 
364
 
 
365
  for (hook = hook_head; hook; hook = hook->next) {
 
366
    int status;
 
367
 
 
368
    /* XXX: As an optimization, use exec instead if no shell metachar are
 
369
     * used “!$=&|\\`'"^~;<>{}[]()?*#”. */
 
370
    status = system(hook->command);
 
371
    if (status != 0)
 
372
      ohshit("error executing hook '%s', exit code %d", hook->command, status);
 
373
  }
 
374
 
 
375
  unsetenv("DPKG_HOOK_ACTION");
 
376
}
 
377
 
317
378
static void setforce(const struct cmdinfo *cip, const char *value) {
318
379
  const char *comma;
319
380
  size_t l;
320
381
  const struct forceinfo *fip;
321
382
 
322
383
  if (!strcmp(value,"help")) {
323
 
    if (printf(_(
 
384
    printf(_(
324
385
"%s forcing options - control behaviour when problems found:\n"
325
386
"  warn but continue:  --force-<thing>,<thing>,...\n"
326
387
"  stop with error:    --refuse-<thing>,<thing>,... | --no-force-<thing>,...\n"
351
412
"  remove-essential [!]   Remove an essential package\n"
352
413
"\n"
353
414
"WARNING - use of options marked [!] can seriously damage your installation.\n"
354
 
"Forcing options marked [*] are enabled by default.\n"),
355
 
               DPKG) < 0) werr("stdout");
 
415
"Forcing options marked [*] are enabled by default.\n"), DPKG);
 
416
    m_output(stdout, _("<standard output>"));
356
417
    exit(0);
357
418
  }
358
419
 
367
428
          if (fip->opt)
368
429
            *fip->opt= cip->arg;
369
430
      } else
370
 
        badusage(_("unknown force/refuse option `%.*s'"), min(l, 250), value);
 
431
        badusage(_("unknown force/refuse option `%.*s'"),
 
432
                 (int)min(l, 250), value);
371
433
    } else {
372
434
      if (fip->opt)
373
435
        *fip->opt= cip->arg;
381
443
 
382
444
static const char okpassshortopts[]= "D";
383
445
 
384
 
void execbackend(const char *const *argv) NONRETURNING;
 
446
void execbackend(const char *const *argv) DPKG_ATTR_NORET;
385
447
void commandfd(const char *const *argv);
386
448
static const struct cmdinfo cmdinfos[]= {
387
449
  /* This table has both the action entries in it and the normal options.
392
454
 { longopt, shortopt, 0, NULL, NULL, setaction, code, NULL, (voidfnp)function }
393
455
#define OBSOLETE(longopt,shortopt) \
394
456
 { longopt, shortopt, 0, NULL, NULL, setobsolete, 0, NULL, NULL }
395
 
#define ACTIONBACKEND(longopt,shortop, backend) \
396
 
 { longopt, shortop, 0, NULL, NULL, setaction, 0, (void *)backend, (voidfnp)execbackend }
 
457
#define ACTIONBACKEND(longopt, shortopt, backend) \
 
458
 { longopt, shortopt, 0, NULL, NULL, setaction, 0, (void *)backend, (voidfnp)execbackend }
397
459
 
398
460
  ACTION( "install",                        'i', act_install,              archivefiles    ),
399
461
  ACTION( "unpack",                          0,  act_unpack,               archivefiles    ),
428
490
  ACTION( "command-fd",                   'c', act_commandfd,   commandfd     ),
429
491
*/
430
492
  
 
493
  { "pre-invoke",        0,   1, NULL,          NULL,      set_invoke_hook, 0, &pre_invoke_hooks_tail },
 
494
  { "post-invoke",       0,   1, NULL,          NULL,      set_invoke_hook, 0, &post_invoke_hooks_tail },
431
495
  { "status-fd",         0,   1, NULL,          NULL,      setpipe, 0, &status_pipes },
432
496
  { "log",               0,   1, NULL,          &log_file, NULL,    0 },
433
497
  { "pending",           'a', 0, &f_pending,    NULL,      NULL,    1 },
644
708
    f_triggers = (cipaction->arg == act_triggers && *argv) ? -1 : 1;
645
709
 
646
710
  setvbuf(stdout, NULL, _IONBF, 0);
 
711
 
 
712
  if (is_invoke_action(cipaction->arg))
 
713
    run_invoke_hooks(cipaction->olong, pre_invoke_hooks);
 
714
 
647
715
  filesdbinit();
648
716
 
649
717
  actionfunction= (void (*)(const char* const*))cipaction->farg;
652
720
 
653
721
  standard_shutdown();
654
722
 
 
723
  if (is_invoke_action(cipaction->arg))
 
724
    run_invoke_hooks(cipaction->olong, post_invoke_hooks);
 
725
 
655
726
  return reportbroken_retexitstatus();
656
727
}