Skip to content

Commit 2497afe

Browse files
committed
ipv4: simplify init function for darwin
Change-Id: Id87fcbe2d827f5b3ee3b7387e1bbf64287a397bf Reviewed-on: https://go-review.googlesource.com/33811 Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matt Layher <mdlayher@gmail.com> Reviewed-by: Ian Lance Taylor <iant@golang.org>
1 parent 60c41d1 commit 2497afe

File tree

1 file changed

+29
-28
lines changed

1 file changed

+29
-28
lines changed

ipv4/sys_darwin.go

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ package ipv4
66

77
import (
88
"net"
9+
"strconv"
10+
"strings"
911
"syscall"
1012
"unsafe"
1113
)
@@ -36,41 +38,40 @@ var (
3638
func 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

7677
func (pi *inetPktinfo) setIfindex(i int) {

0 commit comments

Comments
 (0)