netconfig_rs/sys/posix/
ifreq.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4#![allow(dead_code)]
5
6use super::InterfaceName;
7use crate::error::Error;
8use std::fmt::Debug;
9use std::mem;
10
11#[repr(C)]
12#[derive(Copy, Clone, Default)]
13pub struct ifreq {
14    pub ifr_ifrn: InterfaceName,
15    pub ifr_ifru: ifreq_ifru,
16}
17
18#[repr(C)]
19#[derive(Copy, Clone)]
20pub union ifreq_ifru {
21    pub ifru_addr: libc::sockaddr,
22    pub ifru_dstaddr: libc::sockaddr,
23    pub ifru_broadaddr: libc::sockaddr,
24    pub ifru_netmask: libc::sockaddr,
25    pub ifru_hwaddr: libc::sockaddr,
26    pub ifru_flags: libc::c_short,
27    pub ifru_ivalue: libc::c_int,
28    pub ifru_mtu: libc::c_int,
29    pub ifru_map: ifmap,
30    pub ifru_slave: InterfaceName,
31    pub ifru_newname: InterfaceName,
32    pub ifru_data: *mut libc::c_char,
33    align: [u64; 3usize],
34}
35
36impl Default for ifreq_ifru {
37    fn default() -> Self {
38        unsafe { mem::zeroed() }
39    }
40}
41
42#[repr(C)]
43#[derive(Debug, Copy, Clone, Default)]
44pub struct ifmap {
45    pub mem_start: libc::c_ulong,
46    pub mem_end: libc::c_ulong,
47    pub base_addr: libc::c_ushort,
48    pub irq: libc::c_uchar,
49    pub dma: libc::c_uchar,
50    pub port: libc::c_uchar,
51}
52
53#[repr(C)]
54#[derive(Debug, Copy, Clone)]
55pub struct ifaliasreq<SA> {
56    pub ifra_name: InterfaceName,
57    pub ifra_addr: SA,
58    pub ifra_broadaddr: SA,
59    pub ifra_mask: SA,
60}
61
62pub type ifaliasreq4 = ifaliasreq<libc::sockaddr_in>;
63pub type ifaliasreq6 = ifaliasreq<libc::sockaddr_in6>;
64
65impl ifreq {
66    pub fn new<T: Into<String>>(name: T) -> Result<Self, Error> {
67        Ok(ifreq {
68            ifr_ifrn: InterfaceName::try_from(&*name.into())
69                .map_err(|e| std::io::Error::other(e.to_string()))?,
70            ..Default::default()
71        })
72    }
73}