Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 // Copyright 2012 The Go Authors. All rights reserved. | 1 // Copyright 2012 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 // +build darwin freebsd netbsd openbsd | 5 // +build darwin freebsd netbsd openbsd |
6 | 6 |
7 package ipv4 | 7 package ipv4 |
8 | 8 |
9 import ( | 9 import ( |
10 "net" | 10 "net" |
11 "os" | 11 "os" |
12 "syscall" | 12 "syscall" |
13 ) | 13 ) |
14 | 14 |
15 func ipv4MulticastTTL(f *os.File) (int, error) { | 15 func ipv4MulticastTTL(fd int) (int, error) { |
16 » v, err := syscall.GetsockoptByte(int(f.Fd()), syscall.IPPROTO_IP, syscal l.IP_MULTICAST_TTL) | 16 » v, err := syscall.GetsockoptByte(fd, syscall.IPPROTO_IP, syscall.IP_MULT ICAST_TTL) |
17 if err != nil { | 17 if err != nil { |
18 return 0, os.NewSyscallError("getsockopt", err) | 18 return 0, os.NewSyscallError("getsockopt", err) |
19 } | 19 } |
20 return int(v), nil | 20 return int(v), nil |
21 } | 21 } |
22 | 22 |
23 func setIPv4MulticastTTL(f *os.File, v int) error { | 23 func setIPv4MulticastTTL(fd int, v int) error { |
24 » err := syscall.SetsockoptByte(int(f.Fd()), syscall.IPPROTO_IP, syscall.I P_MULTICAST_TTL, byte(v)) | 24 » err := syscall.SetsockoptByte(fd, syscall.IPPROTO_IP, syscall.IP_MULTICA ST_TTL, byte(v)) |
25 if err != nil { | 25 if err != nil { |
26 return os.NewSyscallError("setsockopt", err) | 26 return os.NewSyscallError("setsockopt", err) |
27 } | 27 } |
28 return nil | 28 return nil |
29 } | 29 } |
30 | 30 |
31 func ipv4ReceiveDestinationAddress(f *os.File) (bool, error) { | 31 func ipv4ReceiveDestinationAddress(fd int) (bool, error) { |
32 » v, err := syscall.GetsockoptInt(int(f.Fd()), syscall.IPPROTO_IP, syscall .IP_RECVDSTADDR) | 32 » v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVD STADDR) |
33 if err != nil { | 33 if err != nil { |
34 return false, os.NewSyscallError("getsockopt", err) | 34 return false, os.NewSyscallError("getsockopt", err) |
35 } | 35 } |
36 return v == 1, nil | 36 return v == 1, nil |
37 } | 37 } |
38 | 38 |
39 func setIPv4ReceiveDestinationAddress(f *os.File, v bool) error { | 39 func setIPv4ReceiveDestinationAddress(fd int, v bool) error { |
40 » err := syscall.SetsockoptInt(int(f.Fd()), syscall.IPPROTO_IP, syscall.IP _RECVDSTADDR, boolint(v)) | 40 » err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVDSTA DDR, boolint(v)) |
41 if err != nil { | 41 if err != nil { |
42 return os.NewSyscallError("setsockopt", err) | 42 return os.NewSyscallError("setsockopt", err) |
43 } | 43 } |
44 return nil | 44 return nil |
45 } | 45 } |
46 | 46 |
47 func ipv4ReceiveInterface(f *os.File) (bool, error) { | 47 func ipv4ReceiveInterface(fd int) (bool, error) { |
48 » v, err := syscall.GetsockoptInt(int(f.Fd()), syscall.IPPROTO_IP, syscall .IP_RECVIF) | 48 » v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVI F) |
49 if err != nil { | 49 if err != nil { |
50 return false, os.NewSyscallError("getsockopt", err) | 50 return false, os.NewSyscallError("getsockopt", err) |
51 } | 51 } |
52 return v == 1, nil | 52 return v == 1, nil |
53 } | 53 } |
54 | 54 |
55 func setIPv4ReceiveInterface(f *os.File, v bool) error { | 55 func setIPv4ReceiveInterface(fd int, v bool) error { |
56 » err := syscall.SetsockoptInt(int(f.Fd()), syscall.IPPROTO_IP, syscall.IP _RECVIF, boolint(v)) | 56 » err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVIF, boolint(v)) |
57 if err != nil { | 57 if err != nil { |
58 return os.NewSyscallError("setsockopt", err) | 58 return os.NewSyscallError("setsockopt", err) |
59 } | 59 } |
60 return nil | 60 return nil |
61 } | 61 } |
62 | 62 |
63 func ipv4MulticastInterface(f *os.File) (*net.Interface, error) { | 63 func ipv4MulticastInterface(fd int) (*net.Interface, error) { |
64 » a, err := syscall.GetsockoptInet4Addr(int(f.Fd()), syscall.IPPROTO_IP, s yscall.IP_MULTICAST_IF) | 64 » a, err := syscall.GetsockoptInet4Addr(fd, syscall.IPPROTO_IP, syscall.IP _MULTICAST_IF) |
65 if err != nil { | 65 if err != nil { |
66 return nil, os.NewSyscallError("getsockopt", err) | 66 return nil, os.NewSyscallError("getsockopt", err) |
67 } | 67 } |
68 return netIP4ToInterface(net.IPv4(a[0], a[1], a[2], a[3])) | 68 return netIP4ToInterface(net.IPv4(a[0], a[1], a[2], a[3])) |
69 } | 69 } |
70 | 70 |
71 func setIPv4MulticastInterface(f *os.File, ifi *net.Interface) error { | 71 func setIPv4MulticastInterface(fd int, ifi *net.Interface) error { |
72 ip, err := netInterfaceToIP4(ifi) | 72 ip, err := netInterfaceToIP4(ifi) |
73 if err != nil { | 73 if err != nil { |
74 return os.NewSyscallError("setsockopt", err) | 74 return os.NewSyscallError("setsockopt", err) |
75 } | 75 } |
76 » var x [4]byte | 76 » var a [4]byte |
77 » copy(x[:], ip.To4()) | 77 » copy(a[:], ip.To4()) |
78 » err = syscall.SetsockoptInet4Addr(int(f.Fd()), syscall.IPPROTO_IP, sysca ll.IP_MULTICAST_IF, x) | 78 » err = syscall.SetsockoptInet4Addr(fd, syscall.IPPROTO_IP, syscall.IP_MUL TICAST_IF, a) |
79 if err != nil { | 79 if err != nil { |
80 return os.NewSyscallError("setsockopt", err) | 80 return os.NewSyscallError("setsockopt", err) |
81 } | 81 } |
82 return nil | 82 return nil |
83 } | 83 } |
dave_cheney.net
2012/09/03 11:04:47
Same as below.
| |
84 | 84 |
85 func ipv4MulticastLoopback(f *os.File) (bool, error) { | 85 func ipv4MulticastLoopback(fd int) (bool, error) { |
86 » v, err := syscall.GetsockoptByte(int(f.Fd()), syscall.IPPROTO_IP, syscal l.IP_MULTICAST_LOOP) | 86 » v, err := syscall.GetsockoptByte(fd, syscall.IPPROTO_IP, syscall.IP_MULT ICAST_LOOP) |
87 if err != nil { | 87 if err != nil { |
88 return false, os.NewSyscallError("getsockopt", err) | 88 return false, os.NewSyscallError("getsockopt", err) |
89 } | 89 } |
90 return v == 1, nil | 90 return v == 1, nil |
91 } | 91 } |
92 | 92 |
93 func setIPv4MulticastLoopback(f *os.File, v bool) error { | 93 func setIPv4MulticastLoopback(fd int, v bool) error { |
94 » err := syscall.SetsockoptByte(int(f.Fd()), syscall.IPPROTO_IP, syscall.I P_MULTICAST_LOOP, byte(boolint(v))) | 94 » err := syscall.SetsockoptByte(fd, syscall.IPPROTO_IP, syscall.IP_MULTICA ST_LOOP, byte(boolint(v))) |
95 if err != nil { | 95 if err != nil { |
96 return os.NewSyscallError("setsockopt", err) | 96 return os.NewSyscallError("setsockopt", err) |
97 } | 97 } |
98 return nil | 98 return nil |
dave_cheney.net
2012/09/03 11:04:47
A version of this function exists in http://codere
mikio
2012/09/05 03:50:56
My guess is that both fd.incref/decref are just fo
| |
99 } | 99 } |
100 | 100 |
101 func joinIPv4Group(f *os.File, ifi *net.Interface, grp net.IP) error { | 101 func joinIPv4Group(fd int, ifi *net.Interface, grp net.IP) error { |
102 mreq := &syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3 ]}} | 102 mreq := &syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3 ]}} |
103 if err := setSyscallIPMreq(mreq, ifi); err != nil { | 103 if err := setSyscallIPMreq(mreq, ifi); err != nil { |
104 return err | 104 return err |
105 } | 105 } |
106 » err := syscall.SetsockoptIPMreq(int(f.Fd()), syscall.IPPROTO_IP, syscall .IP_ADD_MEMBERSHIP, mreq) | 106 » err := syscall.SetsockoptIPMreq(fd, syscall.IPPROTO_IP, syscall.IP_ADD_M EMBERSHIP, mreq) |
107 if err != nil { | 107 if err != nil { |
108 return os.NewSyscallError("setsockopt", err) | 108 return os.NewSyscallError("setsockopt", err) |
109 } | 109 } |
110 return nil | 110 return nil |
111 } | 111 } |
112 | 112 |
113 func leaveIPv4Group(f *os.File, ifi *net.Interface, grp net.IP) error { | 113 func leaveIPv4Group(fd int, ifi *net.Interface, grp net.IP) error { |
114 mreq := &syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3 ]}} | 114 mreq := &syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3 ]}} |
115 if err := setSyscallIPMreq(mreq, ifi); err != nil { | 115 if err := setSyscallIPMreq(mreq, ifi); err != nil { |
116 return err | 116 return err |
117 } | 117 } |
118 » err := syscall.SetsockoptIPMreq(int(f.Fd()), syscall.IPPROTO_IP, syscall .IP_DROP_MEMBERSHIP, mreq) | 118 » err := syscall.SetsockoptIPMreq(fd, syscall.IPPROTO_IP, syscall.IP_DROP_ MEMBERSHIP, mreq) |
119 if err != nil { | 119 if err != nil { |
120 return os.NewSyscallError("setsockopt", err) | 120 return os.NewSyscallError("setsockopt", err) |
121 } | 121 } |
122 return nil | 122 return nil |
123 } | 123 } |
LEFT | RIGHT |