1 // Take a look at the license at the top of the repository in the LICENSE file. 2 3 use crate::UnixFDList; 4 use glib::object::IsA; 5 use glib::translate::*; 6 use std::{mem, ptr}; 7 8 #[cfg(unix)] 9 use std::os::unix::io::{AsRawFd, IntoRawFd, RawFd}; 10 11 #[cfg(all(not(unix), feature = "dox"))] 12 use socket::{AsRawFd, IntoRawFd, RawFd}; 13 14 impl UnixFDList { 15 #[doc(alias = "g_unix_fd_list_new_from_array")] from_array<T>(fds: T) -> UnixFDList where T: IntoIterator, T::Item: IntoRawFd,16 pub fn from_array<T>(fds: T) -> UnixFDList 17 where 18 T: IntoIterator, 19 T::Item: IntoRawFd, 20 { 21 let fds = fds.into_iter().map(|t| t.into_raw_fd()).collect::<Vec<_>>(); 22 unsafe { 23 from_glib_full(ffi::g_unix_fd_list_new_from_array( 24 fds.to_glib_none().0, 25 fds.len() as i32, 26 )) 27 } 28 } 29 } 30 31 pub trait UnixFDListExtManual: Sized { 32 #[doc(alias = "g_unix_fd_list_append")] append<T: AsRawFd>(&self, fd: T) -> Result<i32, glib::Error>33 fn append<T: AsRawFd>(&self, fd: T) -> Result<i32, glib::Error>; 34 35 #[doc(alias = "g_unix_fd_list_get")] get(&self, index_: i32) -> Result<RawFd, glib::Error>36 fn get(&self, index_: i32) -> Result<RawFd, glib::Error>; 37 38 #[doc(alias = "g_unix_fd_list_peek_fds")] peek_fds(&self) -> Vec<RawFd>39 fn peek_fds(&self) -> Vec<RawFd>; 40 41 #[doc(alias = "g_unix_fd_list_steal_fds")] steal_fds(&self) -> Vec<RawFd>42 fn steal_fds(&self) -> Vec<RawFd>; 43 } 44 45 impl<O: IsA<UnixFDList>> UnixFDListExtManual for O { append<T: AsRawFd>(&self, fd: T) -> Result<i32, glib::Error>46 fn append<T: AsRawFd>(&self, fd: T) -> Result<i32, glib::Error> { 47 unsafe { 48 let mut error = ptr::null_mut(); 49 let ret = ffi::g_unix_fd_list_append( 50 self.as_ref().to_glib_none().0, 51 fd.as_raw_fd(), 52 &mut error, 53 ); 54 if error.is_null() { 55 Ok(ret) 56 } else { 57 Err(from_glib_full(error)) 58 } 59 } 60 } 61 get(&self, index_: i32) -> Result<RawFd, glib::Error>62 fn get(&self, index_: i32) -> Result<RawFd, glib::Error> { 63 unsafe { 64 let mut error = ptr::null_mut(); 65 let ret = ffi::g_unix_fd_list_get(self.as_ref().to_glib_none().0, index_, &mut error); 66 if error.is_null() { 67 Ok(ret) 68 } else { 69 Err(from_glib_full(error)) 70 } 71 } 72 } 73 peek_fds(&self) -> Vec<RawFd>74 fn peek_fds(&self) -> Vec<RawFd> { 75 unsafe { 76 let mut length = mem::MaybeUninit::uninit(); 77 let ret = FromGlibContainer::from_glib_none_num( 78 ffi::g_unix_fd_list_peek_fds(self.as_ref().to_glib_none().0, length.as_mut_ptr()), 79 length.assume_init() as usize, 80 ); 81 ret 82 } 83 } 84 steal_fds(&self) -> Vec<RawFd>85 fn steal_fds(&self) -> Vec<RawFd> { 86 unsafe { 87 let mut length = mem::MaybeUninit::uninit(); 88 let ret = FromGlibContainer::from_glib_full_num( 89 ffi::g_unix_fd_list_steal_fds(self.as_ref().to_glib_none().0, length.as_mut_ptr()), 90 length.assume_init() as usize, 91 ); 92 ret 93 } 94 } 95 } 96