diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-23 19:04:37 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-23 19:04:37 +0000 |
commit | d477de419fb666727320c0ce7adabe6ce70dfbfc (patch) | |
tree | 664e8146cf480634282350e5f7f68403941ddfea /libgo/go/syscall/socket_bsd.go | |
parent | c512f3a475837c5f5cd895a8513e3c3c9ba03648 (diff) | |
download | gcc-d477de419fb666727320c0ce7adabe6ce70dfbfc.tar.gz |
Implement new syscall package.
Calls to library functions now use entersyscall and
exitsyscall as appropriate. This is a first step toward
multiplexing goroutines onto threads.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180345 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgo/go/syscall/socket_bsd.go')
-rw-r--r-- | libgo/go/syscall/socket_bsd.go | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/libgo/go/syscall/socket_bsd.go b/libgo/go/syscall/socket_bsd.go new file mode 100644 index 00000000000..735baf98684 --- /dev/null +++ b/libgo/go/syscall/socket_bsd.go @@ -0,0 +1,78 @@ +// socket_bsd.go -- Socket handling specific to *BSD based systems. + +// Copyright 2010 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 syscall + +const SizeofSockaddrInet4 = 16 +const SizeofSockaddrInet6 = 28 +const SizeofSockaddrUnix = 110 + +type RawSockaddrInet4 struct { + Len uint8; + Family uint8; + Port uint16; + Addr [4]byte /* in_addr */; + Zero [8]uint8; +} + +func (sa *RawSockaddrInet4) setLen() Socklen_t { + sa.Len = SizeofSockaddrInet4 + return SizeofSockaddrInet4 +} + +type RawSockaddrInet6 struct { + Len uint8; + Family uint8; + Port uint16; + Flowinfo uint32; + Addr [16]byte /* in6_addr */; + Scope_id uint32; +} + +func (sa *RawSockaddrInet6) setLen() Socklen_t { + sa.Len = SizeofSockaddrInet6 + return SizeofSockaddrInet6 +} + +type RawSockaddrUnix struct { + Len uint8; + Family uint8; + Path [108]int8; +} + +func (sa *RawSockaddrUnix) setLen(n int) { + sa.Len = uint8(3 + n) // 2 for Family, Len; 1 for NUL. +} + +func (sa *RawSockaddrUnix) getLen() (int, int) { + if sa.Len < 3 || sa.Len > SizeofSockaddrUnix { + return 0, EINVAL + } + n := int(sa.Len) - 3 // subtract leading Family, Len, terminating NUL. + for i := 0; i < n; i++ { + if sa.Path[i] == 0 { + // found early NUL; assume Len is overestimating. + n = i + break + } + } + return n, 0 +} + +type RawSockaddr struct { + Len uint8; + Family uint8; + Data [14]int8; +} + +// BindToDevice binds the socket associated with fd to device. +func BindToDevice(fd int, device string) (errno int) { + return ENOSYS +} + +func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, int) { + return nil, EAFNOSUPPORT; +} |