update Go tree to use new syscall package.
R=r
DELTA=713 (109 added, 386 deleted, 218 changed)
OCL=29707
CL=29722
diff --git a/src/lib/net/fd.go b/src/lib/net/fd.go
index ddfed67..9404ed0 100644
--- a/src/lib/net/fd.go
+++ b/src/lib/net/fd.go
@@ -17,7 +17,7 @@
// Network file descriptor.
type netFD struct {
// immutable until Close
- fd int64;
+ fd int;
file *os.File;
cr chan *netFD;
cw chan *netFD;
@@ -37,28 +37,6 @@
ncr, ncw int;
}
-// Make reads and writes on fd return EAGAIN instead of blocking.
-func setNonblock(fd int64) os.Error {
- flags, e := syscall.Fcntl(fd, syscall.F_GETFL, 0);
- if e != 0 {
- return os.ErrnoToError(e)
- }
- flags, e = syscall.Fcntl(fd, syscall.F_SETFL, flags | syscall.O_NONBLOCK);
- if e != 0 {
- return os.ErrnoToError(e)
- }
- return nil
-}
-
-// Make reads/writes blocking; last gasp, so no error checking.
-func setBlock(fd int64) {
- flags, e := syscall.Fcntl(fd, syscall.F_GETFL, 0);
- if e != 0 {
- return;
- }
- syscall.Fcntl(fd, syscall.F_SETFL, flags & ^syscall.O_NONBLOCK);
-}
-
// A pollServer helps FDs determine when to retry a non-blocking
// read or write after they get EAGAIN. When an FD needs to wait,
// send the fd on s.cr (for a read) or s.cw (for a write) to pass the
@@ -91,7 +69,7 @@
type pollServer struct {
cr, cw chan *netFD; // buffered >= 1
pr, pw *os.File;
- pending map[int64] *netFD;
+ pending map[int] *netFD;
poll *pollster; // low-level OS hooks
deadline int64; // next deadline (nsec since 1970)
}
@@ -104,23 +82,26 @@
if s.pr, s.pw, err = os.Pipe(); err != nil {
return nil, err
}
- if err = setNonblock(s.pr.Fd()); err != nil {
+ var e int;
+ if e = syscall.SetNonblock(s.pr.Fd(), true); e != 0 {
+ Errno:
+ err = os.ErrnoToError(e);
Error:
s.pr.Close();
s.pw.Close();
- return nil, err
+ return nil, err;
}
- if err = setNonblock(s.pw.Fd()); err != nil {
- goto Error
+ if e = syscall.SetNonblock(s.pw.Fd(), true); e != 0 {
+ goto Errno;
}
if s.poll, err = newpollster(); err != nil {
- goto Error
+ goto Error;
}
if err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil {
s.poll.Close();
goto Error
}
- s.pending = make(map[int64] *netFD);
+ s.pending = make(map[int] *netFD);
go s.Run();
return s, nil
}
@@ -168,7 +149,7 @@
}
}
-func (s *pollServer) LookupFD(fd int64, mode int) *netFD {
+func (s *pollServer) LookupFD(fd int, mode int) *netFD {
key := fd << 1;
if mode == 'w' {
key++;
@@ -318,12 +299,12 @@
pollserver = p
}
-func newFD(fd int64, net, laddr, raddr string) (f *netFD, err os.Error) {
+func newFD(fd int, net, laddr, raddr string) (f *netFD, err os.Error) {
if pollserver == nil {
once.Do(_StartServer);
}
- if err = setNonblock(fd); err != nil {
- return nil, err
+ if e := syscall.SetNonblock(fd, true); e != 0 {
+ return nil, os.ErrnoToError(e);
}
f = new(netFD);
f.fd = fd;
@@ -347,7 +328,7 @@
// we can handle the extra OS processes.
// Otherwise we'll need to use the pollserver
// for Close too. Sigh.
- setBlock(fd.file.Fd());
+ syscall.SetNonblock(fd.file.Fd(), false);
e := fd.file.Close();
fd.file = nil;
@@ -406,9 +387,9 @@
return nn, err
}
-func sockaddrToHostPort(sa *syscall.Sockaddr) (hostport string, err os.Error)
+func sockaddrToString(sa syscall.Sockaddr) (name string, err os.Error)
-func (fd *netFD) Accept(sa *syscall.Sockaddr) (nfd *netFD, err os.Error) {
+func (fd *netFD) accept() (nfd *netFD, err os.Error) {
if fd == nil || fd.file == nil {
return nil, os.EINVAL
}
@@ -417,9 +398,10 @@
// It is okay to hold the lock across syscall.Accept
// because we have put fd.fd into non-blocking mode.
syscall.ForkLock.RLock();
- var s, e int64;
+ var s, e int;
+ var sa syscall.Sockaddr;
for {
- s, e = syscall.Accept(fd.fd, sa);
+ s, sa, e = syscall.Accept(fd.fd);
if e != syscall.EAGAIN {
break;
}
@@ -434,7 +416,7 @@
syscall.CloseOnExec(s);
syscall.ForkLock.RUnlock();
- raddr, err1 := sockaddrToHostPort(sa);
+ raddr, err1 := sockaddrToString(sa);
if err1 != nil {
raddr = "invalid-address";
}