Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.sbin/pkg_install use the --use-compress-program argument...
details: https://anonhg.NetBSD.org/src/rev/d34c2f54801e
branches: trunk
changeset: 556538:d34c2f54801e
user: grant <grant%NetBSD.org@localhost>
date: Sat Dec 20 03:31:56 2003 +0000
description:
use the --use-compress-program argument to tar and do away with
the file descriptor handling mess in lib/file.c.
also use --fast-read where applicable.
result of pkg_info -B on 1.5ghz pentium4, linux:
before after
mozilla-1.4nb1.tgz 1.96sec 0.04sec
mozilla-1.4nb1.tbz 18.66sec 0.21sec
866mhz pentium3, NetBSD:
before after
mozilla-1.4nb1.tgz 2.22sec 0.07sec
mozilla-1.4nb1.tbz 16.29sec 0.34sec
-rw-r--r-- 1 grant users 13816195 Dec 20 13:59 mozilla-1.4nb1.tbz
-rw-r--r-- 1 grant users 15814227 Dec 20 13:58 mozilla-1.4nb1.tgz
XXX fetches over ftp/http still read the whole file.
diffstat:
usr.sbin/pkg_install/add/perform.c | 15 ++--
usr.sbin/pkg_install/info/perform.c | 6 +-
usr.sbin/pkg_install/lib/file.c | 118 +++++++----------------------------
usr.sbin/pkg_install/lib/ftpio.c | 6 +-
usr.sbin/pkg_install/lib/lib.h | 10 ++-
5 files changed, 47 insertions(+), 108 deletions(-)
diffs (287 lines):
diff -r a5dccc4be55b -r d34c2f54801e usr.sbin/pkg_install/add/perform.c
--- a/usr.sbin/pkg_install/add/perform.c Sat Dec 20 02:37:49 2003 +0000
+++ b/usr.sbin/pkg_install/add/perform.c Sat Dec 20 03:31:56 2003 +0000
@@ -1,11 +1,11 @@
-/* $NetBSD: perform.c,v 1.90 2003/12/20 00:47:18 grant Exp $ */
+/* $NetBSD: perform.c,v 1.91 2003/12/20 03:31:56 grant Exp $ */
#include <sys/cdefs.h>
#ifndef lint
#if 0
static const char *rcsid = "from FreeBSD Id: perform.c,v 1.44 1997/10/13 15:03:46 jkh Exp";
#else
-__RCSID("$NetBSD: perform.c,v 1.90 2003/12/20 00:47:18 grant Exp $");
+__RCSID("$NetBSD: perform.c,v 1.91 2003/12/20 03:31:56 grant Exp $");
#endif
#endif
@@ -110,7 +110,7 @@
int replacing = 0;
char *where_to;
char dbdir[FILENAME_MAX];
- const char *exact, *extra1, *extra2;
+ const char *exact, *extra1;
FILE *cfile;
int errc;
plist_t *p;
@@ -176,11 +176,10 @@
goto bomb;
}
}
- extra1 = "--fast-read";
- extra2 = CONTENTS_FNAME;
+ extra1 = CONTENTS_FNAME;
} else {
/* some values for stdin */
- extra1 = extra2 = NULL;
+ extra1 = NULL;
sb.st_size = 100000; /* Make up a plausible average size */
}
Home = make_playpen(playpen, sizeof(playpen), sb.st_size * 4);
@@ -188,7 +187,7 @@
warnx("unable to make playpen for %ld bytes",
(long) (sb.st_size * 4));
where_to = Home;
- if (unpack(pkg, extra1, extra2)) {
+ if (unpack(pkg, extra1)) {
warnx("unable to extract table of contents file from `%s' - not a package?",
pkg);
goto bomb;
@@ -249,7 +248,7 @@
goto success;
/* Finally unpack the whole mess */
- if (unpack(pkg, NULL, NULL)) {
+ if (unpack(pkg, NULL)) {
warnx("unable to extract `%s'!", pkg);
goto bomb;
}
diff -r a5dccc4be55b -r d34c2f54801e usr.sbin/pkg_install/info/perform.c
--- a/usr.sbin/pkg_install/info/perform.c Sat Dec 20 02:37:49 2003 +0000
+++ b/usr.sbin/pkg_install/info/perform.c Sat Dec 20 03:31:56 2003 +0000
@@ -1,11 +1,11 @@
-/* $NetBSD: perform.c,v 1.50 2003/09/23 09:36:06 wiz Exp $ */
+/* $NetBSD: perform.c,v 1.51 2003/12/20 03:31:56 grant Exp $ */
#include <sys/cdefs.h>
#ifndef lint
#if 0
static const char *rcsid = "from FreeBSD Id: perform.c,v 1.23 1997/10/13 15:03:53 jkh Exp";
#else
-__RCSID("$NetBSD: perform.c,v 1.50 2003/09/23 09:36:06 wiz Exp $");
+__RCSID("$NetBSD: perform.c,v 1.51 2003/12/20 03:31:56 grant Exp $");
#endif
#endif
@@ -106,7 +106,7 @@
goto bail;
}
Home = make_playpen(PlayPen, PlayPenSize, sb.st_size / 2);
- if (unpack(fname, "+*", NULL)) {
+ if (unpack(fname, ALL_FNAMES)) {
warnx("error during unpacking, no info for '%s' available", pkg);
code = 1;
goto bail;
diff -r a5dccc4be55b -r d34c2f54801e usr.sbin/pkg_install/lib/file.c
--- a/usr.sbin/pkg_install/lib/file.c Sat Dec 20 02:37:49 2003 +0000
+++ b/usr.sbin/pkg_install/lib/file.c Sat Dec 20 03:31:56 2003 +0000
@@ -1,11 +1,11 @@
-/* $NetBSD: file.c,v 1.69 2003/11/21 22:04:32 wiz Exp $ */
+/* $NetBSD: file.c,v 1.70 2003/12/20 03:31:56 grant Exp $ */
#include <sys/cdefs.h>
#ifndef lint
#if 0
static const char *rcsid = "from FreeBSD Id: file.c,v 1.29 1997/10/08 07:47:54 charnier Exp";
#else
-__RCSID("$NetBSD: file.c,v 1.69 2003/11/21 22:04:32 wiz Exp $");
+__RCSID("$NetBSD: file.c,v 1.70 2003/12/20 03:31:56 grant Exp $");
#endif
#endif
@@ -558,107 +558,41 @@
* Unpack a tar file
*/
int
-unpack(const char *pkg, const char *extra1, const char *extra2)
+unpack(const char *pkg, const char *flist)
{
- const char *decompress_cmd[3];
+ char args[10] = "-";
+ char cmd[FILENAME_MAX];
+ const char *decompress_cmd;
const char *suf;
- int pipefds[2];
- pid_t tarpid, gzpid;
- int state;
- int ret;
if (!IS_STDIN(pkg)) {
suf = suffix_of(pkg);
- if (!strcmp(suf, "tbz") || !strcmp(suf, "bz2")) {
- decompress_cmd[0] = BZIP2_CMD;
- decompress_cmd[1] = "-c";
- decompress_cmd[2] = "-d";
- }
- else if (!strcmp(suf, "tgz") || !strcmp(suf, "gz")) {
- decompress_cmd[0] = GZIP_CMD;
- decompress_cmd[1] = "-c";
- decompress_cmd[2] = "-d";
- }
- else if (!strcmp(suf, "tar")) {
- decompress_cmd[0] = "cat";
- decompress_cmd[1] = NULL;
- decompress_cmd[2] = NULL;
- }
+ if (!strcmp(suf, "tbz") || !strcmp(suf, "bz2"))
+ decompress_cmd = BZIP2_CMD;
+ else if (!strcmp(suf, "tgz") || !strcmp(suf, "gz"))
+ decompress_cmd = GZIP_CMD;
+ else if (!strcmp(suf, "tar"))
+ ; /* do nothing */
else
errx(EXIT_FAILURE, "don't know how to decompress %s, sorry", pkg);
- } else {
- decompress_cmd[0] = GZIP_CMD;
- decompress_cmd[1] = "-c";
- decompress_cmd[2] = "-d";
- }
+ } else
+ decompress_cmd = GZIP_CMD;
- /* Set up a pipe for passing the extracted contents, and fork off a decompress process. */
- if (pipe(pipefds) == -1) {
- warnx("cannot create pipe -- %s extract of %s failed!", TAR_CMD, pkg);
- return 1;
- }
- if ((gzpid = fork()) == -1) {
- warnx("cannot fork process for %s -- %s extract of %s failed!",
- decompress_cmd[0], TAR_CMD, pkg);
+ strlcat(args, "xpf", sizeof(args));
+ sprintf(cmd, "%s %s %s %s %s %s %s", TAR_CMD,
+ flist ? "--fast-read" : "",
+ decompress_cmd != NULL ? "--use-compress-program" : "",
+ decompress_cmd != NULL ? decompress_cmd : "", args, pkg,
+ flist ? flist : "");
+
+ if (Verbose)
+ printf("running: %s\n", cmd);
+ if (system(cmd) != 0) {
+ warnx("extract of %s failed", pkg);
return 1;
}
- if (gzpid == 0) { /* The child */
- if (dup2(pipefds[1], STDOUT_FILENO) == -1) {
- warnx("dup2 failed before executing %s command",
- decompress_cmd[0]);
- _exit(2);
- }
- close(pipefds[0]);
- close(pipefds[1]);
- if (decompress_cmd[1] != NULL)
- execlp(decompress_cmd[0], decompress_cmd[0],
- decompress_cmd[1], decompress_cmd[2],
- pkg, NULL);
- else
- execlp(decompress_cmd[0], decompress_cmd[0],
- pkg, NULL);
- warnx("failed to execute %s command", decompress_cmd[0]);
- _exit(2);
- }
- /* Meanwhile, back in the parent process ... */
- /* fork off an untar process */
- if ((tarpid = fork()) == -1) {
- warnx("cannot fork process for %s -- %s extract of %s failed!",
- TAR_CMD, TAR_CMD, pkg);
- return 1;
- }
- if (tarpid == 0) { /* The child */
- if (dup2(pipefds[0], STDIN_FILENO) == -1) {
- warnx("dup2 failed before executing %s command",
- TAR_CMD);
- _exit(2);
- }
- close(pipefds[0]);
- close(pipefds[1]);
- execlp(TAR_CMD, TAR_CMD, "-xpf", "-", extra1, extra2, NULL);
- warnx("failed to execute %s command", TAR_CMD);
- _exit(2);
- }
-
-
- close(pipefds[0]);
- close(pipefds[1]);
-
- ret = 0;
- /* wait for decompress process ... */
- if (waitpid(gzpid, &state, 0) < 0) {
- /* error has been reported by child */
- ret = 1;
- }
-
- /* ... and for tar exit so we are sure the needed files exist */
- if (waitpid(tarpid, &state, 0) < 0) {
- /* error has been reported by child */
- ret = 1;
- }
-
- return ret;
+ return 0;
}
/*
diff -r a5dccc4be55b -r d34c2f54801e usr.sbin/pkg_install/lib/ftpio.c
--- a/usr.sbin/pkg_install/lib/ftpio.c Sat Dec 20 02:37:49 2003 +0000
+++ b/usr.sbin/pkg_install/lib/ftpio.c Sat Dec 20 03:31:56 2003 +0000
@@ -1,8 +1,8 @@
-/* $NetBSD: ftpio.c,v 1.61 2003/12/20 02:37:49 grant Exp $ */
+/* $NetBSD: ftpio.c,v 1.62 2003/12/20 03:31:56 grant Exp $ */
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: ftpio.c,v 1.61 2003/12/20 02:37:49 grant Exp $");
+__RCSID("$NetBSD: ftpio.c,v 1.62 2003/12/20 03:31:56 grant Exp $");
#endif
/*-
@@ -1062,7 +1062,7 @@
if ((path != NULL) && (chdir(path) < 0))
_exit(127);
- if (unpack("-", Verbose ? "-vv" : NULL, NULL) != 0) {
+ if (unpack("-", NULL) != 0) {
warnx("unpack failed");
_exit(2);
}
diff -r a5dccc4be55b -r d34c2f54801e usr.sbin/pkg_install/lib/lib.h
--- a/usr.sbin/pkg_install/lib/lib.h Sat Dec 20 02:37:49 2003 +0000
+++ b/usr.sbin/pkg_install/lib/lib.h Sat Dec 20 03:31:56 2003 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lib.h,v 1.64 2003/12/20 00:47:19 grant Exp $ */
+/* $NetBSD: lib.h,v 1.65 2003/12/20 03:31:56 grant Exp $ */
/* from FreeBSD Id: lib.h,v 1.25 1997/10/08 07:48:03 charnier Exp */
@@ -115,6 +115,12 @@
#define VIEWS_FNAME "+VIEWS"
#define DEPOT_FNAME "+DEPOT"
+/*
+ * files which we expect to be in every package, passed to
+ * tar --fast-read.
+ */
+#define ALL_FNAMES CONTENTS_FNAME" "COMMENT_FNAME" "DESC_FNAME" "MTREE_FNAME" "BUILD_VERSION_FNAME" "BUILD_INFO_FNAME" "SIZE_PKG_FNAME" "SIZE_ALL_FNAME
+
#define CMD_CHAR '@' /* prefix for extended PLIST cmd */
/* The name of the "prefix" environment variable given to scripts */
@@ -258,7 +264,7 @@
void move_file(char *, char *, char *);
void remove_files(const char *, const char *);
int delete_hierarchy(char *, Boolean, Boolean);
-int unpack(const char *, const char *, const char *);
+int unpack(const char *, const char *);
void format_cmd(char *, size_t, char *, char *, char *);
/* ftpio.c: FTP handling */
Home |
Main Index |
Thread Index |
Old Index