summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pkg_install
diff options
context:
space:
mode:
authorflz <flz@FreeBSD.org>2006-01-09 18:27:21 +0000
committerflz <flz@FreeBSD.org>2006-01-09 18:27:21 +0000
commitc97d1806500049ffe6c3e8091ab4cfb4c997281e (patch)
tree1d907422a2b7e64739038fb6d8d33e072dc613d3 /usr.sbin/pkg_install
parent93d7e294fcdb0d064bd15e9208026d662d5c43ce (diff)
downloadFreeBSD-src-c97d1806500049ffe6c3e8091ab4cfb4c997281e.zip
FreeBSD-src-c97d1806500049ffe6c3e8091ab4cfb4c997281e.tar.gz
Add -K option to pkg_add and pkg_info.
This option saves packages to PKGDIR (if defined or current directory by default) as they are downloaded. Silent a warning when -n is used and package has a +DISPLAY file. Approved by: krion MFC after: 1 week
Diffstat (limited to 'usr.sbin/pkg_install')
-rw-r--r--usr.sbin/pkg_install/add/add.h1
-rw-r--r--usr.sbin/pkg_install/add/main.c10
-rw-r--r--usr.sbin/pkg_install/add/perform.c11
-rw-r--r--usr.sbin/pkg_install/add/pkg_add.114
-rw-r--r--usr.sbin/pkg_install/info/info.h1
-rw-r--r--usr.sbin/pkg_install/info/main.c9
-rw-r--r--usr.sbin/pkg_install/info/perform.c2
-rw-r--r--usr.sbin/pkg_install/info/pkg_info.110
-rw-r--r--usr.sbin/pkg_install/lib/lib.h2
-rw-r--r--usr.sbin/pkg_install/lib/url.c29
10 files changed, 71 insertions, 18 deletions
diff --git a/usr.sbin/pkg_install/add/add.h b/usr.sbin/pkg_install/add/add.h
index c8e8456..654a101 100644
--- a/usr.sbin/pkg_install/add/add.h
+++ b/usr.sbin/pkg_install/add/add.h
@@ -29,6 +29,7 @@ extern char *Prefix;
extern Boolean PrefixRecursive;
extern Boolean NoInstall;
extern Boolean NoRecord;
+extern Boolean KeepPackage;
extern char *Mode;
extern char *Owner;
extern char *Group;
diff --git a/usr.sbin/pkg_install/add/main.c b/usr.sbin/pkg_install/add/main.c
index 37e0a17..5f689bd 100644
--- a/usr.sbin/pkg_install/add/main.c
+++ b/usr.sbin/pkg_install/add/main.c
@@ -27,7 +27,7 @@ __FBSDID("$FreeBSD$");
#include "lib.h"
#include "add.h"
-static char Options[] = "hvIRfnrp:P:SMt:C:";
+static char Options[] = "hvIRfnrp:P:SMt:C:K";
char *Prefix = NULL;
Boolean PrefixRecursive = FALSE;
@@ -35,6 +35,7 @@ char *Chroot = NULL;
Boolean NoInstall = FALSE;
Boolean NoRecord = FALSE;
Boolean Remote = FALSE;
+Boolean KeepPackage = FALSE;
char *Mode = NULL;
char *Owner = NULL;
@@ -131,9 +132,12 @@ main(int argc, char **argv)
Force = TRUE;
break;
+ case 'K':
+ KeepPackage = TRUE;
+ break;
+
case 'n':
Fake = TRUE;
- Verbose = TRUE;
break;
case 'r':
@@ -317,7 +321,7 @@ static void
usage()
{
fprintf(stderr, "%s\n%s\n",
- "usage: pkg_add [-vInrfRMS] [-t template] [-p prefix] [-P prefix] [-C chrootdir]",
+ "usage: pkg_add [-vInrfRMSK] [-t template] [-p prefix] [-P prefix] [-C chrootdir]",
" pkg-name [pkg-name ...]");
exit(1);
}
diff --git a/usr.sbin/pkg_install/add/perform.c b/usr.sbin/pkg_install/add/perform.c
index 56a06b1..2050e51 100644
--- a/usr.sbin/pkg_install/add/perform.c
+++ b/usr.sbin/pkg_install/add/perform.c
@@ -102,7 +102,7 @@ pkg_do(char *pkg)
else {
/* Is it an ftp://foo.bar.baz/file.t[bg]z specification? */
if (isURL(pkg)) {
- if (!(Home = fileGetURL(NULL, pkg))) {
+ if (!(Home = fileGetURL(NULL, pkg, KeepPackage))) {
warnx("unable to fetch '%s' by URL", pkg);
return 1;
}
@@ -334,7 +334,7 @@ pkg_do(char *pkg)
++code;
}
}
- else if ((cp = fileGetURL(pkg, p->name)) != NULL) {
+ else if ((cp = fileGetURL(pkg, p->name, KeepPackage)) != NULL) {
if (Verbose)
printf("Finished loading %s over FTP.\n", p->name);
if (!fexists("+CONTENTS")) {
@@ -547,8 +547,11 @@ pkg_do(char *pkg)
fputs(buf, stdout);
putc('\n', stdout);
(void) fclose(fp);
- } else
- warnx("cannot open %s as display file", buf);
+ } else {
+ if (!Fake) {
+ warnx("cannot open %s as display file", buf);
+ }
+ }
}
goto success;
diff --git a/usr.sbin/pkg_install/add/pkg_add.1 b/usr.sbin/pkg_install/add/pkg_add.1
index b92518c..26a52fc 100644
--- a/usr.sbin/pkg_install/add/pkg_add.1
+++ b/usr.sbin/pkg_install/add/pkg_add.1
@@ -15,7 +15,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd November 12, 2005
+.Dd January 9, 2006
.Dt PKG_ADD 1
.Os
.Sh NAME
@@ -23,7 +23,7 @@
.Nd a utility for installing software package distributions
.Sh SYNOPSIS
.Nm
-.Op Fl vInfrRMS
+.Op Fl vInfrRMSK
.Op Fl t Ar template
.Op Fl p Ar prefix
.Op Fl P Ar prefix
@@ -83,6 +83,10 @@ will search them in each directory named by
.Ev PKG_PATH .
.It Fl v
Turn on verbose output.
+.It Fl K
+Keep any downloaded package in
+.Ev PKGDIR
+if it is defined or in current directory by default.
.It Fl I
If any installation scripts (pre-install or post-install) exist for a given
package, do not execute them.
@@ -519,6 +523,12 @@ uses when the
.Fl r
option is invoked.
Thus it should be a complete URL to the remote package file(s).
+.Pp
+The environment variable
+.Ev PKGDIR
+Specifies an alternative location to save downloaded packages to when
+.Fl K
+option is used.
.Sh FILES
.Bl -tag -width /var/db/pkg -compact
.It Pa /var/tmp
diff --git a/usr.sbin/pkg_install/info/info.h b/usr.sbin/pkg_install/info/info.h
index 6554db5..46e29b1 100644
--- a/usr.sbin/pkg_install/info/info.h
+++ b/usr.sbin/pkg_install/info/info.h
@@ -64,6 +64,7 @@ TAILQ_HEAD(which_head, which_entry);
extern int Flags;
extern Boolean QUIET;
extern Boolean UseBlkSz;
+extern Boolean KeepPackage;
extern char *InfoPrefix;
extern char PlayPen[];
extern char *CheckPkg;
diff --git a/usr.sbin/pkg_install/info/main.c b/usr.sbin/pkg_install/info/main.c
index b22c54c..76fcaa8 100644
--- a/usr.sbin/pkg_install/info/main.c
+++ b/usr.sbin/pkg_install/info/main.c
@@ -26,7 +26,7 @@ __FBSDID("$FreeBSD$");
#include "info.h"
#include <err.h>
-static char Options[] = "abcdDe:EfgGhiIjkl:LmoO:pPqQrRst:vVW:xX";
+static char Options[] = "abcdDe:EfgGhiIjkKl:LmoO:pPqQrRst:vVW:xX";
int Flags = 0;
match_t MatchType = MATCH_GLOB;
@@ -36,6 +36,7 @@ char *InfoPrefix = (char *)(uintptr_t)"";
char PlayPen[FILENAME_MAX];
char *CheckPkg = NULL;
char *LookUpOrigin = NULL;
+Boolean KeepPackage = FALSE;
struct which_head *whead;
static void usage __P((void));
@@ -122,6 +123,10 @@ main(int argc, char **argv)
Flags |= SHOW_DEINSTALL;
break;
+ case 'K':
+ KeepPackage = TRUE;
+ break;
+
case 'r':
Flags |= SHOW_DEPEND;
break;
@@ -261,7 +266,7 @@ static void
usage()
{
fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
- "usage: pkg_info [-bcdDEfgGiIjkLmopPqQrRsvVxX] [-e package] [-l prefix]",
+ "usage: pkg_info [-bcdDEfgGiIjkKLmopPqQrRsvVxX] [-e package] [-l prefix]",
" [-t template] -a | pkg-name ...",
" pkg_info [-qQ] -W filename",
" pkg_info [-qQ] -O origin",
diff --git a/usr.sbin/pkg_install/info/perform.c b/usr.sbin/pkg_install/info/perform.c
index 960641b..3f3ceb0 100644
--- a/usr.sbin/pkg_install/info/perform.c
+++ b/usr.sbin/pkg_install/info/perform.c
@@ -100,7 +100,7 @@ pkg_do(char *pkg)
int code = 0;
if (isURL(pkg)) {
- if ((cp = fileGetURL(NULL, pkg)) != NULL) {
+ if ((cp = fileGetURL(NULL, pkg, KeepPackage)) != NULL) {
strcpy(fname, cp);
isTMP = TRUE;
}
diff --git a/usr.sbin/pkg_install/info/pkg_info.1 b/usr.sbin/pkg_install/info/pkg_info.1
index db1c431..86caa7a 100644
--- a/usr.sbin/pkg_install/info/pkg_info.1
+++ b/usr.sbin/pkg_install/info/pkg_info.1
@@ -17,7 +17,7 @@
.\" @(#)pkg_info.1
.\" $FreeBSD$
.\"
-.Dd November 23, 2005
+.Dd January 9, 2006
.Dt PKG_INFO 1
.Os
.Sh NAME
@@ -25,7 +25,7 @@
.Nd a utility for displaying information on software packages
.Sh SYNOPSIS
.Nm
-.Op Fl bcdDEfgGijIkLmopPqQrRsvVxX
+.Op Fl bcdDEfgGijIkKLmopPqQrRsvVxX
.Op Fl e Ar package
.Op Fl l Ar prefix
.Op Fl t Ar template
@@ -106,6 +106,10 @@ precedence over all other package formatting options.
Show the requirements script (if any) for each package.
.It Fl k
Show the de-install script (if any) for each package.
+.It Fl K
+Keep any downloaded package in
+.Ev PKGDIR
+if it is defined or in current directory by default.
.It Fl r
Show the list of packages on which each package depends.
.It Fl R
@@ -242,6 +246,8 @@ Specifies an alternative location for the installed package database.
.It Ev PKG_PATH
Specifies an alternative package location, if a given package cannot be
found.
+.It Ev PKGDIR
+Specifies an alternative location to save downloaded packages to.
.El
.Sh FILES
.Bl -tag -width /var/db/pkg -compact
diff --git a/usr.sbin/pkg_install/lib/lib.h b/usr.sbin/pkg_install/lib/lib.h
index cdbfe00..2227f85 100644
--- a/usr.sbin/pkg_install/lib/lib.h
+++ b/usr.sbin/pkg_install/lib/lib.h
@@ -172,7 +172,7 @@ Boolean isfile(const char *);
Boolean isempty(const char *);
Boolean issymlink(const char *);
Boolean isURL(const char *);
-char *fileGetURL(const char *, const char *);
+char *fileGetURL(const char *, const char *, int);
char *fileFindByPath(const char *, const char *);
char *fileGetContents(const char *);
void write_file(const char *, const char *);
diff --git a/usr.sbin/pkg_install/lib/url.c b/usr.sbin/pkg_install/lib/url.c
index 41017b4..43f2d81 100644
--- a/usr.sbin/pkg_install/lib/url.c
+++ b/usr.sbin/pkg_install/lib/url.c
@@ -24,24 +24,27 @@ __FBSDID("$FreeBSD$");
#include "lib.h"
#include <err.h>
#include <fetch.h>
+#include <libgen.h>
#include <sys/wait.h>
+#include <stdio.h>
/*
* Try and fetch a file by URL, returning the directory name for where
* it's unpacked, if successful.
*/
char *
-fileGetURL(const char *base, const char *spec)
+fileGetURL(const char *base, const char *spec, int keep_package)
{
- char *cp, *rp;
+ char *cp, *rp, *tmp;
char fname[FILENAME_MAX];
char pen[FILENAME_MAX];
+ char pkg[FILENAME_MAX];
char buf[8192];
FILE *ftp;
pid_t tpid;
int pfd[2], pstat, r, w = 0;
char *hint;
- int fd;
+ int fd, pkgfd = 0;
rp = NULL;
/* Special tip that sysinstall left for us */
@@ -95,6 +98,19 @@ fileGetURL(const char *base, const char *spec)
else
strcpy(fname, spec);
+ if (keep_package) {
+ tmp = getenv("PKGDIR");
+ strlcpy(pkg, tmp ? tmp : ".", sizeof(pkg));
+ tmp = basename(fname);
+ strlcat(pkg, "/", sizeof(pkg));
+ strlcat(pkg, tmp, sizeof(pkg));
+ if ((pkgfd = open(pkg, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) {
+ printf("Error: Unable to open %s\n", pkg);
+ perror("open");
+ return NULL;
+ }
+ }
+
if ((ftp = fetchGetURL(fname, Verbose ? "v" : NULL)) == NULL) {
printf("Error: FTP Unable to get %s: %s\n",
fname, fetchLastErrString);
@@ -138,10 +154,17 @@ fileGetURL(const char *base, const char *spec)
break;
if ((w = write(pfd[1], buf, r)) != r)
break;
+ if (keep_package) {
+ if ((w = write(pkgfd, buf, r)) != r)
+ break;
+ }
}
if (ferror(ftp))
warn("warning: error reading from server");
fclose(ftp);
+ if (keep_package) {
+ close(pkgfd);
+ }
close(pfd[1]);
if (w == -1)
warn("warning: error writing to tar");
OpenPOWER on IntegriCloud