]> err.no Git - dpkg/commitdiff
Make dselect build again
authorWichert Akkerman <wakkerma@debian.org>
Sun, 5 Dec 1999 18:04:27 +0000 (18:04 +0000)
committerWichert Akkerman <wakkerma@debian.org>
Sun, 5 Dec 1999 18:04:27 +0000 (18:04 +0000)
Don't copy strings when reading fileslists

ChangeLog
dselect/main.cc
main/archives.c
main/enquiry.c
main/filesdb.c
main/filesdb.h
main/help.c
main/processarc.c
po/dpkg.pot

index 8876cff4059fa0cd350a202a1031f07d1ce9e962..324030adbc173a55aa8f46c9812256657319da74 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,9 @@ Sun Dec  5 18:09:36 CET 1999 Wichert Akkerman <wakkerma@debian.org>
     cleanup-info and dpkg-divert
   * New dpkg-scansources from Roderick to allow trailing blanks on lines
   * Correct generation of manual-version
+  * Merge patch from Richard Kettlewell <rjk@sfere.greenend.org.uk> to
+    eliminate string copies while reading .list files
+  * Fix earlier translation-patch for dselect so it builds again
 
 Sat Dec  4 04:22:49 CET 1999 Wichert Akkerman <wakkerma@debian.org>
 
