Skip to content

Commit 68d869b

Browse files
nshalmangopherbot
authored andcommitted
unix: migrate some illumos definitions to solaris
Fixes golang/go#56000 Change-Id: Ica6549385ddb466c4697cc45851e2b59fd6e0f24 Reviewed-on: https://go-review.googlesource.com/c/sys/+/437357 Run-TryBot: Ian Lance Taylor <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Tobias Klauser <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> Reviewed-by: Bryan Mills <[email protected]>
1 parent 84dc82d commit 68d869b

10 files changed

+253
-294
lines changed

unix/syscall_illumos.go

Lines changed: 0 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
package unix
1111

1212
import (
13-
"fmt"
14-
"runtime"
1513
"unsafe"
1614
)
1715

@@ -79,107 +77,3 @@ func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {
7977
}
8078
return
8179
}
82-
83-
//sys putmsg(fd int, clptr *strbuf, dataptr *strbuf, flags int) (err error)
84-
85-
func Putmsg(fd int, cl []byte, data []byte, flags int) (err error) {
86-
var clp, datap *strbuf
87-
if len(cl) > 0 {
88-
clp = &strbuf{
89-
Len: int32(len(cl)),
90-
Buf: (*int8)(unsafe.Pointer(&cl[0])),
91-
}
92-
}
93-
if len(data) > 0 {
94-
datap = &strbuf{
95-
Len: int32(len(data)),
96-
Buf: (*int8)(unsafe.Pointer(&data[0])),
97-
}
98-
}
99-
return putmsg(fd, clp, datap, flags)
100-
}
101-
102-
//sys getmsg(fd int, clptr *strbuf, dataptr *strbuf, flags *int) (err error)
103-
104-
func Getmsg(fd int, cl []byte, data []byte) (retCl []byte, retData []byte, flags int, err error) {
105-
var clp, datap *strbuf
106-
if len(cl) > 0 {
107-
clp = &strbuf{
108-
Maxlen: int32(len(cl)),
109-
Buf: (*int8)(unsafe.Pointer(&cl[0])),
110-
}
111-
}
112-
if len(data) > 0 {
113-
datap = &strbuf{
114-
Maxlen: int32(len(data)),
115-
Buf: (*int8)(unsafe.Pointer(&data[0])),
116-
}
117-
}
118-
119-
if err = getmsg(fd, clp, datap, &flags); err != nil {
120-
return nil, nil, 0, err
121-
}
122-
123-
if len(cl) > 0 {
124-
retCl = cl[:clp.Len]
125-
}
126-
if len(data) > 0 {
127-
retData = data[:datap.Len]
128-
}
129-
return retCl, retData, flags, nil
130-
}
131-
132-
func IoctlSetIntRetInt(fd int, req uint, arg int) (int, error) {
133-
return ioctlRet(fd, req, uintptr(arg))
134-
}
135-
136-
func IoctlSetString(fd int, req uint, val string) error {
137-
bs := make([]byte, len(val)+1)
138-
copy(bs[:len(bs)-1], val)
139-
err := ioctl(fd, req, uintptr(unsafe.Pointer(&bs[0])))
140-
runtime.KeepAlive(&bs[0])
141-
return err
142-
}
143-
144-
// Lifreq Helpers
145-
146-
func (l *Lifreq) SetName(name string) error {
147-
if len(name) >= len(l.Name) {
148-
return fmt.Errorf("name cannot be more than %d characters", len(l.Name)-1)
149-
}
150-
for i := range name {
151-
l.Name[i] = int8(name[i])
152-
}
153-
return nil
154-
}
155-
156-
func (l *Lifreq) SetLifruInt(d int) {
157-
*(*int)(unsafe.Pointer(&l.Lifru[0])) = d
158-
}
159-
160-
func (l *Lifreq) GetLifruInt() int {
161-
return *(*int)(unsafe.Pointer(&l.Lifru[0]))
162-
}
163-
164-
func (l *Lifreq) SetLifruUint(d uint) {
165-
*(*uint)(unsafe.Pointer(&l.Lifru[0])) = d
166-
}
167-
168-
func (l *Lifreq) GetLifruUint() uint {
169-
return *(*uint)(unsafe.Pointer(&l.Lifru[0]))
170-
}
171-
172-
func IoctlLifreq(fd int, req uint, l *Lifreq) error {
173-
return ioctl(fd, req, uintptr(unsafe.Pointer(l)))
174-
}
175-
176-
// Strioctl Helpers
177-
178-
func (s *Strioctl) SetInt(i int) {
179-
s.Len = int32(unsafe.Sizeof(i))
180-
s.Dp = (*int8)(unsafe.Pointer(&i))
181-
}
182-
183-
func IoctlSetStrioctlRetInt(fd int, req uint, s *Strioctl) (int, error) {
184-
return ioctlRet(fd, req, uintptr(unsafe.Pointer(s)))
185-
}

