~ubuntu-branches/debian/wheezy/dpkg/wheezy

« back to all changes in this revision

Viewing changes to src/querycmd.c

  • Committer: Bazaar Package Importer
  • Author(s): Guillem Jover, Guillem Jover, Raphaël Hertzog, Jonathan Nieder, Steve Langasek, Mark Hymers, Updated programs translations, Updated man page translations, Updated scripts translations, Updated dselect translations
  • Date: 2011-04-01 23:56:54 UTC
  • Revision ID: james.westby@ubuntu.com-20110401235654-8y800dtb75skfrh7
Tags: 1.16.0
[ Guillem Jover ]
* Use DPKG_MAINTSCRIPT_PACKAGE environment variable as package name on
  dpkg-divert when no --package or --local options have been specified.
* Do not allow versions starting with non-digit when doing strict parsing,
  warn otherwise.
* Update dpkg(1) to note that --status-fd output does not contain newlines
  in error messages anymore (this was fixed in 1.15.0).
* Add a new --status-logger option to dpkg, similar to --status-fd but
  instead invoke the command ourselves and feed the status information
  to its standard input. Suggested by Raphaël Hertzog.
* Add missing space in update-alternative --set-selections output.
* Add missing options to update-alternative --help output.
* Count “conffile name is duplicated” for dpkg-deb warning count summary.
* Improve and clarify strings for translation. Closes: #604914
* Prefix all fatal error messages with “error: ”.
* Do not check presence of update-rc.d in the PATH in dpkg, as it's not
  a program needed for dpkg correct operation.
* Fix dpkg -GEO options on multiple versions of the same packages.
  Closes: #31141
* Propagate --admindir to programs run from maintainer scritpts.
  Closes: #97076
* Do not fail when trying to remove the root directory. This will only
  happen either on distributions where dpkg is a foreign package manager,
  or on artificial dpkg databases.
* Always warn when parsing any package control data which does not have
  an Architecture field except for status and status log files when
  packages are not-installed or half-installed.
* By default reject installing packages w/o an Architecture field. They
  now need --force-architecture, dpkg will still warn about them though.
* Fix build failure when passing --disable-nls to configure.
* Do not segfault on “dpkg -i --no-act”.
* Add missing semicolon to the vsnprintf() compat declaration.
  Thanks to Robert Millan. Closes: #612203
* On install for Ubuntu adjust the i386 GNU cpu name in cputable.
  Thanks to Colin Watson <cjwatson@ubuntu.com>. Closes: #611741
* Sync the info database directory on unpack instead of the temporary
  control information directory, and print the correct pathname on error
  instead of the last file acted on that directory.
* Document in dpkg-query --help output and man page that --list and --show
  arguments are optional.
* Do not read and write the available file unnecessarily.
  Thanks to Michel Lespinasse <walken@zoy.org>. Closes: #397121
* Fix typo in «dpkg-name --overwrite» argument parsing so that it actually
  works at all. Thanks to Ivan Gagis <igagis@gmail.com>. LP: #728708
* Add armhf support to ostable and triplettable. Closes: #594179
* Set the modification time for unpacked symlinks on supported systems.
* Fix undefined value useage in dpkg-genchanges when adding files w/o a
  matching architecture, because they are not present in debian/control,
  this is most commonly the case due to dpkg-distaddfile.
* Terminate immediately on dpkg-divert rename errors instead of propagating
  up the error codes, this improves error reporting and avoids triggering
  leak detectors. Closes: #620380
* When moving a diverted file across filesystems in dpkg-divert, remove
  the source file.

[ Raphaël Hertzog ]
* Fail properly when debian/source/format is empty. Closes: #600854
* Add new deb-src-control(5) manual page documenting the debian/control
  file contained in source packages.
  - it documents the X[SBC]- prefix. Closes: #476335
  - it documents the VCS-* fields too. Closes: #483119
  Thanks to Oxan van Leeuwen <oxan@oxanvanleeuwen.nl> who wrote it
  as part of the Google Code In program.
