Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add a global rootfd to allow replacing lots of string manipulation on pkg_rootdir by some simple fd manipulations
Baptiste Daroussin committed 10 years ago
commit f8ca6d167648c2a74cd1e88f4def7476e9d6c80f
parent 2464cc5
3 files changed +18 -3
modified libpkg/pkg.h.in
@@ -716,7 +716,7 @@ int pkg_set_from_fileat(int fd, struct pkg *pkg, pkg_attr attr, const char *file
 * @return Previous debug level.
 */
int64_t pkg_set_debug_level(int64_t debug_level);
-
void pkg_set_rootdir(const char *rootdir);
+
int pkg_set_rootdir(const char *rootdir);

/**
 * Allocate a new struct pkg and add it to the deps of pkg.
modified libpkg/pkg_config.c
@@ -66,6 +66,7 @@ int eventpipe = -1;
int64_t debug_level = 0;
bool developer_mode = false;
const char *pkg_rootdir = NULL;
+
int rootfd = -1;

struct config_entry {
	uint8_t type;
@@ -830,6 +831,10 @@ pkg_ini(const char *path, const char *reposdir, pkg_init_flags flags)

	k = NULL;
	o = NULL;
+
	if ((rootfd = open("/", O_DIRECTORY|O_RDONLY)) <= 0) {
+
		pkg_emit_error("Impossible to open /");
+
		return (EPKG_FATAL);
+
	}

	pkg_get_myarch(myabi, BUFSIZ);
	pkg_get_myarch_legacy(myabi_legacy, BUFSIZ);
@@ -1364,10 +1369,19 @@ pkg_set_debug_level(int64_t new_debug_level) {
	return old_debug_level;
}

-
void
+
int
pkg_set_rootdir(const char *rootdir) {
	if (pkg_initialized())
-
		return;
+
		return (EPKG_FATAL);

+
	if (rootfd != -1)
+
		close(rootfd);
+

+
	if ((rootfd = open(rootdir, O_DIRECTORY|O_RDONLY)) <= 0) {
+
		pkg_emit_error("Impossible to open /");
+
		return (EPKG_FATAL);
+
	}
	pkg_rootdir = rootdir;
+

+
	return (EPKG_OK);
}
modified libpkg/private/pkg.h
@@ -209,6 +209,7 @@ extern int eventpipe;
extern int64_t debug_level;
extern bool developer_mode;
extern const char *pkg_rootdir;
+
extern int rootfd;

struct pkg_repo_it;
struct pkg_repo;