161 sa.raw.Len = SizeofSockaddrInet4 |
161 sa.raw.Len = SizeofSockaddrInet4 |
162 sa.raw.Family = AF_INET |
162 sa.raw.Family = AF_INET |
163 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) |
163 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) |
164 p[0] = byte(sa.Port >> 8) |
164 p[0] = byte(sa.Port >> 8) |
165 p[1] = byte(sa.Port) |
165 p[1] = byte(sa.Port) |
166 for i := 0; i < len(sa.Addr); i++ { |
166 sa.raw.Addr = sa.Addr |
167 sa.raw.Addr[i] = sa.Addr[i] |
|
168 } |
|
169 return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil |
167 return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil |
170 } |
168 } |
171 |
169 |
172 func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { |
170 func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { |
173 if sa.Port < 0 || sa.Port > 0xFFFF { |
171 if sa.Port < 0 || sa.Port > 0xFFFF { |
177 sa.raw.Family = AF_INET6 |
175 sa.raw.Family = AF_INET6 |
178 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) |
176 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) |
179 p[0] = byte(sa.Port >> 8) |
177 p[0] = byte(sa.Port >> 8) |
180 p[1] = byte(sa.Port) |
178 p[1] = byte(sa.Port) |
181 sa.raw.Scope_id = sa.ZoneId |
179 sa.raw.Scope_id = sa.ZoneId |
182 for i := 0; i < len(sa.Addr); i++ { |
180 sa.raw.Addr = sa.Addr |
183 sa.raw.Addr[i] = sa.Addr[i] |
|
184 } |
|
185 return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil |
181 return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil |
186 } |
182 } |
187 |
183 |
188 func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { |
184 func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { |
189 name := sa.Name |
185 name := sa.Name |
208 sa.raw.Index = sa.Index |
204 sa.raw.Index = sa.Index |
209 sa.raw.Type = sa.Type |
205 sa.raw.Type = sa.Type |
210 sa.raw.Nlen = sa.Nlen |
206 sa.raw.Nlen = sa.Nlen |
211 sa.raw.Alen = sa.Alen |
207 sa.raw.Alen = sa.Alen |
212 sa.raw.Slen = sa.Slen |
208 sa.raw.Slen = sa.Slen |
213 for i := 0; i < len(sa.raw.Data); i++ { |
209 sa.raw.Data = sa.Data |
214 sa.raw.Data[i] = sa.Data[i] |
|
215 } |
|
216 return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil |
210 return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil |
217 } |
211 } |
218 |
212 |
219 func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { |
213 func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { |
220 switch rsa.Addr.Family { |
214 switch rsa.Addr.Family { |
260 case AF_INET: |
252 case AF_INET: |
261 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) |
253 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) |
262 sa := new(SockaddrInet4) |
254 sa := new(SockaddrInet4) |
263 p := (*[2]byte)(unsafe.Pointer(&pp.Port)) |
255 p := (*[2]byte)(unsafe.Pointer(&pp.Port)) |
264 sa.Port = int(p[0])<<8 + int(p[1]) |
256 sa.Port = int(p[0])<<8 + int(p[1]) |
265 for i := 0; i < len(sa.Addr); i++ { |
257 sa.Addr = pp.Addr |
266 sa.Addr[i] = pp.Addr[i] |
|
267 } |
|
268 return sa, nil |
258 return sa, nil |
269 |
259 |
270 case AF_INET6: |
260 case AF_INET6: |
271 pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) |
261 pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) |
272 sa := new(SockaddrInet6) |
262 sa := new(SockaddrInet6) |
273 p := (*[2]byte)(unsafe.Pointer(&pp.Port)) |
263 p := (*[2]byte)(unsafe.Pointer(&pp.Port)) |
274 sa.Port = int(p[0])<<8 + int(p[1]) |
264 sa.Port = int(p[0])<<8 + int(p[1]) |
275 sa.ZoneId = pp.Scope_id |
265 sa.ZoneId = pp.Scope_id |
276 for i := 0; i < len(sa.Addr); i++ { |
266 sa.Addr = pp.Addr |
277 sa.Addr[i] = pp.Addr[i] |
|
278 } |
|
279 return sa, nil |
267 return sa, nil |
280 } |
268 } |
281 return anyToSockaddrGOOS(fd, rsa) |
269 return anyToSockaddrGOOS(fd, rsa) |
282 } |
270 } |
283 |
271 |
335 |
323 |
336 //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) |
324 //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) |
337 //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) |
325 //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) |
338 //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) |
326 //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) |
339 |
327 |
340 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { |
328 func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) { |
341 var msg Msghdr |
329 var msg Msghdr |
342 var rsa RawSockaddrAny |
330 msg.Name = (*byte)(unsafe.Pointer(rsa)) |
343 msg.Name = (*byte)(unsafe.Pointer(&rsa)) |
|
344 msg.Namelen = uint32(SizeofSockaddrAny) |
331 msg.Namelen = uint32(SizeofSockaddrAny) |
345 var iov Iovec |
|
346 if len(p) > 0 { |
|
347 iov.Base = (*byte)(unsafe.Pointer(&p[0])) |
|
348 iov.SetLen(len(p)) |
|
349 } |
|
350 var dummy byte |
332 var dummy byte |
351 if len(oob) > 0 { |
333 if len(oob) > 0 { |
352 // receive at least one normal byte |
334 // receive at least one normal byte |
353 if len(p) == 0 { |
335 if emptyIovecs(iov) { |
354 iov.Base = &dummy |
336 var iova [1]Iovec |
355 iov.SetLen(1) |
337 iova[0].Base = &dummy |
|
338 iova[0].SetLen(1) |
|
339 iov = iova[:] |
356 } |
340 } |
357 msg.Control = (*byte)(unsafe.Pointer(&oob[0])) |
341 msg.Control = (*byte)(unsafe.Pointer(&oob[0])) |
358 msg.SetControllen(len(oob)) |
342 msg.SetControllen(len(oob)) |
359 } |
343 } |
360 msg.Iov = &iov |
344 if len(iov) > 0 { |
361 msg.Iovlen = 1 |
345 msg.Iov = &iov[0] |
|
346 msg.SetIovlen(len(iov)) |
|
347 } |
362 if n, err = recvmsg(fd, &msg, flags); err != nil { |
348 if n, err = recvmsg(fd, &msg, flags); err != nil { |
363 return |
349 return |
364 } |
350 } |
365 oobn = int(msg.Controllen) |
351 oobn = int(msg.Controllen) |
366 recvflags = int(msg.Flags) |
352 recvflags = int(msg.Flags) |
367 // source address is only specified if the socket is unconnected |
|
368 if rsa.Addr.Family != AF_UNSPEC { |
|
369 from, err = anyToSockaddr(fd, &rsa) |
|
370 } |
|
371 return |
353 return |
372 } |
354 } |
373 |
355 |
374 //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) |
356 //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) |
375 |
357 |
376 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { |
358 func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) { |
377 _, err = SendmsgN(fd, p, oob, to, flags) |
|
378 return |
|
379 } |
|
380 |
|
381 func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { |
|
382 var ptr unsafe.Pointer |
|
383 var salen _Socklen |
|
384 if to != nil { |
|
385 ptr, salen, err = to.sockaddr() |
|
386 if err != nil { |
|
387 return 0, err |
|
388 } |
|
389 } |
|
390 var msg Msghdr |
359 var msg Msghdr |
391 msg.Name = (*byte)(unsafe.Pointer(ptr)) |
360 msg.Name = (*byte)(unsafe.Pointer(ptr)) |
392 msg.Namelen = uint32(salen) |
361 msg.Namelen = uint32(salen) |
393 var iov Iovec |
|
394 if len(p) > 0 { |
|
395 iov.Base = (*byte)(unsafe.Pointer(&p[0])) |
|
396 iov.SetLen(len(p)) |
|
397 } |
|
398 var dummy byte |
362 var dummy byte |
|
363 var empty bool |
399 if len(oob) > 0 { |
364 if len(oob) > 0 { |
400 // send at least one normal byte |
365 // send at least one normal byte |
401 if len(p) == 0 { |
366 empty = emptyIovecs(iov) |
402 iov.Base = &dummy |
367 if empty { |
403 iov.SetLen(1) |
368 var iova [1]Iovec |
|
369 iova[0].Base = &dummy |
|
370 iova[0].SetLen(1) |
|
371 iov = iova[:] |
404 } |
372 } |
405 msg.Control = (*byte)(unsafe.Pointer(&oob[0])) |
373 msg.Control = (*byte)(unsafe.Pointer(&oob[0])) |
406 msg.SetControllen(len(oob)) |
374 msg.SetControllen(len(oob)) |
407 } |
375 } |
408 msg.Iov = &iov |
376 if len(iov) > 0 { |
409 msg.Iovlen = 1 |
377 msg.Iov = &iov[0] |
|
378 msg.SetIovlen(len(iov)) |
|
379 } |
410 if n, err = sendmsg(fd, &msg, flags); err != nil { |
380 if n, err = sendmsg(fd, &msg, flags); err != nil { |
411 return 0, err |
381 return 0, err |
412 } |
382 } |
413 if len(oob) > 0 && len(p) == 0 { |
383 if len(oob) > 0 && empty { |
414 n = 0 |
384 n = 0 |
415 } |
385 } |
416 return n, nil |
386 return n, nil |
417 } |
387 } |
418 |
388 |