func newPollServer() (s *pollServer, err error) { s = new(pollServer) if s.pr, s.pw, err = os.Pipe(); err != nil { return nil, err } if err = syscall.SetNonblock(int(s.pr.Fd()), true); err != nil { goto Errno } if err = syscall.SetNonblock(int(s.pw.Fd()), true); err != nil { goto Errno } if s.poll, err = newpollster(); err != nil { goto Error } if _, err = s.poll.AddFD(int(s.pr.Fd()), 'r', true); err != nil { s.poll.Close() goto Error } s.pending = make(map[int]*pollDesc) go s.Run() return s, nil Errno: err = &os.PathError{ Op: "setnonblock", Path: s.pr.Name(), Err: err, } Error: s.pr.Close() s.pw.Close() return nil, err }
func (sc *selectCtx) Init() error { sc.rset.Zero() sc.wset.Zero() sc.fdmax = -1 // Create and configure the pipe-ends. b := make([]int, 2) err := syscall.Pipe(b) if err != nil { return err } sc.pfdr, sc.pfdw = b[0], b[1] syscall.CloseOnExec(sc.pfdr) syscall.CloseOnExec(sc.pfdw) err = syscall.SetNonblock(sc.pfdr, true) if err != nil { syscall.Close(sc.pfdr) syscall.Close(sc.pfdw) return err } err = syscall.SetNonblock(sc.pfdw, true) if err != nil { syscall.Close(sc.pfdr) syscall.Close(sc.pfdw) return err } // pfdr (read-end of pipe) is set (and remains set forever) on // rset. sc.rset.Set(sc.pfdr) sc.fdmax = sc.pfdr // allocate dummy selectCtx.{b,b1} buffers. sc.b = make([]byte, 1) sc.b1 = make([]byte, 128) return nil }
func (t *pty) open(cols, rows int) error { var winp = new(C.struct_winsize) winp.ws_col = C.ushort(cols) winp.ws_row = C.ushort(rows) winp.ws_xpixel = 0 winp.ws_ypixel = 0 var master, slave C.int var name = make([]C.char, 40) if ret := int(C.GoOpenpty(&master, &slave, &name[0], winp)); ret == -1 { return errors.New("openpty(3) failed") } t.master = int(master) t.slave = int(slave) t.pty = C.GoString(&name[0]) if err := syscall.SetNonblock(t.master, true); err != nil { return err } if err := syscall.SetNonblock(t.slave, true); err != nil { return err } return nil }
func newPollServer() (s *pollServer, err os.Error) { s = new(pollServer) s.cr = make(chan *netFD, 1) s.cw = make(chan *netFD, 1) if s.pr, s.pw, err = os.Pipe(); err != nil { return nil, err } var e int if e = syscall.SetNonblock(s.pr.Fd(), true); e != 0 { goto Errno } if e = syscall.SetNonblock(s.pw.Fd(), true); e != 0 { goto Errno } if s.poll, err = newpollster(); err != nil { goto Error } if _, err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil { s.poll.Close() goto Error } s.pending = make(map[int]*netFD) go s.Run() return s, nil Errno: err = &os.PathError{"setnonblock", s.pr.Name(), os.Errno(e)} Error: s.pr.Close() s.pw.Close() return nil, err }
func (io *NetIOManager) ProxyNetAccept(serverinfo syscall.Sockaddr) (sa syscall.Sockaddr, err error) { var clientfd, serverfd int // accpet mongodb client connection request clientfd, clientinfo, err := syscall.Accept(io.proxy_server_fd) if err != nil { goto ClientError } err = syscall.SetNonblock(clientfd, true) if err != nil { goto ClientCleanup } err = syscall.EpollCtl(io.epoll_fd, syscall.EPOLL_CTL_ADD, clientfd, &syscall.EpollEvent{Events: syscall.EPOLLIN | syscall.EPOLLOUT | syscall.EPOLLRDHUP, Fd: int32(clientfd)}) if err != nil { goto ClientCleanup } // establish connection with mongodb server serverfd, err = syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, syscall.IPPROTO_TCP) if err != nil { goto ServerError } err = syscall.Connect(serverfd, serverinfo) if err != nil { goto ServerCleanup } err = syscall.SetNonblock(serverfd, true) if err != nil { goto ServerCleanup } err = syscall.EpollCtl(io.epoll_fd, syscall.EPOLL_CTL_ADD, serverfd, &syscall.EpollEvent{Events: syscall.EPOLLIN | syscall.EPOLLOUT | syscall.EPOLLRDHUP, Fd: int32(serverfd)}) if err != nil { goto ServerCleanup } // now proxy server becomes a bridge between client <-> server add_sock_peer(io, clientfd, clientinfo, serverfd, serverinfo) return clientinfo, nil ServerCleanup: syscall.Close(serverfd) ServerError: syscall.EpollCtl(io.epoll_fd, syscall.EPOLL_CTL_DEL, clientfd, &syscall.EpollEvent{Events: syscall.EPOLLIN | syscall.EPOLLOUT | syscall.EPOLLRDHUP, Fd: int32(clientfd)}) ClientCleanup: syscall.Close(clientfd) ClientError: return nil, err }
func (p *pin) BeginWatch(edge Edge, callback IRQEvent) error { p.SetMode(ModeInput) if err := write([]byte(edge), p.edgePath); err != nil { return err } var event syscall.EpollEvent event.Events = syscall.EPOLLIN | (syscall.EPOLLET & 0xffffffff) | syscall.EPOLLPRI fd := int(p.valueFile.Fd()) p.callback = callback watchEventCallbacks[fd] = p if err := syscall.SetNonblock(fd, true); err != nil { return err } event.Fd = int32(fd) if err := syscall.EpollCtl(epollFD, syscall.EPOLL_CTL_ADD, fd, &event); err != nil { return err } return nil }
func newPollServer() (s *pollServer, err os.Error) { s = new(pollServer) s.cr = make(chan *netFD, 1) s.cw = make(chan *netFD, 1) // s.pr and s.pw are indistinguishable. if s.pr, s.pw, err = selfConnectedTCPSocket(); err != nil { return nil, err } var e int if e = syscall.SetNonblock(s.pr.Fd(), true); e != 0 { Errno: err = &os.PathError{"setnonblock", s.pr.Name(), os.Errno(e)} Error: s.pr.Close() return nil, err } if s.poll, err = newpollster(); err != nil { goto Error } if _, err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil { s.poll.Close() goto Error } s.pending = make(map[int]*netFD) go s.Run() return s, nil }
// Wrapper around the accept system call that marks the returned file // descriptor as nonblocking and close-on-exec. func accept(fd int) (int, syscall.Sockaddr, error) { nfd, sa, err := syscall.Accept4(fd, syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC) // The accept4 system call was introduced in Linux 2.6.28. If // we get an ENOSYS error, fall back to using accept. if err == nil || err != syscall.ENOSYS { return nfd, sa, err } // See ../syscall/exec_unix.go for description of ForkLock. // It is okay to hold the lock across syscall.Accept // because we have put fd.sysfd into non-blocking mode. syscall.ForkLock.RLock() nfd, sa, err = syscall.Accept(fd) if err == nil { syscall.CloseOnExec(nfd) } syscall.ForkLock.RUnlock() if err != nil { return -1, nil, err } if err = syscall.SetNonblock(nfd, true); err != nil { syscall.Close(nfd) return -1, nil, err } return nfd, sa, nil }
// Open opens an asynchronous communications port. func Open(name string, options ...func(*Term) error) (*Term, error) { fd, e := syscall.Open(name, syscall.O_NOCTTY|syscall.O_CLOEXEC|syscall.O_NDELAY|syscall.O_RDWR, 0666) if e != nil { return nil, &os.PathError{"open", name, e} } modules := [2]string{"ptem", "ldterm"} for _, mod := range modules { err := unix.IoctlSetInt(fd, C.I_PUSH, int(uintptr(unsafe.Pointer(syscall.StringBytePtr(mod))))) if err != nil { return nil, err } } t := Term{name: name, fd: fd} termios.Tcgetattr(uintptr(t.fd), &t.orig) if err := termios.Tcgetattr(uintptr(t.fd), &t.orig); err != nil { return nil, err } if err := t.SetOption(options...); err != nil { return nil, err } return &t, syscall.SetNonblock(t.fd, false) }
// Remove a reference to this FD and close if we've been asked to do so (and // there are no references left. func (fd *netFD) decref() { fd.sysmu.Lock() fd.sysref-- // NOTE(rsc): On Unix we check fd.sysref == 0 here before closing, // but on Windows we have no way to wake up the blocked I/O other // than closing the socket (or calling Shutdown, which breaks other // programs that might have a reference to the socket). So there is // a small race here that we might close fd.sysfd and then some other // goroutine might start a read of fd.sysfd (having read it before we // write InvalidHandle to it), which might refer to some other file // if the specific handle value gets reused. I think handle values on // Windows are not reused as aggressively as file descriptors on Unix, // so this might be tolerable. if fd.closing && fd.sysfd != syscall.InvalidHandle { // In case the user has set linger, switch to blocking mode so // the close blocks. As long as this doesn't happen often, we // can handle the extra OS processes. Otherwise we'll need to // use the resultsrv for Close too. Sigh. syscall.SetNonblock(fd.sysfd, false) closesocket(fd.sysfd) fd.sysfd = syscall.InvalidHandle // no need for a finalizer anymore runtime.SetFinalizer(fd, nil) } fd.sysmu.Unlock() }
func newFD(sysfd int) (*FD, error) { // Set sysfd to non-blocking mode err := syscall.SetNonblock(sysfd, true) if err != nil { debugf("FD %03d: NF: SetNonBlock: %s", sysfd, err.Error()) return nil, err } // Check if sysfd is select-able // NOTE(npat): Is this useful? Can it ever fail? var rs fdSet var tv syscall.Timeval rs.Zero() rs.Set(sysfd) _, err = uxSelect(sysfd+1, &rs, nil, nil, &tv) if err != nil { debugf("FD %03d: NF: select(2): %s", sysfd, err.Error()) return nil, err } // Initialize FD. We don't generate arbitrary ids, instead we // use sysfd as the fdMap id. In effect, fd.id is alays == // fd.sysfd. Remember that sysfd's can be reused; we must be // carefull not to allow this to mess things up. fd := &FD{id: sysfd, sysfd: sysfd} fd.r.cond = sync.NewCond(&fd.r.mu) fd.w.cond = sync.NewCond(&fd.w.mu) // Add to fdMap fdM.AddFD(fd) debugf("FD %03d: NF: Ok", fd.id) return fd, nil }
// Wrapper around the socket system call that marks the returned file // descriptor as nonblocking and close-on-exec. func sysSocket(family, sotype, proto int) (int, error) { // 创建socket套接字 s, err := socketFunc(family, sotype|syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC, proto) // On Linux the SOCK_NONBLOCK and SOCK_CLOEXEC flags were // introduced in 2.6.27 kernel and on FreeBSD both flags were // introduced in 10 kernel. If we get an EINVAL error on Linux // or EPROTONOSUPPORT error on FreeBSD, fall back to using // socket without them. switch err { case nil: return s, nil default: return -1, os.NewSyscallError("socket", err) case syscall.EPROTONOSUPPORT, syscall.EINVAL: } // See ../syscall/exec_unix.go for description of ForkLock. syscall.ForkLock.RLock() s, err = socketFunc(family, sotype, proto) if err == nil { syscall.CloseOnExec(s) } syscall.ForkLock.RUnlock() if err != nil { return -1, os.NewSyscallError("socket", err) } if err = syscall.SetNonblock(s, true); err != nil { closeFunc(s) return -1, os.NewSyscallError("setnonblock", err) } return s, nil }
func newFD(sysfd int) (*FD, error) { // Set sysfd to non-blocking mode err := syscall.SetNonblock(sysfd, true) if err != nil { debugf("FD xxx: NF: sysfd=%d, err=%v", sysfd, err) return nil, err } // Initialize FD fd := &FD{sysfd: sysfd} fd.id = fdM.GetID() fd.r.cond = sync.NewCond(&fd.r.mu) fd.w.cond = sync.NewCond(&fd.w.mu) // Add to Epoll set. We may imediatelly start receiving events // after this. They will be dropped since the FD is not yet in // fdMap. It's ok. Nobody is waiting on this FD yet, anyway. ev := syscall.EpollEvent{ Events: syscall.EPOLLIN | syscall.EPOLLOUT | syscall.EPOLLRDHUP | (syscall.EPOLLET & 0xffffffff), Fd: int32(fd.id)} err = syscall.EpollCtl(epfd, syscall.EPOLL_CTL_ADD, fd.sysfd, &ev) if err != nil { debugf("FD %03d: NF: sysfd=%d, err=%v", fd.id, fd.sysfd, err) return nil, err } // Add to fdMap fdM.AddFD(fd) debugf("FD %03d: NF: sysfd=%d", fd.id, fd.sysfd) return fd, nil }
func (c *Connection) setBaudRate(rate uint32) error { // Create the term IO settings structure term := syscall.Termios{ Iflag: syscall.IGNPAR, Cflag: syscall.CS8 | syscall.CREAD | syscall.CLOCAL | rate, Cc: [32]uint8{syscall.VMIN: 0, syscall.VTIME: getVtime(connectionTimeout)}, Ispeed: rate, Ospeed: rate, } // Make the IOCTL system call to configure the term if _, _, errno := syscall.Syscall( syscall.SYS_IOCTL, uintptr(c.file.Fd()), uintptr(syscall.TCSETS), uintptr(unsafe.Pointer(&term)), ); errno != 0 { // TODO: include errno in this return errors.New("Encountered error doing IOCTL syscall") } if err := syscall.SetNonblock(int(c.file.Fd()), false); err != nil { return err } return nil }
func newFakeVTYServer() (*fakeVTYServer, error) { fds, err := syscall.Socketpair(syscall.AF_UNIX, syscall.SOCK_STREAM, 0) if err != nil { return nil, err } vtyClientFile := os.NewFile(uintptr(fds[1]), "vty-client") vtyClientConn, err := net.FileConn(vtyClientFile) if err != nil { return nil, err } vtyServerFile := os.NewFile(uintptr(fds[0]), "vty-server") vtyServerConn, err := net.FileConn(vtyServerFile) if err != nil { return nil, err } syscall.SetNonblock(fds[0], false) vs := &fakeVTYServer{ clientConn: vtyClientConn, serverConn: vtyServerConn, clientFile: vtyClientFile, serverFile: vtyServerFile, send: make(chan []byte), received: make(chan []byte), } go vs.read() go vs.write() return vs, nil }
func NonblockReadFile(filename string) { // open input file fi, err := os.Open(filename) if err != nil { panic(err) } // close fi on exit and check for its returned error defer func() { if err := fi.Close(); err != nil { panic(err) } }() syscall.SetNonblock(int(fi.Fd()), true) // make a read buffer r := bufio.NewReader(fi) for { // read a chunk line, _, err := r.ReadLine() fmt.Println(line) if err == io.EOF { // do something here fmt.Println("It is end of file") break } else if err != nil { panic(err) } } }
// Wrapper around the accept system call that marks the returned file // descriptor as nonblocking and close-on-exec. func accept(s int) (int, syscall.Sockaddr, error) { ns, sa, err := accept4Func(s, syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC) // On Linux the accept4 system call was introduced in 2.6.28 // kernel and on FreeBSD it was introduced in 10 kernel. If we // get an ENOSYS error on both Linux and FreeBSD, or EINVAL // error on Linux, fall back to using accept. switch err { default: // nil and errors other than the ones listed return ns, sa, err case syscall.ENOSYS: // syscall missing case syscall.EINVAL: // some Linux use this instead of ENOSYS case syscall.EACCES: // some Linux use this instead of ENOSYS case syscall.EFAULT: // some Linux use this instead of ENOSYS } // See ../syscall/exec_unix.go for description of ForkLock. // It is probably okay to hold the lock across syscall.Accept // because we have put fd.sysfd into non-blocking mode. // However, a call to the File method will put it back into // blocking mode. We can't take that risk, so no use of ForkLock here. ns, sa, err = acceptFunc(s) if err == nil { syscall.CloseOnExec(ns) } if err != nil { return -1, nil, err } if err = syscall.SetNonblock(ns, true); err != nil { closeFunc(ns) return -1, nil, err } return ns, sa, nil }
// Wrapper around the accept system call that marks the returned file // descriptor as nonblocking and close-on-exec. func accept(s int) (int, syscall.Sockaddr, error) { ns, sa, err := syscall.Accept4(s, syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC) // On Linux the accept4 system call was introduced in 2.6.28 // kernel and on FreeBSD it was introduced in 10 kernel. If we // get an ENOSYS error on both Linux and FreeBSD, or EINVAL // error on Linux, fall back to using accept. if err == nil || (err != syscall.ENOSYS && err != syscall.EINVAL) { return ns, sa, err } // See ../syscall/exec_unix.go for description of ForkLock. // It is probably okay to hold the lock across syscall.Accept // because we have put fd.sysfd into non-blocking mode. // However, a call to the File method will put it back into // blocking mode. We can't take that risk, so no use of ForkLock here. ns, sa, err = syscall.Accept(s) if err == nil { syscall.CloseOnExec(ns) } if err != nil { return -1, nil, err } if err = syscall.SetNonblock(ns, true); err != nil { syscall.Close(ns) return -1, nil, err } return ns, sa, nil }
func registerInterrupt(pin *digitalPin, handler func(embd.DigitalPin)) error { l := getEpollListenerInstance() pinFd := int(pin.val.Fd()) l.mu.Lock() defer l.mu.Unlock() if _, ok := l.interruptablePins[pinFd]; ok { return ErrorPinAlreadyRegistered } var event syscall.EpollEvent event.Events = syscall.EPOLLIN | (syscall.EPOLLET & 0xffffffff) | syscall.EPOLLPRI if err := syscall.SetNonblock(pinFd, true); err != nil { return err } event.Fd = int32(pinFd) if err := syscall.EpollCtl(l.fd, syscall.EPOLL_CTL_ADD, pinFd, &event); err != nil { return err } l.interruptablePins[pinFd] = &interrupt{pin: pin, handler: handler} return nil }
// Wrapper around the socket system call that marks the returned file // descriptor as nonblocking and close-on-exec. func sysSocket(f, t, p int) (int, error) { s, err := syscall.Socket(f, t|syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC, p) // The SOCK_NONBLOCK and SOCK_CLOEXEC flags were introduced in // Linux 2.6.27. If we get an EINVAL error, fall back to // using socket without them. if err == nil || err != syscall.EINVAL { return s, err } // See ../syscall/exec_unix.go for description of ForkLock. syscall.ForkLock.RLock() s, err = syscall.Socket(f, t, p) if err == nil { syscall.CloseOnExec(s) } syscall.ForkLock.RUnlock() if err != nil { return -1, err } if err = syscall.SetNonblock(s, true); err != nil { syscall.Close(s) return -1, err } return s, nil }
// Wrapper around the accept system call that marks the returned file // descriptor as nonblocking and close-on-exec. func accept(fd int) (int, syscall.Sockaddr, error) { nfd, sa, err := syscall.Accept4(fd, syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC) // The accept4 system call was introduced in Linux 2.6.28. If // we get an ENOSYS error, fall back to using accept. if err == nil || err != syscall.ENOSYS { return nfd, sa, err } // See ../syscall/exec_unix.go for description of ForkLock. // It is probably okay to hold the lock across syscall.Accept // because we have put fd.sysfd into non-blocking mode. // However, a call to the File method will put it back into // blocking mode. We can't take that risk, so no use of ForkLock here. nfd, sa, err = syscall.Accept(fd) if err == nil { syscall.CloseOnExec(nfd) } if err != nil { return -1, nil, err } if err = syscall.SetNonblock(nfd, true); err != nil { syscall.Close(nfd) return -1, nil, err } return nfd, sa, nil }
func NewGTKUI() *GTKUI { gtk.Init(nil) window := gtk.Window(gtk.GTK_WINDOW_TOPLEVEL) window.SetPosition(gtk.GTK_WIN_POS_CENTER) window.SetTitle("Pond") window.SetDefaultSize(1000, 800) ui := >KUI{ window: window, actions: make(chan interface{}, uiActionsQueueLen), events: make(chan interface{}, 8), } window.Connect("destroy", func(ctx *glib.CallbackContext) { close(ui.events) for { if _, ok := <-ui.actions; !ok { break } } gtk.MainQuit() }) if err := syscall.Pipe(ui.pipe[:]); err != nil { panic(err) } syscall.SetNonblock(ui.pipe[0], true) glib.FdWatchAdd(ui.pipe[0], glib.IOIn, func(conditions int) bool { ui.onAction() return true }) return ui }
func newFD(fd, family, proto int, net string, laddr, raddr Addr) (f *netFD, err os.Error) { once.Do(startServer) if e := syscall.SetNonblock(fd, true); e != 0 { return nil, &OpError{"setnonblock", net, laddr, os.Errno(e)} } f = &netFD{ sysfd: fd, family: family, proto: proto, net: net, laddr: laddr, raddr: raddr, } var ls, rs string if laddr != nil { ls = laddr.String() } if raddr != nil { rs = raddr.String() } f.sysfile = os.NewFile(fd, net+":"+ls+"->"+rs) f.cr = make(chan bool, 1) f.cw = make(chan bool, 1) return f, nil }
// NOTE: Taken from the Go source: src/net/sock_cloexec.go // Wrapper around the socket system call that marks the returned file // descriptor as nonblocking and close-on-exec. func sysSocket(family, sotype, proto int) (int, error) { s, err := syscall.Socket(family, sotype|syscall.SOCK_CLOEXEC, proto) // On Linux the SOCK_NONBLOCK and SOCK_CLOEXEC flags were // introduced in 2.6.27 kernel and on FreeBSD both flags were // introduced in 10 kernel. If we get an EINVAL error on Linux // or EPROTONOSUPPORT error on FreeBSD, fall back to using // socket without them. if err == nil || (err != syscall.EPROTONOSUPPORT && err != syscall.EINVAL) { return s, err } // See ../syscall/exec_unix.go for description of ForkLock. syscall.ForkLock.RLock() s, err = syscall.Socket(family, sotype, proto) if err == nil { syscall.CloseOnExec(s) } syscall.ForkLock.RUnlock() if err != nil { return -1, err } if err = syscall.SetNonblock(s, true); err != nil { syscall.Close(s) return -1, err } return s, nil }
func getch(nonblock bool) int { b := make([]byte, 1) syscall.SetNonblock(int(_in.Fd()), nonblock) _, err := _in.Read(b) if err != nil { return -1 } return int(b[0]) }
func newFD(fd int) (*fileFD, error) { if err := syscall.SetNonblock(fd, true); err != nil { return nil, err } ffd := &fileFD{ sysfd: fd, } return ffd, nil }
/*----------------------------------------------------------------------------- -- FUNCTION: newConnection -- -- DATE: February 6, 2016 -- -- REVISIONS: February 10, 2016 - modified for EPoll -- February 11, 2016 - fixed blocking issues -- February 12, 2016 - factored out hostString() -- -- -- DESIGNER: Marc Vouve -- -- PROGRAMMER: Marc Vouve -- -- INTERFACE: func newConnection(listenFd int) (connectionInfo, error) -- listenFd: the listener file descriptor with the new connection -- -- RETURNS: -- connectionInfo: A structor to store data over the life of the connection -- error: If an error occurs -- -- NOTES: this function sets the port into non blocking mode. ------------------------------------------------------------------------------*/ func newConnection(listenFd int) (connectionInfo, error) { newFileDescriptor, socketAddr, err := syscall.Accept(int(listenFd)) if err != nil { return connectionInfo{}, err } syscall.SetNonblock(newFileDescriptor, true) hostName := hostString(socketAddr) return connectionInfo{FileDescriptor: newFileDescriptor, HostName: hostName}, nil }
func openNonBlocking(fileName string) (*os.File, error) { file, err := os.OpenFile(fileName, os.O_RDONLY|syscall.O_NONBLOCK, 0600) if err != nil { return nil, err } if err = syscall.SetNonblock(int(file.Fd()), false); err != nil { return nil, err } return file, nil }
func setSockopts(fd int) error { err := syscall.SetNonblock(fd, true) if err != nil { return err } linger := syscall.Linger{Onoff: 1, Linger: 0} syscall.SetsockoptLinger(fd, syscall.SOL_SOCKET, syscall.SO_LINGER, &linger) return syscall.SetsockoptInt(fd, syscall.SOL_TCP, syscall.TCP_QUICKACK, 0) }
func dupSocket(f *os.File) (int, error) { s, err := dupCloseOnExec(int(f.Fd())) if err != nil { return -1, err } if err := syscall.SetNonblock(s, true); err != nil { closeFunc(s) return -1, os.NewSyscallError("setnonblock", err) } return s, nil }