@@ -278,20 +278,31 @@ impl fmt::Display for Ipv4Addr {
278
278
#[ derive( Clone , Copy ) ]
279
279
pub struct Ipv6Addr ( pub libc:: in6_addr ) ;
280
280
281
+ macro_rules! to_u8_array {
282
+ ( $( $num: ident) ,* ) => {
283
+ if cfg!( target_endian = "big" ) {
284
+ [ $( ( $num>>8 ) as u8 , ( $num& 0xff ) as u8 , ) * ]
285
+ } else {
286
+ [ $( ( $num& 0xff ) as u8 , ( $num>>8 ) as u8 , ) * ]
287
+ }
288
+ }
289
+ }
290
+
291
+ macro_rules! to_u16_array {
292
+ ( $slf: ident, $( $first: expr, $second: expr) ,* ) => {
293
+ if cfg!( target_endian = "big" ) {
294
+ [ $( ( ( $slf. 0 . s6_addr[ $first] as u16 ) << 8 ) + $slf. 0 . s6_addr[ $second] as u16 , ) * ]
295
+ } else {
296
+ [ $( ( ( $slf. 0 . s6_addr[ $second] as u16 ) << 8 ) + $slf. 0 . s6_addr[ $first] as u16 , ) * ]
297
+ }
298
+ }
299
+ }
300
+
281
301
impl Ipv6Addr {
282
302
pub fn new ( a : u16 , b : u16 , c : u16 , d : u16 , e : u16 , f : u16 , g : u16 , h : u16 ) -> Ipv6Addr {
283
- Ipv6Addr ( libc:: in6_addr {
284
- s6_addr : [
285
- a. to_be ( ) ,
286
- b. to_be ( ) ,
287
- c. to_be ( ) ,
288
- d. to_be ( ) ,
289
- e. to_be ( ) ,
290
- f. to_be ( ) ,
291
- g. to_be ( ) ,
292
- h. to_be ( ) ,
293
- ]
294
- } )
303
+ let mut in6_addr_var: libc:: in6_addr = unsafe { mem:: uninitialized ( ) } ;
304
+ in6_addr_var. s6_addr = to_u8_array ! ( a, b, c, d, e, f, g, h) ;
305
+ Ipv6Addr ( in6_addr_var)
295
306
}
296
307
297
308
pub fn from_std ( std : & net:: Ipv6Addr ) -> Ipv6Addr {
@@ -301,14 +312,7 @@ impl Ipv6Addr {
301
312
302
313
/// Return the eight 16-bit segments that make up this address
303
314
pub fn segments ( & self ) -> [ u16 ; 8 ] {
304
- [ u16:: from_be ( self . 0 . s6_addr [ 0 ] ) ,
305
- u16:: from_be ( self . 0 . s6_addr [ 1 ] ) ,
306
- u16:: from_be ( self . 0 . s6_addr [ 2 ] ) ,
307
- u16:: from_be ( self . 0 . s6_addr [ 3 ] ) ,
308
- u16:: from_be ( self . 0 . s6_addr [ 4 ] ) ,
309
- u16:: from_be ( self . 0 . s6_addr [ 5 ] ) ,
310
- u16:: from_be ( self . 0 . s6_addr [ 6 ] ) ,
311
- u16:: from_be ( self . 0 . s6_addr [ 7 ] ) ]
315
+ to_u16_array ! ( self , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 )
312
316
}
313
317
314
318
pub fn to_std ( & self ) -> net:: Ipv6Addr {
0 commit comments