blob: 38515f20e3dc03cbd66ab8716ba35f37f258a122 [file] [log] [blame]
Mikio Hara306afc72012-11-13 16:18:37 +09001// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package net
6
7import (
8 "io"
9 "os"
10 "syscall"
11 "time"
12)
13
14// Network file descritor.
15type netFD struct {
16 proto, name, dir string
17 ctl, data *os.File
18 laddr, raddr Addr
19}
20
Mikio Hara306afc72012-11-13 16:18:37 +090021func sysInit() {
22}
23
Mikio Hara89b26762013-09-11 10:48:53 -040024func dial(net string, ra Addr, dialer func(time.Time) (Conn, error), deadline time.Time) (Conn, error) {
Alex Brainman810e4392013-01-11 12:42:09 +110025 // On plan9, use the relatively inefficient
26 // goroutine-racing implementation.
Mikio Hara89b26762013-09-11 10:48:53 -040027 return dialChannel(net, ra, dialer, deadline)
Alex Brainman810e4392013-01-11 12:42:09 +110028}
29
Akshat Kumar66b69a12013-02-19 17:11:17 -080030func newFD(proto, name string, ctl, data *os.File, laddr, raddr Addr) *netFD {
31 return &netFD{proto, name, "/net/" + proto + "/" + name, ctl, data, laddr, raddr}
Mikio Hara306afc72012-11-13 16:18:37 +090032}
33
34func (fd *netFD) ok() bool { return fd != nil && fd.ctl != nil }
35
36func (fd *netFD) Read(b []byte) (n int, err error) {
Akshat Kumar66b69a12013-02-19 17:11:17 -080037 if !fd.ok() || fd.data == nil {
Mikio Hara306afc72012-11-13 16:18:37 +090038 return 0, syscall.EINVAL
39 }
Mikio Hara306afc72012-11-13 16:18:37 +090040 n, err = fd.data.Read(b)
41 if fd.proto == "udp" && err == io.EOF {
42 n = 0
43 err = nil
44 }
45 return
46}
47
48func (fd *netFD) Write(b []byte) (n int, err error) {
Akshat Kumar66b69a12013-02-19 17:11:17 -080049 if !fd.ok() || fd.data == nil {
Mikio Hara306afc72012-11-13 16:18:37 +090050 return 0, syscall.EINVAL
51 }
Mikio Hara306afc72012-11-13 16:18:37 +090052 return fd.data.Write(b)
53}
54
55func (fd *netFD) CloseRead() error {
56 if !fd.ok() {
57 return syscall.EINVAL
58 }
59 return syscall.EPLAN9
60}
61
62func (fd *netFD) CloseWrite() error {
63 if !fd.ok() {
64 return syscall.EINVAL
65 }
66 return syscall.EPLAN9
67}
68
69func (fd *netFD) Close() error {
70 if !fd.ok() {
71 return syscall.EINVAL
72 }
73 err := fd.ctl.Close()
Mikio Hara306afc72012-11-13 16:18:37 +090074 if fd.data != nil {
Akshat Kumar66b69a12013-02-19 17:11:17 -080075 if err1 := fd.data.Close(); err1 != nil && err == nil {
76 err = err1
77 }
Mikio Hara306afc72012-11-13 16:18:37 +090078 }
79 fd.ctl = nil
80 fd.data = nil
81 return err
82}
83
Akshat Kumarb461fe62013-02-26 01:26:40 +010084// This method is only called via Conn.
Mikio Hara306afc72012-11-13 16:18:37 +090085func (fd *netFD) dup() (*os.File, error) {
Akshat Kumarb461fe62013-02-26 01:26:40 +010086 if !fd.ok() || fd.data == nil {
87 return nil, syscall.EINVAL
88 }
89 return fd.file(fd.data, fd.dir+"/data")
90}
91
92func (l *TCPListener) dup() (*os.File, error) {
93 if !l.fd.ok() {
94 return nil, syscall.EINVAL
95 }
96 return l.fd.file(l.fd.ctl, l.fd.dir+"/ctl")
97}
98
99func (fd *netFD) file(f *os.File, s string) (*os.File, error) {
100 syscall.ForkLock.RLock()
101 dfd, err := syscall.Dup(int(f.Fd()), -1)
102 syscall.ForkLock.RUnlock()
103 if err != nil {
104 return nil, &OpError{"dup", s, fd.laddr, err}
105 }
106 return os.NewFile(uintptr(dfd), s), nil
Mikio Hara306afc72012-11-13 16:18:37 +0900107}
108
Mikio Hara39a70172013-08-13 20:00:58 +0900109func (fd *netFD) setDeadline(t time.Time) error {
Mikio Hara306afc72012-11-13 16:18:37 +0900110 return syscall.EPLAN9
111}
112
Mikio Hara39a70172013-08-13 20:00:58 +0900113func (fd *netFD) setReadDeadline(t time.Time) error {
Mikio Hara306afc72012-11-13 16:18:37 +0900114 return syscall.EPLAN9
115}
116
Mikio Hara39a70172013-08-13 20:00:58 +0900117func (fd *netFD) setWriteDeadline(t time.Time) error {
Mikio Hara306afc72012-11-13 16:18:37 +0900118 return syscall.EPLAN9
119}
120
121func setReadBuffer(fd *netFD, bytes int) error {
122 return syscall.EPLAN9
123}
124
125func setWriteBuffer(fd *netFD, bytes int) error {
126 return syscall.EPLAN9
127}