Source file src/pkg/cmd/vendor/golang.org/x/sys/unix/syscall_linux.go
1
2
3
4
5
6
7
8
9
10
11
12 package unix
13
14 import (
15 "encoding/binary"
16 "net"
17 "runtime"
18 "syscall"
19 "unsafe"
20 )
21
22
25
26 func Access(path string, mode uint32) (err error) {
27 return Faccessat(AT_FDCWD, path, mode, 0)
28 }
29
30 func Chmod(path string, mode uint32) (err error) {
31 return Fchmodat(AT_FDCWD, path, mode, 0)
32 }
33
34 func Chown(path string, uid int, gid int) (err error) {
35 return Fchownat(AT_FDCWD, path, uid, gid, 0)
36 }
37
38 func Creat(path string, mode uint32) (fd int, err error) {
39 return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode)
40 }
41
42
43
44
45 func FanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname string) (err error) {
46 if pathname == "" {
47 return fanotifyMark(fd, flags, mask, dirFd, nil)
48 }
49 p, err := BytePtrFromString(pathname)
50 if err != nil {
51 return err
52 }
53 return fanotifyMark(fd, flags, mask, dirFd, p)
54 }
55
56
57
58 func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {
59
60
61
62 if flags&^AT_SYMLINK_NOFOLLOW != 0 {
63 return EINVAL
64 } else if flags&AT_SYMLINK_NOFOLLOW != 0 {
65 return EOPNOTSUPP
66 }
67 return fchmodat(dirfd, path, mode)
68 }
69
70
71
72
73
74
75
76
77
78
79 func IoctlSetPointerInt(fd int, req uint, value int) error {
80 v := int32(value)
81 return ioctl(fd, req, uintptr(unsafe.Pointer(&v)))
82 }
83
84
85
86 func IoctlSetInt(fd int, req uint, value int) error {
87 return ioctl(fd, req, uintptr(value))
88 }
89
90 func ioctlSetWinsize(fd int, req uint, value *Winsize) error {
91 return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
92 }
93
94 func ioctlSetTermios(fd int, req uint, value *Termios) error {
95 return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
96 }
97
98 func IoctlSetRTCTime(fd int, value *RTCTime) error {
99 err := ioctl(fd, RTC_SET_TIME, uintptr(unsafe.Pointer(value)))
100 runtime.KeepAlive(value)
101 return err
102 }
103
104
105
106 func IoctlGetInt(fd int, req uint) (int, error) {
107 var value int
108 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
109 return value, err
110 }
111
112 func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
113 var value Winsize
114 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
115 return &value, err
116 }
117
118 func IoctlGetTermios(fd int, req uint) (*Termios, error) {
119 var value Termios
120 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
121 return &value, err
122 }
123
124 func IoctlGetRTCTime(fd int) (*RTCTime, error) {
125 var value RTCTime
126 err := ioctl(fd, RTC_RD_TIME, uintptr(unsafe.Pointer(&value)))
127 return &value, err
128 }
129
130
131
132 func Link(oldpath string, newpath string) (err error) {
133 return Linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0)
134 }
135
136 func Mkdir(path string, mode uint32) (err error) {
137 return Mkdirat(AT_FDCWD, path, mode)
138 }
139
140 func Mknod(path string, mode uint32, dev int) (err error) {
141 return Mknodat(AT_FDCWD, path, mode, dev)
142 }
143
144 func Open(path string, mode int, perm uint32) (fd int, err error) {
145 return openat(AT_FDCWD, path, mode|O_LARGEFILE, perm)
146 }
147
148
149
150 func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {
151 return openat(dirfd, path, flags|O_LARGEFILE, mode)
152 }
153
154
155
156 func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
157 if len(fds) == 0 {
158 return ppoll(nil, 0, timeout, sigmask)
159 }
160 return ppoll(&fds[0], len(fds), timeout, sigmask)
161 }
162
163
164
165 func Readlink(path string, buf []byte) (n int, err error) {
166 return Readlinkat(AT_FDCWD, path, buf)
167 }
168
169 func Rename(oldpath string, newpath string) (err error) {
170 return Renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath)
171 }
172
173 func Rmdir(path string) error {
174 return Unlinkat(AT_FDCWD, path, AT_REMOVEDIR)
175 }
176
177
178
179 func Symlink(oldpath string, newpath string) (err error) {
180 return Symlinkat(oldpath, AT_FDCWD, newpath)
181 }
182
183 func Unlink(path string) error {
184 return Unlinkat(AT_FDCWD, path, 0)
185 }
186
187
188
189 func Utimes(path string, tv []Timeval) error {
190 if tv == nil {
191 err := utimensat(AT_FDCWD, path, nil, 0)
192 if err != ENOSYS {
193 return err
194 }
195 return utimes(path, nil)
196 }
197 if len(tv) != 2 {
198 return EINVAL
199 }
200 var ts [2]Timespec
201 ts[0] = NsecToTimespec(TimevalToNsec(tv[0]))
202 ts[1] = NsecToTimespec(TimevalToNsec(tv[1]))
203 err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
204 if err != ENOSYS {
205 return err
206 }
207 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
208 }
209
210
211
212 func UtimesNano(path string, ts []Timespec) error {
213 if ts == nil {
214 err := utimensat(AT_FDCWD, path, nil, 0)
215 if err != ENOSYS {
216 return err
217 }
218 return utimes(path, nil)
219 }
220 if len(ts) != 2 {
221 return EINVAL
222 }
223 err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
224 if err != ENOSYS {
225 return err
226 }
227
228
229 var tv [2]Timeval
230 for i := 0; i < 2; i++ {
231 tv[i] = NsecToTimeval(TimespecToNsec(ts[i]))
232 }
233 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
234 }
235
236 func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {
237 if ts == nil {
238 return utimensat(dirfd, path, nil, flags)
239 }
240 if len(ts) != 2 {
241 return EINVAL
242 }
243 return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
244 }
245
246 func Futimesat(dirfd int, path string, tv []Timeval) error {
247 if tv == nil {
248 return futimesat(dirfd, path, nil)
249 }
250 if len(tv) != 2 {
251 return EINVAL
252 }
253 return futimesat(dirfd, path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
254 }
255
256 func Futimes(fd int, tv []Timeval) (err error) {
257
258
259 return Utimes("/proc/self/fd/"+itoa(fd), tv)
260 }
261
262 const ImplementsGetwd = true
263
264
265
266 func Getwd() (wd string, err error) {
267 var buf [PathMax]byte
268 n, err := Getcwd(buf[0:])
269 if err != nil {
270 return "", err
271 }
272
273 if n < 1 || n > len(buf) || buf[n-1] != 0 {
274 return "", EINVAL
275 }
276 return string(buf[0 : n-1]), nil
277 }
278
279 func Getgroups() (gids []int, err error) {
280 n, err := getgroups(0, nil)
281 if err != nil {
282 return nil, err
283 }
284 if n == 0 {
285 return nil, nil
286 }
287
288
289 if n < 0 || n > 1<<20 {
290 return nil, EINVAL
291 }
292
293 a := make([]_Gid_t, n)
294 n, err = getgroups(n, &a[0])
295 if err != nil {
296 return nil, err
297 }
298 gids = make([]int, n)
299 for i, v := range a[0:n] {
300 gids[i] = int(v)
301 }
302 return
303 }
304
305 func Setgroups(gids []int) (err error) {
306 if len(gids) == 0 {
307 return setgroups(0, nil)
308 }
309
310 a := make([]_Gid_t, len(gids))
311 for i, v := range gids {
312 a[i] = _Gid_t(v)
313 }
314 return setgroups(len(a), &a[0])
315 }
316
317 type WaitStatus uint32
318
319
320
321
322
323
324
325
326
327
328 const (
329 mask = 0x7F
330 core = 0x80
331 exited = 0x00
332 stopped = 0x7F
333 shift = 8
334 )
335
336 func (w WaitStatus) Exited() bool { return w&mask == exited }
337
338 func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited }
339
340 func (w WaitStatus) Stopped() bool { return w&0xFF == stopped }
341
342 func (w WaitStatus) Continued() bool { return w == 0xFFFF }
343
344 func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }
345
346 func (w WaitStatus) ExitStatus() int {
347 if !w.Exited() {
348 return -1
349 }
350 return int(w>>shift) & 0xFF
351 }
352
353 func (w WaitStatus) Signal() syscall.Signal {
354 if !w.Signaled() {
355 return -1
356 }
357 return syscall.Signal(w & mask)
358 }
359
360 func (w WaitStatus) StopSignal() syscall.Signal {
361 if !w.Stopped() {
362 return -1
363 }
364 return syscall.Signal(w>>shift) & 0xFF
365 }
366
367 func (w WaitStatus) TrapCause() int {
368 if w.StopSignal() != SIGTRAP {
369 return -1
370 }
371 return int(w>>shift) >> 8
372 }
373
374
375
376 func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
377 var status _C_int
378 wpid, err = wait4(pid, &status, options, rusage)
379 if wstatus != nil {
380 *wstatus = WaitStatus(status)
381 }
382 return
383 }
384
385 func Mkfifo(path string, mode uint32) error {
386 return Mknod(path, mode|S_IFIFO, 0)
387 }
388
389 func Mkfifoat(dirfd int, path string, mode uint32) error {
390 return Mknodat(dirfd, path, mode|S_IFIFO, 0)
391 }
392
393 func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
394 if sa.Port < 0 || sa.Port > 0xFFFF {
395 return nil, 0, EINVAL
396 }
397 sa.raw.Family = AF_INET
398 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
399 p[0] = byte(sa.Port >> 8)
400 p[1] = byte(sa.Port)
401 for i := 0; i < len(sa.Addr); i++ {
402 sa.raw.Addr[i] = sa.Addr[i]
403 }
404 return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil
405 }
406
407 func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
408 if sa.Port < 0 || sa.Port > 0xFFFF {
409 return nil, 0, EINVAL
410 }
411 sa.raw.Family = AF_INET6
412 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
413 p[0] = byte(sa.Port >> 8)
414 p[1] = byte(sa.Port)
415 sa.raw.Scope_id = sa.ZoneId
416 for i := 0; i < len(sa.Addr); i++ {
417 sa.raw.Addr[i] = sa.Addr[i]
418 }
419 return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil
420 }
421
422 func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
423 name := sa.Name
424 n := len(name)
425 if n >= len(sa.raw.Path) {
426 return nil, 0, EINVAL
427 }
428 sa.raw.Family = AF_UNIX
429 for i := 0; i < n; i++ {
430 sa.raw.Path[i] = int8(name[i])
431 }
432
433 sl := _Socklen(2)
434 if n > 0 {
435 sl += _Socklen(n) + 1
436 }
437 if sa.raw.Path[0] == '@' {
438 sa.raw.Path[0] = 0
439
440 sl--
441 }
442
443 return unsafe.Pointer(&sa.raw), sl, nil
444 }
445
446
447 type SockaddrLinklayer struct {
448 Protocol uint16
449 Ifindex int
450 Hatype uint16
451 Pkttype uint8
452 Halen uint8
453 Addr [8]byte
454 raw RawSockaddrLinklayer
455 }
456
457 func (sa *SockaddrLinklayer) sockaddr() (unsafe.Pointer, _Socklen, error) {
458 if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff {
459 return nil, 0, EINVAL
460 }
461 sa.raw.Family = AF_PACKET
462 sa.raw.Protocol = sa.Protocol
463 sa.raw.Ifindex = int32(sa.Ifindex)
464 sa.raw.Hatype = sa.Hatype
465 sa.raw.Pkttype = sa.Pkttype
466 sa.raw.Halen = sa.Halen
467 for i := 0; i < len(sa.Addr); i++ {
468 sa.raw.Addr[i] = sa.Addr[i]
469 }
470 return unsafe.Pointer(&sa.raw), SizeofSockaddrLinklayer, nil
471 }
472
473
474 type SockaddrNetlink struct {
475 Family uint16
476 Pad uint16
477 Pid uint32
478 Groups uint32
479 raw RawSockaddrNetlink
480 }
481
482 func (sa *SockaddrNetlink) sockaddr() (unsafe.Pointer, _Socklen, error) {
483 sa.raw.Family = AF_NETLINK
484 sa.raw.Pad = sa.Pad
485 sa.raw.Pid = sa.Pid
486 sa.raw.Groups = sa.Groups
487 return unsafe.Pointer(&sa.raw), SizeofSockaddrNetlink, nil
488 }
489
490
491
492 type SockaddrHCI struct {
493 Dev uint16
494 Channel uint16
495 raw RawSockaddrHCI
496 }
497
498 func (sa *SockaddrHCI) sockaddr() (unsafe.Pointer, _Socklen, error) {
499 sa.raw.Family = AF_BLUETOOTH
500 sa.raw.Dev = sa.Dev
501 sa.raw.Channel = sa.Channel
502 return unsafe.Pointer(&sa.raw), SizeofSockaddrHCI, nil
503 }
504
505
506
507 type SockaddrL2 struct {
508 PSM uint16
509 CID uint16
510 Addr [6]uint8
511 AddrType uint8
512 raw RawSockaddrL2
513 }
514
515 func (sa *SockaddrL2) sockaddr() (unsafe.Pointer, _Socklen, error) {
516 sa.raw.Family = AF_BLUETOOTH
517 psm := (*[2]byte)(unsafe.Pointer(&sa.raw.Psm))
518 psm[0] = byte(sa.PSM)
519 psm[1] = byte(sa.PSM >> 8)
520 for i := 0; i < len(sa.Addr); i++ {
521 sa.raw.Bdaddr[i] = sa.Addr[len(sa.Addr)-1-i]
522 }
523 cid := (*[2]byte)(unsafe.Pointer(&sa.raw.Cid))
524 cid[0] = byte(sa.CID)
525 cid[1] = byte(sa.CID >> 8)
526 sa.raw.Bdaddr_type = sa.AddrType
527 return unsafe.Pointer(&sa.raw), SizeofSockaddrL2, nil
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 type SockaddrRFCOMM struct {
554
555 Addr [6]uint8
556
557
558
559 Channel uint8
560
561 raw RawSockaddrRFCOMM
562 }
563
564 func (sa *SockaddrRFCOMM) sockaddr() (unsafe.Pointer, _Socklen, error) {
565 sa.raw.Family = AF_BLUETOOTH
566 sa.raw.Channel = sa.Channel
567 sa.raw.Bdaddr = sa.Addr
568 return unsafe.Pointer(&sa.raw), SizeofSockaddrRFCOMM, nil
569 }
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588 type SockaddrCAN struct {
589 Ifindex int
590 RxID uint32
591 TxID uint32
592 raw RawSockaddrCAN
593 }
594
595 func (sa *SockaddrCAN) sockaddr() (unsafe.Pointer, _Socklen, error) {
596 if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff {
597 return nil, 0, EINVAL
598 }
599 sa.raw.Family = AF_CAN
600 sa.raw.Ifindex = int32(sa.Ifindex)
601 rx := (*[4]byte)(unsafe.Pointer(&sa.RxID))
602 for i := 0; i < 4; i++ {
603 sa.raw.Addr[i] = rx[i]
604 }
605 tx := (*[4]byte)(unsafe.Pointer(&sa.TxID))
606 for i := 0; i < 4; i++ {
607 sa.raw.Addr[i+4] = tx[i]
608 }
609 return unsafe.Pointer(&sa.raw), SizeofSockaddrCAN, nil
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
637
638
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 type SockaddrALG struct {
676 Type string
677 Name string
678 Feature uint32
679 Mask uint32
680 raw RawSockaddrALG
681 }
682
683 func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) {
684
685 if len(sa.Type) > 13 {
686 return nil, 0, EINVAL
687 }
688 if len(sa.Name) > 63 {
689 return nil, 0, EINVAL
690 }
691
692 sa.raw.Family = AF_ALG
693 sa.raw.Feat = sa.Feature
694 sa.raw.Mask = sa.Mask
695
696 typ, err := ByteSliceFromString(sa.Type)
697 if err != nil {
698 return nil, 0, err
699 }
700 name, err := ByteSliceFromString(sa.Name)
701 if err != nil {
702 return nil, 0, err
703 }
704
705 copy(sa.raw.Type[:], typ)
706 copy(sa.raw.Name[:], name)
707
708 return unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil
709 }
710
711
712
713
714
715 type SockaddrVM struct {
716
717
718
719
720 CID uint32
721 Port uint32
722 raw RawSockaddrVM
723 }
724
725 func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) {
726 sa.raw.Family = AF_VSOCK
727 sa.raw.Port = sa.Port
728 sa.raw.Cid = sa.CID
729
730 return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil
731 }
732
733 type SockaddrXDP struct {
734 Flags uint16
735 Ifindex uint32
736 QueueID uint32
737 SharedUmemFD uint32
738 raw RawSockaddrXDP
739 }
740
741 func (sa *SockaddrXDP) sockaddr() (unsafe.Pointer, _Socklen, error) {
742 sa.raw.Family = AF_XDP
743 sa.raw.Flags = sa.Flags
744 sa.raw.Ifindex = sa.Ifindex
745 sa.raw.Queue_id = sa.QueueID
746 sa.raw.Shared_umem_fd = sa.SharedUmemFD
747
748 return unsafe.Pointer(&sa.raw), SizeofSockaddrXDP, nil
749 }
750
751
752
753
754
755
756
757
758 const px_proto_oe = 0
759
760 type SockaddrPPPoE struct {
761 SID uint16
762 Remote net.HardwareAddr
763 Dev string
764 raw RawSockaddrPPPoX
765 }
766
767 func (sa *SockaddrPPPoE) sockaddr() (unsafe.Pointer, _Socklen, error) {
768 if len(sa.Remote) != 6 {
769 return nil, 0, EINVAL
770 }
771 if len(sa.Dev) > IFNAMSIZ-1 {
772 return nil, 0, EINVAL
773 }
774
775 *(*uint16)(unsafe.Pointer(&sa.raw[0])) = AF_PPPOX
776
777
778
779
780
781
782
783
784 binary.BigEndian.PutUint32(sa.raw[2:6], px_proto_oe)
785
786
787 binary.BigEndian.PutUint16(sa.raw[6:8], sa.SID)
788 copy(sa.raw[8:14], sa.Remote)
789 for i := 14; i < 14+IFNAMSIZ; i++ {
790 sa.raw[i] = 0
791 }
792 copy(sa.raw[14:], sa.Dev)
793 return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil
794 }
795
796 func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
797 switch rsa.Addr.Family {
798 case AF_NETLINK:
799 pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa))
800 sa := new(SockaddrNetlink)
801 sa.Family = pp.Family
802 sa.Pad = pp.Pad
803 sa.Pid = pp.Pid
804 sa.Groups = pp.Groups
805 return sa, nil
806
807 case AF_PACKET:
808 pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa))
809 sa := new(SockaddrLinklayer)
810 sa.Protocol = pp.Protocol
811 sa.Ifindex = int(pp.Ifindex)
812 sa.Hatype = pp.Hatype
813 sa.Pkttype = pp.Pkttype
814 sa.Halen = pp.Halen
815 for i := 0; i < len(sa.Addr); i++ {
816 sa.Addr[i] = pp.Addr[i]
817 }
818 return sa, nil
819
820 case AF_UNIX:
821 pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
822 sa := new(SockaddrUnix)
823 if pp.Path[0] == 0 {
824
825
826
827
828
829 pp.Path[0] = '@'
830 }
831
832
833
834
835
836
837 n := 0
838 for n < len(pp.Path) && pp.Path[n] != 0 {
839 n++
840 }
841 bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
842 sa.Name = string(bytes)
843 return sa, nil
844
845 case AF_INET:
846 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
847 sa := new(SockaddrInet4)
848 p := (*[2]byte)(unsafe.Pointer(&pp.Port))
849 sa.Port = int(p[0])<<8 + int(p[1])
850 for i := 0; i < len(sa.Addr); i++ {
851 sa.Addr[i] = pp.Addr[i]
852 }
853 return sa, nil
854
855 case AF_INET6:
856 pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
857 sa := new(SockaddrInet6)
858 p := (*[2]byte)(unsafe.Pointer(&pp.Port))
859 sa.Port = int(p[0])<<8 + int(p[1])
860 sa.ZoneId = pp.Scope_id
861 for i := 0; i < len(sa.Addr); i++ {
862 sa.Addr[i] = pp.Addr[i]
863 }
864 return sa, nil
865
866 case AF_VSOCK:
867 pp := (*RawSockaddrVM)(unsafe.Pointer(rsa))
868 sa := &SockaddrVM{
869 CID: pp.Cid,
870 Port: pp.Port,
871 }
872 return sa, nil
873 case AF_BLUETOOTH:
874 proto, err := GetsockoptInt(fd, SOL_SOCKET, SO_PROTOCOL)
875 if err != nil {
876 return nil, err
877 }
878
879 switch proto {
880 case BTPROTO_L2CAP:
881 pp := (*RawSockaddrL2)(unsafe.Pointer(rsa))
882 sa := &SockaddrL2{
883 PSM: pp.Psm,
884 CID: pp.Cid,
885 Addr: pp.Bdaddr,
886 AddrType: pp.Bdaddr_type,
887 }
888 return sa, nil
889 case BTPROTO_RFCOMM:
890 pp := (*RawSockaddrRFCOMM)(unsafe.Pointer(rsa))
891 sa := &SockaddrRFCOMM{
892 Channel: pp.Channel,
893 Addr: pp.Bdaddr,
894 }
895 return sa, nil
896 }
897 case AF_XDP:
898 pp := (*RawSockaddrXDP)(unsafe.Pointer(rsa))
899 sa := &SockaddrXDP{
900 Flags: pp.Flags,
901 Ifindex: pp.Ifindex,
902 QueueID: pp.Queue_id,
903 SharedUmemFD: pp.Shared_umem_fd,
904 }
905 return sa, nil
906 case AF_PPPOX:
907 pp := (*RawSockaddrPPPoX)(unsafe.Pointer(rsa))
908 if binary.BigEndian.Uint32(pp[2:6]) != px_proto_oe {
909 return nil, EINVAL
910 }
911 sa := &SockaddrPPPoE{
912 SID: binary.BigEndian.Uint16(pp[6:8]),
913 Remote: net.HardwareAddr(pp[8:14]),
914 }
915 for i := 14; i < 14+IFNAMSIZ; i++ {
916 if pp[i] == 0 {
917 sa.Dev = string(pp[14:i])
918 break
919 }
920 }
921 return sa, nil
922 }
923 return nil, EAFNOSUPPORT
924 }
925
926 func Accept(fd int) (nfd int, sa Sockaddr, err error) {
927 var rsa RawSockaddrAny
928 var len _Socklen = SizeofSockaddrAny
929 nfd, err = accept(fd, &rsa, &len)
930 if err != nil {
931 return
932 }
933 sa, err = anyToSockaddr(fd, &rsa)
934 if err != nil {
935 Close(nfd)
936 nfd = 0
937 }
938 return
939 }
940
941 func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {
942 var rsa RawSockaddrAny
943 var len _Socklen = SizeofSockaddrAny
944 nfd, err = accept4(fd, &rsa, &len, flags)
945 if err != nil {
946 return
947 }
948 if len > SizeofSockaddrAny {
949 panic("RawSockaddrAny too small")
950 }
951 sa, err = anyToSockaddr(fd, &rsa)
952 if err != nil {
953 Close(nfd)
954 nfd = 0
955 }
956 return
957 }
958
959 func Getsockname(fd int) (sa Sockaddr, err error) {
960 var rsa RawSockaddrAny
961 var len _Socklen = SizeofSockaddrAny
962 if err = getsockname(fd, &rsa, &len); err != nil {
963 return
964 }
965 return anyToSockaddr(fd, &rsa)
966 }
967
968 func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {
969 var value IPMreqn
970 vallen := _Socklen(SizeofIPMreqn)
971 err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
972 return &value, err
973 }
974
975 func GetsockoptUcred(fd, level, opt int) (*Ucred, error) {
976 var value Ucred
977 vallen := _Socklen(SizeofUcred)
978 err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
979 return &value, err
980 }
981
982 func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) {
983 var value TCPInfo
984 vallen := _Socklen(SizeofTCPInfo)
985 err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
986 return &value, err
987 }
988
989
990
991 func GetsockoptString(fd, level, opt int) (string, error) {
992 buf := make([]byte, 256)
993 vallen := _Socklen(len(buf))
994 err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
995 if err != nil {
996 if err == ERANGE {
997 buf = make([]byte, vallen)
998 err = getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
999 }
1000 if err != nil {
1001 return "", err
1002 }
1003 }
1004 return string(buf[:vallen-1]), nil
1005 }
1006
1007 func GetsockoptTpacketStats(fd, level, opt int) (*TpacketStats, error) {
1008 var value TpacketStats
1009 vallen := _Socklen(SizeofTpacketStats)
1010 err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
1011 return &value, err
1012 }
1013
1014 func GetsockoptTpacketStatsV3(fd, level, opt int) (*TpacketStatsV3, error) {
1015 var value TpacketStatsV3
1016 vallen := _Socklen(SizeofTpacketStatsV3)
1017 err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
1018 return &value, err
1019 }
1020
1021 func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {
1022 return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq))
1023 }
1024
1025 func SetsockoptPacketMreq(fd, level, opt int, mreq *PacketMreq) error {
1026 return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq))
1027 }
1028
1029
1030
1031 func SetsockoptSockFprog(fd, level, opt int, fprog *SockFprog) error {
1032 return setsockopt(fd, level, opt, unsafe.Pointer(fprog), unsafe.Sizeof(*fprog))
1033 }
1034
1035 func SetsockoptCanRawFilter(fd, level, opt int, filter []CanFilter) error {
1036 var p unsafe.Pointer
1037 if len(filter) > 0 {
1038 p = unsafe.Pointer(&filter[0])
1039 }
1040 return setsockopt(fd, level, opt, p, uintptr(len(filter)*SizeofCanFilter))
1041 }
1042
1043 func SetsockoptTpacketReq(fd, level, opt int, tp *TpacketReq) error {
1044 return setsockopt(fd, level, opt, unsafe.Pointer(tp), unsafe.Sizeof(*tp))
1045 }
1046
1047 func SetsockoptTpacketReq3(fd, level, opt int, tp *TpacketReq3) error {
1048 return setsockopt(fd, level, opt, unsafe.Pointer(tp), unsafe.Sizeof(*tp))
1049 }
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067 func KeyctlString(cmd int, id int) (string, error) {
1068
1069
1070
1071
1072 var buffer []byte
1073 for {
1074
1075 length, err := KeyctlBuffer(cmd, id, buffer, 0)
1076 if err != nil {
1077 return "", err
1078 }
1079
1080
1081 if length <= len(buffer) {
1082
1083 return string(buffer[:length-1]), nil
1084 }
1085
1086
1087 buffer = make([]byte, length)
1088 }
1089 }
1090
1091
1092
1093
1094
1095
1096 func KeyctlGetKeyringID(id int, create bool) (ringid int, err error) {
1097 createInt := 0
1098 if create {
1099 createInt = 1
1100 }
1101 return KeyctlInt(KEYCTL_GET_KEYRING_ID, id, createInt, 0, 0)
1102 }
1103
1104
1105
1106
1107
1108
1109 func KeyctlSetperm(id int, perm uint32) error {
1110 _, err := KeyctlInt(KEYCTL_SETPERM, id, int(perm), 0, 0)
1111 return err
1112 }
1113
1114
1115
1116
1117
1118
1119 func KeyctlJoinSessionKeyring(name string) (ringid int, err error) {
1120 return keyctlJoin(KEYCTL_JOIN_SESSION_KEYRING, name)
1121 }
1122
1123
1124
1125
1126
1127
1128 func KeyctlSearch(ringid int, keyType, description string, destRingid int) (id int, err error) {
1129 return keyctlSearch(KEYCTL_SEARCH, ringid, keyType, description, destRingid)
1130 }
1131
1132
1133
1134
1135
1136
1137
1138
1139 func KeyctlInstantiateIOV(id int, payload []Iovec, ringid int) error {
1140 return keyctlIOV(KEYCTL_INSTANTIATE_IOV, id, payload, ringid)
1141 }
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154 func KeyctlDHCompute(params *KeyctlDHParams, buffer []byte) (size int, err error) {
1155 return keyctlDH(KEYCTL_DH_COMPUTE, params, buffer)
1156 }
1157
1158 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
1159 var msg Msghdr
1160 var rsa RawSockaddrAny
1161 msg.Name = (*byte)(unsafe.Pointer(&rsa))
1162 msg.Namelen = uint32(SizeofSockaddrAny)
1163 var iov Iovec
1164 if len(p) > 0 {
1165 iov.Base = &p[0]
1166 iov.SetLen(len(p))
1167 }
1168 var dummy byte
1169 if len(oob) > 0 {
1170 if len(p) == 0 {
1171 var sockType int
1172 sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
1173 if err != nil {
1174 return
1175 }
1176
1177 if sockType != SOCK_DGRAM {
1178 iov.Base = &dummy
1179 iov.SetLen(1)
1180 }
1181 }
1182 msg.Control = &oob[0]
1183 msg.SetControllen(len(oob))
1184 }
1185 msg.Iov = &iov
1186 msg.Iovlen = 1
1187 if n, err = recvmsg(fd, &msg, flags); err != nil {
1188 return
1189 }
1190 oobn = int(msg.Controllen)
1191 recvflags = int(msg.Flags)
1192
1193 if rsa.Addr.Family != AF_UNSPEC {
1194 from, err = anyToSockaddr(fd, &rsa)
1195 }
1196 return
1197 }
1198
1199 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
1200 _, err = SendmsgN(fd, p, oob, to, flags)
1201 return
1202 }
1203
1204 func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
1205 var ptr unsafe.Pointer
1206 var salen _Socklen
1207 if to != nil {
1208 var err error
1209 ptr, salen, err = to.sockaddr()
1210 if err != nil {
1211 return 0, err
1212 }
1213 }
1214 var msg Msghdr
1215 msg.Name = (*byte)(ptr)
1216 msg.Namelen = uint32(salen)
1217 var iov Iovec
1218 if len(p) > 0 {
1219 iov.Base = &p[0]
1220 iov.SetLen(len(p))
1221 }
1222 var dummy byte
1223 if len(oob) > 0 {
1224 if len(p) == 0 {
1225 var sockType int
1226 sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
1227 if err != nil {
1228 return 0, err
1229 }
1230
1231 if sockType != SOCK_DGRAM {
1232 iov.Base = &dummy
1233 iov.SetLen(1)
1234 }
1235 }
1236 msg.Control = &oob[0]
1237 msg.SetControllen(len(oob))
1238 }
1239 msg.Iov = &iov
1240 msg.Iovlen = 1
1241 if n, err = sendmsg(fd, &msg, flags); err != nil {
1242 return 0, err
1243 }
1244 if len(oob) > 0 && len(p) == 0 {
1245 n = 0
1246 }
1247 return n, nil
1248 }
1249
1250
1251 func BindToDevice(fd int, device string) (err error) {
1252 return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device)
1253 }
1254
1255
1256
1257 func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) {
1258
1259
1260
1261
1262
1263
1264 var buf [SizeofPtr]byte
1265
1266
1267
1268
1269
1270
1271 n := 0
1272 if addr%SizeofPtr != 0 {
1273 err = ptrace(req, pid, addr-addr%SizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
1274 if err != nil {
1275 return 0, err
1276 }
1277 n += copy(out, buf[addr%SizeofPtr:])
1278 out = out[n:]
1279 }
1280
1281
1282 for len(out) > 0 {
1283
1284
1285 err = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
1286 if err != nil {
1287 return n, err
1288 }
1289 copied := copy(out, buf[0:])
1290 n += copied
1291 out = out[copied:]
1292 }
1293
1294 return n, nil
1295 }
1296
1297 func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) {
1298 return ptracePeek(PTRACE_PEEKTEXT, pid, addr, out)
1299 }
1300
1301 func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {
1302 return ptracePeek(PTRACE_PEEKDATA, pid, addr, out)
1303 }
1304
1305 func PtracePeekUser(pid int, addr uintptr, out []byte) (count int, err error) {
1306 return ptracePeek(PTRACE_PEEKUSR, pid, addr, out)
1307 }
1308
1309 func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) {
1310
1311
1312
1313
1314 n := 0
1315 if addr%SizeofPtr != 0 {
1316 var buf [SizeofPtr]byte
1317 err = ptrace(peekReq, pid, addr-addr%SizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
1318 if err != nil {
1319 return 0, err
1320 }
1321 n += copy(buf[addr%SizeofPtr:], data)
1322 word := *((*uintptr)(unsafe.Pointer(&buf[0])))
1323 err = ptrace(pokeReq, pid, addr-addr%SizeofPtr, word)
1324 if err != nil {
1325 return 0, err
1326 }
1327 data = data[n:]
1328 }
1329
1330
1331 for len(data) > SizeofPtr {
1332 word := *((*uintptr)(unsafe.Pointer(&data[0])))
1333 err = ptrace(pokeReq, pid, addr+uintptr(n), word)
1334 if err != nil {
1335 return n, err
1336 }
1337 n += SizeofPtr
1338 data = data[SizeofPtr:]
1339 }
1340
1341
1342 if len(data) > 0 {
1343 var buf [SizeofPtr]byte
1344 err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
1345 if err != nil {
1346 return n, err
1347 }
1348 copy(buf[0:], data)
1349 word := *((*uintptr)(unsafe.Pointer(&buf[0])))
1350 err = ptrace(pokeReq, pid, addr+uintptr(n), word)
1351 if err != nil {
1352 return n, err
1353 }
1354 n += len(data)
1355 }
1356
1357 return n, nil
1358 }
1359
1360 func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) {
1361 return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, pid, addr, data)
1362 }
1363
1364 func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) {
1365 return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data)
1366 }
1367
1368 func PtracePokeUser(pid int, addr uintptr, data []byte) (count int, err error) {
1369 return ptracePoke(PTRACE_POKEUSR, PTRACE_PEEKUSR, pid, addr, data)
1370 }
1371
1372 func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
1373 return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
1374 }
1375
1376 func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
1377 return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
1378 }
1379
1380 func PtraceSetOptions(pid int, options int) (err error) {
1381 return ptrace(PTRACE_SETOPTIONS, pid, 0, uintptr(options))
1382 }
1383
1384 func PtraceGetEventMsg(pid int) (msg uint, err error) {
1385 var data _C_long
1386 err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data)))
1387 msg = uint(data)
1388 return
1389 }
1390
1391 func PtraceCont(pid int, signal int) (err error) {
1392 return ptrace(PTRACE_CONT, pid, 0, uintptr(signal))
1393 }
1394
1395 func PtraceSyscall(pid int, signal int) (err error) {
1396 return ptrace(PTRACE_SYSCALL, pid, 0, uintptr(signal))
1397 }
1398
1399 func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) }
1400
1401 func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) }
1402
1403 func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) }
1404
1405
1406
1407 func Reboot(cmd int) (err error) {
1408 return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "")
1409 }
1410
1411 func ReadDirent(fd int, buf []byte) (n int, err error) {
1412 return Getdents(fd, buf)
1413 }
1414
1415
1416
1417 func Mount(source string, target string, fstype string, flags uintptr, data string) (err error) {
1418
1419
1420 if data == "" {
1421 return mount(source, target, fstype, flags, nil)
1422 }
1423 datap, err := BytePtrFromString(data)
1424 if err != nil {
1425 return err
1426 }
1427 return mount(source, target, fstype, flags, datap)
1428 }
1429
1430 func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
1431 if raceenabled {
1432 raceReleaseMerge(unsafe.Pointer(&ioSync))
1433 }
1434 return sendfile(outfd, infd, offset, count)
1435 }
1436
1437
1438
1439
1440
1441
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477 func Getpgrp() (pid int) {
1478 pid, _ = Getpgid(0)
1479 return
1480 }
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526 func Setuid(uid int) (err error) {
1527 return EOPNOTSUPP
1528 }
1529
1530 func Setgid(uid int) (err error) {
1531 return EOPNOTSUPP
1532 }
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556 var mapper = &mmapper{
1557 active: make(map[*byte][]byte),
1558 mmap: mmap,
1559 munmap: munmap,
1560 }
1561
1562 func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
1563 return mapper.Mmap(fd, offset, length, prot, flags)
1564 }
1565
1566 func Munmap(b []byte) (err error) {
1567 return mapper.Munmap(b)
1568 }
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580 func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) {
1581 var p unsafe.Pointer
1582 if len(iovs) > 0 {
1583 p = unsafe.Pointer(&iovs[0])
1584 }
1585
1586 n, _, errno := Syscall6(SYS_VMSPLICE, uintptr(fd), uintptr(p), uintptr(len(iovs)), uintptr(flags), 0, 0)
1587 if errno != 0 {
1588 return 0, syscall.Errno(errno)
1589 }
1590
1591 return int(n), nil
1592 }
1593
1594
1595
1596 func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {
1597 if flags & ^(AT_SYMLINK_NOFOLLOW|AT_EACCESS) != 0 {
1598 return EINVAL
1599 }
1600
1601
1602
1603
1604
1605
1606
1607 if flags == 0 {
1608 return faccessat(dirfd, path, mode)
1609 }
1610
1611 var st Stat_t
1612 if err := Fstatat(dirfd, path, &st, flags&AT_SYMLINK_NOFOLLOW); err != nil {
1613 return err
1614 }
1615
1616 mode &= 7
1617 if mode == 0 {
1618 return nil
1619 }
1620
1621 var uid int
1622 if flags&AT_EACCESS != 0 {
1623 uid = Geteuid()
1624 } else {
1625 uid = Getuid()
1626 }
1627
1628 if uid == 0 {
1629 if mode&1 == 0 {
1630
1631 return nil
1632 }
1633 if st.Mode&0111 != 0 {
1634
1635 return nil
1636 }
1637 return EACCES
1638 }
1639
1640 var fmode uint32
1641 if uint32(uid) == st.Uid {
1642 fmode = (st.Mode >> 6) & 7
1643 } else {
1644 var gid int
1645 if flags&AT_EACCESS != 0 {
1646 gid = Getegid()
1647 } else {
1648 gid = Getgid()
1649 }
1650
1651 if uint32(gid) == st.Gid {
1652 fmode = (st.Mode >> 3) & 7
1653 } else {
1654 fmode = st.Mode & 7
1655 }
1656 }
1657
1658 if fmode&mode == mode {
1659 return nil
1660 }
1661
1662 return EACCES
1663 }
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673 type fileHandle struct {
1674 Bytes uint32
1675 Type int32
1676 }
1677
1678
1679
1680
1681 type FileHandle struct {
1682 *fileHandle
1683 }
1684
1685
1686 func NewFileHandle(handleType int32, handle []byte) FileHandle {
1687 const hdrSize = unsafe.Sizeof(fileHandle{})
1688 buf := make([]byte, hdrSize+uintptr(len(handle)))
1689 copy(buf[hdrSize:], handle)
1690 fh := (*fileHandle)(unsafe.Pointer(&buf[0]))
1691 fh.Type = handleType
1692 fh.Bytes = uint32(len(handle))
1693 return FileHandle{fh}
1694 }
1695
1696 func (fh *FileHandle) Size() int { return int(fh.fileHandle.Bytes) }
1697 func (fh *FileHandle) Type() int32 { return fh.fileHandle.Type }
1698 func (fh *FileHandle) Bytes() []byte {
1699 n := fh.Size()
1700 if n == 0 {
1701 return nil
1702 }
1703 return (*[1 << 30]byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&fh.fileHandle.Type)) + 4))[:n:n]
1704 }
1705
1706
1707
1708 func NameToHandleAt(dirfd int, path string, flags int) (handle FileHandle, mountID int, err error) {
1709 var mid _C_int
1710
1711
1712 size := uint32(32 + unsafe.Sizeof(fileHandle{}))
1713 didResize := false
1714 for {
1715 buf := make([]byte, size)
1716 fh := (*fileHandle)(unsafe.Pointer(&buf[0]))
1717 fh.Bytes = size - uint32(unsafe.Sizeof(fileHandle{}))
1718 err = nameToHandleAt(dirfd, path, fh, &mid, flags)
1719 if err == EOVERFLOW {
1720 if didResize {
1721
1722 return
1723 }
1724 didResize = true
1725 size = fh.Bytes + uint32(unsafe.Sizeof(fileHandle{}))
1726 continue
1727 }
1728 if err != nil {
1729 return
1730 }
1731 return FileHandle{fh}, int(mid), nil
1732 }
1733 }
1734
1735
1736
1737 func OpenByHandleAt(mountFD int, handle FileHandle, flags int) (fd int, err error) {
1738 return openByHandleAt(mountFD, handle.fileHandle, flags)
1739 }
1740
1741
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
View as plain text