From owner-p4-projects@FreeBSD.ORG Sun Apr 11 09:44:44 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 70DBC1065675; Sun, 11 Apr 2010 09:44:44 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 35046106564A for ; Sun, 11 Apr 2010 09:44:44 +0000 (UTC) (envelope-from gcooper@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 205198FC19 for ; Sun, 11 Apr 2010 09:44:44 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id o3B9iiZU014931 for ; Sun, 11 Apr 2010 09:44:44 GMT (envelope-from gcooper@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o3B9ih4Y014929 for perforce@freebsd.org; Sun, 11 Apr 2010 09:44:43 GMT (envelope-from gcooper@FreeBSD.org) Date: Sun, 11 Apr 2010 09:44:43 GMT Message-Id: <201004110944.o3B9ih4Y014929@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gcooper@FreeBSD.org using -f From: Garrett Cooper To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 176778 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Apr 2010 09:44:44 -0000 http://p4web.freebsd.org/@@176778?ac=10 Change 176778 by gcooper@gcooper-bayonetta on 2010/04/11 09:43:48 Commit modified copy of bapt's patch to enable archive(3) support with pkg_install in unpack. Need to test. Affected files ... .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/add/Makefile#2 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/create/Makefile#2 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/delete/Makefile#2 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/info/Makefile#2 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/lib/Makefile#2 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/lib/file.c#6 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/updating/Makefile#2 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/version/Makefile#2 edit Differences ... ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/add/Makefile#2 (text+ko) ==== @@ -8,7 +8,7 @@ WARNS?= 3 WFORMAT?= 1 -DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD} -LDADD= ${LIBINSTALL} -lfetch -lmd +DPADD= ${LIBINSTALL} ${LIBARCHIVE} ${LIBFETCH} ${LIBMD} +LDADD= ${LIBINSTALL} -larchive -lfetch -lmd .include ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/create/Makefile#2 (text+ko) ==== @@ -8,7 +8,7 @@ WARNS?= 3 WFORMAT?= 1 -DPADD= ${LIBINSTALL} ${LIBMD} -LDADD= ${LIBINSTALL} -lmd +DPADD= ${LIBINSTALL} ${LIBARCHIVE} ${LIBMD} +LDADD= ${LIBINSTALL} -larchive -lmd .include ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/delete/Makefile#2 (text+ko) ==== @@ -7,7 +7,7 @@ WFORMAT?= 1 -DPADD= ${LIBINSTALL} ${LIBMD} -LDADD= ${LIBINSTALL} -lmd +DPADD= ${LIBINSTALL} ${LIBARCHIVE} ${LIBMD} +LDADD= ${LIBINSTALL} -larchive -lmd .include ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/info/Makefile#2 (text+ko) ==== @@ -7,7 +7,7 @@ WFORMAT?= 1 -DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD} -LDADD= ${LIBINSTALL} -lfetch -lmd +DPADD= ${LIBINSTALL} ${LIBARCHIVE} ${LIBFETCH} ${LIBMD} +LDADD= ${LIBINSTALL} -larchive -lfetch -lmd .include ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/lib/Makefile#2 (text+ko) ==== ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/lib/file.c#6 (text+ko) ==== @@ -22,7 +22,10 @@ __FBSDID("$FreeBSD: src/usr.sbin/pkg_install/lib/file.c,v 1.70 2010/04/01 14:27:29 flz Exp $"); #include "lib.h" +#include +#include #include +#include #include #include #include @@ -334,37 +337,71 @@ } } +#define EXTRACT_ARCHIVE_FLAGS (ARCHIVE_EXTRACT_OWNER | ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_TIME) + /* Unpack a tar file */ int -unpack(const char *pkg, const char *flist) +unpack(const char *pkg, const char *file_expr) { - const char *comp, *cp; - char suff[80]; + struct archive *archive; + struct archive_entry *archive_entry; + Boolean extract_whole_archive = FALSE; + const char *error = NULL; + const char *pkg_name_humanized; + int fn_ret = 0, r; + + if (file_expr == NULL || strcmp("*", file_expr) == 0) + extract_whole_archive = TRUE; + + pkg_name_humanized = strcmp(pkg, "-") == 0 ? "(stdin)" : pkg; + + archive_read_support_compression_all(archive); + archive_read_support_format_tar(archive); + + /* The initial open failed */ + if (archive_read_open_filename(archive, pkg, + ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) { + + error = archive_error_string(archive); + warnx("%s: unable to open the package from %s: %s", + __func__, pkg_name_humanized, error); - comp = ""; - /* - * Figure out by a crude heuristic whether this or not this is probably - * compressed and whichever compression utility was used (gzip or bzip2). - */ - if (strcmp(pkg, "-")) { - cp = strrchr(pkg, '.'); - if (cp) { - strcpy(suff, cp + 1); - if (strchr(suff, 'z') || strchr(suff, 'Z')) { - if (strchr(suff, 'b')) - comp = "-j"; - else - comp = "-z"; - } } - } - else - comp = "-j"; - if (vsystem("/usr/bin/tar -xp %s -f '%s' %s", comp, pkg, flist ? flist : "")) { - warnx("tar extract of %s failed!", pkg); - return 1; - } - return 0; + else + while (error == NULL && + (r = archive_read_next_header(archive, &archive_entry)) == + ARCHIVE_OK) { + + /* Let's extract the whole archive, or just a file. */ + if (extract_whole_archive == TRUE || + (fn_ret = fnmatch(file_expr, + archive_entry_pathname(archive_entry), + FNM_PATHNAME) == 0)) { + + r = archive_read_extract(archive, archive_entry, + EXTRACT_ARCHIVE_FLAGS); + if (r != ARCHIVE_OK) { + error = archive_error_string(archive); + warnx("%s: extraction for %s failed: " + "%s", __func__, pkg_name_humanized, + error); + } + + } + + /* + * Else let's skip the entry because we still haven't + * found what we're looking for. + */ + else if (fn_ret == FNM_NOMATCH) + archive_read_data_skip(archive); + + } + + archive_read_finish(archive); + + return (error == NULL ? 0 : 1); + } /* ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/updating/Makefile#2 (text+ko) ==== @@ -7,7 +7,7 @@ WFORMAT?= 1 -DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD} -LDADD= ${LIBINSTALL} -lfetch -lmd +DPADD= ${LIBINSTALL} ${LIBARCHIVE} ${LIBFETCH} ${LIBMD} +LDADD= ${LIBINSTALL} -larchive -lfetch -lmd .include ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/version/Makefile#2 (text+ko) ==== @@ -7,8 +7,8 @@ WFORMAT?= 1 -DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD} -LDADD= ${LIBINSTALL} -lfetch -lmd +DPADD= ${LIBINSTALL} ${LIBARCHIVE} ${LIBFETCH} ${LIBMD} +LDADD= ${LIBINSTALL} -larchive -lfetch -lmd test: sh ${.CURDIR}/test-pkg_version.sh