index d25e3b5b7fe922a509e2e7a021247d934648c378..632d1ba4bd6992dbbdad1ab4c1ed30e5581ad7c3 100644 (file)
@@ -48,7 +48,7 @@ extern "C" {
 #include "pkglist.h"
 
 const char thisname[]= DSELECT;
-const char printforhelp[]= N_("Type %s --help for help.", DSELECT);
+const char printforhelp[]= N_("Type dselect --help for help.");
 
 modstatdb_rw readwrite;
 const char *admindir= ADMINDIR;
@@ -75,16 +75,17 @@ static const menuentry menuentries[]= {
 };
 
 static const char programdesc[]=
-      N_("Debian Linux `%s' package handling frontend.", DSELECT);
+      N_("Debian Linux `%s' package handling frontend.");
 
 static const char copyrightstring[]= N_(
       "Version %s.  Copyright (C) 1994-1996 Ian Jackson.   This is\n"
       "free software; see the GNU General Public Licence version 2 or later for\n"
-      "copying conditions.  There is NO warranty.  See dselect --licence for details.\n",
-      DPKG_VERSION_ARCH);
+      "copying conditions.  There is NO warranty.  See dselect --licence for details.\n");
 
 static void printversion(void) {
-  if (fprintf(stdout,"%s\n%s",gettext(programdesc),gettext(copyrightstring)) == EOF) werr("stdout");
+  if (fprintf(stdout,gettext(programdesc),DSELECT) == EOF) werr("stdout");
+  if (fprintf(stdout,"\n") == EOF) werr("stdout");
+  if (fprintf(stdout,gettext(copyrightstring), DPKG_VERSION_ARCH) == EOF) werr("stdout");
 }
 
 static void usage(void) {
index 523806b453e0993dd578ed0e26e7ff3a052d5f40..fb30d023c8dbf71dbc44307a0c21b5028ff218d5 100644 (file)
@@ -227,7 +227,7 @@ int tarobject(struct TarInfo *ti) {
    * been stripped by TarExtractor (lib/tarfn.c).
    */
   nifd= m_malloc(sizeof(struct fileinlist));
-  nifd->namenode= findnamenode(ti->Name);
+  nifd->namenode= findnamenode(ti->Name, 0);
   nifd->next= 0; *tc->newfilesp= nifd; tc->newfilesp= &nifd->next;
   nifd->namenode->flags |= fnnf_new_inarchive;
 
index bbe154cec262ddccce378ac0bc640bf997858e1c..cdce20281d2e913496a3ba12913578ed425b7af6 100644 (file)
@@ -359,7 +359,7 @@ void searchfiles(const char *const *argv) {
       thisarg= vb.buf;
     }
     if (strcspn(thisarg,"*[?\\") == strlen(thisarg)) {
-      namenode= findnamenode(thisarg);
+      namenode= findnamenode(thisarg, 0);
       found += searchoutput(namenode);
     } else {
       it= iterfilestart();
index f83617be265d08f0c04256333edd39a13c3f5ef4..0754555bf1b98064c1c4c5fbb3c19beb5ff77af1 100644 (file)
@@ -51,17 +51,20 @@ void note_must_reread_files_inpackage(struct pkginfo *pkg) {
 
 static int saidread=0;
 
+ /* load the list of files in this package into memory, or update the
+  * list if it is there but stale
+  */
 void ensure_packagefiles_available(struct pkginfo *pkg) {
   static struct varbuf fnvb;
-  static char stdiobuf[8192];
   
   FILE *file;
   const char *filelistfile;
   struct fileinlist **lendp, *newent, *current;
   struct filepackages *packageslump;
-  int search, findlast, putat= 0, l;
-  char *thefilename;
-  char linebuf[1024];
+  int search, findlast, putat;
+  struct stat stat_buf;
+  char *loaded_list, *loaded_list_end, *thisline, *nextline, *ptr;
+  ssize_t bytes, readden;
 
   if (pkg->clientdata && pkg->clientdata->fileslistvalid) return;
   ensure_package_clientdata(pkg);
@@ -132,44 +135,44 @@ void ensure_packagefiles_available(struct pkginfo *pkg) {
 
   push_cleanup(cu_closefile,ehflag_bombout, 0,0, 1,(void*)file);
   
-  if (setvbuf(file,stdiobuf,_IOFBF,sizeof(stdiobuf)))
-    ohshite(_("unable to set buffering on `%.250s'"),filelistfile);
+   if(fstat(fileno(file), &stat_buf))
+     ohshite("unable to stat files list file for package `%.250s'",pkg->name);
+   loaded_list = nfmalloc(stat_buf.st_size);
+   loaded_list_end = loaded_list + stat_buf.st_size;
+   /* stdio is an extra copy, hence we use read() */
+   readden = 0;                        /* write->written, read->readden */
+   while (readden < stat_buf.st_size) {
+     bytes = read(fileno(file),
+                loaded_list + readden, stat_buf.st_size - readden);
+     if (bytes < 0) {
+       if (errno == EINTR) continue;
+       ohshite("unable to read files list for package `%.250s'",pkg->name);
+     }
+     if (!bytes)
+       ohshit("unexpected end of file in files list for package `%.250s'",pkg->name);
+     readden += bytes;
+   }
   
   lendp= &pkg->clientdata->files;
-  varbufreset(&fnvb);
-  while (fgets(linebuf,sizeof(linebuf),file)) {
-    /* This is a very important loop, and it is therefore rather messy.
-     * We break the varbuf abstraction even more than usual, and we
-     * avoid copying where possible.
-     */
-    l= strlen(linebuf);
-    if (l == 0) ohshit(_("fgets gave an empty null-terminated string from `%.250s'"),
-                       filelistfile);
-    l--;
-    if (linebuf[l] != '\n') {
-      varbufaddstr(&fnvb,linebuf);
-      continue;
-    } else if (!fnvb.used && l>0 && linebuf[l-1] != '/') { /* fast path */
-      linebuf[l]= 0;
-      thefilename= linebuf;
-    } else {
-      if (l>0 && linebuf[l-1] == '/') l--; /* strip trailing slashes */
-      linebuf[l]= 0;
-      varbufaddstr(&fnvb,linebuf);
-      varbufaddc(&fnvb,0);
-      fnvb.used= 0;
-      thefilename= fnvb.buf;
-    }
-    if (!*thefilename)
+  thisline = loaded_list;
+  while (thisline < loaded_list_end) {
+    if (!(ptr = memchr(thisline, '\n', loaded_list_end - thisline))) 
+      ohshit("files list file for package `%.250s' is missing final newline",pkg->name);
+    /* where to start next time around */
+    nextline = ptr + 1;
+    /* strip trailing "/" */
+    if (ptr > thisline && ptr[-1] == '/') ptr--;
+    /* add the file to the list */
+    if (ptr == thisline)
       ohshit(_("files list file for package `%.250s' contains empty filename"),pkg->name);
+    *ptr = 0;
     newent= nfmalloc(sizeof(struct fileinlist));
-    newent->namenode= findnamenode(thefilename);
+    newent->namenode= findnamenode(thisline, fnn_nocopy);
     newent->next= 0;
     *lendp= newent;
     lendp= &newent->next;
+    thisline = nextline;
   }
-  if (ferror(file))
-    ohshite(_("error reading files list file for package `%.250s'"),pkg->name);
   pop_cleanup(ehflag_normaltidy); /* file= fopen() */
   if (fclose(file))
     ohshite(_("error closing files list file for package `%.250s'"),pkg->name);
@@ -356,7 +359,7 @@ void ensure_diversions(void) {
     if (l == 0) ohshit(_("fgets gave an empty string from diversions [i]"));
     if (linebuf[--l] != '\n') ohshit(_("diversions file has too-long line or EOF [i]"));
     linebuf[l]= 0;
-    oialtname->camefrom= findnamenode(linebuf);
+    oialtname->camefrom= findnamenode(linebuf, 0);
     oialtname->useinstead= 0;    
 
     if (!fgets(linebuf,sizeof(linebuf),file)) {
@@ -367,7 +370,7 @@ void ensure_diversions(void) {
     if (l == 0) ohshit(_("fgets gave an empty string from diversions [ii]"));
     if (linebuf[--l] != '\n') ohshit(_("diversions file has too-long line or EOF [ii]"));
     linebuf[l]= 0;
-    oicontest->useinstead= findnamenode(linebuf);
+    oicontest->useinstead= findnamenode(linebuf, 0);
     oicontest->camefrom= 0;
     
     if (!fgets(linebuf,sizeof(linebuf),file)) {
@@ -424,6 +427,26 @@ static struct filenamenode *bins[BINS];
 
 /*** Data structures for low-memory-footprint in-core files database ***/
 
+/* the idea is that you have a tree structure in memory which has the
+   same structure as the names themselves.
+
+   Each node in the tree gets an fdirnode.  This may have a
+   filenamenode attached to it (if there is really a filename
+   corresponding to the path down the tree to get here) and an
+   fdirents (if there is anything below this point.)
+
+   The fdirents structure lists the entries in a directory.  If there
+   is only 1 node below us then there's just one fdirents with a
+   single entry; if there are more then then next one (as defined by
+   the 'more' field) contains two entries; the next four; etc.
+
+   This doubling effect is enforced by findnamenow_low() rather than
+   by a count field in the structure.
+
+   1999-07-26 RJK
+   
+*/
+
 struct fdirents {
   struct fdirents *more;
   struct { const char *component; struct fdirnode *go; } entries[1];
@@ -532,15 +555,17 @@ void filesdbinit(void) {
   }    
 }
 
-static struct filenamenode *findnamenode_high(const char *name);
-static struct filenamenode *findnamenode_low(const char *name);
+static struct filenamenode *findnamenode_high(const char *name,
+                                             enum fnnflags flags);
+static struct filenamenode *findnamenode_low(const char *name,
+                                            enum fnnflags flags);
   
-struct filenamenode *findnamenode(const char *name) {
+struct filenamenode *findnamenode(const char *name, enum fnnflags flags) {
   switch (f_largemem) {
   case 1:
-    return findnamenode_high(name);
+    return findnamenode_high(name, flags);
   case -1:
-    return findnamenode_low(name);
+    return findnamenode_low(name, flags);
   default:
     internerr("findnamenode no f_largemem");
   }
@@ -548,14 +573,16 @@ struct filenamenode *findnamenode(const char *name) {
 
 /*** Code for low-memory-footprint in-core files database ***/
   
-static struct filenamenode *findnamenode_low(const char *name) {
+static struct filenamenode *findnamenode_low(const char *name,
+                                            enum fnnflags flags) {
   struct fdirnode *traverse;
   struct fdirents *ents, **addto;
   const char *nameleft, *slash;
   char *p;
   struct filenamesblock *newblock;
   int n, i, nentrieshere, alloc;
-
+  const char *orig_name = name;
+  
   /* We skip initial slashes and ./ pairs, and add our own single leading slash. */
   name= skip_slash_dotslash(name);
 
@@ -612,19 +639,23 @@ static struct filenamenode *findnamenode_low(const char *name) {
   traverse->here->divert= 0;
   traverse->here->filestat= 0;
 
-  n= strlen(name)+2;
-  if (namesarealeft < n) {
-    newblock= m_malloc(sizeof(struct filenamesblock));
-    alloc= 256*1024;
-    if (alloc<n) alloc= n;
-    newblock->data= m_malloc(alloc);
-    newblock->next= namesarea;
-    namesarea= newblock;
-    namesarealeft= alloc;
+  if((flags & fnn_nocopy) && name > orig_name && name[-1] == '/') {
+    traverse->here->name = (char *)name - 1;
+  } else {
+    n= strlen(name)+2;
+    if (namesarealeft < n) {
+      newblock= m_malloc(sizeof(struct filenamesblock));
+      alloc= 256*1024;
+      if (alloc<n) alloc= n;
+      newblock->data= m_malloc(alloc);
+      newblock->next= namesarea;
+      namesarea= newblock;
+      namesarealeft= alloc;
+    }
+    namesarealeft-= n;
+    p= namesarea->data+namesarealeft;
+    traverse->here->name= p; *p++= '/'; strcpy(p,name);
   }
-  namesarealeft-= n;
-  p= namesarea->data+namesarealeft;
-  traverse->here->name= p; *p++= '/'; strcpy(p,name);
 
   traverse->here->next= allfiles;
   allfiles= traverse->here;
@@ -640,8 +671,10 @@ static int hash(const char *name) {
   return v;
 }
 
-struct filenamenode *findnamenode_high(const char *name) {
+struct filenamenode *findnamenode_high(const char *name,
+                                            enum fnnflags flags) {
   struct filenamenode **pointerp, *newnode;
+  const char *orig_name = name;
 
   /* We skip initial slashes and ./ pairs, and add our own single leading slash. */
   name= skip_slash_dotslash(name);
@@ -656,8 +689,12 @@ struct filenamenode *findnamenode_high(const char *name) {
 
   newnode= nfmalloc(sizeof(struct filenamenode));
   newnode->packages= 0;
-  newnode->name= nfmalloc(strlen(name)+2);
-  newnode->name[0]= '/'; strcpy(newnode->name+1,name);
+  if((flags & fnn_nocopy) && name > orig_name && name[-1] == '/')
+    newnode->name = (char *)name - 1;
+  else {
+    newnode->name= nfmalloc(strlen(name)+2);
+    newnode->name[0]= '/'; strcpy(newnode->name+1,name);
+  }
   newnode->flags= 0;
   newnode->next= 0;
   newnode->divert= 0;
index 99bd405d7886f05d40e78cc18d317c781cb39c3b..7b8c9afd120fc0acf9fd3fe476d80d5f483e614a 100644 (file)
 
 struct pkginfo;
 
+/* flags to findnamenode() */
+
+enum fnnflags {
+    fnn_nocopy=                 000001, /* do not need to copy filename */
+};
+
 struct filenamenode {
   struct filenamenode *next;
   char *name;
@@ -116,7 +122,7 @@ void ensure_packagefiles_available(struct pkginfo *pkg);
 void ensure_allinstfiles_available(void);
 void ensure_allinstfiles_available_quiet(void);
 void note_must_reread_files_inpackage(struct pkginfo *pkg);
-struct filenamenode *findnamenode(const char *filename);
+struct filenamenode *findnamenode(const char *filename, enum fnnflags flags);
 void write_filelist_except(struct pkginfo *pkg, struct fileinlist *list, int leaveout);
 
 struct reversefilelistiter { struct fileinlist *todo; };
index 46a951c293d34b02e19d2390e22d3dceee4bcf2e..7774c4448893a637e9cbd4262f287a087d6365c0 100644 (file)
@@ -455,7 +455,7 @@ void oldconffsetflags(struct conffile *searchconff) {
   struct filenamenode *namenode;
   
   while (searchconff) {
-    namenode= findnamenode(searchconff->name);
+    namenode= findnamenode(searchconff->name, 0); /* XXX */
     namenode->flags |= fnnf_old_conff;
     debug(dbg_conffdetail, "oldconffsetflags `%s' namenode %p flags %o",
           searchconff->name, namenode, namenode->flags);
index 4b5b71d1a2e2feafb28f389683827fc31598fa48..280dfb1add7b8fb953ce4b0ce20d40ea65c224d1 100644 (file)
@@ -287,7 +287,7 @@ void process_archive(const char *filename) {
       *p= 0;
       newconff= m_malloc(sizeof(struct fileinlist));
       newconff->next= 0;
-      newconff->namenode= findnamenode(conffilenamebuf);
+      newconff->namenode= findnamenode(conffilenamebuf, 0);
       *newconffileslastp= newconff;
       newconffileslastp= &newconff->next;
       newconff->namenode->oldhash= NEWCONFFILEFLAG;
index f3ee686b3c7644c555f36b3cd2a05d2881a93913..43ab2dc764ac081c70a4a8bcf59202d9d55616a5 100644 (file)
@@ -7,7 +7,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 1999-10-30 15:10+0200\n"
+"POT-Creation-Date: 1999-12-05 18:52+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1280,57 +1280,61 @@ msgstr ""
 msgid " conflicts with "
 msgstr ""
 
-#: main/depcon.c:209
+#: main/depcon.c:136
+msgid " enhances "
+msgstr ""
+
+#: main/depcon.c:211
 #, c-format
 msgid "  %.250s is to be removed.\n"
 msgstr ""
 
-#: main/depcon.c:212
+#: main/depcon.c:214
 #, c-format
 msgid "  %.250s is to be deconfigured.\n"
 msgstr ""
 
-#: main/depcon.c:216
+#: main/depcon.c:218
 #, c-format
 msgid "  %.250s is to be installed, but is version %.250s.\n"
 msgstr ""
 
-#: main/depcon.c:224
+#: main/depcon.c:226
 #, c-format
 msgid "  %.250s is installed, but is version %.250s.\n"
 msgstr ""
 
-#: main/depcon.c:239
+#: main/depcon.c:241
 #, c-format
 msgid "  %.250s is unpacked, but has never been configured.\n"
 msgstr ""
 
-#: main/depcon.c:243
+#: main/depcon.c:245
 #, c-format
 msgid "  %.250s is unpacked, but is version %.250s.\n"
 msgstr ""
 
-#: main/depcon.c:249
+#: main/depcon.c:251
 #, c-format
 msgid "  %.250s latest configured version is %.250s.\n"
 msgstr ""
 
-#: main/depcon.c:258
+#: main/depcon.c:260
 #, c-format
 msgid "  %.250s is %s.\n"
 msgstr ""
 
-#: main/depcon.c:294
+#: main/depcon.c:296
 #, c-format
 msgid "  %.250s provides %.250s but is to be removed.\n"
 msgstr ""
 
-#: main/depcon.c:298
+#: main/depcon.c:300
 #, c-format
 msgid "  %.250s provides %.250s but is to be deconfigured.\n"
 msgstr ""
 
-#: main/depcon.c:303
+#: main/depcon.c:305
 #, c-format
 msgid "  %.250s provides %.250s but is %s.\n"
 msgstr ""
@@ -1338,28 +1342,28 @@ msgstr ""
 #. If the package wasn't installed at all, and we haven't said
 #. * yet why this isn't satisfied, we should say so now.
 #.
-#: main/depcon.c:317
+#: main/depcon.c:319
 #, c-format
 msgid "  %.250s is not installed.\n"
 msgstr ""
 
-#: main/depcon.c:348
+#: main/depcon.c:350
 #, c-format
 msgid "  %.250s (version %.250s) is to be installed.\n"
 msgstr ""
 
-#: main/depcon.c:362
+#: main/depcon.c:364
 #, c-format
 msgid "  %.250s (version %.250s) is %s.\n"
 msgstr ""
 
 #. conflicts and provides the same
-#: main/depcon.c:387
+#: main/depcon.c:389
 #, c-format
 msgid "  %.250s provides %.250s and is to be installed.\n"
 msgstr ""
 
-#: main/depcon.c:418
+#: main/depcon.c:420
 #, c-format
 msgid "  %.250s provides %.250s and is %s.\n"
 msgstr ""
@@ -1642,145 +1646,130 @@ msgid ""
 " "
 msgstr ""
 
-#: main/filesdb.c:120
+#: main/filesdb.c:123
 #, c-format
 msgid "unable to open files list file for package `%.250s'"
 msgstr ""
 
-#: main/filesdb.c:125
+#: main/filesdb.c:128
 #, c-format
 msgid ""
 "dpkg: serious warning: files list file for package `%.250s' missing, "
 "assuming package has no files currently installed.\n"
 msgstr ""
 
-#: main/filesdb.c:136
-#, c-format
-msgid "unable to set buffering on `%.250s'"
-msgstr ""
-
-#: main/filesdb.c:146
-#, c-format
-msgid "fgets gave an empty null-terminated string from `%.250s'"
-msgstr ""
-
-#: main/filesdb.c:164
+#: main/filesdb.c:167
 #, c-format
 msgid "files list file for package `%.250s' contains empty filename"
 msgstr ""
 
-#: main/filesdb.c:172
-#, c-format
-msgid "error reading files list file for package `%.250s'"
-msgstr ""
-
-#: main/filesdb.c:175
+#: main/filesdb.c:178
 #, c-format
 msgid "error closing files list file for package `%.250s'"
 msgstr ""
 
-#: main/filesdb.c:177
+#: main/filesdb.c:180
 #, c-format
 msgid "files list file for package `%.250s' is truncated"
 msgstr ""
 
-#: main/filesdb.c:208
+#: main/filesdb.c:211
 msgid "(Reading database ... "
 msgstr ""
 
-#: main/filesdb.c:208
+#: main/filesdb.c:211
 msgid "(Scanning database ... "
 msgstr ""
 
-#: main/filesdb.c:216
+#: main/filesdb.c:219
 #, c-format
 msgid "%d files and directories currently installed.)\n"
 msgstr ""
 
-#: main/filesdb.c:247
+#: main/filesdb.c:250
 #, c-format
 msgid "unable to create updated files list file for package %s"
 msgstr ""
 
-#: main/filesdb.c:257
+#: main/filesdb.c:260
 #, c-format
 msgid "failed to write to updated files list file for package %s"
 msgstr ""
 
-#: main/filesdb.c:259
+#: main/filesdb.c:262
 #, c-format
 msgid "failed to flush updated files list file for package %s"
 msgstr ""
 
-#: main/filesdb.c:261
+#: main/filesdb.c:264
 #, c-format
 msgid "failed to sync updated files list file for package %s"
 msgstr ""
 
-#: main/filesdb.c:264
+#: main/filesdb.c:267
 #, c-format
 msgid "failed to close updated files list file for package %s"
 msgstr ""
 
-#: main/filesdb.c:266
+#: main/filesdb.c:269
 #, c-format
 msgid "failed to install updated files list file for package %s"
 msgstr ""
 
-#: main/filesdb.c:330
+#: main/filesdb.c:333
 msgid "failed to open diversions file"
 msgstr ""
 
-#: main/filesdb.c:334
+#: main/filesdb.c:337
 msgid "failed to fstat previous diversions file"
 msgstr ""
 
-#: main/filesdb.c:336
+#: main/filesdb.c:339
 msgid "failed to fstat diversions file"
 msgstr ""
 
-#: main/filesdb.c:356
+#: main/filesdb.c:359
 msgid "fgets gave an empty string from diversions [i]"
 msgstr ""
 
-#: main/filesdb.c:357
+#: main/filesdb.c:360
 msgid "diversions file has too-long line or EOF [i]"
 msgstr ""
 
-#: main/filesdb.c:363
+#: main/filesdb.c:366
 msgid "read error in diversions [ii]"
 msgstr ""
 
-#: main/filesdb.c:364
+#: main/filesdb.c:367
 msgid "unexpected EOF in diversions [ii]"
 msgstr ""
 
-#: main/filesdb.c:367
+#: main/filesdb.c:370
 msgid "fgets gave an empty string from diversions [ii]"
 msgstr ""
 
-#: main/filesdb.c:368 main/filesdb.c:379
+#: main/filesdb.c:371 main/filesdb.c:382
 msgid "diversions file has too-long line or EOF [ii]"
 msgstr ""
 
-#: main/filesdb.c:374
+#: main/filesdb.c:377
 msgid "read error in diversions [iii]"
 msgstr ""
 
-#: main/filesdb.c:375
+#: main/filesdb.c:378
 msgid "unexpected EOF in diversions [iii]"
 msgstr ""
 
-#: main/filesdb.c:378
+#: main/filesdb.c:381
 msgid "fgets gave an empty string from diversions [iii]"
 msgstr ""
 
-#: main/filesdb.c:386
+#: main/filesdb.c:389
 #, c-format
 msgid "conflicting diversions involving `%.250s' or `%.250s'"
 msgstr ""
 
-#: main/filesdb.c:395
+#: main/filesdb.c:398
 msgid "read error in diversions [i]"
 msgstr ""
 
@@ -1967,7 +1956,7 @@ msgid ""
 "below\n"
 "  dpkg --help | --version                  show this help / version number\n"
 "  dpkg --force-help | -Dh|--debug=help     help on forcing resp. debugging\n"
-"  dpkg --licence                           print copyright licencing terms\n"
+"  dpkg --licence                           print copyright licensing terms\n"
 "\n"
 "Use dpkg -b|--build|-c|--contents|-e|--control|-I|--info|-f|--field|\n"
 " -x|--extract|-X|--vextract|--fsys-tarfile  on archives (type %s --help.)\n"
@@ -2213,142 +2202,142 @@ msgstr ""
 msgid "package architecture (%s) does not match system (%s)"
 msgstr ""
 
-#: main/processarc.c:236
+#: main/processarc.c:240
 #, c-format
 msgid ""
 "dpkg: regarding %s containing %s, pre-dependency problem:\n"
 "%s"
 msgstr ""
 
-#: main/processarc.c:239
+#: main/processarc.c:243
 #, c-format
 msgid "pre-dependency problem - not installing %.250s"
 msgstr ""
 
-#: main/processarc.c:240
+#: main/processarc.c:244
 msgid "dpkg: warning - ignoring pre-dependency problem !\n"
 msgstr ""
 
-#: main/processarc.c:254
+#: main/processarc.c:258
 #, c-format
 msgid "Preparing to replace %s %s (using %s) ...\n"
 msgstr ""
 
-#: main/processarc.c:259
+#: main/processarc.c:263
 #, c-format
 msgid "Unpacking %s (from %s) ...\n"
 msgstr ""
 
-#: main/processarc.c:279
+#: main/processarc.c:283
 #, c-format
 msgid "name of conffile (starting `%.250s') is too long (>%d characters)"
 msgstr ""
 
-#: main/processarc.c:333
+#: main/processarc.c:337
 #, c-format
 msgid "read error in %.250s"
 msgstr ""
 
 #. conff= fopen()
-#: main/processarc.c:335
+#: main/processarc.c:339
 #, c-format
 msgid "error closing %.250s"
 msgstr ""
 
-#: main/processarc.c:337
+#: main/processarc.c:341
 #, c-format
 msgid "error trying to open %.250s"
 msgstr ""
 
-#: main/processarc.c:370
+#: main/processarc.c:374
 #, c-format
 msgid "De-configuring %s, so that we can remove %s ...\n"
 msgstr ""
 
-#: main/processarc.c:427
+#: main/processarc.c:431
 #, c-format
 msgid "Unpacking replacement %.250s ...\n"
 msgstr ""
 
-#: main/processarc.c:506
+#: main/processarc.c:510
 msgid "unable to exec dpkg-deb to get filesystem archive"
 msgstr ""
 
-#: main/processarc.c:514
+#: main/processarc.c:518
 msgid "unable to fdopen dpkg-deb extract pipe"
 msgstr ""
 
-#: main/processarc.c:520
+#: main/processarc.c:524
 msgid "error reading dpkg-deb tar output"
 msgstr ""
 
-#: main/processarc.c:523
+#: main/processarc.c:527
 msgid "unexpected EOF in filesystem tarfile - corrupted package archive"
 msgstr ""
 
-#: main/processarc.c:525
+#: main/processarc.c:529
 msgid "corrupted filesystem tarfile - corrupted package archive"
 msgstr ""
 
-#: main/processarc.c:621
+#: main/processarc.c:625
 #, c-format
 msgid "dpkg: warning - unable to delete old file `%.250s': %s\n"
 msgstr ""
 
-#: main/processarc.c:643 main/processarc.c:880 main/remove.c:396
+#: main/processarc.c:647 main/processarc.c:884 main/remove.c:396
 msgid "cannot read info directory"
 msgstr ""
 
-#: main/processarc.c:656
+#: main/processarc.c:660
 #, c-format
 msgid "old version of package has overly-long info file name starting `%.250s'"
 msgstr ""
 
-#: main/processarc.c:668
+#: main/processarc.c:672
 #, c-format
 msgid "unable to remove obsolete info file `%.250s'"
 msgstr ""
 
-#: main/processarc.c:671
+#: main/processarc.c:675
 #, c-format
 msgid "unable to install (supposed) new info file `%.250s'"
 msgstr ""
 
-#: main/processarc.c:678
+#: main/processarc.c:682
 msgid "unable to open temp control directory"
 msgstr ""
 
-#: main/processarc.c:687
+#: main/processarc.c:691
 #, c-format
 msgid "package contains overly-long control info file name (starting `%.50s')"
 msgstr ""
 
-#: main/processarc.c:692
+#: main/processarc.c:696
 #, c-format
 msgid "package control info contained directory `%.250s'"
 msgstr ""
 
-#: main/processarc.c:694
+#: main/processarc.c:698
 #, c-format
 msgid "package control info rmdir of `%.250s' didn't say not a dir"
 msgstr ""
 
-#: main/processarc.c:700
+#: main/processarc.c:704
 #, c-format
 msgid "dpkg: warning - package %s contained list as info file"
 msgstr ""
 
-#: main/processarc.c:707
+#: main/processarc.c:711
 #, c-format
 msgid "unable to install new info file `%.250s' as `%.250s'"
 msgstr ""
 
-#: main/processarc.c:860
+#: main/processarc.c:864
 #, c-format
 msgid "(Noting disappearance of %s, which has been completely replaced.)\n"
 msgstr ""
 
-#: main/processarc.c:896
+#: main/processarc.c:900
 #, c-format
 msgid "unable to delete disappearing control info file `%.250s'"
 msgstr ""
@@ -3017,7 +3006,7 @@ msgstr ""
 msgid "--contents takes exactly one argument"
 msgstr ""
 
-#: dpkg-deb/main.c:44 dselect/main.cc:78
+#: dpkg-deb/main.c:44
 msgid "Debian Linux `"
 msgstr ""
 
@@ -3395,17 +3384,17 @@ msgstr ""
 msgid "unable to exec mksplit"
 msgstr ""
 
-#: md5sum/md5sum.c:106
+#: utils/md5sum.c:106
 #, c-format
 msgid "%s: read error on stdin\n"
 msgstr ""
 
-#: md5sum/md5sum.c:124 md5sum/md5sum.c:250
+#: utils/md5sum.c:124 utils/md5sum.c:250
 #, c-format
 msgid "%s: error reading %s\n"
 msgstr ""
 
-#: md5sum/md5sum.c:138
+#: utils/md5sum.c:138
 msgid ""
 "usage: md5sum [-bv] [-c [file]] | [file...]\n"
 "Generates or checks MD5 Message Digests\n"
@@ -3416,63 +3405,63 @@ msgid ""
 "that is printed on stdout by this program when it generates digests.\n"
 msgstr ""
 
-#: md5sum/md5sum.c:211
+#: utils/md5sum.c:211
 #, c-format
 msgid "%s: unrecognized line: %s"
 msgstr ""
 
-#: md5sum/md5sum.c:245
+#: utils/md5sum.c:245
 #, c-format
 msgid "%s: can't open %s\n"
 msgstr ""
 
-#: md5sum/md5sum.c:258
+#: utils/md5sum.c:258
 msgid "FAILED\n"
 msgstr ""
 
-#: md5sum/md5sum.c:260
+#: utils/md5sum.c:260
 #, c-format
 msgid "%s: MD5 check failed for '%s'\n"
 msgstr ""
 
-#: md5sum/md5sum.c:263
+#: utils/md5sum.c:263
 msgid "OK\n"
 msgstr ""
 
-#: md5sum/md5sum.c:267
+#: utils/md5sum.c:267
 #, c-format
 msgid "%s: %d of %d file(s) failed MD5 check\n"
 msgstr ""
 
-#: md5sum/md5sum.c:269
+#: utils/md5sum.c:269
 #, c-format
 msgid "%s: no files checked\n"
 msgstr ""
 
-#: dselect/basecmds.cc:99
+#: dselect/basecmds.cc:101
 msgid "Search for ? "
 msgstr ""
 
-#: dselect/basecmds.cc:126
+#: dselect/basecmds.cc:132
 msgid "Help: "
 msgstr ""
 
-#: dselect/basecmds.cc:132
+#: dselect/basecmds.cc:138
 msgid ""
 "? = help menu    Space = exit help    . = next help    or a help page key "
 msgstr ""
 
-#: dselect/basecmds.cc:140
+#: dselect/basecmds.cc:146
 msgid "Help information is available under the following topics:"
 msgstr ""
 
-#: dselect/basecmds.cc:148
+#: dselect/basecmds.cc:154
 msgid ""
 "Press a key from the list above, Space to exit help,\n"
 "  or `.' (full stop) to read each help page in turn. "
 msgstr ""
 
-#: dselect/basecmds.cc:154
+#: dselect/basecmds.cc:160
 msgid "error reading keyboard in help"
 msgstr ""
 
@@ -3710,7 +3699,7 @@ msgid "Quit without changing selected access method"
 msgstr ""
 
 #: dselect/main.cc:51
-msgid "Type "
+msgid "Type dselect --help for help."
 msgstr ""
 
 #: dselect/main.cc:66
@@ -3773,11 +3762,21 @@ msgstr ""
 msgid "menu"
 msgstr ""
 
+#: dselect/main.cc:78
+#, c-format
+msgid "Debian Linux `%s' package handling frontend."
+msgstr ""
+
 #: dselect/main.cc:81
-msgid "Version "
+#, c-format
+msgid ""
+"Version %s.  Copyright (C) 1994-1996 Ian Jackson.   This is\n"
+"free software; see the GNU General Public Licence version 2 or later for\n"
+"copying conditions.  There is NO warranty.  See dselect --licence for "
+"details.\n"
 msgstr ""
 
-#: dselect/main.cc:91
+#: dselect/main.cc:93
 msgid ""
 "Usage: dselect [options]\n"
 "       dselect [options] action ...\n"
@@ -3786,30 +3785,30 @@ msgid ""
 "Actions:  access update select install config remove quit menu\n"
 msgstr ""
 
-#: dselect/main.cc:137
+#: dselect/main.cc:139
 #, c-format
 msgid "couldn't open debug file `%.255s'\n"
 msgstr ""
 
-#: dselect/main.cc:163
+#: dselect/main.cc:165
 msgid "Terminal does not appear to support cursor addressing.\n"
 msgstr ""
 
-#: dselect/main.cc:165
+#: dselect/main.cc:167
 msgid "Terminal does not appear to support highlighting.\n"
 msgstr ""
 
-#: dselect/main.cc:166
+#: dselect/main.cc:168
 msgid ""
 "Set your TERM variable correctly, use a better terminal,\n"
 "or make do with the per-package management tool "
 msgstr ""
 
-#: dselect/main.cc:168
+#: dselect/main.cc:170
 msgid "terminal lacks necessary features, giving up"
 msgstr ""
 
-#: dselect/main.cc:242
+#: dselect/main.cc:244
 msgid ""
 "\n"
 "\n"
@@ -3818,11 +3817,11 @@ msgid ""
 "\n"
 msgstr ""
 
-#: dselect/main.cc:260
+#: dselect/main.cc:262
 msgid "failed to getch in main menu"
 msgstr ""
 
-#: dselect/main.cc:331
+#: dselect/main.cc:333
 #, c-format
 msgid "unknown action string `%.50s'"
 msgstr ""
@@ -3860,7 +3859,7 @@ msgstr ""
 msgid "getch failed"
 msgstr ""
 
-#: dselect/methlist.cc:165 dselect/pkgdepcon.cc:243
+#: dselect/methlist.cc:165 dselect/pkgdepcon.cc:239 dselect/pkgdepcon.cc:278
 msgid "[none]"
 msgstr ""
 
@@ -4202,179 +4201,183 @@ msgstr ""
 msgid "replaces"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:77
-msgid "Req"
+#: dselect/pkgdisplay.cc:75
+msgid "enhances"
 msgstr ""
 
 #: dselect/pkgdisplay.cc:78
-msgid "Imp"
+msgid "Req"
 msgstr ""
 
 #: dselect/pkgdisplay.cc:79
-msgid "Std"
+msgid "Imp"
 msgstr ""
 
 #: dselect/pkgdisplay.cc:80
-msgid "Rec"
+msgid "Std"
 msgstr ""
 
 #: dselect/pkgdisplay.cc:81
-msgid "Opt"
+msgid "Rec"
 msgstr ""
 
 #: dselect/pkgdisplay.cc:82
-msgid "Xtr"
+msgid "Opt"
 msgstr ""
 
 #: dselect/pkgdisplay.cc:83
-msgid "Ctb"
+msgid "Xtr"
 msgstr ""
 
 #: dselect/pkgdisplay.cc:84
-msgid "bUG"
+msgid "Ctb"
 msgstr ""
 
 #: dselect/pkgdisplay.cc:85
+msgid "bUG"
+msgstr ""
+
+#: dselect/pkgdisplay.cc:86
 msgid "?"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:93 dselect/pkgdisplay.cc:113
+#: dselect/pkgdisplay.cc:94 dselect/pkgdisplay.cc:114
 msgid "Broken"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:94
+#: dselect/pkgdisplay.cc:95
 msgid "New"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:95
+#: dselect/pkgdisplay.cc:96
 msgid "Updated"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:96
+#: dselect/pkgdisplay.cc:97
 msgid "Obsolete/local"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:97
+#: dselect/pkgdisplay.cc:98
 msgid "Up-to-date"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:98
+#: dselect/pkgdisplay.cc:99
 msgid "Available"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:99 dselect/pkgdisplay.cc:115
+#: dselect/pkgdisplay.cc:100 dselect/pkgdisplay.cc:116
 msgid "Removed"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:100 dselect/pkgdisplay.cc:109
+#: dselect/pkgdisplay.cc:101 dselect/pkgdisplay.cc:110
 msgid "Brokenly installed packages"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:101
+#: dselect/pkgdisplay.cc:102
 msgid "Newly available packages"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:102
+#: dselect/pkgdisplay.cc:103
 msgid "Updated packages (newer version is available)"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:103
+#: dselect/pkgdisplay.cc:104
 msgid "Obsolete and local packages present on system"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:104
+#: dselect/pkgdisplay.cc:105
 msgid "Up to date installed packages"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:105
+#: dselect/pkgdisplay.cc:106
 msgid "Available packages (not currently installed)"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:106
+#: dselect/pkgdisplay.cc:107
 msgid "Removed and no longer available packages"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:110
+#: dselect/pkgdisplay.cc:111
 msgid "Installed packages"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:111
+#: dselect/pkgdisplay.cc:112
 msgid "Removed packages (configuration still present)"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:112
+#: dselect/pkgdisplay.cc:113
 msgid "Purged packages and those never installed"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:114
+#: dselect/pkgdisplay.cc:115
 msgid "Installed"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:116
+#: dselect/pkgdisplay.cc:117
 msgid "Purged"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:194
+#: dselect/pkgdisplay.cc:195
 msgid "dselect - recursive package listing"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:195
+#: dselect/pkgdisplay.cc:196
 msgid "dselect - inspection of package states"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:196
+#: dselect/pkgdisplay.cc:197
 msgid "dselect - main package listing"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:204
+#: dselect/pkgdisplay.cc:205
 msgid " (by section)"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:207
+#: dselect/pkgdisplay.cc:208
 msgid " (avail., section)"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:210
+#: dselect/pkgdisplay.cc:211
 msgid " (status, section)"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:219
+#: dselect/pkgdisplay.cc:220
 msgid " (by priority)"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:222
+#: dselect/pkgdisplay.cc:223
 msgid " (avail., priority)"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:225
+#: dselect/pkgdisplay.cc:226
 msgid " (status, priority)"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:234 dselect/pkgdisplay.cc:246
+#: dselect/pkgdisplay.cc:235 dselect/pkgdisplay.cc:247
 msgid " (alphabetically)"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:237
+#: dselect/pkgdisplay.cc:238
 msgid " (by availability)"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:240
+#: dselect/pkgdisplay.cc:241
 msgid " (by status)"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:254
+#: dselect/pkgdisplay.cc:255
 msgid " mark:+/=/- terse:v help:?"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:255
+#: dselect/pkgdisplay.cc:256
 msgid " mark:+/=/- verbose:v help:?"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:256
+#: dselect/pkgdisplay.cc:257
 msgid " terse:v help:?"
 msgstr ""
 
-#: dselect/pkgdisplay.cc:257
+#: dselect/pkgdisplay.cc:258
 msgid " verbose:v help:?"
 msgstr ""