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