* Enhance dpkg-shlibdeps to not fail immediatly when a library is not found.
  Instead continue and fail after all problems have been reported. Thanks
  to Chris Baines <cbaines8@gmail.com> for the patch. Closes: #596841
* Fix dpkg-source to not list Debian packaging files as modified
  upstream files in Format "1.0" when unpacking to a non-standard
  directory.
* Apply patch from Colin Watson to let dpkg-buildflags return -O3
  instead of -O2 when building ppc64 packages on Ubuntu. Closes: #612472
* Add new function get_control_path() to Dpkg::Path, it wraps dpkg-query
  --control-path.
* Update dpkg-shlibdeps to be multiarch-ready:
  - use get_control_path() to find symbols/shlibs files
  - parse correctly the output of dpkg --search
* Small fix to support files >2GB in .deb on 64-bit systems. Closes: #616502
  Thanks to Martin Dorey <mdorey@bluearc.com> for the patch.
* dpkg-source now keeps the file ordering in the autogenerated patch when
  regenerating it. Closes: #606080
  Thanks to Colin Watson for the patch.
* dpkg-source now uses a timestamp retrieved from the filesystem when
  resetting the timestamp of patched files so that a time skew when using
  NFS doesn't introduce any inconsistency. Closes: #613023
  Thanks to Jonathan Nieder <jrnieder@gmail.com> for the patch and the
  diagnosis.
* dpkg-source will now remove quilt's .pc directory when --unapply-patches
  is in use. Closes: #591858
* dpkg-source is now a bit less strict when parsing patches:
  - it accepts seeing the same file twice; Closes: #608829
  - it doesn't match on the English text "No newline at end of file" as it
    might be translated in some cases. Closes: #612465
* Improve parser in Dpkg::Control::Hash to not require an empty line
  before the PGP signature. Closes: #617923
  Thanks to Roger Leigh for the initial patch.
* Fix a regression in dpkg-divert where using --rename led to a failure when
  the rename implies crossing file systems. Thanks to Durk Strooisma for
  spotting it.
* Use the correct mtime when installing a file with statoverrides.
  Regression introduced in 1.16.0. LP: #739179
* Remove duplicate word in german translation of dpkg(1). Closes: #616096
* Strip repeated non-significant spaces before and after newlines
  in Uploaders. Closes: #598922
* Ignore whitespaces after options in headers of changelog entries.
  Closes: #605719
* Fix dpkg-source's regression with empty patches (introduced while fixing
  #613023). Closes: #619541

[ Jonathan Nieder ]
* Remove support for use of synchronous sync(2), due to its pernicious
  side-effects and to ease maintenance.
* Clarify that an up-to-date dpkg only needs to be unpacked for
  dpkg-maintscript-helper to work.

[ Steve Langasek ]
* Add new variables to dpkg-architecture, DEB_HOST_MULTIARCH and
  DEB_BUILD_MULTIARCH, that return the "ideal" GNU triplet for each
  architecture which should be used as the path component for library
  installation.

[ Mark Hymers ]
* Add support for Built-Using field. Closes: #619311

[ Updated programs translations ]
* German (Sven Joachim).
* Portuguese (Miguel Figueiredo).
* Spanish (Javier Fernandez-Sanguino).
* Swedish (Peter Krefting).

[ Updated man page translations ]
* German (Helge Kreutzmann).
* Swedish (Peter Krefting).

[ Updated scripts translations ]
* German (Helge Kreutzmann).
* Swedish (Peter Krefting).

[ Updated dselect translations ]
* Spanish (Javier Fernandez-Sanguino).

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
 *
5
5
 * Copyright © 1995,1996 Ian Jackson <ian@chiark.greenend.org.uk>
6
6
 * Copyright © 2000,2001 Wichert Akkerman <wakkerma@debian.org>
