[pacman-dev] [RFC] libalpm: replace deprecated libarchive calls
This raises our minimum libarchive version to 3.0.0, which is reflected by autoconf. Signed-off-by: Dave Reisner <dreisner@archlinux.org> --- There's a soname bump with libarchive 3.1 (which no one in Arch Linux land has been brave enough to touch yet). Maybe this will help us get started. The test suite still passes, though there is a CPIO based failure in libarchive 3.1.1 which should be dealt with separately. I mark this as an RFC since it's a library requirement bump. As an alternative, I propose that we could create a header, perhaps lib/libalpm/libarchive.h which has wrapper methods and preprocessor logic to Do The Right Thing™. Personally, I'd rather not get into this business. configure.ac | 4 ++-- lib/libalpm/add.c | 6 +++--- lib/libalpm/be_local.c | 6 +++--- lib/libalpm/be_package.c | 10 +++++----- lib/libalpm/be_sync.c | 4 ++-- lib/libalpm/util.c | 6 +++--- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/configure.ac b/configure.ac index a7364ba..08af5a3 100644 --- a/configure.ac +++ b/configure.ac @@ -190,8 +190,8 @@ AC_CHECK_LIB([m], [fabs], , AC_MSG_ERROR([libm is needed to compile pacman!])) # Check for libarchive -PKG_CHECK_MODULES(LIBARCHIVE, [libarchive >= 2.8.0], , - AC_MSG_ERROR([*** libarchive >= 2.8.0 is needed to compile pacman!])) +PKG_CHECK_MODULES(LIBARCHIVE, [libarchive >= 3.0.0], , + AC_MSG_ERROR([*** libarchive >= 3.0.0 is needed to compile pacman!])) # Check for OpenSSL have_openssl=no diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index 9b67813..7bdb032 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -555,7 +555,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg, if(chdir(handle->root) != 0) { _alpm_log(handle, ALPM_LOG_ERROR, _("could not change directory to %s (%s)\n"), handle->root, strerror(errno)); - archive_read_finish(archive); + archive_read_close(archive); CLOSE(fd); ret = -1; goto cleanup; @@ -577,7 +577,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg, /* Using compressed size for calculations here, as newpkg->isize is not * exact when it comes to comparing to the ACTUAL uncompressed size * (missing metadata sizes) */ - int64_t pos = archive_position_compressed(archive); + int64_t pos = archive_filter_bytes(archive, -1); percent = (pos * 100) / newpkg->size; if(percent >= 100) { percent = 100; @@ -597,7 +597,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg, /* extract the next file from the archive */ errors += extract_single_file(handle, archive, entry, newpkg, oldpkg); } - archive_read_finish(archive); + archive_read_close(archive); CLOSE(fd); /* restore the old cwd if we have it */ diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c index 0f60b6d..6c58920 100644 --- a/lib/libalpm/be_local.c +++ b/lib/libalpm/be_local.c @@ -241,11 +241,11 @@ static struct archive *_cache_mtree_open(alpm_pkg_t *pkg) archive_read_support_filter_gzip(mtree); archive_read_support_format_mtree(mtree); - if((r = archive_read_open_file(mtree, mtfile, ALPM_BUFFER_SIZE))) { + if((r = archive_read_open_filename(mtree, mtfile, ALPM_BUFFER_SIZE))) { _alpm_log(pkg->handle, ALPM_LOG_ERROR, _("error while reading file %s: %s\n"), mtfile, archive_error_string(mtree)); pkg->handle->pm_errno = ALPM_ERR_LIBARCHIVE; - archive_read_finish(mtree); + archive_read_close(mtree); goto error; } @@ -279,7 +279,7 @@ static int _cache_mtree_next(const alpm_pkg_t UNUSED *pkg, static int _cache_mtree_close(const alpm_pkg_t UNUSED *pkg, struct archive *mtree) { - return archive_read_finish(mtree); + return archive_read_close(mtree); } static int _cache_force_load(alpm_pkg_t *pkg) diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c index 18fc14a..d920a76 100644 --- a/lib/libalpm/be_package.c +++ b/lib/libalpm/be_package.c @@ -74,7 +74,7 @@ static void *_package_changelog_open(alpm_pkg_t *pkg) changelog = malloc(sizeof(struct package_changelog)); if(!changelog) { pkg->handle->pm_errno = ALPM_ERR_MEMORY; - archive_read_finish(archive); + archive_read_close(archive); CLOSE(fd); return NULL; } @@ -84,7 +84,7 @@ static void *_package_changelog_open(alpm_pkg_t *pkg) } } /* we didn't find a changelog */ - archive_read_finish(archive); + archive_read_close(archive); CLOSE(fd); errno = ENOENT; @@ -124,7 +124,7 @@ static int _package_changelog_close(const alpm_pkg_t UNUSED *pkg, void *fp) { int ret; struct package_changelog *changelog = fp; - ret = archive_read_finish(changelog->archive); + ret = archive_read_close(changelog->archive); CLOSE(changelog->fd); free(changelog); return ret; @@ -471,7 +471,7 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle, goto pkg_invalid; } - archive_read_finish(archive); + archive_read_close(archive); CLOSE(fd); /* internal fields for package struct */ @@ -503,7 +503,7 @@ pkg_invalid: handle->pm_errno = ALPM_ERR_PKG_INVALID; error: _alpm_pkg_free(newpkg); - archive_read_finish(archive); + archive_read_close(archive); if(fd >= 0) { CLOSE(fd); } diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index a5a2c10..77bfc1e 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -383,7 +383,7 @@ static size_t estimate_package_count(struct stat *st, struct archive *archive) { int per_package; - switch(archive_compression(archive)) { + switch(archive_filter_code(archive, 0)) { case ARCHIVE_COMPRESSION_NONE: per_package = 3015; break; @@ -471,7 +471,7 @@ static int sync_db_populate(alpm_db_t *db) count, db->treename); cleanup: - archive_read_finish(archive); + archive_read_close(archive); if(fd >= 0) { CLOSE(fd); } diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index 5960be6..f2258d6 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -240,7 +240,7 @@ int _alpm_open_archive(alpm_handle_t *handle, const char *path, RET_ERR(handle, ALPM_ERR_LIBARCHIVE, -1); } - archive_read_support_compression_all(*archive); + archive_read_support_filter_all(*archive); archive_read_support_format_all(*archive); _alpm_log(handle, ALPM_LOG_DEBUG, "opening archive %s\n", path); @@ -271,7 +271,7 @@ int _alpm_open_archive(alpm_handle_t *handle, const char *path, return fd; error: - archive_read_finish(*archive); + archive_read_close(*archive); *archive = NULL; if(fd >= 0) { CLOSE(fd); @@ -392,7 +392,7 @@ int _alpm_unpack(alpm_handle_t *handle, const char *path, const char *prefix, cleanup: umask(oldmask); - archive_read_finish(archive); + archive_read_close(archive); CLOSE(fd); if(cwdfd >= 0) { if(fchdir(cwdfd) != 0) { -- 1.8.1.1
On Mon, Jan 28, 2013 at 01:57:53PM -0500, Dave Reisner wrote:
This raises our minimum libarchive version to 3.0.0, which is reflected by autoconf.
Signed-off-by: Dave Reisner <dreisner@archlinux.org> ---
Bleh. This patch is wrong, but the RFC still stands.
There's a soname bump with libarchive 3.1 (which no one in Arch Linux land has been brave enough to touch yet). Maybe this will help us get started. The test suite still passes, though there is a CPIO based failure in libarchive 3.1.1 which should be dealt with separately.
I mark this as an RFC since it's a library requirement bump. As an alternative, I propose that we could create a header, perhaps lib/libalpm/libarchive.h which has wrapper methods and preprocessor logic to Do The Right Thing™. Personally, I'd rather not get into this business.
configure.ac | 4 ++-- lib/libalpm/add.c | 6 +++--- lib/libalpm/be_local.c | 6 +++--- lib/libalpm/be_package.c | 10 +++++----- lib/libalpm/be_sync.c | 4 ++-- lib/libalpm/util.c | 6 +++--- 6 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/configure.ac b/configure.ac index a7364ba..08af5a3 100644 --- a/configure.ac +++ b/configure.ac @@ -190,8 +190,8 @@ AC_CHECK_LIB([m], [fabs], , AC_MSG_ERROR([libm is needed to compile pacman!]))
# Check for libarchive -PKG_CHECK_MODULES(LIBARCHIVE, [libarchive >= 2.8.0], , - AC_MSG_ERROR([*** libarchive >= 2.8.0 is needed to compile pacman!])) +PKG_CHECK_MODULES(LIBARCHIVE, [libarchive >= 3.0.0], , + AC_MSG_ERROR([*** libarchive >= 3.0.0 is needed to compile pacman!]))
# Check for OpenSSL have_openssl=no diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index 9b67813..7bdb032 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -555,7 +555,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg, if(chdir(handle->root) != 0) { _alpm_log(handle, ALPM_LOG_ERROR, _("could not change directory to %s (%s)\n"), handle->root, strerror(errno)); - archive_read_finish(archive); + archive_read_close(archive); CLOSE(fd); ret = -1; goto cleanup; @@ -577,7 +577,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg, /* Using compressed size for calculations here, as newpkg->isize is not * exact when it comes to comparing to the ACTUAL uncompressed size * (missing metadata sizes) */ - int64_t pos = archive_position_compressed(archive); + int64_t pos = archive_filter_bytes(archive, -1); percent = (pos * 100) / newpkg->size; if(percent >= 100) { percent = 100; @@ -597,7 +597,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg, /* extract the next file from the archive */ errors += extract_single_file(handle, archive, entry, newpkg, oldpkg); } - archive_read_finish(archive); + archive_read_close(archive); CLOSE(fd);
/* restore the old cwd if we have it */ diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c index 0f60b6d..6c58920 100644 --- a/lib/libalpm/be_local.c +++ b/lib/libalpm/be_local.c @@ -241,11 +241,11 @@ static struct archive *_cache_mtree_open(alpm_pkg_t *pkg) archive_read_support_filter_gzip(mtree); archive_read_support_format_mtree(mtree);
- if((r = archive_read_open_file(mtree, mtfile, ALPM_BUFFER_SIZE))) { + if((r = archive_read_open_filename(mtree, mtfile, ALPM_BUFFER_SIZE))) { _alpm_log(pkg->handle, ALPM_LOG_ERROR, _("error while reading file %s: %s\n"), mtfile, archive_error_string(mtree)); pkg->handle->pm_errno = ALPM_ERR_LIBARCHIVE; - archive_read_finish(mtree); + archive_read_close(mtree); goto error; }
@@ -279,7 +279,7 @@ static int _cache_mtree_next(const alpm_pkg_t UNUSED *pkg, static int _cache_mtree_close(const alpm_pkg_t UNUSED *pkg, struct archive *mtree) { - return archive_read_finish(mtree); + return archive_read_close(mtree); }
static int _cache_force_load(alpm_pkg_t *pkg) diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c index 18fc14a..d920a76 100644 --- a/lib/libalpm/be_package.c +++ b/lib/libalpm/be_package.c @@ -74,7 +74,7 @@ static void *_package_changelog_open(alpm_pkg_t *pkg) changelog = malloc(sizeof(struct package_changelog)); if(!changelog) { pkg->handle->pm_errno = ALPM_ERR_MEMORY; - archive_read_finish(archive); + archive_read_close(archive); CLOSE(fd); return NULL; } @@ -84,7 +84,7 @@ static void *_package_changelog_open(alpm_pkg_t *pkg) } } /* we didn't find a changelog */ - archive_read_finish(archive); + archive_read_close(archive); CLOSE(fd); errno = ENOENT;
@@ -124,7 +124,7 @@ static int _package_changelog_close(const alpm_pkg_t UNUSED *pkg, void *fp) { int ret; struct package_changelog *changelog = fp; - ret = archive_read_finish(changelog->archive); + ret = archive_read_close(changelog->archive); CLOSE(changelog->fd); free(changelog); return ret; @@ -471,7 +471,7 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle, goto pkg_invalid; }
- archive_read_finish(archive); + archive_read_close(archive); CLOSE(fd);
/* internal fields for package struct */ @@ -503,7 +503,7 @@ pkg_invalid: handle->pm_errno = ALPM_ERR_PKG_INVALID; error: _alpm_pkg_free(newpkg); - archive_read_finish(archive); + archive_read_close(archive); if(fd >= 0) { CLOSE(fd); } diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index a5a2c10..77bfc1e 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -383,7 +383,7 @@ static size_t estimate_package_count(struct stat *st, struct archive *archive) { int per_package;
- switch(archive_compression(archive)) { + switch(archive_filter_code(archive, 0)) { case ARCHIVE_COMPRESSION_NONE: per_package = 3015; break; @@ -471,7 +471,7 @@ static int sync_db_populate(alpm_db_t *db) count, db->treename);
cleanup: - archive_read_finish(archive); + archive_read_close(archive); if(fd >= 0) { CLOSE(fd); } diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index 5960be6..f2258d6 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -240,7 +240,7 @@ int _alpm_open_archive(alpm_handle_t *handle, const char *path, RET_ERR(handle, ALPM_ERR_LIBARCHIVE, -1); }
- archive_read_support_compression_all(*archive); + archive_read_support_filter_all(*archive); archive_read_support_format_all(*archive);
_alpm_log(handle, ALPM_LOG_DEBUG, "opening archive %s\n", path); @@ -271,7 +271,7 @@ int _alpm_open_archive(alpm_handle_t *handle, const char *path, return fd;
error: - archive_read_finish(*archive); + archive_read_close(*archive); *archive = NULL; if(fd >= 0) { CLOSE(fd); @@ -392,7 +392,7 @@ int _alpm_unpack(alpm_handle_t *handle, const char *path, const char *prefix,
cleanup: umask(oldmask); - archive_read_finish(archive); + archive_read_close(archive); CLOSE(fd); if(cwdfd >= 0) { if(fchdir(cwdfd) != 0) { -- 1.8.1.1
On 29/01/13 04:57, Dave Reisner wrote:
This raises our minimum libarchive version to 3.0.0, which is reflected by autoconf.
Signed-off-by: Dave Reisner <dreisner@archlinux.org> --- There's a soname bump with libarchive 3.1 (which no one in Arch Linux land has been brave enough to touch yet). Maybe this will help us get started. The test suite still passes, though there is a CPIO based failure in libarchive 3.1.1 which should be dealt with separately.
I mark this as an RFC since it's a library requirement bump. As an alternative, I propose that we could create a header, perhaps lib/libalpm/libarchive.h which has wrapper methods and preprocessor logic to Do The Right Thing™. Personally, I'd rather not get into this business.
So.... Technically we need libarchive-3.1 or a patched 3.0 (as in the Arch repos) to use the mtree functionality due to creation being broken before that. Although, Dave tells me that mtree creation is completely broken with 3.1. But that is only needed for package creation - do we need to sync versions for package creation and reading? Dan also has a patch to bring back libarchive-2.8 compatibility[1], but this was before using the deprecated functions would issue a warning breaking our development that uses -Werror. [1] http://code.toofishes.net/cgit/dan/pacman.git/commit/?h=libarchive-2.8&id=e5dda277 I am happy for the minimum to be set to the future 3.1.1 - or whatever released version gets mtree generation right... If someone wants to do the wrapper/preprocessor stuff to get it working for earlier libarchive versons, then I would accept patches. This would need to do the appropriate disabling of features. Allan
participants (3)
-
Allan McRae
-
Dave Reisner
-
Dave Reisner