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:
parent
93d7e294fc
commit
c97d180650
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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",
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 *);
|
||||
|
@ -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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user