7
 
 * Copyright © 2006-2009 Guillem Jover <guillem@debian.org>
 
7
 * Copyright © 2006-2011 Guillem Jover <guillem@debian.org>
8
8
 *
9
9
 * This is free software; you can redistribute it and/or modify
10
10
 * it under the terms of the GNU General Public License as published by
49
49
#include <dpkg/myopt.h>
50
50
 
51
51
#include "filesdb.h"
 
52
#include "infodb.h"
52
53
#include "main.h"
53
54
 
54
55
static const char* showformat           = "${Package}\t${Version}\n";
64
65
  else if (!isatty(1))
65
66
    return -1;
66
67
  else {
 
68
    res = 80;
 
69
 
67
70
    if ((fd=open("/dev/tty",O_RDONLY))!=-1) {
68
 
      if (ioctl(fd, TIOCGWINSZ, &ws)==-1)
69
 
        ws.ws_col=80;
 
71
      if (ioctl(fd, TIOCGWINSZ, &ws) == 0)
 
72
        res = ws.ws_col;
70
73
      close(fd);
71
74
    }
72
 
    return ws.ws_col;
 
75
 
 
76
    return res;
73
77
  }
74
78
}
75
79
 
 
80
struct list_format {
 
81
  bool head;
 
82
  int nw, vw, dw;
 
83
  char format[80];
 
84
};
 
85
 
76
86
static void
77
 
list1package(struct pkginfo *pkg, bool *head, struct pkg_array *array)
 
