OLD | NEW |
1 // Copyright 2009 The Go Authors. All rights reserved. | 1 // Copyright 2009 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 // Sockets | 5 // Sockets |
6 | 6 |
7 package net | 7 package net |
8 | 8 |
9 import ( | 9 import ( |
10 "os"; | 10 "os"; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 func setsockoptInt(fd, level, opt int, value int) os.Error { | 68 func setsockoptInt(fd, level, opt int, value int) os.Error { |
69 return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, level,
opt, value)) | 69 return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(fd, level,
opt, value)) |
70 } | 70 } |
71 | 71 |
72 func setsockoptNsec(fd, level, opt int, nsec int64) os.Error { | 72 func setsockoptNsec(fd, level, opt int, nsec int64) os.Error { |
73 var tv = syscall.NsecToTimeval(nsec); | 73 var tv = syscall.NsecToTimeval(nsec); |
74 return os.NewSyscallError("setsockopt", syscall.SetsockoptTimeval(fd, le
vel, opt, &tv)); | 74 return os.NewSyscallError("setsockopt", syscall.SetsockoptTimeval(fd, le
vel, opt, &tv)); |
75 } | 75 } |
76 | 76 |
77 func setReadBuffer(fd *netFD, bytes int) os.Error { | 77 func setReadBuffer(fd *netFD, bytes int) os.Error { |
78 » return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_RCVBUF, bytes
) | 78 » fd.incref(); |
| 79 » defer fd.decref(); |
| 80 » return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_RCVBUF, by
tes); |
79 } | 81 } |
80 | 82 |
81 func setWriteBuffer(fd *netFD, bytes int) os.Error { | 83 func setWriteBuffer(fd *netFD, bytes int) os.Error { |
82 » return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_SNDBUF, bytes
) | 84 » fd.incref(); |
| 85 » defer fd.decref(); |
| 86 » return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_SNDBUF, by
tes); |
83 } | 87 } |
84 | 88 |
85 func setReadTimeout(fd *netFD, nsec int64) os.Error { | 89 func setReadTimeout(fd *netFD, nsec int64) os.Error { |
86 fd.rdeadline_delta = nsec; | 90 fd.rdeadline_delta = nsec; |
87 return nil; | 91 return nil; |
88 } | 92 } |
89 | 93 |
90 func setWriteTimeout(fd *netFD, nsec int64) os.Error { | 94 func setWriteTimeout(fd *netFD, nsec int64) os.Error { |
91 fd.wdeadline_delta = nsec; | 95 fd.wdeadline_delta = nsec; |
92 return nil; | 96 return nil; |
93 } | 97 } |
94 | 98 |
95 func setTimeout(fd *netFD, nsec int64) os.Error { | 99 func setTimeout(fd *netFD, nsec int64) os.Error { |
96 if e := setReadTimeout(fd, nsec); e != nil { | 100 if e := setReadTimeout(fd, nsec); e != nil { |
97 return e | 101 return e |
98 } | 102 } |
99 return setWriteTimeout(fd, nsec); | 103 return setWriteTimeout(fd, nsec); |
100 } | 104 } |
101 | 105 |
102 func setReuseAddr(fd *netFD, reuse bool) os.Error { | 106 func setReuseAddr(fd *netFD, reuse bool) os.Error { |
103 » return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, bo
olint(reuse)) | 107 » fd.incref(); |
| 108 » defer fd.decref(); |
| 109 » return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR,
boolint(reuse)); |
104 } | 110 } |
105 | 111 |
106 func bindToDevice(fd *netFD, dev string) os.Error { | 112 func bindToDevice(fd *netFD, dev string) os.Error { |
107 // TODO(rsc): call setsockopt with null-terminated string pointer | 113 // TODO(rsc): call setsockopt with null-terminated string pointer |
108 return os.EINVAL | 114 return os.EINVAL |
109 } | 115 } |
110 | 116 |
111 func setDontRoute(fd *netFD, dontroute bool) os.Error { | 117 func setDontRoute(fd *netFD, dontroute bool) os.Error { |
112 » return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_DONTROUTE, bo
olint(dontroute)) | 118 » fd.incref(); |
| 119 » defer fd.decref(); |
| 120 » return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_DONTROUTE,
boolint(dontroute)); |
113 } | 121 } |
114 | 122 |
115 func setKeepAlive(fd *netFD, keepalive bool) os.Error { | 123 func setKeepAlive(fd *netFD, keepalive bool) os.Error { |
116 » return setsockoptInt(fd.fd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, bo
olint(keepalive)) | 124 » fd.incref(); |
| 125 » defer fd.decref(); |
| 126 » return setsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_KEEPALIVE,
boolint(keepalive)); |
117 } | 127 } |
118 | 128 |
119 func setLinger(fd *netFD, sec int) os.Error { | 129 func setLinger(fd *netFD, sec int) os.Error { |
120 var l syscall.Linger; | 130 var l syscall.Linger; |
121 if sec >= 0 { | 131 if sec >= 0 { |
122 l.Onoff = 1; | 132 l.Onoff = 1; |
123 l.Linger = int32(sec); | 133 l.Linger = int32(sec); |
124 } else { | 134 } else { |
125 l.Onoff = 0; | 135 l.Onoff = 0; |
126 l.Linger = 0; | 136 l.Linger = 0; |
127 } | 137 } |
128 » e := syscall.SetsockoptLinger(fd.fd, syscall.SOL_SOCKET, syscall.SO_LING
ER, &l); | 138 » fd.incref(); |
| 139 » defer fd.decref(); |
| 140 » e := syscall.SetsockoptLinger(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_L
INGER, &l); |
129 return os.NewSyscallError("setsockopt", e); | 141 return os.NewSyscallError("setsockopt", e); |
130 } | 142 } |
131 | 143 |
132 type UnknownSocketError struct { | 144 type UnknownSocketError struct { |
133 sa syscall.Sockaddr; | 145 sa syscall.Sockaddr; |
134 } | 146 } |
135 | 147 |
136 func (e *UnknownSocketError) String() string { | 148 func (e *UnknownSocketError) String() string { |
137 return "unknown socket address type " + reflect.Typeof(e.sa).String() | 149 return "unknown socket address type " + reflect.Typeof(e.sa).String() |
138 } | 150 } |
139 | 151 |
140 func sockaddrToString(sa syscall.Sockaddr) (name string, err os.Error) { | 152 func sockaddrToString(sa syscall.Sockaddr) (name string, err os.Error) { |
141 switch a := sa.(type) { | 153 switch a := sa.(type) { |
142 case *syscall.SockaddrInet4: | 154 case *syscall.SockaddrInet4: |
143 return joinHostPort(IP(&a.Addr).String(), itoa(a.Port)), nil | 155 return joinHostPort(IP(&a.Addr).String(), itoa(a.Port)), nil |
144 case *syscall.SockaddrInet6: | 156 case *syscall.SockaddrInet6: |
145 return joinHostPort(IP(&a.Addr).String(), itoa(a.Port)), nil | 157 return joinHostPort(IP(&a.Addr).String(), itoa(a.Port)), nil |
146 case *syscall.SockaddrUnix: | 158 case *syscall.SockaddrUnix: |
147 return a.Name, nil | 159 return a.Name, nil |
148 } | 160 } |
149 | 161 |
150 return "", &UnknownSocketError{sa}; | 162 return "", &UnknownSocketError{sa}; |
151 } | 163 } |
OLD | NEW |