.gitignore added
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / sys@v0.0.0-20210124154548-22da62e12c0c / unix / syscall_bsd.go
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.
4
5 // +build darwin dragonfly freebsd netbsd openbsd
6
7 // BSD system call wrappers shared by *BSD based systems
8 // including OS X (Darwin) and FreeBSD.  Like the other
9 // syscall_*.go files it is compiled as Go code but also
10 // used as input to mksyscall which parses the //sys
11 // lines and generates system call stubs.
12
13 package unix
14
15 import (
16         "runtime"
17         "syscall"
18         "unsafe"
19 )
20
21 const ImplementsGetwd = true
22
23 func Getwd() (string, error) {
24         var buf [PathMax]byte
25         _, err := Getcwd(buf[0:])
26         if err != nil {
27                 return "", err
28         }
29         n := clen(buf[:])
30         if n < 1 {
31                 return "", EINVAL
32         }
33         return string(buf[:n]), nil
34 }
35
36 /*
37  * Wrapped
38  */
39
40 //sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error)
41 //sysnb setgroups(ngid int, gid *_Gid_t) (err error)
42
43 func Getgroups() (gids []int, err error) {
44         n, err := getgroups(0, nil)
45         if err != nil {
46                 return nil, err
47         }
48         if n == 0 {
49                 return nil, nil
50         }
51
52         // Sanity check group count. Max is 16 on BSD.
53         if n < 0 || n > 1000 {
54                 return nil, EINVAL
55         }
56
57         a := make([]_Gid_t, n)
58         n, err = getgroups(n, &a[0])
59         if err != nil {
60                 return nil, err
61         }
62         gids = make([]int, n)
63         for i, v := range a[0:n] {
64                 gids[i] = int(v)
65         }
66         return
67 }
68
69 func Setgroups(gids []int) (err error) {
70         if len(gids) == 0 {
71                 return setgroups(0, nil)
72         }
73
74         a := make([]_Gid_t, len(gids))
75         for i, v := range gids {
76                 a[i] = _Gid_t(v)
77         }
78         return setgroups(len(a), &a[0])
79 }
80
81 // Wait status is 7 bits at bottom, either 0 (exited),
82 // 0x7F (stopped), or a signal number that caused an exit.
83 // The 0x80 bit is whether there was a core dump.
84 // An extra number (exit code, signal causing a stop)
85 // is in the high bits.
86
87 type WaitStatus uint32
88
89 const (
90         mask  = 0x7F
91         core  = 0x80
92         shift = 8
93
94         exited  = 0
95         killed  = 9
96         stopped = 0x7F
97 )
98
99 func (w WaitStatus) Exited() bool { return w&mask == exited }
100
101 func (w WaitStatus) ExitStatus() int {
102         if w&mask != exited {
103                 return -1
104         }
105         return int(w >> shift)
106 }
107
108 func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 }
109
110 func (w WaitStatus) Signal() syscall.Signal {
111         sig := syscall.Signal(w & mask)
112         if sig == stopped || sig == 0 {
113                 return -1
114         }
115         return sig
116 }
117
118 func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }
119
120 func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP }
121
122 func (w WaitStatus) Killed() bool { return w&mask == killed && syscall.Signal(w>>shift) != SIGKILL }
123
124 func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP }
125
126 func (w WaitStatus) StopSignal() syscall.Signal {
127         if !w.Stopped() {
128                 return -1
129         }
130         return syscall.Signal(w>>shift) & 0xFF
131 }
132
133 func (w WaitStatus) TrapCause() int { return -1 }
134
135 //sys   wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error)
136
137 func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
138         var status _C_int
139         wpid, err = wait4(pid, &status, options, rusage)
140         if wstatus != nil {
141                 *wstatus = WaitStatus(status)
142         }
143         return
144 }
145
146 //sys   accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
147 //sys   bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
148 //sys   connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
149 //sysnb socket(domain int, typ int, proto int) (fd int, err error)
150 //sys   getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
151 //sys   setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
152 //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
153 //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
154 //sys   Shutdown(s int, how int) (err error)
155
156 func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
157         if sa.Port < 0 || sa.Port > 0xFFFF {
158                 return nil, 0, EINVAL
159         }
160         sa.raw.Len = SizeofSockaddrInet4
161         sa.raw.Family = AF_INET
162         p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
163         p[0] = byte(sa.Port >> 8)
164         p[1] = byte(sa.Port)
165         for i := 0; i < len(sa.Addr); i++ {
166                 sa.raw.Addr[i] = sa.Addr[i]
167         }
168         return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
169 }
170
171 func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
172         if sa.Port < 0 || sa.Port > 0xFFFF {
173                 return nil, 0, EINVAL
174         }
175         sa.raw.Len = SizeofSockaddrInet6
176         sa.raw.Family = AF_INET6
177         p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
178         p[0] = byte(sa.Port >> 8)
179         p[1] = byte(sa.Port)
180         sa.raw.Scope_id = sa.ZoneId
181         for i := 0; i < len(sa.Addr); i++ {
182                 sa.raw.Addr[i] = sa.Addr[i]
183         }
184         return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
185 }
186
187 func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
188         name := sa.Name
189         n := len(name)
190         if n >= len(sa.raw.Path) || n == 0 {
191                 return nil, 0, EINVAL
192         }
193         sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL
194         sa.raw.Family = AF_UNIX
195         for i := 0; i < n; i++ {
196                 sa.raw.Path[i] = int8(name[i])
197         }
198         return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
199 }
200
201 func (sa *SockaddrDatalink) sockaddr() (unsafe.Pointer, _Socklen, error) {
202         if sa.Index == 0 {
203                 return nil, 0, EINVAL
204         }
205         sa.raw.Len = sa.Len
206         sa.raw.Family = AF_LINK
207         sa.raw.Index = sa.Index
208         sa.raw.Type = sa.Type
209         sa.raw.Nlen = sa.Nlen
210         sa.raw.Alen = sa.Alen
211         sa.raw.Slen = sa.Slen
212         for i := 0; i < len(sa.raw.Data); i++ {
213                 sa.raw.Data[i] = sa.Data[i]
214         }
215         return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil
216 }
217
218 func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
219         switch rsa.Addr.Family {
220         case AF_LINK:
221                 pp := (*RawSockaddrDatalink)(unsafe.Pointer(rsa))
222                 sa := new(SockaddrDatalink)
223                 sa.Len = pp.Len
224                 sa.Family = pp.Family
225                 sa.Index = pp.Index
226                 sa.Type = pp.Type
227                 sa.Nlen = pp.Nlen
228                 sa.Alen = pp.Alen
229                 sa.Slen = pp.Slen
230                 for i := 0; i < len(sa.Data); i++ {
231                         sa.Data[i] = pp.Data[i]
232                 }
233                 return sa, nil
234
235         case AF_UNIX:
236                 pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
237                 if pp.Len < 2 || pp.Len > SizeofSockaddrUnix {
238                         return nil, EINVAL
239                 }
240                 sa := new(SockaddrUnix)
241
242                 // Some BSDs include the trailing NUL in the length, whereas
243                 // others do not. Work around this by subtracting the leading
244                 // family and len. The path is then scanned to see if a NUL
245                 // terminator still exists within the length.
246                 n := int(pp.Len) - 2 // subtract leading Family, Len
247                 for i := 0; i < n; i++ {
248                         if pp.Path[i] == 0 {
249                                 // found early NUL; assume Len included the NUL
250                                 // or was overestimating.
251                                 n = i
252                                 break
253                         }
254                 }
255                 bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
256                 sa.Name = string(bytes)
257                 return sa, nil
258
259         case AF_INET:
260                 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
261                 sa := new(SockaddrInet4)
262                 p := (*[2]byte)(unsafe.Pointer(&pp.Port))
263                 sa.Port = int(p[0])<<8 + int(p[1])
264                 for i := 0; i < len(sa.Addr); i++ {
265                         sa.Addr[i] = pp.Addr[i]
266                 }
267                 return sa, nil
268
269         case AF_INET6:
270                 pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
271                 sa := new(SockaddrInet6)
272                 p := (*[2]byte)(unsafe.Pointer(&pp.Port))
273                 sa.Port = int(p[0])<<8 + int(p[1])
274                 sa.ZoneId = pp.Scope_id
275                 for i := 0; i < len(sa.Addr); i++ {
276                         sa.Addr[i] = pp.Addr[i]
277                 }
278                 return sa, nil
279         }
280         return anyToSockaddrGOOS(fd, rsa)
281 }
282
283 func Accept(fd int) (nfd int, sa Sockaddr, err error) {
284         var rsa RawSockaddrAny
285         var len _Socklen = SizeofSockaddrAny
286         nfd, err = accept(fd, &rsa, &len)
287         if err != nil {
288                 return
289         }
290         if (runtime.GOOS == "darwin" || runtime.GOOS == "ios") && len == 0 {
291                 // Accepted socket has no address.
292                 // This is likely due to a bug in xnu kernels,
293                 // where instead of ECONNABORTED error socket
294                 // is accepted, but has no address.
295                 Close(nfd)
296                 return 0, nil, ECONNABORTED
297         }
298         sa, err = anyToSockaddr(fd, &rsa)
299         if err != nil {
300                 Close(nfd)
301                 nfd = 0
302         }
303         return
304 }
305
306 func Getsockname(fd int) (sa Sockaddr, err error) {
307         var rsa RawSockaddrAny
308         var len _Socklen = SizeofSockaddrAny
309         if err = getsockname(fd, &rsa, &len); err != nil {
310                 return
311         }
312         // TODO(jsing): DragonFly has a "bug" (see issue 3349), which should be
313         // reported upstream.
314         if runtime.GOOS == "dragonfly" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 {
315                 rsa.Addr.Family = AF_UNIX
316                 rsa.Addr.Len = SizeofSockaddrUnix
317         }
318         return anyToSockaddr(fd, &rsa)
319 }
320
321 //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
322
323 // GetsockoptString returns the string value of the socket option opt for the
324 // socket associated with fd at the given socket level.
325 func GetsockoptString(fd, level, opt int) (string, error) {
326         buf := make([]byte, 256)
327         vallen := _Socklen(len(buf))
328         err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
329         if err != nil {
330                 return "", err
331         }
332         return string(buf[:vallen-1]), nil
333 }
334
335 //sys   recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
336 //sys   sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
337 //sys   recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
338
339 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
340         var msg Msghdr
341         var rsa RawSockaddrAny
342         msg.Name = (*byte)(unsafe.Pointer(&rsa))
343         msg.Namelen = uint32(SizeofSockaddrAny)
344         var iov Iovec
345         if len(p) > 0 {
346                 iov.Base = (*byte)(unsafe.Pointer(&p[0]))
347                 iov.SetLen(len(p))
348         }
349         var dummy byte
350         if len(oob) > 0 {
351                 // receive at least one normal byte
352                 if len(p) == 0 {
353                         iov.Base = &dummy
354                         iov.SetLen(1)
355                 }
356                 msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
357                 msg.SetControllen(len(oob))
358         }
359         msg.Iov = &iov
360         msg.Iovlen = 1
361         if n, err = recvmsg(fd, &msg, flags); err != nil {
362                 return
363         }
364         oobn = int(msg.Controllen)
365         recvflags = int(msg.Flags)
366         // source address is only specified if the socket is unconnected
367         if rsa.Addr.Family != AF_UNSPEC {
368                 from, err = anyToSockaddr(fd, &rsa)
369         }
370         return
371 }
372
373 //sys   sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
374
375 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
376         _, err = SendmsgN(fd, p, oob, to, flags)
377         return
378 }
379
380 func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
381         var ptr unsafe.Pointer
382         var salen _Socklen
383         if to != nil {
384                 ptr, salen, err = to.sockaddr()
385                 if err != nil {
386                         return 0, err
387                 }
388         }
389         var msg Msghdr
390         msg.Name = (*byte)(unsafe.Pointer(ptr))
391         msg.Namelen = uint32(salen)
392         var iov Iovec
393         if len(p) > 0 {
394                 iov.Base = (*byte)(unsafe.Pointer(&p[0]))
395                 iov.SetLen(len(p))
396         }
397         var dummy byte
398         if len(oob) > 0 {
399                 // send at least one normal byte
400                 if len(p) == 0 {
401                         iov.Base = &dummy
402                         iov.SetLen(1)
403                 }
404                 msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
405                 msg.SetControllen(len(oob))
406         }
407         msg.Iov = &iov
408         msg.Iovlen = 1
409         if n, err = sendmsg(fd, &msg, flags); err != nil {
410                 return 0, err
411         }
412         if len(oob) > 0 && len(p) == 0 {
413                 n = 0
414         }
415         return n, nil
416 }
417
418 //sys   kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error)
419
420 func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err error) {
421         var change, event unsafe.Pointer
422         if len(changes) > 0 {
423                 change = unsafe.Pointer(&changes[0])
424         }
425         if len(events) > 0 {
426                 event = unsafe.Pointer(&events[0])
427         }
428         return kevent(kq, change, len(changes), event, len(events), timeout)
429 }
430
431 // sysctlmib translates name to mib number and appends any additional args.
432 func sysctlmib(name string, args ...int) ([]_C_int, error) {
433         // Translate name to mib number.
434         mib, err := nametomib(name)
435         if err != nil {
436                 return nil, err
437         }
438
439         for _, a := range args {
440                 mib = append(mib, _C_int(a))
441         }
442
443         return mib, nil
444 }
445
446 func Sysctl(name string) (string, error) {
447         return SysctlArgs(name)
448 }
449
450 func SysctlArgs(name string, args ...int) (string, error) {
451         buf, err := SysctlRaw(name, args...)
452         if err != nil {
453                 return "", err
454         }
455         n := len(buf)
456
457         // Throw away terminating NUL.
458         if n > 0 && buf[n-1] == '\x00' {
459                 n--
460         }
461         return string(buf[0:n]), nil
462 }
463
464 func SysctlUint32(name string) (uint32, error) {
465         return SysctlUint32Args(name)
466 }
467
468 func SysctlUint32Args(name string, args ...int) (uint32, error) {
469         mib, err := sysctlmib(name, args...)
470         if err != nil {
471                 return 0, err
472         }
473
474         n := uintptr(4)
475         buf := make([]byte, 4)
476         if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {
477                 return 0, err
478         }
479         if n != 4 {
480                 return 0, EIO
481         }
482         return *(*uint32)(unsafe.Pointer(&buf[0])), nil
483 }
484
485 func SysctlUint64(name string, args ...int) (uint64, error) {
486         mib, err := sysctlmib(name, args...)
487         if err != nil {
488                 return 0, err
489         }
490
491         n := uintptr(8)
492         buf := make([]byte, 8)
493         if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {
494                 return 0, err
495         }
496         if n != 8 {
497                 return 0, EIO
498         }
499         return *(*uint64)(unsafe.Pointer(&buf[0])), nil
500 }
501
502 func SysctlRaw(name string, args ...int) ([]byte, error) {
503         mib, err := sysctlmib(name, args...)
504         if err != nil {
505                 return nil, err
506         }
507
508         // Find size.
509         n := uintptr(0)
510         if err := sysctl(mib, nil, &n, nil, 0); err != nil {
511                 return nil, err
512         }
513         if n == 0 {
514                 return nil, nil
515         }
516
517         // Read into buffer of that size.
518         buf := make([]byte, n)
519         if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {
520                 return nil, err
521         }
522
523         // The actual call may return less than the original reported required
524         // size so ensure we deal with that.
525         return buf[:n], nil
526 }
527
528 func SysctlClockinfo(name string) (*Clockinfo, error) {
529         mib, err := sysctlmib(name)
530         if err != nil {
531                 return nil, err
532         }
533
534         n := uintptr(SizeofClockinfo)
535         var ci Clockinfo
536         if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil {
537                 return nil, err
538         }
539         if n != SizeofClockinfo {
540                 return nil, EIO
541         }
542         return &ci, nil
543 }
544
545 func SysctlTimeval(name string) (*Timeval, error) {
546         mib, err := sysctlmib(name)
547         if err != nil {
548                 return nil, err
549         }
550
551         var tv Timeval
552         n := uintptr(unsafe.Sizeof(tv))
553         if err := sysctl(mib, (*byte)(unsafe.Pointer(&tv)), &n, nil, 0); err != nil {
554                 return nil, err
555         }
556         if n != unsafe.Sizeof(tv) {
557                 return nil, EIO
558         }
559         return &tv, nil
560 }
561
562 //sys   utimes(path string, timeval *[2]Timeval) (err error)
563
564 func Utimes(path string, tv []Timeval) error {
565         if tv == nil {
566                 return utimes(path, nil)
567         }
568         if len(tv) != 2 {
569                 return EINVAL
570         }
571         return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
572 }
573
574 func UtimesNano(path string, ts []Timespec) error {
575         if ts == nil {
576                 err := utimensat(AT_FDCWD, path, nil, 0)
577                 if err != ENOSYS {
578                         return err
579                 }
580                 return utimes(path, nil)
581         }
582         if len(ts) != 2 {
583                 return EINVAL
584         }
585         // Darwin setattrlist can set nanosecond timestamps
586         err := setattrlistTimes(path, ts, 0)
587         if err != ENOSYS {
588                 return err
589         }
590         err = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
591         if err != ENOSYS {
592                 return err
593         }
594         // Not as efficient as it could be because Timespec and
595         // Timeval have different types in the different OSes
596         tv := [2]Timeval{
597                 NsecToTimeval(TimespecToNsec(ts[0])),
598                 NsecToTimeval(TimespecToNsec(ts[1])),
599         }
600         return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
601 }
602
603 func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {
604         if ts == nil {
605                 return utimensat(dirfd, path, nil, flags)
606         }
607         if len(ts) != 2 {
608                 return EINVAL
609         }
610         err := setattrlistTimes(path, ts, flags)
611         if err != ENOSYS {
612                 return err
613         }
614         return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
615 }
616
617 //sys   futimes(fd int, timeval *[2]Timeval) (err error)
618
619 func Futimes(fd int, tv []Timeval) error {
620         if tv == nil {
621                 return futimes(fd, nil)
622         }
623         if len(tv) != 2 {
624                 return EINVAL
625         }
626         return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
627 }
628
629 //sys   poll(fds *PollFd, nfds int, timeout int) (n int, err error)
630
631 func Poll(fds []PollFd, timeout int) (n int, err error) {
632         if len(fds) == 0 {
633                 return poll(nil, 0, timeout)
634         }
635         return poll(&fds[0], len(fds), timeout)
636 }
637
638 // TODO: wrap
639 //      Acct(name nil-string) (err error)
640 //      Gethostuuid(uuid *byte, timeout *Timespec) (err error)
641 //      Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error)
642
643 var mapper = &mmapper{
644         active: make(map[*byte][]byte),
645         mmap:   mmap,
646         munmap: munmap,
647 }
648
649 func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
650         return mapper.Mmap(fd, offset, length, prot, flags)
651 }
652
653 func Munmap(b []byte) (err error) {
654         return mapper.Munmap(b)
655 }
656
657 //sys   Madvise(b []byte, behav int) (err error)
658 //sys   Mlock(b []byte) (err error)
659 //sys   Mlockall(flags int) (err error)
660 //sys   Mprotect(b []byte, prot int) (err error)
661 //sys   Msync(b []byte, flags int) (err error)
662 //sys   Munlock(b []byte) (err error)
663 //sys   Munlockall() (err error)