Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PERFORCE change 176778 for review

1 view
Skip to first unread message

Garrett Cooper

unread,
Apr 11, 2010, 5:44:43 AM4/11/10
to Perforce Change Reviews
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

0 new messages