Преглед на файлове

feat(cli): add bind mount support for manifest in chroot

When using the manifest command with --root, bind mount the current working
directory to /usm-wd inside the chroot environment. This allows the manifest
command to access the original working directory files while running in the
chroot context.
clanker преди 10 месеца
родител
ревизия
d8ba14cd50
променени са 2 файла, в които са добавени 23 реда и са изтрити 6 реда
  1. 22 6
      src/cli/Cli.vala
  2. 1 0
      src/cli/meson.build

+ 22 - 6
src/cli/Cli.vala

@@ -21,21 +21,37 @@ public static int main(string[] args) {
                 printerr("Expected path after --root\n");
                 return 255;
             }
+
+            
+            if(command == "manifest") {
+                var wd = File.new_build_filename(root_path, "usm-wd");
+                if(!wd.query_exists()) {
+                    wd.make_directory();
+                }
+                Linux.umount(wd.get_path());
+                var res = Linux.mount(Environment.get_current_dir(), wd.get_path(), "", Linux.MountFlags.BIND);
+                if(res != 0) {
+                    printerr(@"Unable to bind mount working directory\n");
+                }
+            }
+
             var result = Posix.chroot(root_path);
             if(result != 0) {
                 printerr(@"Unable to chroot to \"$root_path\": $(Posix.strerror(result))\n");
                 return result;
             }
+
+            if(command == "manifest") {
+                Environment.set_current_dir("/usm-wd");
+            }
     
-            arguments.remove_at(root_flag_pos);
-            arguments.remove_at(root_flag_pos+1);
+            arguments.remove("--root");
+            arguments.remove(root_path);
         }
     
         if(command == "manifest") {
-            var m_args = new Invercargill.DataStructures.Vector<string>();
-            m_args.add_all(Invercargill.Wrap.array(args));
-            m_args.remove("manifest");
-            return manifest_main(m_args.to_array());
+            arguments.remove("manifest");
+            return manifest_main(arguments.to_array());
         }
         if(command == "info") {
             return info(args);

+ 1 - 0
src/cli/meson.build

@@ -7,5 +7,6 @@ sources += files('Scaffold.vala')
 
  deps = dependencies
  deps += usm_dep
+ deps += meson.get_compiler('vala').find_library('linux')
 
 executable('usm', sources, dependencies: deps, install: true)