summaryrefslogtreecommitdiff
path: root/pkgtools
diff options
context:
space:
mode:
Diffstat (limited to 'pkgtools')
-rw-r--r--pkgtools/pkg_install/files/add/add.h3
-rw-r--r--pkgtools/pkg_install/files/add/main.c22
-rw-r--r--pkgtools/pkg_install/files/add/perform.c65
-rw-r--r--pkgtools/pkg_install/files/lib/lib.h3
4 files changed, 56 insertions, 37 deletions
diff --git a/pkgtools/pkg_install/files/add/add.h b/pkgtools/pkg_install/files/add/add.h
index 9f468cd4660..327d51cc123 100644
--- a/pkgtools/pkg_install/files/add/add.h
+++ b/pkgtools/pkg_install/files/add/add.h
@@ -1,4 +1,4 @@
-/* $NetBSD: add.h,v 1.3 2003/09/23 07:13:46 grant Exp $ */
+/* $NetBSD: add.h,v 1.4 2004/12/09 20:10:34 erh Exp $ */
/* from FreeBSD Id: add.h,v 1.8 1997/02/22 16:09:15 peter Exp */
@@ -36,6 +36,7 @@ extern Boolean NoView;
extern Boolean NoInstall;
extern Boolean NoRecord;
extern Boolean Force;
+extern int Replace;
extern char *Mode;
extern char *Owner;
extern char *Group;
diff --git a/pkgtools/pkg_install/files/add/main.c b/pkgtools/pkg_install/files/add/main.c
index 2359fb0fb99..e8893095019 100644
--- a/pkgtools/pkg_install/files/add/main.c
+++ b/pkgtools/pkg_install/files/add/main.c
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.6 2003/12/20 04:23:05 grant Exp $ */
+/* $NetBSD: main.c,v 1.7 2004/12/09 20:10:34 erh Exp $ */
#if HAVE_CONFIG_H
#include "config.h"
@@ -11,7 +11,7 @@
#if 0
static char *rcsid = "from FreeBSD Id: main.c,v 1.16 1997/10/08 07:45:43 charnier Exp";
#else
-__RCSID("$NetBSD: main.c,v 1.6 2003/12/20 04:23:05 grant Exp $");
+__RCSID("$NetBSD: main.c,v 1.7 2004/12/09 20:10:34 erh Exp $");
#endif
#endif
@@ -65,7 +65,7 @@ char *PkgName = NULL;
char *Directory = NULL;
char FirstPen[FILENAME_MAX];
add_mode_t AddMode = NORMAL;
-Boolean Replace = FALSE;
+int Replace = 0;
static void
usage(void)
@@ -134,7 +134,7 @@ main(int argc, char **argv)
break;
case 'u':
- Replace = 1;
+ Replace++;
break;
case 'V':
@@ -178,12 +178,14 @@ main(int argc, char **argv)
TAILQ_INSERT_TAIL(&pkgs, lpp, lp_link);
}
- } else if (!ch)
- /* If no packages, yelp */
- warnx("missing package name(s)"), usage();
- else if (ch > 1 && AddMode == MASTER)
- warnx("only one package name may be specified with master mode"),
- usage();
+
+ if (!ch)
+ /* If no packages, yelp */
+ warnx("missing package name(s)"), usage();
+ else if (ch > 1 && AddMode == MASTER)
+ warnx("only one package name may be specified with master mode"),
+ usage();
+ }
/* Increase # of max. open file descriptors as high as possible */
rc = getrlimit(RLIMIT_NOFILE, &rlim);
diff --git a/pkgtools/pkg_install/files/add/perform.c b/pkgtools/pkg_install/files/add/perform.c
index 8fb095aee29..e8a1a4919a2 100644
--- a/pkgtools/pkg_install/files/add/perform.c
+++ b/pkgtools/pkg_install/files/add/perform.c
@@ -1,4 +1,4 @@
-/* $NetBSD: perform.c,v 1.25 2004/11/02 00:10:15 erh Exp $ */
+/* $NetBSD: perform.c,v 1.26 2004/12/09 20:10:34 erh Exp $ */
#if HAVE_CONFIG_H
#include "config.h"
@@ -11,7 +11,7 @@
#if 0
static const char *rcsid = "from FreeBSD Id: perform.c,v 1.44 1997/10/13 15:03:46 jkh Exp";
#else
-__RCSID("$NetBSD: perform.c,v 1.25 2004/11/02 00:10:15 erh Exp $");
+__RCSID("$NetBSD: perform.c,v 1.26 2004/12/09 20:10:34 erh Exp $");
#endif
#endif
@@ -147,7 +147,7 @@ sanity_check(const char *pkg)
/* install a pre-requisite package. Returns 1 if it installed it */
static int
-installprereq(const char *name, int *errc)
+installprereq(const char *name, int *errc, int doupdate)
{
int ret;
ret = 0;
@@ -158,6 +158,8 @@ installprereq(const char *name, int *errc)
if (fexec_skipempty(BINDIR "/pkg_add", "-K", _pkgdb_getPKGDB_DIR(),
"-s", get_verification(),
+ doupdate ? "-u" : "",
+ Fake ? "-n" : "",
NoView ? "-L" : "",
View ? "-w" : "", View ? View : "",
Viewbase ? "-W" : "", Viewbase ? Viewbase : "",
@@ -180,7 +182,7 @@ installprereq(const char *name, int *errc)
* Returns 0 if everything is ok, >0 else
*/
static int
-pkg_do(const char *pkg)
+pkg_do(const char *pkg, lpkg_head_t *pkgs)
{
char playpen[FILENAME_MAX];
char replace_from[FILENAME_MAX];
@@ -492,7 +494,8 @@ pkg_do(const char *pkg)
(void) snprintf(buf, sizeof(buf), "%.*s[0-9]*",
(int)(s - PkgName) + 1, PkgName);
if (findmatchingname(dbdir, buf, note_whats_installed, installed) > 0) {
- if (Replace) {
+ if (Replace && !Fake) {
+ /* XXX Should list the steps in Fake mode */
snprintf(replace_from, sizeof(replace_from), "%s/%s/" REQUIRED_BY_FNAME,
dbdir, installed);
snprintf(replace_via, sizeof(replace_via), "%s/.%s." REQUIRED_BY_FNAME,
@@ -560,7 +563,7 @@ pkg_do(const char *pkg)
* one at all.
*/
strlcpy(base_new, PkgName, sizeof(base_new));
- s2 = strpbrk(base_new, "<>[]?*{");
+ s2 = strpbrk(base_new, "<>[]?*{"); /* } */
if (s2)
*s2 = '\0';
else {
@@ -569,7 +572,7 @@ pkg_do(const char *pkg)
*s2 = '\0';
}
strlcpy(base_exist, depp->name, sizeof(base_exist));
- s2 = strpbrk(base_exist, "<>[]?*{");
+ s2 = strpbrk(base_exist, "<>[]?*{"); /* } */
if (s2)
*s2 = '\0';
else {
@@ -685,21 +688,35 @@ ignore_replace_depends_check:
(void) snprintf(buf, sizeof(buf),
skip ? "%.*s[0-9]*" : "%.*s-[0-9]*",
(int)(s - p->name) + skip, p->name);
- if (findmatchingname(dbdir, buf, note_whats_installed, installed) > 0) {
- warnx("pkg `%s' required, but `%s' found installed.",
- p->name, installed);
-
- if (replacing) {
- printf("HF: replace note -- could 'pkg_delete %s', and let the normal\n"
- "dependency handling reinstall the replaced package, assuming one IS\n"
- "available. But then I'd expect proper binary pkgs being available for\n"
- "the replace case.\n", installed);
+ if (findmatchingname(dbdir, buf, note_whats_installed, installed) > 0)
+ {
+ int done = 0;
+
+ if (Replace > 1)
+ {
+ int errc0 = 0;
+ char tmp[FILENAME_MAX];
+
+ warnx("Attempting to update `%s' using binary package\n", p->name);
+ /* Yes, append .tgz after the version so the */
+ /* pattern can match a filename. */
+ snprintf(tmp, sizeof(tmp), "%s.tgz", p->name);
+ done = installprereq(tmp, &errc0, 1);
+ }
+ else if (Replace)
+ {
+ warnx("To perform necessary upgrades on required packages specify -u twice.\n");
}
- if (Force) {
- warnx("Proceeding anyway.");
- } else {
- err_prescan++;
+ if (!done)
+ {
+ warnx("pkg `%s' required, but `%s' found installed.",
+ p->name, installed);
+ if (Force) {
+ warnx("Proceeding anyway.");
+ } else {
+ err_prescan++;
+ }
}
}
}
@@ -741,10 +758,10 @@ ignore_replace_depends_check:
if (exact != NULL) {
/* first try the exact name, from the @blddep */
- done = installprereq(exact, &errc0);
+ done = installprereq(exact, &errc0, 0);
}
if (!done) {
- done = installprereq(p->name, &errc0);
+ done = installprereq(p->name, &errc0, 0);
}
if (!done && !Force) {
errc += errc0;
@@ -1025,11 +1042,11 @@ pkg_perform(lpkg_head_t *pkgs)
signal(SIGHUP, cleanup);
if (AddMode == SLAVE)
- err_cnt = pkg_do(NULL);
+ err_cnt = pkg_do(NULL, NULL);
else {
while ((lpp = TAILQ_FIRST(pkgs)) != NULL) {
path_prepend_from_pkgname(lpp->lp_name);
- err_cnt += pkg_do(lpp->lp_name);
+ err_cnt += pkg_do(lpp->lp_name, pkgs);
path_prepend_clear();
TAILQ_REMOVE(pkgs, lpp, lp_link);
free_lpkg(lpp);
diff --git a/pkgtools/pkg_install/files/lib/lib.h b/pkgtools/pkg_install/files/lib/lib.h
index b07727e07b6..f0a264aabaa 100644
--- a/pkgtools/pkg_install/files/lib/lib.h
+++ b/pkgtools/pkg_install/files/lib/lib.h
@@ -1,4 +1,4 @@
-/* $NetBSD: lib.h,v 1.13 2004/11/20 06:42:12 grant Exp $ */
+/* $NetBSD: lib.h,v 1.14 2004/12/09 20:10:34 erh Exp $ */
/* from FreeBSD Id: lib.h,v 1.25 1997/10/08 07:48:03 charnier Exp */
@@ -352,6 +352,5 @@ int pkg_perform(lpkg_head_t *);
extern Boolean Verbose;
extern Boolean Fake;
extern Boolean Force;
-extern Boolean Replace;
#endif /* _INST_LIB_LIB_H_ */