diff options
author | Diego Elio Pettenò <flameeyes@gentoo.org> | 2009-05-14 22:12:41 +0000 |
---|---|---|
committer | Diego Elio Pettenò <flameeyes@gentoo.org> | 2009-05-14 22:12:41 +0000 |
commit | 0cbf1836cc69e219a657c98e14fc59cc29cc87dd (patch) | |
tree | e36611b7174a8992d787f929d18cf0107ed87d93 /app-arch | |
parent | Remove old (diff) | |
download | gentoo-2-0cbf1836cc69e219a657c98e14fc59cc29cc87dd.tar.gz gentoo-2-0cbf1836cc69e219a657c98e14fc59cc29cc87dd.tar.bz2 gentoo-2-0cbf1836cc69e219a657c98e14fc59cc29cc87dd.zip |
Add a patch to fix behaviour with pipe, allows for bsdtar to work with current Portage behaviour.
(Portage version: 2.2_rc33/cvs/Linux x86_64)
Diffstat (limited to 'app-arch')
-rw-r--r-- | app-arch/libarchive/ChangeLog | 9 | ||||
-rw-r--r-- | app-arch/libarchive/files/libarchive-2.7.0-pipe.patch | 113 | ||||
-rw-r--r-- | app-arch/libarchive/libarchive-2.7.0-r1.ebuild | 85 |
3 files changed, 206 insertions, 1 deletions
diff --git a/app-arch/libarchive/ChangeLog b/app-arch/libarchive/ChangeLog index 0a5e0f64a2c4..3792b9e1610d 100644 --- a/app-arch/libarchive/ChangeLog +++ b/app-arch/libarchive/ChangeLog @@ -1,6 +1,13 @@ # ChangeLog for app-arch/libarchive # Copyright 1999-2009 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/app-arch/libarchive/ChangeLog,v 1.57 2009/04/27 13:51:00 jer Exp $ +# $Header: /var/cvsroot/gentoo-x86/app-arch/libarchive/ChangeLog,v 1.58 2009/05/14 22:12:41 flameeyes Exp $ + +*libarchive-2.7.0-r1 (14 May 2009) + + 14 May 2009; Diego E. Pettenò <flameeyes@gentoo.org> + +libarchive-2.7.0-r1.ebuild, +files/libarchive-2.7.0-pipe.patch: + Add a patch to fix behaviour with pipe, allows for bsdtar to work with + current Portage behaviour. 27 Apr 2009; Jeroen Roovers <jer@gentoo.org> libarchive-2.6.2: Stable for HPPA (bug #260063). diff --git a/app-arch/libarchive/files/libarchive-2.7.0-pipe.patch b/app-arch/libarchive/files/libarchive-2.7.0-pipe.patch new file mode 100644 index 000000000000..3b872b5ae534 --- /dev/null +++ b/app-arch/libarchive/files/libarchive-2.7.0-pipe.patch @@ -0,0 +1,113 @@ +--- head/lib/libarchive/archive_read_open_filename.c 2009/05/07 21:51:13 191903 ++++ head/lib/libarchive/archive_read_open_filename.c 2009/05/07 23:01:03 191904 +@@ -85,19 +85,31 @@ + int fd; + +- if (filename == NULL || filename[0] == '\0') +- return (archive_read_open_fd(a, 0, block_size)); +- +- fd = open(filename, O_RDONLY | O_BINARY); +- if (fd < 0) { +- archive_set_error(a, errno, "Failed to open '%s'", filename); +- return (ARCHIVE_FATAL); ++ if (filename == NULL || filename[0] == '\0') { ++ /* We used to invoke archive_read_open_fd(a,0,block_size) ++ * here, but that doesn't (and shouldn't) handle the ++ * end-of-file flush when reading stdout from a pipe. ++ * Basically, read_open_fd() is intended for folks who ++ * are willing to handle such details themselves. This ++ * API is intended to be a little smarter for folks who ++ * want easy handling of the common case. ++ */ ++ filename = ""; /* Normalize NULL to "" */ ++ fd = 0; ++ } else { ++ fd = open(filename, O_RDONLY | O_BINARY); ++ if (fd < 0) { ++ archive_set_error(a, errno, ++ "Failed to open '%s'", filename); ++ return (ARCHIVE_FATAL); ++ } + } + if (fstat(fd, &st) != 0) { + archive_set_error(a, errno, "Can't stat '%s'", filename); + return (ARCHIVE_FATAL); + } + +- mine = (struct read_file_data *)malloc(sizeof(*mine) + strlen(filename)); ++ mine = (struct read_file_data *)calloc(1, ++ sizeof(*mine) + strlen(filename)); + b = malloc(block_size); + if (mine == NULL || b == NULL) { + archive_set_error(a, ENOMEM, "No memory"); +@@ -117,15 +129,20 @@ + if (S_ISREG(st.st_mode)) { + archive_read_extract_set_skip_file(a, st.st_dev, st.st_ino); + /* +- * Skip is a performance optimization for anything +- * that supports lseek(). Generally, that only +- * includes regular files and possibly raw disk +- * devices, but there's no good portable way to detect +- * raw disks. ++ * Enabling skip here is a performance optimization ++ * for anything that supports lseek(). On FreeBSD ++ * (and probably many other systems), only regular ++ * files and raw disk devices support lseek() (on ++ * other input types, lseek() returns success but ++ * doesn't actually change the file pointer, which ++ * just completely screws up the position-tracking ++ * logic). In addition, I've yet to find a portable ++ * way to determine if a device is a raw disk device. ++ * So I don't see a way to do much better than to only ++ * enable this optimization for regular files. + */ + mine->can_skip = 1; +- } else +- mine->can_skip = 0; ++ } + return (archive_read_open2(a, mine, + NULL, file_read, file_skip, file_close)); + } +@@ -139,8 +156,11 @@ + *buff = mine->buffer; + bytes_read = read(mine->fd, mine->buffer, mine->block_size); + if (bytes_read < 0) { +- archive_set_error(a, errno, "Error reading '%s'", +- mine->filename); ++ if (mine->filename[0] == '\0') ++ archive_set_error(a, errno, "Error reading stdin"); ++ else ++ archive_set_error(a, errno, "Error reading '%s'", ++ mine->filename); + } + return (bytes_read); + } +@@ -190,8 +210,15 @@ + * likely caused by a programmer error (too large request) + * or a corrupted archive file. + */ +- archive_set_error(a, errno, "Error seeking in '%s'", +- mine->filename); ++ if (mine->filename[0] == '\0') ++ /* ++ * Should never get here, since lseek() on stdin ought ++ * to return an ESPIPE error. ++ */ ++ archive_set_error(a, errno, "Error seeking in stdin"); ++ else ++ archive_set_error(a, errno, "Error seeking in '%s'", ++ mine->filename); + return (-1); + } + return (new_offset - old_offset); +@@ -225,7 +252,9 @@ + mine->block_size); + } while (bytesRead > 0); + } +- close(mine->fd); ++ /* If a named file was opened, then it needs to be closed. */ ++ if (mine->filename[0] != '\0') ++ close(mine->fd); + } + free(mine->buffer); + free(mine); diff --git a/app-arch/libarchive/libarchive-2.7.0-r1.ebuild b/app-arch/libarchive/libarchive-2.7.0-r1.ebuild new file mode 100644 index 000000000000..5d9184cfa7eb --- /dev/null +++ b/app-arch/libarchive/libarchive-2.7.0-r1.ebuild @@ -0,0 +1,85 @@ +# Copyright 1999-2009 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/app-arch/libarchive/libarchive-2.7.0-r1.ebuild,v 1.1 2009/05/14 22:12:41 flameeyes Exp $ + +EAPI=1 + +inherit eutils libtool toolchain-funcs flag-o-matic + +DESCRIPTION="BSD tar command" +HOMEPAGE="http://people.freebsd.org/~kientzle/libarchive" +SRC_URI="http://${PN}.googlecode.com/files/${P}.tar.gz + http://people.freebsd.org/~kientzle/libarchive/src/${P}.tar.gz" + +LICENSE="BSD" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~sh ~sparc ~x86 ~sparc-fbsd ~x86-fbsd" +IUSE="static acl xattr kernel_linux +bzip2 +lzma +zlib" + +COMPRESS_LIBS_DEPEND="lzma? ( app-arch/lzma-utils ) + bzip2? ( app-arch/bzip2 ) + zlib? ( sys-libs/zlib )" + +RDEPEND="!dev-libs/libarchive + kernel_linux? ( + acl? ( sys-apps/acl ) + xattr? ( sys-apps/attr ) + ) + !static? ( ${COMPRESS_LIBS_DEPEND} )" +DEPEND="${RDEPEND} + ${COMPRESS_LIBS_DEPEND} + kernel_linux? ( sys-fs/e2fsprogs + virtual/os-headers )" + +src_unpack() { + unpack ${A} + cd "${S}" + + epatch "${FILESDIR}"/${P}-fortified-sources.patch + epatch "${FILESDIR}"/${P}-pipe.patch + + elibtoolize + epunt_cxx +} + +src_compile() { + local myconf + + if ! use static ; then + myconf="--enable-bsdtar=shared --enable-bsdcpio=shared" + fi + + # Check for need of this in 2.7.1 and later, on 2.7.0, -Werror was + # added to the final release, but since it's done in the + # Makefile.am we can just work it around this way. + append-flags -Wno-error + + # We disable lzma because we don't have liblzma (not liblzmadec!) + # currently. + econf --bindir=/bin \ + --enable-bsdtar --enable-bsdcpio \ + $(use_enable acl) $(use_enable xattr) \ + $(use_with zlib) \ + $(use_with bzip2 bz2lib) $(use_with lzma lzmadec) \ + --without-lzma \ + ${myconf} \ + --disable-dependency-tracking || die "econf failed." + + emake || die "emake failed." +} + +src_install() { + emake DESTDIR="${D}" install || die "emake install failed." + + # Create tar symlink for FreeBSD + if [[ ${CHOST} == *-freebsd* ]]; then + dosym bsdtar /bin/tar + dosym bsdtar.1 /usr/share/man/man1/tar.1 + # We may wish to switch to symlink bsdcpio to cpio too one day + fi + + dodoc NEWS README + dodir /$(get_libdir) + mv "${D}"/usr/$(get_libdir)/*.so* "${D}"/$(get_libdir) + gen_usr_ldscript libarchive.so +} |