libcall_aix.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. // Copyright 2017 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. // +build aix
  5. package syscall
  6. import (
  7. "unsafe"
  8. )
  9. // For exec_unix.go.
  10. const SYS_EXECVE = 0
  11. //sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
  12. //open64at(dirfd _C_int, path *byte, flags _C_int, mode Mode_t) _C_int
  13. //sys ptrace64(request int, id int64, addr int64, data int, buff uintptr) (err error)
  14. //ptrace64(request _C_int, id int64, addr int64, data _C_int, buff *byte) _C_int
  15. func raw_ptrace(request int, pid int, addr uintptr, data uintptr) Errno {
  16. if request == _PTRACE_TRACEME {
  17. // Convert to AIX ptrace call.
  18. err := ptrace64(_PT_TRACE_ME, 0, 0, 0, 0)
  19. if err != nil {
  20. return err.(Errno)
  21. }
  22. return 0
  23. }
  24. return ENOSYS
  25. }
  26. func ptracePeek(pid int, addr uintptr, out []byte) (count int, err error) {
  27. n := 0
  28. for len(out) > 0 {
  29. bsize := len(out)
  30. if bsize > 1024 {
  31. bsize = 1024
  32. }
  33. err = ptrace64(_PT_READ_BLOCK, int64(pid), int64(addr), bsize, uintptr(unsafe.Pointer(&out[0])))
  34. if err != nil {
  35. return 0, err
  36. }
  37. addr += uintptr(bsize)
  38. n += bsize
  39. out = out[n:]
  40. }
  41. return n, nil
  42. }
  43. func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) {
  44. return ptracePeek(pid, addr, out)
  45. }
  46. func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {
  47. return ptracePeek(pid, addr, out)
  48. }
  49. func ptracePoke(pid int, addr uintptr, data []byte) (count int, err error) {
  50. n := 0
  51. for len(data) > 0 {
  52. bsize := len(data)
  53. if bsize > 1024 {
  54. bsize = 1024
  55. }
  56. err = ptrace64(_PT_WRITE_BLOCK, int64(pid), int64(addr), bsize, uintptr(unsafe.Pointer(&data[0])))
  57. if err != nil {
  58. return 0, err
  59. }
  60. addr += uintptr(bsize)
  61. n += bsize
  62. data = data[n:]
  63. }
  64. return n, nil
  65. }
  66. func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) {
  67. return ptracePoke(pid, addr, data)
  68. }
  69. func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) {
  70. return ptracePoke(pid, addr, data)
  71. }
  72. func PtraceCont(pid int, signal int) (err error) {
  73. return ptrace64(_PT_CONTINUE, int64(pid), 1, signal, 0)
  74. }
  75. func PtraceSingleStep(pid int) (err error) { return ptrace64(_PT_STEP, int64(pid), 1, 0, 0) }
  76. func PtraceAttach(pid int) (err error) { return ptrace64(_PT_ATTACH, int64(pid), 0, 0, 0) }
  77. func PtraceDetach(pid int) (err error) { return ptrace64(_PT_DETACH, int64(pid), 0, 0, 0) }
  78. //sys reboot(how int) (err error)
  79. //__linux_reboot(how _C_int) _C_int
  80. func Reboot(how int) (err error) {
  81. return reboot(how)
  82. }
  83. //sys Acct(path string) (err error)
  84. //acct(path *byte) _C_int
  85. //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
  86. //faccessat(dirfd _C_int, pathname *byte, mode _C_int, flags _C_int) _C_int
  87. //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
  88. //fchmodat(dirfd _C_int, pathname *byte, mode Mode_t, flags _C_int) _C_int
  89. //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
  90. //fchownat(dirfd _C_int, path *byte, owner Uid_t, group Gid_t, flags _C_int) _C_int
  91. //sys Fstatfs(fd int, buf *Statfs_t) (err error)
  92. //fstatfs64(fd _C_int, buf *Statfs_t) _C_int
  93. //sys Mkdirat(dirfd int, path string, mode uint32) (err error)
  94. //mkdirat(dirfd _C_int, path *byte, mode Mode_t) _C_int
  95. //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
  96. //mknodat(dirfd _C_int, path *byte, mode Mode_t, dev _dev_t) _C_int
  97. //sys getdirent(fd int, buf []byte) (n int, err error)
  98. //getdirent64(fd _C_int, buf *byte, nbyte Size_t) _C_int
  99. func ReadDirent(fd int, buf []byte) (n int, err error) {
  100. return getdirent(fd, buf)
  101. }
  102. //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
  103. //renameat(olddirfd _C_int, oldpath *byte, newdirfd _C_int, newpath *byte) _C_int
  104. //sys Statfs(path string, buf *Statfs_t) (err error)
  105. //statfs64(path *byte, buf *Statfs_t) _C_int
  106. //sys unlinkat(dirfd int, path string, flags int) (err error)
  107. //unlinkat(dirfd _C_int, path *byte, flags _C_int) _C_int
  108. func Unlinkat(dirfd int, path string) (err error) {
  109. return unlinkat(dirfd, path, 0)
  110. }
  111. //sys Getkerninfo(op int32, where uintptr, size uintptr, arg int64) (i int32, err error)
  112. //getkerninfo(op _C_int, where *byte, size *byte, arg _C_long) _C_int