annotate vendor/golang.org/x/sys/unix/sockcmsg_linux.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 // Copyright 2011 The Go Authors. All rights reserved.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2 // Use of this source code is governed by a BSD-style
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 // license that can be found in the LICENSE file.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 // Socket control messages
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 package unix
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 import "unsafe"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 // UnixCredentials encodes credentials into a socket control message
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 // for sending to another process. This can be used for
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 // authentication.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 func UnixCredentials(ucred *Ucred) []byte {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 b := make([]byte, CmsgSpace(SizeofUcred))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 h.Level = SOL_SOCKET
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 h.Type = SCM_CREDENTIALS
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 h.SetLen(CmsgLen(SizeofUcred))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 *(*Ucred)(h.data(0)) = *ucred
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 return b
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 // ParseUnixCredentials decodes a socket control message that contains
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 // credentials in a Ucred structure. To receive such a message, the
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 // SO_PASSCRED option must be enabled on the socket.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 func ParseUnixCredentials(m *SocketControlMessage) (*Ucred, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 if m.Header.Level != SOL_SOCKET {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 return nil, EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 if m.Header.Type != SCM_CREDENTIALS {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 return nil, EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 return &ucred, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 // PktInfo4 encodes Inet4Pktinfo into a socket control message of type IP_PKTINFO.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 func PktInfo4(info *Inet4Pktinfo) []byte {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 b := make([]byte, CmsgSpace(SizeofInet4Pktinfo))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 h.Level = SOL_IP
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 h.Type = IP_PKTINFO
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 h.SetLen(CmsgLen(SizeofInet4Pktinfo))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 *(*Inet4Pktinfo)(h.data(0)) = *info
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 return b
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 // PktInfo6 encodes Inet6Pktinfo into a socket control message of type IPV6_PKTINFO.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 func PktInfo6(info *Inet6Pktinfo) []byte {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 b := make([]byte, CmsgSpace(SizeofInet6Pktinfo))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 h.Level = SOL_IPV6
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 h.Type = IPV6_PKTINFO
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 h.SetLen(CmsgLen(SizeofInet6Pktinfo))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 *(*Inet6Pktinfo)(h.data(0)) = *info
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 return b
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 // ParseOrigDstAddr decodes a socket control message containing the original
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 // destination address. To receive such a message the IP_RECVORIGDSTADDR or
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 // IPV6_RECVORIGDSTADDR option must be enabled on the socket.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 func ParseOrigDstAddr(m *SocketControlMessage) (Sockaddr, error) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 switch {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 case m.Header.Level == SOL_IP && m.Header.Type == IP_ORIGDSTADDR:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 pp := (*RawSockaddrInet4)(unsafe.Pointer(&m.Data[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 sa := new(SockaddrInet4)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 p := (*[2]byte)(unsafe.Pointer(&pp.Port))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 sa.Port = int(p[0])<<8 + int(p[1])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 sa.Addr = pp.Addr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 return sa, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 case m.Header.Level == SOL_IPV6 && m.Header.Type == IPV6_ORIGDSTADDR:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 pp := (*RawSockaddrInet6)(unsafe.Pointer(&m.Data[0]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 sa := new(SockaddrInet6)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 p := (*[2]byte)(unsafe.Pointer(&pp.Port))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 sa.Port = int(p[0])<<8 + int(p[1])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 sa.ZoneId = pp.Scope_id
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 sa.Addr = pp.Addr
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 return sa, nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 return nil, EINVAL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 }