Source file src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd.go
1
2
3
4
5
6
7
8
9
10
11
12
13 package unix
14
15 import (
16 "sync"
17 "unsafe"
18 )
19
20 const (
21 SYS_FSTAT_FREEBSD12 = 551
22 SYS_FSTATAT_FREEBSD12 = 552
23 SYS_GETDIRENTRIES_FREEBSD12 = 554
24 SYS_STATFS_FREEBSD12 = 555
25 SYS_FSTATFS_FREEBSD12 = 556
26 SYS_GETFSSTAT_FREEBSD12 = 557
27 SYS_MKNODAT_FREEBSD12 = 559
28 )
29
30
31 var (
32 osreldateOnce sync.Once
33 osreldate uint32
34 )
35
36
37 const _ino64First = 1200031
38
39 func supportsABI(ver uint32) bool {
40 osreldateOnce.Do(func() { osreldate, _ = SysctlUint32("kern.osreldate") })
41 return osreldate >= ver
42 }
43
44
45 type SockaddrDatalink struct {
46 Len uint8
47 Family uint8
48 Index uint16
49 Type uint8
50 Nlen uint8
51 Alen uint8
52 Slen uint8
53 Data [46]int8
54 raw RawSockaddrDatalink
55 }
56
57
58 func nametomib(name string) (mib []_C_int, err error) {
59 const siz = unsafe.Sizeof(mib[0])
60
61
62
63
64
65
66
67
68 var buf [CTL_MAXNAME + 2]_C_int
69 n := uintptr(CTL_MAXNAME) * siz
70
71 p := (*byte)(unsafe.Pointer(&buf[0]))
72 bytes, err := ByteSliceFromString(name)
73 if err != nil {
74 return nil, err
75 }
76
77
78
79 if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil {
80 return nil, err
81 }
82 return buf[0 : n/siz], nil
83 }
84
85 func Pipe(p []int) (err error) {
86 return Pipe2(p, 0)
87 }
88
89
90
91 func Pipe2(p []int, flags int) error {
92 if len(p) != 2 {
93 return EINVAL
94 }
95 var pp [2]_C_int
96 err := pipe2(&pp, flags)
97 p[0] = int(pp[0])
98 p[1] = int(pp[1])
99 return err
100 }
101
102 func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {
103 var value IPMreqn
104 vallen := _Socklen(SizeofIPMreqn)
105 errno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
106 return &value, errno
107 }
108
109 func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {
110 return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq))
111 }
112
113 func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {
114 var rsa RawSockaddrAny
115 var len _Socklen = SizeofSockaddrAny
116 nfd, err = accept4(fd, &rsa, &len, flags)
117 if err != nil {
118 return
119 }
120 if len > SizeofSockaddrAny {
121 panic("RawSockaddrAny too small")
122 }
123 sa, err = anyToSockaddr(fd, &rsa)
124 if err != nil {
125 Close(nfd)
126 nfd = 0
127 }
128 return
129 }
130
131 const ImplementsGetwd = true
132
133
134
135 func Getwd() (string, error) {
136 var buf [PathMax]byte
137 _, err := Getcwd(buf[0:])
138 if err != nil {
139 return "", err
140 }
141 n := clen(buf[:])
142 if n < 1 {
143 return "", EINVAL
144 }
145 return string(buf[:n]), nil
146 }
147
148 func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
149 var (
150 _p0 unsafe.Pointer
151 bufsize uintptr
152 oldBuf []statfs_freebsd11_t
153 needsConvert bool
154 )
155
156 if len(buf) > 0 {
157 if supportsABI(_ino64First) {
158 _p0 = unsafe.Pointer(&buf[0])
159 bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
160 } else {
161 n := len(buf)
162 oldBuf = make([]statfs_freebsd11_t, n)
163 _p0 = unsafe.Pointer(&oldBuf[0])
164 bufsize = unsafe.Sizeof(statfs_freebsd11_t{}) * uintptr(n)
165 needsConvert = true
166 }
167 }
168 var sysno uintptr = SYS_GETFSSTAT
169 if supportsABI(_ino64First) {
170 sysno = SYS_GETFSSTAT_FREEBSD12
171 }
172 r0, _, e1 := Syscall(sysno, uintptr(_p0), bufsize, uintptr(flags))
173 n = int(r0)
174 if e1 != 0 {
175 err = e1
176 }
177 if e1 == 0 && needsConvert {
178 for i := range oldBuf {
179 buf[i].convertFrom(&oldBuf[i])
180 }
181 }
182 return
183 }
184
185 func setattrlistTimes(path string, times []Timespec, flags int) error {
186
187 return ENOSYS
188 }
189
190
191
192
193
194
195
196
197 func IoctlSetInt(fd int, req uint, value int) error {
198 return ioctl(fd, req, uintptr(value))
199 }
200
201 func ioctlSetWinsize(fd int, req uint, value *Winsize) error {
202 return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
203 }
204
205 func ioctlSetTermios(fd int, req uint, value *Termios) error {
206 return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
207 }
208
209
210
211 func IoctlGetInt(fd int, req uint) (int, error) {
212 var value int
213 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
214 return value, err
215 }
216
217 func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
218 var value Winsize
219 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
220 return &value, err
221 }
222
223 func IoctlGetTermios(fd int, req uint) (*Termios, error) {
224 var value Termios
225 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
226 return &value, err
227 }
228
229 func Uname(uname *Utsname) error {
230 mib := []_C_int{CTL_KERN, KERN_OSTYPE}
231 n := unsafe.Sizeof(uname.Sysname)
232 if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
233 return err
234 }
235
236 mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
237 n = unsafe.Sizeof(uname.Nodename)
238 if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
239 return err
240 }
241
242 mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
243 n = unsafe.Sizeof(uname.Release)
244 if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
245 return err
246 }
247
248 mib = []_C_int{CTL_KERN, KERN_VERSION}
249 n = unsafe.Sizeof(uname.Version)
250 if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
251 return err
252 }
253
254
255
256 for i, b := range uname.Version {
257 if b == '\n' || b == '\t' {
258 if i == len(uname.Version)-1 {
259 uname.Version[i] = 0
260 } else {
261 uname.Version[i] = ' '
262 }
263 }
264 }
265
266 mib = []_C_int{CTL_HW, HW_MACHINE}
267 n = unsafe.Sizeof(uname.Machine)
268 if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
269 return err
270 }
271
272 return nil
273 }
274
275 func Stat(path string, st *Stat_t) (err error) {
276 var oldStat stat_freebsd11_t
277 if supportsABI(_ino64First) {
278 return fstatat_freebsd12(AT_FDCWD, path, st, 0)
279 }
280 err = stat(path, &oldStat)
281 if err != nil {
282 return err
283 }
284
285 st.convertFrom(&oldStat)
286 return nil
287 }
288
289 func Lstat(path string, st *Stat_t) (err error) {
290 var oldStat stat_freebsd11_t
291 if supportsABI(_ino64First) {
292 return fstatat_freebsd12(AT_FDCWD, path, st, AT_SYMLINK_NOFOLLOW)
293 }
294 err = lstat(path, &oldStat)
295 if err != nil {
296 return err
297 }
298
299 st.convertFrom(&oldStat)
300 return nil
301 }
302
303 func Fstat(fd int, st *Stat_t) (err error) {
304 var oldStat stat_freebsd11_t
305 if supportsABI(_ino64First) {
306 return fstat_freebsd12(fd, st)
307 }
308 err = fstat(fd, &oldStat)
309 if err != nil {
310 return err
311 }
312
313 st.convertFrom(&oldStat)
314 return nil
315 }
316
317 func Fstatat(fd int, path string, st *Stat_t, flags int) (err error) {
318 var oldStat stat_freebsd11_t
319 if supportsABI(_ino64First) {
320 return fstatat_freebsd12(fd, path, st, flags)
321 }
322 err = fstatat(fd, path, &oldStat, flags)
323 if err != nil {
324 return err
325 }
326
327 st.convertFrom(&oldStat)
328 return nil
329 }
330
331 func Statfs(path string, st *Statfs_t) (err error) {
332 var oldStatfs statfs_freebsd11_t
333 if supportsABI(_ino64First) {
334 return statfs_freebsd12(path, st)
335 }
336 err = statfs(path, &oldStatfs)
337 if err != nil {
338 return err
339 }
340
341 st.convertFrom(&oldStatfs)
342 return nil
343 }
344
345 func Fstatfs(fd int, st *Statfs_t) (err error) {
346 var oldStatfs statfs_freebsd11_t
347 if supportsABI(_ino64First) {
348 return fstatfs_freebsd12(fd, st)
349 }
350 err = fstatfs(fd, &oldStatfs)
351 if err != nil {
352 return err
353 }
354
355 st.convertFrom(&oldStatfs)
356 return nil
357 }
358
359 func Getdents(fd int, buf []byte) (n int, err error) {
360 return Getdirentries(fd, buf, nil)
361 }
362
363 func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
364 if supportsABI(_ino64First) {
365 return getdirentries_freebsd12(fd, buf, basep)
366 }
367
368
369
370 oldBufLen := roundup(len(buf)/4, _dirblksiz)
371 oldBuf := make([]byte, oldBufLen)
372 n, err = getdirentries(fd, oldBuf, basep)
373 if err == nil && n > 0 {
374 n = convertFromDirents11(buf, oldBuf[:n])
375 }
376 return
377 }
378
379 func Mknod(path string, mode uint32, dev uint64) (err error) {
380 var oldDev int
381 if supportsABI(_ino64First) {
382 return mknodat_freebsd12(AT_FDCWD, path, mode, dev)
383 }
384 oldDev = int(dev)
385 return mknod(path, mode, oldDev)
386 }
387
388 func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) {
389 var oldDev int
390 if supportsABI(_ino64First) {
391 return mknodat_freebsd12(fd, path, mode, dev)
392 }
393 oldDev = int(dev)
394 return mknodat(fd, path, mode, oldDev)
395 }
396
397
398
399
400
401 func roundup(x, y int) int {
402 return ((x + y - 1) / y) * y
403 }
404
405 func (s *Stat_t) convertFrom(old *stat_freebsd11_t) {
406 *s = Stat_t{
407 Dev: uint64(old.Dev),
408 Ino: uint64(old.Ino),
409 Nlink: uint64(old.Nlink),
410 Mode: old.Mode,
411 Uid: old.Uid,
412 Gid: old.Gid,
413 Rdev: uint64(old.Rdev),
414 Atim: old.Atim,
415 Mtim: old.Mtim,
416 Ctim: old.Ctim,
417 Birthtim: old.Birthtim,
418 Size: old.Size,
419 Blocks: old.Blocks,
420 Blksize: old.Blksize,
421 Flags: old.Flags,
422 Gen: uint64(old.Gen),
423 }
424 }
425
426 func (s *Statfs_t) convertFrom(old *statfs_freebsd11_t) {
427 *s = Statfs_t{
428 Version: _statfsVersion,
429 Type: old.Type,
430 Flags: old.Flags,
431 Bsize: old.Bsize,
432 Iosize: old.Iosize,
433 Blocks: old.Blocks,
434 Bfree: old.Bfree,
435 Bavail: old.Bavail,
436 Files: old.Files,
437 Ffree: old.Ffree,
438 Syncwrites: old.Syncwrites,
439 Asyncwrites: old.Asyncwrites,
440 Syncreads: old.Syncreads,
441 Asyncreads: old.Asyncreads,
442
443 Namemax: old.Namemax,
444 Owner: old.Owner,
445 Fsid: old.Fsid,
446
447
448
449
450 }
451
452 sl := old.Fstypename[:]
453 n := clen(*(*[]byte)(unsafe.Pointer(&sl)))
454 copy(s.Fstypename[:], old.Fstypename[:n])
455
456 sl = old.Mntfromname[:]
457 n = clen(*(*[]byte)(unsafe.Pointer(&sl)))
458 copy(s.Mntfromname[:], old.Mntfromname[:n])
459
460 sl = old.Mntonname[:]
461 n = clen(*(*[]byte)(unsafe.Pointer(&sl)))
462 copy(s.Mntonname[:], old.Mntonname[:n])
463 }
464
465 func convertFromDirents11(buf []byte, old []byte) int {
466 const (
467 fixedSize = int(unsafe.Offsetof(Dirent{}.Name))
468 oldFixedSize = int(unsafe.Offsetof(dirent_freebsd11{}.Name))
469 )
470
471 dstPos := 0
472 srcPos := 0
473 for dstPos+fixedSize < len(buf) && srcPos+oldFixedSize < len(old) {
474 dstDirent := (*Dirent)(unsafe.Pointer(&buf[dstPos]))
475 srcDirent := (*dirent_freebsd11)(unsafe.Pointer(&old[srcPos]))
476
477 reclen := roundup(fixedSize+int(srcDirent.Namlen)+1, 8)
478 if dstPos+reclen > len(buf) {
479 break
480 }
481
482 dstDirent.Fileno = uint64(srcDirent.Fileno)
483 dstDirent.Off = 0
484 dstDirent.Reclen = uint16(reclen)
485 dstDirent.Type = srcDirent.Type
486 dstDirent.Pad0 = 0
487 dstDirent.Namlen = uint16(srcDirent.Namlen)
488 dstDirent.Pad1 = 0
489
490 copy(dstDirent.Name[:], srcDirent.Name[:srcDirent.Namlen])
491 padding := buf[dstPos+fixedSize+int(dstDirent.Namlen) : dstPos+reclen]
492 for i := range padding {
493 padding[i] = 0
494 }
495
496 dstPos += int(dstDirent.Reclen)
497 srcPos += int(srcDirent.Reclen)
498 }
499
500 return dstPos
501 }
502
503 func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
504 if raceenabled {
505 raceReleaseMerge(unsafe.Pointer(&ioSync))
506 }
507 return sendfile(outfd, infd, offset, count)
508 }
509
510
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
View as plain text