| 223 | } |
| 224 | |
| 225 | pub(crate) fn init_workdir(config: &Config) -> anyhow::Result<WorkdirLock> { |
| 226 | let workdir = &config.workdir; |
| 227 | |
| 228 | std::fs::create_dir_all(workdir.join("crashes")).context("Error creating crash directory")?; |
| 229 | std::fs::create_dir_all(workdir.join("hangs")).context("Error creating hang directory.")?; |
| 230 | |
| 231 | let lock = WorkdirLock::new(workdir.join(".lock"))?; |
| 232 | |
| 233 | std::fs::write( |
| 234 | workdir.join("settings.json"), |
| 235 | &serde_json::to_vec_pretty(&HailFuzzSettings { |
| 236 | firmware_config: config.firmware.path.canonicalize()?, |
| 237 | fuzzer_path: std::env::current_exe()?, |
| 238 | })?, |
| 239 | )?; |
| 240 | |
| 241 | if !config.fuzzer.resume { |
| 242 | let _ = std::fs::remove_dir_all(workdir.join("queue")); |
| 243 | |
| 244 | let stats_path = workdir.join("stats.csv"); |
| 245 | let _ = std::fs::remove_file(&stats_path); |
| 246 | if parse_bool_env("ENABLE_STATS_HEADER")?.unwrap_or(false) { |
| 247 | std::fs::write(&stats_path, b"time,execs,crashes,unique_crashes,hangs,unique_hangs,coverage,blocks,inputs,total_input_bytes,total_instructions,dictionary_items\n").context("Failed to write to stats file")?; |
| 248 | } |
| 249 | } |
| 250 | else { |
| 251 | // Try to move old queue directory in place of imports. |
| 252 | let _ = std::fs::remove_dir_all(workdir.join("imports")); |
| 253 | let _ = std::fs::rename(workdir.join("queue"), workdir.join("imports")); |
| 254 | } |
| 255 | |
| 256 | let _ = std::fs::create_dir_all(workdir.join("cmplog")); |
| 257 | |
| 258 | std::fs::create_dir_all(workdir.join("queue")) |
| 259 | .context("Error creating directory for input queue.")?; |
| 260 | |
| 261 | Ok(lock) |
| 262 | } |
| 263 | |
| 264 | pub fn add_ctrlc_handler() -> Arc<AtomicBool> { |
| 265 | let flag = Arc::new(AtomicBool::new(false)); |