| |
| |
| |
|
|
| |
|
|
| package poll |
|
|
| import "syscall" |
|
|
| type SysFile struct { |
| |
| iovecs *[]syscall.Iovec |
| } |
|
|
| func (s *SysFile) init() {} |
|
|
| func (s *SysFile) destroy(fd int) error { |
| |
| |
| |
| |
| |
| return CloseFunc(fd) |
| } |
|
|
| |
| |
| func dupCloseOnExecOld(fd int) (int, string, error) { |
| syscall.ForkLock.RLock() |
| defer syscall.ForkLock.RUnlock() |
| newfd, err := syscall.Dup(fd) |
| if err != nil { |
| return -1, "dup", err |
| } |
| syscall.CloseOnExec(newfd) |
| return newfd, "", nil |
| } |
|
|
| |
| func (fd *FD) Fchdir() error { |
| if err := fd.incref(); err != nil { |
| return err |
| } |
| defer fd.decref() |
| return syscall.Fchdir(fd.Sysfd) |
| } |
|
|
| |
| |
| |
| func (fd *FD) ReadDirent(buf []byte) (int, error) { |
| if err := fd.incref(); err != nil { |
| return 0, err |
| } |
| defer fd.decref() |
| for { |
| n, err := ignoringEINTRIO(syscall.ReadDirent, fd.Sysfd, buf) |
| if err != nil { |
| n = 0 |
| if err == syscall.EAGAIN && fd.pd.pollable() { |
| if err = fd.pd.waitRead(fd.isFile); err == nil { |
| continue |
| } |
| } |
| } |
| |
| return n, err |
| } |
| } |
|
|
| |
| func (fd *FD) Seek(offset int64, whence int) (int64, error) { |
| if err := fd.incref(); err != nil { |
| return 0, err |
| } |
| defer fd.decref() |
| return syscall.Seek(fd.Sysfd, offset, whence) |
| } |
|
|