summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pkg_install
diff options
context:
space:
mode:
authorflz <flz@FreeBSD.org>2008-12-25 16:59:35 +0000
committerflz <flz@FreeBSD.org>2008-12-25 16:59:35 +0000
commit6a15aa1665f930c5e5d3d0ac963733bc56de95b3 (patch)
treeefe80b0717648509aa23ff45989e23caf90382ca /usr.sbin/pkg_install
parent4e6b7fef5aa3f985141b925a36877d8dbbbfc99f (diff)
downloadFreeBSD-src-6a15aa1665f930c5e5d3d0ac963733bc56de95b3.zip
FreeBSD-src-6a15aa1665f930c5e5d3d0ac963733bc56de95b3.tar.gz
Follow symlinks when deleting directories.
Bump PKG_INSTALL_VER to 20081225 (Merry Christmas \o/). PR: bin/54446 Submitted by: Andrea Barberio <insomniac@slackware.it> MFC after: 1 month
Diffstat (limited to 'usr.sbin/pkg_install')
-rw-r--r--usr.sbin/pkg_install/lib/lib.h2
-rw-r--r--usr.sbin/pkg_install/lib/plist.c93
2 files changed, 71 insertions, 24 deletions
diff --git a/usr.sbin/pkg_install/lib/lib.h b/usr.sbin/pkg_install/lib/lib.h
index d463257..4dbe2c0 100644
--- a/usr.sbin/pkg_install/lib/lib.h
+++ b/usr.sbin/pkg_install/lib/lib.h
@@ -105,7 +105,7 @@
* Version of the package tools - increase only when some
* functionality used by bsd.port.mk is changed, added or removed
*/
-#define PKG_INSTALL_VERSION 20080708
+#define PKG_INSTALL_VERSION 20081225
#define PKG_WRAPCONF_FNAME "/var/db/pkg_install.conf"
#define main(argc, argv) real_main(argc, argv)
diff --git a/usr.sbin/pkg_install/lib/plist.c b/usr.sbin/pkg_install/lib/plist.c
index 283b87f..f9b05b0 100644
--- a/usr.sbin/pkg_install/lib/plist.c
+++ b/usr.sbin/pkg_install/lib/plist.c
@@ -544,45 +544,92 @@ delete_package(Boolean ign_err, Boolean nukedirs, Package *pkg)
int
delete_hierarchy(const char *dir, Boolean ign_err, Boolean nukedirs)
{
- char *cp1, *cp2;
+ char *cp1, *cp2, *realdir;
- cp1 = cp2 = strdup(dir);
- if (!fexists(dir)) {
+ realdir = malloc(FILENAME_MAX);
+ if (realdir == NULL) {
+ warnx("Couldn't allocate enough memory\n");
+ return (ign_err ? SUCCESS : FAIL);
+ }
+
+ if (issymlink(dir) && readlink(dir, realdir, FILENAME_MAX-1) == -1)
+ return (ign_err ? SUCCESS : FAIL);
+
+ strlcpy(realdir, dir, FILENAME_MAX);
+
+ cp1 = cp2 = strdup(realdir);
+ if (cp1 == NULL) {
+ warnx("Couldn't allocate enough memory\n");
+ return (ign_err ? SUCCESS : FAIL);
+ }
+
+ if (!fexists(realdir)) {
if (!ign_err)
warnx("%s '%s' doesn't exist",
- isdir(dir) ? "directory" : "file", dir);
- return !ign_err;
+ isdir(realdir) ? "directory" : "file", realdir);
+ free(cp1);
+ free(realdir);
+ return (ign_err ? SUCCESS : FAIL);
}
else if (nukedirs) {
- if (vsystem("%s -r%s %s", REMOVE_CMD, (ign_err ? "f" : ""), dir))
- return 1;
+ if (vsystem("%s -r%s %s", REMOVE_CMD, (ign_err ? "f" : ""), realdir)) {
+ free(cp1);
+ free(realdir);
+ return (ign_err ? SUCCESS : FAIL);
+ }
}
- else if (isdir(dir) && !issymlink(dir)) {
- if (RMDIR(dir) && !ign_err)
- return 1;
+ else if (isdir(realdir)) {
+ if (RMDIR(realdir)) {
+ free(cp1);
+ free(realdir);
+ return (ign_err ? SUCCESS : FAIL);
+ }
}
else {
- if (REMOVE(dir, ign_err))
- return 1;
+ if (REMOVE(realdir, ign_err)) {
+ free(cp1);
+ free(realdir);
+ return (ign_err ? SUCCESS : FAIL);
+ }
}
- if (!nukedirs)
- return 0;
+ if (!nukedirs) {
+ free(cp1);
+ free(realdir);
+ return (SUCCESS);
+ }
while (cp2) {
if ((cp2 = strrchr(cp1, '/')) != NULL)
*cp2 = '\0';
- if (!isemptydir(dir))
- return 0;
- if (RMDIR(dir) && !ign_err) {
- if (!fexists(dir))
- warnx("directory '%s' doesn't exist", dir);
- else
- return 1;
+ if (!isemptydir(realdir)) {
+ free(cp1);
+ free(realdir);
+ return (SUCCESS);
+ }
+ if (RMDIR(realdir) && !ign_err) {
+ if (!fexists(realdir)) {
+ warnx("directory '%s' doesn't exist", realdir);
+ free(cp1);
+ free(realdir);
+ return (SUCCESS);
+ } else {
+ free(cp1);
+ free(realdir);
+ return (FAIL);
+ }
}
/* back up the pathname one component */
if (cp2) {
- cp1 = strdup(dir);
+ free(cp1);
+ cp1 = strdup(realdir);
+ if (cp1 == NULL) {
+ warnx("Couldn't allocate enough memory\n");
+ return (ign_err ? SUCCESS : FAIL);
+ }
}
}
- return 0;
+ free(cp1);
+ free(realdir);
+ return (SUCCESS);
}
+
OpenPOWER on IntegriCloud