blob: 11370386d6db2563b5249bd945b99ad3d8821fc1 (
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
|
//! Network interface name resolution.
//!
//! Uses Linux and/or POSIX functions to resolve interface names like "eth0"
//! or "socan1" into device numbers.
use libc::{c_uint, if_nametoindex};
use std::ffi::{CString, NulError};
use ::Error;
/// Resolve an interface into a interface number.
pub fn name_to_index(name: &str) -> Result<c_uint, Error> {
let name = match CString::new(name) {
Err(e) => match e { NulError(..) => {
// A NulError indicates that a '\0' was found inside the string,
// making it impossible to create valid C-String. To avoid having
// to create a new error type for this rather rare case,
// nix::Error's invalid_argument() constructor is used.
//
// We match the NulError individually here to ensure to avoid
// accidentally returning invalid_argument() for errors other than
// NulError (which currently don't exist).
return Err(Error::invalid_argument());
}},
Ok(s) => s
};
let if_index;
unsafe {
if_index = if_nametoindex(name.as_ptr());
}
if if_index == 0 { Err(Error::last()) } else { Ok(if_index) }
}
|