Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -r d61ee475bdf5 src/pkg/net/fd.go
- --- a/src/pkg/net/fd.go Thu Oct 07 16:10:48 2010 +0200
- +++ b/src/pkg/net/fd.go Fri Oct 08 00:13:47 2010 +0200
- @@ -12,6 +12,7 @@
- "sync"
- "syscall"
- "time"
- + "unsafe"
- )
- // Network file descriptor.
- @@ -401,6 +402,61 @@
- return
- }
- +func (fd *netFD) Recvmsg(p []byte, pancil []byte) (n int, nancil int, sa syscall.Sockaddr, err os.Error) {
- + if fd == nil || fd.sysfile == nil {
- + return 0, 0, nil, os.EINVAL
- + }
- + fd.rio.Lock()
- + defer fd.rio.Unlock()
- + fd.incref()
- + defer fd.decref()
- + if fd.rdeadline_delta > 0 {
- + fd.rdeadline = pollserver.Now() + fd.rdeadline_delta
- + } else {
- + fd.rdeadline = 0
- + }
- + var msghdr syscall.Msghdr
- + var rsa syscall.RawSockaddrAny
- + msghdr.Name = (*byte)(unsafe.Pointer(&rsa))
- + msghdr.Namelen = uint32(syscall.SizeofSockaddrAny)
- + var iov syscall.Iovec
- + // TODO test with zero-length or nil p
- + iov.Base = (*byte)(unsafe.Pointer(&p[0]))
- + iov.Len = uint64(len(p))
- + msghdr.Iov = &iov
- + msghdr.Iovlen = 1
- + if pancil != nil {
- + msghdr.Control = (*byte)(unsafe.Pointer(&p[0]))
- + msghdr.Controllen = uint64(len(pancil))
- + }
- + var oserr os.Error
- + var errno int
- + for {
- + n, errno = syscall.Recvmsg(fd.sysfd, &msghdr, 0)
- + if errno == syscall.EAGAIN && fd.rdeadline >= 0 {
- + pollserver.WaitRead(fd)
- + continue
- + }
- + if errno != 0 {
- + n = 0
- + nancil = 0
- + oserr = os.Errno(errno)
- + }
- + break
- + }
- + if oserr != nil {
- + err = &OpError{"read", fd.net, fd.laddr, oserr}
- + return
- + }
- + nancil = int(msghdr.Controllen)
- + sa, errno = syscall.AnyToSockaddr(&rsa)
- + if errno != 0 {
- + err = os.Errno(errno)
- + return
- + }
- + return
- +}
- +
- func (fd *netFD) Write(p []byte) (n int, err os.Error) {
- if fd == nil {
- return 0, os.EINVAL
- @@ -481,6 +537,24 @@
- return
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement