Просмотр исходного кода

- add libbz2-dev as new build-dependency
- remove the libz-dev alternative from zlib1g-dev build-dependency
- do the same for bz2 builtin if available
* apt-pkg/contrib/fileutl.cc:
- use libz2 library for (de)compression instead of the bzip2 binary as
the first is a dependency of dpkg and the later just priority:optional
so we gain 'easier' access to bz2-compressed Translation files this way

David Kalnischkies лет назад: 14
Родитель
Сommit
c4997486bf
8 измененных файлов с 137 добавлено и 15 удалено
  1. 5 1
      apt-pkg/aptconfiguration.cc
  2. 98 9
      apt-pkg/contrib/fileutl.cc
  3. 7 1
      apt-pkg/makefile
  4. 3 0
      buildlib/config.h.in
  5. 2 1
      buildlib/environment.mak.in
  6. 13 1
      configure.in
  7. 8 1
      debian/changelog
  8. 1 1
      debian/control

+ 5 - 1
apt-pkg/aptconfiguration.cc

@@ -479,10 +479,14 @@ const Configuration::getCompressors(bool const Cached) {
 		compressors.push_back(Compressor("gzip",".gz","gzip","-9n","-d",2));
 		compressors.push_back(Compressor("gzip",".gz","gzip","-9n","-d",2));
 #ifdef HAVE_ZLIB
 #ifdef HAVE_ZLIB
 	else
 	else
-		compressors.push_back(Compressor("gzip",".gz","/bin/false", "", "", 2));
+		compressors.push_back(Compressor("gzip",".gz","false", "", "", 2));
 #endif
 #endif
 	if (_config->Exists("Dir::Bin::bzip2") == false || FileExists(_config->FindFile("Dir::Bin::bzip2")) == true)
 	if (_config->Exists("Dir::Bin::bzip2") == false || FileExists(_config->FindFile("Dir::Bin::bzip2")) == true)
 		compressors.push_back(Compressor("bzip2",".bz2","bzip2","-9","-d",3));
 		compressors.push_back(Compressor("bzip2",".bz2","bzip2","-9","-d",3));
+#ifdef HAVE_BZ2
+	else
+		compressors.push_back(Compressor("bzip2",".bz2","false", "", "", 3));
+#endif
 	if (_config->Exists("Dir::Bin::xz") == false || FileExists(_config->FindFile("Dir::Bin::xz")) == true)
 	if (_config->Exists("Dir::Bin::xz") == false || FileExists(_config->FindFile("Dir::Bin::xz")) == true)
 		compressors.push_back(Compressor("xz",".xz","xz","-6","-d",4));
 		compressors.push_back(Compressor("xz",".xz","xz","-6","-d",4));
 	if (_config->Exists("Dir::Bin::lzma") == false || FileExists(_config->FindFile("Dir::Bin::lzma")) == true)
 	if (_config->Exists("Dir::Bin::lzma") == false || FileExists(_config->FindFile("Dir::Bin::lzma")) == true)

+ 98 - 9
apt-pkg/contrib/fileutl.cc

@@ -47,6 +47,9 @@
 #ifdef HAVE_ZLIB
 #ifdef HAVE_ZLIB
 	#include <zlib.h>
 	#include <zlib.h>
 #endif
 #endif
+#ifdef HAVE_BZ2
+	#include <bzlib.h>
+#endif
 
 
 #ifdef WORDS_BIGENDIAN
 #ifdef WORDS_BIGENDIAN
 #include <inttypes.h>
 #include <inttypes.h>
@@ -63,6 +66,11 @@ class FileFdPrivate {
 	gzFile gz;
 	gzFile gz;
 #else
 #else
 	void* gz;
 	void* gz;
+#endif
+#ifdef HAVE_BZ2
+	BZFILE* bz2;
+#else
+	void* bz2;
 #endif
 #endif
 	int compressed_fd;
 	int compressed_fd;
 	pid_t compressor_pid;
 	pid_t compressor_pid;
@@ -70,7 +78,8 @@ class FileFdPrivate {
 	APT::Configuration::Compressor compressor;
 	APT::Configuration::Compressor compressor;
 	unsigned int openmode;
 	unsigned int openmode;
 	unsigned long long seekpos;
 	unsigned long long seekpos;
-	FileFdPrivate() : gz(NULL), compressed_fd(-1), compressor_pid(-1), pipe(false),
+	FileFdPrivate() : gz(NULL), bz2(NULL),
+			  compressed_fd(-1), compressor_pid(-1), pipe(false),
 			  openmode(0), seekpos(0) {};
 			  openmode(0), seekpos(0) {};
 };
 };
 
 
@@ -1017,13 +1026,29 @@ bool FileFd::OpenInternDescriptor(unsigned int const Mode, APT::Configuration::C
       else if ((Mode & WriteOnly) == WriteOnly)
       else if ((Mode & WriteOnly) == WriteOnly)
 	 d->gz = gzdopen(iFd, "w");
 	 d->gz = gzdopen(iFd, "w");
       else
       else
-	 d->gz = gzdopen (iFd, "r");
+	 d->gz = gzdopen(iFd, "r");
       if (d->gz == NULL)
       if (d->gz == NULL)
 	 return false;
 	 return false;
       Flags |= Compressed;
       Flags |= Compressed;
       return true;
       return true;
    }
    }
 #endif
 #endif
