• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2024 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.
4
5//go:build solaris
6
7package unix_test
8
9import (
10	"internal/syscall/unix"
11	"runtime"
12	"syscall"
13	"testing"
14)
15
16func TestSupportSockNonblockCloexec(t *testing.T) {
17	// Test that SupportSockNonblockCloexec returns true if socket succeeds with SOCK_NONBLOCK and SOCK_CLOEXEC.
18	s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM|syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC, 0)
19	if err == nil {
20		syscall.Close(s)
21	}
22	wantSock := err != syscall.EPROTONOSUPPORT && err != syscall.EINVAL
23	gotSock := unix.SupportSockNonblockCloexec()
24	if wantSock != gotSock {
25		t.Fatalf("SupportSockNonblockCloexec, got %t; want %t", gotSock, wantSock)
26	}
27
28	// Test that SupportAccept4 returns true if accept4 is available.
29	for {
30		_, _, err = syscall.Accept4(0, syscall.SOCK_NONBLOCK|syscall.SOCK_CLOEXEC)
31		if err != syscall.EINTR {
32			break
33		}
34	}
35	wantAccept4 := err != syscall.ENOSYS
36	gotAccept4 := unix.SupportAccept4()
37	if wantAccept4 != gotAccept4 {
38		t.Fatalf("SupportAccept4, got %t; want %t", gotAccept4, wantAccept4)
39	}
40
41	// Test that the version returned by KernelVersion matches expectations.
42	major, minor := unix.KernelVersion()
43	t.Logf("Kernel version: %d.%d", major, minor)
44	if runtime.GOOS == "illumos" {
45		if gotSock && gotAccept4 && (major < 5 || (major == 5 && minor < 11)) {
46			t.Fatalf("SupportSockNonblockCloexec and SupportAccept4 are true, but kernel version is older than 5.11, SunOS version: %d.%d", major, minor)
47		}
48		if !gotSock && !gotAccept4 && (major > 5 || (major == 5 && minor >= 11)) {
49			t.Errorf("SupportSockNonblockCloexec and SupportAccept4 are false, but kernel version is 5.11 or newer, SunOS version: %d.%d", major, minor)
50		}
51	} else { // Solaris
52		if gotSock && gotAccept4 && (major < 11 || (major == 11 && minor < 4)) {
53			t.Fatalf("SupportSockNonblockCloexec and SupportAccept4 are true, but kernel version is older than 11.4, Solaris version: %d.%d", major, minor)
54		}
55		if !gotSock && !gotAccept4 && (major > 11 || (major == 11 && minor >= 4)) {
56			t.Errorf("SupportSockNonblockCloexec and SupportAccept4 are false, but kernel version is 11.4 or newer, Solaris version: %d.%d", major, minor)
57		}
58	}
59}
60