Date: Sun, 11 Apr 2010 09:44:43 GMT From: Garrett Cooper <gcooper@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 176778 for review Message-ID: <201004110944.o3B9ih4Y014929@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 <bsd.prog.mk> ==== //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 <bsd.prog.mk> ==== //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 <bsd.prog.mk> ==== //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 <bsd.prog.mk> ==== //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 <archive.h> +#include <archive_entry.h> #include <err.h> +#include <fnmatch.h> #include <pwd.h> #include <time.h> #include <sys/wait.h> @@ -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 <bsd.prog.mk> ==== //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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004110944.o3B9ih4Y014929>