* gcc.dg/guality/guality.exp: Skip on AIX.
[official-gcc.git] / libgo / go / net / sock_posix.go
blobbe89c26db2a38480383965b4008b5ba13a6d52e5
1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // +build darwin freebsd linux netbsd openbsd windows
7 package net
9 import (
10 "syscall"
11 "time"
14 var listenerBacklog = maxListenerBacklog()
16 // Generic POSIX socket creation.
17 func socket(net string, f, t, p int, ipv6only bool, ulsa, ursa syscall.Sockaddr, deadline time.Time, toAddr func(syscall.Sockaddr) Addr) (fd *netFD, err error) {
18 s, err := sysSocket(f, t, p)
19 if err != nil {
20 return nil, err
23 if err = setDefaultSockopts(s, f, t, ipv6only); err != nil {
24 closesocket(s)
25 return nil, err
28 // This socket is used by a listener.
29 if ulsa != nil && ursa == nil {
30 // We provide a socket that listens to a wildcard
31 // address with reusable UDP port when the given ulsa
32 // is an appropriate UDP multicast address prefix.
33 // This makes it possible for a single UDP listener
34 // to join multiple different group addresses, for
35 // multiple UDP listeners that listen on the same UDP
36 // port to join the same group address.
37 if ulsa, err = listenerSockaddr(s, f, ulsa, toAddr); err != nil {
38 closesocket(s)
39 return nil, err
43 if ulsa != nil {
44 if err = syscall.Bind(s, ulsa); err != nil {
45 closesocket(s)
46 return nil, err
50 if fd, err = newFD(s, f, t, net); err != nil {
51 closesocket(s)
52 return nil, err
55 // This socket is used by a dialer.
56 if ursa != nil {
57 if !deadline.IsZero() {
58 setWriteDeadline(fd, deadline)
60 if err = fd.connect(ulsa, ursa); err != nil {
61 fd.Close()
62 return nil, err
64 fd.isConnected = true
65 if !deadline.IsZero() {
66 setWriteDeadline(fd, time.Time{})
70 lsa, _ := syscall.Getsockname(s)
71 laddr := toAddr(lsa)
72 rsa, _ := syscall.Getpeername(s)
73 if rsa == nil {
74 rsa = ursa
76 raddr := toAddr(rsa)
77 fd.setAddr(laddr, raddr)
78 return fd, nil