summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpav <pav@FreeBSD.org>2008-05-03 22:56:50 +0000
committerpav <pav@FreeBSD.org>2008-05-03 22:56:50 +0000
commitf6342a8cc70520205466101de2fc3225e5c9ab2c (patch)
tree047e0d070e77398a2c7167602f4bfa0c7a91be2a
parent0cabcd8279358de2fe1c18b8f6403831e37f9967 (diff)
downloadFreeBSD-src-f6342a8cc70520205466101de2fc3225e5c9ab2c.zip
FreeBSD-src-f6342a8cc70520205466101de2fc3225e5c9ab2c.tar.gz
- Restore functionality broken in previous commit; we need to be able to report
multiple installed packages with the same PKGORIGIN. Reported by: marcus MFC after: 1 month
-rw-r--r--usr.sbin/pkg_install/Makefile.inc5
-rw-r--r--usr.sbin/pkg_install/add/perform.c34
-rw-r--r--usr.sbin/pkg_install/delete/perform.c7
-rw-r--r--usr.sbin/pkg_install/lib/lib.h2
-rw-r--r--usr.sbin/pkg_install/lib/match.c21
5 files changed, 37 insertions, 32 deletions
diff --git a/usr.sbin/pkg_install/Makefile.inc b/usr.sbin/pkg_install/Makefile.inc
index bff3474..eb2ad12 100644
--- a/usr.sbin/pkg_install/Makefile.inc
+++ b/usr.sbin/pkg_install/Makefile.inc
@@ -4,11 +4,6 @@
LIBINSTALL= ${.OBJDIR}/../lib/libinstall.a
-.if ${MK_OPENSSL} != "no" && \
- defined(LDADD) && ${LDADD:M-lfetch} != ""
-DPADD+= ${LIBSSL} ${LIBCRYPTO}
-LDADD+= -lssl -lcrypto
-.endif
# Inherit BINDIR from one level up.
.include "../Makefile.inc"
diff --git a/usr.sbin/pkg_install/add/perform.c b/usr.sbin/pkg_install/add/perform.c
index 3d86a9d..b8ba1a9 100644
--- a/usr.sbin/pkg_install/add/perform.c
+++ b/usr.sbin/pkg_install/add/perform.c
@@ -452,7 +452,7 @@ pkg_do(char *pkg)
/* Time to record the deed? */
if (!NoRecord && !Fake) {
char contents[FILENAME_MAX];
- char **depnames = NULL, **deporigins = NULL, **depmatches;
+ char **depnames = NULL, **deporigins = NULL, ***depmatches;
int i, dep_count = 0;
FILE *contfile;
@@ -540,20 +540,24 @@ pkg_do(char *pkg)
if (!IgnoreDeps && depmatches) {
for (i = 0; i < dep_count; i++) {
if (depmatches[i]) {
- /* Origin looked up */
- sprintf(contents, "%s/%s/%s", LOG_DIR, depmatches[i],
- REQUIRED_BY_FNAME);
- if (depnames[i] && strcmp(depnames[i], depmatches[i]) != 0)
- warnx("warning: package '%s' requires '%s', but '%s' "
- "is installed", Plist.name, depnames[i], depmatches[i]);
- contfile = fopen(contents, "a");
- if (!contfile) {
- warnx("can't open dependency file '%s'!\n"
- "dependency registration is incomplete", contents);
- } else {
- fprintf(contfile, "%s\n", Plist.name);
- if (fclose(contfile) == EOF)
- warnx("cannot properly close file %s", contents);
+ int j;
+ char **tmp = depmatches[i];
+ for (j = 0; tmp[j] != NULL; j++) {
+ /* Origin looked up */
+ sprintf(contents, "%s/%s/%s", LOG_DIR, tmp[j],
+ REQUIRED_BY_FNAME);
+ if (depnames[i] && strcmp(depnames[i], tmp[j]) != 0)
+ warnx("warning: package '%s' requires '%s', but '%s' "
+ "is installed", Plist.name, depnames[i], tmp[j]);
+ contfile = fopen(contents, "a");
+ if (!contfile) {
+ warnx("can't open dependency file '%s'!\n"
+ "dependency registration is incomplete", contents);
+ } else {
+ fprintf(contfile, "%s\n", Plist.name);
+ if (fclose(contfile) == EOF)
+ warnx("cannot properly close file %s", contents);
+ }
}
} else if (depnames[i]) {
/* No package present with this origin, try literal package name */
diff --git a/usr.sbin/pkg_install/delete/perform.c b/usr.sbin/pkg_install/delete/perform.c
index aa1047c..1519fd7 100644
--- a/usr.sbin/pkg_install/delete/perform.c
+++ b/usr.sbin/pkg_install/delete/perform.c
@@ -122,7 +122,7 @@ static int
pkg_do(char *pkg)
{
FILE *cfile;
- char *deporigin, **deporigins = NULL, **depnames = NULL, **depmatches, home[FILENAME_MAX];
+ char *deporigin, **deporigins = NULL, **depnames = NULL, ***depmatches, home[FILENAME_MAX];
PackingList p;
int i, len;
int isinstalled;
@@ -295,7 +295,10 @@ pkg_do(char *pkg)
if (depmatches) {
for (i = 0; i < dep_count; i++) {
if (depmatches[i]) {
- undepend(depmatches[i], pkg);
+ char **tmp = depmatches[i];
+ int j;
+ for (j = 0; tmp[j] != NULL; j++)
+ undepend(tmp[j], pkg);
} else if (depnames[i]) {
undepend(depnames[i], pkg);
}
diff --git a/usr.sbin/pkg_install/lib/lib.h b/usr.sbin/pkg_install/lib/lib.h
index 3e0ce7e..7aea8d0 100644
--- a/usr.sbin/pkg_install/lib/lib.h
+++ b/usr.sbin/pkg_install/lib/lib.h
@@ -225,7 +225,7 @@ int real_main(int, char **);
/* Query installed packages */
char **matchinstalled(match_t, char **, int *);
char **matchbyorigin(const char *, int *);
-char **matchallbyorigin(const char **, int *);
+char ***matchallbyorigin(const char **, int *);
int isinstalledpkg(const char *name);
int pattern_match(match_t MatchType, char *pattern, const char *pkgname);
diff --git a/usr.sbin/pkg_install/lib/match.c b/usr.sbin/pkg_install/lib/match.c
index 885533f..1f8b02a 100644
--- a/usr.sbin/pkg_install/lib/match.c
+++ b/usr.sbin/pkg_install/lib/match.c
@@ -237,10 +237,11 @@ pattern_match(match_t MatchType, char *pattern, const char *pkgname)
* Synopsis is similar to matchinstalled(), but use origin
* as a key for matching packages.
*/
-char **
+char ***
matchallbyorigin(const char **origins, int *retval)
{
- char **installed, **allorigins = NULL, **matches = NULL;
+ char **installed, **allorigins = NULL;
+ char ***matches = NULL;
int i, j;
if (retval != NULL)
@@ -299,16 +300,20 @@ matchallbyorigin(const char **origins, int *retval)
/* Resolve origins into package names, retaining the sequence */
for (i = 0; origins[i] != NULL; i++) {
matches = realloc(matches, (i + 1) * sizeof(*matches));
- matches[i] = NULL;
+ struct store *store = NULL;
+ store = storecreate(store);
for (j = 0; installed[j] != NULL; j++) {
if (allorigins[j]) {
if (csh_match(origins[i], allorigins[j], FNM_PATHNAME) == 0) {
- matches[i] = installed[j];
- break;
+ storeappend(store, installed[j]);
}
}
}
+ if (store->used == 0)
+ matches[i] = NULL;
+ else
+ matches[i] = store->store;
}
if (allorigins) {
@@ -329,16 +334,14 @@ char **
matchbyorigin(const char *origin, int *retval)
{
const char *origins[2];
- char **tmp;
+ char ***tmp;
origins[0] = origin;
origins[1] = NULL;
tmp = matchallbyorigin(origins, retval);
if (tmp && tmp[0]) {
- tmp = realloc(tmp, 2 * sizeof(*tmp));
- tmp[1] = NULL;
- return tmp;
+ return tmp[0];
} else {
return NULL;
}
OpenPOWER on IntegriCloud