@@ -6,6 +6,8 @@ package ipv4
66
77import (
88 "net"
9+ "strconv"
10+ "strings"
911 "syscall"
1012 "unsafe"
1113)
@@ -36,41 +38,40 @@ var (
3638func init () {
3739 // Seems like kern.osreldate is veiled on latest OS X. We use
3840 // kern.osrelease instead.
39- osver , err := syscall .Sysctl ("kern.osrelease" )
41+ s , err := syscall .Sysctl ("kern.osrelease" )
4042 if err != nil {
4143 return
4244 }
43- var i int
44- for i = range osver {
45- if osver [i ] == '.' {
46- break
47- }
45+ ss := strings .Split (s , "." )
46+ if len (ss ) == 0 {
47+ return
4848 }
4949 // The IP_PKTINFO and protocol-independent multicast API were
50- // introduced in OS X 10.7 (Darwin 11.0.0 ). But it looks like
51- // those features require OS X 10.8 (Darwin 12.0.0) and above.
50+ // introduced in OS X 10.7 (Darwin 11). But it looks like
51+ // those features require OS X 10.8 (Darwin 12) or above.
5252 // See http://support.apple.com/kb/HT1633.
53- if i > 2 || i == 2 && osver [0 ] >= '1' && osver [1 ] >= '2' {
54- ctlOpts [ctlPacketInfo ].name = sysIP_PKTINFO
55- ctlOpts [ctlPacketInfo ].length = sizeofInetPktinfo
56- ctlOpts [ctlPacketInfo ].marshal = marshalPacketInfo
57- ctlOpts [ctlPacketInfo ].parse = parsePacketInfo
58- sockOpts [ssoPacketInfo ].name = sysIP_RECVPKTINFO
59- sockOpts [ssoPacketInfo ].typ = ssoTypeInt
60- sockOpts [ssoMulticastInterface ].typ = ssoTypeIPMreqn
61- sockOpts [ssoJoinGroup ].name = sysMCAST_JOIN_GROUP
62- sockOpts [ssoJoinGroup ].typ = ssoTypeGroupReq
63- sockOpts [ssoLeaveGroup ].name = sysMCAST_LEAVE_GROUP
64- sockOpts [ssoLeaveGroup ].typ = ssoTypeGroupReq
65- sockOpts [ssoJoinSourceGroup ].name = sysMCAST_JOIN_SOURCE_GROUP
66- sockOpts [ssoJoinSourceGroup ].typ = ssoTypeGroupSourceReq
67- sockOpts [ssoLeaveSourceGroup ].name = sysMCAST_LEAVE_SOURCE_GROUP
68- sockOpts [ssoLeaveSourceGroup ].typ = ssoTypeGroupSourceReq
69- sockOpts [ssoBlockSourceGroup ].name = sysMCAST_BLOCK_SOURCE
70- sockOpts [ssoBlockSourceGroup ].typ = ssoTypeGroupSourceReq
71- sockOpts [ssoUnblockSourceGroup ].name = sysMCAST_UNBLOCK_SOURCE
72- sockOpts [ssoUnblockSourceGroup ].typ = ssoTypeGroupSourceReq
53+ if mjver , err := strconv .Atoi (ss [0 ]); err != nil || mjver < 12 {
54+ return
7355 }
56+ ctlOpts [ctlPacketInfo ].name = sysIP_PKTINFO
57+ ctlOpts [ctlPacketInfo ].length = sizeofInetPktinfo
58+ ctlOpts [ctlPacketInfo ].marshal = marshalPacketInfo
59+ ctlOpts [ctlPacketInfo ].parse = parsePacketInfo
60+ sockOpts [ssoPacketInfo ].name = sysIP_RECVPKTINFO
61+ sockOpts [ssoPacketInfo ].typ = ssoTypeInt
62+ sockOpts [ssoMulticastInterface ].typ = ssoTypeIPMreqn
63+ sockOpts [ssoJoinGroup ].name = sysMCAST_JOIN_GROUP
64+ sockOpts [ssoJoinGroup ].typ = ssoTypeGroupReq
65+ sockOpts [ssoLeaveGroup ].name = sysMCAST_LEAVE_GROUP
66+ sockOpts [ssoLeaveGroup ].typ = ssoTypeGroupReq
67+ sockOpts [ssoJoinSourceGroup ].name = sysMCAST_JOIN_SOURCE_GROUP
68+ sockOpts [ssoJoinSourceGroup ].typ = ssoTypeGroupSourceReq
69+ sockOpts [ssoLeaveSourceGroup ].name = sysMCAST_LEAVE_SOURCE_GROUP
70+ sockOpts [ssoLeaveSourceGroup ].typ = ssoTypeGroupSourceReq
71+ sockOpts [ssoBlockSourceGroup ].name = sysMCAST_BLOCK_SOURCE
72+ sockOpts [ssoBlockSourceGroup ].typ = ssoTypeGroupSourceReq
73+ sockOpts [ssoUnblockSourceGroup ].name = sysMCAST_UNBLOCK_SOURCE
74+ sockOpts [ssoUnblockSourceGroup ].typ = ssoTypeGroupSourceReq
7475}
7576
7677func (pi * inetPktinfo ) setIfindex (i int ) {
0 commit comments