|
5 | 5 | // Please see LICENSE files in the repository root for full details. |
6 | 6 |
|
7 | 7 | use std::{ |
8 | | - fs, |
| 8 | + fs::File, |
9 | 9 | net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, TcpListener, ToSocketAddrs}, |
10 | | - os::unix::{fs::PermissionsExt, net::UnixListener}, |
| 10 | + os::{ |
| 11 | + fd::OwnedFd, |
| 12 | + unix::{fs::PermissionsExt, net::UnixListener}, |
| 13 | + }, |
11 | 14 | time::Duration, |
12 | 15 | }; |
13 | 16 |
|
@@ -389,16 +392,24 @@ pub fn build_listeners( |
389 | 392 | HttpBindConfig::Unix { socket, mode } => { |
390 | 393 | let listener = UnixListener::bind(socket).context("could not bind socket")?; |
391 | 394 |
|
392 | | - if let Some(mode) = mode { |
393 | | - let mut permissions = fs::metadata(socket) |
394 | | - .context("could not read socket metadata")? |
395 | | - .permissions(); |
396 | | - let mode = u32::from_str_radix(mode, 8) |
397 | | - .with_context(|| format!("could not parse mode: {mode}"))?; |
398 | | - permissions.set_mode(mode); |
399 | | - fs::set_permissions(socket, permissions) |
400 | | - .context("could not set socket permissions")?; |
401 | | - } |
| 395 | + let listener = match mode { |
| 396 | + None => listener, |
| 397 | + Some(mode) => { |
| 398 | + let file = File::from(OwnedFd::from(listener)); |
| 399 | + |
| 400 | + let mut permissions = file |
| 401 | + .metadata() |
| 402 | + .context("could not read socket metadata")? |
| 403 | + .permissions(); |
| 404 | + let mode = u32::from_str_radix(mode, 8) |
| 405 | + .with_context(|| format!("could not parse mode: {mode}"))?; |
| 406 | + permissions.set_mode(mode); |
| 407 | + file.set_permissions(permissions) |
| 408 | + .context("could not set socket permissions")?; |
| 409 | + |
| 410 | + UnixListener::from(OwnedFd::from(file)) |
| 411 | + } |
| 412 | + }; |
402 | 413 |
|
403 | 414 | listener.try_into()? |
404 | 415 | } |
|
0 commit comments