uevent/
bind_kobject_uevent.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4// UNSAFETY: Calling SockAddr::try_init.
5#![expect(unsafe_code)]
6
7use socket2::SockAddr;
8use socket2::Socket;
9use std::io;
10
11pub(crate) fn bind_kobject_uevent_socket() -> io::Result<Socket> {
12    let socket = Socket::new(
13        libc::PF_NETLINK.into(),
14        socket2::Type::DGRAM,
15        Some(libc::NETLINK_KOBJECT_UEVENT.into()),
16    )?;
17
18    // SAFETY: Address family (AF_NETLINK) and length matches the type of storage (sockaddr_nl).
19    let ((), sockaddr) = unsafe {
20        SockAddr::try_init(|storage, len| {
21            let mut address: libc::sockaddr_nl = std::mem::zeroed();
22            address.nl_family = libc::AF_NETLINK as _;
23            address.nl_pid = 0;
24            address.nl_groups = 1;
25            storage.cast::<libc::sockaddr_nl>().write(address);
26            len.write(size_of::<libc::sockaddr_nl>() as u32);
27            Ok(())
28        })?
29    };
30
31    socket.bind(&sockaddr)?;
32
33    Ok(socket)
34}