diff options
author | Ian Lance Taylor <iant@google.com> | 2011-01-21 18:19:03 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-01-21 18:19:03 +0000 |
commit | ff5f50c52c421d75940ef9392211e3ab24d71332 (patch) | |
tree | 27d8768fb1d25696d3c40b42535eb5e073c278da /libgo/syscalls | |
parent | d6ed1c8903e728f4233122554bab5910853338bd (diff) | |
download | gcc-ff5f50c52c421d75940ef9392211e3ab24d71332.zip gcc-ff5f50c52c421d75940ef9392211e3ab24d71332.tar.gz gcc-ff5f50c52c421d75940ef9392211e3ab24d71332.tar.bz2 |
Remove the types float and complex.
Update to current version of Go library.
Update testsuite for removed types.
* go-lang.c (go_langhook_init): Omit float_type_size when calling
go_create_gogo.
* go-c.h: Update declaration of go_create_gogo.
From-SVN: r169098
Diffstat (limited to 'libgo/syscalls')
-rw-r--r-- | libgo/syscalls/socket.go | 97 | ||||
-rw-r--r-- | libgo/syscalls/sysfile_posix.go | 8 |
2 files changed, 105 insertions, 0 deletions
diff --git a/libgo/syscalls/socket.go b/libgo/syscalls/socket.go index bc3ce69..65c1916 100644 --- a/libgo/syscalls/socket.go +++ b/libgo/syscalls/socket.go @@ -146,9 +146,11 @@ func libc_getpeername(fd int, sa *RawSockaddrAny, len *Socklen_t) int __asm__ (" func libc_recv(fd int, buf *byte, len Size_t, flags int) Ssize_t __asm__ ("recv"); func libc_recvfrom(fd int, buf *byte, len Size_t, flags int, from *RawSockaddrAny, fromlen *Socklen_t) Ssize_t __asm__("recvfrom"); +func libc_recvmsg(fd int, msg *Msghdr, flags int) Ssize_t __asm__("recvmsg") func libc_send(fd int, buf *byte, len Size_t, flags int) Ssize_t __asm__("send"); func libc_sendto(fd int, buf *byte, len Size_t, flags int, to *RawSockaddrAny, tolen Socklen_t) Ssize_t __asm__("sendto"); +func libc_sendmsg(fd int, msg *Msghdr, flags int) Ssize_t __asm__("sendmsg") func libc_shutdown(fd int, how int) int __asm__ ("shutdown"); func Accept(fd int) (nfd int, sa Sockaddr, errno int) { @@ -265,6 +267,58 @@ func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, errno int) { return; } +func (iov *Iovec) SetLen(length int) { + iov.Len = Iovec_len_t(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = Msghdr_controllen_t(length) +} + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, errno int) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, errno = recvmsg(fd, &msg, flags); errno != 0 { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != 0 { + from, errno = anyToSockaddr(&rsa) + } + return +} + +func recvmsg(s int, msg *Msghdr, flags int) (n int, errno int) { + r := libc_recvmsg(s, msg, flags) + if r < 0 { + errno = GetErrno() + } else { + n = int(r) + } + return +} + func Sendto(fd int, p []byte, flags int, to Sockaddr) (errno int) { ptr, n, err := to.sockaddr(); if err != 0 { @@ -277,6 +331,49 @@ func Sendto(fd int, p []byte, flags int, to Sockaddr) (errno int) { return; } +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (errno int) { + var ptr *RawSockaddrAny + var nsock Socklen_t + if to != nil { + var err int + ptr, nsock, err = to.sockaddr() + if err != 0 { + return err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(nsock) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if errno = sendmsg(fd, &msg, flags); errno != 0 { + return + } + return +} + +func sendmsg(s int, msg *Msghdr, flags int) (errno int) { + if libc_sendmsg(s, msg, flags) < 0 { + errno = GetErrno() + } + return +} + func Shutdown(fd int, how int) (errno int) { r := libc_shutdown(fd, how); if r < 0 { errno = GetErrno() } diff --git a/libgo/syscalls/sysfile_posix.go b/libgo/syscalls/sysfile_posix.go index 1458bf5..655eb73 100644 --- a/libgo/syscalls/sysfile_posix.go +++ b/libgo/syscalls/sysfile_posix.go @@ -16,6 +16,7 @@ func libc_open(name *byte, mode int, perm Mode_t) int __asm__ ("open"); func libc_close(fd int) int __asm__ ("close"); func libc_read(fd int, buf *byte, count Size_t) Ssize_t __asm__ ("read"); func libc_write(fd int, buf *byte, count Size_t) Ssize_t __asm__ ("write"); +func libc_fsync(fd int) int __asm__ ("fsync") func libc_pipe(filedes *int) int __asm__("pipe"); func libc_stat(name *byte, buf *Stat_t) int __asm__ ("stat"); func libc_fstat(fd int, buf *Stat_t) int __asm__ ("fstat"); @@ -87,6 +88,13 @@ func Write(fd int, p []byte) (n int, errno int) { return; } +func Fsync(fd int) (errno int) { + if libc_fsync(fd) < 0 { + errno = GetErrno() + } + return +} + func Pread(fd int, p []byte, offset int64) (n int, errno int) { var _p0 *byte; if len(p) > 0 { _p0 = &p[0]; } |