Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
go
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
go
Commits
5d377054
Commit
5d377054
authored
Nov 04, 2009
by
Robert Griesemer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gofmt-ify net
R=rsc
http://go/go-review/1017045
parent
7df45566
Changes
23
Show whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
569 additions
and
570 deletions
+569
-570
src/pkg/net/dialgoogle_test.go
src/pkg/net/dialgoogle_test.go
+8
-7
src/pkg/net/dnsclient.go
src/pkg/net/dnsclient.go
+23
-23
src/pkg/net/dnsconfig.go
src/pkg/net/dnsconfig.go
+16
-17
src/pkg/net/dnsmsg.go
src/pkg/net/dnsmsg.go
+146
-147
src/pkg/net/fd.go
src/pkg/net/fd.go
+61
-60
src/pkg/net/fd_darwin.go
src/pkg/net/fd_darwin.go
+19
-19
src/pkg/net/fd_linux.go
src/pkg/net/fd_linux.go
+10
-10
src/pkg/net/fd_nacl.go
src/pkg/net/fd_nacl.go
+2
-3
src/pkg/net/ip.go
src/pkg/net/ip.go
+85
-86
src/pkg/net/ip_test.go
src/pkg/net/ip_test.go
+12
-9
src/pkg/net/ipsock.go
src/pkg/net/ipsock.go
+10
-11
src/pkg/net/net.go
src/pkg/net/net.go
+8
-8
src/pkg/net/net_test.go
src/pkg/net/net_test.go
+5
-5
src/pkg/net/parse.go
src/pkg/net/parse.go
+24
-24
src/pkg/net/parse_test.go
src/pkg/net/parse_test.go
+3
-3
src/pkg/net/port.go
src/pkg/net/port.go
+6
-6
src/pkg/net/port_test.go
src/pkg/net/port_test.go
+32
-32
src/pkg/net/server_test.go
src/pkg/net/server_test.go
+8
-8
src/pkg/net/sock.go
src/pkg/net/sock.go
+12
-12
src/pkg/net/tcpsock.go
src/pkg/net/tcpsock.go
+24
-25
src/pkg/net/timeout_test.go
src/pkg/net/timeout_test.go
+2
-2
src/pkg/net/udpsock.go
src/pkg/net/udpsock.go
+22
-22
src/pkg/net/unixsock.go
src/pkg/net/unixsock.go
+31
-31
No files found.
src/pkg/net/dialgoogle_test.go
View file @
5d377054
...
...
@@ -26,7 +26,7 @@ func fetchGoogle(t *testing.T, fd Conn, network, addr string) {
if
n
<
1000
{
t
.
Errorf
(
"fetchGoogle: short HTTP read from %s %s - %v"
,
network
,
addr
,
err
);
return
return
;
}
}
...
...
@@ -34,13 +34,13 @@ func doDial(t *testing.T, network, addr string) {
fd
,
err
:=
Dial
(
network
,
""
,
addr
);
if
err
!=
nil
{
t
.
Errorf
(
"Dial(%q, %q, %q) = _, %v"
,
network
,
""
,
addr
,
err
);
return
return
;
}
fetchGoogle
(
t
,
fd
,
network
,
addr
);
fd
.
Close
()
fd
.
Close
()
;
}
var
googleaddrs
=
[]
string
{
var
googleaddrs
=
[]
string
{
"74.125.19.99:80"
,
"www.google.com:80"
,
"74.125.19.99:http"
,
...
...
@@ -52,18 +52,19 @@ var googleaddrs = []string {
"[0:0:0:0:000000:ffff:74.125.19.99]:80"
,
"[0:0:0:0:0:ffff::74.125.19.99]:80"
,
"[2001:4860:0:2001::68]:80"
// ipv6.google.com; removed if ipv6 flag not set
,
}
func
TestDialGoogle
(
t
*
testing
.
T
)
{
// If no ipv6 tunnel, don't try the last address.
if
!*
ipv6
{
googleaddrs
[
len
(
googleaddrs
)
-
1
]
=
""
googleaddrs
[
len
(
googleaddrs
)
-
1
]
=
""
;
}
for
i
:=
0
;
i
<
len
(
googleaddrs
);
i
++
{
addr
:=
googleaddrs
[
i
];
if
addr
==
""
{
continue
continue
;
}
t
.
Logf
(
"-- %s --"
,
addr
);
doDial
(
t
,
"tcp"
,
addr
);
...
...
src/pkg/net/dnsclient.go
View file @
5d377054
...
...
@@ -41,23 +41,23 @@ const noSuchHost = "no such host"
// Up to cfg.attempts attempts.
func
_Exchange
(
cfg
*
_DNS_Config
,
c
Conn
,
name
string
)
(
m
*
_DNS_Msg
,
err
os
.
Error
)
{
if
len
(
name
)
>=
256
{
return
nil
,
&
DNSError
{
"name too long"
,
name
,
""
}
return
nil
,
&
DNSError
{
"name too long"
,
name
,
""
}
;
}
out
:=
new
(
_DNS_Msg
);
out
.
id
=
0x1234
;
out
.
question
=
[]
_DNS_Question
{
_DNS_Question
{
name
,
_DNS_TypeA
,
_DNS_ClassINET
}
_DNS_Question
{
name
,
_DNS_TypeA
,
_DNS_ClassINET
},
};
out
.
recursion_desired
=
true
;
msg
,
ok
:=
out
.
Pack
();
if
!
ok
{
return
nil
,
&
DNSError
{
"internal error - cannot pack message"
,
name
,
""
}
return
nil
,
&
DNSError
{
"internal error - cannot pack message"
,
name
,
""
}
;
}
for
attempt
:=
0
;
attempt
<
cfg
.
attempts
;
attempt
++
{
n
,
err
:=
c
.
Write
(
msg
);
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
;
}
c
.
SetReadTimeout
(
1e9
);
// nanoseconds
...
...
@@ -74,15 +74,15 @@ func _Exchange(cfg *_DNS_Config, c Conn, name string) (m *_DNS_Msg, err os.Error
buf
=
buf
[
0
:
n
];
in
:=
new
(
_DNS_Msg
);
if
!
in
.
Unpack
(
buf
)
||
in
.
id
!=
out
.
id
{
continue
continue
;
}
return
in
,
nil
return
in
,
nil
;
}
var
server
string
;
if
a
:=
c
.
RemoteAddr
();
a
!=
nil
{
server
=
a
.
String
();
}
return
nil
,
&
DNSError
{
"no answer from server"
,
name
,
server
}
return
nil
,
&
DNSError
{
"no answer from server"
,
name
,
server
}
;
}
...
...
@@ -92,14 +92,14 @@ func answer(name, server string, dns *_DNS_Msg) (addrs []string, err *DNSError)
addrs
=
make
([]
string
,
0
,
len
(
dns
.
answer
));
if
dns
.
rcode
==
_DNS_RcodeNameError
&&
dns
.
recursion_available
{
return
nil
,
&
DNSError
{
noSuchHost
,
name
,
""
}
return
nil
,
&
DNSError
{
noSuchHost
,
name
,
""
}
;
}
if
dns
.
rcode
!=
_DNS_RcodeSuccess
{
// None of the error codes make sense
// for the query we sent. If we didn't get
// a name error and we didn't get success,
// the server is behaving incorrectly.
return
nil
,
&
DNSError
{
"server misbehaving"
,
name
,
server
}
return
nil
,
&
DNSError
{
"server misbehaving"
,
name
,
server
}
;
}
// Look for the name.
...
...
@@ -118,29 +118,29 @@ Cname:
case
_DNS_TypeA
:
n
:=
len
(
addrs
);
a
:=
rr
.
(
*
_DNS_RR_A
)
.
A
;
addrs
=
addrs
[
0
:
n
+
1
];
addrs
=
addrs
[
0
:
n
+
1
];
addrs
[
n
]
=
IPv4
(
byte
(
a
>>
24
),
byte
(
a
>>
16
),
byte
(
a
>>
8
),
byte
(
a
))
.
String
();
case
_DNS_TypeCNAME
:
// redirect to cname
name
=
rr
.
(
*
_DNS_RR_CNAME
)
.
Cname
;
continue
Cname
continue
Cname
;
}
}
}
if
len
(
addrs
)
==
0
{
return
nil
,
&
DNSError
{
noSuchHost
,
name
,
server
}
return
nil
,
&
DNSError
{
noSuchHost
,
name
,
server
}
;
}
return
addrs
,
nil
return
addrs
,
nil
;
}
return
nil
,
&
DNSError
{
"too many redirects"
,
name
,
server
}
return
nil
,
&
DNSError
{
"too many redirects"
,
name
,
server
}
;
}
// Do a lookup for a single name, which must be rooted
// (otherwise answer will not find the answers).
func
tryOneName
(
cfg
*
_DNS_Config
,
name
string
)
(
addrs
[]
string
,
err
os
.
Error
)
{
if
len
(
cfg
.
servers
)
==
0
{
return
nil
,
&
DNSError
{
"no DNS servers"
,
name
,
""
}
return
nil
,
&
DNSError
{
"no DNS servers"
,
name
,
""
}
;
}
for
i
:=
0
;
i
<
len
(
cfg
.
servers
);
i
++
{
// Calling Dial here is scary -- we have to be sure
...
...
@@ -255,14 +255,14 @@ func LookupHost(name string) (cname string, addrs []string, err os.Error) {
}
}
if
rooted
{
return
return
;
}
// Otherwise, try suffixes.
for
i
:=
0
;
i
<
len
(
cfg
.
search
);
i
++
{
rname
:=
name
+
"."
+
cfg
.
search
[
i
];
rname
:=
name
+
"."
+
cfg
.
search
[
i
];
if
rname
[
len
(
rname
)
-
1
]
!=
'.'
{
rname
+=
"."
rname
+=
"."
;
}
addrs
,
err
=
tryOneName
(
cfg
,
rname
);
if
err
==
nil
{
...
...
@@ -270,5 +270,5 @@ func LookupHost(name string) (cname string, addrs []string, err os.Error) {
return
;
}
}
return
return
;
}
src/pkg/net/dnsconfig.go
View file @
5d377054
...
...
@@ -17,7 +17,7 @@ type _DNS_Config struct {
rotate
bool
;
// round robin among servers
}
var
_DNS_configError
os
.
Error
;
var
_DNS_configError
os
.
Error
// See resolv.conf(5) on a Linux machine.
// TODO(rsc): Supposed to call uname() and chop the beginning
...
...
@@ -26,7 +26,7 @@ var _DNS_configError os.Error;
func
_DNS_ReadConfig
()
(
*
_DNS_Config
,
os
.
Error
)
{
file
,
err
:=
open
(
"/etc/resolv.conf"
);
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
;
}
conf
:=
new
(
_DNS_Config
);
conf
.
servers
=
make
([]
string
,
3
)[
0
:
0
];
// small, but the standard limit
...
...
@@ -50,7 +50,7 @@ func _DNS_ReadConfig() (*_DNS_Config, os.Error) {
// to look it up.
name
:=
f
[
1
];
if
len
(
ParseIP
(
name
))
!=
0
{
a
=
a
[
0
:
n
+
1
];
a
=
a
[
0
:
n
+
1
];
a
[
n
]
=
name
;
conf
.
servers
=
a
;
}
...
...
@@ -61,11 +61,11 @@ func _DNS_ReadConfig() (*_DNS_Config, os.Error) {
conf
.
search
=
make
([]
string
,
1
);
conf
.
search
[
0
]
=
f
[
1
];
}
else
{
conf
.
search
=
make
([]
string
,
0
)
conf
.
search
=
make
([]
string
,
0
)
;
}
case
"search"
:
// set search path to given servers
conf
.
search
=
make
([]
string
,
len
(
f
)
-
1
);
conf
.
search
=
make
([]
string
,
len
(
f
)
-
1
);
for
i
:=
0
;
i
<
len
(
conf
.
search
);
i
++
{
conf
.
search
[
i
]
=
f
[
i
+
1
];
}
...
...
@@ -77,19 +77,19 @@ func _DNS_ReadConfig() (*_DNS_Config, os.Error) {
case
len
(
s
)
>=
6
&&
s
[
0
:
6
]
==
"ndots:"
:
n
,
_
,
_
:=
dtoi
(
s
,
6
);
if
n
<
1
{
n
=
1
n
=
1
;
}
conf
.
ndots
=
n
;
case
len
(
s
)
>=
8
&&
s
[
0
:
8
]
==
"timeout:"
:
n
,
_
,
_
:=
dtoi
(
s
,
8
);
if
n
<
1
{
n
=
1
n
=
1
;
}
conf
.
timeout
=
n
;
case
len
(
s
)
>=
8
&&
s
[
0
:
9
]
==
"attempts:"
:
n
,
_
,
_
:=
dtoi
(
s
,
9
);
if
n
<
1
{
n
=
1
n
=
1
;
}
conf
.
attempts
=
n
;
case
s
==
"rotate"
:
...
...
@@ -100,6 +100,5 @@ func _DNS_ReadConfig() (*_DNS_Config, os.Error) {
}
file
.
close
();
return
conf
,
nil
return
conf
,
nil
;
}
src/pkg/net/dnsmsg.go
View file @
5d377054
...
...
@@ -108,11 +108,11 @@ type _DNS_RR_Header struct {
}
func
(
h
*
_DNS_RR_Header
)
Header
()
*
_DNS_RR_Header
{
return
h
return
h
;
}
type
_DNS_RR
interface
{
Header
()
*
_DNS_RR_Header
Header
()
*
_DNS_RR_Header
;
}
...
...
@@ -236,7 +236,6 @@ func (rr *_DNS_RR_A) Header() *_DNS_RR_Header {
}
// Packing and unpacking.
//
// All the packers and unpackers take a (msg []byte, off int)
...
...
@@ -246,7 +245,7 @@ func (rr *_DNS_RR_A) Header() *_DNS_RR_Header {
// packing sequence.
// Map of constructors for each RR wire type.
var
rr_mk
=
map
[
int
]
func
()
_DNS_RR
{
var
rr_mk
=
map
[
int
]
func
()
_DNS_RR
{
_DNS_TypeCNAME
:
func
()
_DNS_RR
{
return
new
(
_DNS_RR_CNAME
)
},
_DNS_TypeHINFO
:
func
()
_DNS_RR
{
return
new
(
_DNS_RR_HINFO
)
},
_DNS_TypeMB
:
func
()
_DNS_RR
{
return
new
(
_DNS_RR_MB
)
},
...
...
@@ -274,19 +273,19 @@ func packDomainName(s string, msg []byte, off int) (off1 int, ok bool) {
// We trade each dot byte for a length byte.
// There is also a trailing zero.
// Check that we have all the space we need.
tot
:=
len
(
s
)
+
1
;
tot
:=
len
(
s
)
+
1
;
if
off
+
tot
>
len
(
msg
)
{
return
len
(
msg
),
false
return
len
(
msg
),
false
;
}
// Emit sequence of counted strings, chopping at dots.
begin
:=
0
;
for
i
:=
0
;
i
<
len
(
s
);
i
++
{
if
s
[
i
]
==
'.'
{
if
i
-
begin
>=
1
<<
6
{
// top two bits of length must be clear
return
len
(
msg
),
false
if
i
-
begin
>=
1
<<
6
{
// top two bits of length must be clear
return
len
(
msg
),
false
;
}
msg
[
off
]
=
byte
(
i
-
begin
);
msg
[
off
]
=
byte
(
i
-
begin
);
off
++
;
for
j
:=
begin
;
j
<
i
;
j
++
{
msg
[
off
]
=
s
[
j
];
...
...
@@ -297,7 +296,7 @@ func packDomainName(s string, msg []byte, off int) (off1 int, ok bool) {
}
msg
[
off
]
=
0
;
off
++
;
return
off
,
true
return
off
,
true
;
}
// Unpack a domain name.
...
...
@@ -319,7 +318,7 @@ func unpackDomainName(msg []byte, off int) (s string, off1 int, ok bool) {
Loop
:
for
{
if
off
>=
len
(
msg
)
{
return
""
,
len
(
msg
),
false
return
""
,
len
(
msg
),
false
;
}
c
:=
int
(
msg
[
off
]);
off
++
;
...
...
@@ -327,13 +326,13 @@ Loop:
case
0x00
:
if
c
==
0x00
{
// end of name
break
Loop
break
Loop
;
}
// literal string
if
off
+
c
>
len
(
msg
)
{
return
""
,
len
(
msg
),
false
return
""
,
len
(
msg
),
false
;
}
s
+=
string
(
msg
[
off
:
off
+
c
])
+
"."
;
s
+=
string
(
msg
[
off
:
off
+
c
])
+
"."
;
off
+=
c
;
case
0xC0
:
// pointer to somewhere else in msg.
...
...
@@ -342,26 +341,26 @@ Loop:
// also, don't follow too many pointers --
// maybe there's a loop.
if
off
>=
len
(
msg
)
{
return
""
,
len
(
msg
),
false
return
""
,
len
(
msg
),
false
;
}
c1
:=
msg
[
off
];
off
++
;
if
ptr
==
0
{
off1
=
off
off1
=
off
;
}
if
ptr
++
;
ptr
>
10
{
return
""
,
len
(
msg
),
false
return
""
,
len
(
msg
),
false
;
}
off
=
(
c
^
0xC0
)
<<
8
|
int
(
c1
);
default
:
// 0x80 and 0x40 are reserved
return
""
,
len
(
msg
),
false
return
""
,
len
(
msg
),
false
;
}
}
if
ptr
==
0
{
off1
=
off
off1
=
off
;
}
return
s
,
off1
,
true
return
s
,
off1
,
true
;
}
// TODO(rsc): Move into generic library?
...
...
@@ -379,7 +378,7 @@ func packStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, o
case
*
reflect
.
Uint16Value
:
i
:=
fv
.
Get
();
if
off
+
2
>
len
(
msg
)
{
return
len
(
msg
),
false
return
len
(
msg
),
false
;
}
msg
[
off
]
=
byte
(
i
>>
8
);
msg
[
off
+
1
]
=
byte
(
i
);
...
...
@@ -387,7 +386,7 @@ func packStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, o
case
*
reflect
.
Uint32Value
:
i
:=
fv
.
Get
();
if
off
+
4
>
len
(
msg
)
{
return
len
(
msg
),
false
return
len
(
msg
),
false
;
}
msg
[
off
]
=
byte
(
i
>>
24
);
msg
[
off
+
1
]
=
byte
(
i
>>
16
);
...
...
@@ -405,12 +404,12 @@ func packStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, o
case
"domain-name"
:
off
,
ok
=
packDomainName
(
s
,
msg
,
off
);
if
!
ok
{
return
len
(
msg
),
false
return
len
(
msg
),
false
;
}
case
""
:
// Counted string: 1 byte length.
if
len
(
s
)
>
255
||
off
+
1
+
len
(
s
)
>
len
(
msg
)
{
return
len
(
msg
),
false
if
len
(
s
)
>
255
||
off
+
1
+
len
(
s
)
>
len
(
msg
)
{
return
len
(
msg
),
false
;
}
msg
[
off
]
=
byte
(
len
(
s
));
off
++
;
...
...
@@ -421,7 +420,7 @@ func packStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, o
}
}
}
return
off
,
true
return
off
,
true
;
}
func
structValue
(
any
interface
{})
*
reflect
.
StructValue
{
...
...
@@ -430,7 +429,7 @@ func structValue(any interface{}) *reflect.StructValue {
func
packStruct
(
any
interface
{},
msg
[]
byte
,
off
int
)
(
off1
int
,
ok
bool
)
{
off
,
ok
=
packStructValue
(
structValue
(
any
),
msg
,
off
);
return
off
,
ok
return
off
,
ok
;
}
// TODO(rsc): Move into generic library?
...
...
@@ -447,14 +446,14 @@ func unpackStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int,
off
,
ok
=
unpackStructValue
(
fv
,
msg
,
off
);
case
*
reflect
.
Uint16Value
:
if
off
+
2
>
len
(
msg
)
{
return
len
(
msg
),
false
return
len
(
msg
),
false
;
}
i
:=
uint16
(
msg
[
off
])
<<
8
|
uint16
(
msg
[
off
+
1
]);
fv
.
Set
(
i
);
off
+=
2
;
case
*
reflect
.
Uint32Value
:
if
off
+
4
>
len
(
msg
)
{
return
len
(
msg
),
false
return
len
(
msg
),
false
;
}
i
:=
uint32
(
msg
[
off
])
<<
24
|
uint32
(
msg
[
off
+
1
])
<<
16
|
uint32
(
msg
[
off
+
2
])
<<
8
|
uint32
(
msg
[
off
+
3
]);
fv
.
Set
(
i
);
...
...
@@ -468,11 +467,11 @@ func unpackStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int,
case
"domain-name"
:
s
,
off
,
ok
=
unpackDomainName
(
msg
,
off
);
if
!
ok
{
return
len
(
msg
),
false
return
len
(
msg
),
false
;
}
case
""
:
if
off
>=
len
(
msg
)
||
off
+
1
+
int
(
msg
[
off
])
>
len
(
msg
)
{
return
len
(
msg
),
false
return
len
(
msg
),
false
;
}
n
:=
int
(
msg
[
off
]);
off
++
;
...
...
@@ -486,12 +485,12 @@ func unpackStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int,
fv
.
Set
(
s
);
}
}
return
off
,
true
return
off
,
true
;
}
func
unpackStruct
(
any
interface
{},
msg
[]
byte
,
off
int
)
(
off1
int
,
ok
bool
)
{
off
,
ok
=
unpackStructValue
(
structValue
(
any
),
msg
,
off
);
return
off
,
ok
return
off
,
ok
;
}
// Generic struct printer.
...
...
@@ -515,7 +514,7 @@ func printStructValue(val *reflect.StructValue) string {
i
:=
fv
.
Get
();
s
+=
IPv4
(
byte
(
i
>>
24
),
byte
(
i
>>
16
),
byte
(
i
>>
8
),
byte
(
i
))
.
String
();
}
else
{
s
+=
fmt
.
Sprint
(
fval
.
Interface
())
s
+=
fmt
.
Sprint
(
fval
.
Interface
())
;
}
}
s
+=
"}"
;
...
...
@@ -537,12 +536,12 @@ func packRR(rr _DNS_RR, msg []byte, off int) (off2 int, ok bool) {
off1
,
ok
=
packStruct
(
rr
.
Header
(),
msg
,
off
);
off2
,
ok
=
packStruct
(
rr
,
msg
,
off
);
if
!
ok
{
return
len
(
msg
),
false
return
len
(
msg
),
false
;
}
// pack a third time; redo header with correct data length
rr
.
Header
()
.
Rdlength
=
uint16
(
off2
-
off1
);
rr
.
Header
()
.
Rdlength
=
uint16
(
off2
-
off1
);
packStruct
(
rr
.
Header
(),
msg
,
off
);
return
off2
,
true
return
off2
,
true
;
}
// Resource record unpacker.
...
...
@@ -551,7 +550,7 @@ func unpackRR(msg []byte, off int) (rr _DNS_RR, off1 int, ok bool) {
var
h
_DNS_RR_Header
;
off0
:=
off
;
if
off
,
ok
=
unpackStruct
(
&
h
,
msg
,
off
);
!
ok
{
return
nil
,
len
(
msg
),
false
return
nil
,
len
(
msg
),
false
;
}
end
:=
off
+
int
(
h
.
Rdlength
);
...
...
@@ -559,14 +558,14 @@ func unpackRR(msg []byte, off int) (rr _DNS_RR, off1 int, ok bool) {
// again inefficient but doesn't need to be fast.
mk
,
known
:=
rr_mk
[
int
(
h
.
Rrtype
)];
if
!
known
{
return
&
h
,
end
,
true
return
&
h
,
end
,
true
;
}
rr
=
mk
();
off
,
ok
=
unpackStruct
(
rr
,
msg
,
off0
);
if
off
!=
end
{
return
&
h
,
end
,
true
return
&
h
,
end
,
true
;
}
return
rr
,
off
,
ok
return
rr
,
off
,
ok
;
}
// Usable representation of a DNS packet.
...
...
@@ -647,9 +646,9 @@ func (dns *_DNS_Msg) Pack() (msg []byte, ok bool) {
off
,
ok
=
packStruct
(
extra
[
i
],
msg
,
off
);
}
if
!
ok
{
return
nil
,
false
return
nil
,
false
;
}
return
msg
[
0
:
off
],
true
return
msg
[
0
:
off
],
true
;
}
func
(
dns
*
_DNS_Msg
)
Unpack
(
msg
[]
byte
)
bool
{
...
...
@@ -658,11 +657,11 @@ func (dns *_DNS_Msg) Unpack(msg []byte) bool {
off
:=
0
;
var
ok
bool
;
if
off
,
ok
=
unpackStruct
(
&
dh
,
msg
,
off
);
!
ok
{
return
false
return
false
;
}
dns
.
id
=
dh
.
Id
;
dns
.
response
=
(
dh
.
Bits
&
_QR
)
!=
0
;
dns
.
opcode
=
int
(
dh
.
Bits
>>
11
)
&
0xF
;
dns
.
opcode
=
int
(
dh
.
Bits
>>
11
)
&
0xF
;
dns
.
authoritative
=
(
dh
.
Bits
&
_AA
)
!=
0
;
dns
.
truncated
=
(
dh
.
Bits
&
_TC
)
!=
0
;
dns
.
recursion_desired
=
(
dh
.
Bits
&
_RD
)
!=
0
;
...
...
@@ -688,38 +687,38 @@ func (dns *_DNS_Msg) Unpack(msg []byte) bool {
dns
.
extra
[
i
],
off
,
ok
=
unpackRR
(
msg
,
off
);
}
if
!
ok
{
return
false
return
false
;
}
// if off != len(msg) {
// println("extra bytes in dns packet", off, "<", len(msg));
// }
return
true
// if off != len(msg) {
// println("extra bytes in dns packet", off, "<", len(msg));
// }
return
true
;
}
func
(
dns
*
_DNS_Msg
)
String
()
string
{
s
:=
"DNS: "
+
printStruct
(
&
dns
.
__DNS_Msg_Top
)
+
"
\n
"
;
s
:=
"DNS: "
+
printStruct
(
&
dns
.
__DNS_Msg_Top
)
+
"
\n
"
;
if
len
(
dns
.
question
)
>
0
{
s
+=
"-- Questions
\n
"
;
for
i
:=
0
;
i
<
len
(
dns
.
question
);
i
++
{
s
+=
printStruct
(
&
dns
.
question
[
i
])
+
"
\n
"
;
s
+=
printStruct
(
&
dns
.
question
[
i
])
+
"
\n
"
;
}
}
if
len
(
dns
.
answer
)
>
0
{
s
+=
"-- Answers
\n
"
;
for
i
:=
0
;
i
<
len
(
dns
.
answer
);
i
++
{
s
+=
printStruct
(
dns
.
answer
[
i
])
+
"
\n
"
;
s
+=
printStruct
(
dns
.
answer
[
i
])
+
"
\n
"
;
}
}
if
len
(
dns
.
ns
)
>
0
{
s
+=
"-- Name servers
\n
"
;
for
i
:=
0
;
i
<
len
(
dns
.
ns
);
i
++
{
s
+=
printStruct
(
dns
.
ns
[
i
])
+
"
\n
"
;
s
+=
printStruct
(
dns
.
ns
[
i
])
+
"
\n
"
;
}
}
if
len
(
dns
.
extra
)
>
0
{
s
+=
"-- Extra
\n
"
;
for
i
:=
0
;
i
<
len
(
dns
.
extra
);
i
++
{
s
+=
printStruct
(
dns
.
extra
[
i
])
+
"
\n
"
;
s
+=
printStruct
(
dns
.
extra
[
i
])
+
"
\n
"
;
}
}
return
s
;
...
...
src/pkg/net/fd.go
View file @
5d377054
...
...
@@ -70,7 +70,7 @@ type netFD struct {
type
pollServer
struct
{
cr
,
cw
chan
*
netFD
;
// buffered >= 1
pr
,
pw
*
os
.
File
;
pending
map
[
int
]
*
netFD
;
pending
map
[
int
]
*
netFD
;
poll
*
pollster
;
// low-level OS hooks
deadline
int64
;
// next deadline (nsec since 1970)
}
...
...
@@ -80,7 +80,7 @@ func newPollServer() (s *pollServer, err os.Error) {
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
return
nil
,
err
;
}
var
e
int
;
if
e
=
syscall
.
SetNonblock
(
s
.
pr
.
Fd
(),
true
);
e
!=
0
{
...
...
@@ -99,11 +99,11 @@ func newPollServer() (s *pollServer, err os.Error) {
}
if
err
=
s
.
poll
.
AddFD
(
s
.
pr
.
Fd
(),
'r'
,
true
);
err
!=
nil
{
s
.
poll
.
Close
();
goto
Error
goto
Error
;
}
s
.
pending
=
make
(
map
[
int
]
*
netFD
);
s
.
pending
=
make
(
map
[
int
]
*
netFD
);
go
s
.
Run
();
return
s
,
nil
return
s
,
nil
;
}
func
(
s
*
pollServer
)
AddFD
(
fd
*
netFD
,
mode
int
)
{
...
...
@@ -122,19 +122,19 @@ func (s *pollServer) AddFD(fd *netFD, mode int) {
if
intfd
<
0
{
// fd closed underfoot
if
mode
==
'r'
{
fd
.
cr
<-
fd
fd
.
cr
<-
fd
;
}
else
{
fd
.
cw
<-
fd
fd
.
cw
<-
fd
;
}
return
return
;
}
if
err
:=
s
.
poll
.
AddFD
(
intfd
,
mode
,
false
);
err
!=
nil
{
panicln
(
"pollServer AddFD "
,
intfd
,
": "
,
err
.
String
(),
"
\n
"
);
return
return
;
}
var
t
int64
;
key
:=
intfd
<<
1
;
key
:=
intfd
<<
1
;
if
mode
==
'r'
{
fd
.
ncr
++
;
t
=
fd
.
rdeadline
;
...
...
@@ -150,28 +150,28 @@ func (s *pollServer) AddFD(fd *netFD, mode int) {
}
func
(
s
*
pollServer
)
LookupFD
(
fd
int
,
mode
int
)
*
netFD
{
key
:=
fd
<<
1
;
key
:=
fd
<<
1
;
if
mode
==
'w'
{
key
++
;
}
netfd
,
ok
:=
s
.
pending
[
key
];
if
!
ok
{
return
nil
return
nil
;
}
s
.
pending
[
key
]
=
nil
,
false
;
return
netfd
return
netfd
;
}
func
(
s
*
pollServer
)
WakeFD
(
fd
*
netFD
,
mode
int
)
{
if
mode
==
'r'
{
for
fd
.
ncr
>
0
{
fd
.
ncr
--
;
fd
.
cr
<-
fd
fd
.
cr
<-
fd
;
}
}
else
{
for
fd
.
ncw
>
0
{
fd
.
ncw
--
;
fd
.
cw
<-
fd
fd
.
cw
<-
fd
;
}
}
}
...
...
@@ -181,7 +181,7 @@ func (s *pollServer) Now() int64 {
if
err
!=
nil
{
panic
(
"net: os.Time: "
,
err
.
String
());
}
nsec
+=
sec
*
1e9
;
nsec
+=
sec
*
1e9
;
return
nsec
;
}
...
...
@@ -237,7 +237,7 @@ func (s *pollServer) Run() {
fd
,
mode
,
err
:=
s
.
poll
.
WaitFD
(
t
);
if
err
!=
nil
{
print
(
"pollServer WaitFD: "
,
err
.
String
(),
"
\n
"
);
return
return
;
}
if
fd
<
0
{
// Timeout happened.
...
...
@@ -247,42 +247,43 @@ func (s *pollServer) Run() {
if
fd
==
s
.
pr
.
Fd
()
{
// Drain our wakeup pipe.
for
nn
,
_
:=
s
.
pr
.
Read
(
&
scratch
);
nn
>
0
;
{
nn
,
_
=
s
.
pr
.
Read
(
&
scratch
)
nn
,
_
=
s
.
pr
.
Read
(
&
scratch
)
;
}
// Read from channels
for
fd
,
ok
:=
<-
s
.
cr
;
ok
;
fd
,
ok
=
<-
s
.
cr
{
s
.
AddFD
(
fd
,
'r'
)
s
.
AddFD
(
fd
,
'r'
)
;
}
for
fd
,
ok
:=
<-
s
.
cw
;
ok
;
fd
,
ok
=
<-
s
.
cw
{
s
.
AddFD
(
fd
,
'w'
)
s
.
AddFD
(
fd
,
'w'
)
;
}
}
else
{
netfd
:=
s
.
LookupFD
(
fd
,
mode
);
if
netfd
==
nil
{
print
(
"pollServer: unexpected wakeup for fd="
,
netfd
,
" mode="
,
string
(
mode
),
"
\n
"
);
continue
continue
;
}
s
.
WakeFD
(
netfd
,
mode
);
}
}
}
var
wakeupbuf
[
1
]
byte
;
var
wakeupbuf
[
1
]
byte
func
(
s
*
pollServer
)
Wakeup
()
{
s
.
pw
.
Write
(
&
wakeupbuf
)
s
.
pw
.
Write
(
&
wakeupbuf
)
;
}
func
(
s
*
pollServer
)
WaitRead
(
fd
*
netFD
)
{
s
.
cr
<-
fd
;
s
.
Wakeup
();
<-
fd
.
cr
<-
fd
.
cr
;
}
func
(
s
*
pollServer
)
WaitWrite
(
fd
*
netFD
)
{
s
.
cw
<-
fd
;
s
.
Wakeup
();
<-
fd
.
cw
<-
fd
.
cw
;
}
...
...
@@ -294,9 +295,9 @@ var pollserver *pollServer
func
startServer
()
{
p
,
err
:=
newPollServer
();
if
err
!=
nil
{
print
(
"Start pollServer: "
,
err
.
String
(),
"
\n
"
)
print
(
"Start pollServer: "
,
err
.
String
(),
"
\n
"
)
;
}
pollserver
=
p
pollserver
=
p
;
}
func
newFD
(
fd
,
family
,
proto
int
,
net
string
,
laddr
,
raddr
Addr
)
(
f
*
netFD
,
err
os
.
Error
)
{
...
...
@@ -319,10 +320,10 @@ func newFD(fd, family, proto int, net string, laddr, raddr Addr) (f *netFD, err
if
raddr
!=
nil
{
rs
=
raddr
.
String
();
}
f
.
file
=
os
.
NewFile
(
fd
,
net
+
":"
+
ls
+
"->"
+
rs
);
f
.
file
=
os
.
NewFile
(
fd
,
net
+
":"
+
ls
+
"->"
+
rs
);
f
.
cr
=
make
(
chan
*
netFD
,
1
);
f
.
cw
=
make
(
chan
*
netFD
,
1
);
return
f
,
nil
return
f
,
nil
;
}
func
isEAGAIN
(
e
os
.
Error
)
bool
{
...
...
@@ -334,7 +335,7 @@ func isEAGAIN(e os.Error) bool {
func
(
fd
*
netFD
)
Close
()
os
.
Error
{
if
fd
==
nil
||
fd
.
file
==
nil
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
// In case the user has set linger,
...
...
@@ -348,12 +349,12 @@ func (fd *netFD) Close() os.Error {
e
:=
fd
.
file
.
Close
();
fd
.
file
=
nil
;
fd
.
fd
=
-
1
;
return
e
return
e
;
}
func
(
fd
*
netFD
)
Read
(
p
[]
byte
)
(
n
int
,
err
os
.
Error
)
{
if
fd
==
nil
||
fd
.
file
==
nil
{
return
0
,
os
.
EINVAL
return
0
,
os
.
EINVAL
;
}
fd
.
rio
.
Lock
();
defer
fd
.
rio
.
Unlock
();
...
...
@@ -375,7 +376,7 @@ func (fd *netFD) Read(p []byte) (n int, err os.Error) {
func
(
fd
*
netFD
)
Write
(
p
[]
byte
)
(
n
int
,
err
os
.
Error
)
{
if
fd
==
nil
||
fd
.
file
==
nil
{
return
0
,
os
.
EINVAL
return
0
,
os
.
EINVAL
;
}
fd
.
wio
.
Lock
();
defer
fd
.
wio
.
Unlock
();
...
...
@@ -389,7 +390,7 @@ func (fd *netFD) Write(p []byte) (n int, err os.Error) {
for
nn
<
len
(
p
)
{
n
,
err
=
fd
.
file
.
Write
(
p
[
nn
:
len
(
p
)]);
if
n
>
0
{
nn
+=
n
nn
+=
n
;
}
if
nn
==
len
(
p
)
{
break
;
...
...
@@ -402,12 +403,12 @@ func (fd *netFD) Write(p []byte) (n int, err os.Error) {
break
;
}
}
return
nn
,
err
return
nn
,
err
;
}
func
(
fd
*
netFD
)
accept
(
toAddr
func
(
syscall
.
Sockaddr
)
Addr
)
(
nfd
*
netFD
,
err
os
.
Error
)
{
func
(
fd
*
netFD
)
accept
(
toAddr
func
(
syscall
.
Sockaddr
)
Addr
)
(
nfd
*
netFD
,
err
os
.
Error
)
{
if
fd
==
nil
||
fd
.
file
==
nil
{
return
nil
,
os
.
EINVAL
return
nil
,
os
.
EINVAL
;
}
// See ../syscall/exec.go for description of ForkLock.
...
...
@@ -427,14 +428,14 @@ func (fd *netFD) accept(toAddr func(syscall.Sockaddr)Addr) (nfd *netFD, err os.E
}
if
e
!=
0
{
syscall
.
ForkLock
.
RUnlock
();
return
nil
,
&
OpError
{
"accept"
,
fd
.
net
,
fd
.
laddr
,
os
.
Errno
(
e
)}
return
nil
,
&
OpError
{
"accept"
,
fd
.
net
,
fd
.
laddr
,
os
.
Errno
(
e
)}
;
}
syscall
.
CloseOnExec
(
s
);
syscall
.
ForkLock
.
RUnlock
();
if
nfd
,
err
=
newFD
(
s
,
fd
.
family
,
fd
.
proto
,
fd
.
net
,
fd
.
laddr
,
toAddr
(
sa
));
err
!=
nil
{
syscall
.
Close
(
s
);
return
nil
,
err
return
nil
,
err
;
}
return
nfd
,
nil
return
nfd
,
nil
;
}
src/pkg/net/fd_darwin.go
View file @
5d377054
...
...
@@ -21,18 +21,18 @@ func newpollster() (p *pollster, err os.Error) {
p
=
new
(
pollster
);
var
e
int
;
if
p
.
kq
,
e
=
syscall
.
Kqueue
();
e
!=
0
{
return
nil
,
os
.
NewSyscallError
(
"kqueue"
,
e
)
return
nil
,
os
.
NewSyscallError
(
"kqueue"
,
e
)
;
}
p
.
events
=
p
.
eventbuf
[
0
:
0
];
return
p
,
nil
return
p
,
nil
;
}
func
(
p
*
pollster
)
AddFD
(
fd
int
,
mode
int
,
repeat
bool
)
os
.
Error
{
var
kmode
int
;
if
mode
==
'r'
{
kmode
=
syscall
.
EVFILT_READ
kmode
=
syscall
.
EVFILT_READ
;
}
else
{
kmode
=
syscall
.
EVFILT_WRITE
kmode
=
syscall
.
EVFILT_WRITE
;
}
var
events
[
1
]
syscall
.
Kevent_t
;
ev
:=
&
events
[
0
];
...
...
@@ -42,7 +42,7 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
// EV_ONESHOT - delete the event the first time it triggers
flags
:=
syscall
.
EV_ADD
|
syscall
.
EV_RECEIPT
;
if
!
repeat
{
flags
|=
syscall
.
EV_ONESHOT
flags
|=
syscall
.
EV_ONESHOT
;
}
syscall
.
SetKevent
(
ev
,
fd
,
kmode
,
flags
);
...
...
@@ -54,17 +54,17 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
return
os
.
ErrorString
(
"kqueue phase error"
);
}
if
ev
.
Data
!=
0
{
return
os
.
Errno
(
int
(
ev
.
Data
))
return
os
.
Errno
(
int
(
ev
.
Data
))
;
}
return
nil
return
nil
;
}
func
(
p
*
pollster
)
DelFD
(
fd
int
,
mode
int
)
{
var
kmode
int
;
if
mode
==
'r'
{
kmode
=
syscall
.
EVFILT_READ
kmode
=
syscall
.
EVFILT_READ
;
}
else
{
kmode
=
syscall
.
EVFILT_WRITE
kmode
=
syscall
.
EVFILT_WRITE
;
}
var
events
[
1
]
syscall
.
Kevent_t
;
ev
:=
&
events
[
0
];
...
...
@@ -87,26 +87,26 @@ func (p *pollster) WaitFD(nsec int64) (fd int, mode int, err os.Error) {
nn
,
e
:=
syscall
.
Kevent
(
p
.
kq
,
nil
,
&
p
.
eventbuf
,
t
);
if
e
!=
0
{
if
e
==
syscall
.
EINTR
{
continue
continue
;
}
return
-
1
,
0
,
os
.
NewSyscallError
(
"kevent"
,
e
)
return
-
1
,
0
,
os
.
NewSyscallError
(
"kevent"
,
e
)
;
}
if
nn
==
0
{
return
-
1
,
0
,
nil
;
}
p
.
events
=
p
.
eventbuf
[
0
:
nn
]
p
.
events
=
p
.
eventbuf
[
0
:
nn
]
;
}
ev
:=
&
p
.
events
[
0
];
p
.
events
=
p
.
events
[
1
:
len
(
p
.
events
)];
fd
=
int
(
ev
.
Ident
);
if
ev
.
Filter
==
syscall
.
EVFILT_READ
{
mode
=
'r'
mode
=
'r'
;
}
else
{
mode
=
'w'
mode
=
'w'
;
}
return
fd
,
mode
,
nil
return
fd
,
mode
,
nil
;
}
func
(
p
*
pollster
)
Close
()
os
.
Error
{
return
os
.
NewSyscallError
(
"close"
,
syscall
.
Close
(
p
.
kq
))
return
os
.
NewSyscallError
(
"close"
,
syscall
.
Close
(
p
.
kq
))
;
}
src/pkg/net/fd_linux.go
View file @
5d377054
...
...
@@ -13,14 +13,14 @@ import (
const
(
readFlags
=
syscall
.
EPOLLIN
|
syscall
.
EPOLLRDHUP
;
writeFlags
=
syscall
.
EPOLLOUT
writeFlags
=
syscall
.
EPOLLOUT
;
)
type
pollster
struct
{
epfd
int
;
// Events we're already waiting for
events
map
[
int
]
uint32
;
events
map
[
int
]
uint32
;
}
func
newpollster
()
(
p
*
pollster
,
err
os
.
Error
)
{
...
...
@@ -31,10 +31,10 @@ func newpollster() (p *pollster, err os.Error) {
// about the number of FDs we will care about.
// We don't know.
if
p
.
epfd
,
e
=
syscall
.
EpollCreate
(
16
);
e
!=
0
{
return
nil
,
os
.
NewSyscallError
(
"epoll_create"
,
e
)
return
nil
,
os
.
NewSyscallError
(
"epoll_create"
,
e
)
;
}
p
.
events
=
make
(
map
[
int
]
uint32
);
return
p
,
nil
p
.
events
=
make
(
map
[
int
]
uint32
);
return
p
,
nil
;
}
func
(
p
*
pollster
)
AddFD
(
fd
int
,
mode
int
,
repeat
bool
)
os
.
Error
{
...
...
@@ -58,10 +58,10 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
op
=
syscall
.
EPOLL_CTL_ADD
;
}
if
e
:=
syscall
.
EpollCtl
(
p
.
epfd
,
op
,
fd
,
&
ev
);
e
!=
0
{
return
os
.
NewSyscallError
(
"epoll_ctl"
,
e
)
return
os
.
NewSyscallError
(
"epoll_ctl"
,
e
)
;
}
p
.
events
[
fd
]
=
ev
.
Events
;
return
nil
return
nil
;
}
func
(
p
*
pollster
)
StopWaiting
(
fd
int
,
bits
uint
)
{
...
...
@@ -111,7 +111,7 @@ func (p *pollster) WaitFD(nsec int64) (fd int, mode int, err os.Error) {
ev
:=
&
evarray
[
0
];
var
msec
int
=
-
1
;
if
nsec
>
0
{
msec
=
int
((
nsec
+
1e6
-
1
)
/
1e6
);
msec
=
int
((
nsec
+
1e6
-
1
)
/
1e6
);
}
n
,
e
:=
syscall
.
EpollWait
(
p
.
epfd
,
&
evarray
,
msec
);
for
e
==
syscall
.
EAGAIN
||
e
==
syscall
.
EINTR
{
...
...
src/pkg/net/fd_nacl.go
View file @
5d377054
...
...
@@ -9,11 +9,10 @@ import (
"syscall"
;
)
type
pollster
struct
{
}
type
pollster
struct
{}
func
newpollster
()
(
p
*
pollster
,
err
os
.
Error
)
{
return
nil
,
os
.
NewSyscallError
(
"networking"
,
syscall
.
ENACL
)
return
nil
,
os
.
NewSyscallError
(
"networking"
,
syscall
.
ENACL
)
;
}
func
(
p
*
pollster
)
AddFD
(
fd
int
,
mode
int
,
repeat
bool
)
os
.
Error
{
...
...
src/pkg/net/ip.go
View file @
5d377054
...
...
@@ -15,7 +15,7 @@ package net
// IP address lengths (bytes).
const
(
IPv4len
=
4
;
IPv6len
=
16
IPv6len
=
16
;
)
// An IP is a single IP address, an array of bytes.
...
...
@@ -30,17 +30,17 @@ const (
// is a semantic property of the address, not just the
// length of the byte array: a 16-byte array can still
// be an IPv4 address.
type
IP
[]
byte
;
type
IP
[]
byte
// An IP mask is an IP address.
type
IPMask
[]
byte
;
type
IPMask
[]
byte
// IPv4 returns the IP address (in 16-byte form) of the
// IPv4 address a.b.c.d.
func
IPv4
(
a
,
b
,
c
,
d
byte
)
IP
{
p
:=
make
(
IP
,
IPv6len
);
for
i
:=
0
;
i
<
10
;
i
++
{
p
[
i
]
=
0
p
[
i
]
=
0
;
}
p
[
10
]
=
0xff
;
p
[
11
]
=
0xff
;
...
...
@@ -48,7 +48,7 @@ func IPv4(a, b, c, d byte) IP {
p
[
13
]
=
b
;
p
[
14
]
=
c
;
p
[
15
]
=
d
;
return
p
return
p
;
}
// Well-known IPv4 addresses
...
...
@@ -68,37 +68,37 @@ var (
func
isZeros
(
p
IP
)
bool
{
for
i
:=
0
;
i
<
len
(
p
);
i
++
{
if
p
[
i
]
!=
0
{
return
false
return
false
;
}
}
return
true
return
true
;
}
// To4 converts the IPv4 address ip to a 4-byte representation.
// If ip is not an IPv4 address, To4 returns nil.
func
(
ip
IP
)
To4
()
IP
{
if
len
(
ip
)
==
IPv4len
{
return
ip
return
ip
;
}
if
len
(
ip
)
==
IPv6len
&&
isZeros
(
ip
[
0
:
10
])
&&
ip
[
10
]
==
0xff
&&
ip
[
11
]
==
0xff
{
return
ip
[
12
:
16
]
if
len
(
ip
)
==
IPv6len
&&
isZeros
(
ip
[
0
:
10
])
&&
ip
[
10
]
==
0xff
&&
ip
[
11
]
==
0xff
{
return
ip
[
12
:
16
]
;
}
return
nil
return
nil
;
}
// To16 converts the IP address ip to a 16-byte representation.
// If ip is not an IP address (it is the wrong length), To16 returns nil.
func
(
ip
IP
)
To16
()
IP
{
if
len
(
ip
)
==
IPv4len
{
return
IPv4
(
ip
[
0
],
ip
[
1
],
ip
[
2
],
ip
[
3
])
return
IPv4
(
ip
[
0
],
ip
[
1
],
ip
[
2
],
ip
[
3
])
;
}
if
len
(
ip
)
==
IPv6len
{
return
ip
return
ip
;
}
return
nil
return
nil
;
}
// Default route masks for IPv4.
...
...
@@ -113,7 +113,7 @@ var (
// nil if ip is not a valid IPv4 address.
func
(
ip
IP
)
DefaultMask
()
IPMask
{
if
ip
=
ip
.
To4
();
ip
==
nil
{
return
nil
return
nil
;
}
switch
true
{
case
ip
[
0
]
<
0x80
:
...
...
@@ -130,19 +130,19 @@ func (ip IP) DefaultMask() IPMask {
func
(
ip
IP
)
Mask
(
mask
IPMask
)
IP
{
n
:=
len
(
ip
);
if
n
!=
len
(
mask
)
{
return
nil
return
nil
;
}
out
:=
make
(
IP
,
n
);
for
i
:=
0
;
i
<
n
;
i
++
{
out
[
i
]
=
ip
[
i
]
&
mask
[
i
];
out
[
i
]
=
ip
[
i
]
&
mask
[
i
];
}
return
out
return
out
;
}
// Convert i to decimal string.
func
itod
(
i
uint
)
string
{
if
i
==
0
{
return
"0"
return
"0"
;
}
// Assemble decimal in reverse order.
...
...
@@ -150,16 +150,16 @@ func itod(i uint) string {
bp
:=
len
(
b
);
for
;
i
>
0
;
i
/=
10
{
bp
--
;
b
[
bp
]
=
byte
(
i
%
10
)
+
'0'
b
[
bp
]
=
byte
(
i
%
10
)
+
'0'
;
}
return
string
(
b
[
bp
:
len
(
b
)])
return
string
(
b
[
bp
:
len
(
b
)])
;
}
// Convert i to hexadecimal string.
func
itox
(
i
uint
)
string
{
if
i
==
0
{
return
"0"
return
"0"
;
}
// Assemble hexadecimal in reverse order.
...
...
@@ -167,10 +167,10 @@ func itox(i uint) string {
bp
:=
len
(
b
);
for
;
i
>
0
;
i
/=
16
{
bp
--
;
b
[
bp
]
=
"0123456789abcdef"
[
byte
(
i
%
16
)]
b
[
bp
]
=
"0123456789abcdef"
[
byte
(
i
%
16
)]
;
}
return
string
(
b
[
bp
:
len
(
b
)])
return
string
(
b
[
bp
:
len
(
b
)])
;
}
// String returns the string form of the IP address ip.
...
...
@@ -186,26 +186,26 @@ func (ip IP) String() string {
// If IPv4, use dotted notation.
if
p4
:=
p
.
To4
();
len
(
p4
)
==
4
{
return
itod
(
uint
(
p4
[
0
]))
+
"."
+
itod
(
uint
(
p4
[
1
]))
+
"."
+
itod
(
uint
(
p4
[
2
]))
+
"."
+
itod
(
uint
(
p4
[
3
]))
return
itod
(
uint
(
p4
[
0
]))
+
"."
+
itod
(
uint
(
p4
[
1
]))
+
"."
+
itod
(
uint
(
p4
[
2
]))
+
"."
+
itod
(
uint
(
p4
[
3
]));
}
if
len
(
p
)
!=
IPv6len
{
return
"?"
return
"?"
;
}
// Find longest run of zeros.
e0
:=
-
1
;
e1
:=
-
1
;
for
i
:=
0
;
i
<
16
;
i
+=
2
{
for
i
:=
0
;
i
<
16
;
i
+=
2
{
j
:=
i
;
for
j
<
16
&&
p
[
j
]
==
0
&&
p
[
j
+
1
]
==
0
{
j
+=
2
j
+=
2
;
}
if
j
>
i
&&
j
-
i
>
e1
-
e0
{
if
j
>
i
&&
j
-
i
>
e1
-
e0
{
e0
=
i
;
e1
=
j
e1
=
j
;
}
}
...
...
@@ -216,14 +216,14 @@ func (ip IP) String() string {
s
+=
"::"
;
i
=
e1
;
if
i
>=
16
{
break
break
;
}
}
else
if
i
>
0
{
s
+=
":"
s
+=
":"
;
}
s
+=
itox
((
uint
(
p
[
i
])
<<
8
)
|
uint
(
p
[
i
+
1
]))
s
+=
itox
((
uint
(
p
[
i
])
<<
8
)
|
uint
(
p
[
i
+
1
]));
}
return
s
return
s
;
}
// If mask is a sequence of 1 bits followed by 0 bits,
...
...
@@ -232,24 +232,24 @@ func simpleMaskLength(mask IPMask) int {
var
i
int
;
for
i
=
0
;
i
<
len
(
mask
);
i
++
{
if
mask
[
i
]
!=
0xFF
{
break
break
;
}
}
n
:=
8
*
i
;
v
:=
mask
[
i
];
for
v
&
0x80
!=
0
{
for
v
&
0x80
!=
0
{
n
++
;
v
<<=
1
v
<<=
1
;
}
if
v
!=
0
{
return
-
1
return
-
1
;
}
for
i
++
;
i
<
len
(
mask
);
i
++
{
if
mask
[
i
]
!=
0
{
return
-
1
return
-
1
;
}
}
return
n
return
n
;
}
// String returns the string representation of mask.
...
...
@@ -262,12 +262,12 @@ func (mask IPMask) String() string {
case
4
:
n
:=
simpleMaskLength
(
mask
);
if
n
>=
0
{
return
itod
(
uint
(
n
+
(
IPv6len
-
IPv4len
)
*
8
))
return
itod
(
uint
(
n
+
(
IPv6len
-
IPv4len
)
*
8
));
}
case
16
:
n
:=
simpleMaskLength
(
mask
);
if
n
>=
0
{
return
itod
(
uint
(
n
))
return
itod
(
uint
(
n
))
;
}
}
return
IP
(
mask
)
.
String
();
...
...
@@ -280,24 +280,24 @@ func parseIPv4(s string) IP {
for
j
:=
0
;
j
<
IPv4len
;
j
++
{
if
j
>
0
{
if
s
[
i
]
!=
'.'
{
return
nil
return
nil
;
}
i
++
;
}
var
(
n
int
;
ok
bool
ok
bool
;
)
n
,
i
,
ok
=
dtoi
(
s
,
i
);
if
!
ok
||
n
>
0xFF
{
return
nil
return
nil
;
}
p
[
j
]
=
byte
(
n
)
p
[
j
]
=
byte
(
n
)
;
}
if
i
!=
len
(
s
)
{
return
nil
return
nil
;
}
return
IPv4
(
p
[
0
],
p
[
1
],
p
[
2
],
p
[
3
])
return
IPv4
(
p
[
0
],
p
[
1
],
p
[
2
],
p
[
3
])
;
}
// Parse IPv6 address. Many forms.
...
...
@@ -319,7 +319,7 @@ func parseIPv6(s string) IP {
i
=
2
;
// Might be only ellipsis
if
i
==
len
(
s
)
{
return
p
return
p
;
}
}
...
...
@@ -329,22 +329,22 @@ L: for j < IPv6len {
// Hex number.
n
,
i1
,
ok
:=
xtoi
(
s
,
i
);
if
!
ok
||
n
>
0xFFFF
{
return
nil
return
nil
;
}
// If followed by dot, might be in trailing IPv4.
if
i1
<
len
(
s
)
&&
s
[
i1
]
==
'.'
{
if
ellipsis
<
0
&&
j
!=
IPv6len
-
IPv4len
{
if
ellipsis
<
0
&&
j
!=
IPv6len
-
IPv4len
{
// Not the right place.
return
nil
return
nil
;
}
if
j
+
IPv4len
>
IPv6len
{
// Not enough room.
return
nil
return
nil
;
}
p4
:=
parseIPv4
(
s
[
i
:
len
(
s
)]);
if
p4
==
nil
{
return
nil
return
nil
;
}
p
[
j
]
=
p4
[
12
];
p
[
j
+
1
]
=
p4
[
13
];
...
...
@@ -352,7 +352,7 @@ L: for j < IPv6len {
p
[
j
+
3
]
=
p4
[
15
];
i
=
len
(
s
);
j
+=
4
;
break
break
;
}
// Save this 16-bit chunk.
...
...
@@ -363,46 +363,46 @@ L: for j < IPv6len {
// Stop at end of string.
i
=
i1
;
if
i
==
len
(
s
)
{
break
break
;
}
// Otherwise must be followed by colon and more.
if
s
[
i
]
!=
':'
&&
i
+
1
==
len
(
s
)
{
return
nil
return
nil
;
}
i
++
;
// Look for ellipsis.
if
s
[
i
]
==
':'
{
if
ellipsis
>=
0
{
// already have one
return
nil
return
nil
;
}
ellipsis
=
j
;
if
i
++
;
i
==
len
(
s
)
{
// can be at end
break
break
;
}
}
}
// Must have used entire string.
if
i
!=
len
(
s
)
{
return
nil
return
nil
;
}
// If didn't parse enough, expand ellipsis.
if
j
<
IPv6len
{
if
ellipsis
<
0
{
return
nil
return
nil
;
}
n
:=
IPv6len
-
j
;
n
:=
IPv6len
-
j
;
for
k
:=
j
-
1
;
k
>=
ellipsis
;
k
--
{
p
[
k
+
n
]
=
p
[
k
]
p
[
k
+
n
]
=
p
[
k
]
;
}
for
k
:=
ellipsis
+
n
-
1
;
k
>=
ellipsis
;
k
--
{
p
[
k
]
=
0
for
k
:=
ellipsis
+
n
-
1
;
k
>=
ellipsis
;
k
--
{
p
[
k
]
=
0
;
}
}
return
p
return
p
;
}
// ParseIP parses s as an IP address, returning the result.
...
...
@@ -413,8 +413,7 @@ L: for j < IPv6len {
func
ParseIP
(
s
string
)
IP
{
p
:=
parseIPv4
(
s
);
if
p
!=
nil
{
return
p
return
p
;
}
return
parseIPv6
(
s
)
return
parseIPv6
(
s
)
;
}
src/pkg/net/ip_test.go
View file @
5d377054
...
...
@@ -5,28 +5,29 @@
package
net
import
(
"testing"
"testing"
;
)
func
isEqual
(
a
,
b
IP
)
bool
{
if
a
==
nil
&&
b
==
nil
{
return
true
return
true
;
}
if
a
==
nil
||
b
==
nil
||
len
(
a
)
!=
len
(
b
)
{
return
false
return
false
;
}
for
i
:=
0
;
i
<
len
(
a
);
i
++
{
if
a
[
i
]
!=
b
[
i
]
{
return
false
return
false
;
}
}
return
true
return
true
;
}
type
parseIPTest
struct
{
in
string
;
out
IP
;
}
var
parseiptests
=
[]
parseIPTest
{
parseIPTest
{
"127.0.1.2"
,
IPv4
(
127
,
0
,
1
,
2
)},
parseIPTest
{
"127.0.0.1"
,
IPv4
(
127
,
0
,
0
,
1
)},
...
...
@@ -34,8 +35,10 @@ var parseiptests = []parseIPTest{
parseIPTest
{
"abc"
,
nil
},
parseIPTest
{
"::ffff:127.0.0.1"
,
IPv4
(
127
,
0
,
0
,
1
)},
parseIPTest
{
"2001:4860:0:2001::68"
,
IP
{
0x20
,
0x01
,
0x48
,
0x60
,
0
,
0
,
0x20
,
0x01
,
0
,
0
,
0
,
0
,
0
,
0
,
0x00
,
0x68
}},
IP
{
0x20
,
0x01
,
0x48
,
0x60
,
0
,
0
,
0x20
,
0x01
,
0
,
0
,
0
,
0
,
0
,
0
,
0x00
,
0x68
,
},
},
parseIPTest
{
"::ffff:4a7d:1363"
,
IPv4
(
74
,
125
,
19
,
99
)},
}
...
...
src/pkg/net/ipsock.go
View file @
5d377054
...
...
@@ -20,9 +20,9 @@ import (
func
kernelSupportsIPv6
()
bool
{
fd
,
e
:=
syscall
.
Socket
(
syscall
.
AF_INET6
,
syscall
.
SOCK_STREAM
,
syscall
.
IPPROTO_TCP
);
if
fd
>=
0
{
syscall
.
Close
(
fd
)
syscall
.
Close
(
fd
)
;
}
return
e
==
0
return
e
==
0
;
}
var
preferIPv4
=
!
kernelSupportsIPv6
()
...
...
@@ -31,7 +31,7 @@ var preferIPv4 = !kernelSupportsIPv6()
// /proc/sys/net/core/somaxconn,
// to take advantage of kernels that have raised the limit.
func
listenBacklog
()
int
{
return
syscall
.
SOMAXCONN
return
syscall
.
SOMAXCONN
;
}
// Internet sockets (TCP, UDP)
...
...
@@ -50,7 +50,7 @@ func internetSocket(net string, laddr, raddr sockaddr, proto int, mode string, t
family
:=
syscall
.
AF_INET6
;
switch
net
[
len
(
net
)
-
1
]
{
case
'4'
:
family
=
syscall
.
AF_INET
family
=
syscall
.
AF_INET
;
case
'6'
:
// nothing to do
default
:
...
...
@@ -114,7 +114,7 @@ func ipToSockaddr(family int, ip IP, port int) (syscall.Sockaddr, os.Error) {
ip
=
IPv4zero
;
}
if
ip
=
ip
.
To4
();
ip
==
nil
{
return
nil
,
os
.
EINVAL
return
nil
,
os
.
EINVAL
;
}
s
:=
new
(
syscall
.
SockaddrInet4
);
for
i
:=
0
;
i
<
IPv4len
;
i
++
{
...
...
@@ -133,7 +133,7 @@ func ipToSockaddr(family int, ip IP, port int) (syscall.Sockaddr, os.Error) {
ip
=
IPzero
;
}
if
ip
=
ip
.
To16
();
ip
==
nil
{
return
nil
,
os
.
EINVAL
return
nil
,
os
.
EINVAL
;
}
s
:=
new
(
syscall
.
SockaddrInet6
);
for
i
:=
0
;
i
<
IPv6len
;
i
++
{
...
...
@@ -155,11 +155,11 @@ func splitHostPort(hostport string) (host, port string, err os.Error) {
return
;
}
host
,
port
=
hostport
[
0
:
i
],
hostport
[
i
+
1
:
len
(
hostport
)];
host
,
port
=
hostport
[
0
:
i
],
hostport
[
i
+
1
:
len
(
hostport
)];
// Can put brackets around host ...
if
len
(
host
)
>
0
&&
host
[
0
]
==
'['
&&
host
[
len
(
host
)
-
1
]
==
']'
{
host
=
host
[
1
:
len
(
host
)
-
1
]
host
=
host
[
1
:
len
(
host
)
-
1
];
}
else
{
// ... but if there are no brackets, no colons.
if
byteIndex
(
host
,
':'
)
>=
0
{
...
...
@@ -175,9 +175,9 @@ func splitHostPort(hostport string) (host, port string, err os.Error) {
func
joinHostPort
(
host
,
port
string
)
string
{
// If host has colons, have to bracket it.
if
byteIndex
(
host
,
':'
)
>=
0
{
return
"["
+
host
+
"]:"
+
port
return
"["
+
host
+
"]:"
+
port
;
}
return
host
+
":"
+
port
return
host
+
":"
+
port
;
}
// Convert "host:port" into IP address and port.
...
...
@@ -224,4 +224,3 @@ func hostPortToIP(net, hostport string) (ip IP, iport int, err os.Error) {
Error
:
return
nil
,
0
,
err
;
}
src/pkg/net/net.go
View file @
5d377054
...
...
@@ -265,7 +265,7 @@ func (e *AddrError) String() string {
}
type
UnknownNetworkError
string
func
(
e
UnknownNetworkError
)
String
()
string
{
return
"unknown network "
+
string
(
e
);
}
src/pkg/net/net_test.go
View file @
5d377054
...
...
@@ -16,7 +16,7 @@ type DialErrorTest struct {
Pattern
string
;
}
var
dialErrorTests
=
[]
DialErrorTest
{
var
dialErrorTests
=
[]
DialErrorTest
{
DialErrorTest
{
"datakit"
,
""
,
"mh/astro/r70"
,
"dial datakit mh/astro/r70: unknown network datakit"
,
...
...
src/pkg/net/parse.go
View file @
5d377054
...
...
@@ -18,7 +18,7 @@ type file struct {
}
func
(
f
*
file
)
close
()
{
f
.
file
.
Close
()
f
.
file
.
Close
()
;
}
func
(
f
*
file
)
getLineFromData
()
(
s
string
,
ok
bool
)
{
...
...
@@ -29,30 +29,30 @@ func (f *file) getLineFromData() (s string, ok bool) {
ok
=
true
;
// move data
i
++
;
n
:=
len
(
data
)
-
i
;
n
:=
len
(
data
)
-
i
;
for
j
:=
0
;
j
<
n
;
j
++
{
data
[
j
]
=
data
[
i
+
j
];
}
f
.
data
=
data
[
0
:
n
];
return
return
;
}
}
return
return
;
}
func
(
f
*
file
)
readLine
()
(
s
string
,
ok
bool
)
{
if
s
,
ok
=
f
.
getLineFromData
();
ok
{
return
return
;
}
if
len
(
f
.
data
)
<
cap
(
f
.
data
)
{
ln
:=
len
(
f
.
data
);
n
,
_
:=
io
.
ReadFull
(
f
.
file
,
f
.
data
[
ln
:
cap
(
f
.
data
)]);
if
n
>=
0
{
f
.
data
=
f
.
data
[
0
:
ln
+
n
];
f
.
data
=
f
.
data
[
0
:
ln
+
n
];
}
}
s
,
ok
=
f
.
getLineFromData
();
return
return
;
}
func
open
(
name
string
)
(
*
file
,
os
.
Error
)
{
...
...
@@ -66,10 +66,10 @@ func open(name string) (*file, os.Error) {
func
byteIndex
(
s
string
,
c
byte
)
int
{
for
i
:=
0
;
i
<
len
(
s
);
i
++
{
if
s
[
i
]
==
c
{
return
i
return
i
;
}
}
return
-
1
return
-
1
;
}
// Count occurrences in s of any bytes in t.
...
...
@@ -80,12 +80,12 @@ func countAnyByte(s string, t string) int {
n
++
;
}
}
return
n
return
n
;
}
// Split s at any bytes in t.
func
splitAtBytes
(
s
string
,
t
string
)
[]
string
{
a
:=
make
([]
string
,
1
+
countAnyByte
(
s
,
t
));
a
:=
make
([]
string
,
1
+
countAnyByte
(
s
,
t
));
n
:=
0
;
last
:=
0
;
for
i
:=
0
;
i
<
len
(
s
);
i
++
{
...
...
@@ -116,15 +116,15 @@ const big = 0xFFFFFF
func
dtoi
(
s
string
,
i0
int
)
(
n
int
,
i
int
,
ok
bool
)
{
n
=
0
;
for
i
=
i0
;
i
<
len
(
s
)
&&
'0'
<=
s
[
i
]
&&
s
[
i
]
<=
'9'
;
i
++
{
n
=
n
*
10
+
int
(
s
[
i
]
-
'0'
);
n
=
n
*
10
+
int
(
s
[
i
]
-
'0'
);
if
n
>=
big
{
return
0
,
i
,
false
return
0
,
i
,
false
;
}
}
if
i
==
i0
{
return
0
,
i
,
false
return
0
,
i
,
false
;
}
return
n
,
i
,
true
return
n
,
i
,
true
;
}
// Hexadecimal to integer starting at &s[i0].
...
...
@@ -134,24 +134,24 @@ func xtoi(s string, i0 int) (n int, i int, ok bool) {
for
i
=
i0
;
i
<
len
(
s
);
i
++
{
if
'0'
<=
s
[
i
]
&&
s
[
i
]
<=
'9'
{
n
*=
16
;
n
+=
int
(
s
[
i
]
-
'0'
)
n
+=
int
(
s
[
i
]
-
'0'
);
}
else
if
'a'
<=
s
[
i
]
&&
s
[
i
]
<=
'f'
{
n
*=
16
;
n
+=
int
(
s
[
i
]
-
'a'
)
+
10
n
+=
int
(
s
[
i
]
-
'a'
)
+
10
;
}
else
if
'A'
<=
s
[
i
]
&&
s
[
i
]
<=
'F'
{
n
*=
16
;
n
+=
int
(
s
[
i
]
-
'A'
)
+
10
n
+=
int
(
s
[
i
]
-
'A'
)
+
10
;
}
else
{
break
break
;
}
if
n
>=
big
{
return
0
,
i
,
false
return
0
,
i
,
false
;
}
}
if
i
==
i0
{
return
0
,
i
,
false
return
0
,
i
,
false
;
}
return
n
,
i
,
true
return
n
,
i
,
true
;
}
// Integer to decimal.
...
...
src/pkg/net/parse_test.go
View file @
5d377054
...
...
@@ -30,7 +30,7 @@ func TestReadLine(t *testing.T) {
for
{
bline
,
berr
:=
br
.
ReadString
(
'\n'
);
if
n
:=
len
(
bline
);
n
>
0
{
bline
=
bline
[
0
:
n
-
1
];
bline
=
bline
[
0
:
n
-
1
];
}
line
,
ok
:=
file
.
readLine
();
if
(
berr
!=
nil
)
!=
!
ok
||
bline
!=
line
{
...
...
@@ -38,9 +38,9 @@ func TestReadLine(t *testing.T) {
filename
,
lineno
,
byteno
,
bline
,
berr
,
line
,
ok
);
}
if
!
ok
{
break
break
;
}
lineno
++
;
byteno
+=
len
(
line
)
+
1
;
byteno
+=
len
(
line
)
+
1
;
}
}
src/pkg/net/port.go
View file @
5d377054
...
...
@@ -11,11 +11,11 @@ import (
"os"
;
)
var
services
map
[
string
]
map
[
string
]
int
var
services
map
[
string
]
map
[
string
]
int
var
servicesError
os
.
Error
func
readServices
()
{
services
=
make
(
map
[
string
]
map
[
string
]
int
);
services
=
make
(
map
[
string
]
map
[
string
]
int
);
var
file
*
file
;
file
,
servicesError
=
open
(
"/etc/services"
);
for
line
,
ok
:=
file
.
readLine
();
ok
;
line
,
ok
=
file
.
readLine
()
{
...
...
@@ -30,12 +30,12 @@ func readServices() {
portnet
:=
f
[
1
];
// "tcp/80"
port
,
j
,
ok
:=
dtoi
(
portnet
,
0
);
if
!
ok
||
port
<=
0
||
j
>=
len
(
portnet
)
||
portnet
[
j
]
!=
'/'
{
continue
continue
;
}
netw
:=
portnet
[
j
+
1
:
len
(
portnet
)];
// "tcp"
netw
:=
portnet
[
j
+
1
:
len
(
portnet
)];
// "tcp"
m
,
ok1
:=
services
[
netw
];
if
!
ok1
{
m
=
make
(
map
[
string
]
int
);
m
=
make
(
map
[
string
]
int
);
services
[
netw
]
=
m
;
}
for
i
:=
0
;
i
<
len
(
f
);
i
++
{
...
...
@@ -63,5 +63,5 @@ func LookupPort(network, service string) (port int, err os.Error) {
return
;
}
}
return
0
,
&
AddrError
{
"unknown port"
,
network
+
"/"
+
service
};
return
0
,
&
AddrError
{
"unknown port"
,
network
+
"/"
+
service
};
}
src/pkg/net/port_test.go
View file @
5d377054
...
...
@@ -15,36 +15,36 @@ type portTest struct {
ok
bool
;
}
var
porttests
=
[]
portTest
{
portTest
{
"tcp"
,
"echo"
,
7
,
true
},
portTest
{
"tcp"
,
"discard"
,
9
,
true
},
portTest
{
"tcp"
,
"systat"
,
11
,
true
},
portTest
{
"tcp"
,
"daytime"
,
13
,
true
},
portTest
{
"tcp"
,
"chargen"
,
19
,
true
},
portTest
{
"tcp"
,
"ftp-data"
,
20
,
true
},
portTest
{
"tcp"
,
"ftp"
,
21
,
true
},
portTest
{
"tcp"
,
"ssh"
,
22
,
true
},
portTest
{
"tcp"
,
"telnet"
,
23
,
true
},
portTest
{
"tcp"
,
"smtp"
,
25
,
true
},
portTest
{
"tcp"
,
"time"
,
37
,
true
},
portTest
{
"tcp"
,
"domain"
,
53
,
true
},
portTest
{
"tcp"
,
"gopher"
,
70
,
true
},
portTest
{
"tcp"
,
"finger"
,
79
,
true
},
portTest
{
"tcp"
,
"http"
,
80
,
true
},
var
porttests
=
[]
portTest
{
portTest
{
"tcp"
,
"echo"
,
7
,
true
},
portTest
{
"tcp"
,
"discard"
,
9
,
true
},
portTest
{
"tcp"
,
"systat"
,
11
,
true
},
portTest
{
"tcp"
,
"daytime"
,
13
,
true
},
portTest
{
"tcp"
,
"chargen"
,
19
,
true
},
portTest
{
"tcp"
,
"ftp-data"
,
20
,
true
},
portTest
{
"tcp"
,
"ftp"
,
21
,
true
},
portTest
{
"tcp"
,
"ssh"
,
22
,
true
},
portTest
{
"tcp"
,
"telnet"
,
23
,
true
},
portTest
{
"tcp"
,
"smtp"
,
25
,
true
},
portTest
{
"tcp"
,
"time"
,
37
,
true
},
portTest
{
"tcp"
,
"domain"
,
53
,
true
},
portTest
{
"tcp"
,
"gopher"
,
70
,
true
},
portTest
{
"tcp"
,
"finger"
,
79
,
true
},
portTest
{
"tcp"
,
"http"
,
80
,
true
},
portTest
{
"udp"
,
"echo"
,
7
,
true
},
portTest
{
"udp"
,
"tacacs"
,
49
,
true
},
portTest
{
"udp"
,
"tftp"
,
69
,
true
},
portTest
{
"udp"
,
"bootpc"
,
68
,
true
},
portTest
{
"udp"
,
"bootps"
,
67
,
true
},
portTest
{
"udp"
,
"domain"
,
53
,
true
},
portTest
{
"udp"
,
"ntp"
,
123
,
true
},
portTest
{
"udp"
,
"snmp"
,
161
,
true
},
portTest
{
"udp"
,
"syslog"
,
514
,
true
},
portTest
{
"udp"
,
"nfs"
,
2049
,
true
},
portTest
{
"udp"
,
"echo"
,
7
,
true
},
portTest
{
"udp"
,
"tacacs"
,
49
,
true
},
portTest
{
"udp"
,
"tftp"
,
69
,
true
},
portTest
{
"udp"
,
"bootpc"
,
68
,
true
},
portTest
{
"udp"
,
"bootps"
,
67
,
true
},
portTest
{
"udp"
,
"domain"
,
53
,
true
},
portTest
{
"udp"
,
"ntp"
,
123
,
true
},
portTest
{
"udp"
,
"snmp"
,
161
,
true
},
portTest
{
"udp"
,
"syslog"
,
514
,
true
},
portTest
{
"udp"
,
"nfs"
,
2049
,
true
},
portTest
{
"--badnet--"
,
"zzz"
,
0
,
false
},
portTest
{
"tcp"
,
"--badport--"
,
0
,
false
},
portTest
{
"--badnet--"
,
"zzz"
,
0
,
false
},
portTest
{
"tcp"
,
"--badport--"
,
0
,
false
},
}
func
TestLookupPort
(
t
*
testing
.
T
)
{
...
...
src/pkg/net/server_test.go
View file @
5d377054
...
...
@@ -20,9 +20,9 @@ func runEcho(fd io.ReadWriter, done chan<- int) {
if
err
!=
nil
||
n
==
0
{
break
;
}
fd
.
Write
(
buf
[
0
:
n
])
fd
.
Write
(
buf
[
0
:
n
])
;
}
done
<-
1
done
<-
1
;
}
func
runServe
(
t
*
testing
.
T
,
network
,
addr
string
,
listening
chan
<-
string
,
done
chan
<-
int
)
{
...
...
@@ -42,13 +42,13 @@ func runServe(t *testing.T, network, addr string, listening chan<- string, done
<-
echodone
;
// make sure Echo stops
l
.
Close
();
}
done
<-
1
done
<-
1
;
}
func
connect
(
t
*
testing
.
T
,
network
,
addr
string
)
{
var
laddr
string
;
if
network
==
"unixgram"
{
laddr
=
addr
+
".local"
;
laddr
=
addr
+
".local"
;
}
fd
,
err
:=
Dial
(
network
,
laddr
,
addr
);
if
err
!=
nil
{
...
...
@@ -80,7 +80,7 @@ func doTest(t *testing.T, network, listenaddr, dialaddr string) {
go
runServe
(
t
,
network
,
listenaddr
,
listening
,
done
);
addr
:=
<-
listening
;
// wait for server to start
if
network
==
"tcp"
{
dialaddr
+=
addr
[
strings
.
LastIndex
(
addr
,
":"
)
:
len
(
addr
)];
dialaddr
+=
addr
[
strings
.
LastIndex
(
addr
,
":"
)
:
len
(
addr
)];
}
connect
(
t
,
network
,
dialaddr
);
<-
done
;
// make sure server stopped
...
...
@@ -141,7 +141,7 @@ func doTestPacket(t *testing.T, network, listenaddr, dialaddr string) {
go
runPacket
(
t
,
network
,
listenaddr
,
listening
,
done
);
addr
:=
<-
listening
;
// wait for server to start
if
network
==
"udp"
{
dialaddr
+=
addr
[
strings
.
LastIndex
(
addr
,
":"
)
:
len
(
addr
)];
dialaddr
+=
addr
[
strings
.
LastIndex
(
addr
,
":"
)
:
len
(
addr
)];
}
connect
(
t
,
network
,
dialaddr
);
<-
done
;
// tell server to stop
...
...
src/pkg/net/sock.go
View file @
5d377054
...
...
@@ -15,9 +15,9 @@ import (
// Boolean to int.
func
boolint
(
b
bool
)
int
{
if
b
{
return
1
return
1
;
}
return
0
return
0
;
}
// Generic socket creation.
...
...
@@ -27,7 +27,7 @@ func socket(net string, f, p, t int, la, ra syscall.Sockaddr, toAddr func(syscal
s
,
e
:=
syscall
.
Socket
(
f
,
p
,
t
);
if
e
!=
0
{
syscall
.
ForkLock
.
RUnlock
();
return
nil
,
os
.
Errno
(
e
)
return
nil
,
os
.
Errno
(
e
)
;
}
syscall
.
CloseOnExec
(
s
);
syscall
.
ForkLock
.
RUnlock
();
...
...
@@ -39,7 +39,7 @@ func socket(net string, f, p, t int, la, ra syscall.Sockaddr, toAddr func(syscal
e
=
syscall
.
Bind
(
s
,
la
);
if
e
!=
0
{
syscall
.
Close
(
s
);
return
nil
,
os
.
Errno
(
e
)
return
nil
,
os
.
Errno
(
e
)
;
}
}
...
...
@@ -47,7 +47,7 @@ func socket(net string, f, p, t int, la, ra syscall.Sockaddr, toAddr func(syscal
e
=
syscall
.
Connect
(
s
,
ra
);
if
e
!=
0
{
syscall
.
Close
(
s
);
return
nil
,
os
.
Errno
(
e
)
return
nil
,
os
.
Errno
(
e
)
;
}
}
...
...
@@ -59,10 +59,10 @@ func socket(net string, f, p, t int, la, ra syscall.Sockaddr, toAddr func(syscal
fd
,
err
=
newFD
(
s
,
f
,
p
,
net
,
laddr
,
raddr
);
if
err
!=
nil
{
syscall
.
Close
(
s
);
return
nil
,
err
return
nil
,
err
;
}
return
fd
,
nil
return
fd
,
nil
;
}
func
setsockoptInt
(
fd
,
level
,
opt
int
,
value
int
)
os
.
Error
{
...
...
@@ -94,9 +94,9 @@ func setWriteTimeout(fd *netFD, nsec int64) os.Error {
func
setTimeout
(
fd
*
netFD
,
nsec
int64
)
os
.
Error
{
if
e
:=
setReadTimeout
(
fd
,
nsec
);
e
!=
nil
{
return
e
return
e
;
}
return
setWriteTimeout
(
fd
,
nsec
)
return
setWriteTimeout
(
fd
,
nsec
)
;
}
func
setReuseAddr
(
fd
*
netFD
,
reuse
bool
)
os
.
Error
{
...
...
@@ -105,7 +105,7 @@ func setReuseAddr(fd *netFD, reuse bool) os.Error {
func
bindToDevice
(
fd
*
netFD
,
dev
string
)
os
.
Error
{
// TODO(rsc): call setsockopt with null-terminated string pointer
return
os
.
EINVAL
return
os
.
EINVAL
;
}
func
setDontRoute
(
fd
*
netFD
,
dontroute
bool
)
os
.
Error
{
...
...
@@ -132,8 +132,9 @@ func setLinger(fd *netFD, sec int) os.Error {
type
UnknownSocketError
struct
{
sa
syscall
.
Sockaddr
;
}
func
(
e
*
UnknownSocketError
)
String
()
string
{
return
"unknown socket address type "
+
reflect
.
Typeof
(
e
.
sa
)
.
String
()
return
"unknown socket address type "
+
reflect
.
Typeof
(
e
.
sa
)
.
String
()
;
}
func
sockaddrToString
(
sa
syscall
.
Sockaddr
)
(
name
string
,
err
os
.
Error
)
{
...
...
@@ -148,4 +149,3 @@ func sockaddrToString(sa syscall.Sockaddr) (name string, err os.Error) {
return
""
,
&
UnknownSocketError
{
sa
};
}
src/pkg/net/tcpsock.go
View file @
5d377054
...
...
@@ -78,11 +78,10 @@ type TCPConn struct {
func
newTCPConn
(
fd
*
netFD
)
*
TCPConn
{
c
:=
&
TCPConn
{
fd
};
setsockoptInt
(
fd
.
fd
,
syscall
.
IPPROTO_TCP
,
syscall
.
TCP_NODELAY
,
1
);
return
c
return
c
;
}
func
(
c
*
TCPConn
)
ok
()
bool
{
if
c
==
nil
||
c
.
fd
==
nil
{
panic
()
}
return
c
!=
nil
&&
c
.
fd
!=
nil
;
}
...
...
@@ -94,7 +93,7 @@ if c == nil || c.fd == nil { panic() }
// after a fixed time limit; see SetTimeout and SetReadTimeout.
func
(
c
*
TCPConn
)
Read
(
b
[]
byte
)
(
n
int
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
os
.
EINVAL
return
0
,
os
.
EINVAL
;
}
return
c
.
fd
.
Read
(
b
);
}
...
...
@@ -105,7 +104,7 @@ func (c *TCPConn) Read(b []byte) (n int, err os.Error) {
// after a fixed time limit; see SetTimeout and SetReadTimeout.
func
(
c
*
TCPConn
)
Write
(
b
[]
byte
)
(
n
int
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
os
.
EINVAL
return
0
,
os
.
EINVAL
;
}
return
c
.
fd
.
Write
(
b
);
}
...
...
@@ -113,7 +112,7 @@ func (c *TCPConn) Write(b []byte) (n int, err os.Error) {
// Close closes the TCP connection.
func
(
c
*
TCPConn
)
Close
()
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
err
:=
c
.
fd
.
Close
();
c
.
fd
=
nil
;
...
...
@@ -140,7 +139,7 @@ func (c *TCPConn) RemoteAddr() Addr {
// with the connection.
func
(
c
*
TCPConn
)
SetTimeout
(
nsec
int64
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setTimeout
(
c
.
fd
,
nsec
);
}
...
...
@@ -150,7 +149,7 @@ func (c *TCPConn) SetTimeout(nsec int64) os.Error {
// Setting nsec == 0 (the default) disables the deadline.
func
(
c
*
TCPConn
)
SetReadTimeout
(
nsec
int64
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setReadTimeout
(
c
.
fd
,
nsec
);
}
...
...
@@ -162,7 +161,7 @@ func (c *TCPConn) SetReadTimeout(nsec int64) os.Error {
// some of the data was successfully written.
func
(
c
*
TCPConn
)
SetWriteTimeout
(
nsec
int64
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setWriteTimeout
(
c
.
fd
,
nsec
);
}
...
...
@@ -171,7 +170,7 @@ func (c *TCPConn) SetWriteTimeout(nsec int64) os.Error {
// receive buffer associated with the connection.
func
(
c
*
TCPConn
)
SetReadBuffer
(
bytes
int
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setReadBuffer
(
c
.
fd
,
bytes
);
}
...
...
@@ -180,7 +179,7 @@ func (c *TCPConn) SetReadBuffer(bytes int) os.Error {
// transmit buffer associated with the connection.
func
(
c
*
TCPConn
)
SetWriteBuffer
(
bytes
int
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setWriteBuffer
(
c
.
fd
,
bytes
);
}
...
...
@@ -198,7 +197,7 @@ func (c *TCPConn) SetWriteBuffer(bytes int) os.Error {
// data to be sent and acknowledged.
func
(
c
*
TCPConn
)
SetLinger
(
sec
int
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setLinger
(
c
.
fd
,
sec
);
}
...
...
@@ -207,7 +206,7 @@ func (c *TCPConn) SetLinger(sec int) os.Error {
// keepalive messages on the connection.
func
(
c
*
TCPConn
)
SetKeepAlive
(
keepalive
bool
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setKeepAlive
(
c
.
fd
,
keepalive
);
}
...
...
@@ -216,13 +215,13 @@ func (c *TCPConn) SetKeepAlive(keepalive bool) os.Error {
// and returns a TCPConn structure.
func
DialTCP
(
net
string
,
laddr
,
raddr
*
TCPAddr
)
(
c
*
TCPConn
,
err
os
.
Error
)
{
if
raddr
==
nil
{
return
nil
,
&
OpError
{
"dial"
,
"tcp"
,
nil
,
errMissingAddress
}
return
nil
,
&
OpError
{
"dial"
,
"tcp"
,
nil
,
errMissingAddress
}
;
}
fd
,
e
:=
internetSocket
(
net
,
laddr
.
toAddr
(),
raddr
.
toAddr
(),
syscall
.
SOCK_STREAM
,
"dial"
,
sockaddrToTCP
);
if
e
!=
nil
{
return
nil
,
e
return
nil
,
e
;
}
return
newTCPConn
(
fd
),
nil
return
newTCPConn
(
fd
),
nil
;
}
// TCPListener is a TCP network listener.
...
...
@@ -239,7 +238,7 @@ type TCPListener struct {
func
ListenTCP
(
net
string
,
laddr
*
TCPAddr
)
(
l
*
TCPListener
,
err
os
.
Error
)
{
fd
,
err
:=
internetSocket
(
net
,
laddr
.
toAddr
(),
nil
,
syscall
.
SOCK_STREAM
,
"listen"
,
sockaddrToTCP
);
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
;
}
errno
:=
syscall
.
Listen
(
fd
.
fd
,
listenBacklog
());
if
errno
!=
0
{
...
...
@@ -248,20 +247,20 @@ func ListenTCP(net string, laddr *TCPAddr) (l *TCPListener, err os.Error) {
}
l
=
new
(
TCPListener
);
l
.
fd
=
fd
;
return
l
,
nil
return
l
,
nil
;
}
// AcceptTCP accepts the next incoming call and returns the new connection
// and the remote address.
func
(
l
*
TCPListener
)
AcceptTCP
()
(
c
*
TCPConn
,
err
os
.
Error
)
{
if
l
==
nil
||
l
.
fd
==
nil
||
l
.
fd
.
fd
<
0
{
return
nil
,
os
.
EINVAL
return
nil
,
os
.
EINVAL
;
}
fd
,
err
:=
l
.
fd
.
accept
(
sockaddrToTCP
);
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
;
}
return
newTCPConn
(
fd
),
nil
return
newTCPConn
(
fd
),
nil
;
}
// Accept implements the Accept method in the Listener interface;
...
...
@@ -269,7 +268,7 @@ func (l *TCPListener) AcceptTCP() (c *TCPConn, err os.Error) {
func
(
l
*
TCPListener
)
Accept
()
(
c
Conn
,
err
os
.
Error
)
{
c1
,
err
:=
l
.
AcceptTCP
();
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
;
}
return
c1
,
nil
;
}
...
...
@@ -278,9 +277,9 @@ func (l *TCPListener) Accept() (c Conn, err os.Error) {
// Already Accepted connections are not closed.
func
(
l
*
TCPListener
)
Close
()
os
.
Error
{
if
l
==
nil
||
l
.
fd
==
nil
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
l
.
fd
.
Close
()
return
l
.
fd
.
Close
()
;
}
// Addr returns the listener's network address, a *TCPAddr.
...
...
src/pkg/net/timeout_test.go
View file @
5d377054
...
...
@@ -23,8 +23,8 @@ func testTimeout(t *testing.T, network, addr string) {
if
n
!=
0
||
!
isEAGAIN
(
err1
)
{
t
.
Errorf
(
"fd.Read on %s %s did not return 0, EAGAIN: %v, %v"
,
network
,
addr
,
n
,
err1
);
}
if
t1
-
t0
<
0.5e8
||
t1
-
t0
>
1.5e8
{
t
.
Errorf
(
"fd.Read on %s %s took %f seconds, expected 0.1"
,
network
,
addr
,
float64
(
t1
-
t0
)
/
1e9
);
if
t1
-
t0
<
0.5e8
||
t1
-
t0
>
1.5e8
{
t
.
Errorf
(
"fd.Read on %s %s took %f seconds, expected 0.1"
,
network
,
addr
,
float64
(
t1
-
t0
)
/
1e9
);
}
}
...
...
src/pkg/net/udpsock.go
View file @
5d377054
...
...
@@ -94,7 +94,7 @@ func (c *UDPConn) ok() bool {
// after a fixed time limit; see SetTimeout and SetReadTimeout.
func
(
c
*
UDPConn
)
Read
(
b
[]
byte
)
(
n
int
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
os
.
EINVAL
return
0
,
os
.
EINVAL
;
}
return
c
.
fd
.
Read
(
b
);
}
...
...
@@ -105,7 +105,7 @@ func (c *UDPConn) Read(b []byte) (n int, err os.Error) {
// after a fixed time limit; see SetTimeout and SetReadTimeout.
func
(
c
*
UDPConn
)
Write
(
b
[]
byte
)
(
n
int
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
os
.
EINVAL
return
0
,
os
.
EINVAL
;
}
return
c
.
fd
.
Write
(
b
);
}
...
...
@@ -113,7 +113,7 @@ func (c *UDPConn) Write(b []byte) (n int, err os.Error) {
// Close closes the UDP connection.
func
(
c
*
UDPConn
)
Close
()
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
err
:=
c
.
fd
.
Close
();
c
.
fd
=
nil
;
...
...
@@ -140,7 +140,7 @@ func (c *UDPConn) RemoteAddr() Addr {
// with the connection.
func
(
c
*
UDPConn
)
SetTimeout
(
nsec
int64
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setTimeout
(
c
.
fd
,
nsec
);
}
...
...
@@ -150,7 +150,7 @@ func (c *UDPConn) SetTimeout(nsec int64) os.Error {
// Setting nsec == 0 (the default) disables the deadline.
func
(
c
*
UDPConn
)
SetReadTimeout
(
nsec
int64
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setReadTimeout
(
c
.
fd
,
nsec
);
}
...
...
@@ -162,7 +162,7 @@ func (c *UDPConn) SetReadTimeout(nsec int64) os.Error {
// some of the data was successfully written.
func
(
c
*
UDPConn
)
SetWriteTimeout
(
nsec
int64
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setWriteTimeout
(
c
.
fd
,
nsec
);
}
...
...
@@ -171,7 +171,7 @@ func (c *UDPConn) SetWriteTimeout(nsec int64) os.Error {
// receive buffer associated with the connection.
func
(
c
*
UDPConn
)
SetReadBuffer
(
bytes
int
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setReadBuffer
(
c
.
fd
,
bytes
);
}
...
...
@@ -180,7 +180,7 @@ func (c *UDPConn) SetReadBuffer(bytes int) os.Error {
// transmit buffer associated with the connection.
func
(
c
*
UDPConn
)
SetWriteBuffer
(
bytes
int
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setWriteBuffer
(
c
.
fd
,
bytes
);
}
...
...
@@ -195,7 +195,7 @@ func (c *UDPConn) SetWriteBuffer(bytes int) os.Error {
// after a fixed time limit; see SetTimeout and SetReadTimeout.
func
(
c
*
UDPConn
)
ReadFromUDP
(
b
[]
byte
)
(
n
int
,
addr
*
UDPAddr
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
nil
,
os
.
EINVAL
return
0
,
nil
,
os
.
EINVAL
;
}
n
,
sa
,
errno
:=
syscall
.
Recvfrom
(
c
.
fd
.
fd
,
b
,
0
);
if
errno
!=
0
{
...
...
@@ -218,7 +218,7 @@ func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err os.Error) {
// after a fixed time limit; see SetTimeout and SetReadTimeout.
func
(
c
*
UDPConn
)
ReadFrom
(
b
[]
byte
)
(
n
int
,
addr
Addr
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
nil
,
os
.
EINVAL
return
0
,
nil
,
os
.
EINVAL
;
}
n
,
uaddr
,
err
:=
c
.
ReadFromUDP
(
b
);
return
n
,
uaddr
.
toAddr
(),
err
;
...
...
@@ -231,7 +231,7 @@ func (c *UDPConn) ReadFrom(b []byte) (n int, addr Addr, err os.Error) {
// On packet-oriented connections such as UDP, write timeouts are rare.
func
(
c
*
UDPConn
)
WriteToUDP
(
b
[]
byte
,
addr
*
UDPAddr
)
(
n
int
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
os
.
EINVAL
return
0
,
os
.
EINVAL
;
}
sa
,
err
:=
addr
.
sockaddr
(
c
.
fd
.
family
);
if
err
!=
nil
{
...
...
@@ -250,7 +250,7 @@ func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (n int, err os.Error) {
// On packet-oriented connections such as UDP, write timeouts are rare.
func
(
c
*
UDPConn
)
WriteTo
(
b
[]
byte
,
addr
Addr
)
(
n
int
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
os
.
EINVAL
return
0
,
os
.
EINVAL
;
}
a
,
ok
:=
addr
.
(
*
UDPAddr
);
if
!
ok
{
...
...
@@ -266,16 +266,16 @@ func DialUDP(net string, laddr, raddr *UDPAddr) (c *UDPConn, err os.Error) {
switch
net
{
case
"udp"
,
"udp4"
,
"udp6"
:
default
:
return
nil
,
UnknownNetworkError
(
net
)
return
nil
,
UnknownNetworkError
(
net
)
;
}
if
raddr
==
nil
{
return
nil
,
&
OpError
{
"dial"
,
"udp"
,
nil
,
errMissingAddress
}
return
nil
,
&
OpError
{
"dial"
,
"udp"
,
nil
,
errMissingAddress
}
;
}
fd
,
e
:=
internetSocket
(
net
,
laddr
.
toAddr
(),
raddr
.
toAddr
(),
syscall
.
SOCK_DGRAM
,
"dial"
,
sockaddrToUDP
);
if
e
!=
nil
{
return
nil
,
e
return
nil
,
e
;
}
return
newUDPConn
(
fd
),
nil
return
newUDPConn
(
fd
),
nil
;
}
// ListenUDP listens for incoming UDP packets addressed to the
...
...
@@ -286,14 +286,14 @@ func ListenUDP(net string, laddr *UDPAddr) (c *UDPConn, err os.Error) {
switch
net
{
case
"udp"
,
"udp4"
,
"udp6"
:
default
:
return
nil
,
UnknownNetworkError
(
net
)
return
nil
,
UnknownNetworkError
(
net
)
;
}
if
laddr
==
nil
{
return
nil
,
&
OpError
{
"listen"
,
"udp"
,
nil
,
errMissingAddress
}
return
nil
,
&
OpError
{
"listen"
,
"udp"
,
nil
,
errMissingAddress
}
;
}
fd
,
e
:=
internetSocket
(
net
,
laddr
.
toAddr
(),
nil
,
syscall
.
SOCK_DGRAM
,
"dial"
,
sockaddrToUDP
);
if
e
!=
nil
{
return
nil
,
e
return
nil
,
e
;
}
return
newUDPConn
(
fd
),
nil
return
newUDPConn
(
fd
),
nil
;
}
src/pkg/net/unixsock.go
View file @
5d377054
...
...
@@ -34,16 +34,16 @@ func unixSocket(net string, laddr, raddr *UnixAddr, mode string) (fd *netFD, err
if
raddr
!=
nil
{
ra
=
&
syscall
.
SockaddrUnix
{
Name
:
raddr
.
Name
};
}
else
if
proto
!=
syscall
.
SOCK_DGRAM
||
laddr
==
nil
{
return
nil
,
&
OpError
{
mode
,
net
,
nil
,
errMissingAddress
}
return
nil
,
&
OpError
{
mode
,
net
,
nil
,
errMissingAddress
}
;
}
case
"listen"
:
if
laddr
==
nil
{
return
nil
,
&
OpError
{
mode
,
net
,
nil
,
errMissingAddress
}
return
nil
,
&
OpError
{
mode
,
net
,
nil
,
errMissingAddress
}
;
}
la
=
&
syscall
.
SockaddrUnix
{
Name
:
laddr
.
Name
};
if
raddr
!=
nil
{
return
nil
,
&
OpError
{
mode
,
net
,
raddr
,
&
AddrError
{
"unexpected remote address"
,
raddr
.
String
()}}
return
nil
,
&
OpError
{
mode
,
net
,
raddr
,
&
AddrError
{
"unexpected remote address"
,
raddr
.
String
()}}
;
}
}
...
...
@@ -95,7 +95,7 @@ func (a *UnixAddr) Network() string {
func
(
a
*
UnixAddr
)
String
()
string
{
if
a
==
nil
{
return
"<nil>"
return
"<nil>"
;
}
return
a
.
Name
;
}
...
...
@@ -128,7 +128,7 @@ type UnixConn struct {
}
func
newUnixConn
(
fd
*
netFD
)
*
UnixConn
{
return
&
UnixConn
{
fd
}
return
&
UnixConn
{
fd
}
;
}
func
(
c
*
UnixConn
)
ok
()
bool
{
...
...
@@ -143,7 +143,7 @@ func (c *UnixConn) ok() bool {
// after a fixed time limit; see SetTimeout and SetReadTimeout.
func
(
c
*
UnixConn
)
Read
(
b
[]
byte
)
(
n
int
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
os
.
EINVAL
return
0
,
os
.
EINVAL
;
}
return
c
.
fd
.
Read
(
b
);
}
...
...
@@ -154,7 +154,7 @@ func (c *UnixConn) Read(b []byte) (n int, err os.Error) {
// after a fixed time limit; see SetTimeout and SetReadTimeout.
func
(
c
*
UnixConn
)
Write
(
b
[]
byte
)
(
n
int
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
os
.
EINVAL
return
0
,
os
.
EINVAL
;
}
return
c
.
fd
.
Write
(
b
);
}
...
...
@@ -162,7 +162,7 @@ func (c *UnixConn) Write(b []byte) (n int, err os.Error) {
// Close closes the Unix domain connection.
func
(
c
*
UnixConn
)
Close
()
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
err
:=
c
.
fd
.
Close
();
c
.
fd
=
nil
;
...
...
@@ -192,7 +192,7 @@ func (c *UnixConn) RemoteAddr() Addr {
// with the connection.
func
(
c
*
UnixConn
)
SetTimeout
(
nsec
int64
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setTimeout
(
c
.
fd
,
nsec
);
}
...
...
@@ -202,7 +202,7 @@ func (c *UnixConn) SetTimeout(nsec int64) os.Error {
// Setting nsec == 0 (the default) disables the deadline.
func
(
c
*
UnixConn
)
SetReadTimeout
(
nsec
int64
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setReadTimeout
(
c
.
fd
,
nsec
);
}
...
...
@@ -214,7 +214,7 @@ func (c *UnixConn) SetReadTimeout(nsec int64) os.Error {
// some of the data was successfully written.
func
(
c
*
UnixConn
)
SetWriteTimeout
(
nsec
int64
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setWriteTimeout
(
c
.
fd
,
nsec
);
}
...
...
@@ -223,7 +223,7 @@ func (c *UnixConn) SetWriteTimeout(nsec int64) os.Error {
// receive buffer associated with the connection.
func
(
c
*
UnixConn
)
SetReadBuffer
(
bytes
int
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setReadBuffer
(
c
.
fd
,
bytes
);
}
...
...
@@ -232,7 +232,7 @@ func (c *UnixConn) SetReadBuffer(bytes int) os.Error {
// transmit buffer associated with the connection.
func
(
c
*
UnixConn
)
SetWriteBuffer
(
bytes
int
)
os
.
Error
{
if
!
c
.
ok
()
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
return
setWriteBuffer
(
c
.
fd
,
bytes
);
}
...
...
@@ -245,7 +245,7 @@ func (c *UnixConn) SetWriteBuffer(bytes int) os.Error {
// after a fixed time limit; see SetTimeout and SetReadTimeout.
func
(
c
*
UnixConn
)
ReadFromUnix
(
b
[]
byte
)
(
n
int
,
addr
*
UnixAddr
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
nil
,
os
.
EINVAL
return
0
,
nil
,
os
.
EINVAL
;
}
n
,
sa
,
errno
:=
syscall
.
Recvfrom
(
c
.
fd
.
fd
,
b
,
0
);
if
errno
!=
0
{
...
...
@@ -266,7 +266,7 @@ func (c *UnixConn) ReadFromUnix(b []byte) (n int, addr *UnixAddr, err os.Error)
// after a fixed time limit; see SetTimeout and SetReadTimeout.
func
(
c
*
UnixConn
)
ReadFrom
(
b
[]
byte
)
(
n
int
,
addr
Addr
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
nil
,
os
.
EINVAL
return
0
,
nil
,
os
.
EINVAL
;
}
n
,
uaddr
,
err
:=
c
.
ReadFromUnix
(
b
);
return
n
,
uaddr
.
toAddr
(),
err
;
...
...
@@ -279,7 +279,7 @@ func (c *UnixConn) ReadFrom(b []byte) (n int, addr Addr, err os.Error) {
// On packet-oriented connections such as UDP, write timeouts are rare.
func
(
c
*
UnixConn
)
WriteToUnix
(
b
[]
byte
,
addr
*
UnixAddr
)
(
n
int
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
os
.
EINVAL
return
0
,
os
.
EINVAL
;
}
if
addr
.
Datagram
!=
(
c
.
fd
.
proto
==
syscall
.
SOCK_DGRAM
)
{
return
0
,
os
.
EAFNOSUPPORT
;
...
...
@@ -298,7 +298,7 @@ func (c *UnixConn) WriteToUnix(b []byte, addr *UnixAddr) (n int, err os.Error) {
// On packet-oriented connections such as UDP, write timeouts are rare.
func
(
c
*
UnixConn
)
WriteTo
(
b
[]
byte
,
addr
Addr
)
(
n
int
,
err
os
.
Error
)
{
if
!
c
.
ok
()
{
return
0
,
os
.
EINVAL
return
0
,
os
.
EINVAL
;
}
a
,
ok
:=
addr
.
(
*
UnixAddr
);
if
!
ok
{
...
...
@@ -313,7 +313,7 @@ func (c *UnixConn) WriteTo(b []byte, addr Addr) (n int, err os.Error) {
func
DialUnix
(
net
string
,
laddr
,
raddr
*
UnixAddr
)
(
c
*
UnixConn
,
err
os
.
Error
)
{
fd
,
e
:=
unixSocket
(
net
,
laddr
,
raddr
,
"dial"
);
if
e
!=
nil
{
return
nil
,
e
return
nil
,
e
;
}
return
newUnixConn
(
fd
),
nil
;
}
...
...
@@ -354,14 +354,14 @@ func ListenUnix(net string, laddr *UnixAddr) (l *UnixListener, err os.Error) {
// and the remote address.
func
(
l
*
UnixListener
)
AcceptUnix
()
(
c
*
UnixConn
,
err
os
.
Error
)
{
if
l
==
nil
||
l
.
fd
==
nil
||
l
.
fd
.
fd
<
0
{
return
nil
,
os
.
EINVAL
return
nil
,
os
.
EINVAL
;
}
fd
,
e
:=
l
.
fd
.
accept
(
sockaddrToUnix
);
if
e
!=
nil
{
return
nil
,
e
return
nil
,
e
;
}
c
=
newUnixConn
(
fd
);
return
c
,
nil
return
c
,
nil
;
}
// Accept implements the Accept method in the Listener interface;
...
...
@@ -378,7 +378,7 @@ func (l *UnixListener) Accept() (c Conn, err os.Error) {
// Already accepted connections are not closed.
func
(
l
*
UnixListener
)
Close
()
os
.
Error
{
if
l
==
nil
||
l
.
fd
==
nil
{
return
os
.
EINVAL
return
os
.
EINVAL
;
}
// The operating system doesn't clean up
...
...
@@ -412,14 +412,14 @@ func ListenUnixgram(net string, laddr *UnixAddr) (c *UDPConn, err os.Error) {
switch
net
{
case
"unixgram"
:
default
:
return
nil
,
UnknownNetworkError
(
net
)
return
nil
,
UnknownNetworkError
(
net
)
;
}
if
laddr
==
nil
{
return
nil
,
&
OpError
{
"listen"
,
"unixgram"
,
nil
,
errMissingAddress
}
return
nil
,
&
OpError
{
"listen"
,
"unixgram"
,
nil
,
errMissingAddress
}
;
}
fd
,
e
:=
unixSocket
(
net
,
laddr
,
nil
,
"listen"
);
if
e
!=
nil
{
return
nil
,
e
return
nil
,
e
;
}
return
newUDPConn
(
fd
),
nil
return
newUDPConn
(
fd
),
nil
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment