mirror of
https://github.com/golang/sys.git
synced 2026-01-29 07:02:06 +03:00
This change syncs the IBM internal version of sys/unix with the public repository. There are a variety of new syscalls and const definitions that have been accumulated over the past few years to support developers using Go on the platform. Old simulations of calls like 'epoll' and 'fstatfs' have been replaced with their real counterparts. The zos/s390x syscalls also have extensive trampolining to handle zos systems that might not have support for some of these new system calls. Closes golang/go#67071 Change-Id: I973d9e0abca2b05365308cf2b890438e50ae5957 Reviewed-on: https://go-review.googlesource.com/c/sys/+/582035 Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Bill O'Farrell <billotosyr@gmail.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
// Copyright 2024 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.
|
|
|
|
// Socket control messages
|
|
|
|
package unix
|
|
|
|
import "unsafe"
|
|
|
|
// UnixCredentials encodes credentials into a socket control message
|
|
// for sending to another process. This can be used for
|
|
// authentication.
|
|
func UnixCredentials(ucred *Ucred) []byte {
|
|
b := make([]byte, CmsgSpace(SizeofUcred))
|
|
h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
|
|
h.Level = SOL_SOCKET
|
|
h.Type = SCM_CREDENTIALS
|
|
h.SetLen(CmsgLen(SizeofUcred))
|
|
*(*Ucred)(h.data(0)) = *ucred
|
|
return b
|
|
}
|
|
|
|
// ParseUnixCredentials decodes a socket control message that contains
|
|
// credentials in a Ucred structure. To receive such a message, the
|
|
// SO_PASSCRED option must be enabled on the socket.
|
|
func ParseUnixCredentials(m *SocketControlMessage) (*Ucred, error) {
|
|
if m.Header.Level != SOL_SOCKET {
|
|
return nil, EINVAL
|
|
}
|
|
if m.Header.Type != SCM_CREDENTIALS {
|
|
return nil, EINVAL
|
|
}
|
|
ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0]))
|
|
return &ucred, nil
|
|
}
|
|
|
|
// PktInfo4 encodes Inet4Pktinfo into a socket control message of type IP_PKTINFO.
|
|
func PktInfo4(info *Inet4Pktinfo) []byte {
|
|
b := make([]byte, CmsgSpace(SizeofInet4Pktinfo))
|
|
h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
|
|
h.Level = SOL_IP
|
|
h.Type = IP_PKTINFO
|
|
h.SetLen(CmsgLen(SizeofInet4Pktinfo))
|
|
*(*Inet4Pktinfo)(h.data(0)) = *info
|
|
return b
|
|
}
|
|
|
|
// PktInfo6 encodes Inet6Pktinfo into a socket control message of type IPV6_PKTINFO.
|
|
func PktInfo6(info *Inet6Pktinfo) []byte {
|
|
b := make([]byte, CmsgSpace(SizeofInet6Pktinfo))
|
|
h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
|
|
h.Level = SOL_IPV6
|
|
h.Type = IPV6_PKTINFO
|
|
h.SetLen(CmsgLen(SizeofInet6Pktinfo))
|
|
*(*Inet6Pktinfo)(h.data(0)) = *info
|
|
return b
|
|
}
|