@@ -80,14 +80,35 @@ unsafe fn sockaddr_un(path: &Path) -> io::Result<(libc::sockaddr_un, libc::sockl
80
80
// struct
81
81
82
82
let mut len = sun_path_offset ( ) + bytes. len ( ) ;
83
- match bytes. get ( 0 ) {
84
- Some ( & 0 ) | None => { }
85
- Some ( _) => len += 1 ,
83
+ // FIXME: is this branch necessary? do/should we allow creating unnamed
84
+ // addresses this way?
85
+ if bytes. len ( ) > 0 {
86
+ len += 1 // terminating null
86
87
}
87
88
Ok ( ( addr, len as libc:: socklen_t ) )
88
89
}
89
90
90
- enum AddressKind < ' a > {
91
+ #[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
92
+ pub ( crate ) unsafe fn sockaddr_un_abstract ( src_addr : & OsStr ) -> io:: Result < ( libc:: sockaddr_un , libc:: socklen_t ) > {
93
+ let mut dst_addr: libc:: sockaddr_un = mem:: zeroed ( ) ;
94
+ dst_addr. sun_family = libc:: AF_UNIX as libc:: sa_family_t ;
95
+
96
+ let dst_bytes = & mut dst_addr. sun_path [ 1 ..] ; // abstract paths start with a null byte
97
+ let src_bytes = src_addr. as_bytes ( ) ;
98
+
99
+ if src_bytes. len ( ) > dst_bytes. len ( ) {
100
+ return Err ( io:: Error :: new ( io:: ErrorKind :: InvalidInput ,
101
+ "address must be shorter than SUN_LEN-1" ) ) ;
102
+ }
103
+ for ( dst, src) in dst_bytes. iter_mut ( ) . zip ( src_bytes. iter ( ) ) {
104
+ * dst = * src as libc:: c_char ;
105
+ }
106
+
107
+ let len = sun_path_offset ( ) + src_bytes. len ( ) + 1 ;
108
+ Ok ( ( dst_addr, len as libc:: socklen_t ) )
109
+ }
110
+
111
+ pub ( crate ) enum AddressKind < ' a > {
91
112
Unnamed ,
92
113
Pathname ( & ' a Path ) ,
93
114
Abstract ( & ' a [ u8 ] ) ,
@@ -128,7 +149,7 @@ impl SocketAddr {
128
149
}
129
150
}
130
151
131
- fn from_parts ( addr : libc:: sockaddr_un , mut len : libc:: socklen_t ) -> io:: Result < SocketAddr > {
152
+ pub ( crate ) fn from_parts ( addr : libc:: sockaddr_un , mut len : libc:: socklen_t ) -> io:: Result < SocketAddr > {
132
153
if len == 0 {
133
154
// When there is a datagram from unnamed unix socket
134
155
// linux returns zero bytes of address
@@ -176,7 +197,7 @@ impl SocketAddr {
176
197
}
177
198
}
178
199
179
- /// Returns the contents of this address if it is a ` pathname` address.
200
+ /// Returns the contents of this address if it is a pathname address.
180
201
///
181
202
/// # Examples
182
203
///
@@ -209,7 +230,7 @@ impl SocketAddr {
209
230
}
210
231
}
211
232
212
- fn address < ' a > ( & ' a self ) -> AddressKind < ' a > {
233
+ pub ( crate ) fn address < ' a > ( & ' a self ) -> AddressKind < ' a > {
213
234
let len = self . len as usize - sun_path_offset ( ) ;
214
235
let path = unsafe { mem:: transmute :: < & [ libc:: c_char ] , & [ u8 ] > ( & self . addr . sun_path ) } ;
215
236
0 commit comments