unix/syscall_illumos_test.go

Lines changed: 0 additions & 69 deletions
This file was deleted.

unix/syscall_solaris.go

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,3 +1026,107 @@ func (e *EventPort) Get(s []PortEvent, min int, timeout *Timespec) (int, error)
10261026
}
10271027
return valid, err
10281028
}
1029+
1030+
//sys putmsg(fd int, clptr *strbuf, dataptr *strbuf, flags int) (err error)
1031+
1032+
func Putmsg(fd int, cl []byte, data []byte, flags int) (err error) {
1033+
var clp, datap *strbuf
1034+
if len(cl) > 0 {
1035+
clp = &strbuf{
1036+
Len: int32(len(cl)),
1037+
Buf: (*int8)(unsafe.Pointer(&cl[0])),
1038+
}
1039+
}
1040+
if len(data) > 0 {
1041+
datap = &strbuf{
1042+
Len: int32(len(data)),
1043+
Buf: (*int8)(unsafe.Pointer(&data[0])),
1044+
}
1045+
}
1046+
return putmsg(fd, clp, datap, flags)
1047+
}
1048+
1049+
//sys getmsg(fd int, clptr *strbuf, dataptr *strbuf, flags *int) (err error)
1050+
1051+
func Getmsg(fd int, cl []byte, data []byte) (retCl []byte, retData []byte, flags int, err error) {
1052+
var clp, datap *strbuf
1053+
if len(cl) > 0 {
1054+
clp = &strbuf{
1055+
Maxlen: int32(len(cl)),
1056+
Buf: (*int8)(unsafe.Pointer(&cl[0])),
1057+
}
1058+
}
1059+
if len(data) > 0 {
1060+
datap = &strbuf{
1061+
Maxlen: int32(len(data)),
1062+
Buf: (*int8)(unsafe.Pointer(&data[0])),
1063+
}
1064+
}
1065+
1066+
if err = getmsg(fd, clp, datap, &flags); err != nil {
1067+
return nil, nil, 0, err
1068+
}
1069+
1070+
if len(cl) > 0 {
1071+
retCl = cl[:clp.Len]
1072+
}
1073+
if len(data) > 0 {
1074+
retData = data[:datap.Len]
1075+
}
1076+
return retCl, retData, flags, nil
1077+
}
1078+
1079+
func IoctlSetIntRetInt(fd int, req uint, arg int) (int, error) {
1080+
return ioctlRet(fd, req, uintptr(arg))
1081+
}
1082+
1083+
func IoctlSetString(fd int, req uint, val string) error {
1084+
bs := make([]byte, len(val)+1)
1085+
copy(bs[:len(bs)-1], val)
1086+
err := ioctl(fd, req, uintptr(unsafe.Pointer(&bs[0])))
1087+
runtime.KeepAlive(&bs[0])
1088+
return err
1089+
}
1090+
1091+
// Lifreq Helpers
1092+
1093+
func (l *Lifreq) SetName(name string) error {
1094+
if len(name) >= len(l.Name) {
1095+
return fmt.Errorf("name cannot be more than %d characters", len(l.Name)-1)
1096+
}
1097+
for i := range name {
1098+
l.Name[i] = int8(name[i])
1099+
}
1100+
return nil
1101+
}
1102+
1103+
func (l *Lifreq) SetLifruInt(d int) {
1104+
*(*int)(unsafe.Pointer(&l.Lifru[0])) = d
1105+
}
1106+
1107+
func (l *Lifreq) GetLifruInt() int {
1108+
return *(*int)(unsafe.Pointer(&l.Lifru[0]))
1109+
}
1110+
1111+
func (l *Lifreq) SetLifruUint(d uint) {
1112+
*(*uint)(unsafe.Pointer(&l.Lifru[0])) = d
1113+
}
1114+
1115+
func (l *Lifreq) GetLifruUint() uint {
1116+
return *(*uint)(unsafe.Pointer(&l.Lifru[0]))
1117+
}
1118+
1119+
func IoctlLifreq(fd int, req uint, l *Lifreq) error {
1120+
return ioctl(fd, req, uintptr(unsafe.Pointer(l)))
1121+
}
1122+
1123+
// Strioctl Helpers
1124+
1125+
func (s *Strioctl) SetInt(i int) {
1126+
s.Len = int32(unsafe.Sizeof(i))
1127+
s.Dp = (*int8)(unsafe.Pointer(&i))
1128+
}
1129+
1130+
func IoctlSetStrioctlRetInt(fd int, req uint, s *Strioctl) (int, error) {
1131+
return ioctlRet(fd, req, uintptr(unsafe.Pointer(s)))
1132+
}

