systemconfiguration/
vlan_interface.rs1use crate::{
2 bridge,
3 error::Result,
4 ffi,
5 network_interface::NetworkInterface,
6 preferences::Preferences,
7 PropertyList,
8};
9
10#[derive(Clone)]
11pub struct VlanInterface {
12 raw: bridge::OwnedHandle,
13}
14
15impl std::fmt::Debug for VlanInterface {
16 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17 f.debug_struct("VlanInterface").finish_non_exhaustive()
18 }
19}
20
21impl VlanInterface {
22 pub fn copy_all(preferences: &Preferences) -> Vec<Self> {
23 let raw = unsafe { ffi::network_interface::sc_vlan_interface_copy_all(preferences.as_ptr()) };
24 bridge::take_handle_array(raw, Self::from_owned_handle)
25 }
26
27 pub fn copy_available_physical_interfaces() -> Vec<NetworkInterface> {
28 let raw = unsafe { ffi::network_interface::sc_vlan_interface_copy_available_physical_interfaces() };
29 bridge::take_handle_array(raw, NetworkInterface::from_owned_handle)
30 }
31
32 pub fn create(preferences: &Preferences, physical: &NetworkInterface, tag: i32) -> Result<Self> {
33 let raw = unsafe {
34 ffi::network_interface::sc_vlan_interface_create(preferences.as_ptr(), physical.as_ptr(), tag)
35 };
36 let raw = bridge::owned_handle_or_last("sc_vlan_interface_create", raw)?;
37 Ok(Self { raw })
38 }
39
40 pub fn options(&self) -> Option<PropertyList> {
41 unsafe { bridge::OwnedHandle::from_raw(ffi::network_interface::sc_vlan_interface_copy_options(self.raw.as_ptr())) }
42 .map(PropertyList::from_owned_handle)
43 }
44
45 pub fn physical_interface(&self) -> Option<NetworkInterface> {
46 unsafe {
47 bridge::OwnedHandle::from_raw(ffi::network_interface::sc_vlan_interface_copy_physical_interface(
48 self.raw.as_ptr(),
49 ))
50 }
51 .map(NetworkInterface::from_owned_handle)
52 }
53
54 pub fn tag(&self) -> Result<Option<i32>> {
55 let mut tag = 0_i32;
56 let ok = unsafe { ffi::network_interface::sc_vlan_interface_get_tag(self.raw.as_ptr(), &mut tag) };
57 if ok == 0 {
58 return Ok(None);
59 }
60 Ok(Some(tag))
61 }
62
63 pub fn remove(&self) -> Result<()> {
64 let ok = unsafe { ffi::network_interface::sc_vlan_interface_remove(self.raw.as_ptr()) };
65 bridge::bool_result("sc_vlan_interface_remove", ok)
66 }
67
68 pub fn set_localized_display_name(&self, name: &str) -> Result<()> {
69 let name = bridge::cstring(name, "sc_vlan_interface_set_localized_display_name")?;
70 let ok = unsafe {
71 ffi::network_interface::sc_vlan_interface_set_localized_display_name(self.raw.as_ptr(), name.as_ptr())
72 };
73 bridge::bool_result("sc_vlan_interface_set_localized_display_name", ok)
74 }
75
76 pub fn set_options(&self, options: &PropertyList) -> Result<()> {
77 let ok = unsafe {
78 ffi::network_interface::sc_vlan_interface_set_options(self.raw.as_ptr(), options.as_ptr())
79 };
80 bridge::bool_result("sc_vlan_interface_set_options", ok)
81 }
82
83 pub fn set_physical_interface_and_tag(&self, physical: &NetworkInterface, tag: i32) -> Result<()> {
84 let ok = unsafe {
85 ffi::network_interface::sc_vlan_interface_set_physical_interface_and_tag(
86 self.raw.as_ptr(),
87 physical.as_ptr(),
88 tag,
89 )
90 };
91 bridge::bool_result("sc_vlan_interface_set_physical_interface_and_tag", ok)
92 }
93
94 pub fn as_network_interface(&self) -> NetworkInterface {
95 NetworkInterface::from_owned_handle(self.raw.clone())
96 }
97
98 pub(crate) fn from_owned_handle(raw: bridge::OwnedHandle) -> Self {
99 Self { raw }
100 }
101}