1
0
mirror of https://github.com/golang/go synced 2024-10-05 10:31:22 -06:00
go/src/lib/net/net_linux.go

71 lines
1.7 KiB
Go
Raw Normal View History

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package net
import (
"os";
"syscall";
"net"
)
export func IPv4ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
p = ToIPv4(p)
if p == nil || port < 0 || port > 0xFFFF {
return nil, os.EINVAL
}
sa := new(syscall.SockaddrInet4);
sa.family = syscall.AF_INET;
sa.port[0] = byte(port>>8);
sa.port[1] = byte(port);
for i := 0; i < IPv4len; i++ {
sa.addr[i] = p[i]
}
return syscall.SockaddrInet4ToSockaddr(sa), nil
}
export func IPv6ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
p = ToIPv6(p)
if p == nil || port < 0 || port > 0xFFFF {
return nil, os.EINVAL
}
sa := new(syscall.SockaddrInet6);
sa.family = syscall.AF_INET6;
sa.port[0] = byte(port>>8);
sa.port[1] = byte(port);
for i := 0; i < IPv6len; i++ {
sa.addr[i] = p[i]
}
return syscall.SockaddrInet6ToSockaddr(sa), nil
}
export func SockaddrToIP(sa1 *syscall.Sockaddr) (p *[]byte, port int, err *os.Error) {
switch sa1.family {
case syscall.AF_INET:
sa := syscall.SockaddrToSockaddrInet4(sa1);
a := ToIPv6(&sa.addr)
if a == nil {
return nil, 0, os.EINVAL
}
return a, int(sa.port[0])<<8 + int(sa.port[1]), nil
case syscall.AF_INET6:
sa := syscall.SockaddrToSockaddrInet6(sa1);
a := ToIPv6(&sa.addr)
if a == nil {
return nil, 0, os.EINVAL
}
return a, int(sa.port[0])<<8 + int(sa.port[1]), nil
default:
return nil, 0, os.EINVAL
}
return nil, 0, nil // not reached
}
export func ListenBacklog() int64 {
// TODO: Read the limit from /proc/sys/net/core/somaxconn,
// to take advantage of kernels that have raised the limit.
return syscall.SOMAXCONN
}