Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add a rootfd to simplify handling of relocation
Baptiste Daroussin committed 11 years ago
commit e0f5caf3b706a1db67e30f8f93d40422df8b8f92
parent f1fec8e
2 files changed +27 -0
modified libpkg/pkg.c
@@ -86,6 +86,7 @@ pkg_new(struct pkg **pkg, pkg_t type)

	(*pkg)->fields = ucl_object_typed_new(UCL_OBJECT);
	(*pkg)->type = type;
+
	(*pkg)->rootfd = -1;

	return (EPKG_OK);
}
@@ -115,6 +116,8 @@ pkg_reset(struct pkg *pkg, pkg_t type)
	pkg_list_free(pkg, PKG_GROUPS);
	pkg_list_free(pkg, PKG_SHLIBS_REQUIRED);
	pkg_list_free(pkg, PKG_SHLIBS_PROVIDED);
+
	if (pkg->rootfd != -1)
+
		close(pkg->rootfd);

	pkg->type = type;
}
@@ -139,6 +142,8 @@ pkg_free(struct pkg *pkg)
	pkg_list_free(pkg, PKG_GROUPS);
	pkg_list_free(pkg, PKG_SHLIBS_REQUIRED);
	pkg_list_free(pkg, PKG_SHLIBS_PROVIDED);
+
	if (pkg->rootfd != -1)
+
		close(pkg->rootfd);

	free(pkg);
}
@@ -1716,3 +1721,23 @@ pkg_has_dir(struct pkg *p, const char *path)

	return (d != NULL ? true : false);
}
+

+
int
+
pkg_open_root_fd(struct pkg *pkg)
+
{
+
	const ucl_object_t 	*obj, *an;
+

+
	if (pkg->rootfd != -1)
+
		return (EPKG_OK);
+

+
	pkg_get(pkg, PKG_ANNOTATIONS, &an);
+
	obj = pkg_object_find(an, "relocated");
+

+
	if ((pkg->rootfd = open(obj ? pkg_object_string(obj) : "/" ,
+
	    O_DIRECTORY)) >= 0 )
+
		return (EPKG_OK);
+

+
	pkg_emit_errno("open", obj ? pkg_object_string(obj) : "/");
+

+
	return (EPKG_FATAL);
+
}
modified libpkg/private/pkg.h
@@ -146,6 +146,7 @@ struct pkg {
	struct pkg_conflict *conflicts;
	struct pkg_provide	*provides;
	unsigned			flags;
+
	int		rootfd;
	pkg_t		 type;
	struct pkg_repo		*repo;
	UT_hash_handle	 hh;
@@ -539,5 +540,6 @@ int pkg_add_upgrade(struct pkgdb *db, const char *path, unsigned flags,
    struct pkg *rp, struct pkg *lp);
void pkg_delete_dir(struct pkg *pkg, struct pkg_dir *dir);
void pkg_delete_file(struct pkg *pkg, struct pkg_file *file, unsigned force);
+
int pkg_open_root_fd(struct pkg *pkg);

#endif