1- use ferment:: { boxed, from_primitive_group, FFIConversionFrom , FFIConversionTo } ;
1+ use std:: net:: { Ipv4Addr , Ipv6Addr } ;
2+ use ferment:: { boxed, FFIConversionDestroy , FFIConversionFrom , FFIConversionTo } ;
23use crate :: fermented:: generics:: { Arr_u8_16 , Arr_u8_4 } ;
34
45#[ allow( non_camel_case_types) ]
@@ -8,61 +9,49 @@ pub enum SocketAddr {
89 V4 { ip : * mut Arr_u8_4 , port : u16 } ,
910 V6 { ip : * mut Arr_u8_16 , port : u16 , flowinfo : u32 , scope_id : u32 } ,
1011}
11- impl FFIConversionFrom < std:: net:: Ipv4Addr > for Arr_u8_4 {
12- unsafe fn ffi_from_const ( ffi : * const Self ) -> std:: net:: Ipv4Addr {
13- let octets: [ u8 ; 4 ] = FFIConversionFrom :: ffi_from_const ( ffi) ;
14- std:: net:: Ipv4Addr :: from ( octets)
15- }
16- }
17- impl FFIConversionTo < std:: net:: Ipv4Addr > for Arr_u8_4 {
18- unsafe fn ffi_to_const ( obj : std:: net:: Ipv4Addr ) -> * const Self {
19- FFIConversionTo :: ffi_to_const ( obj. octets ( ) )
20- }
21- }
22- impl FFIConversionFrom < std:: net:: Ipv6Addr > for Arr_u8_16 {
23- unsafe fn ffi_from_const ( ffi : * const Self ) -> std:: net:: Ipv6Addr {
24- let octets: [ u8 ; 16 ] = FFIConversionFrom :: ffi_from_const ( ffi) ;
25- std:: net:: Ipv6Addr :: from ( octets)
26- }
27- }
28- impl FFIConversionTo < std:: net:: Ipv6Addr > for Arr_u8_16 {
29- unsafe fn ffi_to_const ( obj : std:: net:: Ipv6Addr ) -> * const Self {
30- FFIConversionTo :: ffi_to_const ( obj. octets ( ) )
31- }
32- }
3312
3413impl FFIConversionFrom < std:: net:: SocketAddr > for SocketAddr {
3514 unsafe fn ffi_from_const ( ffi : * const Self ) -> std:: net:: SocketAddr {
3615 let ffi = & * ffi;
3716 match ffi {
38- Self :: V4 { ip, port } =>
39- std:: net:: SocketAddr :: V4 ( std:: net:: SocketAddrV4 :: new ( FFIConversionFrom :: ffi_from ( * ip) , * port) ) ,
40- Self :: V6 { ip, port, flowinfo, scope_id } =>
41- std:: net:: SocketAddr :: V6 ( std:: net:: SocketAddrV6 :: new ( FFIConversionFrom :: ffi_from ( * ip) , * port, * flowinfo, * scope_id) )
17+ Self :: V4 { ip, port } => {
18+ let octets = FFIConversionFrom :: < [ u8 ; 4 ] > :: ffi_from_const ( * ip) ;
19+ std:: net:: SocketAddr :: V4 ( std:: net:: SocketAddrV4 :: new ( Ipv4Addr :: from ( octets) , * port) )
20+ } ,
21+ Self :: V6 { ip, port, flowinfo, scope_id } => {
22+ let octets = FFIConversionFrom :: < [ u8 ; 16 ] > :: ffi_from_const ( * ip) ;
23+ std:: net:: SocketAddr :: V6 ( std:: net:: SocketAddrV6 :: new ( Ipv6Addr :: from ( octets) , * port, * flowinfo, * scope_id) )
24+ }
4225 }
4326 }
4427}
4528
4629impl FFIConversionTo < std:: net:: SocketAddr > for SocketAddr {
4730 unsafe fn ffi_to_const ( obj : std:: net:: SocketAddr ) -> * const Self {
4831 boxed ( match obj {
49- std:: net:: SocketAddr :: V4 ( addr) =>
50- Self :: V4 { ip : FFIConversionTo :: ffi_to ( addr. ip ( ) . octets ( ) ) , port : addr. port ( ) } ,
51- std:: net:: SocketAddr :: V6 ( addr) =>
52- Self :: V6 { ip : FFIConversionTo :: ffi_to ( addr. ip ( ) . octets ( ) ) , port : addr. port ( ) , flowinfo : addr. flowinfo ( ) , scope_id : addr. scope_id ( ) }
32+ std:: net:: SocketAddr :: V4 ( addr) => {
33+ let octets = addr. ip ( ) . octets ( ) ;
34+ Self :: V4 { ip : FFIConversionTo :: ffi_to ( octets) , port : addr. port ( ) }
35+ } ,
36+ std:: net:: SocketAddr :: V6 ( addr) => {
37+ let octets = addr. ip ( ) . octets ( ) ;
38+ Self :: V6 { ip : FFIConversionTo :: ffi_to ( octets) , port : addr. port ( ) , flowinfo : addr. flowinfo ( ) , scope_id : addr. scope_id ( ) }
39+ }
5340 } )
5441 }
5542}
5643
44+ impl FFIConversionDestroy < std:: net:: SocketAddr > for SocketAddr { }
45+
5746impl Drop for SocketAddr {
5847 fn drop ( & mut self ) {
5948 unsafe {
6049 match self {
6150 Self :: V4 { ip, port } => {
62- ferment:: unbox_any ( ip) ;
51+ ferment:: unbox_any ( * ip) ;
6352 }
6453 Self :: V6 { ip, port, flowinfo, scope_id } => {
65- ferment:: unbox_any ( ip) ;
54+ ferment:: unbox_any ( * ip) ;
6655 }
6756 }
6857 }
0 commit comments