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_irix.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_irix.go')
-rw-r--r-- | libgo/go/syscall/socket_irix.go | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/libgo/go/syscall/socket_irix.go b/libgo/go/syscall/socket_irix.go new file mode 100644 index 00000000000..6f2aaaff4d0 --- /dev/null +++ b/libgo/go/syscall/socket_irix.go @@ -0,0 +1,129 @@ +// socket_irix.go -- Socket handling specific to IRIX 6. + +// Copyright 2011 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 { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +func (sa *RawSockaddrInet4) setLen() Socklen_t { + return SizeofSockaddrInet4 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +func (sa *RawSockaddrInet6) setLen() Socklen_t { + return SizeofSockaddrInet6 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +func (sa *RawSockaddrUnix) setLen(int) { +} + +func (sa *RawSockaddrUnix) getLen() (int, int) { + if sa.Path[0] == 0 { + // "Abstract" Unix domain socket. + // Rewrite leading NUL as @ for textual display. + // (This is the standard convention.) + // Not friendly to overwrite in place, + // but the callers below don't care. + sa.Path[0] = '@' + } + + // Assume path ends at NUL. + // This is not technically the Linux semantics for + // abstract Unix domain sockets--they are supposed + // to be uninterpreted fixed-size binary blobs--but + // everyone uses this convention. + n := 0 + for n < len(sa.Path)-3 && sa.Path[n] != 0 { + n++ + } + + return n, 0 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +// BindToDevice binds the socket associated with fd to device. +func BindToDevice(fd int, device string) (errno int) { + return ENOSYS +} + +// struct ip_mreg is provived in <netinet/in.h>, but protected with _SGIAPI. +// This could be enabled with -D_SGI_SOURCE, but conflicts with +// -D_XOPEN_SOURCE=500 required for msg_control etc. in struct msghgr, so +// simply provide it here. +type IPMreq struct { + Multiaddr [4]byte + Interface [4]byte +} + +// Similarly, <netdb.h> only provides struct addrinfo, AI_* and EAI_* if +// _NO_XOPEN4 && _NO_XOPEN5. +type Addrinfo struct { + Ai_flags int32 + Ai_family int32 + Ai_socktype int32 + Ai_protocol int32 + Ai_addrlen int32 + Ai_canonname *uint8 + Ai_addr *_sockaddr + Ai_next *Addrinfo +} + +const ( + AI_PASSIVE = 0x00000001 + AI_CANONNAME = 0x00000002 + AI_NUMERICHOST = 0x00000004 + AI_NUMERICSERV = 0x00000008 + AI_ALL = 0x00000100 + AI_ADDRCONFIG = 0x00000400 + AI_V4MAPPED = 0x00000800 + AI_DEFAULT = (AI_V4MAPPED | AI_ADDRCONFIG) +) + +const ( + EAI_ADDRFAMILY = 1 + EAI_AGAIN = 2 + EAI_BADFLAGS = 3 + EAI_FAIL = 4 + EAI_FAMILY = 5 + EAI_MEMORY = 6 + EAI_NODATA = 7 + EAI_NONAME = 8 + EAI_SERVICE = 9 + EAI_SOCKTYPE = 10 + EAI_SYSTEM = 11 + EAI_BADHINTS = 12 + EAI_OVERFLOW = 13 + EAI_MAX = 14 +) + +func anyToSockaddrOS(rsa *RawSockaddrAny) (Sockaddr, int) { + return nil, EAFNOSUPPORT; +} |