@@ -1446,33 +1446,38 @@ mod datalink {
1446
1446
}
1447
1447
1448
1448
/// Physical-layer address (MAC)
1449
- pub fn addr( & self ) -> [ u8 ; 6 ] {
1449
+ pub fn addr( & self ) -> Option < [ u8 ; 6 ] > {
1450
1450
let nlen = self . nlen( ) ;
1451
1451
let data = self . 0 . sdl_data;
1452
1452
1453
- assert!( !self . is_empty( ) ) ;
1454
-
1455
- [
1456
- data[ nlen] as u8 ,
1457
- data[ nlen + 1 ] as u8 ,
1458
- data[ nlen + 2 ] as u8 ,
1459
- data[ nlen + 3 ] as u8 ,
1460
- data[ nlen + 4 ] as u8 ,
1461
- data[ nlen + 5 ] as u8 ,
1462
- ]
1453
+ if self . is_empty( ) {
1454
+ None
1455
+ } else {
1456
+ Some ( [
1457
+ data[ nlen] as u8 ,
1458
+ data[ nlen + 1 ] as u8 ,
1459
+ data[ nlen + 2 ] as u8 ,
1460
+ data[ nlen + 3 ] as u8 ,
1461
+ data[ nlen + 4 ] as u8 ,
1462
+ data[ nlen + 5 ] as u8 ,
1463
+ ] )
1464
+ }
1463
1465
}
1464
1466
}
1465
1467
1466
1468
impl fmt:: Display for LinkAddr {
1467
1469
fn fmt( & self , f: & mut fmt:: Formatter ) -> fmt:: Result {
1468
- let addr = self . addr( ) ;
1469
- write!( f, "{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}" ,
1470
- addr[ 0 ] ,
1471
- addr[ 1 ] ,
1472
- addr[ 2 ] ,
1473
- addr[ 3 ] ,
1474
- addr[ 4 ] ,
1475
- addr[ 5 ] )
1470
+ if let Some ( addr) = self . addr( ) {
1471
+ write!( f, "{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}" ,
1472
+ addr[ 0 ] ,
1473
+ addr[ 1 ] ,
1474
+ addr[ 2 ] ,
1475
+ addr[ 3 ] ,
1476
+ addr[ 4 ] ,
1477
+ addr[ 5 ] )
1478
+ } else {
1479
+ Ok ( ( ) )
1480
+ }
1476
1481
}
1477
1482
}
1478
1483
}
@@ -1558,6 +1563,28 @@ mod tests {
1558
1563
target_os = "openbsd" ) ) ]
1559
1564
use super :: * ;
1560
1565
1566
+ /// Don't panic when trying to display an empty datalink address
1567
+ #[ cfg( any( target_os = "dragonfly" ,
1568
+ target_os = "freebsd" ,
1569
+ target_os = "ios" ,
1570
+ target_os = "macos" ,
1571
+ target_os = "netbsd" ,
1572
+ target_os = "openbsd" ) ) ]
1573
+ #[ test]
1574
+ fn test_datalink_display ( ) {
1575
+ let la = LinkAddr ( libc:: sockaddr_dl {
1576
+ sdl_len : 56 ,
1577
+ sdl_family : 18 ,
1578
+ sdl_index : 5 ,
1579
+ sdl_type : 24 ,
1580
+ sdl_nlen : 3 ,
1581
+ sdl_alen : 0 ,
1582
+ sdl_slen : 0 ,
1583
+ .. unsafe { mem:: zeroed ( ) }
1584
+ } ) ;
1585
+ format ! ( "{}" , la) ;
1586
+ }
1587
+
1561
1588
#[ cfg( any( target_os = "dragonfly" ,
1562
1589
target_os = "freebsd" ,
1563
1590
target_os = "ios" ,
@@ -1593,7 +1620,8 @@ mod tests {
1593
1620
1594
1621
match sock_addr {
1595
1622
SockAddr :: Link ( ether_addr) => {
1596
- assert_eq ! ( ether_addr. addr( ) , [ 24u8 , 101 , 144 , 221 , 76 , 176 ] ) ;
1623
+ assert_eq ! ( ether_addr. addr( ) ,
1624
+ Some ( [ 24u8 , 101 , 144 , 221 , 76 , 176 ] ) ) ;
1597
1625
} ,
1598
1626
_ => { unreachable ! ( ) }
1599
1627
} ;
@@ -1615,7 +1643,8 @@ mod tests {
1615
1643
1616
1644
match sock_addr {
1617
1645
SockAddr :: Link ( ether_addr) => {
1618
- assert_eq ! ( ether_addr. addr( ) , [ 24u8 , 101 , 144 , 221 , 76 , 176 ] ) ;
1646
+ assert_eq ! ( ether_addr. addr( ) ,
1647
+ Some ( [ 24u8 , 101 , 144 , 221 , 76 , 176 ] ) ) ;
1619
1648
} ,
1620
1649
_ => { unreachable ! ( ) }
1621
1650
} ;
0 commit comments