From: Michael Tremer Date: Sat, 13 Feb 2021 12:41:06 +0000 (+0000) Subject: Move populating /dev to libpakfire X-Git-Tag: 0.9.28~1285^2~739 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2d110bb9acb0579569d88da9a087ca71c8567fe4;p=pakfire.git Move populating /dev to libpakfire Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 349efe8ed..b11dae969 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -362,6 +363,76 @@ ERROR: return r; } +static const struct pakfire_devnode { + const char* path; + int major; + int minor; + mode_t mode; +} devnodes[] = { + { "/dev/null", 1, 3, S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH, }, + { "/dev/zero", 1, 5, S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH, }, + { "/dev/full", 1, 7, S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH, }, + { "/dev/random", 1, 8, S_IFCHR|S_IRUSR|S_IRGRP|S_IROTH, }, + { "/dev/urandom", 1, 9, S_IFCHR|S_IRUSR|S_IRGRP|S_IROTH, }, + { "/dev/kmsg", 1, 11, S_IFCHR|S_IRUSR|S_IRGRP|S_IROTH, }, + { "/dev/tty", 5, 0, S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH, }, + { "/dev/console", 5, 1, S_IFCHR|S_IRUSR|S_IWUSR, }, + { "/dev/ptmx", 5, 2, S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH, }, + { "/dev/rtc0", 252, 0, S_IFCHR|S_IRUSR|S_IWUSR, }, + { NULL }, +}; + +static const struct pakfire_symlink { + const char* target; + const char* path; +} symlinks[] = { + { "/proc/self/fd", "/dev/fd", }, + { "/proc/self/fd/0", "/dev/stdin" }, + { "/proc/self/fd/1", "/dev/stdout" }, + { "/proc/self/fd/2", "/dev/stderr" }, + { "/proc/kcore", "/dev/core" }, + { NULL }, +}; + +static int pakfire_populate_dev(Pakfire pakfire) { + // Create device nodes + for (const struct pakfire_devnode* devnode = devnodes; devnode->path; devnode++) { + DEBUG(pakfire, "Creating device node %s\n", devnode->path); + + char* path = pakfire_make_path(pakfire, devnode->path); + dev_t dev = makedev(devnode->major, devnode->minor); + + int r = mknod(path, devnode->mode, dev); + if (r) { + ERROR(pakfire, "Could not create %s: %s\n", devnode->path, strerror(errno)); + free(path); + + return r; + } + + free(path); + } + + // Create symlinks + for (const struct pakfire_symlink* s = symlinks; s->target; s++) { + DEBUG(pakfire, "Creating symlink %s -> %s\n", s->path, s->target); + + char* path = pakfire_make_path(pakfire, s->path); + + int r = symlink(s->target, path); + if (r) { + ERROR(pakfire, "Could not create symlink %s: %s\n", s->path, strerror(errno)); + free(path); + + return r; + } + + free(path); + } + + return 0; +} + PAKFIRE_EXPORT int pakfire_activate(Pakfire pakfire) { if (strcmp(pakfire->path, "/") == 0) return 0; @@ -378,6 +449,11 @@ PAKFIRE_EXPORT int pakfire_activate(Pakfire pakfire) { return r; } + // Populate /dev + r = pakfire_populate_dev(pakfire); + if (r) + return r; + return 0; } diff --git a/src/pakfire/builder.py b/src/pakfire/builder.py index 2220943dc..c4f851fa0 100644 --- a/src/pakfire/builder.py +++ b/src/pakfire/builder.py @@ -73,7 +73,6 @@ class Builder(object): # Settings array. self.settings = { - "enable_loop_devices" : self.config.get_bool("builder", "use_loop_devices", True), "enable_ccache" : self.config.get_bool("builder", "use_ccache", True), "buildroot_tmpfs" : self.config.get_bool("builder", "use_tmpfs", False), } @@ -123,9 +122,6 @@ class Builder(object): # Lock the build environment self.lock() - # Populate /dev - self.populate_dev() - # Setup domain name resolution in chroot self.setup_dns() @@ -301,42 +297,6 @@ class Builder(object): shutil.copy2(file_in, file_out) - def populate_dev(self): - nodes = [ - "/dev/null", - "/dev/zero", - "/dev/full", - "/dev/random", - "/dev/urandom", - "/dev/tty", - "/dev/ptmx", - "/dev/kmsg", - "/dev/rtc0", - "/dev/console", - ] - - # If we need loop devices (which are optional) we create them here. - if self.settings["enable_loop_devices"]: - for i in range(0, 7): - nodes.append("/dev/loop%d" % i) - - for node in nodes: - # Stat the original node of the host system and copy it to - # the build chroot. - try: - node_stat = os.stat(node) - - # If it cannot be found, just go on. - except OSError: - continue - - self._create_node(node, node_stat.st_mode, node_stat.st_rdev) - - os.symlink("/proc/self/fd/0", self.chrootPath("dev", "stdin")) - os.symlink("/proc/self/fd/1", self.chrootPath("dev", "stdout")) - os.symlink("/proc/self/fd/2", self.chrootPath("dev", "stderr")) - os.symlink("/proc/self/fd", self.chrootPath("dev", "fd")) - def chrootPath(self, *args): # Remove all leading slashes _args = [] @@ -361,18 +321,6 @@ class Builder(object): for i in ("/etc/resolv.conf", "/etc/hosts"): self.copyin(i, i) - def _create_node(self, filename, mode, device): - self.log.debug("Create node: %s (%s)" % (filename, mode)) - - filename = self.chrootPath(filename) - - # Create parent directory if it is missing. - dirname = os.path.dirname(filename) - if not os.path.exists(dirname): - os.makedirs(dirname) - - os.mknod(filename, mode, device) - def execute_root(self, command, **kwargs): """ Executes the given command outside the build chroot.