Skip to content

Commit c0e1c72

Browse files
committed
Use fchmod for unix socket
This does not work!. See https://stackoverflow.com/a/15450698
1 parent 5676b41 commit c0e1c72

File tree

1 file changed

+23
-12
lines changed

1 file changed

+23
-12
lines changed

crates/cli/src/server.rs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
// Please see LICENSE files in the repository root for full details.
66

77
use std::{
8-
fs,
8+
fs::File,
99
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+
},
1114
time::Duration,
1215
};
1316

@@ -389,16 +392,24 @@ pub fn build_listeners(
389392
HttpBindConfig::Unix { socket, mode } => {
390393
let listener = UnixListener::bind(socket).context("could not bind socket")?;
391394

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+
};
402413

403414
listener.try_into()?
404415
}

0 commit comments

Comments
 (0)