~vtuson/scopecreator/twitter-template

« back to all changes in this revision

Viewing changes to src/go/src/code.google.com/p/go.net/ipv4/sockopt_windows.go

  • Committer: Victor Palau
  • Date: 2015-03-11 14:24:42 UTC
  • Revision ID: vtuson@gmail.com-20150311142442-f2pxp111c8ynv232
public release

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2012 The Go Authors.  All rights reserved.
 
2
// Use of this source code is governed by a BSD-style
 
3
// license that can be found in the LICENSE file.
 
4
 
 
5
package ipv4
 
6
 
 
7
import (
 
8
        "net"
 
9
        "os"
 
10
        "syscall"
 
11
        "unsafe"
 
12
)
 
13
 
 
14
// Please refer to the online manual;
 
15
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms738586(v=vs.85).aspx
 
16
 
 
17
func ipv4TOS(fd syscall.Handle) (int, error) {
 
18
        var v int32
 
19
        l := int32(4)
 
20
        if err := syscall.Getsockopt(fd, ianaProtocolIP, sysSockoptTOS, (*byte)(unsafe.Pointer(&v)), &l); err != nil {
 
21
                return 0, os.NewSyscallError("getsockopt", err)
 
22
        }
 
23
        return int(v), nil
 
24
}
 
25
 
 
26
func setIPv4TOS(fd syscall.Handle, v int) error {
 
27
        vv := int32(v)
 
28
        return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, sysSockoptTOS, (*byte)(unsafe.Pointer(&vv)), 4))
 
29
}
 
30
 
 
31
func ipv4TTL(fd syscall.Handle) (int, error) {
 
32
        var v int32
 
33
        l := int32(4)
 
34
        if err := syscall.Getsockopt(fd, ianaProtocolIP, sysSockoptTTL, (*byte)(unsafe.Pointer(&v)), &l); err != nil {
 
35
                return 0, os.NewSyscallError("getsockopt", err)
 
36
        }
 
37
        return int(v), nil
 
38
}
 
39
 
 
40
func setIPv4TTL(fd syscall.Handle, v int) error {
 
41
        vv := int32(v)
 
42
        return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, sysSockoptTTL, (*byte)(unsafe.Pointer(&vv)), 4))
 
43
}
 
44
 
 
45
func ipv4MulticastTTL(fd syscall.Handle) (int, error) {
 
46
        var v int32
 
47
        l := int32(4)
 
48
        if err := syscall.Getsockopt(fd, ianaProtocolIP, sysSockoptMulticastTTL, (*byte)(unsafe.Pointer(&v)), &l); err != nil {
 
49
                return 0, os.NewSyscallError("getsockopt", err)
 
50
        }
 
51
        return int(v), nil
 
52
}
 
53
 
 
54
func setIPv4MulticastTTL(fd syscall.Handle, v int) error {
 
55
        vv := int32(v)
 
56
        return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, sysSockoptMulticastTTL, (*byte)(unsafe.Pointer(&vv)), 4))
 
57
}
 
58
 
 
59
func ipv4ReceiveTTL(fd syscall.Handle) (bool, error) {
 
60
        // NOTE: Not supported yet on any Windows
 
61
        return false, syscall.EWINDOWS
 
62
}
 
63
 
 
64
func setIPv4ReceiveTTL(fd syscall.Handle, v bool) error {
 
65
        // NOTE: Not supported yet on any Windows
 
66
        return syscall.EWINDOWS
 
67
}
 
68
 
 
69
func ipv4ReceiveDestinationAddress(fd syscall.Handle) (bool, error) {
 
70
        // TODO(mikio): Implement this for XP and beyond
 
71
        return false, syscall.EWINDOWS
 
72
}
 
73
 
 
74
func setIPv4ReceiveDestinationAddress(fd syscall.Handle, v bool) error {
 
75
        // TODO(mikio): Implement this for XP and beyond
 
76
        return syscall.EWINDOWS
 
77
}
 
78
 
 
79
func ipv4HeaderPrepend(fd syscall.Handle) (bool, error) {
 
80
        // TODO(mikio): Implement this for XP and beyond
 
81
        return false, syscall.EWINDOWS
 
82
}
 
83
 
 
84
func setIPv4HeaderPrepend(fd syscall.Handle, v bool) error {
 
85
        // TODO(mikio): Implement this for XP and beyond
 
86
        return syscall.EWINDOWS
 
87
}
 
88
 
 
89
func ipv4ReceiveInterface(fd syscall.Handle) (bool, error) {
 
90
        // TODO(mikio): Implement this for Vista and beyond
 
91
        return false, syscall.EWINDOWS
 
92
}
 
93
 
 
94
func setIPv4ReceiveInterface(fd syscall.Handle, v bool) error {
 
95
        // TODO(mikio): Implement this for Vista and beyond
 
96
        return syscall.EWINDOWS
 
97
}
 
98
 
 
99
func ipv4MulticastInterface(fd syscall.Handle) (*net.Interface, error) {
 
100
        var v [4]byte
 
101
        l := int32(4)
 
102
        if err := syscall.Getsockopt(fd, ianaProtocolIP, sysSockoptMulticastInterface, (*byte)(unsafe.Pointer(&v[0])), &l); err != nil {
 
103
                return nil, os.NewSyscallError("getsockopt", err)
 
104
        }
 
105
        return netIP4ToInterface(net.IPv4(v[0], v[1], v[2], v[3]))
 
106
}
 
107
 
 
108
func setIPv4MulticastInterface(fd syscall.Handle, ifi *net.Interface) error {
 
109
        ip, err := netInterfaceToIP4(ifi)
 
110
        if err != nil {
 
111
                return os.NewSyscallError("setsockopt", err)
 
112
        }
 
113
        var v [4]byte
 
114
        copy(v[:], ip.To4())
 
115
        return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, sysSockoptMulticastInterface, (*byte)(unsafe.Pointer(&v[0])), 4))
 
116
}
 
117
 
 
118
func ipv4MulticastLoopback(fd syscall.Handle) (bool, error) {
 
119
        var v int32
 
120
        l := int32(4)
 
121
        if err := syscall.Getsockopt(fd, ianaProtocolIP, sysSockoptMulticastLoopback, (*byte)(unsafe.Pointer(&v)), &l); err != nil {
 
122
                return false, os.NewSyscallError("getsockopt", err)
 
123
        }
 
124
        return v == 1, nil
 
125
}
 
126
 
 
127
func setIPv4MulticastLoopback(fd syscall.Handle, v bool) error {
 
128
        vv := int32(boolint(v))
 
129
        return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, sysSockoptMulticastLoopback, (*byte)(unsafe.Pointer(&vv)), 4))
 
130
}
 
131
 
 
132
func joinIPv4Group(fd syscall.Handle, ifi *net.Interface, grp net.IP) error {
 
133
        mreq := syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
 
134
        if err := setSysIPMreqInterface(&mreq, ifi); err != nil {
 
135
                return err
 
136
        }
 
137
        return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, sysSockoptJoinGroup, (*byte)(unsafe.Pointer(&mreq)), int32(unsafe.Sizeof(mreq))))
 
138
}
 
139
 
 
140
func leaveIPv4Group(fd syscall.Handle, ifi *net.Interface, grp net.IP) error {
 
141
        mreq := syscall.IPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}}
 
142
        if err := setSysIPMreqInterface(&mreq, ifi); err != nil {
 
143
                return err
 
144
        }
 
145
        return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, ianaProtocolIP, sysSockoptLeaveGroup, (*byte)(unsafe.Pointer(&mreq)), int32(unsafe.Sizeof(mreq))))
 
146
}