gio/
unix_fd_message.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3#[cfg(unix)]
4use std::os::unix::io::{AsRawFd, RawFd};
5use std::{mem, ptr};
6
7use glib::{prelude::*, translate::*};
8#[cfg(all(not(unix), docsrs))]
9use socket::{AsRawFd, RawFd};
10
11use crate::{ffi, UnixFDMessage};
12
13pub trait UnixFDMessageExtManual: IsA<UnixFDMessage> + Sized {
14    #[doc(alias = "g_unix_fd_message_append_fd")]
15    fn append_fd<T: AsRawFd>(&self, fd: T) -> Result<(), glib::Error> {
16        unsafe {
17            let mut error = ptr::null_mut();
18            ffi::g_unix_fd_message_append_fd(
19                self.as_ref().to_glib_none().0,
20                fd.as_raw_fd(),
21                &mut error,
22            );
23            if error.is_null() {
24                Ok(())
25            } else {
26                Err(from_glib_full(error))
27            }
28        }
29    }
30    #[doc(alias = "g_unix_fd_message_steal_fds")]
31    fn steal_fds(&self) -> Vec<RawFd> {
32        unsafe {
33            let mut length = mem::MaybeUninit::uninit();
34            let ret = FromGlibContainer::from_glib_full_num(
35                ffi::g_unix_fd_message_steal_fds(
36                    self.as_ref().to_glib_none().0,
37                    length.as_mut_ptr(),
38                ),
39                length.assume_init() as usize,
40            );
41            ret
42        }
43    }
44}
45
46impl<O: IsA<UnixFDMessage>> UnixFDMessageExtManual for O {}