summaryrefslogtreecommitdiff
path: root/init/src/host/sethn.rs
blob: 1857297de70a73558feb8549bbd172381e7c59ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use std::{ffi::CString, fs, io};
use libc::{sethostname, c_char, size_t};
use crate::log::{log_warning};

pub fn try_set_hostname() {
    let content = fs::read_to_string("/etc/hostname")
        .map(|s| s.trim().to_string()) 
        .unwrap_or_else(|_| "localhost".to_string());

    if let Err(e) = perform_set_hostname(&content) {
        log_warning(&format!("Failed to set hostname to '{}': {}. Falling back to localhost.", content, e));
        let _ = perform_set_hostname("localhost");
    }
}

fn perform_set_hostname(name: &str) -> io::Result<()> {
    if name.len() > 64 {
        return Err(io::Error::new(io::ErrorKind::InvalidInput, "Hostname too long"));
    }

    let c_str = CString::new(name).map_err(|_| {
        io::Error::new(io::ErrorKind::InvalidInput, "Hostname contains null byte")
    })?;

    let res = unsafe {
        sethostname(
            c_str.as_ptr() as *const c_char,
            name.len() as size_t,
        )
    };

    if res != 0 {
        return Err(io::Error::last_os_error());
    }

    Ok(())
}