@@ -80,14 +80,35 @@ unsafe fn sockaddr_un(path: &Path) -> io::Result<(libc::sockaddr_un, libc::sockl
8080 // struct
8181
8282 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
8687 }
8788 Ok ( ( addr, len as libc:: socklen_t ) )
8889}
8990
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 > {
91112 Unnamed ,
92113 Pathname ( & ' a Path ) ,
93114 Abstract ( & ' a [ u8 ] ) ,
@@ -128,7 +149,7 @@ impl SocketAddr {
128149 }
129150 }
130151
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 > {
132153 if len == 0 {
133154 // When there is a datagram from unnamed unix socket
134155 // linux returns zero bytes of address
@@ -176,7 +197,7 @@ impl SocketAddr {
176197 }
177198 }
178199
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.
180201 ///
181202 /// # Examples
182203 ///
@@ -209,7 +230,7 @@ impl SocketAddr {
209230 }
210231 }
211232
212- fn address < ' a > ( & ' a self ) -> AddressKind < ' a > {
233+ pub ( crate ) fn address < ' a > ( & ' a self ) -> AddressKind < ' a > {
213234 let len = self . len as usize - sun_path_offset ( ) ;
214235 let path = unsafe { mem:: transmute :: < & [ libc:: c_char ] , & [ u8 ] > ( & self . addr . sun_path ) } ;
215236
0 commit comments