summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authoreik <eik@FreeBSD.org>2004-06-29 18:59:19 +0000
committereik <eik@FreeBSD.org>2004-06-29 18:59:19 +0000
commit7a7a88ae41089ff6cb4d75e4c2271702d2fc40ba (patch)
treed736eb1b5c7ccb34088587a0c550492399691ef6 /usr.sbin
parentffbd0ede95b92fdb9e9a5457126a4eeca1726352 (diff)
downloadFreeBSD-src-7a7a88ae41089ff6cb4d75e4c2271702d2fc40ba.zip
FreeBSD-src-7a7a88ae41089ff6cb4d75e4c2271702d2fc40ba.tar.gz
- pkg_info: flag -r: (show packages this packages depends on (documentation change))
- pkg_info: new flag -j (show the requirements script) - pkg_info: fix verbose output when used on packages - better handling of corrupt entries in /var/db/pkg - differ between corrupt entires and packages not installed - various small fixes PR: 56989, 57016, 57029, 26468
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/pkg_install/add/extract.c2
-rw-r--r--usr.sbin/pkg_install/add/perform.c9
-rw-r--r--usr.sbin/pkg_install/delete/perform.c70
-rw-r--r--usr.sbin/pkg_install/info/main.c10
-rw-r--r--usr.sbin/pkg_install/info/perform.c32
-rw-r--r--usr.sbin/pkg_install/info/pkg_info.18
-rw-r--r--usr.sbin/pkg_install/lib/deps.c6
-rw-r--r--usr.sbin/pkg_install/lib/file.c6
-rw-r--r--usr.sbin/pkg_install/lib/lib.h4
-rw-r--r--usr.sbin/pkg_install/lib/match.c11
-rw-r--r--usr.sbin/pkg_install/sign/Makefile8
-rw-r--r--usr.sbin/pkg_install/sign/sha1.c23
-rw-r--r--usr.sbin/pkg_install/version/perform.c2
13 files changed, 110 insertions, 81 deletions
diff --git a/usr.sbin/pkg_install/add/extract.c b/usr.sbin/pkg_install/add/extract.c
index 337fe4d..4793dc2 100644
--- a/usr.sbin/pkg_install/add/extract.c
+++ b/usr.sbin/pkg_install/add/extract.c
@@ -85,7 +85,7 @@ rollback(const char *name, const char *home, PackingList start, PackingList stop
++(pos); \
} while (0)
-int
+static int
add_arg(char *buf, int len, const char *str)
{
int i = 0;
diff --git a/usr.sbin/pkg_install/add/perform.c b/usr.sbin/pkg_install/add/perform.c
index ab409c0..8af962c 100644
--- a/usr.sbin/pkg_install/add/perform.c
+++ b/usr.sbin/pkg_install/add/perform.c
@@ -71,7 +71,7 @@ pkg_do(char *pkg)
int code;
PackingList p;
struct stat sb;
- int inPlace, conflictsfound, i, errcode;
+ int inPlace, conflictsfound, errcode;
/* support for separate pre/post install scripts */
int new_m = 0;
char pre_script[FILENAME_MAX] = INSTALL_FNAME;
@@ -243,7 +243,7 @@ pkg_do(char *pkg)
* See if we're already registered either with the same name (the same
* version) or some other version with the same origin.
*/
- if ((isinstalledpkg(Plist.name) ||
+ if ((isinstalledpkg(Plist.name) > 0 ||
matchbyorigin(Plist.origin, NULL) != NULL) && !Force) {
warnx("package '%s' or its older version already installed",
Plist.name);
@@ -254,13 +254,14 @@ pkg_do(char *pkg)
/* Now check the packing list for conflicts */
for (p = Plist.head; p != NULL; p = p->next) {
if (p->type == PLIST_CONFLICTS) {
+ int i;
conflict[0] = strdup(p->name);
conflict[1] = NULL;
matched = matchinstalled(MATCH_GLOB, conflict, &errcode);
free(conflict[0]);
if (errcode == 0 && matched != NULL)
for (i = 0; matched[i] != NULL; i++)
- if (isinstalledpkg(matched[i])) {
+ if (isinstalledpkg(matched[i]) > 0) {
warnx("package '%s' conflicts with %s", Plist.name,
matched[i]);
conflictsfound = 1;
@@ -291,7 +292,7 @@ pkg_do(char *pkg)
printf(" with '%s' origin", deporigin);
printf(".\n");
}
- if (!isinstalledpkg(p->name) &&
+ if (isinstalledpkg(p->name) <= 0 &&
!(deporigin != NULL && matchbyorigin(deporigin, NULL) != NULL)) {
char path[FILENAME_MAX], *cp = NULL;
diff --git a/usr.sbin/pkg_install/delete/perform.c b/usr.sbin/pkg_install/delete/perform.c
index c1bc803..76bb734 100644
--- a/usr.sbin/pkg_install/delete/perform.c
+++ b/usr.sbin/pkg_install/delete/perform.c
@@ -125,6 +125,7 @@ pkg_do(char *pkg)
char *deporigin, **depnames, home[FILENAME_MAX];
PackingList p;
int i, len;
+ int isinstalled;
/* support for separate pre/post install scripts */
int new_m = 0;
const char *pre_script = DEINSTALL_FNAME;
@@ -141,9 +142,26 @@ pkg_do(char *pkg)
if (Plist.head)
free_plist(&Plist);
- if (!isinstalledpkg(pkg)) {
+ sprintf(LogDir, "%s/%s", LOG_DIR, pkg);
+
+ isinstalled = isinstalledpkg(pkg);
+ if (isinstalled == 0) {
warnx("no such package '%s' installed", pkg);
return 1;
+ } else if (isinstalled < 0) {
+ warnx("the package info for package '%s' is corrupt%s",
+ pkg, Force ? " (but I'll delete it anyway)" : " (use -f to force removal)");
+ if (!Force)
+ return 1;
+ if (!Fake) {
+ if (vsystem("%s -rf %s", REMOVE_CMD, LogDir)) {
+ warnx("couldn't remove log entry in %s, deinstall failed", LogDir);
+ } else {
+ warnx("couldn't completely deinstall package '%s',\n"
+ "only the log entry in %s was removed", pkg, LogDir);
+ }
+ }
+ return 0;
}
if (!getcwd(home, FILENAME_MAX)) {
@@ -151,8 +169,6 @@ pkg_do(char *pkg)
errx(2, "%s: unable to get current working directory!", __func__);
}
- sprintf(LogDir, "%s/%s", LOG_DIR, pkg);
-
if (chdir(LogDir) == FAIL) {
warnx("unable to change directory to %s! deinstall failed", LogDir);
return 1;
@@ -247,6 +263,30 @@ pkg_do(char *pkg)
}
}
+ for (p = Plist.head; p ; p = p->next) {
+ if (p->type != PLIST_PKGDEP)
+ continue;
+ deporigin = (p->next->type == PLIST_DEPORIGIN) ? p->next->name :
+ NULL;
+ if (Verbose) {
+ printf("Trying to remove dependency on package '%s'", p->name);
+ if (deporigin != NULL)
+ printf(" with '%s' origin", deporigin);
+ printf(".\n");
+ }
+ if (!Fake) {
+ depnames = (deporigin != NULL) ? matchbyorigin(deporigin, NULL) :
+ NULL;
+ if (depnames == NULL) {
+ depnames = alloca(sizeof(*depnames) * 2);
+ depnames[0] = p->name;
+ depnames[1] = NULL;
+ }
+ for (i = 0; depnames[i] != NULL; i++)
+ undepend(depnames[i], pkg);
+ }
+ }
+
if (chdir(home) == FAIL) {
cleanup(0);
errx(2, "%s: unable to return to working directory %s!", __func__,
@@ -293,30 +333,6 @@ pkg_do(char *pkg)
return 1;
}
}
-
- for (p = Plist.head; p ; p = p->next) {
- if (p->type != PLIST_PKGDEP)
- continue;
- deporigin = (p->next->type == PLIST_DEPORIGIN) ? p->next->name :
- NULL;
- if (Verbose) {
- printf("Trying to remove dependency on package '%s'", p->name);
- if (deporigin != NULL)
- printf(" with '%s' origin", deporigin);
- printf(".\n");
- }
- if (!Fake) {
- depnames = (deporigin != NULL) ? matchbyorigin(deporigin, NULL) :
- NULL;
- if (depnames == NULL) {
- depnames = alloca(sizeof(*depnames) * 2);
- depnames[0] = p->name;
- depnames[1] = NULL;
- }
- for (i = 0; depnames[i] != NULL; i++)
- undepend(depnames[i], pkg);
- }
- }
return 0;
}
diff --git a/usr.sbin/pkg_install/info/main.c b/usr.sbin/pkg_install/info/main.c
index 3c2fb44..a7bcfe2 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:EfgGhiIkl:LmoO:pPqQrRst:vVW:xX";
+static char Options[] = "abcdDe:EfgGhiIjkl:LmoO:pPqQrRst:vVW:xX";
int Flags = 0;
match_t MatchType = MATCH_GLOB;
@@ -115,12 +115,16 @@ main(int argc, char **argv)
Flags |= SHOW_INSTALL;
break;
+ case 'j':
+ Flags |= SHOW_REQUIRE;
+ break;
+
case 'k':
Flags |= SHOW_DEINSTALL;
break;
case 'r':
- Flags |= SHOW_REQUIRE;
+ Flags |= SHOW_DEPEND;
break;
case 'R':
@@ -258,7 +262,7 @@ static void
usage()
{
fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
- "usage: pkg_info [-bcdDEfgGiIjLmopPqQrRsvVxX] [-e package] [-l prefix]",
+ "usage: pkg_info [-bcdDEfgGiIjkLmopPqQrRsvVxX] [-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 5511f41..960641b 100644
--- a/usr.sbin/pkg_install/info/perform.c
+++ b/usr.sbin/pkg_install/info/perform.c
@@ -46,7 +46,7 @@ pkg_perform(char **pkgs)
if (Flags & SHOW_PKGNAME) {
return matched_packages(pkgs);
} else if (CheckPkg) {
- return isinstalledpkg(CheckPkg) == TRUE ? 0 : 1;
+ return isinstalledpkg(CheckPkg) > 0 ? 0 : 1;
/* Not reached */
} else if (!TAILQ_EMPTY(whead)) {
return find_pkg(whead);
@@ -92,7 +92,7 @@ pkg_do(char *pkg)
{
Boolean installed = FALSE, isTMP = FALSE;
char log_dir[FILENAME_MAX];
- char fname[FILENAME_MAX], extrlist[FILENAME_MAX];
+ char fname[FILENAME_MAX];
Package plist;
FILE *fp;
struct stat sb;
@@ -135,29 +135,19 @@ pkg_do(char *pkg)
goto bail;
}
Home = make_playpen(PlayPen, sb.st_size / 2);
- snprintf(extrlist, sizeof(extrlist), "--fast-read %s %s %s",
- CONTENTS_FNAME, COMMENT_FNAME, DESC_FNAME);
- if (Flags & SHOW_DISPLAY)
- snprintf(extrlist, sizeof(extrlist), "%s %s", extrlist,
- DISPLAY_FNAME);
- if (Flags & SHOW_INSTALL)
- snprintf(extrlist, sizeof(extrlist), "%s %s %s", extrlist,
- INSTALL_FNAME, POST_INSTALL_FNAME);
- if (Flags & SHOW_DEINSTALL)
- snprintf(extrlist, sizeof(extrlist), "%s %s %s", extrlist,
- DEINSTALL_FNAME, POST_DEINSTALL_FNAME);
- if (Flags & SHOW_MTREE)
- snprintf(extrlist, sizeof(extrlist), "%s %s", extrlist,
- MTREE_FNAME);
- if (unpack(fname, extrlist)) {
+ if (unpack(fname, "'+*'")) {
warnx("error during unpacking, no info for '%s' available", pkg);
code = 1;
goto bail;
}
}
- /* It's not an ininstalled package, try and find it among the installed */
+ /* It's not an uninstalled package, try and find it among the installed */
else {
- if (!isinstalledpkg(pkg)) {
+ int isinstalled = isinstalledpkg(pkg);
+ if (isinstalled < 0) {
+ warnx("the package info for package '%s' is corrupt", pkg);
+ return 1;
+ } else if (isinstalled == 0) {
warnx("can't find package '%s' installed or in a file!", pkg);
return 1;
}
@@ -199,7 +189,7 @@ pkg_do(char *pkg)
printf("%s%s:", InfoPrefix, pkg);
if (Flags & SHOW_COMMENT)
show_file("Comment:\n", COMMENT_FNAME);
- if (Flags & SHOW_REQUIRE)
+ if (Flags & SHOW_DEPEND)
show_plist("Depends on:\n", &plist, PLIST_PKGDEP, FALSE);
if ((Flags & SHOW_REQBY) && !isemptyfile(REQUIRED_BY_FNAME))
show_file("Required by:\n", REQUIRED_BY_FNAME);
@@ -209,6 +199,8 @@ pkg_do(char *pkg)
show_file("Install notice:\n", DISPLAY_FNAME);
if (Flags & SHOW_PLIST)
show_plist("Packing list:\n", &plist, (plist_t)0, TRUE);
+ if (Flags & SHOW_REQUIRE && fexists(REQUIRE_FNAME))
+ show_file("Requirements script:\n", REQUIRE_FNAME);
if ((Flags & SHOW_INSTALL) && fexists(INSTALL_FNAME))
show_file("Install script:\n", INSTALL_FNAME);
if ((Flags & SHOW_INSTALL) && fexists(POST_INSTALL_FNAME))
diff --git a/usr.sbin/pkg_install/info/pkg_info.1 b/usr.sbin/pkg_install/info/pkg_info.1
index 7dfe453..1fd2c11 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 February 8, 2001
+.Dd June 29, 2004
.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 bcdDEfgGiIkLmopPqQrRsvVxX
+.Op Fl bcdDEfgGijIkLmopPqQrRsvVxX
.Op Fl e Ar package
.Op Fl l Ar prefix
.Op Fl t Ar template
@@ -99,10 +99,12 @@ Show the install script (if any) for each package.
.It Fl I
Show an index line for each package. This option takes
precedence over all other package formatting options.
+.It Fl j
+Show the requirements script (if any) for each package.
.It Fl k
Show the de-install script (if any) for each package.
.It Fl r
-Show the requirements script (if any) for each package.
+Show the list of packages on which each package depends.
.It Fl R
Show the list of installed packages which require each package.
.It Fl m
diff --git a/usr.sbin/pkg_install/lib/deps.c b/usr.sbin/pkg_install/lib/deps.c
index 4ebb2cf..9df8448 100644
--- a/usr.sbin/pkg_install/lib/deps.c
+++ b/usr.sbin/pkg_install/lib/deps.c
@@ -97,7 +97,7 @@ chkifdepends(const char *pkgname1, const char *pkgname2)
errcode = 0;
/* Check that pkgname2 is actually installed */
- if (!isinstalledpkg(pkgname2))
+ if (isinstalledpkg(pkgname2) <= 0)
goto exit;
errcode = requiredby(pkgname2, &rb_list, FALSE, TRUE);
@@ -153,7 +153,7 @@ requiredby(const char *pkgname, struct reqr_by_head **list, Boolean strict, Bool
free(rb_entry);
}
- if (!isinstalledpkg(pkgname)) {
+ if (isinstalledpkg(pkgname) <= 0) {
if (strict == TRUE)
warnx("no such package '%s' installed", pkgname);
return -1;
@@ -173,7 +173,7 @@ requiredby(const char *pkgname, struct reqr_by_head **list, Boolean strict, Bool
while (fgets(fbuf, sizeof(fbuf), fp) != NULL) {
if (fbuf[strlen(fbuf) - 1] == '\n')
fbuf[strlen(fbuf) - 1] = '\0';
- if (filter == TRUE && !isinstalledpkg(fbuf)) {
+ if (filter == TRUE && isinstalledpkg(fbuf) <= 0) {
if (strict == TRUE)
warnx("package '%s' is recorded in the '%s' but isn't "
"actually installed", fbuf, fname);
diff --git a/usr.sbin/pkg_install/lib/file.c b/usr.sbin/pkg_install/lib/file.c
index b29993c..107bb15 100644
--- a/usr.sbin/pkg_install/lib/file.c
+++ b/usr.sbin/pkg_install/lib/file.c
@@ -126,7 +126,8 @@ isURL(const char *fname)
return FALSE;
while (isspace(*fname))
++fname;
- if (!strncmp(fname, "ftp://", 6) || !strncmp(fname, "http://", 7))
+ if (!strncmp(fname, "ftp://", 6) || !strncmp(fname, "http://", 7) ||
+ !strncmp(fname, "https://", 8) || !strncmp(fname, "file://", 7))
return TRUE;
return FALSE;
}
@@ -328,7 +329,8 @@ copy_hierarchy(const char *dir, const char *fname, Boolean to)
int
unpack(const char *pkg, const char *flist)
{
- char *comp, suff[80], *cp;
+ const char *comp, *cp;
+ char suff[80];
comp = "";
/*
diff --git a/usr.sbin/pkg_install/lib/lib.h b/usr.sbin/pkg_install/lib/lib.h
index 50c3d40..109483c 100644
--- a/usr.sbin/pkg_install/lib/lib.h
+++ b/usr.sbin/pkg_install/lib/lib.h
@@ -122,8 +122,8 @@ typedef struct _plist *PackingList;
struct _pack {
struct _plist *head, *tail;
- char *name;
- char *origin;
+ const char *name;
+ const char *origin;
int fmtver_maj, fmtver_mnr;
};
typedef struct _pack Package;
diff --git a/usr.sbin/pkg_install/lib/match.c b/usr.sbin/pkg_install/lib/match.c
index 0cd9853..48d96cd 100644
--- a/usr.sbin/pkg_install/lib/match.c
+++ b/usr.sbin/pkg_install/lib/match.c
@@ -307,8 +307,9 @@ matchbyorigin(const char *origin, int *retval)
}
/*
- * Return TRUE if the specified package is installed,
- * or FALSE otherwise.
+ *
+ * Return 1 if the specified package is installed,
+ * 0 if not, and -1 if an error occured.
*/
int
isinstalledpkg(const char *name)
@@ -318,13 +319,13 @@ isinstalledpkg(const char *name)
snprintf(buf, sizeof(buf), "%s/%s", LOG_DIR, name);
if (!isdir(buf) || access(buf, R_OK) == FAIL)
- return FALSE;
+ return 0;
snprintf(buf2, sizeof(buf2), "%s/%s", buf, CONTENTS_FNAME);
if (!isfile(buf2) || access(buf2, R_OK) == FAIL)
- return FALSE;
+ return -1;
- return TRUE;
+ return 1;
}
/*
diff --git a/usr.sbin/pkg_install/sign/Makefile b/usr.sbin/pkg_install/sign/Makefile
index a848441..a6ad81a 100644
--- a/usr.sbin/pkg_install/sign/Makefile
+++ b/usr.sbin/pkg_install/sign/Makefile
@@ -7,9 +7,13 @@ MLINKS= pkg_sign.1 pkg_check.1
SRCS= main.c check.c common.c gzip.c pgp_check.c pgp_sign.c \
sha1.c sign.c stand.c x509.c
+CFLAGS+= ${DEBUG} -I${.CURDIR}/../lib
+
+WARNS?= 0
+
DISTRIBUTION= crypto
-DPADD= ${LIBINSTALL} ${LIBCRYPTO}
-LDADD= ${LIBINSTALL} -lcrypto
+DPADD= ${LIBINSTALL} ${LIBMD} ${LIBCRYPTO}
+LDADD= ${LIBINSTALL} -lmd -lcrypto
.include <bsd.prog.mk>
diff --git a/usr.sbin/pkg_install/sign/sha1.c b/usr.sbin/pkg_install/sign/sha1.c
index 24ca997..af0e6a9 100644
--- a/usr.sbin/pkg_install/sign/sha1.c
+++ b/usr.sbin/pkg_install/sign/sha1.c
@@ -34,9 +34,10 @@ __FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
+#include <string.h>
#include <stdio.h>
#include <assert.h>
-#include <openssl/sha.h>
+#include <sha.h>
#include "stand.h"
#include "gzip.h"
#include "extern.h"
@@ -66,9 +67,9 @@ sha1_build_checksum(result, n)
{
size_t length;
- sprintf(result, "SHA1 (%s) = ", n->id);
+ snprintf(result, BUFSIZE-2*SHA_DIGEST_LENGTH-1, SHA1_TEMPLATE, n->id);
length = strlen(result);
- SHA1_Final(result + length, &n->context);
+ SHA1_End(&n->context, result + length);
strcat(result, "\n");
free(n);
return length;
@@ -167,7 +168,7 @@ retrieve_sha1_marker(filename, sign, userid)
FILE *f;
char buffer[1024];
char result[BUFSIZE];
- ssize_t length;
+ ssize_t length = -1;
struct sha1_checker *checker;
struct signature *old;
@@ -181,8 +182,13 @@ retrieve_sha1_marker(filename, sign, userid)
n = malloc(sizeof *n);
if (n == NULL)
return 0;
- n->data = (char *)userid;
- n->length = strlen(n->data)+1;
+ n->length = strlen(userid)+1;
+ n->data = malloc(n->length);
+ if (n->data == NULL) {
+ free(n);
+ return 0;
+ }
+ memcpy(n->data, userid, n->length);
n->type = TAG_SHA1;
memcpy(n->tag, sha1tag, sizeof sha1tag);
sign_fill_tag(n);
@@ -208,8 +214,9 @@ retrieve_sha1_marker(filename, sign, userid)
* Calculate the SHA1 of the remaining data and write it to stderr.
*/
checker = new_sha1_checker(&h, *sign, NULL, NULL, filename);
- while ((length = fread(buffer, 1, sizeof buffer, f)) > 0)
- sha1_add(checker, buffer, length);
+ if (checker)
+ while ((length = fread(buffer, 1, sizeof buffer, f)) > 0)
+ sha1_add(checker, buffer, length);
if (fclose(f) != 0 || length == -1) {
warn("Problem checksumming %s", filename);
*sign = n->next;
diff --git a/usr.sbin/pkg_install/version/perform.c b/usr.sbin/pkg_install/version/perform.c
index df166f6..837dae2 100644
--- a/usr.sbin/pkg_install/version/perform.c
+++ b/usr.sbin/pkg_install/version/perform.c
@@ -132,7 +132,7 @@ pkg_do(char *pkg)
snprintf(tmp, PATH_MAX, "%s/%s/%s", LOG_DIR, pkg, CONTENTS_FNAME);
fp = fopen(tmp, "r");
if (!fp) {
- warnx("unable to open %s file", CONTENTS_FNAME);
+ warnx("the package info for package '%s' is corrupt", pkg);
return 1;
}
read_plist(&plist, fp);
OpenPOWER on IntegriCloud