summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pkg_install/lib
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>2009-06-19 17:07:38 +0000
committerbrian <brian@FreeBSD.org>2009-06-19 17:07:38 +0000
commit020220234336a0527c3a4eb5fe739a256bd31981 (patch)
tree7a28f52b43e5a7153d8f58917ed64d7cc7d49968 /usr.sbin/pkg_install/lib
parentda4e70cf9ab3e05f67d77de37a7c6c335a5f7e4b (diff)
downloadFreeBSD-src-020220234336a0527c3a4eb5fe739a256bd31981.zip
FreeBSD-src-020220234336a0527c3a4eb5fe739a256bd31981.tar.gz
When running pkg_add -r, check & install our dependencies for each
package rather than expecting our top level package to get all of the dependencies correct. Previously, the code depended on the top level package having all of the pkgdep lines in +CONTENTS correct and in the right order, but that doesn't always happen due to code such as this (in security/gnutls/Makefile): .if (defined(WITH_LZO) || exists(${LOCALBASE}/lib/liblzo2.so)) && !defined(WITHOUT_LZO) LIB_DEPENDS+= lzo2:${PORTSDIR}/archivers/lzo2 .... With such conditional dependencies, my 'sophox-packages' package won't install. The dependency tree looks like this: sophox-packages ... x11/gnome2 x11/gnome-applets net/libgweather devel/libsoup security/gnutls security/libgcrypt security/libgpg-error ... x11/gnome2 archivers/file-roller archivers/gtar archivers/lzop archivers/lzo2 ... gnutls doesn't depend on lzo2 initially, but lzo2 is dragged into the mix via other dependencies and is built by the initial 'make'. The subsequent package generation for gnutls adds a pkgdep line for lzo2 to gnutls' +CONTENTS but the pkgdeps in sophox-packages' +CONTENTS has gnutls *before* lzo2. As a result, sophox-packages cannot install; gnutls fails because lzo2 is missing, 82 more packages fail because gnutls is missing and the whole thing spirals into a super-confusing mess! MFC after: 3 weeks
Diffstat (limited to 'usr.sbin/pkg_install/lib')
-rw-r--r--usr.sbin/pkg_install/lib/lib.h6
-rw-r--r--usr.sbin/pkg_install/lib/pen.c43
-rw-r--r--usr.sbin/pkg_install/lib/url.c5
3 files changed, 29 insertions, 25 deletions
diff --git a/usr.sbin/pkg_install/lib/lib.h b/usr.sbin/pkg_install/lib/lib.h
index aef772b..acbd017 100644
--- a/usr.sbin/pkg_install/lib/lib.h
+++ b/usr.sbin/pkg_install/lib/lib.h
@@ -159,9 +159,9 @@ STAILQ_HEAD(reqr_by_head, reqr_by_entry);
int vsystem(const char *, ...);
char *vpipe(const char *, ...);
void cleanup(int);
-char *make_playpen(char *, off_t);
+const char *make_playpen(char *, off_t);
char *where_playpen(void);
-void leave_playpen(void);
+int leave_playpen(void);
off_t min_free(const char *);
/* String */
@@ -183,7 +183,7 @@ Boolean isfile(const char *);
Boolean isempty(const char *);
Boolean issymlink(const char *);
Boolean isURL(const char *);
-char *fileGetURL(const char *, const char *, int);
+const char *fileGetURL(const char *, const char *, int);
char *fileFindByPath(const char *, const char *);
char *fileGetContents(const char *);
void write_file(const char *, const char *);
diff --git a/usr.sbin/pkg_install/lib/pen.c b/usr.sbin/pkg_install/lib/pen.c
index fef3f9d..2f7e917 100644
--- a/usr.sbin/pkg_install/lib/pen.c
+++ b/usr.sbin/pkg_install/lib/pen.c
@@ -31,7 +31,6 @@ __FBSDID("$FreeBSD$");
/* For keeping track of where we are */
static char PenLocation[FILENAME_MAX];
-static char Previous[FILENAME_MAX];
char *
where_playpen(void)
@@ -76,12 +75,14 @@ find_play_pen(char *pen, off_t sz)
static char *pstack[MAX_STACK];
static int pdepth = -1;
-static void
+static const char *
pushPen(const char *pen)
{
if (++pdepth == MAX_STACK)
errx(2, "%s: stack overflow.\n", __func__);
pstack[pdepth] = strdup(pen);
+
+ return pstack[pdepth];
}
static void
@@ -99,10 +100,11 @@ popPen(char *pen)
* Make a temporary directory to play in and chdir() to it, returning
* pathname of previous working directory.
*/
-char *
+const char *
make_playpen(char *pen, off_t sz)
{
char humbuf1[6], humbuf2[6];
+ char cwd[FILENAME_MAX];
if (!find_play_pen(pen, sz))
return NULL;
@@ -134,7 +136,7 @@ make_playpen(char *pen, off_t sz)
"with more space and\ntry the command again", __func__, pen);
}
- if (!getcwd(Previous, FILENAME_MAX)) {
+ if (!getcwd(cwd, FILENAME_MAX)) {
upchuck("getcwd");
return NULL;
}
@@ -144,34 +146,35 @@ make_playpen(char *pen, off_t sz)
errx(2, "%s: can't chdir to '%s'", __func__, pen);
}
- if (PenLocation[0])
- pushPen(PenLocation);
-
strcpy(PenLocation, pen);
- return Previous;
+ return pushPen(cwd);
}
/* Convenience routine for getting out of playpen */
-void
+int
leave_playpen()
{
+ static char left[FILENAME_MAX];
void (*oldsig)(int);
+ if (!PenLocation[0])
+ return 0;
+
/* Don't interrupt while we're cleaning up */
oldsig = signal(SIGINT, SIG_IGN);
- if (Previous[0]) {
- if (chdir(Previous) == FAIL) {
- cleanup(0);
- errx(2, "%s: can't chdir back to '%s'", __func__, Previous);
- }
- Previous[0] = '\0';
- }
- if (PenLocation[0]) {
- if (PenLocation[0] == '/' && vsystem("/bin/rm -rf %s", PenLocation))
- warnx("couldn't remove temporary dir '%s'", PenLocation);
- popPen(PenLocation);
+ strcpy(left, PenLocation);
+ popPen(PenLocation);
+
+ if (chdir(PenLocation) == FAIL) {
+ cleanup(0);
+ errx(2, "%s: can't chdir back to '%s'", __func__, PenLocation);
}
+
+ if (left[0] == '/' && vsystem("/bin/rm -rf %s", left))
+ warnx("couldn't remove temporary dir '%s'", left);
signal(SIGINT, oldsig);
+
+ return 1;
}
off_t
diff --git a/usr.sbin/pkg_install/lib/url.c b/usr.sbin/pkg_install/lib/url.c
index 1cf5d31..8121283 100644
--- a/usr.sbin/pkg_install/lib/url.c
+++ b/usr.sbin/pkg_install/lib/url.c
@@ -32,10 +32,11 @@ __FBSDID("$FreeBSD$");
* Try and fetch a file by URL, returning the directory name for where
* it's unpacked, if successful.
*/
-char *
+const char *
fileGetURL(const char *base, const char *spec, int keep_package)
{
- char *cp, *rp, *tmp;
+ const char *rp;
+ char *cp, *tmp;
char fname[FILENAME_MAX];
char pen[FILENAME_MAX];
char pkg[FILENAME_MAX];
OpenPOWER on IntegriCloud