summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoerg <joerg>2008-07-30 15:38:37 +0000
committerjoerg <joerg>2008-07-30 15:38:37 +0000
commit8b77ee9e37de5dde81c9b31ee631ef5b36d60cd8 (patch)
tree6905021785d41ab5e10d2b3351b71cb25cb747bb
parent310a202d8296661b713087792dbd11af3e51945f (diff)
downloadpkgsrc-8b77ee9e37de5dde81c9b31ee631ef5b36d60cd8.tar.gz
pkg_install-20080730:
Add destdir installation support for pkg_add and pkg_delete. This does not chroot install/deinstall scripts, they have to support it directly (using PKG_DESTDIR) or they have to be disabled.
-rw-r--r--pkgtools/pkg_install/files/add/add.h3
-rw-r--r--pkgtools/pkg_install/files/add/main.c18
-rw-r--r--pkgtools/pkg_install/files/add/perform.c62
-rw-r--r--pkgtools/pkg_install/files/add/pkg_add.117
-rw-r--r--pkgtools/pkg_install/files/add/pkg_add.cat112
-rw-r--r--pkgtools/pkg_install/files/delete/delete.h3
-rw-r--r--pkgtools/pkg_install/files/delete/main.c38
-rw-r--r--pkgtools/pkg_install/files/delete/perform.c8
-rw-r--r--pkgtools/pkg_install/files/delete/pkg_delete.117
-rw-r--r--pkgtools/pkg_install/files/delete/pkg_delete.cat113
-rw-r--r--pkgtools/pkg_install/files/lib/lib.h7
-rw-r--r--pkgtools/pkg_install/files/lib/plist.c15
-rw-r--r--pkgtools/pkg_install/files/lib/version.h4
13 files changed, 158 insertions, 59 deletions
diff --git a/pkgtools/pkg_install/files/add/add.h b/pkgtools/pkg_install/files/add/add.h
index 437da4aa0b5..964e98b2fb4 100644
--- a/pkgtools/pkg_install/files/add/add.h
+++ b/pkgtools/pkg_install/files/add/add.h
@@ -1,4 +1,4 @@
-/* $NetBSD: add.h,v 1.10.8.1 2008/04/26 17:44:23 joerg Exp $ */
+/* $NetBSD: add.h,v 1.10.8.2 2008/07/30 15:38:37 joerg Exp $ */
/* from FreeBSD Id: add.h,v 1.8 1997/02/22 16:09:15 peter Exp */
@@ -25,6 +25,7 @@
#ifndef _INST_ADD_H_INCLUDE
#define _INST_ADD_H_INCLUDE
+extern char *Destdir;
extern char *OverrideMachine;
extern char *Prefix;
extern char *View;
diff --git a/pkgtools/pkg_install/files/add/main.c b/pkgtools/pkg_install/files/add/main.c
index e0204f437a8..765606db5ef 100644
--- a/pkgtools/pkg_install/files/add/main.c
+++ b/pkgtools/pkg_install/files/add/main.c
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.14.4.4 2008/06/22 22:10:45 joerg Exp $ */
+/* $NetBSD: main.c,v 1.14.4.5 2008/07/30 15:38:37 joerg Exp $ */
#if HAVE_CONFIG_H
#include "config.h"
@@ -11,7 +11,7 @@
#if 0
static char *rcsid = "from FreeBSD Id: main.c,v 1.16 1997/10/08 07:45:43 charnier Exp";
#else
-__RCSID("$NetBSD: main.c,v 1.14.4.4 2008/06/22 22:10:45 joerg Exp $");
+__RCSID("$NetBSD: main.c,v 1.14.4.5 2008/07/30 15:38:37 joerg Exp $");
#endif
#endif
@@ -48,8 +48,9 @@ __RCSID("$NetBSD: main.c,v 1.14.4.4 2008/06/22 22:10:45 joerg Exp $");
#include "lib.h"
#include "add.h"
-static char Options[] = "AIK:LRVW:fhm:np:t:uvw:";
+static char Options[] = "AIK:LP:RVW:fhm:np:t:uvw:";
+char *Destdir = NULL;
char *OverrideMachine = NULL;
char *Prefix = NULL;
char *View = NULL;
@@ -64,9 +65,10 @@ int Replace = 0;
static void
usage(void)
{
- (void) fprintf(stderr, "%s\n%s\n%s\n",
- "usage: pkg_add [-AfhILnRuVv] [-C config] [-K pkg_dbdir] [-m machine] [-p prefix]",
- " [-s verification-type] [-W viewbase] [-w view]",
+ (void) fprintf(stderr, "%s\n%s\n%s\n%s\n",
+ "usage: pkg_add [-AfhILnRuVv] [-C config] [-P destdir] [-K pkg_dbdir]",
+ " [-m machine] [-p prefix] [-s verification-type",
+ " [-W viewbase] [-w view]\n",
" [[ftp|http]://[user[:password]@]host[:port]][/path/]pkg-name ...");
exit(1);
}
@@ -87,6 +89,10 @@ main(int argc, char **argv)
case 'C':
config_file = optarg;
+ case 'P':
+ Destdir = optarg;
+ break;
+
case 'f':
Force = TRUE;
break;
diff --git a/pkgtools/pkg_install/files/add/perform.c b/pkgtools/pkg_install/files/add/perform.c
index b66686dbbad..b83e2d9db25 100644
--- a/pkgtools/pkg_install/files/add/perform.c
+++ b/pkgtools/pkg_install/files/add/perform.c
@@ -1,4 +1,4 @@
-/* $NetBSD: perform.c,v 1.70.4.11 2008/07/30 15:02:18 joerg Exp $ */
+/* $NetBSD: perform.c,v 1.70.4.12 2008/07/30 15:38:37 joerg Exp $ */
#if HAVE_CONFIG_H
#include "config.h"
#endif
@@ -6,7 +6,7 @@
#if HAVE_SYS_CDEFS_H
#include <sys/cdefs.h>
#endif
-__RCSID("$NetBSD: perform.c,v 1.70.4.11 2008/07/30 15:02:18 joerg Exp $");
+__RCSID("$NetBSD: perform.c,v 1.70.4.12 2008/07/30 15:38:37 joerg Exp $");
/*-
* Copyright (c) 2003 Grant Beattie <grant@NetBSD.org>
@@ -77,8 +77,10 @@ struct pkg_task {
char *pkgname;
const char *prefix;
+ char *install_prefix;
char *logdir;
+ char *install_logdir;
char *other_version;
package_t plist;
@@ -305,6 +307,13 @@ pkg_parse_plist(struct pkg_task *pkg)
} else
pkg->prefix = p->name;
+ if (Destdir != NULL) {
+ if (asprintf(&pkg->install_prefix, "%s/%s", Destdir,
+ pkg->prefix) == -1)
+ err(EXIT_FAILURE, "asprintf failed");
+ } else if ((pkg->install_prefix = strdup(pkg->prefix)) == NULL)
+ err(EXIT_FAILURE, "strdup failed");
+
return 0;
}
@@ -523,8 +532,8 @@ write_meta_data(struct pkg_task *pkg)
if (Fake)
return 0;
- if (mkdir_p(pkg->logdir)) {
- warn("Can't create pkgdb entry: %s", pkg->logdir);
+ if (mkdir_p(pkg->install_logdir)) {
+ warn("Can't create pkgdb entry: %s", pkg->install_logdir);
return -1;
}
@@ -533,7 +542,7 @@ write_meta_data(struct pkg_task *pkg)
descr->entry_offset);
if (*target == NULL)
continue;
- if (asprintf(&filename, "%s/%s", pkg->logdir,
+ if (asprintf(&filename, "%s/%s", pkg->install_logdir,
descr->entry_filename) == -1) {
warn("asprintf failed");
return -1;
@@ -619,13 +628,13 @@ extract_files(struct pkg_task *pkg)
if (Fake)
return 0;
- if (mkdir_p(pkg->prefix)) {
- warn("Can't create prefix: %s", pkg->prefix);
+ if (mkdir_p(pkg->install_prefix)) {
+ warn("Can't create prefix: %s", pkg->install_prefix);
return -1;
}
- if (chdir(pkg->prefix) == -1) {
- warn("Can't change into prefix: %s", pkg->prefix);
+ if (chdir(pkg->install_prefix) == -1) {
+ warn("Can't change into prefix: %s", pkg->install_prefix);
return -1;
}
@@ -868,6 +877,8 @@ run_install_script(struct pkg_task *pkg, const char *argument)
if (pkg->meta_data.meta_install == NULL || NoInstall)
return 0;
+ if (Destdir != NULL)
+ setenv(PKG_DESTDIR_VNAME, Destdir, 1);
setenv(PKG_PREFIX_VNAME, pkg->prefix, 1);
setenv(PKG_METADATA_DIR_VNAME, pkg->logdir, 1);
setenv(PKG_REFCOUNT_DBDIR_VNAME, pkgdb_refcount_dir(), 1);
@@ -882,8 +893,8 @@ run_install_script(struct pkg_task *pkg, const char *argument)
ret = 0;
- if (chdir(pkg->logdir) == -1) {
- warn("Can't change to %s", pkg->logdir);
+ if (chdir(pkg->install_logdir) == -1) {
+ warn("Can't change to %s", pkg->install_logdir);
ret = -1;
}
@@ -1123,13 +1134,15 @@ start_replacing(struct pkg_task *pkg)
return -1;
if (Verbose || Fake) {
- printf("%s/pkg_delete -K %s -p %s '%s'\n",
+ printf("%s/pkg_delete -K %s -p %s%s%s '%s'\n",
BINDIR, _pkgdb_getPKGDB_DIR(), pkg->prefix,
+ Destdir ? " -P ": "", Destdir ? Destdir : "",
pkg->other_version);
}
if (!Fake)
fexec(BINDIR "/pkg_delete", "-K", _pkgdb_getPKGDB_DIR(),
"-p", pkg->prefix,
+ Destdir ? "-P": "", Destdir ? Destdir : "",
pkg->other_version, NULL);
/* XXX Check return value and do what? */
@@ -1245,6 +1258,13 @@ pkg_do(const char *pkgpath, int mark_automatic)
err(EXIT_FAILURE, "asprintf failed");
}
+ if (Destdir != NULL) {
+ if (asprintf(&pkg->install_logdir, "%s/%s", Destdir, pkg->logdir) == -1)
+ err(EXIT_FAILURE, "asprintf failed");
+ _pkgdb_setPKGDB_DIR(dirname_of(pkg->install_logdir));
+ } else if ((pkg->install_logdir = strdup(pkg->logdir)) == NULL)
+ err(EXIT_FAILURE, "strdup failed");
+
if (NoRecord && !Fake) {
const char *tmpdir;
@@ -1252,11 +1272,11 @@ pkg_do(const char *pkgpath, int mark_automatic)
if (tmpdir == NULL)
tmpdir = "/tmp";
- free(pkg->logdir);
- if (asprintf(&pkg->logdir, "%s/pkg_install.XXXXXX", tmpdir) == -1)
+ free(pkg->install_logdir);
+ if (asprintf(&pkg->install_logdir, "%s/pkg_install.XXXXXX", tmpdir) == -1)
err(EXIT_FAILURE, "asprintf failed");
/* XXX pkg_add -u... */
- if (mkdtemp(pkg->logdir) == NULL) {
+ if (mkdtemp(pkg->install_logdir) == NULL) {
warn("mkdtemp failed");
goto clean_memory;
}
@@ -1326,7 +1346,7 @@ pkg_do(const char *pkgpath, int mark_automatic)
pkg_register_depends(pkg);
if (Verbose)
- printf("Package %s registered in %s\n", pkg->pkgname, pkg->logdir);
+ printf("Package %s registered in %s\n", pkg->pkgname, pkg->install_logdir);
if (pkg->meta_data.meta_display != NULL)
fputs(pkg->meta_data.meta_display, stdout);
@@ -1343,19 +1363,23 @@ nuke_pkg:
pkg->other_version, pkg->pkgname);
warnx("Remember to run pkg_admin rebuild-tree after fixing this.");
}
- delete_package(FALSE, FALSE, &pkg->plist, FALSE);
+ delete_package(FALSE, FALSE, &pkg->plist, FALSE, Destdir);
}
nuke_pkgdb:
if (!Fake) {
- (void) fexec(REMOVE_CMD, "-fr", pkg->logdir, (void *)NULL);
+ (void) fexec(REMOVE_CMD, "-fr", pkg->install_logdir, (void *)NULL);
+ free(pkg->install_logdir);
free(pkg->logdir);
+ pkg->install_logdir = NULL;
pkg->logdir = NULL;
}
clean_memory:
if (pkg->logdir != NULL && NoRecord && !Fake)
- (void) fexec(REMOVE_CMD, "-fr", pkg->logdir, (void *)NULL);
+ (void) fexec(REMOVE_CMD, "-fr", pkg->install_logdir, (void *)NULL);
+ free(pkg->install_prefix);
+ free(pkg->install_logdir);
free(pkg->logdir);
free_buildinfo(pkg);
free_plist(&pkg->plist);
diff --git a/pkgtools/pkg_install/files/add/pkg_add.1 b/pkgtools/pkg_install/files/add/pkg_add.1
index a6e0804ba0b..bf92940dd15 100644
--- a/pkgtools/pkg_install/files/add/pkg_add.1
+++ b/pkgtools/pkg_install/files/add/pkg_add.1
@@ -1,4 +1,4 @@
-.\" $NetBSD: pkg_add.1,v 1.28.6.7 2008/07/27 22:36:19 joerg Exp $
+.\" $NetBSD: pkg_add.1,v 1.28.6.8 2008/07/30 15:38:37 joerg Exp $
.\"
.\" FreeBSD install - a package for the installation and maintenance
.\" of non-core utilities.
@@ -17,7 +17,7 @@
.\"
.\" @(#)pkg_add.1
.\"
-.Dd July 28, 2008
+.Dd July 30, 2008
.Dt PKG_ADD 1
.Os
.Sh NAME
@@ -28,6 +28,7 @@
.Op Fl AfILnRuVv
.Op Fl K Ar pkg_dbdir
.Op Fl m Ar machine
+.Op Fl P Ar destdir
.Op Fl p Ar prefix
.Op Fl W Ar viewbase
.Op Fl w Ar view
@@ -141,6 +142,11 @@ Override the machine architecture returned by uname with
.It Fl n
Don't actually install a package, just report the steps that
would be taken if it was.
+.It Fl p Ar destdir
+Prefix all file and directory names with
+.Ar destdir .
+For packages without install scripts this has the same behavior as
+using chroot.
.It Fl p Ar prefix
Set
.Ar prefix
@@ -379,6 +385,13 @@ meta-data files, and with the
.Ev PKG_REFCOUNT_DBDIR
environment variable set to the location of the package reference counts
database directory.
+If the
+.Fl P
+flag was given to
+.Nm ,
+.Ev PKG_DESTDIR
+will be set to
+.Ar destdir .
.Sh ENVIRONMENT
.Bl -tag -width PKG_TMPDIR
.It Ev LOCALBASE
diff --git a/pkgtools/pkg_install/files/add/pkg_add.cat1 b/pkgtools/pkg_install/files/add/pkg_add.cat1
index b09737bff9b..f47432b6ec7 100644
--- a/pkgtools/pkg_install/files/add/pkg_add.cat1
+++ b/pkgtools/pkg_install/files/add/pkg_add.cat1
@@ -5,7 +5,7 @@ NNAAMMEE
tributions
SSYYNNOOPPSSIISS
- ppkkgg__aadddd [--AAffIILLnnRRuuVVvv] [--KK _p_k_g___d_b_d_i_r] [--mm _m_a_c_h_i_n_e] [--pp _p_r_e_f_i_x]
+ ppkkgg__aadddd [--AAffIILLnnRRuuVVvv] [--KK _p_k_g___d_b_d_i_r] [--mm _m_a_c_h_i_n_e] [--PP _d_e_s_t_d_i_r] [--pp _p_r_e_f_i_x]
[--WW _v_i_e_w_b_a_s_e] [--ww _v_i_e_w]
[[ftp|http]://[_u_s_e_r[:_p_a_s_s_w_o_r_d_]@]_h_o_s_t[:_p_o_r_t]][/_p_a_t_h_/]pkg-name ...
@@ -77,6 +77,11 @@ OOPPTTIIOONNSS
--nn Don't actually install a package, just report the steps that
would be taken if it was.
+ --pp _d_e_s_t_d_i_r
+ Prefix all file and directory names with _d_e_s_t_d_i_r. For packages
+ without install scripts this has the same behavior as using
+ chroot.
+
--pp _p_r_e_f_i_x
Set _p_r_e_f_i_x as the directory in which to extract files from a
package. If a package has set its default directory, it will be
@@ -219,7 +224,8 @@ TTEECCHHNNIICCAALL DDEETTAAIILLSS
change it with the --pp flag to ppkkgg__aadddd. The scripts are also called with
the PKG_METADATA_DIR environment variable set to the location of the _+_*
meta-data files, and with the PKG_REFCOUNT_DBDIR environment variable set
- to the location of the package reference counts database directory.
+ to the location of the package reference counts database directory. If
+ the --PP flag was given to ppkkgg__aadddd, PKG_DESTDIR will be set to _d_e_s_t_d_i_r.
EENNVVIIRROONNMMEENNTT
LOCALBASE This is the location of the _v_i_e_w_b_a_s_e directory in which all
@@ -310,4 +316,4 @@ BBUUGGSS
Sure to be others.
-NetBSD 4.0 July 28, 2008 NetBSD 4.0
+NetBSD 4.0 July 30, 2008 NetBSD 4.0
diff --git a/pkgtools/pkg_install/files/delete/delete.h b/pkgtools/pkg_install/files/delete/delete.h
index 116025d8557..f00d13da72f 100644
--- a/pkgtools/pkg_install/files/delete/delete.h
+++ b/pkgtools/pkg_install/files/delete/delete.h
@@ -1,4 +1,4 @@
-/* $NetBSD: delete.h,v 1.5 2007/07/30 07:16:21 joerg Exp $ */
+/* $NetBSD: delete.h,v 1.5.8.1 2008/07/30 15:38:37 joerg Exp $ */
/* from FreeBSD Id: delete.h,v 1.4 1997/02/22 16:09:35 peter Exp */
@@ -25,6 +25,7 @@
#ifndef _INST_DELETE_H_INCLUDE
#define _INST_DELETE_H_INCLUDE
+extern char *Destdir;
extern char *Prefix;
extern char *ProgramPath;
extern Boolean NoDeleteFiles;
diff --git a/pkgtools/pkg_install/files/delete/main.c b/pkgtools/pkg_install/files/delete/main.c
index 94a3c0bbe70..26e44c46bd1 100644
--- a/pkgtools/pkg_install/files/delete/main.c
+++ b/pkgtools/pkg_install/files/delete/main.c
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.21 2007/09/08 09:58:14 rillig Exp $ */
+/* $NetBSD: main.c,v 1.21.8.1 2008/07/30 15:38:37 joerg Exp $ */
#if HAVE_CONFIG_H
#include "config.h"
@@ -11,7 +11,7 @@
#if 0
static char *rcsid = "from FreeBSD Id: main.c,v 1.11 1997/10/08 07:46:48 charnier Exp";
#else
-__RCSID("$NetBSD: main.c,v 1.21 2007/09/08 09:58:14 rillig Exp $");
+__RCSID("$NetBSD: main.c,v 1.21.8.1 2008/07/30 15:38:37 joerg Exp $");
#endif
#endif
@@ -42,8 +42,10 @@ __RCSID("$NetBSD: main.c,v 1.21 2007/09/08 09:58:14 rillig Exp $");
#include "lib.h"
#include "delete.h"
-static char Options[] = "DdFfhK:NnOp:RrVv";
+static char Options[] = "DdFfhK:NnOp:P:RrVv";
+char *Destdir = NULL;
+char *Pkgdb = NULL;
char *Prefix = NULL;
char *ProgramPath = NULL;
Boolean NoDeleteFiles = FALSE;
@@ -58,7 +60,7 @@ lpkg_head_t pkgs;
static void
usage(void)
{
- fprintf(stderr, "usage: pkg_delete [-DdFfNnORrVv] [-K pkg_dbdir] [-p prefix] pkg-name ...\n");
+ fprintf(stderr, "usage: pkg_delete [-DdFfNnORrVv] [-K pkg_dbdir] [-P destdir] [-p prefix] pkg-name ...\n");
exit(1);
}
@@ -92,7 +94,8 @@ main(int argc, char **argv)
break;
case 'K':
- _pkgdb_setPKGDB_DIR(optarg);
+ if ((Pkgdb = strdup(optarg)) == NULL)
+ err(EXIT_FAILURE, "strdup failed");
break;
case 'N':
@@ -109,6 +112,10 @@ main(int argc, char **argv)
OnlyDeleteFromPkgDB = TRUE;
break;
+ case 'P':
+ Destdir = optarg;
+ break;
+
case 'p':
Prefix = optarg;
break;
@@ -141,6 +148,20 @@ main(int argc, char **argv)
TAILQ_INIT(&pkgs);
+ if (Pkgdb == NULL)
+ Pkgdb = strdup(_pkgdb_getPKGDB_DIR());
+
+ if (Destdir != NULL) {
+ char *pkgdbdir;
+
+ if (asprintf(&pkgdbdir, "%s/%s", Destdir, Pkgdb) == -1)
+ err(EXIT_FAILURE, "asprintf failed");
+ _pkgdb_setPKGDB_DIR(pkgdbdir);
+ free(pkgdbdir);
+ } else {
+ _pkgdb_setPKGDB_DIR(Pkgdb);
+ }
+
/* Get all the remaining package names, if any */
if (File2Pkg && !pkgdb_open(ReadOnly)) {
err(EXIT_FAILURE, "cannot open pkgdb");
@@ -167,11 +188,8 @@ main(int argc, char **argv)
errx(EXIT_FAILURE, "error expanding '%s' ('%s' nonexistent?)", *argv, _pkgdb_getPKGDB_DIR());
}
} else {
- const char *dbdir;
-
- dbdir = _pkgdb_getPKGDB_DIR();
- if (**argv == '/' && strncmp(*argv, dbdir, strlen(dbdir)) == 0) {
- *argv += strlen(dbdir) + 1;
+ if (**argv == '/' && strncmp(*argv, Pkgdb, strlen(Pkgdb)) == 0) {
+ *argv += strlen(Pkgdb) + 1;
if ((*argv)[strlen(*argv) - 1] == '/') {
(*argv)[strlen(*argv) - 1] = 0;
}
diff --git a/pkgtools/pkg_install/files/delete/perform.c b/pkgtools/pkg_install/files/delete/perform.c
index 95cf9d34146..0f6a6f19ea4 100644
--- a/pkgtools/pkg_install/files/delete/perform.c
+++ b/pkgtools/pkg_install/files/delete/perform.c
@@ -1,4 +1,4 @@
-/* $NetBSD: perform.c,v 1.23 2008/04/23 20:54:39 joerg Exp $ */
+/* $NetBSD: perform.c,v 1.23.2.1 2008/07/30 15:38:37 joerg Exp $ */
#if HAVE_CONFIG_H
#include "config.h"
@@ -11,7 +11,7 @@
#if 0
static const char *rcsid = "from FreeBSD Id: perform.c,v 1.15 1997/10/13 15:03:52 jkh Exp";
#else
-__RCSID("$NetBSD: perform.c,v 1.23 2008/04/23 20:54:39 joerg Exp $");
+__RCSID("$NetBSD: perform.c,v 1.23.2.1 2008/07/30 15:38:37 joerg Exp $");
#endif
#endif
@@ -753,6 +753,8 @@ pkg_do(char *pkg)
warnx("package '%s' doesn't have a prefix", pkg);
return 1;
}
+ if (Destdir != NULL)
+ setenv(PKG_DESTDIR_VNAME, Destdir, 1);
setenv(PKG_PREFIX_VNAME, p->name, 1);
setenv(PKG_METADATA_DIR_VNAME, LogDir, 1);
/*
@@ -786,7 +788,7 @@ pkg_do(char *pkg)
}
if (!Fake) {
/* Some packages aren't packed right, so we need to just ignore delete_package()'s status. Ugh! :-( */
- if (delete_package(FALSE, CleanDirs, &Plist, NoDeleteFiles) == FAIL)
+ if (delete_package(FALSE, CleanDirs, &Plist, NoDeleteFiles, Destdir) == FAIL)
warnx("couldn't entirely delete package `%s'\n", pkg);
}
else { /* Fake means Verbose */
diff --git a/pkgtools/pkg_install/files/delete/pkg_delete.1 b/pkgtools/pkg_install/files/delete/pkg_delete.1
index b3e0698edf0..2c3048109b7 100644
--- a/pkgtools/pkg_install/files/delete/pkg_delete.1
+++ b/pkgtools/pkg_install/files/delete/pkg_delete.1
@@ -1,4 +1,4 @@
-.\" $NetBSD: pkg_delete.1,v 1.16 2007/08/10 22:29:49 gdt Exp $
+.\" $NetBSD: pkg_delete.1,v 1.16.8.1 2008/07/30 15:38:37 joerg Exp $
.\"
.\" FreeBSD install - a package for the installation and maintenance
.\" of non-core utilities.
@@ -17,7 +17,7 @@
.\"
.\" from FreeBSD: @(#)pkg_delete.1
.\"
-.Dd March 2, 2007
+.Dd July 30, 2008
.Dt PKG_DELETE 1
.Os
.Sh NAME
@@ -30,6 +30,7 @@
.Op Fl K Ar pkg_dbdir
.Ek
.Bk -words
+.Op Fl P Ar destdir
.Op Fl p Ar prefix
.Ek
.Ar pkg-name ...
@@ -133,6 +134,11 @@ would be taken if it were.
.It Fl O
Only delete the package's entries from the package database, do not
touch the package or its files itself.
+.It Fl p Ar destdir
+Prefix all file and directory names with
+.Ar destdir .
+For packages without install scripts this has the same behavior as
+using chroot.
.It Fl p Ar prefix
Set
.Ar prefix
@@ -256,6 +262,13 @@ meta-data files, and with the
.Ev PKG_REFCOUNT_DBDIR
environment variable set to the location of the package reference counts
database directory.
+If the
+.Fl P
+flag was given to
+.Nm ,
+.Ev PKG_DESTDIR
+will be set to
+.Ar destdir .
.Sh ENVIRONMENT
.Bl -tag -width PKG_DBDIR
.It Ev PKG_DBDIR
diff --git a/pkgtools/pkg_install/files/delete/pkg_delete.cat1 b/pkgtools/pkg_install/files/delete/pkg_delete.cat1
index 91c2c00298f..309432c83fc 100644
--- a/pkgtools/pkg_install/files/delete/pkg_delete.cat1
+++ b/pkgtools/pkg_install/files/delete/pkg_delete.cat1
@@ -5,7 +5,8 @@ NNAAMMEE
age distributions
SSYYNNOOPPSSIISS
- ppkkgg__ddeelleettee [--DDddFFffNNnnOORRrrVVvv] [--KK _p_k_g___d_b_d_i_r] [--pp _p_r_e_f_i_x] _p_k_g_-_n_a_m_e _._._.
+ ppkkgg__ddeelleettee [--DDddFFffNNnnOORRrrVVvv] [--KK _p_k_g___d_b_d_i_r] [--PP _d_e_s_t_d_i_r] [--pp _p_r_e_f_i_x]
+ _p_k_g_-_n_a_m_e _._._.
DDEESSCCRRIIPPTTIIOONN
The ppkkgg__ddeelleettee command is used to delete packages that have been previ-
@@ -72,6 +73,11 @@ OOPPTTIIOONNSS
--OO Only delete the package's entries from the package database, do
not touch the package or its files itself.
+ --pp _d_e_s_t_d_i_r
+ Prefix all file and directory names with _d_e_s_t_d_i_r. For packages
+ without install scripts this has the same behavior as using
+ chroot.
+
--pp _p_r_e_f_i_x
Set _p_r_e_f_i_x as the directory in which to delete files from any
installed packages which do not explicitly set theirs. For most
@@ -136,7 +142,8 @@ TTEECCHHNNIICCAALL DDEETTAAIILLSS
The scripts are also called with the PKG_METADATA_DIR environment vari-
able set to the location of the _+_* meta-data files, and with the
PKG_REFCOUNT_DBDIR environment variable set to the location of the pack-
- age reference counts database directory.
+ age reference counts database directory. If the --PP flag was given to
+ ppkkgg__ddeelleettee, PKG_DESTDIR will be set to _d_e_s_t_d_i_r.
EENNVVIIRROONNMMEENNTT
PKG_DBDIR If the --KK flag isn't given, then PKG_DBDIR is the location of
@@ -162,4 +169,4 @@ AAUUTTHHOORRSS
NetBSD wildcard dependency processing, pkgdb, recursive "down"
delete, etc.
-NetBSD 4.0 March 2, 2007 NetBSD 4.0
+NetBSD 4.0 July 30, 2008 NetBSD 4.0
diff --git a/pkgtools/pkg_install/files/lib/lib.h b/pkgtools/pkg_install/files/lib/lib.h
index 4eaa9d9e4c9..ab8616d7dfd 100644
--- a/pkgtools/pkg_install/files/lib/lib.h
+++ b/pkgtools/pkg_install/files/lib/lib.h
@@ -1,4 +1,4 @@
-/* $NetBSD: lib.h,v 1.42.2.8 2008/07/30 15:02:18 joerg Exp $ */
+/* $NetBSD: lib.h,v 1.42.2.9 2008/07/30 15:38:37 joerg Exp $ */
/* from FreeBSD Id: lib.h,v 1.25 1997/10/08 07:48:03 charnier Exp */
@@ -132,6 +132,9 @@ enum {
/* The name of the "prefix" environment variable given to scripts */
#define PKG_PREFIX_VNAME "PKG_PREFIX"
+/* The name of the "destdir" environment variable given to scripts */
+#define PKG_DESTDIR_VNAME "PKG_DESTDIR"
+
/*
* The name of the "metadatadir" environment variable given to scripts.
* This variable holds the location of the +-files for this package.
@@ -337,7 +340,7 @@ void write_plist(package_t *, FILE *, char *);
void stringify_plist(package_t *, char **, size_t *, const char *);
void parse_plist(package_t *, const char *);
void read_plist(package_t *, FILE *);
-int delete_package(Boolean, Boolean, package_t *, Boolean);
+int delete_package(Boolean, Boolean, package_t *, Boolean, const char *);
/* Package Database */
int pkgdb_open(int);
diff --git a/pkgtools/pkg_install/files/lib/plist.c b/pkgtools/pkg_install/files/lib/plist.c
index dfdbe0b8394..fb603da1e74 100644
--- a/pkgtools/pkg_install/files/lib/plist.c
+++ b/pkgtools/pkg_install/files/lib/plist.c
@@ -1,4 +1,4 @@
-/* $NetBSD: plist.c,v 1.17.4.3 2008/05/23 15:51:22 joerg Exp $ */
+/* $NetBSD: plist.c,v 1.17.4.4 2008/07/30 15:38:37 joerg Exp $ */
#if HAVE_CONFIG_H
#include "config.h"
@@ -11,7 +11,7 @@
#if 0
static const char *rcsid = "from FreeBSD Id: plist.c,v 1.24 1997/10/08 07:48:15 charnier Exp";
#else
-__RCSID("$NetBSD: plist.c,v 1.17.4.3 2008/05/23 15:51:22 joerg Exp $");
+__RCSID("$NetBSD: plist.c,v 1.17.4.4 2008/07/30 15:38:37 joerg Exp $");
#endif
#endif
@@ -509,7 +509,8 @@ do { \
* run it too in cases of failure.
*/
int
-delete_package(Boolean ign_err, Boolean nukedirs, package_t *pkg, Boolean NoDeleteFiles)
+delete_package(Boolean ign_err, Boolean nukedirs, package_t *pkg,
+ Boolean NoDeleteFiles, const char *destdir)
{
plist_t *p;
char *Where = ".", *last_file = "";
@@ -552,7 +553,9 @@ delete_package(Boolean ign_err, Boolean nukedirs, package_t *pkg, Boolean NoDele
case PLIST_FILE:
last_file = p->name;
- (void) snprintf(tmp, sizeof(tmp), "%s/%s", Where, p->name);
+ (void) snprintf(tmp, sizeof(tmp), "%s%s%s/%s",
+ destdir ? destdir : "", destdir ? "/" : "",
+ Where, p->name);
if (isdir(tmp)) {
warnx("attempting to delete directory `%s' as a file\n"
"this packing list is incorrect - ignoring delete request", tmp);
@@ -652,7 +655,9 @@ delete_package(Boolean ign_err, Boolean nukedirs, package_t *pkg, Boolean NoDele
if (NoDeleteFiles)
break;
- (void) snprintf(tmp, sizeof(tmp), "%s/%s", Where, p->name);
+ (void) snprintf(tmp, sizeof(tmp), "%s%s%s/%s",
+ destdir ? destdir : "", destdir ? "/" : "",
+ Where, p->name);
if (fexists(tmp)) {
if (!isdir(tmp)) {
warnx("cannot remove `%s' as a directory\n"
diff --git a/pkgtools/pkg_install/files/lib/version.h b/pkgtools/pkg_install/files/lib/version.h
index aa232e579c4..708616eeb46 100644
--- a/pkgtools/pkg_install/files/lib/version.h
+++ b/pkgtools/pkg_install/files/lib/version.h
@@ -1,4 +1,4 @@
-/* $NetBSD: version.h,v 1.102.2.10 2008/07/27 16:22:53 joerg Exp $ */
+/* $NetBSD: version.h,v 1.102.2.11 2008/07/30 15:38:37 joerg Exp $ */
/*
* Copyright (c) 2001 Thomas Klausner. All rights reserved.
@@ -27,6 +27,6 @@
#ifndef _INST_LIB_VERSION_H_
#define _INST_LIB_VERSION_H_
-#define PKGTOOLS_VERSION "20080727"
+#define PKGTOOLS_VERSION "20080730"
#endif /* _INST_LIB_VERSION_H_ */