Closed
Description
I tried this code:
use std::os::unix::net::UnixDatagram;
fn main() {
let socket = UnixDatagram::bind("/tmp/shadowsocks-manager.sock").unwrap();
let mut buf = [0u8; 65536];
loop {
let (n, src_addr) = socket.recv_from(&mut buf).unwrap();
println!("size={} src={:?}", n, src_addr);
}
}
Send request with a Python test script:
import socket
cli = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
cli.bind('/tmp/shadowsocks-manager-c.sock')
cli.connect('/tmp/shadowsocks-manager.sock')
cli.send(b'ping')
print(cli.recv(1506))
I expected to see this happen:
size=4 src="/tmp/shadowsocks-manager-c.sock" (pathname)
Instead, this happened:
size=4 src="/tmp/shadowsocks-manager-c.soc" (pathname)
Missing the last character.
Meta
rustc --version --verbose
:
rustc 1.42.0-nightly (859764425 2020-01-07)
binary: rustc
commit-hash: 85976442558bf2d09cec3aa49c9c9ba86fb15c1f
commit-date: 2020-01-07
host: x86_64-apple-darwin
release: 1.42.0-nightly
LLVM version: 9.0
Problem
On OS X, sockaddr_un
is defined as
/*
* [XSI] Definitions for UNIX IPC domain.
*/
struct sockaddr_un {
unsigned char sun_len; /* sockaddr len including null */
sa_family_t sun_family; /* [XSI] AF_UNIX */
char sun_path[104]; /* [XSI] path name (gag) */
};
which has one more byte sun_len
before sun_path
than Linux's definition:
#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family
/* Structure describing the address of an AF_LOCAL (aka AF_UNIX) socket. */
struct sockaddr_un
{
__SOCKADDR_COMMON (sun_);
char sun_path[108]; /* Path name. */
};
This issue also exists in Tokio (Mio), too. tokio-rs/tokio#2230