Advertisement
Guest User

Untitled

a guest
Oct 7th, 2010
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 1.79 KB | None | 0 0
  1. diff -r d61ee475bdf5 src/pkg/net/fd.go
  2. --- a/src/pkg/net/fd.go Thu Oct 07 16:10:48 2010 +0200
  3. +++ b/src/pkg/net/fd.go Fri Oct 08 00:13:47 2010 +0200
  4. @@ -12,6 +12,7 @@
  5.     "sync"
  6.     "syscall"
  7.     "time"
  8. +   "unsafe"
  9.  )
  10.  
  11.  // Network file descriptor.
  12. @@ -401,6 +402,61 @@
  13.     return
  14.  }
  15.  
  16. +func (fd *netFD) Recvmsg(p []byte, pancil []byte) (n int, nancil int, sa syscall.Sockaddr, err os.Error) {
  17. +   if fd == nil || fd.sysfile == nil {
  18. +       return 0, 0, nil, os.EINVAL
  19. +   }
  20. +   fd.rio.Lock()
  21. +   defer fd.rio.Unlock()
  22. +   fd.incref()
  23. +   defer fd.decref()
  24. +   if fd.rdeadline_delta > 0 {
  25. +       fd.rdeadline = pollserver.Now() + fd.rdeadline_delta
  26. +   } else {
  27. +       fd.rdeadline = 0
  28. +   }
  29. +   var msghdr syscall.Msghdr
  30. +   var rsa syscall.RawSockaddrAny
  31. +   msghdr.Name = (*byte)(unsafe.Pointer(&rsa))
  32. +   msghdr.Namelen = uint32(syscall.SizeofSockaddrAny)
  33. +   var iov syscall.Iovec
  34. +   // TODO test with zero-length or nil p
  35. +   iov.Base = (*byte)(unsafe.Pointer(&p[0]))
  36. +   iov.Len = uint64(len(p))
  37. +   msghdr.Iov = &iov
  38. +   msghdr.Iovlen = 1
  39. +   if pancil != nil {
  40. +       msghdr.Control = (*byte)(unsafe.Pointer(&p[0]))
  41. +       msghdr.Controllen = uint64(len(pancil))
  42. +   }
  43. +   var oserr os.Error
  44. +   var errno int
  45. +   for {
  46. +       n, errno = syscall.Recvmsg(fd.sysfd, &msghdr, 0)
  47. +       if errno == syscall.EAGAIN && fd.rdeadline >= 0 {
  48. +           pollserver.WaitRead(fd)
  49. +           continue
  50. +       }
  51. +       if errno != 0 {
  52. +           n = 0
  53. +           nancil = 0
  54. +           oserr = os.Errno(errno)
  55. +       }
  56. +       break
  57. +   }
  58. +   if oserr != nil {
  59. +       err = &OpError{"read", fd.net, fd.laddr, oserr}
  60. +       return
  61. +   }
  62. +   nancil = int(msghdr.Controllen)
  63. +   sa, errno = syscall.AnyToSockaddr(&rsa)
  64. +   if errno != 0 {
  65. +       err = os.Errno(errno)
  66. +       return
  67. +   }
  68. +   return
  69. +}
  70. +
  71.  func (fd *netFD) Write(p []byte) (n int, err os.Error) {
  72.     if fd == nil {
  73.         return 0, os.EINVAL
  74. @@ -481,6 +537,24 @@
  75.     return
  76.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement