Skip to main content

systemconfiguration/
vlan_interface.rs

1use crate::{
2    bridge, error::Result, ffi, network_interface::NetworkInterface, preferences::Preferences,
3    PropertyList,
4};
5
6#[derive(Clone)]
7/// Wraps `SCVLANInterfaceRef`.
8pub struct VlanInterface {
9    raw: bridge::OwnedHandle,
10}
11
12impl std::fmt::Debug for VlanInterface {
13    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14        f.debug_struct("VlanInterface").finish_non_exhaustive()
15    }
16}
17
18impl VlanInterface {
19    /// Wraps `SCVLANInterfaceCopyAll`.
20    pub fn copy_all(preferences: &Preferences) -> Vec<Self> {
21        let raw =
22            unsafe { ffi::network_interface::sc_vlan_interface_copy_all(preferences.as_ptr()) };
23        bridge::take_handle_array(raw, Self::from_owned_handle)
24    }
25
26    /// Wraps `SCVLANInterfaceCopyAvailablePhysicalInterfaces`.
27    pub fn copy_available_physical_interfaces() -> Vec<NetworkInterface> {
28        let raw = unsafe {
29            ffi::network_interface::sc_vlan_interface_copy_available_physical_interfaces()
30        };
31        bridge::take_handle_array(raw, NetworkInterface::from_owned_handle)
32    }
33
34    /// Wraps `SCVLANInterfaceCreate`.
35    pub fn create(
36        preferences: &Preferences,
37        physical: &NetworkInterface,
38        tag: i32,
39    ) -> Result<Self> {
40        let raw = unsafe {
41            ffi::network_interface::sc_vlan_interface_create(
42                preferences.as_ptr(),
43                physical.as_ptr(),
44                tag,
45            )
46        };
47        let raw = bridge::owned_handle_or_last("sc_vlan_interface_create", raw)?;
48        Ok(Self { raw })
49    }
50
51    /// Wraps `SCVLANInterfaceCopyOptions`.
52    pub fn options(&self) -> Option<PropertyList> {
53        unsafe {
54            bridge::OwnedHandle::from_raw(ffi::network_interface::sc_vlan_interface_copy_options(
55                self.raw.as_ptr(),
56            ))
57        }
58        .map(PropertyList::from_owned_handle)
59    }
60
61    /// Wraps `SCVLANInterfaceCopyPhysicalInterface`.
62    pub fn physical_interface(&self) -> Option<NetworkInterface> {
63        unsafe {
64            bridge::OwnedHandle::from_raw(
65                ffi::network_interface::sc_vlan_interface_copy_physical_interface(
66                    self.raw.as_ptr(),
67                ),
68            )
69        }
70        .map(NetworkInterface::from_owned_handle)
71    }
72
73    /// Wraps `SCVLANInterfaceGetTag`.
74    pub fn tag(&self) -> Result<Option<i32>> {
75        let mut tag = 0_i32;
76        let ok = unsafe {
77            ffi::network_interface::sc_vlan_interface_get_tag(self.raw.as_ptr(), &mut tag)
78        };
79        if ok == 0 {
80            return Ok(None);
81        }
82        Ok(Some(tag))
83    }
84
85    /// Wraps `SCVLANInterfaceRemove`.
86    pub fn remove(&self) -> Result<()> {
87        let ok = unsafe { ffi::network_interface::sc_vlan_interface_remove(self.raw.as_ptr()) };
88        bridge::bool_result("sc_vlan_interface_remove", ok)
89    }
90
91    /// Wraps `SCVLANInterfaceSetLocalizedDisplayName`.
92    pub fn set_localized_display_name(&self, name: &str) -> Result<()> {
93        let name = bridge::cstring(name, "sc_vlan_interface_set_localized_display_name")?;
94        let ok = unsafe {
95            ffi::network_interface::sc_vlan_interface_set_localized_display_name(
96                self.raw.as_ptr(),
97                name.as_ptr(),
98            )
99        };
100        bridge::bool_result("sc_vlan_interface_set_localized_display_name", ok)
101    }
102
103    /// Wraps `SCVLANInterfaceSetOptions`.
104    pub fn set_options(&self, options: &PropertyList) -> Result<()> {
105        let ok = unsafe {
106            ffi::network_interface::sc_vlan_interface_set_options(
107                self.raw.as_ptr(),
108                options.as_ptr(),
109            )
110        };
111        bridge::bool_result("sc_vlan_interface_set_options", ok)
112    }
113
114    /// Wraps `SCVLANInterfaceSetPhysicalInterfaceAndTag`.
115    pub fn set_physical_interface_and_tag(
116        &self,
117        physical: &NetworkInterface,
118        tag: i32,
119    ) -> Result<()> {
120        let ok = unsafe {
121            ffi::network_interface::sc_vlan_interface_set_physical_interface_and_tag(
122                self.raw.as_ptr(),
123                physical.as_ptr(),
124                tag,
125            )
126        };
127        bridge::bool_result("sc_vlan_interface_set_physical_interface_and_tag", ok)
128    }
129
130    /// Wraps a helper on `SCVLANInterfaceRef`.
131    pub fn as_network_interface(&self) -> NetworkInterface {
132        NetworkInterface::from_owned_handle(self.raw.clone())
133    }
134
135    pub(crate) fn from_owned_handle(raw: bridge::OwnedHandle) -> Self {
136        Self { raw }
137    }
138}