+#ifdef HAVE_BZ2
+   else if (compressor.Name == "bzip2")
+   {
+      if ((Mode & ReadWrite) == ReadWrite)
+	 d->bz2 = BZ2_bzdopen(iFd, "r+");
+      else if ((Mode & WriteOnly) == WriteOnly)
+	 d->bz2 = BZ2_bzdopen(iFd, "w");
+      else
+	 d->bz2 = BZ2_bzdopen(iFd, "r");
+      if (d->bz2 == NULL)
+	 return false;
+      Flags |= Compressed;
+      return true;
+   }
+#endif
+
 
 
    if ((Mode & ReadWrite) == ReadWrite)
    if ((Mode & ReadWrite) == ReadWrite)
       return _error->Error("ReadWrite mode is not supported for file %s", FileName.c_str());
       return _error->Error("ReadWrite mode is not supported for file %s", FileName.c_str());
@@ -1132,7 +1157,12 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual)
    {
    {
 #ifdef HAVE_ZLIB
 #ifdef HAVE_ZLIB
       if (d->gz != NULL)
       if (d->gz != NULL)
-         Res = gzread(d->gz,To,Size);
+	 Res = gzread(d->gz,To,Size);
+      else
+#endif
+#ifdef HAVE_BZ2
+      if (d->bz2 != NULL)
+	 Res = BZ2_bzread(d->bz2,To,Size);
       else
       else
 #endif
 #endif
          Res = read(iFd,To,Size);
          Res = read(iFd,To,Size);
@@ -1150,6 +1180,15 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual)
 	    if (err != Z_ERRNO)
 	    if (err != Z_ERRNO)
 	       return _error->Error("gzread: %s (%d: %s)", _("Read error"), err, errmsg);
 	       return _error->Error("gzread: %s (%d: %s)", _("Read error"), err, errmsg);
 	 }
 	 }
+#endif
+#ifdef HAVE_BZ2
+	 if (d->bz2 != NULL)
+	 {
+	    int err;
+	    char const * const errmsg = BZ2_bzerror(d->bz2, &err);
+	    if (err != BZ_IO_ERROR)
+	       return _error->Error("BZ2_bzread: %s (%d: %s)", _("Read error"), err, errmsg);
+	 }
 #endif
 #endif
 	 return _error->Errno("read",_("Read error"));
 	 return _error->Errno("read",_("Read error"));
       }
       }
@@ -1218,6 +1257,11 @@ bool FileFd::Write(const void *From,unsigned long long Size)
       if (d->gz != NULL)
       if (d->gz != NULL)
          Res = gzwrite(d->gz,From,Size);
          Res = gzwrite(d->gz,From,Size);
       else
       else
+#endif
+#ifdef HAVE_BZ2
+      if (d->bz2 != NULL)
+         Res = BZ2_bzwrite(d->bz2,(void*)From,Size);
+      else
 #endif
 #endif
          Res = write(iFd,From,Size);
          Res = write(iFd,From,Size);
       if (Res < 0 && errno == EINTR)
       if (Res < 0 && errno == EINTR)
@@ -1225,6 +1269,24 @@ bool FileFd::Write(const void *From,unsigned long long Size)
       if (Res < 0)
       if (Res < 0)
       {
       {
 	 Flags |= Fail;
 	 Flags |= Fail;
+#ifdef HAVE_ZLIB
+	 if (d->gz != NULL)
+	 {
+	    int err;
+	    char const * const errmsg = gzerror(d->gz, &err);
+	    if (err != Z_ERRNO)
+	       return _error->Error("gzwrite: %s (%d: %s)", _("Write error"), err, errmsg);
+	 }
+#endif
+#ifdef HAVE_BZ2
+	 if (d->bz2 != NULL)
+	 {
+	    int err;
+	    char const * const errmsg = BZ2_bzerror(d->bz2, &err);
+	    if (err != BZ_IO_ERROR)
+	       return _error->Error("BZ2_bzwrite: %s (%d: %s)", _("Write error"), err, errmsg);
+	 }
+#endif
 	 return _error->Errno("write",_("Write error"));
 	 return _error->Errno("write",_("Write error"));
       }
       }
       
       
