1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
// Take a look at the license at the top of the repository in the LICENSE file.
#[cfg(unix)]
use std::os::unix::io::{AsRawFd, RawFd};
use std::{mem, ptr};
use glib::{prelude::*, translate::*};
#[cfg(all(not(unix), feature = "dox"))]
use socket::{AsRawFd, RawFd};
use crate::UnixFDMessage;
pub trait UnixFDMessageExtManual: Sized {
/// Adds a file descriptor to `self`.
///
/// The file descriptor is duplicated using `dup()`. You keep your copy
/// of the descriptor and the copy contained in `self` will be closed
/// when `self` is finalized.
///
/// A possible cause of failure is exceeding the per-process or
/// system-wide file descriptor limit.
/// ## `fd`
/// a valid open file descriptor
///
/// # Returns
///
/// [`true`] in case of success, else [`false`] (and `error` is set)
#[doc(alias = "g_unix_fd_message_append_fd")]
fn append_fd<T: AsRawFd>(&self, fd: T) -> Result<(), glib::Error>;
/// Returns the array of file descriptors that is contained in this
/// object.
///
/// After this call, the descriptors are no longer contained in
/// `self`. Further calls will return an empty list (unless more
/// descriptors have been added).
///
/// The return result of this function must be freed with `g_free()`.
/// The caller is also responsible for closing all of the file
/// descriptors.
///
/// If `length` is non-[`None`] then it is set to the number of file
/// descriptors in the returned array. The returned array is also
/// terminated with -1.
///
/// This function never returns [`None`]. In case there are no file
/// descriptors contained in `self`, an empty array is returned.
///
/// # Returns
///
/// an array of file
/// descriptors
#[doc(alias = "g_unix_fd_message_steal_fds")]
fn steal_fds(&self) -> Vec<RawFd>;
}
impl<O: IsA<UnixFDMessage>> UnixFDMessageExtManual for O {
fn append_fd<T: AsRawFd>(&self, fd: T) -> Result<(), glib::Error> {
unsafe {
let mut error = ptr::null_mut();
ffi::g_unix_fd_message_append_fd(
self.as_ref().to_glib_none().0,
fd.as_raw_fd(),
&mut error,
);
if error.is_null() {
Ok(())
} else {
Err(from_glib_full(error))
}
}
}
fn steal_fds(&self) -> Vec<RawFd> {
unsafe {
let mut length = mem::MaybeUninit::uninit();
let ret = FromGlibContainer::from_glib_full_num(
ffi::g_unix_fd_message_steal_fds(
self.as_ref().to_glib_none().0,
length.as_mut_ptr(),
),
length.assume_init() as usize,
);
ret
}
}
}