unix/syscall_solaris_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"os"
1313
"os/exec"
1414
"runtime"
15+
"strings"
1516
"testing"
1617

1718
"golang.org/x/sys/unix"
@@ -331,3 +332,55 @@ func TestPortEventSlices(t *testing.T) {
331332
t.Errorf("port.Close() failed: %v", err)
332333
}
333334
}
335+
336+
func TestLifreqSetName(t *testing.T) {
337+
var l unix.Lifreq
338+
err := l.SetName("12345678901234356789012345678901234567890")
339+
if err == nil {
340+
t.Fatal(`Lifreq.SetName should reject names that are too long`)
341+
}
342+
err = l.SetName("tun0")
343+
if err != nil {
344+
t.Errorf(`Lifreq.SetName("tun0") failed: %v`, err)
345+
}
346+
}
347+
348+
func TestLifreqGetMTU(t *testing.T) {
349+
// Find links and their MTU using CLI tooling
350+
// $ dladm show-link -p -o link,mtu
351+
// net0:1500
352+
out, err := exec.Command("dladm", "show-link", "-p", "-o", "link,mtu").Output()
353+
if err != nil {
354+
t.Fatalf("unable to use dladm to find data links: %v", err)
355+
}
356+
lines := strings.Split(string(out), "\n")
357+
tc := make(map[string]string)
358+
for _, line := range lines {
359+
v := strings.Split(line, ":")
360+
if len(v) == 2 {
361+
tc[v[0]] = v[1]
362+
}
363+
}
364+
ip_fd, err := unix.Socket(unix.AF_INET, unix.SOCK_DGRAM, 0)
365+
if err != nil {
366+
t.Fatalf("could not open udp socket: %v", err)
367+
}
368+
// SIOCGLIFMTU is negative which confuses the compiler if used inline:
369+
// Using "unix.IoctlLifreq(ip_fd, unix.SIOCGLIFMTU, &l)" results in
370+
// "constant -1065850502 overflows uint"
371+
reqnum := int(unix.SIOCGLIFMTU)
372+
var l unix.Lifreq
373+
for link, mtu := range tc {
374+
err = l.SetName(link)
375+
if err != nil {
376+
t.Fatalf("Lifreq.SetName(%q) failed: %v", link, err)
377+
}
378+
if err = unix.IoctlLifreq(ip_fd, uint(reqnum), &l); err != nil {
379+
t.Fatalf("unable to SIOCGLIFMTU: %v", err)
380+
}
381+
m := l.GetLifruUint()
382+
if fmt.Sprintf("%d", m) != mtu {
383+
t.Errorf("unable to read MTU correctly: expected %s, got %d", mtu, m)
384+
}
385+
}
386+
}

0 commit comments

Comments
 (0)