@@ -1246,7 +1308,11 @@ bool FileFd::Write(const void *From,unsigned long long Size)
 /* */
 /* */
 bool FileFd::Seek(unsigned long long To)
 bool FileFd::Seek(unsigned long long To)
 {
 {
-   if (d->pipe == true)
+   if (d->pipe == true
+#ifdef HAVE_BZ2
+	|| d->bz2 != NULL
+#endif
+	)
    {
    {
       // Our poor man seeking in pipes is costly, so try to avoid it
       // Our poor man seeking in pipes is costly, so try to avoid it
       unsigned long long seekpos = Tell();
       unsigned long long seekpos = Tell();
@@ -1257,6 +1323,10 @@ bool FileFd::Seek(unsigned long long To)
 
 
       if ((d->openmode & ReadOnly) != ReadOnly)
       if ((d->openmode & ReadOnly) != ReadOnly)
 	 return _error->Error("Reopen is only implemented for read-only files!");
 	 return _error->Error("Reopen is only implemented for read-only files!");
+#ifdef HAVE_BZ2
+      if (d->bz2 != NULL)
+	 BZ2_bzclose(d->bz2);
+#endif
       close(iFd);
       close(iFd);
       iFd = 0;
       iFd = 0;
       if (TemporaryFileName.empty() == false)
       if (TemporaryFileName.empty() == false)
@@ -1303,7 +1373,11 @@ bool FileFd::Seek(unsigned long long To)
 /* */
 /* */
 bool FileFd::Skip(unsigned long long Over)
 bool FileFd::Skip(unsigned long long Over)
 {
 {
-   if (d->pipe == true)
+   if (d->pipe == true
+#ifdef HAVE_BZ2
+	|| d->bz2 != NULL
+#endif
+	)
    {
    {
       d->seekpos += Over;
       d->seekpos += Over;
       char buffer[1024];
       char buffer[1024];
@@ -1339,11 +1413,13 @@ bool FileFd::Skip(unsigned long long Over)
 /* */
 /* */
 bool FileFd::Truncate(unsigned long long To)
 bool FileFd::Truncate(unsigned long long To)
 {
 {
-   if (d->gz != NULL)
+#if defined HAVE_ZLIB || defined HAVE_BZ2
+   if (d->gz != NULL || d->bz2 != NULL)
    {
    {
       Flags |= Fail;
       Flags |= Fail;
-      return _error->Error("Truncating gzipped files is not implemented (%s)", FileName.c_str());
+      return _error->Error("Truncating compressed files is not implemented (%s)", FileName.c_str());
    }
    }
+#endif
    if (ftruncate(iFd,To) != 0)
    if (ftruncate(iFd,To) != 0)
    {
    {
       Flags |= Fail;
       Flags |= Fail;
@@ -1362,7 +1438,11 @@ unsigned long long FileFd::Tell()
    // seeking around, but not all users of FileFd use always Seek() and co
    // seeking around, but not all users of FileFd use always Seek() and co
    // so d->seekpos isn't always true and we can just use it as a hint if
    // so d->seekpos isn't always true and we can just use it as a hint if
    // we have nothing else, but not always as an authority…
    // we have nothing else, but not always as an authority…
-   if (d->pipe == true)
+   if (d->pipe == true
+#ifdef HAVE_BZ2
+	|| d->bz2 != NULL
+#endif
+	)
       return d->seekpos;
       return d->seekpos;
 
 
    off_t Res;
    off_t Res;
@@ -1409,7 +1489,11 @@ unsigned long long FileFd::Size()
 
 
    // for compressor pipes st_size is undefined and at 'best' zero,
    // for compressor pipes st_size is undefined and at 'best' zero,
    // so we 'read' the content and 'seek' back - see there
    // so we 'read' the content and 'seek' back - see there
-   if (d->pipe == true)
+   if (d->pipe == true
+#ifdef HAVE_BZ2
+	|| (d->bz2 && size > 0)
+#endif
+	)
    {
    {
       unsigned long long const oldSeek = Tell();
       unsigned long long const oldSeek = Tell();
       char ignore[1000];
       char ignore[1000];
@@ -1500,6 +1584,11 @@ bool FileFd::Close()
 	 if (e != 0 && e != Z_BUF_ERROR)
 	 if (e != 0 && e != Z_BUF_ERROR)
 	    Res &= _error->Errno("close",_("Problem closing the gzip file %s"), FileName.c_str());
 	    Res &= _error->Errno("close",_("Problem closing the gzip file %s"), FileName.c_str());
       } else
       } else
+#endif
+#ifdef HAVE_BZ2
+      if (d != NULL && d->bz2 != NULL)
+	 BZ2_bzclose(d->bz2);
+      else
 #endif
 #endif
 	 if (iFd > 0 && close(iFd) != 0)
 	 if (iFd > 0 && close(iFd) != 0)
 	    Res &= _error->Errno("close",_("Problem closing the file %s"), FileName.c_str());
 	    Res &= _error->Errno("close",_("Problem closing the file %s"), FileName.c_str());

+ 7 - 1
apt-pkg/makefile

@@ -14,7 +14,13 @@ include ../buildlib/libversion.mak
 LIBRARY=apt-pkg
 LIBRARY=apt-pkg
 MAJOR=$(LIBAPTPKG_MAJOR)
 MAJOR=$(LIBAPTPKG_MAJOR)
 MINOR=$(LIBAPTPKG_RELEASE)
 MINOR=$(LIBAPTPKG_RELEASE)
-SLIBS=$(PTHREADLIB) $(INTLLIBS) -lutil -ldl -lz
+SLIBS=$(PTHREADLIB) $(INTLLIBS) -lutil -ldl
+ifeq ($(HAVE_ZLIB),yes)
+SLIBS+= -lz
+endif
+ifeq ($(HAVE_BZ2),yes)
+SLIBS+= -lbz2
+endif
 APT_DOMAIN:=libapt-pkg$(LIBAPTPKG_MAJOR)
 APT_DOMAIN:=libapt-pkg$(LIBAPTPKG_MAJOR)
 
 
 # Source code for the contributed non-core things
 # Source code for the contributed non-core things

+ 3 - 0
buildlib/config.h.in

@@ -22,6 +22,9 @@
 /* Define if we have the zlib library for gzip */
 /* Define if we have the zlib library for gzip */
 #undef HAVE_ZLIB
 #undef HAVE_ZLIB
 
 
+/* Define if we have the bz2 library for bzip2 */
+#undef HAVE_BZ2
+
 /* These two are used by the statvfs shim for glibc2.0 and bsd */
 /* These two are used by the statvfs shim for glibc2.0 and bsd */
 /* Define if we have sys/vfs.h */
 /* Define if we have sys/vfs.h */
 #undef HAVE_VFS_H
 #undef HAVE_VFS_H

+ 2 - 1
buildlib/environment.mak.in

@@ -55,7 +55,8 @@ INTLLIBS = @INTLLIBS@
 # Shim Headerfile control
 # Shim Headerfile control
 HAVE_C9X = @HAVE_C9X@
 HAVE_C9X = @HAVE_C9X@
 HAVE_STATVFS = @HAVE_STATVFS@
 HAVE_STATVFS = @HAVE_STATVFS@
-HAVE_TIMEGM = @HAVE_TIMEGM@
+HAVE_ZLIB = @HAVE_ZLIB@
+HAVE_BZ2 = @HAVE_BZ2@
 NEED_SOCKLEN_T_DEFINE = @NEED_SOCKLEN_T_DEFINE@
 NEED_SOCKLEN_T_DEFINE = @NEED_SOCKLEN_T_DEFINE@
 
 
 # Shared library things
 # Shared library things

+ 13 - 1
configure.in

@@ -88,9 +88,21 @@ AC_CHECK_LIB(curl, curl_easy_init,
 
 
 AC_SUBST(BDBLIB)
 AC_SUBST(BDBLIB)
 
 
+HAVE_ZLIB=no
 AC_CHECK_LIB(z, gzopen,
 AC_CHECK_LIB(z, gzopen,
-	[AC_CHECK_HEADER(zlib.h, [AC_DEFINE(HAVE_ZLIB)], AC_MSG_ERROR([failed: zlib.h not found]))],
+	[AC_CHECK_HEADER(zlib.h, [HAVE_ZLIB=yes], AC_MSG_ERROR([failed: zlib.h not found]))],
 	AC_MSG_ERROR([failed: Need libz]))
 	AC_MSG_ERROR([failed: Need libz]))
+AC_SUBST(HAVE_ZLIB)
+if test "x$HAVE_ZLIB" = "xyes"; then
+	AC_DEFINE(HAVE_ZLIB)
+fi
+
+HAVE_BZ2=no
+AC_CHECK_LIB(bz2, BZ2_bzopen,[AC_CHECK_HEADER(bzlib.h, [HAVE_BZ2=yes], [])], [])
+AC_SUBST(HAVE_BZ2)
+if test "x$HAVE_BZ2" = "xyes"; then
+	AC_DEFINE(HAVE_BZ2)
+fi
 
 
 dnl Converts the ARCH to be something singular for this general CPU family
 dnl Converts the ARCH to be something singular for this general CPU family
 dnl This is often the dpkg architecture string.
 dnl This is often the dpkg architecture string.

+ 8 - 1
debian/changelog

@@ -49,6 +49,8 @@ apt (0.8.16~exp14) UNRELEASED; urgency=low
       this transparently now
       this transparently now
   * debian/control:
   * debian/control:
     - bump Standards-Version to 3.9.3 (no changes needed)
     - bump Standards-Version to 3.9.3 (no changes needed)
+    - add libbz2-dev as new build-dependency
+    - remove the libz-dev alternative from zlib1g-dev build-dependency
   * doc/apt-get.8.xml:
   * doc/apt-get.8.xml:
     - typofix: respect → respecting, thanks Mike Erickson! (Closes: #664833)
     - typofix: respect → respecting, thanks Mike Erickson! (Closes: #664833)
   * debian/rules:
   * debian/rules:
@@ -62,9 +64,14 @@ apt (0.8.16~exp14) UNRELEASED; urgency=low
   * apt-pkg/aptconfiguration.cc:
   * apt-pkg/aptconfiguration.cc:
     - if present, prefer xz binary over lzma
     - if present, prefer xz binary over lzma
     - if we have zlib builtin insert add a dummy gzip compressor for FileFD
     - if we have zlib builtin insert add a dummy gzip compressor for FileFD
+    - do the same for bz2 builtin if available
   * methods/bzip2.cc:
   * methods/bzip2.cc:
     - remove it as the functionality for all compressors can be
     - remove it as the functionality for all compressors can be
       provided by gzip.cc now with the usage of FileFD
       provided by gzip.cc now with the usage of FileFD
+  * apt-pkg/contrib/fileutl.cc:
+    - use libz2 library for (de)compression instead of the bzip2 binary as
+      the first is a dependency of dpkg and the later just priority:optional
+      so we gain 'easier' access to bz2-compressed Translation files this way
 
 
   [ Bogdan Purcareata ]
   [ Bogdan Purcareata ]
   * doc/apt-get.8.xml:
   * doc/apt-get.8.xml:
@@ -74,7 +81,7 @@ apt (0.8.16~exp14) UNRELEASED; urgency=low
       number of auto-removed packages both before and after the list
       number of auto-removed packages both before and after the list
       of packages (Closes: #665833)
       of packages (Closes: #665833)
 
 
- -- David Kalnischkies <kalnischkies@gmail.com>  Thu, 05 Apr 2012 19:00:43 +0200
+ -- David Kalnischkies <kalnischkies@gmail.com>  Thu, 05 Apr 2012 20:51:01 +0200
 
 
 apt (0.8.16~exp13) experimental; urgency=low
 apt (0.8.16~exp13) experimental; urgency=low
 
 

+ 1 - 1
debian/control

@@ -8,7 +8,7 @@ Uploaders: Michael Vogt <mvo@debian.org>, Otavio Salvador <otavio@debian.org>,
 Standards-Version: 3.9.3
 Standards-Version: 3.9.3
 Build-Depends: dpkg-dev (>= 1.15.8), debhelper (>= 8.1.3~), libdb-dev,
 Build-Depends: dpkg-dev (>= 1.15.8), debhelper (>= 8.1.3~), libdb-dev,
  gettext (>= 0.12), libcurl4-gnutls-dev (>= 7.19.0),
  gettext (>= 0.12), libcurl4-gnutls-dev (>= 7.19.0),
- zlib1g-dev | libz-dev, debiandoc-sgml, xsltproc, docbook-xsl, docbook-xml,
+ zlib1g-dev, libbz2-dev, debiandoc-sgml, xsltproc, docbook-xsl, docbook-xml,
  po4a (>= 0.34-2), autotools-dev, autoconf, automake, doxygen
  po4a (>= 0.34-2), autotools-dev, autoconf, automake, doxygen
 Build-Conflicts: autoconf2.13, automake1.4
 Build-Conflicts: autoconf2.13, automake1.4
 Vcs-Bzr: http://bzr.debian.org/apt/debian-sid/
 Vcs-Bzr: http://bzr.debian.org/apt/debian-sid/