2 use crate::io::prelude::*;
3 use crate::io::{self, ErrorKind, IoSlice, IoSliceMut};
4 #[cfg(any(target_os = "android", target_os = "linux"))]
5 use crate::os::unix::io::AsRawFd;
6 use crate::sys_common::io::test::tmpdir;
8 use crate::time::Duration;
10 #[cfg(target_os = "android")]
11 use crate::os::android::net::SocketAddrExt;
13 #[cfg(target_os = "linux")]
14 use crate::os::linux::net::SocketAddrExt;
16 macro_rules! or_panic {
20 Err(e) => panic!("{e}"),
28 let socket_path = dir.path().join("sock");
32 let listener = or_panic!(UnixListener::bind(&socket_path));
33 let thread = thread::spawn(move || {
34 let mut stream = or_panic!(listener.accept()).0;
36 or_panic!(stream.read(&mut buf));
37 assert_eq!(&msg1[..], &buf[..]);
38 or_panic!(stream.write_all(msg2));
41 let mut stream = or_panic!(UnixStream::connect(&socket_path));
42 assert_eq!(Some(&*socket_path), stream.peer_addr().unwrap().as_pathname());
43 or_panic!(stream.write_all(msg1));
45 or_panic!(stream.read_to_end(&mut buf));
46 assert_eq!(&msg2[..], &buf[..]);
49 thread.join().unwrap();
54 let (mut s1, mut s2) = or_panic!(UnixStream::pair());
56 let len = or_panic!(s1.write_vectored(&[
57 IoSlice::new(b"hello"),
59 IoSlice::new(b"world!")
63 let mut buf1 = [0; 6];
64 let mut buf2 = [0; 7];
66 or_panic!(s2.read_vectored(&mut [IoSliceMut::new(&mut buf1), IoSliceMut::new(&mut buf2)],));
68 assert_eq!(&buf1, b"hello ");
69 assert_eq!(&buf2, b"world!\0");
77 let (mut s1, mut s2) = or_panic!(UnixStream::pair());
78 let thread = thread::spawn(move || {
79 // s1 must be moved in or the test will hang!
81 or_panic!(s1.read(&mut buf));
82 assert_eq!(&msg1[..], &buf[..]);
83 or_panic!(s1.write_all(msg2));
86 or_panic!(s2.write_all(msg1));
88 or_panic!(s2.read_to_end(&mut buf));
89 assert_eq!(&msg2[..], &buf[..]);
92 thread.join().unwrap();
98 let socket_path = dir.path().join("sock");
102 let listener = or_panic!(UnixListener::bind(&socket_path));
103 let thread = thread::spawn(move || {
104 let mut stream = or_panic!(listener.accept()).0;
105 or_panic!(stream.write_all(msg1));
106 or_panic!(stream.write_all(msg2));
109 let mut stream = or_panic!(UnixStream::connect(&socket_path));
110 let mut stream2 = or_panic!(stream.try_clone());
112 let mut buf = [0; 5];
113 or_panic!(stream.read(&mut buf));
114 assert_eq!(&msg1[..], &buf[..]);
115 or_panic!(stream2.read(&mut buf));
116 assert_eq!(&msg2[..], &buf[..]);
118 thread.join().unwrap();
124 let socket_path = dir.path().join("sock");
126 let listener = or_panic!(UnixListener::bind(&socket_path));
127 let thread = thread::spawn(move || {
128 for stream in listener.incoming().take(2) {
129 let mut stream = or_panic!(stream);
131 or_panic!(stream.read(&mut buf));
136 let mut stream = or_panic!(UnixStream::connect(&socket_path));
137 or_panic!(stream.write_all(&[0]));
140 thread.join().unwrap();
146 let socket_path = dir.path().join(
147 "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfa\
148 sasdfasdfasdasdfasdfasdfadfasdfasdfasdfasdfasdf",
150 match UnixStream::connect(&socket_path) {
151 Err(ref e) if e.kind() == io::ErrorKind::InvalidInput => {}
152 Err(e) => panic!("unexpected error {e}"),
153 Ok(_) => panic!("unexpected success"),
156 match UnixListener::bind(&socket_path) {
157 Err(ref e) if e.kind() == io::ErrorKind::InvalidInput => {}
158 Err(e) => panic!("unexpected error {e}"),
159 Ok(_) => panic!("unexpected success"),
162 match UnixDatagram::bind(&socket_path) {
163 Err(ref e) if e.kind() == io::ErrorKind::InvalidInput => {}
164 Err(e) => panic!("unexpected error {e}"),
165 Ok(_) => panic!("unexpected success"),
172 let socket_path = dir.path().join("sock");
174 let _listener = or_panic!(UnixListener::bind(&socket_path));
176 let stream = or_panic!(UnixStream::connect(&socket_path));
177 let dur = Duration::new(15410, 0);
179 assert_eq!(None, or_panic!(stream.read_timeout()));
181 or_panic!(stream.set_read_timeout(Some(dur)));
182 assert_eq!(Some(dur), or_panic!(stream.read_timeout()));
184 assert_eq!(None, or_panic!(stream.write_timeout()));
186 or_panic!(stream.set_write_timeout(Some(dur)));
187 assert_eq!(Some(dur), or_panic!(stream.write_timeout()));
189 or_panic!(stream.set_read_timeout(None));
190 assert_eq!(None, or_panic!(stream.read_timeout()));
192 or_panic!(stream.set_write_timeout(None));
193 assert_eq!(None, or_panic!(stream.write_timeout()));
197 fn test_read_timeout() {
199 let socket_path = dir.path().join("sock");
201 let _listener = or_panic!(UnixListener::bind(&socket_path));
203 let mut stream = or_panic!(UnixStream::connect(&socket_path));
204 or_panic!(stream.set_read_timeout(Some(Duration::from_millis(1000))));
206 let mut buf = [0; 10];
207 let kind = stream.read_exact(&mut buf).err().expect("expected error").kind();
209 kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut,
210 "unexpected_error: {:?}",
216 fn test_read_with_timeout() {
218 let socket_path = dir.path().join("sock");
220 let listener = or_panic!(UnixListener::bind(&socket_path));
222 let mut stream = or_panic!(UnixStream::connect(&socket_path));
223 or_panic!(stream.set_read_timeout(Some(Duration::from_millis(1000))));
225 let mut other_end = or_panic!(listener.accept()).0;
226 or_panic!(other_end.write_all(b"hello world"));
228 let mut buf = [0; 11];
229 or_panic!(stream.read(&mut buf));
230 assert_eq!(b"hello world", &buf[..]);
232 let kind = stream.read_exact(&mut buf).err().expect("expected error").kind();
234 kind == ErrorKind::WouldBlock || kind == ErrorKind::TimedOut,
235 "unexpected_error: {:?}",
240 // Ensure the `set_read_timeout` and `set_write_timeout` calls return errors
241 // when passed zero Durations
243 fn test_unix_stream_timeout_zero_duration() {
245 let socket_path = dir.path().join("sock");
247 let listener = or_panic!(UnixListener::bind(&socket_path));
248 let stream = or_panic!(UnixStream::connect(&socket_path));
250 let result = stream.set_write_timeout(Some(Duration::new(0, 0)));
251 let err = result.unwrap_err();
252 assert_eq!(err.kind(), ErrorKind::InvalidInput);
254 let result = stream.set_read_timeout(Some(Duration::new(0, 0)));
255 let err = result.unwrap_err();
256 assert_eq!(err.kind(), ErrorKind::InvalidInput);
262 fn test_unix_datagram() {
264 let path1 = dir.path().join("sock1");
265 let path2 = dir.path().join("sock2");
267 let sock1 = or_panic!(UnixDatagram::bind(&path1));
268 let sock2 = or_panic!(UnixDatagram::bind(&path2));
270 let msg = b"hello world";
271 or_panic!(sock1.send_to(msg, &path2));
272 let mut buf = [0; 11];
273 or_panic!(sock2.recv_from(&mut buf));
274 assert_eq!(msg, &buf[..]);
278 fn test_unnamed_unix_datagram() {
280 let path1 = dir.path().join("sock1");
282 let sock1 = or_panic!(UnixDatagram::bind(&path1));
283 let sock2 = or_panic!(UnixDatagram::unbound());
285 let msg = b"hello world";
286 or_panic!(sock2.send_to(msg, &path1));
287 let mut buf = [0; 11];
288 let (usize, addr) = or_panic!(sock1.recv_from(&mut buf));
289 assert_eq!(usize, 11);
290 assert!(addr.is_unnamed());
291 assert_eq!(msg, &buf[..]);
295 fn test_unix_datagram_connect_to_recv_addr() {
297 let path1 = dir.path().join("sock1");
298 let path2 = dir.path().join("sock2");
300 let sock1 = or_panic!(UnixDatagram::bind(&path1));
301 let sock2 = or_panic!(UnixDatagram::bind(&path2));
303 let msg = b"hello world";
304 let sock1_addr = or_panic!(sock1.local_addr());
305 or_panic!(sock2.send_to_addr(msg, &sock1_addr));
306 let mut buf = [0; 11];
307 let (_, addr) = or_panic!(sock1.recv_from(&mut buf));
309 let new_msg = b"hello back";
310 let mut new_buf = [0; 10];
311 or_panic!(sock2.connect_addr(&addr));
312 or_panic!(sock2.send(new_msg)); // set by connect_addr
313 let usize = or_panic!(sock2.recv(&mut new_buf));
314 assert_eq!(usize, 10);
315 assert_eq!(new_msg, &new_buf[..]);
319 fn test_connect_unix_datagram() {
321 let path1 = dir.path().join("sock1");
322 let path2 = dir.path().join("sock2");
324 let bsock1 = or_panic!(UnixDatagram::bind(&path1));
325 let bsock2 = or_panic!(UnixDatagram::bind(&path2));
326 let sock = or_panic!(UnixDatagram::unbound());
327 or_panic!(sock.connect(&path1));
330 let msg = b"hello there";
331 or_panic!(sock.send(msg));
332 let mut buf = [0; 11];
333 let (usize, addr) = or_panic!(bsock1.recv_from(&mut buf));
334 assert_eq!(usize, 11);
335 assert!(addr.is_unnamed());
336 assert_eq!(msg, &buf[..]);
338 // Changing default socket works too
339 or_panic!(sock.connect(&path2));
340 or_panic!(sock.send(msg));
341 or_panic!(bsock2.recv_from(&mut buf));
345 fn test_unix_datagram_recv() {
347 let path1 = dir.path().join("sock1");
349 let sock1 = or_panic!(UnixDatagram::bind(&path1));
350 let sock2 = or_panic!(UnixDatagram::unbound());
351 or_panic!(sock2.connect(&path1));
353 let msg = b"hello world";
354 or_panic!(sock2.send(msg));
355 let mut buf = [0; 11];
356 let size = or_panic!(sock1.recv(&mut buf));
357 assert_eq!(size, 11);
358 assert_eq!(msg, &buf[..]);
364 let msg2 = b"world!";
366 let (s1, s2) = or_panic!(UnixDatagram::pair());
367 let thread = thread::spawn(move || {
368 // s1 must be moved in or the test will hang!
369 let mut buf = [0; 5];
370 or_panic!(s1.recv(&mut buf));
371 assert_eq!(&msg1[..], &buf[..]);
372 or_panic!(s1.send(msg2));
375 or_panic!(s2.send(msg1));
376 let mut buf = [0; 6];
377 or_panic!(s2.recv(&mut buf));
378 assert_eq!(&msg2[..], &buf[..]);
381 thread.join().unwrap();
384 // Ensure the `set_read_timeout` and `set_write_timeout` calls return errors
385 // when passed zero Durations
387 fn test_unix_datagram_timeout_zero_duration() {
389 let path = dir.path().join("sock");
391 let datagram = or_panic!(UnixDatagram::bind(&path));
393 let result = datagram.set_write_timeout(Some(Duration::new(0, 0)));
394 let err = result.unwrap_err();
395 assert_eq!(err.kind(), ErrorKind::InvalidInput);
397 let result = datagram.set_read_timeout(Some(Duration::new(0, 0)));
398 let err = result.unwrap_err();
399 assert_eq!(err.kind(), ErrorKind::InvalidInput);
403 fn abstract_namespace_not_allowed_connect() {
404 assert!(UnixStream::connect("\0asdf").is_err());
407 #[cfg(any(target_os = "android", target_os = "linux"))]
409 fn test_abstract_stream_connect() {
413 let socket_addr = or_panic!(SocketAddr::from_abstract_name(b"name"));
414 let listener = or_panic!(UnixListener::bind_addr(&socket_addr));
416 let thread = thread::spawn(move || {
417 let mut stream = or_panic!(listener.accept()).0;
418 let mut buf = [0; 5];
419 or_panic!(stream.read(&mut buf));
420 assert_eq!(&msg1[..], &buf[..]);
421 or_panic!(stream.write_all(msg2));
424 let mut stream = or_panic!(UnixStream::connect_addr(&socket_addr));
426 let peer = or_panic!(stream.peer_addr());
427 assert_eq!(peer.as_abstract_name().unwrap(), b"name");
429 or_panic!(stream.write_all(msg1));
430 let mut buf = vec![];
431 or_panic!(stream.read_to_end(&mut buf));
432 assert_eq!(&msg2[..], &buf[..]);
435 thread.join().unwrap();
438 #[cfg(any(target_os = "android", target_os = "linux"))]
440 fn test_abstract_stream_iter() {
441 let addr = or_panic!(SocketAddr::from_abstract_name(b"hidden"));
442 let listener = or_panic!(UnixListener::bind_addr(&addr));
444 let thread = thread::spawn(move || {
445 for stream in listener.incoming().take(2) {
446 let mut stream = or_panic!(stream);
448 or_panic!(stream.read(&mut buf));
453 let mut stream = or_panic!(UnixStream::connect_addr(&addr));
454 or_panic!(stream.write_all(&[0]));
457 thread.join().unwrap();
460 #[cfg(any(target_os = "android", target_os = "linux"))]
462 fn test_abstract_datagram_bind_send_to_addr() {
463 let addr1 = or_panic!(SocketAddr::from_abstract_name(b"ns1"));
464 let sock1 = or_panic!(UnixDatagram::bind_addr(&addr1));
466 let local = or_panic!(sock1.local_addr());
467 assert_eq!(local.as_abstract_name().unwrap(), b"ns1");
469 let addr2 = or_panic!(SocketAddr::from_abstract_name(b"ns2"));
470 let sock2 = or_panic!(UnixDatagram::bind_addr(&addr2));
472 let msg = b"hello world";
473 or_panic!(sock1.send_to_addr(msg, &addr2));
474 let mut buf = [0; 11];
475 let (len, addr) = or_panic!(sock2.recv_from(&mut buf));
476 assert_eq!(msg, &buf[..]);
478 assert_eq!(addr.as_abstract_name().unwrap(), b"ns1");
481 #[cfg(any(target_os = "android", target_os = "linux"))]
483 fn test_abstract_datagram_connect_addr() {
484 let addr1 = or_panic!(SocketAddr::from_abstract_name(b"ns3"));
485 let bsock1 = or_panic!(UnixDatagram::bind_addr(&addr1));
487 let sock = or_panic!(UnixDatagram::unbound());
488 or_panic!(sock.connect_addr(&addr1));
490 let msg = b"hello world";
491 or_panic!(sock.send(msg));
492 let mut buf = [0; 11];
493 let (len, addr) = or_panic!(bsock1.recv_from(&mut buf));
495 assert_eq!(addr.is_unnamed(), true);
496 assert_eq!(msg, &buf[..]);
498 let addr2 = or_panic!(SocketAddr::from_abstract_name(b"ns4"));
499 let bsock2 = or_panic!(UnixDatagram::bind_addr(&addr2));
501 or_panic!(sock.connect_addr(&addr2));
502 or_panic!(sock.send(msg));
503 or_panic!(bsock2.recv_from(&mut buf));
506 #[cfg(any(target_os = "android", target_os = "linux"))]
508 fn test_abstract_name_too_long() {
509 match SocketAddr::from_abstract_name(
510 b"abcdefghijklmnopqrstuvwxyzabcdefghijklmn\
511 opqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi\
512 jklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
514 Err(ref e) if e.kind() == io::ErrorKind::InvalidInput => {}
515 Err(e) => panic!("unexpected error {e}"),
516 Ok(_) => panic!("unexpected success"),
520 #[cfg(any(target_os = "android", target_os = "linux"))]
522 fn test_abstract_no_pathname_and_not_unnamed() {
524 let addr = or_panic!(SocketAddr::from_abstract_name(name));
525 assert_eq!(addr.as_pathname(), None);
526 assert_eq!(addr.as_abstract_name(), Some(&name[..]));
527 assert_eq!(addr.is_unnamed(), false);
531 fn test_unix_stream_peek() {
532 let (txdone, rxdone) = crate::sync::mpsc::channel();
535 let path = dir.path().join("sock");
537 let listener = or_panic!(UnixListener::bind(&path));
538 let thread = thread::spawn(move || {
539 let mut stream = or_panic!(listener.accept()).0;
540 or_panic!(stream.write_all(&[1, 3, 3, 7]));
541 or_panic!(rxdone.recv());
544 let mut stream = or_panic!(UnixStream::connect(&path));
545 let mut buf = [0; 10];
547 assert_eq!(or_panic!(stream.peek(&mut buf)), 4);
549 assert_eq!(or_panic!(stream.read(&mut buf)), 4);
551 or_panic!(stream.set_nonblocking(true));
552 match stream.peek(&mut buf) {
553 Ok(_) => panic!("expected error"),
554 Err(ref e) if e.kind() == ErrorKind::WouldBlock => {}
555 Err(e) => panic!("unexpected error: {e}"),
558 or_panic!(txdone.send(()));
559 thread.join().unwrap();
563 fn test_unix_datagram_peek() {
565 let path1 = dir.path().join("sock");
567 let sock1 = or_panic!(UnixDatagram::bind(&path1));
568 let sock2 = or_panic!(UnixDatagram::unbound());
569 or_panic!(sock2.connect(&path1));
571 let msg = b"hello world";
572 or_panic!(sock2.send(msg));
574 let mut buf = [0; 11];
575 let size = or_panic!(sock1.peek(&mut buf));
576 assert_eq!(size, 11);
577 assert_eq!(msg, &buf[..]);
580 let mut buf = [0; 11];
581 let size = or_panic!(sock1.recv(&mut buf));
582 assert_eq!(size, 11);
583 assert_eq!(msg, &buf[..]);
587 fn test_unix_datagram_peek_from() {
589 let path1 = dir.path().join("sock");
591 let sock1 = or_panic!(UnixDatagram::bind(&path1));
592 let sock2 = or_panic!(UnixDatagram::unbound());
593 or_panic!(sock2.connect(&path1));
595 let msg = b"hello world";
596 or_panic!(sock2.send(msg));
598 let mut buf = [0; 11];
599 let (size, _) = or_panic!(sock1.peek_from(&mut buf));
600 assert_eq!(size, 11);
601 assert_eq!(msg, &buf[..]);
604 let mut buf = [0; 11];
605 let size = or_panic!(sock1.recv(&mut buf));
606 assert_eq!(size, 11);
607 assert_eq!(msg, &buf[..]);
610 #[cfg(any(target_os = "android", target_os = "linux"))]
612 fn test_send_vectored_fds_unix_stream() {
613 let (s1, s2) = or_panic!(UnixStream::pair());
616 let bufs_send = &[IoSlice::new(&buf1[..])][..];
618 let mut ancillary1_buffer = [0; 128];
619 let mut ancillary1 = SocketAncillary::new(&mut ancillary1_buffer[..]);
620 assert!(ancillary1.add_fds(&[s1.as_raw_fd()][..]));
622 let usize = or_panic!(s1.send_vectored_with_ancillary(&bufs_send, &mut ancillary1));
623 assert_eq!(usize, 8);
625 let mut buf2 = [0; 8];
626 let mut bufs_recv = &mut [IoSliceMut::new(&mut buf2[..])][..];
628 let mut ancillary2_buffer = [0; 128];
629 let mut ancillary2 = SocketAncillary::new(&mut ancillary2_buffer[..]);
631 let usize = or_panic!(s2.recv_vectored_with_ancillary(&mut bufs_recv, &mut ancillary2));
632 assert_eq!(usize, 8);
633 assert_eq!(buf1, buf2);
635 let mut ancillary_data_vec = Vec::from_iter(ancillary2.messages());
636 assert_eq!(ancillary_data_vec.len(), 1);
637 if let AncillaryData::ScmRights(scm_rights) = ancillary_data_vec.pop().unwrap().unwrap() {
638 let fd_vec = Vec::from_iter(scm_rights);
639 assert_eq!(fd_vec.len(), 1);
641 libc::close(fd_vec[0]);
644 unreachable!("must be ScmRights");
648 #[cfg(any(target_os = "android", target_os = "linux",))]
650 fn test_send_vectored_with_ancillary_to_unix_datagram() {
651 fn getpid() -> libc::pid_t {
652 unsafe { libc::getpid() }
655 fn getuid() -> libc::uid_t {
656 unsafe { libc::getuid() }
659 fn getgid() -> libc::gid_t {
660 unsafe { libc::getgid() }
664 let path1 = dir.path().join("sock1");
665 let path2 = dir.path().join("sock2");
667 let bsock1 = or_panic!(UnixDatagram::bind(&path1));
668 let bsock2 = or_panic!(UnixDatagram::bind(&path2));
670 or_panic!(bsock2.set_passcred(true));
673 let bufs_send = &[IoSlice::new(&buf1[..])][..];
675 let mut ancillary1_buffer = [0; 128];
676 let mut ancillary1 = SocketAncillary::new(&mut ancillary1_buffer[..]);
677 let mut cred1 = SocketCred::new();
678 cred1.set_pid(getpid());
679 cred1.set_uid(getuid());
680 cred1.set_gid(getgid());
681 assert!(ancillary1.add_creds(&[cred1.clone()][..]));
684 or_panic!(bsock1.send_vectored_with_ancillary_to(&bufs_send, &mut ancillary1, &path2));
685 assert_eq!(usize, 8);
687 let mut buf2 = [0; 8];
688 let mut bufs_recv = &mut [IoSliceMut::new(&mut buf2[..])][..];
690 let mut ancillary2_buffer = [0; 128];
691 let mut ancillary2 = SocketAncillary::new(&mut ancillary2_buffer[..]);
693 let (usize, truncated, _addr) =
694 or_panic!(bsock2.recv_vectored_with_ancillary_from(&mut bufs_recv, &mut ancillary2));
695 assert_eq!(ancillary2.truncated(), false);
696 assert_eq!(usize, 8);
697 assert_eq!(truncated, false);
698 assert_eq!(buf1, buf2);
700 let mut ancillary_data_vec = Vec::from_iter(ancillary2.messages());
701 assert_eq!(ancillary_data_vec.len(), 1);
702 if let AncillaryData::ScmCredentials(scm_credentials) =
703 ancillary_data_vec.pop().unwrap().unwrap()
705 let cred_vec = Vec::from_iter(scm_credentials);
706 assert_eq!(cred_vec.len(), 1);
707 assert_eq!(cred1.get_pid(), cred_vec[0].get_pid());
708 assert_eq!(cred1.get_uid(), cred_vec[0].get_uid());
709 assert_eq!(cred1.get_gid(), cred_vec[0].get_gid());
711 unreachable!("must be ScmCredentials");
715 #[cfg(any(target_os = "android", target_os = "linux"))]
717 fn test_send_vectored_with_ancillary_unix_datagram() {
719 let path1 = dir.path().join("sock1");
720 let path2 = dir.path().join("sock2");
722 let bsock1 = or_panic!(UnixDatagram::bind(&path1));
723 let bsock2 = or_panic!(UnixDatagram::bind(&path2));
726 let bufs_send = &[IoSlice::new(&buf1[..])][..];
728 let mut ancillary1_buffer = [0; 128];
729 let mut ancillary1 = SocketAncillary::new(&mut ancillary1_buffer[..]);
730 assert!(ancillary1.add_fds(&[bsock1.as_raw_fd()][..]));
732 or_panic!(bsock1.connect(&path2));
733 let usize = or_panic!(bsock1.send_vectored_with_ancillary(&bufs_send, &mut ancillary1));
734 assert_eq!(usize, 8);
736 let mut buf2 = [0; 8];
737 let mut bufs_recv = &mut [IoSliceMut::new(&mut buf2[..])][..];
739 let mut ancillary2_buffer = [0; 128];
740 let mut ancillary2 = SocketAncillary::new(&mut ancillary2_buffer[..]);
742 let (usize, truncated) =
743 or_panic!(bsock2.recv_vectored_with_ancillary(&mut bufs_recv, &mut ancillary2));
744 assert_eq!(usize, 8);
745 assert_eq!(truncated, false);
746 assert_eq!(buf1, buf2);
748 let mut ancillary_data_vec = Vec::from_iter(ancillary2.messages());
749 assert_eq!(ancillary_data_vec.len(), 1);
750 if let AncillaryData::ScmRights(scm_rights) = ancillary_data_vec.pop().unwrap().unwrap() {
751 let fd_vec = Vec::from_iter(scm_rights);
752 assert_eq!(fd_vec.len(), 1);
754 libc::close(fd_vec[0]);
757 unreachable!("must be ScmRights");