3
3
* main.c - main program
5
5
* Copyright © 1994,1995 Ian Jackson <ian@chiark.greenend.org.uk>
6
* Copyright © 2006-2009 Guillem Jover <guillem@debian.org>
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
41
42
#include <locale.h>
46
#include <dpkg-priv.h>
45
#include <dpkg/macros.h>
46
#include <dpkg/dpkg.h>
47
#include <dpkg/dpkg-db.h>
48
#include <dpkg/myopt.h>
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);
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);
63
m_output(stdout, _("<standard output>"));
62
66
options that need fixing:
68
if (fprintf (stdout, _(
69
73
"Usage: %s [<option> ...] <command>\n"
70
"\n"), DPKG) < 0) werr ("stdout");
72
if (fprintf (stdout, _(
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");
100
if (fprintf (stdout, _(
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");
106
if (fprintf (stdout, _(
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");
111
if (fprintf (stdout, _(
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");
116
if (fprintf (stdout, _(
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");
140
if (fprintf (stdout, _(
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");
147
if (fprintf (stdout, _(
148
"Use `dselect' or `aptitude' for user-friendly package management.\n")) < 0)
152
"Use `dselect' or `aptitude' for user-friendly package management.\n"));
154
m_output(stdout, _("<standard output>"));
152
157
const char thisname[]= "dpkg";
240
245
" 2000 stupidlyverbose Insane amounts of drivel\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>"));
314
319
*pipe_head = pipe_new;
323
is_invoke_action(enum action action)
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;
344
set_invoke_hook(const struct cmdinfo *cip, const char *value)
346
struct invoke_hook ***hook_tail = cip->parg;
347
struct invoke_hook *hook_new;
349
hook_new = nfmalloc(sizeof(struct invoke_hook));
350
hook_new->command = nfstrsave(value);
351
hook_new->next = NULL;
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;
359
run_invoke_hooks(const char *action, struct invoke_hook *hook_head)
361
struct invoke_hook *hook;
363
setenv("DPKG_HOOK_ACTION", action, 1);
365
for (hook = hook_head; hook; hook = hook->next) {
368
/* XXX: As an optimization, use exec instead if no shell metachar are
369
* used “!$=&|\\`'"^~;<>{}[]()?*#”. */
370
status = system(hook->command);
372
ohshit("error executing hook '%s', exit code %d", hook->command, status);
375
unsetenv("DPKG_HOOK_ACTION");
317
378
static void setforce(const struct cmdinfo *cip, const char *value) {
318
379
const char *comma;
320
381
const struct forceinfo *fip;
322
383
if (!strcmp(value,"help")) {
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"
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>"));
368
429
*fip->opt= cip->arg;
370
badusage(_("unknown force/refuse option `%.*s'"), min(l, 250), value);
431
badusage(_("unknown force/refuse option `%.*s'"),
432
(int)min(l, 250), value);
373
435
*fip->opt= cip->arg;
382
444
static const char okpassshortopts[]= "D";
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 }
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 ),
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;
646
710
setvbuf(stdout, NULL, _IONBF, 0);
712
if (is_invoke_action(cipaction->arg))
713
run_invoke_hooks(cipaction->olong, pre_invoke_hooks);
649
717
actionfunction= (void (*)(const char* const*))cipaction->farg;