Clear temporary directory on start.

This is necessary in case virtualizationservice crashes and restarts for
some reason, and is also simpler for permissions than clearing it on
boot.

Bug: 192917795
Bug: 193365943
Test: created files, restarted virtualizationservice
Change-Id: I6a30517a76830c2440df268b45631bf9bffc9474
diff --git a/virtualizationservice/src/aidl.rs b/virtualizationservice/src/aidl.rs
index 661abdc..d99d63a 100644
--- a/virtualizationservice/src/aidl.rs
+++ b/virtualizationservice/src/aidl.rs
@@ -52,7 +52,7 @@
 pub const BINDER_SERVICE_IDENTIFIER: &str = "android.system.virtualizationservice";
 
 /// Directory in which to write disk image files used while running VMs.
-const TEMPORARY_DIRECTORY: &str = "/data/misc/virtualizationservice";
+pub const TEMPORARY_DIRECTORY: &str = "/data/misc/virtualizationservice";
 
 // TODO(qwandor): Use PermissionController once it is available to Rust.
 /// Only processes running with one of these UIDs are allowed to call debug methods.
diff --git a/virtualizationservice/src/main.rs b/virtualizationservice/src/main.rs
index 46ddd2e..c9cc029 100644
--- a/virtualizationservice/src/main.rs
+++ b/virtualizationservice/src/main.rs
@@ -20,10 +20,12 @@
 mod gpt;
 mod payload;
 
-use crate::aidl::{VirtualizationService, BINDER_SERVICE_IDENTIFIER};
+use crate::aidl::{VirtualizationService, BINDER_SERVICE_IDENTIFIER, TEMPORARY_DIRECTORY};
 use android_system_virtualizationservice::aidl::android::system::virtualizationservice::IVirtualizationService::BnVirtualizationService;
 use android_system_virtualizationservice::binder::{add_service, BinderFeatures, ProcessState};
+use anyhow::Error;
 use log::{info, Level};
+use std::fs::{remove_dir_all, remove_file, read_dir};
 
 /// The first CID to assign to a guest VM managed by the VirtualizationService. CIDs lower than this
 /// are reserved for the host or other usage.
@@ -39,6 +41,8 @@
         android_logger::Config::default().with_tag(LOG_TAG).with_min_level(Level::Trace),
     );
 
+    clear_temporary_files().expect("Failed to delete old temporary files");
+
     let service = VirtualizationService::init();
     let service = BnVirtualizationService::new_binder(
         service,
@@ -48,3 +52,17 @@
     info!("Registered Binder service, joining threadpool.");
     ProcessState::join_thread_pool();
 }
+
+/// Remove any files under `TEMPORARY_DIRECTORY`.
+fn clear_temporary_files() -> Result<(), Error> {
+    for dir_entry in read_dir(TEMPORARY_DIRECTORY)? {
+        let dir_entry = dir_entry?;
+        let path = dir_entry.path();
+        if dir_entry.file_type()?.is_dir() {
+            remove_dir_all(path)?;
+        } else {
+            remove_file(path)?;
+        }
+    }
+    Ok(())
+}