summary refs log tree commit diff
path: root/host/start-vm
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2023-06-23 23:00:57 +0000
committerAlyssa Ross <hi@alyssa.is>2024-01-19 11:23:55 +0100
commitb1d64acff3fdbe7a0e819ecdd2d3b27620af08b2 (patch)
tree2c63143a60badd4d3ad931ddc7bf98f4800b9457 /host/start-vm
parent8fef1311d99d6a5026a3c548cf02cdc8cde0eec0 (diff)
downloadspectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.tar
spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.tar.gz
spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.tar.bz2
spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.tar.lz
spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.tar.xz
spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.tar.zst
spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.zip
host/rootfs: prefix VM service names
This will allow adding other services that are not specific to any
particular VM (e.g. multi-VM bundles) without risking conflicts with
user-provided VM names.

Signed-off-by: Alyssa Ross <hi@alyssa.is>
Diffstat (limited to 'host/start-vm')
-rw-r--r--host/start-vm/ch.rs2
-rw-r--r--host/start-vm/lib.rs21
-rw-r--r--host/start-vm/tests/vm_command-basic.rs2
-rw-r--r--host/start-vm/tests/vm_command-multiple-disks.rs2
-rw-r--r--host/start-vm/tests/vm_command-shared-dir.rs4
5 files changed, 19 insertions, 12 deletions
diff --git a/host/start-vm/ch.rs b/host/start-vm/ch.rs
index 84216fb..876a6ed 100644
--- a/host/start-vm/ch.rs
+++ b/host/start-vm/ch.rs
@@ -14,7 +14,7 @@ const EPERM: NonZeroI32 = unsafe { NonZeroI32::new_unchecked(1) };
 const EPROTO: NonZeroI32 = unsafe { NonZeroI32::new_unchecked(71) };
 
 fn command(vm_name: &OsStr, s: impl AsRef<OsStr>) -> Command {
-    let mut api_socket_path = OsString::from("/run/service/ext-");
+    let mut api_socket_path = OsString::from("/run/service/ext-vm-");
     api_socket_path.push(vm_name);
     api_socket_path.push("/env/cloud-hypervisor.sock");
 
diff --git a/host/start-vm/lib.rs b/host/start-vm/lib.rs
index d9d7966..33c19bb 100644
--- a/host/start-vm/lib.rs
+++ b/host/start-vm/lib.rs
@@ -50,12 +50,19 @@ pub fn create_api_socket() -> Result<UnixListener, String> {
 pub fn vm_command(dir: &Path, api_socket_fd: RawFd) -> Result<Command, String> {
     let vm_name = dir
         .file_name()
-        .ok_or_else(|| "directory has no name".to_string())?;
+        .ok_or_else(|| "directory has no name".to_string())?
+        .as_bytes();
 
-    if vm_name.as_bytes().contains(&b',') {
+    if !vm_name.starts_with(b"vm-") {
+        return Err("not running from a VM service directory".to_string());
+    }
+
+    if vm_name.contains(&b',') {
         return Err(format!("VM name may not contain a comma: {:?}", vm_name));
     }
 
+    let vm_name = OsStr::from_bytes(&vm_name[3..]);
+
     let config_dir = dir.join("data/config");
 
     let mut command = Command::new("cloud-hypervisor");
@@ -130,9 +137,9 @@ pub fn vm_command(dir: &Path, api_socket_fd: RawFd) -> Result<Command, String> {
 
     if config_dir.join("wayland").exists() {
         command.arg("--gpu").arg({
-            let mut gpu = OsString::from("socket=../");
+            let mut gpu = OsString::from("socket=../gpu-");
             gpu.push(vm_name);
-            gpu.push("-gpu/env/crosvm.sock");
+            gpu.push("/env/crosvm.sock");
             gpu
         });
     }
@@ -151,9 +158,9 @@ pub fn vm_command(dir: &Path, api_socket_fd: RawFd) -> Result<Command, String> {
 
                 let mut arg = OsString::from("tag=");
                 arg.push(&entry);
-                arg.push(",socket=../");
+                arg.push(",socket=../fs-");
                 arg.push(vm_name);
-                arg.push("-fs-");
+                arg.push("-");
                 arg.push(&entry);
                 arg.push("/env/virtiofsd.sock");
                 command.arg(arg);
@@ -179,7 +186,7 @@ mod tests {
 
     #[test]
     fn test_vm_name_comma() {
-        assert!(vm_command(Path::new("/v,m"), -1)
+        assert!(vm_command(Path::new("/vm-,"), -1)
             .unwrap_err()
             .contains("comma"));
     }
diff --git a/host/start-vm/tests/vm_command-basic.rs b/host/start-vm/tests/vm_command-basic.rs
index fac6a3d..92d78d8 100644
--- a/host/start-vm/tests/vm_command-basic.rs
+++ b/host/start-vm/tests/vm_command-basic.rs
@@ -10,7 +10,7 @@ use test_helper::TempDir;
 fn main() -> std::io::Result<()> {
     let tmp_dir = TempDir::new()?;
 
-    let service_dir = tmp_dir.path().join("testvm");
+    let service_dir = tmp_dir.path().join("vm-testvm");
 
     let kernel_path = service_dir.join("data/config/vmlinux");
     let image_path = service_dir.join("data/config/blk/root.img");
diff --git a/host/start-vm/tests/vm_command-multiple-disks.rs b/host/start-vm/tests/vm_command-multiple-disks.rs
index ad16f60..e17d505 100644
--- a/host/start-vm/tests/vm_command-multiple-disks.rs
+++ b/host/start-vm/tests/vm_command-multiple-disks.rs
@@ -12,7 +12,7 @@ use test_helper::TempDir;
 fn main() -> std::io::Result<()> {
     let tmp_dir = TempDir::new()?;
 
-    let service_dir = tmp_dir.path().join("testvm");
+    let service_dir = tmp_dir.path().join("vm-testvm");
     let vm_config = service_dir.join("data/config");
 
     create_dir_all(&vm_config)?;
diff --git a/host/start-vm/tests/vm_command-shared-dir.rs b/host/start-vm/tests/vm_command-shared-dir.rs
index 3e8fe1f..d310d09 100644
--- a/host/start-vm/tests/vm_command-shared-dir.rs
+++ b/host/start-vm/tests/vm_command-shared-dir.rs
@@ -12,7 +12,7 @@ use test_helper::TempDir;
 fn main() -> std::io::Result<()> {
     let tmp_dir = TempDir::new()?;
 
-    let service_dir = tmp_dir.path().join("testvm");
+    let service_dir = tmp_dir.path().join("vm-testvm");
     let vm_config = service_dir.join("data/config");
 
     create_dir_all(&vm_config)?;
@@ -34,7 +34,7 @@ fn main() -> std::io::Result<()> {
     assert!(args.any(|arg| arg == "--fs"));
 
     let expected_fs_args = (1..=2)
-        .map(|i| format!("tag=dir{i},socket=../testvm-fs-dir{i}/env/virtiofsd.sock"))
+        .map(|i| format!("tag=dir{i},socket=../fs-testvm-dir{i}/env/virtiofsd.sock"))
         .map(OsString::from)
         .collect::<BTreeSet<_>>();