return syscall(__NR_clone3, args, size);
}
-static int pivot_root(const char* new_root, const char* put_old) {
- return syscall(__NR_pivot_root, new_root, put_old);
-}
-
static int pakfire_execute_buffer_is_full(const struct pakfire_execute_buffer* buffer) {
return (sizeof(buffer->data) == buffer->used);
}
const char* root = pakfire_get_path(pakfire);
const char* arch = pakfire_get_arch(pakfire);
- char oldroot[PATH_MAX];
-
DEBUG(pakfire, "Execution environment has been forked as PID %d\n", getpid());
DEBUG(pakfire, " root : %s\n", root);
DEBUG(pakfire, " cgroup : %s\n", env->cgroup);
// Change root (unless root is /)
if (strcmp(root, "/") != 0) {
- // Disable mount propagation on /
- r = pakfire_disable_mount_propagation(pakfire, "/");
- if (r)
- return r;
-
// Mount everything
r = pakfire_mount_all(pakfire, MOUNT_IN_NEW_NS);
if (r)
// Log all mountpoints
pakfire_mount_list(pakfire);
- // Move the old root to here
- r = pakfire_string_format(oldroot, "%s/.oldroot.XXXXXX", root);
- if (r < 0) {
- ERROR(pakfire, "Could not figure out where the old root directory is going: %m\n");
- return r;
- }
-
- // Create temporary directory
- if (!pakfire_mkdtemp(oldroot)) {
- ERROR(pakfire, "Could not create temporary directory: %m\n");
- return r;
- }
-
- // Call pivot_root()
- r = pivot_root(root, oldroot);
+ // Call chroot()
+ r = chroot(root);
if (r) {
- ERROR(pakfire, "pivot_root() to %s failed: %m\n", root);
+ ERROR(pakfire, "chroot() to %s failed: %m\n", root);
return 1;
}
ERROR(pakfire, "chdir() after chroot() failed: %m\n");
return 1;
}
-
- const char* __oldroot = oldroot + strlen(root);
-
- // Umount the old root directory
- r = umount2(__oldroot, MNT_DETACH);
- if (r) {
- ERROR(pakfire, "Could not umount old root directory: %m\n");
- return r;
- }
-
- // Remove the old root directory
- r = rmdir(__oldroot);
- if (r) {
- ERROR(pakfire, "Could not remove the old root directory: %m\n");
- return r;
- }
}
// Set personality