~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): Colin Watson
  • Date: 2009-09-18 13:39:36 UTC
  • mfrom: (1.1.9 sid)
  • Revision ID: james.westby@ubuntu.com-20090918133936-dj8kjtc2qz3yqj7i
Tags: 1.15.4ubuntu1
* Resynchronise with Debian (LP: #427854). Remaining changes:
  Ubuntu-specific adjustments (probably):
  - Use i686 for lpia in cputable and triplettable.
  - Hack Dpkg::Arch to return i686 for lpia.
  - Move various Conflicts to Breaks, since upgrades from stable Ubuntu
    releases support Breaks.

  Miscellaneous bug fixes:
  - Avoid duplicate attempts to [f]close in obscure error situations which
    might conceiveably close wrong fds.
  - Revert change to stop outputting a newline after a postinst is run
    (Debian #392317).
  - Use the two-arg form of open in Dpkg::Control so that "-" can be
    passed to parse stdin as a control file (Debian #465340).

  Launchpad integration:
  - Add Launchpad-Bugs-Fixed handling in a few more places.

  Build options:
  - Point to https://wiki.ubuntu.com/DistCompilerFlags from
    dpkg-buildpackage(1).
  - Set default LDFLAGS to -Wl,-Bsymbolic-functions. (We've already taken
    this hit in Ubuntu.)
  - Implement handling of hardening-wrapper options via DEB_BUILD_OPTIONS.

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
}