1 #[cfg(any(doc, target_os = "android", target_os = "linux"))] 2 use super::{recv_vectored_with_ancillary_from, send_vectored_with_ancillary_to, SocketAncillary}; 3 use super::{sockaddr_un, SocketAddr}; 4 use crate::fmt; 5 use crate::io::{self, IoSlice, IoSliceMut}; 6 use crate::net::Shutdown; 7 use crate::os::unix::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd}; 8 #[cfg(any( 9 target_os = "android", 10 target_os = "linux", 11 target_os = "dragonfly", 12 target_os = "freebsd", 13 target_os = "ios", 14 target_os = "tvos", 15 target_os = "macos", 16 target_os = "watchos", 17 target_os = "netbsd", 18 target_os = "openbsd" 19 ))] 20 use crate::os::unix::ucred; 21 use crate::path::Path; 22 use crate::sys::cvt; 23 use crate::sys::net::Socket; 24 use crate::sys_common::{AsInner, FromInner}; 25 use crate::time::Duration; 26 27 #[unstable(feature = "peer_credentials_unix_socket", issue = "42839", reason = "unstable")] 28 #[cfg(any( 29 target_os = "android", 30 target_os = "linux", 31 target_os = "dragonfly", 32 target_os = "freebsd", 33 target_os = "ios", 34 target_os = "tvos", 35 target_os = "macos", 36 target_os = "watchos", 37 target_os = "netbsd", 38 target_os = "openbsd" 39 ))] 40 pub use ucred::UCred; 41 42 /// A Unix stream socket. 43 /// 44 /// # Examples 45 /// 46 /// ```no_run 47 /// use std::os::unix::net::UnixStream; 48 /// use std::io::prelude::*; 49 /// 50 /// fn main() -> std::io::Result<()> { 51 /// let mut stream = UnixStream::connect("/path/to/my/socket")?; 52 /// stream.write_all(b"hello world")?; 53 /// let mut response = String::new(); 54 /// stream.read_to_string(&mut response)?; 55 /// println!("{response}"); 56 /// Ok(()) 57 /// } 58 /// ``` 59 #[stable(feature = "unix_socket", since = "1.10.0")] 60 pub struct UnixStream(pub(super) Socket); 61 62 #[stable(feature = "unix_socket", since = "1.10.0")] 63 impl fmt::Debug for UnixStream { fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result64 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { 65 let mut builder = fmt.debug_struct("UnixStream"); 66 builder.field("fd", self.0.as_inner()); 67 if let Ok(addr) = self.local_addr() { 68 builder.field("local", &addr); 69 } 70 if let Ok(addr) = self.peer_addr() { 71 builder.field("peer", &addr); 72 } 73 builder.finish() 74 } 75 } 76 77 impl UnixStream { 78 /// Connects to the socket named by `path`. 79 /// 80 /// # Examples 81 /// 82 /// ```no_run 83 /// use std::os::unix::net::UnixStream; 84 /// 85 /// let socket = match UnixStream::connect("/tmp/sock") { 86 /// Ok(sock) => sock, 87 /// Err(e) => { 88 /// println!("Couldn't connect: {e:?}"); 89 /// return 90 /// } 91 /// }; 92 /// ``` 93 #[stable(feature = "unix_socket", since = "1.10.0")] connect<P: AsRef<Path>>(path: P) -> io::Result<UnixStream>94 pub fn connect<P: AsRef<Path>>(path: P) -> io::Result<UnixStream> { 95 unsafe { 96 let inner = Socket::new_raw(libc::AF_UNIX, libc::SOCK_STREAM)?; 97 let (addr, len) = sockaddr_un(path.as_ref())?; 98 99 cvt(libc::connect(inner.as_raw_fd(), &addr as *const _ as *const _, len))?; 100 Ok(UnixStream(inner)) 101 } 102 } 103 104 /// Connects to the socket specified by [`address`]. 105 /// 106 /// [`address`]: crate::os::unix::net::SocketAddr 107 /// 108 /// # Examples 109 /// 110 /// ```no_run 111 /// use std::os::unix::net::{UnixListener, UnixStream}; 112 /// 113 /// fn main() -> std::io::Result<()> { 114 /// let listener = UnixListener::bind("/path/to/the/socket")?; 115 /// let addr = listener.local_addr()?; 116 /// 117 /// let sock = match UnixStream::connect_addr(&addr) { 118 /// Ok(sock) => sock, 119 /// Err(e) => { 120 /// println!("Couldn't connect: {e:?}"); 121 /// return Err(e) 122 /// } 123 /// }; 124 /// Ok(()) 125 /// } 126 /// ```` 127 #[stable(feature = "unix_socket_abstract", since = "1.70.0")] connect_addr(socket_addr: &SocketAddr) -> io::Result<UnixStream>128 pub fn connect_addr(socket_addr: &SocketAddr) -> io::Result<UnixStream> { 129 unsafe { 130 let inner = Socket::new_raw(libc::AF_UNIX, libc::SOCK_STREAM)?; 131 cvt(libc::connect( 132 inner.as_raw_fd(), 133 &socket_addr.addr as *const _ as *const _, 134 socket_addr.len, 135 ))?; 136 Ok(UnixStream(inner)) 137 } 138 } 139 140 /// Creates an unnamed pair of connected sockets. 141 /// 142 /// Returns two `UnixStream`s which are connected to each other. 143 /// 144 /// # Examples 145 /// 146 /// ```no_run 147 /// use std::os::unix::net::UnixStream; 148 /// 149 /// let (sock1, sock2) = match UnixStream::pair() { 150 /// Ok((sock1, sock2)) => (sock1, sock2), 151 /// Err(e) => { 152 /// println!("Couldn't create a pair of sockets: {e:?}"); 153 /// return 154 /// } 155 /// }; 156 /// ``` 157 #[stable(feature = "unix_socket", since = "1.10.0")] pair() -> io::Result<(UnixStream, UnixStream)>158 pub fn pair() -> io::Result<(UnixStream, UnixStream)> { 159 let (i1, i2) = Socket::new_pair(libc::AF_UNIX, libc::SOCK_STREAM)?; 160 Ok((UnixStream(i1), UnixStream(i2))) 161 } 162 163 /// Creates a new independently owned handle to the underlying socket. 164 /// 165 /// The returned `UnixStream` is a reference to the same stream that this 166 /// object references. Both handles will read and write the same stream of 167 /// data, and options set on one stream will be propagated to the other 168 /// stream. 169 /// 170 /// # Examples 171 /// 172 /// ```no_run 173 /// use std::os::unix::net::UnixStream; 174 /// 175 /// fn main() -> std::io::Result<()> { 176 /// let socket = UnixStream::connect("/tmp/sock")?; 177 /// let sock_copy = socket.try_clone().expect("Couldn't clone socket"); 178 /// Ok(()) 179 /// } 180 /// ``` 181 #[stable(feature = "unix_socket", since = "1.10.0")] try_clone(&self) -> io::Result<UnixStream>182 pub fn try_clone(&self) -> io::Result<UnixStream> { 183 self.0.duplicate().map(UnixStream) 184 } 185 186 /// Returns the socket address of the local half of this connection. 187 /// 188 /// # Examples 189 /// 190 /// ```no_run 191 /// use std::os::unix::net::UnixStream; 192 /// 193 /// fn main() -> std::io::Result<()> { 194 /// let socket = UnixStream::connect("/tmp/sock")?; 195 /// let addr = socket.local_addr().expect("Couldn't get local address"); 196 /// Ok(()) 197 /// } 198 /// ``` 199 #[stable(feature = "unix_socket", since = "1.10.0")] local_addr(&self) -> io::Result<SocketAddr>200 pub fn local_addr(&self) -> io::Result<SocketAddr> { 201 SocketAddr::new(|addr, len| unsafe { libc::getsockname(self.as_raw_fd(), addr, len) }) 202 } 203 204 /// Returns the socket address of the remote half of this connection. 205 /// 206 /// # Examples 207 /// 208 /// ```no_run 209 /// use std::os::unix::net::UnixStream; 210 /// 211 /// fn main() -> std::io::Result<()> { 212 /// let socket = UnixStream::connect("/tmp/sock")?; 213 /// let addr = socket.peer_addr().expect("Couldn't get peer address"); 214 /// Ok(()) 215 /// } 216 /// ``` 217 #[stable(feature = "unix_socket", since = "1.10.0")] peer_addr(&self) -> io::Result<SocketAddr>218 pub fn peer_addr(&self) -> io::Result<SocketAddr> { 219 SocketAddr::new(|addr, len| unsafe { libc::getpeername(self.as_raw_fd(), addr, len) }) 220 } 221 222 /// Gets the peer credentials for this Unix domain socket. 223 /// 224 /// # Examples 225 /// 226 /// ```no_run 227 /// #![feature(peer_credentials_unix_socket)] 228 /// use std::os::unix::net::UnixStream; 229 /// 230 /// fn main() -> std::io::Result<()> { 231 /// let socket = UnixStream::connect("/tmp/sock")?; 232 /// let peer_cred = socket.peer_cred().expect("Couldn't get peer credentials"); 233 /// Ok(()) 234 /// } 235 /// ``` 236 #[unstable(feature = "peer_credentials_unix_socket", issue = "42839", reason = "unstable")] 237 #[cfg(any( 238 target_os = "android", 239 target_os = "linux", 240 target_os = "dragonfly", 241 target_os = "freebsd", 242 target_os = "ios", 243 target_os = "tvos", 244 target_os = "macos", 245 target_os = "watchos", 246 target_os = "netbsd", 247 target_os = "openbsd" 248 ))] peer_cred(&self) -> io::Result<UCred>249 pub fn peer_cred(&self) -> io::Result<UCred> { 250 ucred::peer_cred(self) 251 } 252 253 /// Sets the read timeout for the socket. 254 /// 255 /// If the provided value is [`None`], then [`read`] calls will block 256 /// indefinitely. An [`Err`] is returned if the zero [`Duration`] is passed to this 257 /// method. 258 /// 259 /// [`read`]: io::Read::read 260 /// 261 /// # Examples 262 /// 263 /// ```no_run 264 /// use std::os::unix::net::UnixStream; 265 /// use std::time::Duration; 266 /// 267 /// fn main() -> std::io::Result<()> { 268 /// let socket = UnixStream::connect("/tmp/sock")?; 269 /// socket.set_read_timeout(Some(Duration::new(1, 0))).expect("Couldn't set read timeout"); 270 /// Ok(()) 271 /// } 272 /// ``` 273 /// 274 /// An [`Err`] is returned if the zero [`Duration`] is passed to this 275 /// method: 276 /// 277 /// ```no_run 278 /// use std::io; 279 /// use std::os::unix::net::UnixStream; 280 /// use std::time::Duration; 281 /// 282 /// fn main() -> std::io::Result<()> { 283 /// let socket = UnixStream::connect("/tmp/sock")?; 284 /// let result = socket.set_read_timeout(Some(Duration::new(0, 0))); 285 /// let err = result.unwrap_err(); 286 /// assert_eq!(err.kind(), io::ErrorKind::InvalidInput); 287 /// Ok(()) 288 /// } 289 /// ``` 290 #[stable(feature = "unix_socket", since = "1.10.0")] set_read_timeout(&self, timeout: Option<Duration>) -> io::Result<()>291 pub fn set_read_timeout(&self, timeout: Option<Duration>) -> io::Result<()> { 292 self.0.set_timeout(timeout, libc::SO_RCVTIMEO) 293 } 294 295 /// Sets the write timeout for the socket. 296 /// 297 /// If the provided value is [`None`], then [`write`] calls will block 298 /// indefinitely. An [`Err`] is returned if the zero [`Duration`] is 299 /// passed to this method. 300 /// 301 /// [`read`]: io::Read::read 302 /// 303 /// # Examples 304 /// 305 /// ```no_run 306 /// use std::os::unix::net::UnixStream; 307 /// use std::time::Duration; 308 /// 309 /// fn main() -> std::io::Result<()> { 310 /// let socket = UnixStream::connect("/tmp/sock")?; 311 /// socket.set_write_timeout(Some(Duration::new(1, 0))) 312 /// .expect("Couldn't set write timeout"); 313 /// Ok(()) 314 /// } 315 /// ``` 316 /// 317 /// An [`Err`] is returned if the zero [`Duration`] is passed to this 318 /// method: 319 /// 320 /// ```no_run 321 /// use std::io; 322 /// use std::net::UdpSocket; 323 /// use std::time::Duration; 324 /// 325 /// fn main() -> std::io::Result<()> { 326 /// let socket = UdpSocket::bind("127.0.0.1:34254")?; 327 /// let result = socket.set_write_timeout(Some(Duration::new(0, 0))); 328 /// let err = result.unwrap_err(); 329 /// assert_eq!(err.kind(), io::ErrorKind::InvalidInput); 330 /// Ok(()) 331 /// } 332 /// ``` 333 #[stable(feature = "unix_socket", since = "1.10.0")] set_write_timeout(&self, timeout: Option<Duration>) -> io::Result<()>334 pub fn set_write_timeout(&self, timeout: Option<Duration>) -> io::Result<()> { 335 self.0.set_timeout(timeout, libc::SO_SNDTIMEO) 336 } 337 338 /// Returns the read timeout of this socket. 339 /// 340 /// # Examples 341 /// 342 /// ```no_run 343 /// use std::os::unix::net::UnixStream; 344 /// use std::time::Duration; 345 /// 346 /// fn main() -> std::io::Result<()> { 347 /// let socket = UnixStream::connect("/tmp/sock")?; 348 /// socket.set_read_timeout(Some(Duration::new(1, 0))).expect("Couldn't set read timeout"); 349 /// assert_eq!(socket.read_timeout()?, Some(Duration::new(1, 0))); 350 /// Ok(()) 351 /// } 352 /// ``` 353 #[stable(feature = "unix_socket", since = "1.10.0")] read_timeout(&self) -> io::Result<Option<Duration>>354 pub fn read_timeout(&self) -> io::Result<Option<Duration>> { 355 self.0.timeout(libc::SO_RCVTIMEO) 356 } 357 358 /// Returns the write timeout of this socket. 359 /// 360 /// # Examples 361 /// 362 /// ```no_run 363 /// use std::os::unix::net::UnixStream; 364 /// use std::time::Duration; 365 /// 366 /// fn main() -> std::io::Result<()> { 367 /// let socket = UnixStream::connect("/tmp/sock")?; 368 /// socket.set_write_timeout(Some(Duration::new(1, 0))) 369 /// .expect("Couldn't set write timeout"); 370 /// assert_eq!(socket.write_timeout()?, Some(Duration::new(1, 0))); 371 /// Ok(()) 372 /// } 373 /// ``` 374 #[stable(feature = "unix_socket", since = "1.10.0")] write_timeout(&self) -> io::Result<Option<Duration>>375 pub fn write_timeout(&self) -> io::Result<Option<Duration>> { 376 self.0.timeout(libc::SO_SNDTIMEO) 377 } 378 379 /// Moves the socket into or out of nonblocking mode. 380 /// 381 /// # Examples 382 /// 383 /// ```no_run 384 /// use std::os::unix::net::UnixStream; 385 /// 386 /// fn main() -> std::io::Result<()> { 387 /// let socket = UnixStream::connect("/tmp/sock")?; 388 /// socket.set_nonblocking(true).expect("Couldn't set nonblocking"); 389 /// Ok(()) 390 /// } 391 /// ``` 392 #[stable(feature = "unix_socket", since = "1.10.0")] set_nonblocking(&self, nonblocking: bool) -> io::Result<()>393 pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> { 394 self.0.set_nonblocking(nonblocking) 395 } 396 397 /// Moves the socket to pass unix credentials as control message in [`SocketAncillary`]. 398 /// 399 /// Set the socket option `SO_PASSCRED`. 400 /// 401 /// # Examples 402 /// 403 #[cfg_attr( 404 any( 405 target_os = "android", 406 target_os = "linux", 407 target_os = "netbsd", 408 target_os = "freebsd" 409 ), 410 doc = "```no_run" 411 )] 412 #[cfg_attr( 413 not(any( 414 target_os = "android", 415 target_os = "linux", 416 target_os = "netbsd", 417 target_os = "freebsd" 418 )), 419 doc = "```ignore" 420 )] 421 /// #![feature(unix_socket_ancillary_data)] 422 /// use std::os::unix::net::UnixStream; 423 /// 424 /// fn main() -> std::io::Result<()> { 425 /// let socket = UnixStream::connect("/tmp/sock")?; 426 /// socket.set_passcred(true).expect("Couldn't set passcred"); 427 /// Ok(()) 428 /// } 429 /// ``` 430 #[cfg(any( 431 doc, 432 target_os = "android", 433 target_os = "linux", 434 target_os = "netbsd", 435 target_os = "freebsd" 436 ))] 437 #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] set_passcred(&self, passcred: bool) -> io::Result<()>438 pub fn set_passcred(&self, passcred: bool) -> io::Result<()> { 439 self.0.set_passcred(passcred) 440 } 441 442 /// Get the current value of the socket for passing unix credentials in [`SocketAncillary`]. 443 /// This value can be change by [`set_passcred`]. 444 /// 445 /// Get the socket option `SO_PASSCRED`. 446 /// 447 /// [`set_passcred`]: UnixStream::set_passcred 448 #[cfg(any( 449 doc, 450 target_os = "android", 451 target_os = "linux", 452 target_os = "netbsd", 453 target_os = "freebsd" 454 ))] 455 #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] passcred(&self) -> io::Result<bool>456 pub fn passcred(&self) -> io::Result<bool> { 457 self.0.passcred() 458 } 459 460 /// Set the id of the socket for network filtering purpose 461 /// 462 #[cfg_attr( 463 any(target_os = "linux", target_os = "freebsd", target_os = "openbsd"), 464 doc = "```no_run" 465 )] 466 #[cfg_attr( 467 not(any(target_os = "linux", target_os = "freebsd", target_os = "openbsd")), 468 doc = "```ignore" 469 )] 470 /// #![feature(unix_set_mark)] 471 /// use std::os::unix::net::UnixStream; 472 /// 473 /// fn main() -> std::io::Result<()> { 474 /// let sock = UnixStream::connect("/tmp/sock")?; 475 /// sock.set_mark(32)?; 476 /// Ok(()) 477 /// } 478 /// ``` 479 #[cfg(any(doc, target_os = "linux", target_os = "freebsd", target_os = "openbsd",))] 480 #[unstable(feature = "unix_set_mark", issue = "96467")] set_mark(&self, mark: u32) -> io::Result<()>481 pub fn set_mark(&self, mark: u32) -> io::Result<()> { 482 self.0.set_mark(mark) 483 } 484 485 /// Returns the value of the `SO_ERROR` option. 486 /// 487 /// # Examples 488 /// 489 /// ```no_run 490 /// use std::os::unix::net::UnixStream; 491 /// 492 /// fn main() -> std::io::Result<()> { 493 /// let socket = UnixStream::connect("/tmp/sock")?; 494 /// if let Ok(Some(err)) = socket.take_error() { 495 /// println!("Got error: {err:?}"); 496 /// } 497 /// Ok(()) 498 /// } 499 /// ``` 500 /// 501 /// # Platform specific 502 /// On Redox this always returns `None`. 503 #[stable(feature = "unix_socket", since = "1.10.0")] take_error(&self) -> io::Result<Option<io::Error>>504 pub fn take_error(&self) -> io::Result<Option<io::Error>> { 505 self.0.take_error() 506 } 507 508 /// Shuts down the read, write, or both halves of this connection. 509 /// 510 /// This function will cause all pending and future I/O calls on the 511 /// specified portions to immediately return with an appropriate value 512 /// (see the documentation of [`Shutdown`]). 513 /// 514 /// # Examples 515 /// 516 /// ```no_run 517 /// use std::os::unix::net::UnixStream; 518 /// use std::net::Shutdown; 519 /// 520 /// fn main() -> std::io::Result<()> { 521 /// let socket = UnixStream::connect("/tmp/sock")?; 522 /// socket.shutdown(Shutdown::Both).expect("shutdown function failed"); 523 /// Ok(()) 524 /// } 525 /// ``` 526 #[stable(feature = "unix_socket", since = "1.10.0")] shutdown(&self, how: Shutdown) -> io::Result<()>527 pub fn shutdown(&self, how: Shutdown) -> io::Result<()> { 528 self.0.shutdown(how) 529 } 530 531 /// Receives data on the socket from the remote address to which it is 532 /// connected, without removing that data from the queue. On success, 533 /// returns the number of bytes peeked. 534 /// 535 /// Successive calls return the same data. This is accomplished by passing 536 /// `MSG_PEEK` as a flag to the underlying `recv` system call. 537 /// 538 /// # Examples 539 /// 540 /// ```no_run 541 /// #![feature(unix_socket_peek)] 542 /// 543 /// use std::os::unix::net::UnixStream; 544 /// 545 /// fn main() -> std::io::Result<()> { 546 /// let socket = UnixStream::connect("/tmp/sock")?; 547 /// let mut buf = [0; 10]; 548 /// let len = socket.peek(&mut buf).expect("peek failed"); 549 /// Ok(()) 550 /// } 551 /// ``` 552 #[unstable(feature = "unix_socket_peek", issue = "76923")] peek(&self, buf: &mut [u8]) -> io::Result<usize>553 pub fn peek(&self, buf: &mut [u8]) -> io::Result<usize> { 554 self.0.peek(buf) 555 } 556 557 /// Receives data and ancillary data from socket. 558 /// 559 /// On success, returns the number of bytes read. 560 /// 561 /// # Examples 562 /// 563 #[cfg_attr(any(target_os = "android", target_os = "linux"), doc = "```no_run")] 564 #[cfg_attr(not(any(target_os = "android", target_os = "linux")), doc = "```ignore")] 565 /// #![feature(unix_socket_ancillary_data)] 566 /// use std::os::unix::net::{UnixStream, SocketAncillary, AncillaryData}; 567 /// use std::io::IoSliceMut; 568 /// 569 /// fn main() -> std::io::Result<()> { 570 /// let socket = UnixStream::connect("/tmp/sock")?; 571 /// let mut buf1 = [1; 8]; 572 /// let mut buf2 = [2; 16]; 573 /// let mut buf3 = [3; 8]; 574 /// let mut bufs = &mut [ 575 /// IoSliceMut::new(&mut buf1), 576 /// IoSliceMut::new(&mut buf2), 577 /// IoSliceMut::new(&mut buf3), 578 /// ][..]; 579 /// let mut fds = [0; 8]; 580 /// let mut ancillary_buffer = [0; 128]; 581 /// let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); 582 /// let size = socket.recv_vectored_with_ancillary(bufs, &mut ancillary)?; 583 /// println!("received {size}"); 584 /// for ancillary_result in ancillary.messages() { 585 /// if let AncillaryData::ScmRights(scm_rights) = ancillary_result.unwrap() { 586 /// for fd in scm_rights { 587 /// println!("receive file descriptor: {fd}"); 588 /// } 589 /// } 590 /// } 591 /// Ok(()) 592 /// } 593 /// ``` 594 #[cfg(any(doc, target_os = "android", target_os = "linux"))] 595 #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] recv_vectored_with_ancillary( &self, bufs: &mut [IoSliceMut<'_>], ancillary: &mut SocketAncillary<'_>, ) -> io::Result<usize>596 pub fn recv_vectored_with_ancillary( 597 &self, 598 bufs: &mut [IoSliceMut<'_>], 599 ancillary: &mut SocketAncillary<'_>, 600 ) -> io::Result<usize> { 601 let (count, _, _) = recv_vectored_with_ancillary_from(&self.0, bufs, ancillary)?; 602 603 Ok(count) 604 } 605 606 /// Sends data and ancillary data on the socket. 607 /// 608 /// On success, returns the number of bytes written. 609 /// 610 /// # Examples 611 /// 612 #[cfg_attr(any(target_os = "android", target_os = "linux"), doc = "```no_run")] 613 #[cfg_attr(not(any(target_os = "android", target_os = "linux")), doc = "```ignore")] 614 /// #![feature(unix_socket_ancillary_data)] 615 /// use std::os::unix::net::{UnixStream, SocketAncillary}; 616 /// use std::io::IoSlice; 617 /// 618 /// fn main() -> std::io::Result<()> { 619 /// let socket = UnixStream::connect("/tmp/sock")?; 620 /// let buf1 = [1; 8]; 621 /// let buf2 = [2; 16]; 622 /// let buf3 = [3; 8]; 623 /// let bufs = &[ 624 /// IoSlice::new(&buf1), 625 /// IoSlice::new(&buf2), 626 /// IoSlice::new(&buf3), 627 /// ][..]; 628 /// let fds = [0, 1, 2]; 629 /// let mut ancillary_buffer = [0; 128]; 630 /// let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); 631 /// ancillary.add_fds(&fds[..]); 632 /// socket.send_vectored_with_ancillary(bufs, &mut ancillary) 633 /// .expect("send_vectored_with_ancillary function failed"); 634 /// Ok(()) 635 /// } 636 /// ``` 637 #[cfg(any(doc, target_os = "android", target_os = "linux"))] 638 #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] send_vectored_with_ancillary( &self, bufs: &[IoSlice<'_>], ancillary: &mut SocketAncillary<'_>, ) -> io::Result<usize>639 pub fn send_vectored_with_ancillary( 640 &self, 641 bufs: &[IoSlice<'_>], 642 ancillary: &mut SocketAncillary<'_>, 643 ) -> io::Result<usize> { 644 send_vectored_with_ancillary_to(&self.0, None, bufs, ancillary) 645 } 646 } 647 648 #[stable(feature = "unix_socket", since = "1.10.0")] 649 impl io::Read for UnixStream { read(&mut self, buf: &mut [u8]) -> io::Result<usize>650 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { 651 io::Read::read(&mut &*self, buf) 652 } 653 read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize>654 fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> { 655 io::Read::read_vectored(&mut &*self, bufs) 656 } 657 658 #[inline] is_read_vectored(&self) -> bool659 fn is_read_vectored(&self) -> bool { 660 io::Read::is_read_vectored(&&*self) 661 } 662 } 663 664 #[stable(feature = "unix_socket", since = "1.10.0")] 665 impl<'a> io::Read for &'a UnixStream { read(&mut self, buf: &mut [u8]) -> io::Result<usize>666 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { 667 self.0.read(buf) 668 } 669 read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize>670 fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> { 671 self.0.read_vectored(bufs) 672 } 673 674 #[inline] is_read_vectored(&self) -> bool675 fn is_read_vectored(&self) -> bool { 676 self.0.is_read_vectored() 677 } 678 } 679 680 #[stable(feature = "unix_socket", since = "1.10.0")] 681 impl io::Write for UnixStream { write(&mut self, buf: &[u8]) -> io::Result<usize>682 fn write(&mut self, buf: &[u8]) -> io::Result<usize> { 683 io::Write::write(&mut &*self, buf) 684 } 685 write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize>686 fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> { 687 io::Write::write_vectored(&mut &*self, bufs) 688 } 689 690 #[inline] is_write_vectored(&self) -> bool691 fn is_write_vectored(&self) -> bool { 692 io::Write::is_write_vectored(&&*self) 693 } 694 flush(&mut self) -> io::Result<()>695 fn flush(&mut self) -> io::Result<()> { 696 io::Write::flush(&mut &*self) 697 } 698 } 699 700 #[stable(feature = "unix_socket", since = "1.10.0")] 701 impl<'a> io::Write for &'a UnixStream { write(&mut self, buf: &[u8]) -> io::Result<usize>702 fn write(&mut self, buf: &[u8]) -> io::Result<usize> { 703 self.0.write(buf) 704 } 705 write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize>706 fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> { 707 self.0.write_vectored(bufs) 708 } 709 710 #[inline] is_write_vectored(&self) -> bool711 fn is_write_vectored(&self) -> bool { 712 self.0.is_write_vectored() 713 } 714 flush(&mut self) -> io::Result<()>715 fn flush(&mut self) -> io::Result<()> { 716 Ok(()) 717 } 718 } 719 720 #[stable(feature = "unix_socket", since = "1.10.0")] 721 impl AsRawFd for UnixStream { 722 #[inline] as_raw_fd(&self) -> RawFd723 fn as_raw_fd(&self) -> RawFd { 724 self.0.as_raw_fd() 725 } 726 } 727 728 #[stable(feature = "unix_socket", since = "1.10.0")] 729 impl FromRawFd for UnixStream { 730 #[inline] from_raw_fd(fd: RawFd) -> UnixStream731 unsafe fn from_raw_fd(fd: RawFd) -> UnixStream { 732 UnixStream(Socket::from_inner(FromInner::from_inner(OwnedFd::from_raw_fd(fd)))) 733 } 734 } 735 736 #[stable(feature = "unix_socket", since = "1.10.0")] 737 impl IntoRawFd for UnixStream { 738 #[inline] into_raw_fd(self) -> RawFd739 fn into_raw_fd(self) -> RawFd { 740 self.0.into_raw_fd() 741 } 742 } 743 744 #[stable(feature = "io_safety", since = "1.63.0")] 745 impl AsFd for UnixStream { 746 #[inline] as_fd(&self) -> BorrowedFd<'_>747 fn as_fd(&self) -> BorrowedFd<'_> { 748 self.0.as_fd() 749 } 750 } 751 752 #[stable(feature = "io_safety", since = "1.63.0")] 753 impl From<UnixStream> for OwnedFd { 754 #[inline] from(unix_stream: UnixStream) -> OwnedFd755 fn from(unix_stream: UnixStream) -> OwnedFd { 756 unsafe { OwnedFd::from_raw_fd(unix_stream.into_raw_fd()) } 757 } 758 } 759 760 #[stable(feature = "io_safety", since = "1.63.0")] 761 impl From<OwnedFd> for UnixStream { 762 #[inline] from(owned: OwnedFd) -> Self763 fn from(owned: OwnedFd) -> Self { 764 unsafe { Self::from_raw_fd(owned.into_raw_fd()) } 765 } 766 } 767