fedimint_portalloc/
lib.rs1#![allow(clippy::needless_lifetimes)]
2
3mod data;
21mod envs;
22mod util;
23
24use std::path::PathBuf;
25
26use anyhow::bail;
27
28use crate::data::DataDir;
29use crate::envs::FM_PORTALLOC_DATA_DIR_ENV;
30
31pub fn port_alloc(range_size: u16) -> anyhow::Result<u16> {
32 if range_size == 0 {
33 bail!("Can't allocate range of 0 ports");
34 }
35
36 let mut data_dir = DataDir::new(data_dir()?)?;
37
38 data_dir.with_lock(|data_dir| {
39 let mut data = data_dir.load_data()?;
40 let base_port = data.get_free_port_range(range_size);
41 data_dir.store_data(&data)?;
42 Ok(base_port)
43 })
44}
45
46fn data_dir() -> anyhow::Result<PathBuf> {
47 if let Some(env) = std::env::var_os(FM_PORTALLOC_DATA_DIR_ENV) {
48 Ok(PathBuf::from(env))
49 } else if let Some(dir) = dirs::cache_dir() {
50 Ok(dir.join("fm-portalloc"))
51 } else {
52 bail!("Could not determine port alloc data dir. Try setting FM_PORTALLOC_DATA_DIR");
53 }
54}