87
list_format_init(struct list_format *fmt, struct pkg_array *array)
78
88
{
79
 
  int i,l,w;
80
 
  static int nw,vw,dw;
81
 
  const char *pdesc;
82
 
  static char format[80]   = "";
83
 
    
84
 
  if (format[0] == '\0') {
85
 
    w=getwidth();
86
 
    if (w == -1) {
87
 
      nw=14, vw=14, dw=44;
88
 
      for (i = 0; i < array->n_pkgs; i++) {
89
 
        int plen, vlen, dlen;
90
 
 
91
 
        plen = strlen(array->pkgs[i]->name);
92
 
        vlen = strlen(versiondescribe(&array->pkgs[i]->installed.version,
93
 
                                      vdew_nonambig));
94
 
        pkg_summary(array->pkgs[i], &dlen);
95
 
 
96
 
        if (plen > nw) nw = plen;
97
 
        if (vlen > vw) vw = vlen;
98
 
        if (dlen > dw) dw = dlen;
99
 
      }
100
 
    } else {
101
 
      w-=80;
102
 
      if (w<0) w=0;             /* lets not try to deal with terminals that are too small */
103
 
      w>>=2;            /* halve that so we can add that to the both the name and description */
104
 
      nw=(14+w);                /* name width */
105
 
      vw=(14+w);                /* version width */
106
 
      dw=(44+(2*w));    /* description width */
 
89
  int w;
 
90
 
 
91
  if (fmt->format[0] != '\0')
 
92
    return;
 
93
 
 
94
  w = getwidth();
 
95
  if (w == -1) {
 
96
    int i;
 
97
 
 
98
    fmt->nw = 14;
 
99
    fmt->vw = 14;
 
100
    fmt->dw = 44;
 
101
 
 
102
    for (i = 0; i < array->n_pkgs; i++) {
 
103
      int plen, vlen, dlen;
 
104
 
 
105
      plen = strlen(array->pkgs[i]->name);
 
106
      vlen = strlen(versiondescribe(&array->pkgs[i]->installed.version,
 
107
                                    vdew_nonambig));
 
108
      pkg_summary(array->pkgs[i], &dlen);
 
109
 
 
110
      if (plen > fmt->nw)
 
111
        fmt->nw = plen;
 
112
      if (vlen > fmt->vw)
 
113
        fmt->vw = vlen;
 
114
      if (dlen > fmt->dw)
 
115
        fmt->dw = dlen;
107
116
    }
108
 
    sprintf(format,"%%c%%c%%c %%-%d.%ds %%-%d.%ds %%.*s\n", nw, nw, vw, vw);
 
117
  } else {
 
118
    w -= 80;
 
119
    /* Let's not try to deal with terminals that are too small. */
 
120
    if (w < 0)
 
121
      w = 0;
 
122
    /* Halve that so we can add it to both the name and description. */
 
123
    w >>= 2;
 
124
    /* Name width. */
 
125
    fmt->nw = (14 + w);
 
126
    /* Version width. */
 
127
    fmt->vw = (14 + w);
 
128
    /* Description width. */
 
129
    fmt->dw = (44 + (2 * w));
109
130
  }
110
 
 
111
 
  if (!*head) {
112
 
    fputs(_("\
 
131
  sprintf(fmt->format, "%%c%%c%%c %%-%d.%ds %%-%d.%ds %%.*s\n",
 
132
          fmt->nw, fmt->nw, fmt->vw, fmt->vw);
 
133
}
 
134
 
 
135
static void
 
136
list_format_print_header(struct list_format *fmt)
 
137
{
 
138
  int l;
 
139
 
 
140
  if (fmt->head)
 
141
    return;
 
142
 
 
143
  /* TRANSLATORS: This is the header that appears on 'dpkg-query -l'. The
 
144
   * string should remain under 80 characters. The uppercase letters in
 
145
   * the state values denote the abbreviated letter that will appear on
 
146
   * the first three columns, which should ideally match the English one
 
147
   * (e.g. Remove → supRimeix), see dpkg-query(1) for further details. The
 
148
   * translated message can use additional lines if needed. */
 
149
  fputs(_("\
113
150
Desired=Unknown/Install/Remove/Purge/Hold\n\
114
151
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend\n\
115
152
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)\n"), stdout);
116
 
    printf(format,'|','|','/', _("Name"), _("Version"), 40, _("Description"));
117
 
    printf("+++-");                                     /* status */
118
 
    for (l=0;l<nw;l++) printf("="); printf("-");        /* packagename */
119
 
    for (l=0;l<vw;l++) printf("="); printf("-");        /* version */
120
 
    for (l=0;l<dw;l++) printf("=");                     /* description */
121
 
    printf("\n");
122
 
    *head = true;
123
 
  }
 
153
  printf(fmt->format, '|', '|', '/', _("Name"), _("Version"), 40,
 
154
         _("Description"));
 
155
 
 
156
  /* Status */
 
157
  printf("+++-");
 
158
 
 
159
 /* Package name. */
 
160
  for (l = 0; l < fmt->nw; l++)
 
161
    printf("=");
 
162
  printf("-");
 
163
 
 
164
  /* Version. */
 
165
  for (l = 0; l < fmt->vw; l++)
 
166
    printf("=");
 
167
  printf("-");
 
168
 
 
169
  /* Description. */
 
170
  for (l = 0; l < fmt->dw; l++)
 
171
    printf("=");
 
172
  printf("\n");
 
173
 
 
174
  fmt->head = true;
 
175
}
 
176
 
 
177
static void
 
178
list1package(struct pkginfo *pkg, struct list_format *fmt, struct pkg_array *array)
 
179
{
 
180
  int l;
 
181
  const char *pdesc;
 
182
 
 
183
  list_format_init(fmt, array);
 
184
  list_format_print_header(fmt);
124
185
 
125
186
  pdesc = pkg_summary(pkg, &l);
126
 
  l = min(l, dw);
 
187
  l = min(l, fmt->dw);
127
188
 
128
 
  printf(format,
 
189
  printf(fmt->format,
129
190
         "uihrp"[pkg->want],
130
191
         "ncHUFWti"[pkg->status],
131
192
         " R"[pkg->eflag],
141
202
  struct pkginfo *pkg;
142
203
  int i;
143
204
  int failures = 0;
144
 
  bool head;
 
205
  struct list_format fmt;
145
206
 
146
 
  modstatdb_init(admindir,msdbrw_readonly);
 
207
  if (!*argv)
 
208
    modstatdb_open(msdbrw_readonly);
 
209
  else
 
210
    modstatdb_open(msdbrw_readonly | msdbrw_available_readonly);
147
211
 
148
212
  pkg_array_init_from_db(&array);
149
213
  pkg_array_sort(&array, pkg_sorter_by_name);
150
214
 
151
 
  head = false;
 
215
  fmt.head = false;
 
216
  fmt.format[0] = '\0';
152
217
 
153
218
  if (!*argv) {
154
219
    for (i = 0; i < array.n_pkgs; i++) {
155
220
      pkg = array.pkgs[i];
156
221
      if (pkg->status == stat_notinstalled) continue;
157
 
      list1package(pkg, &head, &array);
 
222
      list1package(pkg, &fmt, &array);
158
223
    }
159
224
  } else {
160
225
    int argc, ip, *found;
167
232
      pkg = array.pkgs[i];
168
233
      for (ip = 0; ip < argc; ip++) {
169
234
        if (!fnmatch(argv[ip], pkg->name, 0)) {
170
 
          list1package(pkg, &head, &array);
 
235
          list1package(pkg, &fmt, &array);
171
236
          found[ip]++;
172
237
          break;
173
238
        }
239
304
  int failures = 0;
240
305
  struct varbuf path = VARBUF_INIT;
241
306
  static struct varbuf vb;
242
 
  
 
307
 
243
308
  if (!*argv)
244
309
    badusage(_("--search needs at least one file name pattern argument"));
245
310
 
246
 
  modstatdb_init(admindir,msdbrw_readonly|msdbrw_noavail);
 
311
  modstatdb_open(msdbrw_readonly);
247
312
  ensure_allinstfiles_available_quiet();
248
313
  ensure_diversions();
249
314
 
250
315
  while ((thisarg = *argv++) != NULL) {
251
316
    found= 0;
252
317
 
253
 
    /* Trim trailing slash and slash dot from the argument if it's
254
 
     * not a pattern, just a path.
255
 
     */
 
318
    /* Trim trailing ‘/’ and ‘/.’ from the argument if it's
 
319
     * not a pattern, just a path. */
256
320
    if (!strpbrk(thisarg, "*[?\\")) {
257
 
      varbufreset(&path);
258
 
      varbufaddstr(&path, thisarg);
259
 
      varbufaddc(&path, '\0');
 
321
      varbuf_reset(&path);
 
322
      varbuf_add_str(&path, thisarg);
 
323
      varbuf_end_str(&path);
260
324
 
261
 
      varbuf_trunc(&path, path_rtrim_slash_slashdot(path.buf));
 
325
      varbuf_trunc(&path, path_trim_slash_slashdot(path.buf));
262
326
 
263
327
      thisarg = path.buf;
264
328
    }
265
329
 
266
330
    if (!strchr("*[?/",*thisarg)) {
267
 
      varbufreset(&vb);
268
 
      varbufaddc(&vb,'*');
269
 
      varbufaddstr(&vb,thisarg);
270
 
      varbufaddc(&vb,'*');
271
 
      varbufaddc(&vb,0);
 
331
      varbuf_reset(&vb);
 
332
      varbuf_add_char(&vb, '*');
 
333
      varbuf_add_str(&vb, thisarg);
 
334
      varbuf_add_char(&vb, '*');
 
335
      varbuf_end_str(&vb);
272
336
      thisarg= vb.buf;
273
337
    }
274
338
    if (!strpbrk(thisarg, "*[?\\")) {
283
347
      iterfileend(it);
284
348
    }
285
349
    if (!found) {
286
 
      fprintf(stderr,_("dpkg: %s not found.\n"),thisarg);
 
350
      fprintf(stderr, _("%s: no path found matching pattern %s.\n"), thisname,
 
351
              thisarg);
287
352
      failures++;
288
353
      m_output(stderr, _("<standard error>"));
289
354
    } else {
305
370
  struct pkginfo *pkg;
306
371
  struct filenamenode *namenode;
307
372
  int failures = 0;
308
 
  
 
373
 
309
374
  if (!*argv)
310
375
    badusage(_("--%s needs at least one package name argument"), cipaction->olong);
311
376
 
312
 
  if (cipaction->arg==act_listfiles)
313
 
    modstatdb_init(admindir,msdbrw_readonly|msdbrw_noavail);
314
 
  else 
315
 
    modstatdb_init(admindir,msdbrw_readonly);
 
377
  if (cipaction->arg_int == act_printavail)
 
378
    modstatdb_open(msdbrw_readonly | msdbrw_available_readonly);
 
379
  else
 
380
    modstatdb_open(msdbrw_readonly);
316
381
 
317
382
  while ((thisarg = *argv++) != NULL) {
318
 
    pkg= findpackage(thisarg);
 
383
    pkg = pkg_db_find(thisarg);
319
384
 
320
 
    switch (cipaction->arg) {
321
 
      
 
385
    switch (cipaction->arg_int) {
322
386
    case act_status:
323
387
      if (pkg->status == stat_notinstalled &&
324
388
          pkg->priority == pri_unknown &&
325
389
          !(pkg->section && *pkg->section) &&
326
390
          !pkg->files &&
327
391
          pkg->want == want_unknown &&
328
 
          !informative(pkg,&pkg->installed)) {
 
392
          !pkg_is_informative(pkg, &pkg->installed)) {
329
393
        fprintf(stderr,_("Package `%s' is not installed and no info is available.\n"),pkg->name);
330
394
        failures++;
331
395
      } else {
332
396
        writerecord(stdout, _("<standard output>"), pkg, &pkg->installed);
333
397
      }
334
398
      break;
335
 
 
336
399
    case act_printavail:
337
 
      if (!informative(pkg,&pkg->available)) {
 
400
      if (!pkg_is_informative(pkg, &pkg->available)) {
338
401
        fprintf(stderr,_("Package `%s' is not available.\n"),pkg->name);
339
402
        failures++;
340
403
      } else {
341
404
        writerecord(stdout, _("<standard output>"), pkg, &pkg->available);
342
405
      }
343
406
      break;
344
 
      
345
407
    case act_listfiles:
346
408
      switch (pkg->status) {
347
 
      case stat_notinstalled: 
 
409
      case stat_notinstalled:
348
410
        fprintf(stderr,_("Package `%s' is not installed.\n"),pkg->name);
349
411
        failures++;
350
412
        break;
351
 
        
352
413
      default:
353
414
        ensure_packagefiles_available(pkg);
354
415
        ensure_diversions();
377
438
        break;
378
439
      }
379
440
      break;
380
 
 
381
441
    default:
382
 
      internerr("unknown action '%d'", cipaction->arg);
 
442
      internerr("unknown action '%d'", cipaction->arg_int);
383
443
    }
384
444
 
385
445
    if (*argv != NULL)
412
472
    return failures;
413
473
  }
414
474
 
415
 
  modstatdb_init(admindir,msdbrw_readonly);
 
475
  if (!*argv)
 
476
    modstatdb_open(msdbrw_readonly);
 
477
  else
 
478
    modstatdb_open(msdbrw_readonly | msdbrw_available_readonly);
416
479
 
417
480
  pkg_array_init_from_db(&array);
418
481
  pkg_array_sort(&array, pkg_sorter_by_name);
462
525
}
463
526
 
464
527
static void
 
528
pkg_infodb_print_filename(const char *filename, const char *filetype)
 
529
{
 
530
  /* Do not expose internal database files. */
 
531
  if (strcmp(filetype, LISTFILE) == 0 ||
 
532
      strcmp(filetype, CONFFILESFILE) == 0)
 
533
    return;
 
534
 
 
535
  if (strlen(filetype) > MAXCONTROLFILENAME)
 
536
    return;
 
537
 
 
538
  printf("%s\n", filename);
 
539
}
 
540
 
 
541
static void
465
542
control_path_file(struct pkginfo *pkg, const char *control_file)
466
543
{
467
544
  const char *control_path;
468
545
  struct stat st;
469
546
 
470
 
  /* Do not expose internal database files. */
471
 
  if (strcmp(control_file, LISTFILE) == 0 ||
472
 
      strcmp(control_file, CONFFILESFILE) == 0)
473
 
    return;
474
 
 
475
547
  control_path = pkgadminfile(pkg, control_file);
476
 
 
477
548
  if (stat(control_path, &st) < 0)
478
549
    return;
479
 
 
480
550
  if (!S_ISREG(st.st_mode))
481
551
    return;
482
552
 
483
 
  printf("%s\n", control_path);
484
 
}
485
 
 
486
 
static void
487
 
control_path_pkg(struct pkginfo *pkg)
488
 
{
489
 
  DIR *db_dir;
490
 
  struct dirent *db_de;
491
 
  struct varbuf db_path;
492
 
  size_t db_path_len;
493
 
 
494
 
  varbufinit(&db_path, 0);
495
 
  varbufaddstr(&db_path, pkgadmindir());
496
 
  db_path_len = db_path.used;
497
 
  varbufaddc(&db_path, '\0');
498
 
 
499
 
  db_dir = opendir(db_path.buf);
500
 
  if (!db_dir)
501
 
    ohshite(_("cannot read info directory"));
502
 
 
503
 
  push_cleanup(cu_closedir, ~0, NULL, 0, 1, (void *)db_dir);
504
 
  while ((db_de = readdir(db_dir)) != NULL) {
505
 
    const char *p;
506
 
 
507
 
    /* Ignore dotfiles, including ‘.’ and ‘..’. */
508
 
    if (db_de->d_name[0] == '.')
509
 
      continue;
510
 
 
511
 
    /* Ignore anything odd. */
512
 
    p = strrchr(db_de->d_name, '.');
513
 
    if (!p)
514
 
      continue;
515
 
 
516
 
    /* Ignore files from other packages. */
517
 
    if (strlen(pkg->name) != (size_t)(p - db_de->d_name) ||
518
 
        strncmp(db_de->d_name, pkg->name, p - db_de->d_name))
519
 
      continue;
520
 
 
521
 
    /* Skip past the full stop. */
522
 
    p++;
523
 
 
524
 
    /* Do not expose internal database files. */
525
 
    if (strcmp(p, LISTFILE) == 0 ||
526
 
        strcmp(p, CONFFILESFILE) == 0)
527
 
      continue;
528
 
 
529
 
    if (strlen(p) > MAXCONTROLFILENAME)
530
 
      continue;
531
 
 
532
 
    varbuf_trunc(&db_path, db_path_len);
533
 
    varbufaddstr(&db_path, db_de->d_name);
534
 
    varbufaddc(&db_path, '\0');
535
 
 
536
 
    printf("%s\n", db_path.buf);
537
 
  }
538
 
  pop_cleanup(ehflag_normaltidy); /* closedir */
539
 
 
540
 
  varbuf_destroy(&db_path);
 
553
  pkg_infodb_print_filename(control_path, control_file);
541
554
}
542
555
 
543
556
static int
565
578
        badusage(_("control file contains %c"), *c);
566
579
  }
567
580
 
568
 
  modstatdb_init(admindir, msdbrw_readonly | msdbrw_noavail);
 
581
  modstatdb_open(msdbrw_readonly);
569
582
 
570
 
  pkg = findpackage(pkg_name);
 
583
  pkg = pkg_db_find(pkg_name);
571
584
  if (pkg->status == stat_notinstalled)
572
 
    badusage(_("Package `%s' is not installed.\n"), pkg->name);
 
585
    ohshit(_("Package `%s' is not installed.\n"), pkg->name);
573
586
 
574
587
  if (control_file)
575
588
    control_path_file(pkg, control_file);
576
589
  else
577
 
    control_path_pkg(pkg);
 
590
    pkg_infodb_foreach(pkg, pkg_infodb_print_filename);
578
591
 
579
592
  modstatdb_shutdown();
580
593
 
608
621
"  -p|--print-avail <package> ...   Display available version details.\n"
609
622
"  -L|--listfiles <package> ...     List files `owned' by package(s).\n"
610
623
"  -l|--list [<pattern> ...]        List packages concisely.\n"
611
 
"  -W|--show <pattern> ...          Show information on package(s).\n"
 
624
"  -W|--show [<pattern> ...]        Show information on package(s).\n"
612
625
"  -S|--search <pattern> ...        Find package(s) owning file(s).\n"
613
626
"  -c|--control-path <package> [<file>]\n"
614
627
"                                   Print path for package control file.\n"
642
655
const char thisname[]= "dpkg-query";
643
656
const char printforhelp[]= N_("Use --help for help about querying packages.");
644
657
 
645
 
const struct cmdinfo *cipaction = NULL;
646
 
 
647
 
const char *admindir= ADMINDIR;
648
 
 
649
 
static void setaction(const struct cmdinfo *cip, const char *value) {
650
 
  if (cipaction)
651
 
    badusage(_("conflicting actions -%c (--%s) and -%c (--%s)"),
652
 
             cip->oshort, cip->olong, cipaction->oshort, cipaction->olong);
653
 
  cipaction= cip;
654
 
}
655
 
 
 
658
static const char *admindir;
 
659
 
 
660
/* This table has both the action entries in it and the normal options.
 
661
 * The action entries are made with the ACTION macro, as they all
 
662
 * have a very similar structure. */
656
663
static const struct cmdinfo cmdinfos[]= {
657
 
  /* This table has both the action entries in it and the normal options.
658
 
   * The action entries are made with the ACTION macro, as they all
659
 
   * have a very similar structure.
660
 
   */
661
 
#define ACTION(longopt,shortopt,code,function) \
662
 
 { longopt, shortopt, 0, NULL, NULL, setaction, code, NULL, (voidfnp)function }
663
 
#define OBSOLETE(longopt,shortopt) \
664
 
 { longopt, shortopt, 0, NULL, NULL, setobsolete, 0, NULL, NULL }
665
 
 
666
664
  ACTION( "listfiles",                      'L', act_listfiles,     enqperpackage   ),
667
665
  ACTION( "status",                         's', act_status,        enqperpackage   ),
668
666
  ACTION( "print-avail",                    'p', act_printavail,    enqperpackage   ),
679
677
};
680
678
 
681
679
int main(int argc, const char *const *argv) {
682
 
  jmp_buf ejbuf;
683
 
  int (*actionfunction)(const char *const *argv);
684
680
  int ret;
685
681
 
686
682
  setlocale(LC_ALL, "");
687
683
  bindtextdomain(PACKAGE, LOCALEDIR);
688
684
  textdomain(PACKAGE);
689
685
 
690
 
  standard_startup(&ejbuf);
 
686
  standard_startup();
691
687
  myopt(&argv, cmdinfos);
692
688
 
 
689
  admindir = dpkg_db_set_dir(admindir);
 
690
 
693
691
  if (!cipaction) badusage(_("need an action option"));
694
692
 
695
693
  setvbuf(stdout, NULL, _IONBF, 0);
696
694
  filesdbinit();
697
695
 
698
 
  actionfunction = (int (*)(const char *const *))cipaction->farg;
699
 
 
700
 
  ret = actionfunction(argv);
 
696
  ret = cipaction->action(argv);
701
697
 
702
698
  standard_shutdown();
703
699