Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Rework automatic directory deletion
Baptiste Daroussin committed 11 years ago
commit c7e5eb89323ddeb8f6b1d45179260694000421b8
parent 140355b
1 file changed +18 -9
modified libpkg/pkg_delete.c
@@ -162,28 +162,37 @@ rmdir_p(struct pkgdb *db, struct pkg *pkg, char *dir, const char *prefix_r)
	int64_t cnt;
	char fullpath[MAXPATHLEN];

+
	snprintf(fullpath, sizeof(fullpath), "/%s", dir);
+
	if (pkgdb_is_dir_used(db, dir, &cnt) != EPKG_OK)
+
		return;
+

+
	if (cnt > 1)
+
		return;
+

+
	if (strcmp(prefix_r, dir) == 0)
+
		return;
+

+
	pkg_debug(1, "removing directory %s\n", dir);
	if (unlinkat(pkg->rootfd, dir, AT_REMOVEDIR) == -1 &&
	    errno != ENOTEMPTY && errno != EBUSY) {
		pkg_emit_errno("unlinkat", dir);
	}

+
	/* No recursivity for packages out of the prefix */
+
	if (strncmp(prefix_r, dir, strlen(prefix_r)) != 0)
+
		return;
+

+
	/* remove the trailing '/' */
	tmp = strrchr(dir, '/');
	if (tmp == dir)
		return;

	tmp[0] = '\0';
	tmp = strrchr(dir, '/');
-
	tmp[1] = '\0';
-

-
	snprintf(fullpath, sizeof(fullpath), "/%s", dir);
-
	if (pkgdb_is_dir_used(db, dir, &cnt) != EPKG_OK)
+
	if (tmp == NULL)
		return;

-
	if (cnt > 1)
-
		return;
-

-
	if (strcmp(prefix_r, dir) == 0)
-
		return;
+
	tmp[1] = '\0';

	rmdir_p(db, pkg, dir, prefix_r);
}