Merge src/usr.sbin/pkg_install on the pkgviews branch into the HEAD by
running: cd src/usr.sbin/pkg_install cvs update -Pd -A cvs update -Pd -j pkgviews-base -j pkgviews
This commit is contained in:
parent
1e69032f26
commit
1a174cde55
|
@ -1,6 +1,6 @@
|
|||
# $NetBSD: Makefile,v 1.5 2001/01/09 03:13:43 lukem Exp $
|
||||
# $NetBSD: Makefile,v 1.6 2003/09/02 07:34:47 jlam Exp $
|
||||
# Original from FreeBSD, no rcs id.
|
||||
|
||||
SUBDIR=lib .WAIT add admin create delete info
|
||||
SUBDIR=lib .WAIT add admin create delete info view
|
||||
|
||||
.include <bsd.subdir.mk>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: Makefile.inc,v 1.23 2002/10/26 14:43:44 hubertf Exp $
|
||||
# $NetBSD: Makefile.inc,v 1.24 2003/09/02 07:34:47 jlam Exp $
|
||||
# Original from FreeBSD, no rcs id.
|
||||
|
||||
.include <bsd.own.mk>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: README,v 1.6 2002/02/21 14:21:49 agc Exp $
|
||||
# $NetBSD: README,v 1.7 2003/09/02 07:34:48 jlam Exp $
|
||||
# Original from FreeBSD, no rcs id.
|
||||
|
||||
This is the pkg_install suite of tools for doing maintainance of
|
||||
|
@ -11,8 +11,8 @@ FreeBSD again by Jordan, who then proceeded to add another couple
|
|||
of dozen features on top. Whee! :-)
|
||||
|
||||
In another round of enhancements, NetBSD changes were added by
|
||||
Alistair Crooks and Hubert Feyrer, Thorsten Frueauf and Christian E.
|
||||
Hopps.
|
||||
Alistair Crooks, Hubert Feyrer, Thorsten Frueauf, Christian E. Hopps,
|
||||
and Johnny Lam.
|
||||
|
||||
When making snapshots, please modify PKGTOOLS_VERSION in lib/version.h
|
||||
to that day's date.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: add.h,v 1.5 2000/06/17 11:30:49 tron Exp $ */
|
||||
/* $NetBSD: add.h,v 1.6 2003/09/02 07:34:49 jlam Exp $ */
|
||||
|
||||
/* from FreeBSD Id: add.h,v 1.8 1997/02/22 16:09:15 peter Exp */
|
||||
|
||||
|
@ -30,6 +30,9 @@ typedef enum {
|
|||
} add_mode_t;
|
||||
|
||||
extern char *Prefix;
|
||||
extern char *View;
|
||||
extern char *Viewbase;
|
||||
extern Boolean NoView;
|
||||
extern Boolean NoInstall;
|
||||
extern Boolean NoRecord;
|
||||
extern Boolean Force;
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: extract.c,v 1.30 2003/07/14 06:00:44 itojun Exp $ */
|
||||
/* $NetBSD: extract.c,v 1.31 2003/09/02 07:34:49 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static const char *rcsid = "FreeBSD - Id: extract.c,v 1.17 1997/10/08 07:45:35 charnier Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: extract.c,v 1.30 2003/07/14 06:00:44 itojun Exp $");
|
||||
__RCSID("$NetBSD: extract.c,v 1.31 2003/09/02 07:34:49 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: futil.c,v 1.11 2003/08/25 10:35:28 tron Exp $ */
|
||||
/* $NetBSD: futil.c,v 1.12 2003/09/02 07:34:49 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static const char *rcsid = "from FreeBSD Id: futil.c,v 1.7 1997/10/08 07:45:39 charnier Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: futil.c,v 1.11 2003/08/25 10:35:28 tron Exp $");
|
||||
__RCSID("$NetBSD: futil.c,v 1.12 2003/09/02 07:34:49 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: main.c,v 1.30 2003/07/14 06:17:54 itojun Exp $ */
|
||||
/* $NetBSD: main.c,v 1.31 2003/09/02 07:34:49 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#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.30 2003/07/14 06:17:54 itojun Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.31 2003/09/02 07:34:49 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -37,9 +37,12 @@ __RCSID("$NetBSD: main.c,v 1.30 2003/07/14 06:17:54 itojun Exp $");
|
|||
#include "add.h"
|
||||
#include "verify.h"
|
||||
|
||||
static char Options[] = "IMRSVfhnp:s:t:uv";
|
||||
static char Options[] = "IK:LMRSVW:fhnp:s:t:uvw:";
|
||||
|
||||
char *Prefix = NULL;
|
||||
char *View = NULL;
|
||||
char *Viewbase = NULL;
|
||||
Boolean NoView = FALSE;
|
||||
Boolean NoInstall = FALSE;
|
||||
Boolean NoRecord = FALSE;
|
||||
|
||||
|
@ -55,9 +58,10 @@ Boolean Replace = FALSE;
|
|||
static void
|
||||
usage(void)
|
||||
{
|
||||
(void) fprintf(stderr, "%s\n%s\n",
|
||||
"usage: pkg_add [-hVvInfRMSu] [-t template] [-p prefix]",
|
||||
" [-s verification-type] pkg-name [pkg-name ...]");
|
||||
(void) fprintf(stderr, "%s\n%s\n%s\n",
|
||||
"usage: pkg_add [-fhILMnRSuVv] [-p prefix] [-s verification-type]",
|
||||
" [-t template] [-W viewbase] [-w view]",
|
||||
" pkg-name [pkg-name ...]");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
@ -72,7 +76,32 @@ main(int argc, char **argv)
|
|||
setprogname(argv[0]);
|
||||
while ((ch = getopt(argc, argv, Options)) != -1) {
|
||||
switch (ch) {
|
||||
case 'v':
|
||||
case 'f':
|
||||
Force = TRUE;
|
||||
break;
|
||||
|
||||
case 'I':
|
||||
NoInstall = TRUE;
|
||||
break;
|
||||
|
||||
case 'K':
|
||||
_pkgdb_setPKGDB_DIR(optarg);
|
||||
break;
|
||||
|
||||
case 'L':
|
||||
NoView = TRUE;
|
||||
break;
|
||||
|
||||
case 'M':
|
||||
AddMode = MASTER;
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
NoRecord = TRUE;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
Fake = TRUE;
|
||||
Verbose = TRUE;
|
||||
break;
|
||||
|
||||
|
@ -80,21 +109,8 @@ main(int argc, char **argv)
|
|||
Prefix = optarg;
|
||||
break;
|
||||
|
||||
case 'I':
|
||||
NoInstall = TRUE;
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
NoRecord = TRUE;
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
Force = TRUE;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
Fake = TRUE;
|
||||
Verbose = TRUE;
|
||||
case 'S':
|
||||
AddMode = SLAVE;
|
||||
break;
|
||||
|
||||
case 's':
|
||||
|
@ -105,21 +121,26 @@ main(int argc, char **argv)
|
|||
strlcpy(FirstPen, optarg, sizeof(FirstPen));
|
||||
break;
|
||||
|
||||
case 'S':
|
||||
AddMode = SLAVE;
|
||||
break;
|
||||
|
||||
case 'M':
|
||||
AddMode = MASTER;
|
||||
case 'u':
|
||||
Replace = 1;
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
show_version();
|
||||
/* NOTREACHED */
|
||||
|
||||
case 'u':
|
||||
Replace = 1;
|
||||
case 'v':
|
||||
Verbose = TRUE;
|
||||
break;
|
||||
|
||||
case 'W':
|
||||
Viewbase = optarg;
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
View = optarg;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
case '?':
|
||||
default:
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: perform.c,v 1.85 2003/08/25 10:35:28 tron Exp $ */
|
||||
/* $NetBSD: perform.c,v 1.86 2003/09/02 07:34:50 jlam 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.85 2003/08/25 10:35:28 tron Exp $");
|
||||
__RCSID("$NetBSD: perform.c,v 1.86 2003/09/02 07:34:50 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -37,7 +37,6 @@ __RCSID("$NetBSD: perform.c,v 1.85 2003/08/25 10:35:28 tron Exp $");
|
|||
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
static char LogDir[FILENAME_MAX];
|
||||
static int zapLogDir; /* Should we delete LogDir? */
|
||||
|
@ -73,9 +72,14 @@ installprereq(const char *name, int *errc)
|
|||
if (Verbose)
|
||||
printf("Loading it from %s.\n", name);
|
||||
path_setenv("PKG_PATH");
|
||||
if (vsystem("%s/pkg_add -s %s %s%s%s %s%s",
|
||||
if (vsystem("%s/pkg_add -s %s %s%s%s %s%s %s%s%s %s%s",
|
||||
BINDIR,
|
||||
get_verification(),
|
||||
NoView ? "-L " : "",
|
||||
View ? "-w " : "",
|
||||
View ? View : "",
|
||||
Viewbase ? "-W " : "",
|
||||
Viewbase ? Viewbase : "",
|
||||
Force ? "-f " : "",
|
||||
Prefix ? "-p " : "",
|
||||
Prefix ? Prefix : "",
|
||||
|
@ -105,7 +109,7 @@ pkg_do(const char *pkg)
|
|||
char replace_via[FILENAME_MAX];
|
||||
char replace_to[FILENAME_MAX];
|
||||
int replacing = 0;
|
||||
char *where_to, *tmp, *extract;
|
||||
char *where_to, *extract;
|
||||
char *dbdir;
|
||||
const char *exact;
|
||||
FILE *cfile;
|
||||
|
@ -114,22 +118,13 @@ pkg_do(const char *pkg)
|
|||
struct stat sb;
|
||||
int inPlace;
|
||||
int rc;
|
||||
Boolean is_depoted_pkg = FALSE;
|
||||
|
||||
errc = 0;
|
||||
zapLogDir = 0;
|
||||
LogDir[0] = '\0';
|
||||
strlcpy(playpen, FirstPen, sizeof(playpen));
|
||||
inPlace = 0;
|
||||
dbdir = (tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR;
|
||||
|
||||
/* make sure dbdir actually exists! */
|
||||
if (!(isdir(dbdir) || islinktodir(dbdir))) {
|
||||
if (fexec("mkdir", "-m", "755", "-p", dbdir, NULL)) {
|
||||
errx(EXIT_FAILURE,
|
||||
"Database-dir %s cannot be generated, aborting.",
|
||||
dbdir);
|
||||
}
|
||||
}
|
||||
|
||||
/* Are we coming in for a second pass, everything already extracted?
|
||||
* (Slave mode) */
|
||||
|
@ -167,8 +162,7 @@ pkg_do(const char *pkg)
|
|||
warnx("Package %s will not be extracted", pkg);
|
||||
goto bomb;
|
||||
}
|
||||
}
|
||||
else { /* local */
|
||||
} else { /* local */
|
||||
if (!IS_STDIN(pkg)) {
|
||||
/* not stdin */
|
||||
if (!ispkgpattern(pkg)) {
|
||||
|
@ -286,8 +280,33 @@ pkg_do(const char *pkg)
|
|||
/* Protect against old packages with bogus @name fields */
|
||||
PkgName = (p = find_plist(&Plist, PLIST_NAME)) ? p->name : "anonymous";
|
||||
|
||||
/* See if this package (exact version) is already registered */
|
||||
if (fexists(VIEWS_FNAME))
|
||||
is_depoted_pkg = TRUE;
|
||||
|
||||
dbdir = _pkgdb_getPKGDB_DIR();
|
||||
(void) snprintf(LogDir, sizeof(LogDir), "%s/%s", dbdir, PkgName);
|
||||
|
||||
/* check if the dbdir is wrong because this is a depoted package */
|
||||
if (is_depoted_pkg) {
|
||||
if ((p = find_plist(&Plist, PLIST_CWD))) {
|
||||
if (strcmp(p->name, LogDir) != 0) {
|
||||
warnx("%s is not the depot directory for %s.",
|
||||
dbdir, PkgName);
|
||||
goto success;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* make sure dbdir actually exists! */
|
||||
if (!(isdir(dbdir) || islinktodir(dbdir))) {
|
||||
if (fexec("mkdir", "-m", "755", "-p", dbdir, NULL)) {
|
||||
errx(EXIT_FAILURE,
|
||||
"Database-dir %s cannot be generated, aborting.",
|
||||
dbdir);
|
||||
}
|
||||
}
|
||||
|
||||
/* See if this package (exact version) is already registered */
|
||||
if ((isdir(LogDir) || islinktodir(LogDir)) && !Force) {
|
||||
warnx("package `%s' already recorded as installed", PkgName);
|
||||
goto success; /* close enough for government work */
|
||||
|
@ -426,9 +445,16 @@ ignore_replace_depends_check:
|
|||
replacing = 1;
|
||||
}
|
||||
|
||||
if (Verbose)
|
||||
printf("pkg_delete '%s'\n", installed);
|
||||
(void) fexec("pkg_delete", installed, NULL);
|
||||
if (Verbose) {
|
||||
printf("%s/pkg_delete -K %s '%s'\n",
|
||||
BINDIR,
|
||||
dbdir,
|
||||
installed);
|
||||
}
|
||||
vsystem("%s/pkg_delete -K %s '%s'\n",
|
||||
BINDIR,
|
||||
dbdir,
|
||||
installed);
|
||||
|
||||
} else {
|
||||
warnx("other version '%s' already installed", installed);
|
||||
|
@ -448,7 +474,6 @@ ignore_replace_depends_check:
|
|||
continue;
|
||||
if (Verbose)
|
||||
printf("Package `%s' conflicts with `%s'.\n", PkgName, p->name);
|
||||
|
||||
if (findmatchingname(dbdir, p->name, note_whats_installed, installed) > 0) {
|
||||
warnx("Conflicting package `%s'installed, please use\n"
|
||||
"\t\"pkg_delete %s\" first to remove it!", installed, installed);
|
||||
|
@ -680,6 +705,10 @@ ignore_replace_depends_check:
|
|||
move_file(".", DISPLAY_FNAME, LogDir);
|
||||
if (fexists(PRESERVE_FNAME))
|
||||
move_file(".", PRESERVE_FNAME, LogDir);
|
||||
if (fexists(VIEWS_FNAME)) {
|
||||
is_depoted_pkg = TRUE;
|
||||
move_file(".", VIEWS_FNAME, LogDir);
|
||||
}
|
||||
|
||||
/* register dependencies */
|
||||
/* we could save some cycles here if we remembered what we
|
||||
|
@ -739,6 +768,28 @@ ignore_replace_depends_check:
|
|||
warnx("cannot open %s as display file", buf);
|
||||
}
|
||||
|
||||
/* Add the package to a default view. */
|
||||
if (!Fake && !NoView && is_depoted_pkg) {
|
||||
if (Verbose) {
|
||||
printf("%s/pkg_view %s%s %s%s %sadd %s\n",
|
||||
BINDIR,
|
||||
View ? "-w " : "",
|
||||
View ? View : "",
|
||||
Viewbase ? "-W " : "",
|
||||
Viewbase ? Viewbase : "",
|
||||
Verbose ? "-v " : "",
|
||||
PkgName);
|
||||
}
|
||||
vsystem("%s/pkg_view %s%s %s%s %sadd %s",
|
||||
BINDIR,
|
||||
View ? "-w " : "",
|
||||
View ? View : "",
|
||||
Viewbase ? "-W " : "",
|
||||
Viewbase ? Viewbase : "",
|
||||
Verbose ? "-v " : "",
|
||||
PkgName);
|
||||
}
|
||||
|
||||
goto success;
|
||||
|
||||
bomb:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.\" $NetBSD: pkg_add.1,v 1.42 2003/07/25 12:14:10 salo Exp $
|
||||
.\" $NetBSD: pkg_add.1,v 1.43 2003/09/02 07:34:51 jlam Exp $
|
||||
.\"
|
||||
.\" FreeBSD install - a package for the installation and maintenance
|
||||
.\" of non-core utilities.
|
||||
|
@ -25,7 +25,13 @@
|
|||
.Nd a utility for installing and upgrading software package distributions
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl fIMnRSuVv
|
||||
.Op Fl fILMnRSuVv
|
||||
.Bk -words
|
||||
.Op Fl K Ar pkg_dbdir
|
||||
.Ek
|
||||
.Bk -words
|
||||
.Op Fl p Ar prefix
|
||||
.Ek
|
||||
.Bk -words
|
||||
.Op Fl s Ar verification-type
|
||||
.Ek
|
||||
|
@ -33,7 +39,10 @@
|
|||
.Op Fl t Ar template
|
||||
.Ek
|
||||
.Bk -words
|
||||
.Op Fl p Ar prefix
|
||||
.Op Fl W Ar viewbase
|
||||
.Ek
|
||||
.Bk -words
|
||||
.Op Fl w Ar view
|
||||
.Ek
|
||||
.Ar \fR[ftp://[\fIuser\fR[:\fIpassword]\fR@]\fIhost\fR[:\fIport\fR]][/\fIpath/\fR]pkg-name ...
|
||||
.Sh DESCRIPTION
|
||||
|
@ -105,6 +114,17 @@ will still try to find and auto-install missing prerequisite packages,
|
|||
a failure to find one will not be fatal.
|
||||
.It Fl I
|
||||
If an installation script exists for a given package, do not execute it.
|
||||
.It Fl K Ar pkg_dbdir
|
||||
Set
|
||||
.Ar pkg_dbdir
|
||||
as the package database directory.
|
||||
If this option isn't specified, then the package database directory is
|
||||
taken from the value of the environment variable
|
||||
.Ev PKG_DBDIR
|
||||
if it's set, otherwise it defaults to
|
||||
.Pa /var/db/pkg .
|
||||
.It Fl L
|
||||
Don't add the package to any views after installation.
|
||||
.It Fl M
|
||||
Run in
|
||||
.Cm MASTER
|
||||
|
@ -223,6 +243,22 @@ See below for a more detailed description of the process.
|
|||
Print version number and exit.
|
||||
.It Fl v
|
||||
Turn on verbose output.
|
||||
.It Fl W Ar viewbase
|
||||
Set
|
||||
.Ar viewbase
|
||||
as the base directory for the managed views.
|
||||
The default
|
||||
.Ar viewbase
|
||||
directory is set by
|
||||
.Xr pkg_view 1 .
|
||||
.It Fl w Ar view
|
||||
Set the
|
||||
.Ar view
|
||||
to which packages should be added after installation.
|
||||
The default
|
||||
.Ar view
|
||||
is set by
|
||||
.Xr pkg_view 1 .
|
||||
.El
|
||||
.Pp
|
||||
One or more
|
||||
|
@ -398,10 +434,13 @@ for subsequent possible use by
|
|||
Any package dependencies are recorded in the other packages'
|
||||
.Pa /var/db/pkg/\*[Lt]other-pkg\*[Gt]/+REQUIRED_BY
|
||||
file
|
||||
(if the environment variable PKG_DBDIR is set, this overrides the
|
||||
.Pa /var/db/pkg/
|
||||
(if an alternate package database directory is specified, then it
|
||||
overrides the
|
||||
.Pa /var/db/pkg
|
||||
path shown above).
|
||||
.It
|
||||
If the package is a depoted package, then add it to the default view.
|
||||
.It
|
||||
The staging area is deleted and the program terminates.
|
||||
.It
|
||||
Finally, if we were upgrading a package, any
|
||||
|
@ -426,7 +465,16 @@ is installed, even if the user might change it with the
|
|||
flag to
|
||||
.Cm pkg_add .
|
||||
.Sh ENVIRONMENT
|
||||
.Ss PKG_PATH
|
||||
.Bl -tag -width PKG_TMPDIR
|
||||
.It Ev PKG_DBDIR
|
||||
If the
|
||||
.Fl K
|
||||
flag isn't given, then
|
||||
.Ev PKG_DBDIR
|
||||
is the location of the package database directory.
|
||||
The default package database directory is
|
||||
.Pa /var/db/pkg .
|
||||
.It Ev PKG_PATH
|
||||
The value of the
|
||||
.Ev PKG_PATH
|
||||
is used if a given package can't be found, it's usually set to
|
||||
|
@ -437,13 +485,11 @@ Each entry consists of a directory name or URL.
|
|||
The current directory may be indicated implicitly by an empty directory
|
||||
name, or explicitly by a single period.
|
||||
FTP URLs may not end with a slash.
|
||||
.Ss PKG_DBDIR
|
||||
Where to register packages instead of
|
||||
.Pa /var/db/pkg .
|
||||
.Ss PKG_TMPDIR
|
||||
.It Ev PKG_TMPDIR
|
||||
Staging directory for installing packages, defaults to /var/tmp.
|
||||
Set to directory with lots of free disk if you run out of
|
||||
space when installing a binary package.
|
||||
.El
|
||||
.Sh EXAMPLES
|
||||
In all cases,
|
||||
.Nm
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/* $NetBSD: main.c,v 1.36 2003/06/05 13:15:43 agc Exp $ */
|
||||
/* $NetBSD: main.c,v 1.37 2003/09/02 07:34:51 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: main.c,v 1.36 2003/06/05 13:15:43 agc Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.37 2003/09/02 07:34:51 jlam Exp $");
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -47,6 +47,10 @@ __RCSID("$NetBSD: main.c,v 1.36 2003/06/05 13:15:43 agc Exp $");
|
|||
|
||||
#include "lib.h"
|
||||
|
||||
#define DEFAULT_SFX ".t[bg]z" /* default suffix for ls{all,best} */
|
||||
|
||||
static const char Options[] = "K:s:V";
|
||||
|
||||
void usage(void);
|
||||
|
||||
int filecnt;
|
||||
|
@ -338,21 +342,44 @@ lspattern_fn(const char *pkg, void *vp)
|
|||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int ch;
|
||||
char sfx[FILENAME_MAX];
|
||||
Boolean use_default_sfx = TRUE;
|
||||
|
||||
setprogname(argv[0]);
|
||||
|
||||
if (argc < 2)
|
||||
usage();
|
||||
|
||||
if (strcmp(argv[1], "-V") == 0) {
|
||||
while ((ch = getopt(argc, argv, Options)) != -1)
|
||||
switch (ch) {
|
||||
case 'K':
|
||||
_pkgdb_setPKGDB_DIR(optarg);
|
||||
break;
|
||||
|
||||
case 's':
|
||||
(void) strlcpy(sfx, optarg, sizeof(sfx));
|
||||
use_default_sfx = FALSE;
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
show_version();
|
||||
/* NOTREACHED */
|
||||
|
||||
} else if (strcasecmp(argv[1], "pmatch") == 0) {
|
||||
default:
|
||||
usage();
|
||||
/* NOTREACHED */
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if (use_default_sfx)
|
||||
(void) snprintf(sfx, sizeof(sfx), "%s", DEFAULT_SFX);
|
||||
|
||||
if (strcasecmp(argv[0], "pmatch") == 0) {
|
||||
|
||||
char *pattern, *pkg;
|
||||
|
||||
argv++; /* argv[0] */
|
||||
argv++; /* "pmatch" */
|
||||
|
||||
pattern = argv[0];
|
||||
|
@ -368,14 +395,13 @@ main(int argc, char *argv[])
|
|||
return 1;
|
||||
}
|
||||
|
||||
} else if (strcasecmp(argv[1], "rebuild") == 0) {
|
||||
} else if (strcasecmp(argv[0], "rebuild") == 0) {
|
||||
|
||||
rebuild();
|
||||
printf("Done.\n");
|
||||
|
||||
} else if (strcasecmp(argv[1], "check") == 0) {
|
||||
} else if (strcasecmp(argv[0], "check") == 0) {
|
||||
|
||||
argv++; /* argv[0] */
|
||||
argv++; /* "check" */
|
||||
|
||||
if (*argv != NULL) {
|
||||
|
@ -429,11 +455,10 @@ main(int argc, char *argv[])
|
|||
}
|
||||
printf("Done.\n");
|
||||
|
||||
} else if (strcasecmp(argv[1], "lsall") == 0) {
|
||||
} else if (strcasecmp(argv[0], "lsall") == 0) {
|
||||
int saved_wd;
|
||||
|
||||
argv++; /* argv[0] */
|
||||
argv++; /* "check" */
|
||||
argv++; /* "lsall" */
|
||||
|
||||
/* preserve cwd */
|
||||
saved_wd=open(".", O_RDONLY);
|
||||
|
@ -449,7 +474,7 @@ main(int argc, char *argv[])
|
|||
|
||||
dir = dirname_of(*argv);
|
||||
basep = basename_of(*argv);
|
||||
snprintf(base, sizeof(base), "%s.t[bg]z", basep);
|
||||
snprintf(base, sizeof(base), "%s%s", basep, sfx);
|
||||
|
||||
fchdir(saved_wd);
|
||||
rc = chdir(dir);
|
||||
|
@ -467,11 +492,10 @@ main(int argc, char *argv[])
|
|||
|
||||
close(saved_wd);
|
||||
|
||||
} else if (strcasecmp(argv[1], "lsbest") == 0) {
|
||||
} else if (strcasecmp(argv[0], "lsbest") == 0) {
|
||||
int saved_wd;
|
||||
|
||||
argv++; /* argv[0] */
|
||||
argv++; /* "check" */
|
||||
argv++; /* "lsbest" */
|
||||
|
||||
/* preserve cwd */
|
||||
saved_wd=open(".", O_RDONLY);
|
||||
|
@ -488,7 +512,7 @@ main(int argc, char *argv[])
|
|||
|
||||
dir = dirname_of(*argv);
|
||||
basep = basename_of(*argv);
|
||||
snprintf(base, sizeof(base), "%s.t[bg]z", basep);
|
||||
snprintf(base, sizeof(base), "%s%s", basep, sfx);
|
||||
|
||||
fchdir(saved_wd);
|
||||
rc = chdir(dir);
|
||||
|
@ -508,15 +532,15 @@ main(int argc, char *argv[])
|
|||
|
||||
close(saved_wd);
|
||||
|
||||
} else if (strcasecmp(argv[1], "list") == 0 ||
|
||||
strcasecmp(argv[1], "dump") == 0) {
|
||||
} else if (strcasecmp(argv[0], "list") == 0 ||
|
||||
strcasecmp(argv[0], "dump") == 0) {
|
||||
|
||||
pkgdb_dump();
|
||||
|
||||
}
|
||||
#ifdef PKGDB_DEBUG
|
||||
else if (strcasecmp(argv[1], "del") == 0 ||
|
||||
strcasecmp(argv[1], "delete") == 0) {
|
||||
else if (strcasecmp(argv[0], "del") == 0 ||
|
||||
strcasecmp(argv[0], "delete") == 0) {
|
||||
|
||||
int rc;
|
||||
|
||||
|
@ -533,7 +557,7 @@ main(int argc, char *argv[])
|
|||
|
||||
pkgdb_close();
|
||||
|
||||
} else if (strcasecmp(argv[1], "add") == 0) {
|
||||
} else if (strcasecmp(argv[0], "add") == 0) {
|
||||
|
||||
int rc;
|
||||
|
||||
|
@ -568,7 +592,7 @@ main(int argc, char *argv[])
|
|||
void
|
||||
usage(void)
|
||||
{
|
||||
printf("usage: pkg_admin [-V] command args ...\n"
|
||||
printf("usage: pkg_admin [-V] [-s sfx] command args ...\n"
|
||||
"Where 'commands' and 'args' are:\n"
|
||||
" rebuild - rebuild pkgdb from +CONTENTS files\n"
|
||||
" check [pkg ...] - check md5 checksum of installed files\n"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.\" $NetBSD: pkg_admin.1,v 1.20 2002/09/26 01:41:51 wiz Exp $
|
||||
.\" $NetBSD: pkg_admin.1,v 1.21 2003/09/02 07:34:52 jlam Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1999-2002 Hubert Feyrer. All rights reserved.
|
||||
.\"
|
||||
|
@ -37,6 +37,12 @@
|
|||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl V
|
||||
.Bk -words
|
||||
.Op Fl K Ar pkg_dbdir
|
||||
.Ek
|
||||
.Bk -words
|
||||
.Op Fl s Ar sfx_pattern
|
||||
.Ek
|
||||
.Ar command Op args ...
|
||||
.Sh DESCRIPTION
|
||||
This command performs various administrative tasks around the
|
||||
|
@ -45,8 +51,24 @@ Packages System.
|
|||
Available commands are:
|
||||
.Pp
|
||||
.Bl -tag -width check
|
||||
.It Fl K Ar pkg_dbdir
|
||||
Set
|
||||
.Ar pkg_dbdir
|
||||
as the package database directory.
|
||||
If this option isn't specified, then the package database directory is
|
||||
taken from the value of the environment variable
|
||||
.Ev PKG_DBDIR
|
||||
if it's set, otherwise it defaults to
|
||||
.Pa /var/db/pkg .
|
||||
.It Fl V
|
||||
Print version number and exit.
|
||||
.It Fl s Ar sfx_pattern
|
||||
Set the shell glob pattern for package suffices when matching package
|
||||
names for
|
||||
.Cm lsall
|
||||
and
|
||||
.Cm lsbest .
|
||||
The default pattern is ".t[bg]z".
|
||||
.It Cm check Op Ar pkg ...
|
||||
Use this command to check the files belonging to some or all of the
|
||||
packages installed on the local machine against their MD5 checksum
|
||||
|
@ -84,15 +106,15 @@ yui# cd /usr/pkgsrc/packages/i386ELF/All/
|
|||
yui# ls unzip*
|
||||
unzip-5.40.tgz unzip-5.41.tgz
|
||||
yui# pkg_admin lsall 'unzip*'
|
||||
unzip-5.40.tgz
|
||||
unzip-5.41.tgz
|
||||
/usr/pkgsrc/packages/i386ELF/All/unzip-5.40.tgz
|
||||
/usr/pkgsrc/packages/i386ELF/All/unzip-5.41.tgz
|
||||
yui# pkg_admin lsall 'unzip\*[Ge]5.40'
|
||||
unzip-5.40.tgz
|
||||
unzip-5.41.tgz
|
||||
/usr/pkgsrc/packages/i386ELF/All/unzip-5.40.tgz
|
||||
/usr/pkgsrc/packages/i386ELF/All/unzip-5.41.tgz
|
||||
yui# pkg_admin lsall 'unzip\*[Ge]5.41'
|
||||
unzip-5.41.tgz
|
||||
/usr/pkgsrc/packages/i386ELF/All/unzip-5.41.tgz
|
||||
yui# pkg_admin lsbest 'unzip\*[Ge]5.40'
|
||||
unzip-5.41.tgz
|
||||
/usr/pkgsrc/packages/i386ELF/All/unzip-5.41.tgz
|
||||
yui# pkg_admin lsall /usr/pkgsrc/packages/i386ELF/All/'{mit,unproven}-pthread*'
|
||||
/usr/pkgsrc/packages/i386ELF/All/mit-pthreads-1.60b6.tgz
|
||||
/usr/pkgsrc/packages/i386ELF/All/unproven-pthreads-0.15.tgz
|
||||
|
@ -120,9 +142,14 @@ Needs to be run as root.
|
|||
.Pp
|
||||
.El
|
||||
.Sh ENVIRONMENT
|
||||
.Bl -tag -width PKG_DBDIR -compact
|
||||
.Bl -tag -width indent -compact
|
||||
.It Ev PKG_DBDIR
|
||||
Where to register packages instead of
|
||||
If the
|
||||
.Fl K
|
||||
flag isn't given, then
|
||||
.Ev PKG_DBDIR
|
||||
is the location of the package database directory.
|
||||
The default package database directory is
|
||||
.Pa /var/db/pkg .
|
||||
.El
|
||||
.Sh FILES
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: create.h,v 1.17 2003/01/10 11:55:45 agc Exp $ */
|
||||
/* $NetBSD: create.h,v 1.18 2003/09/02 07:34:53 jlam Exp $ */
|
||||
|
||||
/* from FreeBSD Id: create.h,v 1.13 1997/10/08 07:46:19 charnier Exp */
|
||||
|
||||
|
@ -51,6 +51,7 @@ extern int PlistOnly;
|
|||
extern int RelativeLinks;
|
||||
extern int ReorderDirs;
|
||||
extern int update_pkgdb;
|
||||
extern int create_views;
|
||||
|
||||
void check_list(char *, package_t *, const char *);
|
||||
void copy_plist(char *, package_t *);
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: main.c,v 1.25 2003/07/14 06:17:55 itojun Exp $ */
|
||||
/* $NetBSD: main.c,v 1.26 2003/09/02 07:34:53 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static const char *rcsid = "from FreeBSD Id: main.c,v 1.17 1997/10/08 07:46:23 charnier Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: main.c,v 1.25 2003/07/14 06:17:55 itojun Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.26 2003/09/02 07:34:53 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -24,7 +24,7 @@ __RCSID("$NetBSD: main.c,v 1.25 2003/07/14 06:17:55 itojun Exp $");
|
|||
#include "lib.h"
|
||||
#include "create.h"
|
||||
|
||||
static const char Options[] = "B:C:D:FI:L:OP:RS:UVX:b:c:d:f:hi:k:lm:n:p:r:s:t:v";
|
||||
static const char Options[] = "B:C:D:EFI:K:L:OP:RS:UVX:b:c:d:f:hi:k:lm:n:p:r:s:t:v";
|
||||
|
||||
char *Prefix = NULL;
|
||||
char *Comment = NULL;
|
||||
|
@ -48,6 +48,7 @@ char *realprefix = NULL;
|
|||
char PlayPen[FILENAME_MAX];
|
||||
size_t PlayPenSize = sizeof(PlayPen);
|
||||
int update_pkgdb = 1;
|
||||
int create_views = 0;
|
||||
int Dereference = 0;
|
||||
int PlistOnly = 0;
|
||||
int RelativeLinks = 0;
|
||||
|
@ -58,7 +59,7 @@ static void
|
|||
usage(void)
|
||||
{
|
||||
fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n",
|
||||
"usage: pkg_create [-ORUhlVv] [-P dpkgs] [-C cpkgs] [-p prefix] [-f contents]",
|
||||
"usage: pkg_create [-ORUEhlVv] [-P dpkgs] [-C cpkgs] [-p prefix] [-f contents]",
|
||||
" [-i iscript] [-k dscript] [-r rscript] [-t template]",
|
||||
" [-X excludefile] [-D displayfile] [-m mtreefile]",
|
||||
" [-b build-version-file] [-B build-info-file]",
|
||||
|
@ -81,6 +82,10 @@ main(int argc, char **argv)
|
|||
Verbose = TRUE;
|
||||
break;
|
||||
|
||||
case 'E':
|
||||
create_views = 1;
|
||||
break;
|
||||
|
||||
case 'I':
|
||||
realprefix = optarg;
|
||||
break;
|
||||
|
@ -125,6 +130,10 @@ main(int argc, char **argv)
|
|||
Install = optarg;
|
||||
break;
|
||||
|
||||
case 'K':
|
||||
_pkgdb_setPKGDB_DIR(optarg);
|
||||
break;
|
||||
|
||||
case 'k':
|
||||
DeInstall = optarg;
|
||||
break;
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: perform.c,v 1.37 2003/08/10 12:27:08 grant Exp $ */
|
||||
/* $NetBSD: perform.c,v 1.38 2003/09/02 07:34:53 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static const char *rcsid = "from FreeBSD Id: perform.c,v 1.38 1997/10/13 15:03:51 jkh Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: perform.c,v 1.37 2003/08/10 12:27:08 grant Exp $");
|
||||
__RCSID("$NetBSD: perform.c,v 1.38 2003/09/02 07:34:53 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -138,6 +138,9 @@ make_dist(const char *home, const char *pkg, const char *suffix, const package_t
|
|||
if (Preserve) {
|
||||
(void) fprintf(totar, "%s\n", PRESERVE_FNAME);
|
||||
}
|
||||
if (create_views) {
|
||||
(void) fprintf(totar, "%s\n", VIEWS_FNAME);
|
||||
}
|
||||
|
||||
for (p = plist->head; p; p = p->next) {
|
||||
if (p->type == PLIST_FILE) {
|
||||
|
@ -387,6 +390,11 @@ pkg_perform(lpkg_head_t *pkgs)
|
|||
add_plist(&plist, PLIST_IGNORE, NULL);
|
||||
add_plist(&plist, PLIST_FILE, PRESERVE_FNAME);
|
||||
}
|
||||
if (create_views) {
|
||||
write_file(VIEWS_FNAME, "");
|
||||
add_plist(&plist, PLIST_IGNORE, NULL);
|
||||
add_plist(&plist, PLIST_FILE, VIEWS_FNAME);
|
||||
}
|
||||
|
||||
/* Finally, write out the packing list */
|
||||
fp = fopen(CONTENTS_FNAME, "w");
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.\" $NetBSD: pkg_create.1,v 1.36 2003/06/26 10:09:05 wiz Exp $
|
||||
.\" $NetBSD: pkg_create.1,v 1.37 2003/09/02 07:34:54 jlam Exp $
|
||||
.\"
|
||||
.\" FreeBSD install - a package for the installation and maintenance
|
||||
.\" of non-core utilities.
|
||||
|
@ -32,7 +32,7 @@
|
|||
.Nd a utility for creating software package distributions
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl hlORUVv
|
||||
.Op Fl EhlORUVv
|
||||
.Bk -words
|
||||
.Op Fl B Ar build-info-file
|
||||
.Ek
|
||||
|
@ -43,6 +43,9 @@
|
|||
.Op Fl D Ar displayfile
|
||||
.Ek
|
||||
.Bk -words
|
||||
.Op Fl K Ar pkg_dbdir
|
||||
.Ek
|
||||
.Bk -words
|
||||
.Op Fl P Ar dpkgs
|
||||
.Ek
|
||||
.Bk -words
|
||||
|
@ -52,9 +55,6 @@
|
|||
.Op Fl b Ar build-version-file
|
||||
.Ek
|
||||
.Bk -words
|
||||
.Op Fl f Ar contents
|
||||
.Ek
|
||||
.Bk -words
|
||||
.Op Fl i Ar iscript
|
||||
.Ek
|
||||
.Bk -words
|
||||
|
@ -156,13 +156,15 @@ Fetch long description for package from file
|
|||
or, if preceded by
|
||||
.Cm - ,
|
||||
the argument itself.
|
||||
.It Fl f Ar packinglist
|
||||
.It Fl E
|
||||
Add an empty views file to the package.
|
||||
.It Fl f Ar packlist
|
||||
Fetch ``packing list'' for package from the file
|
||||
.Ar packinglist
|
||||
.Ar packlist
|
||||
or
|
||||
.Cm stdin
|
||||
if
|
||||
.Ar packinglist
|
||||
.Ar packlist
|
||||
is a
|
||||
.Cm -
|
||||
(dash).
|
||||
|
@ -178,6 +180,15 @@ Set
|
|||
to be the install procedure for the package.
|
||||
This can be any executable program (or shell script).
|
||||
It will be invoked automatically when the package is later installed.
|
||||
.It Fl K Ar pkg_dbdir
|
||||
Set
|
||||
.Ar pkg_dbdir
|
||||
as the package database directory.
|
||||
If this option isn't specified, then the package database directory is
|
||||
taken from the value of the environment variable
|
||||
.Ev PKG_DBDIR
|
||||
if it's set, otherwise it defaults to
|
||||
.Pa /var/db/pkg .
|
||||
.It Fl k Ar dscript
|
||||
Set
|
||||
.Ar dscript
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: pl.c,v 1.27 2003/07/14 06:17:55 itojun Exp $ */
|
||||
/* $NetBSD: pl.c,v 1.28 2003/09/02 07:34:54 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static const char *rcsid = "from FreeBSD Id: pl.c,v 1.11 1997/10/08 07:46:35 charnier Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: pl.c,v 1.27 2003/07/14 06:17:55 itojun Exp $");
|
||||
__RCSID("$NetBSD: pl.c,v 1.28 2003/09/02 07:34:54 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: main.c,v 1.28 2003/06/25 23:12:42 hubertf Exp $ */
|
||||
/* $NetBSD: main.c,v 1.29 2003/09/02 07:34:55 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#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.28 2003/06/25 23:12:42 hubertf Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.29 2003/09/02 07:34:55 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -35,7 +35,7 @@ __RCSID("$NetBSD: main.c,v 1.28 2003/06/25 23:12:42 hubertf Exp $");
|
|||
#include "lib.h"
|
||||
#include "delete.h"
|
||||
|
||||
static char Options[] = "DFORVdfhnp:rv";
|
||||
static char Options[] = "DFK:ORVdfhnp:rv";
|
||||
|
||||
char *Prefix = NULL;
|
||||
char *ProgramPath = NULL;
|
||||
|
@ -67,22 +67,6 @@ main(int argc, char **argv)
|
|||
|
||||
while ((ch = getopt(argc, argv, Options)) != -1)
|
||||
switch (ch) {
|
||||
case 'v':
|
||||
Verbose = TRUE;
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
Force += 1;
|
||||
break;
|
||||
|
||||
case 'F':
|
||||
File2Pkg = TRUE;
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
Prefix = optarg;
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
NoDeInstall = TRUE;
|
||||
break;
|
||||
|
@ -91,27 +75,47 @@ main(int argc, char **argv)
|
|||
CleanDirs = TRUE;
|
||||
break;
|
||||
|
||||
case 'F':
|
||||
File2Pkg = TRUE;
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
Force += 1;
|
||||
break;
|
||||
|
||||
case 'K':
|
||||
_pkgdb_setPKGDB_DIR(optarg);
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
Fake = TRUE;
|
||||
Verbose = TRUE;
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
Recurse_up = TRUE;
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
Recurse_down = TRUE;
|
||||
break;
|
||||
|
||||
case 'O':
|
||||
OnlyDeleteFromPkgDB = TRUE;
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
Prefix = optarg;
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
Recurse_down = TRUE;
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
Recurse_up = TRUE;
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
show_version();
|
||||
/* NOTREACHED */
|
||||
|
||||
case 'v':
|
||||
Verbose = TRUE;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
case '?':
|
||||
default:
|
||||
|
@ -151,9 +155,8 @@ main(int argc, char **argv)
|
|||
}
|
||||
} else {
|
||||
char *dbdir;
|
||||
char *tmp;
|
||||
|
||||
dbdir = (tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR;
|
||||
dbdir = _pkgdb_getPKGDB_DIR();
|
||||
if (**argv == '/' && strncmp(*argv, dbdir, strlen(dbdir)) == 0) {
|
||||
*argv += strlen(dbdir) + 1;
|
||||
if ((*argv)[strlen(*argv) - 1] == '/') {
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: perform.c,v 1.42 2003/09/01 17:43:23 tron Exp $ */
|
||||
/* $NetBSD: perform.c,v 1.43 2003/09/02 07:34:55 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#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.42 2003/09/01 17:43:23 tron Exp $");
|
||||
__RCSID("$NetBSD: perform.c,v 1.43 2003/09/02 07:34:55 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -114,12 +114,10 @@ undepend(const char *deppkgname, void *vp)
|
|||
char fname[FILENAME_MAX], ftmp[FILENAME_MAX];
|
||||
char fbuf[FILENAME_MAX];
|
||||
FILE *fp, *fpwr;
|
||||
char *tmp;
|
||||
int s;
|
||||
|
||||
(void) snprintf(fname, sizeof(fname), "%s/%s/%s",
|
||||
(tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR,
|
||||
deppkgname, REQUIRED_BY_FNAME);
|
||||
_pkgdb_getPKGDB_DIR(), deppkgname, REQUIRED_BY_FNAME);
|
||||
fp = fopen(fname, "r");
|
||||
if (fp == NULL) {
|
||||
warnx("couldn't open dependency file `%s'", fname);
|
||||
|
@ -165,6 +163,92 @@ undepend(const char *deppkgname, void *vp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove the current view's package dbdir from the +VIEWS file of the
|
||||
* depoted package named by pkgname.
|
||||
*/
|
||||
static int
|
||||
unview(const char *pkgname)
|
||||
{
|
||||
char fname[FILENAME_MAX], ftmp[FILENAME_MAX];
|
||||
char fbuf[FILENAME_MAX];
|
||||
char dbdir[FILENAME_MAX];
|
||||
FILE *fp, *fpwr;
|
||||
int s;
|
||||
int cc;
|
||||
|
||||
(void) snprintf(dbdir, sizeof(dbdir), "%s", _pkgdb_getPKGDB_DIR());
|
||||
|
||||
/* Get the depot directory. */
|
||||
(void) snprintf(fname, sizeof(fname), "%s/%s/%s",
|
||||
dbdir, pkgname, DEPOT_FNAME);
|
||||
if ((fp = fopen(fname, "r")) == NULL) {
|
||||
warnx("unable to open `%s' file", fname);
|
||||
return -1;
|
||||
}
|
||||
if (fgets(fbuf, sizeof(fbuf), fp) == NULL) {
|
||||
(void) fclose(fp);
|
||||
warnx("empty depot file `%s'", fname);
|
||||
return -1;
|
||||
}
|
||||
if (fbuf[cc = strlen(fbuf) - 1] == '\n') {
|
||||
fbuf[cc] = 0;
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
/*
|
||||
* Copy the contents of the +VIEWS file into a temp file, but
|
||||
* skip copying the name of the current view's package dbdir.
|
||||
*/
|
||||
(void) snprintf(fname, sizeof(fname), "%s/%s", fbuf, VIEWS_FNAME);
|
||||
if ((fp = fopen(fname, "r")) == NULL) {
|
||||
warnx("unable to open `%s' file", fname);
|
||||
return -1;
|
||||
}
|
||||
(void) snprintf(ftmp, sizeof(ftmp), "%s.XXXXXX", fname);
|
||||
if ((s = mkstemp(ftmp)) == -1) {
|
||||
(void) fclose(fp);
|
||||
warnx("unable to open `%s' temp file", ftmp);
|
||||
return -1;
|
||||
}
|
||||
if ((fpwr = fdopen(s, "w")) == NULL) {
|
||||
(void) close(s);
|
||||
(void) remove(ftmp);
|
||||
(void) fclose(fp);
|
||||
warnx("unable to fdopen `%s' temp file", ftmp);
|
||||
return -1;
|
||||
}
|
||||
while (fgets(fbuf, sizeof(fbuf), fp) != NULL) {
|
||||
if (fbuf[cc = strlen(fbuf) - 1] == '\n') {
|
||||
fbuf[cc] = 0;
|
||||
}
|
||||
if (strcmp(fbuf, dbdir) != 0) {
|
||||
(void) fputs(fbuf, fpwr);
|
||||
(void) putc('\n', fpwr);
|
||||
}
|
||||
}
|
||||
(void) fclose(fp);
|
||||
if (fchmod(s, 0644) == FAIL) {
|
||||
(void) fclose(fpwr);
|
||||
(void) remove(ftmp);
|
||||
warnx("unable to change permissions of `%s' temp file", ftmp);
|
||||
return -1;
|
||||
}
|
||||
if (fclose(fpwr) == EOF) {
|
||||
(void) remove(ftmp);
|
||||
warnx("unable to close `%s' temp file", ftmp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Rename the temp file to the +VIEWS file */
|
||||
if (rename(ftmp, fname) == -1) {
|
||||
(void) remove(ftmp);
|
||||
warnx("unable to rename `%s' to `%s'", ftmp, fname);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Delete from directory 'home' all packages on lpkg_list.
|
||||
* If tryall is set, ignore errors from pkg_delete(1).
|
||||
|
@ -174,7 +258,6 @@ require_delete(char *home, int tryall)
|
|||
{
|
||||
lpkg_t *lpp;
|
||||
int rv, fail;
|
||||
char *tmp;
|
||||
int oldcwd;
|
||||
|
||||
/* save cwd */
|
||||
|
@ -182,8 +265,7 @@ require_delete(char *home, int tryall)
|
|||
if (oldcwd == -1)
|
||||
err(EXIT_FAILURE, "cannot open \".\"");
|
||||
|
||||
(void) snprintf(pkgdir, sizeof(pkgdir), "%s",
|
||||
(tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR);
|
||||
(void) snprintf(pkgdir, sizeof(pkgdir), "%s", _pkgdb_getPKGDB_DIR());
|
||||
|
||||
/* walk list of things to delete */
|
||||
fail = 0;
|
||||
|
@ -275,7 +357,7 @@ require_find_recursive_up(lpkg_t *thislpp)
|
|||
lpkg_head_t reqq;
|
||||
lpkg_t *lpp = NULL;
|
||||
FILE *cfile;
|
||||
char *nl, *tmp;
|
||||
char *nl;
|
||||
|
||||
/* see if we are on the find queue -- circular dependency */
|
||||
if ((lpp = find_on_queue(&lpfindq, thislpp->lp_name))) {
|
||||
|
@ -286,7 +368,7 @@ require_find_recursive_up(lpkg_t *thislpp)
|
|||
TAILQ_INIT(&reqq);
|
||||
|
||||
(void) snprintf(pkgdir, sizeof(pkgdir), "%s/%s",
|
||||
(tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR, thislpp->lp_name);
|
||||
_pkgdb_getPKGDB_DIR(), thislpp->lp_name);
|
||||
|
||||
/* change to package's dir */
|
||||
if (chdir(pkgdir) == FAIL) {
|
||||
|
@ -390,7 +472,6 @@ require_find_recursive_down(lpkg_t *thislpp, package_t *plist)
|
|||
while ((lpp = TAILQ_FIRST(&reqq))) {
|
||||
FILE *cfile;
|
||||
package_t rPlist;
|
||||
char *tmp;
|
||||
|
||||
/* remove a direct req from our queue */
|
||||
TAILQ_REMOVE(&reqq, lpp, lp_link);
|
||||
|
@ -400,7 +481,7 @@ require_find_recursive_down(lpkg_t *thislpp, package_t *plist)
|
|||
rPlist.tail = NULL;
|
||||
|
||||
/* prepare for recursion */
|
||||
chdir ((tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR);
|
||||
chdir(_pkgdb_getPKGDB_DIR());
|
||||
if (ispkgpattern(lpp->lp_name)) {
|
||||
char installed[FILENAME_MAX];
|
||||
if (findmatchingname(".", lpp->lp_name, note_whats_installed, installed) != 1) {
|
||||
|
@ -512,17 +593,20 @@ require_print(void)
|
|||
static int
|
||||
pkg_do(char *pkg)
|
||||
{
|
||||
FILE *cfile;
|
||||
char home[FILENAME_MAX];
|
||||
plist_t *p;
|
||||
char *tmp;
|
||||
FILE *cfile;
|
||||
FILE *fp;
|
||||
char home[FILENAME_MAX];
|
||||
char view[FILENAME_MAX];
|
||||
int cc;
|
||||
Boolean is_depoted_pkg = FALSE;
|
||||
|
||||
/* Reset some state */
|
||||
if (Plist.head)
|
||||
free_plist(&Plist);
|
||||
|
||||
(void) snprintf(LogDir, sizeof(LogDir), "%s/%s", (tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR,
|
||||
pkg);
|
||||
(void) snprintf(LogDir, sizeof(LogDir), "%s/%s",
|
||||
_pkgdb_getPKGDB_DIR(), pkg);
|
||||
if (!fexists(LogDir) || !isdir(LogDir)) {
|
||||
{
|
||||
/* Check if the given package name matches something
|
||||
|
@ -548,6 +632,11 @@ pkg_do(char *pkg)
|
|||
warnx("unable to change directory to %s! deinstall failed", LogDir);
|
||||
return 1;
|
||||
}
|
||||
if (!fexists(CONTENTS_FNAME)) {
|
||||
warnx("package '%s' is not installed, %s missing", pkg, CONTENTS_FNAME);
|
||||
if (!Force)
|
||||
return 1;
|
||||
}
|
||||
if (fexists(PRESERVE_FNAME)) {
|
||||
printf("Package `%s' is marked as not for deletion\n", pkg);
|
||||
if (Force <= 1) {
|
||||
|
@ -574,6 +663,28 @@ pkg_do(char *pkg)
|
|||
} else
|
||||
require_delete(home, 0);
|
||||
}
|
||||
if (!isemptyfile(VIEWS_FNAME)) {
|
||||
/* This package has instances in other views */
|
||||
/* Delete them from the views */
|
||||
if ((fp = fopen(VIEWS_FNAME, "r")) == NULL) {
|
||||
warnx("unable to open '%s' file", VIEWS_FNAME);
|
||||
return 1;
|
||||
}
|
||||
while (fgets(view, sizeof(view), fp) != NULL) {
|
||||
if (view[cc = strlen(view) - 1] == '\n') {
|
||||
view[cc] = 0;
|
||||
}
|
||||
if (Verbose) {
|
||||
printf("Deleting package %s instance from `%s' view\n", pkg, view);
|
||||
}
|
||||
if (vsystem("%s -K %s %s", ProgramPath, view, pkg) != 0) {
|
||||
warnx("unable to delete package %s from view %s", pkg, view);
|
||||
(void) fclose(fp);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
(void) fclose(fp);
|
||||
}
|
||||
sanity_check(LogDir);
|
||||
cfile = fopen(CONTENTS_FNAME, "r");
|
||||
if (!cfile) {
|
||||
|
@ -602,7 +713,24 @@ pkg_do(char *pkg)
|
|||
return 1;
|
||||
}
|
||||
}
|
||||
if (!NoDeInstall && fexists(DEINSTALL_FNAME)) {
|
||||
/*
|
||||
* Ensure that we don't do VIEW-DEINSTALL action for old packages
|
||||
* or for the package in its depot directory.
|
||||
*/
|
||||
if (!NoDeInstall && fexists(DEINSTALL_FNAME) && fexists(DEPOT_FNAME)) {
|
||||
if (Fake) {
|
||||
printf("Would execute view de-install script at this point (arg: VIEW-DEINSTALL).\n");
|
||||
} else {
|
||||
vsystem("%s +x %s", CHMOD_CMD, DEINSTALL_FNAME); /* make sure */
|
||||
if (vsystem("./%s %s VIEW-DEINSTALL", DEINSTALL_FNAME, pkg)) {
|
||||
warnx("view deinstall script returned error status");
|
||||
if (!Force) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!NoDeInstall && fexists(DEINSTALL_FNAME) && !fexists(DEPOT_FNAME)) {
|
||||
if (Fake)
|
||||
printf("Would execute de-install script at this point (arg: DEINSTALL).\n");
|
||||
else {
|
||||
|
@ -621,16 +749,27 @@ pkg_do(char *pkg)
|
|||
"couldn't entirely delete package `%s'\n"
|
||||
"(perhaps the packing list is incorrectly specified?)", pkg);
|
||||
}
|
||||
/* Remove this package from the +REQUIRED_BY list of the packages this depends on */
|
||||
if (!isemptyfile(DEPOT_FNAME)) {
|
||||
if (Verbose)
|
||||
printf("Attempting to remove the %s registration on package `%s'\n", VIEWS_FNAME, pkg);
|
||||
if (!Fake)
|
||||
(void) unview(pkg);
|
||||
}
|
||||
/*
|
||||
* If this isn't a package in a view, then remove this package
|
||||
* from the +REQUIRED_BY list of the packages this depends on.
|
||||
*/
|
||||
if (!fexists(DEPOT_FNAME)) {
|
||||
for (p = Plist.head; p; p = p->next) {
|
||||
if (p->type != PLIST_PKGDEP)
|
||||
continue;
|
||||
if (Verbose)
|
||||
printf("Attempting to remove dependency on package `%s'\n", p->name);
|
||||
if (!Fake)
|
||||
findmatchingname((tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR,
|
||||
findmatchingname(_pkgdb_getPKGDB_DIR(),
|
||||
p->name, undepend, pkg);
|
||||
}
|
||||
}
|
||||
if (Recurse_down) {
|
||||
/* Also remove the packages further down, now that there's
|
||||
* (most likely) nothing left which requires them. */
|
||||
|
@ -641,7 +780,7 @@ pkg_do(char *pkg)
|
|||
|
||||
require_delete(home, 1);
|
||||
}
|
||||
if (!NoDeInstall && fexists(DEINSTALL_FNAME)) {
|
||||
if (!NoDeInstall && fexists(DEINSTALL_FNAME) && !fexists(DEPOT_FNAME)) {
|
||||
if (Fake)
|
||||
printf("Would execute post-de-install script at this point (arg: POST-DEINSTALL).\n");
|
||||
else {
|
||||
|
@ -653,18 +792,30 @@ pkg_do(char *pkg)
|
|||
}
|
||||
}
|
||||
}
|
||||
if (fexists(VIEWS_FNAME))
|
||||
is_depoted_pkg = TRUE;
|
||||
|
||||
/* Change out of LogDir before we remove it.
|
||||
* Do not fail here, as the package is not yet completely deleted! */
|
||||
if (chdir(home) == FAIL)
|
||||
warnx("Oops - removed current working directory. Oh, well.");
|
||||
if (!Fake) {
|
||||
/* Finally nuke the +-files and the pkgdb-dir (/var/db/pkg/foo) */
|
||||
if (is_depoted_pkg) {
|
||||
(void) vsystem("%s %s/+*", REMOVE_CMD, LogDir);
|
||||
if (isemptydir(LogDir))
|
||||
(void) vsystem("%s %s", RMDIR_CMD, LogDir);
|
||||
else
|
||||
warnx("%s is not empty", LogDir);
|
||||
return 0;
|
||||
} else {
|
||||
if (fexec(REMOVE_CMD, "-r", LogDir, NULL)) {
|
||||
warnx("couldn't remove log entry in %s, deinstall failed", LogDir);
|
||||
if (!Force)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.\" $NetBSD: pkg_delete.1,v 1.29 2003/07/04 12:17:32 wiz Exp $
|
||||
.\" $NetBSD: pkg_delete.1,v 1.30 2003/09/02 07:34:56 jlam Exp $
|
||||
.\"
|
||||
.\" FreeBSD install - a package for the installation and maintenance
|
||||
.\" of non-core utilities.
|
||||
|
@ -27,6 +27,9 @@
|
|||
.Nm
|
||||
.Op Fl DdFfnORrVv
|
||||
.Bk -words
|
||||
.Op Fl K Ar pkg_dbdir
|
||||
.Ek
|
||||
.Bk -words
|
||||
.Op Fl p Ar prefix
|
||||
.Ek
|
||||
.Ar pkg-name ...
|
||||
|
@ -99,6 +102,15 @@ instead of the package-name.
|
|||
.It Fl f
|
||||
Force removal of the package, even if a dependency is recorded or the
|
||||
deinstall or require script fails.
|
||||
.It Fl K Ar pkg_dbdir
|
||||
Set
|
||||
.Ar pkg_dbdir
|
||||
as the package database directory.
|
||||
If this option isn't specified, then the package database directory is
|
||||
taken from the value of the environment variable
|
||||
.Ev PKG_DBDIR
|
||||
if it's set, otherwise it defaults to
|
||||
.Pa /var/db/pkg .
|
||||
.It Fl n
|
||||
Don't actually deinstall a package, just report the steps that
|
||||
would be taken if it were.
|
||||
|
@ -139,7 +151,11 @@ Turn on verbose output.
|
|||
does pretty much what it says.
|
||||
It examines installed package records in
|
||||
.Pa /var/db/pkg/\*[Lt]pkg-name\*[Gt] ,
|
||||
deletes the package contents, and finally removes the package records.
|
||||
deletes the package contents, and finally removes the package records
|
||||
(if an alternate package database directory is specified, then it
|
||||
overrides the
|
||||
.Pa /var/db/pkg
|
||||
path shown above).
|
||||
.Pp
|
||||
If a package is required by other installed packages,
|
||||
.Nm
|
||||
|
@ -197,6 +213,12 @@ script is called as:
|
|||
.Bd -filled -offset indent -compact
|
||||
.Cm deinstall
|
||||
.Ar \*[Lt]pkg-name\*[Gt]
|
||||
.Ar VIEW-DEINSTALL
|
||||
.Ed
|
||||
before removing the package from a view, and as:
|
||||
.Bd -filled -offset indent -compact
|
||||
.Cm deinstall
|
||||
.Ar \*[Lt]pkg-name\*[Gt]
|
||||
.Ar DEINSTALL
|
||||
.Ed
|
||||
before deleting all files and as:
|
||||
|
@ -207,6 +229,7 @@ before deleting all files and as:
|
|||
.Ed
|
||||
after deleting them.
|
||||
Passing the keywords
|
||||
.Ar VIEW-DEINSTALL ,
|
||||
.Ar DEINSTALL
|
||||
and
|
||||
.Ar POST-DEINSTALL
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: info.h,v 1.13 2002/06/09 13:23:45 yamt Exp $ */
|
||||
/* $NetBSD: info.h,v 1.14 2003/09/02 07:34:57 jlam Exp $ */
|
||||
|
||||
/* from FreeBSD Id: info.h,v 1.10 1997/02/22 16:09:40 peter Exp */
|
||||
|
||||
|
@ -50,6 +50,7 @@
|
|||
#define SHOW_DEPENDS 0x04000
|
||||
#define SHOW_PKG_SIZE 0x08000
|
||||
#define SHOW_ALL_SIZE 0x10000
|
||||
#define SHOW_BLD_DEPENDS 0x20000
|
||||
|
||||
extern int Flags;
|
||||
extern Boolean AllInstalled;
|
||||
|
@ -66,6 +67,7 @@ extern void show_file(char *, char *);
|
|||
extern void show_plist(char *, package_t *, pl_ent_t);
|
||||
extern void show_files(char *, package_t *);
|
||||
extern void show_depends(char *, package_t *);
|
||||
extern void show_bld_depends(char *, package_t *);
|
||||
extern void show_index(char *, char *);
|
||||
|
||||
#endif /* _INST_INFO_H_INCLUDE */
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: main.c,v 1.36 2003/06/19 08:54:29 agc Exp $ */
|
||||
/* $NetBSD: main.c,v 1.37 2003/09/02 07:34:57 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char *rcsid = "from FreeBSD Id: main.c,v 1.14 1997/10/08 07:47:26 charnier Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: main.c,v 1.36 2003/06/19 08:54:29 agc Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.37 2003/09/02 07:34:57 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -38,7 +38,7 @@ __RCSID("$NetBSD: main.c,v 1.36 2003/06/19 08:54:29 agc Exp $");
|
|||
#include "lib.h"
|
||||
#include "info.h"
|
||||
|
||||
static const char Options[] = "aBbcDde:fFhIikLl:mnpqRrsSvV";
|
||||
static const char Options[] = "aBbcDde:fFhIiK:kLl:mNnpqRrsSvV";
|
||||
|
||||
int Flags = 0;
|
||||
Boolean AllInstalled = FALSE;
|
||||
|
@ -55,7 +55,7 @@ static void
|
|||
usage(void)
|
||||
{
|
||||
fprintf(stderr, "%s\n%s\n%s\n",
|
||||
"usage: pkg_info [-BbcDdFfIikLmnpqRrSsVvh] [-e package] [-l prefix]",
|
||||
"usage: pkg_info [-BbcDdFfIikLmNnpqRrSsVvh] [-e package] [-l prefix]",
|
||||
" pkg-name [pkg-name ...]",
|
||||
" pkg_info -a [flags]");
|
||||
exit(1);
|
||||
|
@ -115,6 +115,10 @@ main(int argc, char **argv)
|
|||
Flags |= SHOW_INSTALL;
|
||||
break;
|
||||
|
||||
case 'K':
|
||||
_pkgdb_setPKGDB_DIR(optarg);
|
||||
break;
|
||||
|
||||
case 'k':
|
||||
Flags |= SHOW_DEINSTALL;
|
||||
break;
|
||||
|
@ -131,6 +135,10 @@ main(int argc, char **argv)
|
|||
Flags |= SHOW_MTREE;
|
||||
break;
|
||||
|
||||
case 'N':
|
||||
Flags |= SHOW_BLD_DEPENDS;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
Flags |= SHOW_DEPENDS;
|
||||
break;
|
||||
|
@ -164,7 +172,7 @@ main(int argc, char **argv)
|
|||
/* Reasonable definition of 'everything' */
|
||||
Flags = SHOW_COMMENT | SHOW_DESC | SHOW_PLIST | SHOW_INSTALL |
|
||||
SHOW_DEINSTALL | SHOW_REQUIRE | SHOW_DISPLAY | SHOW_MTREE |
|
||||
SHOW_REQBY | SHOW_DEPENDS | SHOW_PKG_SIZE | SHOW_ALL_SIZE;
|
||||
SHOW_REQBY | SHOW_BLD_DEPENDS | SHOW_DEPENDS | SHOW_PKG_SIZE | SHOW_ALL_SIZE;
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
|
@ -244,9 +252,8 @@ main(int argc, char **argv)
|
|||
errx(EXIT_FAILURE, "No matching pkg for %s.", *argv);
|
||||
} else {
|
||||
char *dbdir;
|
||||
char *tmp;
|
||||
|
||||
dbdir = (tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR;
|
||||
dbdir = _pkgdb_getPKGDB_DIR();
|
||||
if (**argv == '/' && strncmp(*argv, dbdir, strlen(dbdir)) == 0) {
|
||||
*argv += strlen(dbdir) + 1;
|
||||
if ((*argv)[strlen(*argv) - 1] == '/') {
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: perform.c,v 1.46 2003/07/14 06:17:55 itojun Exp $ */
|
||||
/* $NetBSD: perform.c,v 1.47 2003/09/02 07:34:58 jlam 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.46 2003/07/14 06:17:55 itojun Exp $");
|
||||
__RCSID("$NetBSD: perform.c,v 1.47 2003/09/02 07:34:58 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -118,11 +118,8 @@ pkg_do(char *pkg)
|
|||
* It's not an uninstalled package, try and find it among the
|
||||
* installed
|
||||
*/
|
||||
char *tmp;
|
||||
|
||||
(void) snprintf(log_dir, sizeof(log_dir), "%s/%s",
|
||||
(tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR,
|
||||
pkg);
|
||||
_pkgdb_getPKGDB_DIR(), pkg);
|
||||
if (!fexists(log_dir) || !isdir(log_dir)) {
|
||||
{
|
||||
/* Check if the given package name matches
|
||||
|
@ -185,6 +182,9 @@ pkg_do(char *pkg)
|
|||
if (Flags & SHOW_DEPENDS) {
|
||||
show_depends("Requires:\n", &plist);
|
||||
}
|
||||
if (Flags & SHOW_BLD_DEPENDS) {
|
||||
show_bld_depends("Built using:\n", &plist);
|
||||
}
|
||||
if ((Flags & SHOW_REQBY) && !isemptyfile(REQUIRED_BY_FNAME)) {
|
||||
show_file("Required by:\n", REQUIRED_BY_FNAME);
|
||||
}
|
||||
|
@ -313,19 +313,19 @@ int
|
|||
pkg_perform(lpkg_head_t *pkghead)
|
||||
{
|
||||
struct dirent *dp;
|
||||
char *tmp;
|
||||
char *dbdir;
|
||||
DIR *dirp;
|
||||
int err_cnt = 0;
|
||||
|
||||
signal(SIGINT, cleanup);
|
||||
|
||||
tmp = _pkgdb_getPKGDB_DIR();
|
||||
dbdir = _pkgdb_getPKGDB_DIR();
|
||||
|
||||
/* Overriding action? */
|
||||
if (CheckPkg) {
|
||||
err_cnt += CheckForPkg(CheckPkg, tmp);
|
||||
err_cnt += CheckForPkg(CheckPkg, dbdir);
|
||||
} else if (AllInstalled) {
|
||||
if (!(isdir(tmp) || islinktodir(tmp)))
|
||||
if (!(isdir(dbdir) || islinktodir(dbdir)))
|
||||
return 1;
|
||||
|
||||
if (File2Pkg) {
|
||||
|
@ -335,7 +335,7 @@ pkg_perform(lpkg_head_t *pkghead)
|
|||
|
||||
} else {
|
||||
/* Show all packges with description */
|
||||
if ((dirp = opendir(tmp)) != (DIR *) NULL) {
|
||||
if ((dirp = opendir(dbdir)) != (DIR *) NULL) {
|
||||
while ((dp = readdir(dirp)) != (struct dirent *) NULL) {
|
||||
char tmp2[FILENAME_MAX];
|
||||
|
||||
|
@ -344,7 +344,7 @@ pkg_perform(lpkg_head_t *pkghead)
|
|||
continue;
|
||||
|
||||
(void) snprintf(tmp2, sizeof(tmp2), "%s/%s",
|
||||
tmp, dp->d_name);
|
||||
dbdir, dp->d_name);
|
||||
if (isfile(tmp2))
|
||||
continue;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.\" $NetBSD: pkg_info.1,v 1.32 2002/11/14 09:40:23 agc Exp $
|
||||
.\" $NetBSD: pkg_info.1,v 1.33 2003/09/02 07:34:58 jlam Exp $
|
||||
.\"
|
||||
.\" FreeBSD install - a package for the installation and maintenance
|
||||
.\" of non-core utilities.
|
||||
|
@ -25,11 +25,14 @@
|
|||
.Nd a utility for displaying information on software packages
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl BbcDdFfhIikLmnpqRrSsVv
|
||||
.Op Fl BbcDdFfhIikLmNnpqRrSsVv
|
||||
.Bk -words
|
||||
.Op Fl e Ar package
|
||||
.Ek
|
||||
.Bk -words
|
||||
.Op Fl K Ar pkg_dbdir
|
||||
.Ek
|
||||
.Bk -words
|
||||
.Op Fl l Ar prefix
|
||||
.Ek
|
||||
.Ar pkg-name ...
|
||||
|
@ -152,6 +155,15 @@ Show the packing list instructions for each package.
|
|||
Show the index entry for each package.
|
||||
.It Fl i
|
||||
Show the install script (if any) for each package.
|
||||
.It Fl K Ar pkg_dbdir
|
||||
Set
|
||||
.Ar pkg_dbdir
|
||||
as the package database directory.
|
||||
If this option isn't specified, then the package database directory is
|
||||
taken from the value of the environment variable
|
||||
.Ev PKG_DBDIR
|
||||
if it's set, otherwise it defaults to
|
||||
.Pa /var/db/pkg .
|
||||
.It Fl k
|
||||
Show the de-install script (if any) for each package.
|
||||
.It Fl L
|
||||
|
@ -170,6 +182,8 @@ organize it.
|
|||
This lets you add a special token to the start of each field.
|
||||
.It Fl m
|
||||
Show the mtree file (if any) for each package.
|
||||
.It Fl N
|
||||
Show which packages each package was built with (exact dependencies), if any.
|
||||
.It Fl n
|
||||
Show which packages each package needs (depends upon), if any.
|
||||
.It Fl p
|
||||
|
@ -195,11 +209,13 @@ Turn on verbose output.
|
|||
.Sh ENVIRONMENT
|
||||
.Bl -tag -width PKG_DBDIR
|
||||
.It Ev PKG_DBDIR
|
||||
The standard package database directory,
|
||||
.Pa /var/db/pkg ,
|
||||
can be overridden by specifying an alternative directory in the
|
||||
If the
|
||||
.Fl K
|
||||
flag isn't given, then
|
||||
.Ev PKG_DBDIR
|
||||
environment variable.
|
||||
is the location of the package database directory.
|
||||
The default package database directory is
|
||||
.Pa /var/db/pkg .
|
||||
.It Ev PKG_PATH
|
||||
This can be used to specify a semicolon-separated list of paths and URLs to search for
|
||||
package files.
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: show.c,v 1.26 2003/06/05 17:58:05 agc Exp $ */
|
||||
/* $NetBSD: show.c,v 1.27 2003/09/02 07:34:59 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static const char *rcsid = "from FreeBSD Id: show.c,v 1.11 1997/10/08 07:47:38 charnier Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: show.c,v 1.26 2003/06/05 17:58:05 agc Exp $");
|
||||
__RCSID("$NetBSD: show.c,v 1.27 2003/09/02 07:34:59 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -282,3 +282,41 @@ show_depends(char *title, package_t *plist)
|
|||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Show exact dependencies (packages this pkg was built with)
|
||||
*/
|
||||
void
|
||||
show_bld_depends(char *title, package_t *plist)
|
||||
{
|
||||
plist_t *p;
|
||||
int nodepends;
|
||||
|
||||
nodepends = 1;
|
||||
for (p = plist->head; p && nodepends; p = p->next) {
|
||||
switch (p->type) {
|
||||
case PLIST_BLDDEP:
|
||||
nodepends = 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (nodepends)
|
||||
return;
|
||||
|
||||
if (!Quiet) {
|
||||
printf("%s%s", InfoPrefix, title);
|
||||
}
|
||||
for (p = plist->head; p; p = p->next) {
|
||||
switch (p->type) {
|
||||
case PLIST_BLDDEP:
|
||||
printf("%s\n", p->name);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: Makefile,v 1.20 2003/08/24 21:10:47 tron Exp $
|
||||
# $NetBSD: Makefile,v 1.21 2003/09/02 07:34:59 jlam Exp $
|
||||
# Original from FreeBSD, no rcs id.
|
||||
|
||||
NOLINT= # defined
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
#include "lib.h"
|
||||
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: fexec.c,v 1.3 2003/08/25 10:52:23 tron Exp $");
|
||||
__RCSID("$NetBSD: fexec.c,v 1.4 2003/09/02 07:35:00 jlam Exp $");
|
||||
#endif
|
||||
|
||||
static int vfcexec(const char *, const char *, va_list);
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: file.c,v 1.62 2003/07/14 06:00:45 itojun Exp $ */
|
||||
/* $NetBSD: file.c,v 1.63 2003/09/02 07:35:00 jlam 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.62 2003/07/14 06:00:45 itojun Exp $");
|
||||
__RCSID("$NetBSD: file.c,v 1.63 2003/09/02 07:35:00 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -31,8 +31,6 @@ __RCSID("$NetBSD: file.c,v 1.62 2003/07/14 06:00:45 itojun Exp $");
|
|||
|
||||
#include "lib.h"
|
||||
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <err.h>
|
||||
#include <netdb.h>
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/* $NetBSD: ftpio.c,v 1.52 2003/07/14 06:17:56 itojun Exp $ */
|
||||
/* $NetBSD: ftpio.c,v 1.53 2003/09/02 07:35:01 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: ftpio.c,v 1.52 2003/07/14 06:17:56 itojun Exp $");
|
||||
__RCSID("$NetBSD: ftpio.c,v 1.53 2003/09/02 07:35:01 jlam Exp $");
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: lib.h,v 1.54 2003/08/25 10:23:41 tron Exp $ */
|
||||
/* $NetBSD: lib.h,v 1.55 2003/09/02 07:35:02 jlam Exp $ */
|
||||
|
||||
/* from FreeBSD Id: lib.h,v 1.25 1997/10/08 07:48:03 charnier Exp */
|
||||
|
||||
|
@ -89,14 +89,6 @@
|
|||
#define CHGRP_CMD "chgrp"
|
||||
#endif
|
||||
|
||||
/* Where we put logging information by default, else ${PKG_DBDIR} if set */
|
||||
#ifndef DEF_LOG_DIR
|
||||
#define DEF_LOG_DIR "/var/db/pkg"
|
||||
#endif
|
||||
|
||||
/* just in case we change the environment variable name */
|
||||
#define PKG_DBDIR "PKG_DBDIR"
|
||||
|
||||
/* The names of our "special" files */
|
||||
#define CONTENTS_FNAME "+CONTENTS"
|
||||
#define COMMENT_FNAME "+COMMENT"
|
||||
|
@ -112,6 +104,8 @@
|
|||
#define SIZE_PKG_FNAME "+SIZE_PKG"
|
||||
#define SIZE_ALL_FNAME "+SIZE_ALL"
|
||||
#define PRESERVE_FNAME "+PRESERVE"
|
||||
#define VIEWS_FNAME "+VIEWS"
|
||||
#define DEPOT_FNAME "+DEPOT"
|
||||
|
||||
#define CMD_CHAR '@' /* prefix for extended PLIST cmd */
|
||||
|
||||
|
@ -292,6 +286,7 @@ int pkgdb_remove(const char *);
|
|||
int pkgdb_remove_pkg(const char *);
|
||||
char *_pkgdb_getPKGDB_FILE(char *, unsigned);
|
||||
char *_pkgdb_getPKGDB_DIR(void);
|
||||
void _pkgdb_setPKGDB_DIR(const char *);
|
||||
|
||||
/* List of packages functions */
|
||||
lpkg_t *alloc_lpkg(const char *);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: lpkg.c,v 1.4 2003/01/05 21:27:31 agc Exp $ */
|
||||
/* $NetBSD: lpkg.c,v 1.5 2003/09/02 07:35:02 jlam Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1999 Christian E. Hopps
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: path.c,v 1.5 2003/01/05 21:27:32 agc Exp $ */
|
||||
/* $NetBSD: path.c,v 1.6 2003/09/02 07:35:03 jlam Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c)2002 YAMAMOTO Takashi,
|
||||
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: path.c,v 1.5 2003/01/05 21:27:32 agc Exp $");
|
||||
__RCSID("$NetBSD: path.c,v 1.6 2003/09/02 07:35:03 jlam Exp $");
|
||||
#endif
|
||||
|
||||
#include <err.h>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: path.h,v 1.3 2002/08/29 21:46:34 abs Exp $ */
|
||||
/* $NetBSD: path.h,v 1.4 2003/09/02 07:35:03 jlam Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c)2002 YAMAMOTO Takashi,
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: pen.c,v 1.29 2003/08/25 10:23:06 tron Exp $ */
|
||||
/* $NetBSD: pen.c,v 1.30 2003/09/02 07:35:03 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static const char *rcsid = "from FreeBSD Id: pen.c,v 1.25 1997/10/08 07:48:12 charnier Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: pen.c,v 1.29 2003/08/25 10:23:06 tron Exp $");
|
||||
__RCSID("$NetBSD: pen.c,v 1.30 2003/09/02 07:35:03 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/* $NetBSD: pkgdb.c,v 1.14 2003/03/15 20:49:27 agc Exp $ */
|
||||
/* $NetBSD: pkgdb.c,v 1.15 2003/09/02 07:35:04 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: pkgdb.c,v 1.14 2003/03/15 20:49:27 agc Exp $");
|
||||
__RCSID("$NetBSD: pkgdb.c,v 1.15 2003/09/02 07:35:04 jlam Exp $");
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -46,7 +46,19 @@ __RCSID("$NetBSD: pkgdb.c,v 1.14 2003/03/15 20:49:27 agc Exp $");
|
|||
|
||||
#define PKGDB_FILE "pkgdb.byfile.db" /* indexed by filename */
|
||||
|
||||
/*
|
||||
* Where we put logging information by default if PKG_DBDIR is unset.
|
||||
*/
|
||||
#ifndef DEF_LOG_DIR
|
||||
#define DEF_LOG_DIR "/var/db/pkg"
|
||||
#endif
|
||||
|
||||
/* just in case we change the environment variable name */
|
||||
#define PKG_DBDIR "PKG_DBDIR"
|
||||
|
||||
static DB *pkgdbp;
|
||||
static char *pkgdb_dir = NULL;
|
||||
static char pkgdb_cache[FILENAME_MAX];
|
||||
|
||||
/*
|
||||
* Open the pkg-database
|
||||
|
@ -237,10 +249,23 @@ char *
|
|||
_pkgdb_getPKGDB_DIR(void)
|
||||
{
|
||||
char *tmp;
|
||||
static char *cache = NULL;
|
||||
|
||||
if (cache == NULL)
|
||||
cache = (tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR;
|
||||
|
||||
return cache;
|
||||
if (pkgdb_dir == NULL) {
|
||||
if ((tmp = getenv(PKG_DBDIR)))
|
||||
_pkgdb_setPKGDB_DIR(tmp);
|
||||
else
|
||||
_pkgdb_setPKGDB_DIR(DEF_LOG_DIR);
|
||||
}
|
||||
|
||||
return pkgdb_dir;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the first place we look for where pkgdb is stored.
|
||||
*/
|
||||
void
|
||||
_pkgdb_setPKGDB_DIR(const char *dir)
|
||||
{
|
||||
(void) snprintf(pkgdb_cache, sizeof(pkgdb_cache), "%s", dir);
|
||||
pkgdb_dir = pkgdb_cache;
|
||||
}
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: plist.c,v 1.39 2003/07/14 06:17:56 itojun Exp $ */
|
||||
/* $NetBSD: plist.c,v 1.40 2003/09/02 07:35:04 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#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.39 2003/07/14 06:17:56 itojun Exp $");
|
||||
__RCSID("$NetBSD: plist.c,v 1.40 2003/09/02 07:35:04 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* $NetBSD: str.c,v 1.42 2003/01/05 21:27:34 agc Exp $ */
|
||||
/* $NetBSD: str.c,v 1.43 2003/09/02 07:35:04 jlam Exp $ */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static const char *rcsid = "Id: str.c,v 1.5 1997/10/08 07:48:21 charnier Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: str.c,v 1.42 2003/01/05 21:27:34 agc Exp $");
|
||||
__RCSID("$NetBSD: str.c,v 1.43 2003/09/02 07:35:04 jlam Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: version.h,v 1.27 2003/04/23 10:02:24 seb Exp $ */
|
||||
/* $NetBSD: version.h,v 1.28 2003/09/02 07:35:05 jlam Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001 Thomas Klausner. All rights reserved.
|
||||
|
@ -33,6 +33,6 @@
|
|||
#ifndef _INST_LIB_VERSION_H_
|
||||
#define _INST_LIB_VERSION_H_
|
||||
|
||||
#define PKGTOOLS_VERSION "20030423"
|
||||
#define PKGTOOLS_VERSION "20030823"
|
||||
|
||||
#endif /* _INST_LIB_VERSION_H_ */
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
# $NetBSD: Makefile,v 1.2 2003/09/02 07:35:06 jlam Exp $
|
||||
|
||||
SCRIPTS= linkfarm.sh pkg_view.sh
|
||||
MAN= linkfarm.1 pkg_view.1
|
||||
|
||||
.include <bsd.prog.mk>
|
|
@ -0,0 +1,144 @@
|
|||
.\" $NetBSD: linkfarm.1,v 1.2 2003/09/02 07:35:07 jlam Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 2003 The NetBSD Foundation, Inc.
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by the NetBSD
|
||||
.\" Foundation, Inc. and its contributors.
|
||||
.\" 4. Neither the name of The NetBSD Foundation nor the names of its
|
||||
.\" contributors may be used to endorse or promote products derived
|
||||
.\" from this software without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||||
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||||
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
.\" POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd July 13, 2003
|
||||
.Dt LINKFARM 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm linkfarm
|
||||
.Nd a utility for managing symbolic links to package files
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Ar options
|
||||
.Ar package
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
command is used to manage a "linkfarm", a directory tree of symbolic links in
|
||||
.Ar target
|
||||
to the files in the
|
||||
.Ar package
|
||||
sub-directory of
|
||||
.Ar stowdir .
|
||||
The default action is to create a linkfarm to a package.
|
||||
.Pp
|
||||
The following command-line options are supported:
|
||||
.Bl -tag -width indent
|
||||
.It Fl c
|
||||
Check whether a package contains a linkfarm in
|
||||
.Ar target .
|
||||
If
|
||||
.Ar package
|
||||
has no symbolic links in
|
||||
.Ar target
|
||||
that correspond to its files, then return 0, otherwise return 1.
|
||||
.It Fl D
|
||||
Delete the linkfarm for
|
||||
.Ar package .
|
||||
.It Fl d Ar stowdir
|
||||
Set
|
||||
.Ar stowdir
|
||||
as the directory in which
|
||||
.Ar package
|
||||
can be found.
|
||||
The default
|
||||
.Ar stowdir
|
||||
is the
|
||||
.Pa packages
|
||||
sub-directory in the default
|
||||
.Ar target
|
||||
directory.
|
||||
.It Fl n
|
||||
Don't actually execute the commands for removing and creating the symbolic
|
||||
links and directories.
|
||||
.It Fl R
|
||||
Delete and re-create the linkfarm for
|
||||
.Ar package .
|
||||
.It Fl s Ar subdir
|
||||
The root of the package hierarchy for the linkfarm is the
|
||||
.Ar subdir
|
||||
sub-directory in the package.
|
||||
By default, assume the root of the package hierarchy is simply the
|
||||
.Ar package
|
||||
directory.
|
||||
.It Fl t Ar target
|
||||
Set
|
||||
.Ar target
|
||||
as the directory in which to create and delete the linkfarm for
|
||||
.Ar package .
|
||||
The default
|
||||
.Ar target
|
||||
directory is
|
||||
.Pa /usr/pkg
|
||||
but may be overridden by the
|
||||
.Ev LOCALBASE
|
||||
environment variable.
|
||||
.It Fl V
|
||||
Print version number and exit.
|
||||
.It Fl v
|
||||
Turn on verbose output.
|
||||
Specifying
|
||||
.Fl v
|
||||
multiple times increases the level of verbosity.
|
||||
.El
|
||||
.Sh ENVIRONMENT
|
||||
.Bl -tag -width indent
|
||||
.It Ev LOCALBASE
|
||||
The standard packages directory,
|
||||
.Pa /usr/pkg ,
|
||||
can be overridden by specifying an alternative directory in the
|
||||
.Ev LOCALBASE
|
||||
environment variable. This affects the default
|
||||
.Ar target
|
||||
and
|
||||
.Ar stowdir
|
||||
directories.
|
||||
.It Ev PLIST_IGNORE_FILES
|
||||
This can be used to specify files in
|
||||
.Ar package
|
||||
that should ignored when creating and deleting symbolic links in
|
||||
.Ar target .
|
||||
.Ev PLIST_IGNORE_FILES
|
||||
is a space-separated list of shell glob patterns that match files relative
|
||||
to the
|
||||
.Ar package
|
||||
directory, and it defaults to "info/dir *[~#] *.OLD *.orig *,v".
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr lndir 1 ,
|
||||
.Xr pkg_view 1
|
||||
.Sh AUTHORS
|
||||
The
|
||||
.Nm
|
||||
utility was written by
|
||||
.An Alistair G. Crooks Aq agc@netbsd.org .
|
|
@ -0,0 +1,221 @@
|
|||
#! /bin/sh
|
||||
|
||||
# $NetBSD: linkfarm.sh,v 1.2 2003/09/02 07:35:07 jlam Exp $
|
||||
|
||||
#
|
||||
# Copyright (c) 2002 Alistair G. Crooks. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. All advertising materials mentioning features or use of this software
|
||||
# must display the following acknowledgement:
|
||||
# This product includes software developed by Alistair G. Crooks.
|
||||
# 4. The name of the author may not be used to endorse or promote
|
||||
# products derived from this software without specific prior written
|
||||
# permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# set -x
|
||||
|
||||
# set up program definitions
|
||||
findprog=/usr/bin/find
|
||||
grepprog=/usr/bin/grep
|
||||
lnprog=/bin/ln
|
||||
mkdirprog=/bin/mkdir
|
||||
pkginfoprog=/usr/sbin/pkg_info
|
||||
rmprog=/bin/rm
|
||||
rmdirprog=/bin/rmdir
|
||||
sedprog=/usr/bin/sed
|
||||
sortprog=/usr/bin/sort
|
||||
|
||||
usage() {
|
||||
echo 'Usage: linkfarm [options] package'
|
||||
exit 1
|
||||
}
|
||||
|
||||
version() {
|
||||
$pkginfoprog -V
|
||||
exit 0
|
||||
}
|
||||
|
||||
checkdir() {
|
||||
if [ ! -d "$1" ]; then
|
||||
echo "linkfarm: \`$1' doesn't exist"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
ignorefiles=${PLIST_IGNORE_FILES:-"info/dir *[~#] *.OLD *.orig *,v"}
|
||||
linktype=-s
|
||||
|
||||
# default action: create a linkfarm in $target from $stowdir/$1
|
||||
# i.e. linkfarm --target=${prefix}/${view} --dir=${prefix}/packages $1
|
||||
#
|
||||
doit=""
|
||||
target=${LOCALBASE:-/usr/pkg}
|
||||
stowdir=${target}/packages
|
||||
subdir=""
|
||||
verbose=0
|
||||
|
||||
# default action is to create
|
||||
check=no
|
||||
delete=no
|
||||
create=yes
|
||||
|
||||
# process args - can't use getopt(1) because of '--' style args
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
-D) delete=yes; create=no ;;
|
||||
-R) delete=yes; create=yes ;;
|
||||
-V) version ;;
|
||||
-c) check=yes; doit=":" ;;
|
||||
-d) stowdir=$2; shift ;;
|
||||
-d*) stowdir=`echo $1 | $sedprog -e 's|-d||'` ;;
|
||||
-s) subdir=$2; shift ;;
|
||||
-s*) subdir=`echo $1 | $sedprog -e 's|-s||'` ;;
|
||||
-t) target=$2; shift ;;
|
||||
-t*) target=`echo $1 | $sedprog -e 's|-t||'` ;;
|
||||
-n) doit=":" ;;
|
||||
-v) verbose=`expr $verbose + 1` ;;
|
||||
|
||||
--delete) delete=yes; create=no ;;
|
||||
--dir=*) stowdir=`echo $1 | $sedprog -e 's|--dir=||'` ;;
|
||||
--restow) delete=yes; create=yes ;;
|
||||
--subdir=*) subdir=`echo $1 | $sedprog -e 's|--subdir=||'` ;;
|
||||
--target=*) target=`echo $1 | $sedprog -e 's|--target=||'` ;;
|
||||
--version) version ;;
|
||||
|
||||
--) shift; break ;;
|
||||
*) break ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# set the package name
|
||||
package=$1
|
||||
|
||||
# make sure stowdir has a full pathname
|
||||
case $stowdir in
|
||||
/*) ;;
|
||||
*) stowdir=`pwd`/$stowdir ;;
|
||||
esac
|
||||
|
||||
# Set the directory from which we symlink.
|
||||
case $subdir in
|
||||
"") fromdir=$stowdir/$package ;;
|
||||
*) fromdir=$stowdir/$package/$subdir ;;
|
||||
esac
|
||||
|
||||
# Set the directory to which we symlink.
|
||||
case $target in
|
||||
/*) todir=$target ;;
|
||||
*) todir=`pwd`/$target ;;
|
||||
esac
|
||||
|
||||
# if we're checking the entries, check, then exit
|
||||
case $check in
|
||||
yes)
|
||||
checkdir $fromdir
|
||||
(cd $fromdir;
|
||||
ex=0;
|
||||
for f in `$findprog . ! -type d -print`; do
|
||||
newf=`echo $f | $sedprog -e 's|^\./||'`
|
||||
if [ -e $todir/$newf ]; then
|
||||
ignore=no
|
||||
for i in $ignorefiles; do
|
||||
case $newf in
|
||||
$i) ignore=yes; break ;;
|
||||
esac
|
||||
done
|
||||
case $ignore in
|
||||
no)
|
||||
echo "${newf}"; ex=1 ;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
exit $ex) || exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# if we need to get rid of old linkfarms, do it
|
||||
case $delete in
|
||||
yes)
|
||||
checkdir $fromdir
|
||||
(cd $fromdir;
|
||||
for f in `$findprog . ! -type d -print`; do
|
||||
newf=`echo $f | $sedprog -e 's|^\./||'`
|
||||
ignore=no
|
||||
for i in $ignorefiles; do
|
||||
case $newf in
|
||||
$i) ignore=yes; break ;;
|
||||
esac
|
||||
done
|
||||
case $ignore in
|
||||
no)
|
||||
if [ $verbose -gt 0 ]; then
|
||||
echo "$rmprog $todir/$newf"
|
||||
fi
|
||||
$doit $rmprog $todir/$f ;;
|
||||
esac
|
||||
done
|
||||
for d in `$findprog . -type d -print | $sortprog -r`; do
|
||||
if [ $verbose -gt 0 ]; then
|
||||
echo "$rmdirprog $todir/$d"
|
||||
fi
|
||||
$doit $rmdirprog $todir/$d > /dev/null 2>&1
|
||||
done)
|
||||
;;
|
||||
esac
|
||||
|
||||
# if we need to create new linkfarms, do it
|
||||
case $create in
|
||||
yes)
|
||||
checkdir $fromdir
|
||||
(cd $fromdir;
|
||||
for d in `$findprog . -type d -print`; do
|
||||
newd=`echo $d | $sedprog -e 's|^\./||'`
|
||||
case "$d" in
|
||||
"") continue ;;
|
||||
esac
|
||||
if [ $verbose -gt 0 ]; then
|
||||
echo "$mkdirprog -p $todir/$newd"
|
||||
fi
|
||||
$doit $mkdirprog -p $todir/$newd > /dev/null 2>&1
|
||||
done
|
||||
for f in `$findprog . ! -type d -print`; do
|
||||
newf=`echo $f | $sedprog -e 's|^\./||'`
|
||||
ignore=no
|
||||
for i in $ignorefiles; do
|
||||
case $newf in
|
||||
$i) ignore=yes; break ;;
|
||||
esac
|
||||
done
|
||||
case $ignore in
|
||||
no)
|
||||
if [ $verbose -gt 0 ]; then
|
||||
echo "$lnprog ${linktype} $fromdir/$newf $todir/$newf"
|
||||
fi
|
||||
$doit $lnprog ${linktype} $fromdir/$newf $todir/$newf ;;
|
||||
esac
|
||||
done)
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,269 @@
|
|||
.\" $NetBSD: pkg_view.1,v 1.2 2003/09/02 07:35:08 jlam Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 2003 The NetBSD Foundation, Inc.
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by the NetBSD
|
||||
.\" Foundation, Inc. and its contributors.
|
||||
.\" 4. Neither the name of The NetBSD Foundation nor the names of its
|
||||
.\" contributors may be used to endorse or promote products derived
|
||||
.\" from this software without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||||
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||||
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
.\" POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd July 13, 2003
|
||||
.Dt PKG_VIEW 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm pkg_view
|
||||
.Nd a utility for managing package views
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Ar options
|
||||
.Ar command
|
||||
.Ar package ...
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
command is used to add and delete packages in
|
||||
.Ar stowdir
|
||||
into a
|
||||
.Ar view
|
||||
in the
|
||||
.Ar viewbase
|
||||
directory.
|
||||
.Sh WARNING
|
||||
.Bf -emphasis
|
||||
Since the
|
||||
.Nm
|
||||
command may execute scripts or programs contained within a package file,
|
||||
your system may be susceptible to ``Trojan horses'' or other subtle
|
||||
attacks from miscreants who create dangerous package files.
|
||||
.Pp
|
||||
You are advised to verify the competence and identity of those who
|
||||
provide installable package files.
|
||||
For extra protection, use the
|
||||
.Fl M
|
||||
flag to extract the package file, and inspect its contents and scripts
|
||||
to ensure it poses no danger to your system's integrity.
|
||||
Pay particular attention to any +INSTALL, +DEINSTALL, +REQUIRE
|
||||
or +MTREE_DIRS files, and inspect the +CONTENTS file for
|
||||
.Cm @cwd ,
|
||||
.Cm @mode
|
||||
(check for setuid),
|
||||
.Cm @dirrm ,
|
||||
.Cm @exec ,
|
||||
and
|
||||
.Cm @unexec
|
||||
directives, and/or use the
|
||||
.Xr pkg_info 1
|
||||
command to examine the package file.
|
||||
.Ef
|
||||
.Sh OPTIONS
|
||||
The following command-line options are supported:
|
||||
.Bl -tag -width indent
|
||||
.It Fl d Ar stowdir
|
||||
Set
|
||||
.Ar stowdir
|
||||
as the directory in which the installed packages can be found.
|
||||
If this option isn't specified, then the
|
||||
.Ar stowdir
|
||||
is taken from the value of the environment variable
|
||||
.Ev DEPOTBASE
|
||||
if it's set, otherwise the default
|
||||
.Ar stowdir
|
||||
is the
|
||||
.Pa packages
|
||||
directory under
|
||||
.Ar viewbase .
|
||||
.It Fl i Ar ignore
|
||||
Add
|
||||
.Ar ignore
|
||||
to the list of files in
|
||||
.Ar package
|
||||
that should ignored when adding or removing the package from
|
||||
.Ar view .
|
||||
.It Fl k Ar pkg_dbdir
|
||||
Set
|
||||
.Ar pkg_dbdir
|
||||
as the package database directory for the default (empty) view.
|
||||
If this option isn't specified, then the package database directory is
|
||||
taken from the value of the environment variable
|
||||
.Ev PKG_DBDIR ,
|
||||
otherwise it defaults to
|
||||
.Pa /var/db/pkg .
|
||||
.It Fl n
|
||||
Don't actually execute the commands for manipulating the depoted packages.
|
||||
.It Fl V
|
||||
Print the version number and exit.
|
||||
.It Fl v
|
||||
Turn on verbose output.
|
||||
Specifying
|
||||
.Fl v
|
||||
multiple times increases the level of verbosity.
|
||||
.It Fl W Ar viewbase
|
||||
Set
|
||||
.Ar viewbase
|
||||
as the directory in which all the views are managed.
|
||||
The default
|
||||
.Ar viewbase
|
||||
directory is
|
||||
.Pa /usr/pkg
|
||||
but may be overridden by the
|
||||
.Ev LOCALBASE
|
||||
environment variable.
|
||||
.It Fl w Ar view
|
||||
Set
|
||||
.Ar view
|
||||
as the directory in
|
||||
.Ar viewbase
|
||||
in which the packages should be added or removed.
|
||||
The default
|
||||
.Ar view
|
||||
is the empty view but may be overridden by the
|
||||
.Ev PKG_VIEW
|
||||
environment variable.
|
||||
.El
|
||||
.Pp
|
||||
The following commands are supported:
|
||||
.Bl -tag -width indent
|
||||
.It Ar add
|
||||
Add the listed packages into
|
||||
.Ar view .
|
||||
.It Ar check
|
||||
Check whether the listed packages are present in
|
||||
.Ar view .
|
||||
If they are not present, then return 0, otherwise return 1.
|
||||
.It Ar delete
|
||||
Delete the listed packages from
|
||||
.Ar view .
|
||||
.El
|
||||
.Sh ENVIRONMENT
|
||||
.Bl -tag -width indent
|
||||
.It Ev DEPOTBASE
|
||||
This is the location of the
|
||||
.Ar stowdir
|
||||
directory inside which all depoted packages are kept.
|
||||
The default
|
||||
.Ar stowdir
|
||||
is the
|
||||
.Pa packages
|
||||
directory under
|
||||
.Ar viewbase .
|
||||
.It Ev LOCALBASE
|
||||
This is the location of the
|
||||
.Ar viewbase
|
||||
directory in which all the views are managed.
|
||||
The default
|
||||
.Ar viewbase
|
||||
directory is
|
||||
.Pa /usr/pkg .
|
||||
.It Ev PKG_DBDIR
|
||||
If the
|
||||
.Fl k
|
||||
flag isn't given, then the value of the environment variable
|
||||
.Ev PKG_DBDIR
|
||||
is the package database directory for the default view,
|
||||
otherwise it defaults to
|
||||
.Pa /var/db/pkg .
|
||||
.It Ev PLIST_IGNORE_FILES
|
||||
This can be used to specify files in
|
||||
.Ar package
|
||||
that should ignored when adding or removing the package from
|
||||
.Ar view .
|
||||
.Ev PLIST_IGNORE_FILES
|
||||
is a space-separated list of shell glob patterns that match files relative
|
||||
to the
|
||||
.Ar package
|
||||
directory, and it defaults to "info/dir *[~#] *.OLD *.orig *,v".
|
||||
This is overridden by any
|
||||
.Ev _PLIST_IGNORE_FILES
|
||||
setting in a package's
|
||||
.Ar build-info-file
|
||||
(see
|
||||
.Xr pkg_create 1
|
||||
) if it exists.
|
||||
.It Ev PKG_VIEW
|
||||
The default view can be specified in the
|
||||
.Ev PKG_VIEW
|
||||
environment variable.
|
||||
.El
|
||||
.Sh FILES
|
||||
.Bl -tag -width indent
|
||||
.It Pa <pkg-dbdir>/<package>/+INSTALL
|
||||
If the package contains an
|
||||
.Ar install
|
||||
script (see
|
||||
.Xr pkg_create 1 ) ,
|
||||
then after the package is added into a view, the script is executed
|
||||
with the following arguments:
|
||||
.Bl -tag -width package
|
||||
.It Ar package
|
||||
The name of the package being installed.
|
||||
.It Cm VIEW-INSTALL
|
||||
Keyword denoting that the script is to perform any actions needed after
|
||||
the package is added to a view.
|
||||
.El
|
||||
.Pp
|
||||
If the
|
||||
.Ar install
|
||||
script exits with a non-zero status code, the installation is terminated.
|
||||
.It Pa <pkg-dbdir>/<package>/+DEINSTALL
|
||||
If the package contains an
|
||||
.Ar deinstall
|
||||
script (see
|
||||
.Xr pkg_create 1 ) ,
|
||||
then before the package is removed from a view, the script is executed
|
||||
with the following arguments:
|
||||
.Bl -tag -width package
|
||||
.It Ar package
|
||||
The name of the package being installed.
|
||||
.It Cm VIEW-DEINSTALL
|
||||
Keyword denoting that the script is to perform any actions needed before
|
||||
the package is removed from a view.
|
||||
.El
|
||||
.Pp
|
||||
If the
|
||||
.Ar deinstall
|
||||
script exits with a non-zero status code, the de-installation is terminated.
|
||||
.El
|
||||
.Pp
|
||||
The
|
||||
.Ar install
|
||||
and
|
||||
.Ar deinstall
|
||||
scripts are called with the environment variable
|
||||
.Ev PKG_PREFIX
|
||||
set to the path to the
|
||||
.Ar view
|
||||
directory.
|
||||
.Sh SEE ALSO
|
||||
.Xr linkfarm 1 ,
|
||||
.Xr pkg_delete 1
|
||||
.Sh AUTHORS
|
||||
The
|
||||
.Nm
|
||||
utility was written by
|
||||
.An Alistair G. Crooks Aq agc@netbsd.org .
|
||||
.Sh BUGS
|
||||
Only the empty view is supported.
|
|
@ -0,0 +1,276 @@
|
|||
#! /bin/sh
|
||||
|
||||
# $NetBSD: pkg_view.sh,v 1.2 2003/09/02 07:35:08 jlam Exp $
|
||||
|
||||
#
|
||||
# Copyright (c) 2001 Alistair G. Crooks. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. All advertising materials mentioning features or use of this software
|
||||
# must display the following acknowledgement:
|
||||
# This product includes software developed by Alistair G. Crooks.
|
||||
# 4. The name of the author may not be used to endorse or promote
|
||||
# products derived from this software without specific prior written
|
||||
# permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# set -x
|
||||
|
||||
# set up program definitions
|
||||
chmodprog=/bin/chmod
|
||||
cmpprog=/usr/bin/cmp
|
||||
cpprog=/bin/cp
|
||||
envprog=/usr/bin/env
|
||||
findprog=/usr/bin/find
|
||||
grepprog=/usr/bin/grep
|
||||
linkfarmprog=/usr/sbin/linkfarm
|
||||
lnprog=/bin/ln
|
||||
mkdirprog=/bin/mkdir
|
||||
paxprog=/bin/pax
|
||||
pkginfoprog=/usr/sbin/pkg_info
|
||||
rmprog=/bin/rm
|
||||
rmdirprog=/bin/rmdir
|
||||
sedprog=/usr/bin/sed
|
||||
touchprog=/usr/bin/touch
|
||||
|
||||
usage() {
|
||||
echo 'Usage: pkg_view [-n] [-v] [-i ignore] [-k pkg_dbdir_dflt] [-w viewname] [-d stowdir] [-W viewbase] add|check|delete pkgname...'
|
||||
exit 1
|
||||
}
|
||||
|
||||
version() {
|
||||
$pkginfoprog -V
|
||||
exit 0
|
||||
}
|
||||
|
||||
checkpkg() {
|
||||
if [ ! -d "$2/$1" ]; then
|
||||
echo "pkg_view: \`$1' doesn't exist in \`$2'" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
#########################################
|
||||
# Initialization and Options Processing #
|
||||
#########################################
|
||||
|
||||
doit=""
|
||||
stowdir=""
|
||||
viewbase=${LOCALBASE:-/usr/pkg}
|
||||
view=${PKG_VIEW:-""}
|
||||
dflt_ignorefiles=${PLIST_IGNORE_FILES:-"info/dir *[~#] *.OLD *.orig *,v"}
|
||||
dflt_pkg_dbdir=${PKG_DBDIR:-/var/db/pkg}
|
||||
ignorefiles=""
|
||||
verbose=0
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
-d) stowdir=$2; shift ;;
|
||||
-d*) stowdir=`echo $1 | $sedprog -e 's|^-d||'` ;;
|
||||
-i) ignorefiles="$ignorefiles $2"; shift ;;
|
||||
-i*) ignorefiles="$ignorefiles `echo $1 | $sedprog -e 's|^-i||'`" ;;
|
||||
-k) dflt_pkg_dbdir="$2"; shift ;;
|
||||
-k*) dflt_pkg_dbdir=`echo $1 | $sedprog -e 's|^-k||'` ;;
|
||||
-n) doit=":" ;;
|
||||
-V) version ;;
|
||||
-v) verbose=`expr $verbose + 1` ;;
|
||||
-W) viewbase=$2; shift ;;
|
||||
-W*) viewbase=`echo $1 | $sedprog -e 's|^-p||'` ;;
|
||||
-w) view=$2; shift ;;
|
||||
--view=*) view=`echo $1 | $sedprog -e 's|--view=||'` ;;
|
||||
--) shift; break ;;
|
||||
*) break ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if [ $# -lt 1 ]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
# echoN will actually give output if ${verbose} > N.
|
||||
echo1=":"
|
||||
echo2=":"
|
||||
if [ ${verbose} -gt 0 ]; then echo1=echo; fi
|
||||
if [ ${verbose} -gt 1 ]; then echo2=echo; fi
|
||||
|
||||
action=""
|
||||
case "$1" in
|
||||
add) action=add ;;
|
||||
check) action=check ;;
|
||||
delete|rm) action=delete ;;
|
||||
*) usage ;;
|
||||
esac
|
||||
shift
|
||||
|
||||
# XXX Only support the standard view for now.
|
||||
case "$view" in
|
||||
"") ;;
|
||||
*) echo "pkg_view: only the standard view is supported" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# if standard view, put package info into ${dflt_pkg_dbdir}
|
||||
# if not standard view, put package info into view's pkgdb
|
||||
case "$view" in
|
||||
"")
|
||||
pkg_dbdir=${dflt_pkg_dbdir}
|
||||
targetdir=${viewbase}
|
||||
viewstr="the standard view"
|
||||
;;
|
||||
*)
|
||||
pkg_dbdir=${viewbase}/${view}/.pkgdb
|
||||
targetdir=${viewbase}/${view}
|
||||
viewstr="view \"${view}\""
|
||||
;;
|
||||
esac
|
||||
|
||||
# Use stowdir if it's given, else fall back to ${DEPOTBASE} or else
|
||||
# default to ${viewbase}/packages.
|
||||
#
|
||||
depot_pkg_dbdir=${stowdir:-${DEPOTBASE:-${viewbase}/packages}}
|
||||
|
||||
case "${depot_pkg_dbdir}" in
|
||||
${pkg_dbdir})
|
||||
echo "pkg_view: the depot and the view package database directories are the same" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
##########################
|
||||
# Shell helper functions #
|
||||
##########################
|
||||
|
||||
# symlinks check|add|delete <pkg>
|
||||
#
|
||||
# Calls linkfarm(1) to check, add or delete the symlink farm in
|
||||
# ${targetdir}. We also ignore the right set of files when doing the
|
||||
# linkfarm operations.
|
||||
#
|
||||
symlinks() {
|
||||
pkg=$2
|
||||
case "$1" in
|
||||
add) linkfarmflags="" ;;
|
||||
check) linkfarmflags="-c" ;;
|
||||
delete) linkfarmflags="-D" ;;
|
||||
esac
|
||||
if [ -f ${depot_pkg_dbdir}/$pkg/+BUILD_INFO ]; then
|
||||
ignore=`$grepprog "^_PLIST_IGNORE_FILES=" ${depot_pkg_dbdir}/$pkg/+BUILD_INFO | $sedprog -e 's|^_PLIST_IGNORE_FILES=[ ]*||'`
|
||||
fi
|
||||
case "$ignore" in
|
||||
"") ignore="${dflt_ignorefiles}" ;;
|
||||
esac
|
||||
dbs=`(cd ${depot_pkg_dbdir}/$pkg; echo +*)`
|
||||
ignore="${ignore} ${ignorefiles} $dbs"
|
||||
$doit $envprog PLIST_IGNORE_FILES="${ignore}" $linkfarmprog $linkfarmflags --target=${targetdir} --dir=${depot_pkg_dbdir} $pkg
|
||||
}
|
||||
|
||||
#############
|
||||
# Main Loop #
|
||||
#############
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case $action in
|
||||
add)
|
||||
checkpkg $1 ${depot_pkg_dbdir}
|
||||
if [ -f ${pkg_dbdir}/$1/+DEPOT ]; then
|
||||
echo "pkg_view: \`$1' already exists in $viewstr" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
$echo1 "Adding $1 to ${targetdir}."
|
||||
symlinks add $1
|
||||
$doit $mkdirprog -p ${depot_pkg_dbdir}/$1
|
||||
temp=${depot_pkg_dbdir}/$1/+VIEWS.$$
|
||||
$doit $touchprog ${depot_pkg_dbdir}/$1/+VIEWS
|
||||
$doit $cpprog ${depot_pkg_dbdir}/$1/+VIEWS ${temp}
|
||||
case "$doit" in
|
||||
"") ($grepprog -v '^'${pkg_dbdir}'$' ${temp} || true; echo ${pkg_dbdir}) > ${depot_pkg_dbdir}/$1/+VIEWS ;;
|
||||
esac
|
||||
$doit $rmprog ${temp}
|
||||
$doit $mkdirprog -p ${pkg_dbdir}/$1
|
||||
#
|
||||
# Copy all of the metadata files except for +VIEWS,
|
||||
# which is only for the depoted package, and
|
||||
# +REQUIRED_BY, which is irrelevant for a package in
|
||||
# a view.
|
||||
#
|
||||
case "$doit" in
|
||||
"") (cd ${depot_pkg_dbdir}/$1; $paxprog -rwpe '-s|\./\+VIEWS$||' '-s|\./\+REQUIRED_BY$||' ./+* ${pkg_dbdir}/$1)
|
||||
$sedprog -e 's|'${depot_pkg_dbdir}/$1'|'${targetdir}'|g' < ${depot_pkg_dbdir}/$1/+CONTENTS > ${pkg_dbdir}/$1/+CONTENTS
|
||||
echo "${depot_pkg_dbdir}/$1" > ${pkg_dbdir}/$1/+DEPOT
|
||||
;;
|
||||
esac
|
||||
if [ -f ${pkg_dbdir}/$1/+INSTALL ]; then
|
||||
$doit $chmodprog +x ${pkg_dbdir}/$1/+INSTALL
|
||||
$doit $envprog -i PKG_PREFIX=${targetdir} ${pkg_dbdir}/$1/+INSTALL $1 VIEW-INSTALL
|
||||
ec=$?
|
||||
if [ $ec != 0 ]; then
|
||||
echo "pkg_view: install script returned an error." 1>&2
|
||||
exit $ec
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
check)
|
||||
checkpkg $1 ${depot_pkg_dbdir}
|
||||
$echo1 "Checking $1 in ${targetdir}."
|
||||
symlinks check $1
|
||||
exit $?
|
||||
;;
|
||||
delete)
|
||||
checkpkg $1 ${depot_pkg_dbdir}
|
||||
if [ ! -f ${pkg_dbdir}/$1/+DEPOT ]; then
|
||||
echo "pkg_view: \`$1' doesn't exist in $viewstr" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
$echo1 "Deleting $1 from ${targetdir}."
|
||||
if [ -f ${pkg_dbdir}/$1/+REQUIRED_BY ]; then
|
||||
if $cmpprog -s ${pkg_dbdir}/$1/+REQUIRED_BY /dev/null; then
|
||||
: # not really required by another pkg
|
||||
else
|
||||
(echo "pkg_view: \`$1' is required by other packages:"
|
||||
$sedprog -e 's|^| |' ${pkg_dbdir}/$1/+REQUIRED_BY) 1>&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
if [ -f ${pkg_dbdir}/$1/+DEINSTALL ]; then
|
||||
$doit $chmodprog +x ${pkg_dbdir}/$1/+DEINSTALL
|
||||
$doit $envprog -i PKG_PREFIX=${targetdir} ${pkg_dbdir}/$1/+DEINSTALL $1 VIEW-DEINSTALL
|
||||
ec=$?
|
||||
if [ $ec != 0 ]; then
|
||||
echo "pkg_view: de-install script returned an error." 1>&2
|
||||
exit $ec
|
||||
fi
|
||||
fi
|
||||
symlinks delete $1
|
||||
temp=${depot_pkg_dbdir}/$1/+VIEWS.$$
|
||||
$doit $cpprog ${depot_pkg_dbdir}/$1/+VIEWS ${temp}
|
||||
case "$doit" in
|
||||
"") ($grepprog -v '^'${pkg_dbdir}'$' ${temp} || true) > ${depot_pkg_dbdir}/$1/+VIEWS ;;
|
||||
esac
|
||||
$doit $rmprog ${temp}
|
||||
$doit $rmprog -rf ${pkg_dbdir}/$1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
exit 0
|
Loading…
Reference in New Issue