Source file src/pkg/syscall/syscall_linux.go
1
2
3
4
5
6
7
8
9
10
11
12 package syscall
13
14 import "unsafe"
15
16 17 18
19
20
21
22 func Open(path string, mode int, perm uint32) (fd int, err error) {
23 return open(path, mode|O_LARGEFILE, perm)
24 }
25
26
27
28 func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {
29 return openat(dirfd, path, flags|O_LARGEFILE, mode)
30 }
31
32
33
34 func Pipe(p []int) (err error) {
35 if len(p) != 2 {
36 return EINVAL
37 }
38 var pp [2]_C_int
39 err = pipe(&pp)
40 p[0] = int(pp[0])
41 p[1] = int(pp[1])
42 return
43 }
44
45
46
47 func Pipe2(p []int, flags int) (err error) {
48 if len(p) != 2 {
49 return EINVAL
50 }
51 var pp [2]_C_int
52 err = pipe2(&pp, flags)
53 p[0] = int(pp[0])
54 p[1] = int(pp[1])
55 return
56 }
57
58
59
60 func Utimes(path string, tv []Timeval) (err error) {
61 if len(tv) != 2 {
62 return EINVAL
63 }
64 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
65 }
66
67
68
69 func UtimesNano(path string, ts []Timespec) (err error) {
70 if len(ts) != 2 {
71 return EINVAL
72 }
73 err = utimensat(_AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])))
74 if err != ENOSYS {
75 return err
76 }
77
78
79 var tv [2]Timeval
80 for i := 0; i < 2; i++ {
81 tv[i].Sec = ts[i].Sec
82 tv[i].Usec = ts[i].Nsec / 1000
83 }
84 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
85 }
86
87
88
89 func Futimesat(dirfd int, path string, tv []Timeval) (err error) {
90 if len(tv) != 2 {
91 return EINVAL
92 }
93 pathp, err := BytePtrFromString(path)
94 if err != nil {
95 return err
96 }
97 return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
98 }
99
100 func Futimes(fd int, tv []Timeval) (err error) {
101
102
103 return Utimes("/proc/self/fd/"+itoa(fd), tv)
104 }
105
106 const ImplementsGetwd = true
107
108
109
110 func Getwd() (wd string, err error) {
111 var buf [PathMax]byte
112 n, err := Getcwd(buf[0:])
113 if err != nil {
114 return "", err
115 }
116
117 if n < 1 || n > len(buf) || buf[n-1] != 0 {
118 return "", EINVAL
119 }
120 return string(buf[0 : n-1]), nil
121 }
122
123 func Getgroups() (gids []int, err error) {
124 n, err := getgroups(0, nil)
125 if err != nil {
126 return nil, err
127 }
128 if n == 0 {
129 return nil, nil
130 }
131
132
133 if n < 0 || n > 1<<20 {
134 return nil, EINVAL
135 }
136
137 a := make([]_Gid_t, n)
138 n, err = getgroups(n, &a[0])
139 if err != nil {
140 return nil, err
141 }
142 gids = make([]int, n)
143 for i, v := range a[0:n] {
144 gids[i] = int(v)
145 }
146 return
147 }
148
149 func Setgroups(gids []int) (err error) {
150 if len(gids) == 0 {
151 return setgroups(0, nil)
152 }
153
154 a := make([]_Gid_t, len(gids))
155 for i, v := range gids {
156 a[i] = _Gid_t(v)
157 }
158 return setgroups(len(a), &a[0])
159 }
160
161 type WaitStatus uint32
162
163
164
165
166
167
168
169
170
171
172 const (
173 mask = 0x7F
174 core = 0x80
175 exited = 0x00
176 stopped = 0x7F
177 shift = 8
178 )
179
180 func (w WaitStatus) Exited() bool { return w&mask == exited }
181
182 func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited }
183
184 func (w WaitStatus) Stopped() bool { return w&0xFF == stopped }
185
186 func (w WaitStatus) Continued() bool { return w == 0xFFFF }
187
188 func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }
189
190 func (w WaitStatus) ExitStatus() int {
191 if !w.Exited() {
192 return -1
193 }
194 return int(w>>shift) & 0xFF
195 }
196
197 func (w WaitStatus) Signal() Signal {
198 if !w.Signaled() {
199 return -1
200 }
201 return Signal(w & mask)
202 }
203
204 func (w WaitStatus) StopSignal() Signal {
205 if !w.Stopped() {
206 return -1
207 }
208 return Signal(w>>shift) & 0xFF
209 }
210
211 func (w WaitStatus) TrapCause() int {
212 if w.StopSignal() != SIGTRAP {
213 return -1
214 }
215 return int(w>>shift) >> 8
216 }
217
218
219
220 func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
221 var status _C_int
222 wpid, err = wait4(pid, &status, options, rusage)
223 if wstatus != nil {
224 *wstatus = WaitStatus(status)
225 }
226 return
227 }
228
229 func Mkfifo(path string, mode uint32) (err error) {
230 return Mknod(path, mode|S_IFIFO, 0)
231 }
232
233
234
235 var SocketDisableIPv6 bool
236
237 type Sockaddr interface {
238 sockaddr() (ptr uintptr, len _Socklen, err error)
239 }
240
241 type SockaddrInet4 struct {
242 Port int
243 Addr [4]byte
244 raw RawSockaddrInet4
245 }
246
247 func (sa *SockaddrInet4) sockaddr() (uintptr, _Socklen, error) {
248 if sa.Port < 0 || sa.Port > 0xFFFF {
249 return 0, 0, EINVAL
250 }
251 sa.raw.Family = AF_INET
252 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
253 p[0] = byte(sa.Port >> 8)
254 p[1] = byte(sa.Port)
255 for i := 0; i < len(sa.Addr); i++ {
256 sa.raw.Addr[i] = sa.Addr[i]
257 }
258 return uintptr(unsafe.Pointer(&sa.raw)), SizeofSockaddrInet4, nil
259 }
260
261 type SockaddrInet6 struct {
262 Port int
263 ZoneId uint32
264 Addr [16]byte
265 raw RawSockaddrInet6
266 }
267
268 func (sa *SockaddrInet6) sockaddr() (uintptr, _Socklen, error) {
269 if sa.Port < 0 || sa.Port > 0xFFFF {
270 return 0, 0, EINVAL
271 }
272 sa.raw.Family = AF_INET6
273 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
274 p[0] = byte(sa.Port >> 8)
275 p[1] = byte(sa.Port)
276 sa.raw.Scope_id = sa.ZoneId
277 for i := 0; i < len(sa.Addr); i++ {
278 sa.raw.Addr[i] = sa.Addr[i]
279 }
280 return uintptr(unsafe.Pointer(&sa.raw)), SizeofSockaddrInet6, nil
281 }
282
283 type SockaddrUnix struct {
284 Name string
285 raw RawSockaddrUnix
286 }
287
288 func (sa *SockaddrUnix) sockaddr() (uintptr, _Socklen, error) {
289 name := sa.Name
290 n := len(name)
291 if n >= len(sa.raw.Path) {
292 return 0, 0, EINVAL
293 }
294 sa.raw.Family = AF_UNIX
295 for i := 0; i < n; i++ {
296 sa.raw.Path[i] = int8(name[i])
297 }
298
299 sl := _Socklen(2)
300 if n > 0 {
301 sl += _Socklen(n) + 1
302 }
303 if sa.raw.Path[0] == '@' {
304 sa.raw.Path[0] = 0
305
306 sl--
307 }
308
309 return uintptr(unsafe.Pointer(&sa.raw)), sl, nil
310 }
311
312 type SockaddrLinklayer struct {
313 Protocol uint16
314 Ifindex int
315 Hatype uint16
316 Pkttype uint8
317 Halen uint8
318 Addr [8]byte
319 raw RawSockaddrLinklayer
320 }
321
322 func (sa *SockaddrLinklayer) sockaddr() (uintptr, _Socklen, error) {
323 if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff {
324 return 0, 0, EINVAL
325 }
326 sa.raw.Family = AF_PACKET
327 sa.raw.Protocol = sa.Protocol
328 sa.raw.Ifindex = int32(sa.Ifindex)
329 sa.raw.Hatype = sa.Hatype
330 sa.raw.Pkttype = sa.Pkttype
331 sa.raw.Halen = sa.Halen
332 for i := 0; i < len(sa.Addr); i++ {
333 sa.raw.Addr[i] = sa.Addr[i]
334 }
335 return uintptr(unsafe.Pointer(&sa.raw)), SizeofSockaddrLinklayer, nil
336 }
337
338 type SockaddrNetlink struct {
339 Family uint16
340 Pad uint16
341 Pid uint32
342 Groups uint32
343 raw RawSockaddrNetlink
344 }
345
346 func (sa *SockaddrNetlink) sockaddr() (uintptr, _Socklen, error) {
347 sa.raw.Family = AF_NETLINK
348 sa.raw.Pad = sa.Pad
349 sa.raw.Pid = sa.Pid
350 sa.raw.Groups = sa.Groups
351 return uintptr(unsafe.Pointer(&sa.raw)), SizeofSockaddrNetlink, nil
352 }
353
354 func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {
355 switch rsa.Addr.Family {
356 case AF_NETLINK:
357 pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa))
358 sa := new(SockaddrNetlink)
359 sa.Family = pp.Family
360 sa.Pad = pp.Pad
361 sa.Pid = pp.Pid
362 sa.Groups = pp.Groups
363 return sa, nil
364
365 case AF_PACKET:
366 pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa))
367 sa := new(SockaddrLinklayer)
368 sa.Protocol = pp.Protocol
369 sa.Ifindex = int(pp.Ifindex)
370 sa.Hatype = pp.Hatype
371 sa.Pkttype = pp.Pkttype
372 sa.Halen = pp.Halen
373 for i := 0; i < len(sa.Addr); i++ {
374 sa.Addr[i] = pp.Addr[i]
375 }
376 return sa, nil
377
378 case AF_UNIX:
379 pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
380 sa := new(SockaddrUnix)
381 if pp.Path[0] == 0 {
382
383
384
385
386
387 pp.Path[0] = '@'
388 }
389
390
391
392
393
394
395 n := 0
396 for n < len(pp.Path) && pp.Path[n] != 0 {
397 n++
398 }
399 bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
400 sa.Name = string(bytes)
401 return sa, nil
402
403 case AF_INET:
404 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
405 sa := new(SockaddrInet4)
406 p := (*[2]byte)(unsafe.Pointer(&pp.Port))
407 sa.Port = int(p[0])<<8 + int(p[1])
408 for i := 0; i < len(sa.Addr); i++ {
409 sa.Addr[i] = pp.Addr[i]
410 }
411 return sa, nil
412
413 case AF_INET6:
414 pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
415 sa := new(SockaddrInet6)
416 p := (*[2]byte)(unsafe.Pointer(&pp.Port))
417 sa.Port = int(p[0])<<8 + int(p[1])
418 sa.ZoneId = pp.Scope_id
419 for i := 0; i < len(sa.Addr); i++ {
420 sa.Addr[i] = pp.Addr[i]
421 }
422 return sa, nil
423 }
424 return nil, EAFNOSUPPORT
425 }
426
427 func Accept(fd int) (nfd int, sa Sockaddr, err error) {
428 var rsa RawSockaddrAny
429 var len _Socklen = SizeofSockaddrAny
430 nfd, err = accept(fd, &rsa, &len)
431 if err != nil {
432 return
433 }
434 sa, err = anyToSockaddr(&rsa)
435 if err != nil {
436 Close(nfd)
437 nfd = 0
438 }
439 return
440 }
441
442 func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {
443 var rsa RawSockaddrAny
444 var len _Socklen = SizeofSockaddrAny
445 nfd, err = accept4(fd, &rsa, &len, flags)
446 if err != nil {
447 return
448 }
449 sa, err = anyToSockaddr(&rsa)
450 if err != nil {
451 Close(nfd)
452 nfd = 0
453 }
454 return
455 }
456
457 func Getsockname(fd int) (sa Sockaddr, err error) {
458 var rsa RawSockaddrAny
459 var len _Socklen = SizeofSockaddrAny
460 if err = getsockname(fd, &rsa, &len); err != nil {
461 return
462 }
463 return anyToSockaddr(&rsa)
464 }
465
466 func Getpeername(fd int) (sa Sockaddr, err error) {
467 var rsa RawSockaddrAny
468 var len _Socklen = SizeofSockaddrAny
469 if err = getpeername(fd, &rsa, &len); err != nil {
470 return
471 }
472 return anyToSockaddr(&rsa)
473 }
474
475 func Bind(fd int, sa Sockaddr) (err error) {
476 ptr, n, err := sa.sockaddr()
477 if err != nil {
478 return err
479 }
480 return bind(fd, ptr, n)
481 }
482
483 func Connect(fd int, sa Sockaddr) (err error) {
484 ptr, n, err := sa.sockaddr()
485 if err != nil {
486 return err
487 }
488 return connect(fd, ptr, n)
489 }
490
491 func Socket(domain, typ, proto int) (fd int, err error) {
492 if domain == AF_INET6 && SocketDisableIPv6 {
493 return -1, EAFNOSUPPORT
494 }
495 fd, err = socket(domain, typ, proto)
496 return
497 }
498
499 func Socketpair(domain, typ, proto int) (fd [2]int, err error) {
500 var fdx [2]int32
501 err = socketpair(domain, typ, proto, &fdx)
502 if err == nil {
503 fd[0] = int(fdx[0])
504 fd[1] = int(fdx[1])
505 }
506 return
507 }
508
509 func GetsockoptInt(fd, level, opt int) (value int, err error) {
510 var n int32
511 vallen := _Socklen(4)
512 err = getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&n)), &vallen)
513 return int(n), err
514 }
515
516 func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) {
517 vallen := _Socklen(4)
518 err = getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value[0])), &vallen)
519 return value, err
520 }
521
522 func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) {
523 var value IPMreq
524 vallen := _Socklen(SizeofIPMreq)
525 err := getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value)), &vallen)
526 return &value, err
527 }
528
529 func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {
530 var value IPMreqn
531 vallen := _Socklen(SizeofIPMreqn)
532 err := getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value)), &vallen)
533 return &value, err
534 }
535
536 func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) {
537 var value IPv6Mreq
538 vallen := _Socklen(SizeofIPv6Mreq)
539 err := getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value)), &vallen)
540 return &value, err
541 }
542
543 func GetsockoptUcred(fd, level, opt int) (*Ucred, error) {
544 var value Ucred
545 vallen := _Socklen(SizeofUcred)
546 err := getsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value)), &vallen)
547 return &value, err
548 }
549
550 func SetsockoptInt(fd, level, opt int, value int) (err error) {
551 var n = int32(value)
552 return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(&n)), 4)
553 }
554
555 func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) {
556 return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(&value[0])), 4)
557 }
558
559 func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) {
560 return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(tv)), unsafe.Sizeof(*tv))
561 }
562
563 func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) {
564 return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(l)), unsafe.Sizeof(*l))
565 }
566
567 func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) {
568 return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(mreq)), unsafe.Sizeof(*mreq))
569 }
570
571 func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {
572 return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(mreq)), unsafe.Sizeof(*mreq))
573 }
574
575 func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) {
576 return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(mreq)), unsafe.Sizeof(*mreq))
577 }
578
579 func SetsockoptString(fd, level, opt int, s string) (err error) {
580 return setsockopt(fd, level, opt, uintptr(unsafe.Pointer(&[]byte(s)[0])), uintptr(len(s)))
581 }
582
583 func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
584 var rsa RawSockaddrAny
585 var len _Socklen = SizeofSockaddrAny
586 if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil {
587 return
588 }
589 if rsa.Addr.Family != AF_UNSPEC {
590 from, err = anyToSockaddr(&rsa)
591 }
592 return
593 }
594
595 func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) {
596 ptr, n, err := to.sockaddr()
597 if err != nil {
598 return err
599 }
600 return sendto(fd, p, flags, ptr, n)
601 }
602
603 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
604 var msg Msghdr
605 var rsa RawSockaddrAny
606 msg.Name = (*byte)(unsafe.Pointer(&rsa))
607 msg.Namelen = uint32(SizeofSockaddrAny)
608 var iov Iovec
609 if len(p) > 0 {
610 iov.Base = (*byte)(unsafe.Pointer(&p[0]))
611 iov.SetLen(len(p))
612 }
613 var dummy byte
614 if len(oob) > 0 {
615
616 if len(p) == 0 {
617 iov.Base = &dummy
618 iov.SetLen(1)
619 }
620 msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
621 msg.SetControllen(len(oob))
622 }
623 msg.Iov = &iov
624 msg.Iovlen = 1
625 if n, err = recvmsg(fd, &msg, flags); err != nil {
626 return
627 }
628 oobn = int(msg.Controllen)
629 recvflags = int(msg.Flags)
630
631 if rsa.Addr.Family != AF_UNSPEC {
632 from, err = anyToSockaddr(&rsa)
633 }
634 return
635 }
636
637 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
638 var ptr uintptr
639 var salen _Socklen
640 if to != nil {
641 var err error
642 ptr, salen, err = to.sockaddr()
643 if err != nil {
644 return err
645 }
646 }
647 var msg Msghdr
648 msg.Name = (*byte)(unsafe.Pointer(ptr))
649 msg.Namelen = uint32(salen)
650 var iov Iovec
651 if len(p) > 0 {
652 iov.Base = (*byte)(unsafe.Pointer(&p[0]))
653 iov.SetLen(len(p))
654 }
655 var dummy byte
656 if len(oob) > 0 {
657
658 if len(p) == 0 {
659 iov.Base = &dummy
660 iov.SetLen(1)
661 }
662 msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
663 msg.SetControllen(len(oob))
664 }
665 msg.Iov = &iov
666 msg.Iovlen = 1
667 if err = sendmsg(fd, &msg, flags); err != nil {
668 return
669 }
670 return
671 }
672
673
674 func BindToDevice(fd int, device string) (err error) {
675 return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device)
676 }
677
678
679
680 func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) {
681
682
683
684
685
686
687 var buf [sizeofPtr]byte
688
689
690
691
692
693
694 n := 0
695 if addr%sizeofPtr != 0 {
696 err = ptrace(req, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
697 if err != nil {
698 return 0, err
699 }
700 n += copy(out, buf[addr%sizeofPtr:])
701 out = out[n:]
702 }
703
704
705 for len(out) > 0 {
706
707
708 err = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
709 if err != nil {
710 return n, err
711 }
712 copied := copy(out, buf[0:])
713 n += copied
714 out = out[copied:]
715 }
716
717 return n, nil
718 }
719
720 func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) {
721 return ptracePeek(PTRACE_PEEKTEXT, pid, addr, out)
722 }
723
724 func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {
725 return ptracePeek(PTRACE_PEEKDATA, pid, addr, out)
726 }
727
728 func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) {
729
730
731
732
733 n := 0
734 if addr%sizeofPtr != 0 {
735 var buf [sizeofPtr]byte
736 err = ptrace(peekReq, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))
737 if err != nil {
738 return 0, err
739 }
740 n += copy(buf[addr%sizeofPtr:], data)
741 word := *((*uintptr)(unsafe.Pointer(&buf[0])))
742 err = ptrace(pokeReq, pid, addr-addr%sizeofPtr, word)
743 if err != nil {
744 return 0, err
745 }
746 data = data[n:]
747 }
748
749
750 for len(data) > sizeofPtr {
751 word := *((*uintptr)(unsafe.Pointer(&data[0])))
752 err = ptrace(pokeReq, pid, addr+uintptr(n), word)
753 if err != nil {
754 return n, err
755 }
756 n += sizeofPtr
757 data = data[sizeofPtr:]
758 }
759
760
761 if len(data) > 0 {
762 var buf [sizeofPtr]byte
763 err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))
764 if err != nil {
765 return n, err
766 }
767 copy(buf[0:], data)
768 word := *((*uintptr)(unsafe.Pointer(&buf[0])))
769 err = ptrace(pokeReq, pid, addr+uintptr(n), word)
770 if err != nil {
771 return n, err
772 }
773 n += len(data)
774 }
775
776 return n, nil
777 }
778
779 func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) {
780 return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, pid, addr, data)
781 }
782
783 func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) {
784 return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data)
785 }
786
787 func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
788 return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
789 }
790
791 func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
792 return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
793 }
794
795 func PtraceSetOptions(pid int, options int) (err error) {
796 return ptrace(PTRACE_SETOPTIONS, pid, 0, uintptr(options))
797 }
798
799 func PtraceGetEventMsg(pid int) (msg uint, err error) {
800 var data _C_long
801 err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data)))
802 msg = uint(data)
803 return
804 }
805
806 func PtraceCont(pid int, signal int) (err error) {
807 return ptrace(PTRACE_CONT, pid, 0, uintptr(signal))
808 }
809
810 func PtraceSyscall(pid int, signal int) (err error) {
811 return ptrace(PTRACE_SYSCALL, pid, 0, uintptr(signal))
812 }
813
814 func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) }
815
816 func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) }
817
818 func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) }
819
820
821
822 func Reboot(cmd int) (err error) {
823 return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "")
824 }
825
826 func clen(n []byte) int {
827 for i := 0; i < len(n); i++ {
828 if n[i] == 0 {
829 return i
830 }
831 }
832 return len(n)
833 }
834
835 func ReadDirent(fd int, buf []byte) (n int, err error) {
836 return Getdents(fd, buf)
837 }
838
839 func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) {
840 origlen := len(buf)
841 count = 0
842 for max != 0 && len(buf) > 0 {
843 dirent := (*Dirent)(unsafe.Pointer(&buf[0]))
844 buf = buf[dirent.Reclen:]
845 if dirent.Ino == 0 {
846 continue
847 }
848 bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0]))
849 var name = string(bytes[0:clen(bytes[:])])
850 if name == "." || name == ".." {
851 continue
852 }
853 max--
854 count++
855 names = append(names, name)
856 }
857 return origlen - len(buf), count, names
858 }
859
860
861
862 func Mount(source string, target string, fstype string, flags uintptr, data string) (err error) {
863
864
865 if data == "" {
866 return mount(source, target, fstype, flags, nil)
867 }
868 datap, err := BytePtrFromString(data)
869 if err != nil {
870 return err
871 }
872 return mount(source, target, fstype, flags, datap)
873 }
874
875
876
877
878
879 880 881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966 var mapper = &mmapper{
967 active: make(map[*byte][]byte),
968 mmap: mmap,
969 munmap: munmap,
970 }
971
972 func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
973 return mapper.Mmap(fd, offset, length, prot, flags)
974 }
975
976 func Munmap(b []byte) (err error) {
977 return mapper.Munmap(b)
978 }
979
980
981
982
983
984
985
986
987 988 989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
View as plain text