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
This commit is contained in:
flz 2006-01-09 18:27:21 +00:00
parent 93d7e294fc
commit c97d180650
10 changed files with 71 additions and 18 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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",

View File

@ -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;
}

View File

@ -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

View File

@ -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 *);

View File

@ -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");