syscall: emulate Flock on AIX
[official-gcc.git] / libgo / go / syscall / libcall_aix.go
blob5afc65e7a1551a62db38b4435f90f00e3acd638b
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.
5 // +build aix
7 package syscall
9 import (
10 "unsafe"
13 //sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
14 //open64at(dirfd _C_int, path *byte, flags _C_int, mode Mode_t) _C_int
16 //sys ptrace(request int, id int, addr uintptr, data int, buff uintptr) (val int)
17 //ptrace(request _C_int, id int, addr uintptr, data _C_int, buff *byte) _C_int
19 //sys ptrace64(request int, id int64, addr int64, data int, buff uintptr) (err error)
20 //ptrace64(request _C_int, id int64, addr int64, data _C_int, buff *byte) _C_int
22 func raw_ptrace(request int, pid int, addr *byte, data *byte) Errno {
23 if request == _PTRACE_TRACEME {
24 // Convert to AIX ptrace call.
25 err := ptrace64(_PT_TRACE_ME, 0, 0, 0, 0)
26 if err != nil {
27 return err.(Errno)
29 return 0
31 return ENOSYS
34 func ptracePeek(pid int, addr uintptr, out []byte) (count int, err error) {
35 n := 0
36 for len(out) > 0 {
37 bsize := len(out)
38 if bsize > 1024 {
39 bsize = 1024
41 err = ptrace64(_PT_READ_BLOCK, int64(pid), int64(addr), bsize, uintptr(unsafe.Pointer(&out[0])))
42 if err != nil {
43 return 0, err
45 addr += uintptr(bsize)
46 n += bsize
47 out = out[n:]
49 return n, nil
52 func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) {
53 return ptracePeek(pid, addr, out)
56 func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {
57 return ptracePeek(pid, addr, out)
60 func ptracePoke(pid int, addr uintptr, data []byte) (count int, err error) {
61 n := 0
62 for len(data) > 0 {
63 bsize := len(data)
64 if bsize > 1024 {
65 bsize = 1024
67 err = ptrace64(_PT_WRITE_BLOCK, int64(pid), int64(addr), bsize, uintptr(unsafe.Pointer(&data[0])))
68 if err != nil {
69 return 0, err
71 addr += uintptr(bsize)
72 n += bsize
73 data = data[n:]
75 return n, nil
78 func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) {
79 return ptracePoke(pid, addr, data)
82 func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) {
83 return ptracePoke(pid, addr, data)
86 func PtraceCont(pid int, signal int) (err error) {
87 return ptrace64(_PT_CONTINUE, int64(pid), 1, signal, 0)
90 func PtraceSingleStep(pid int) (err error) { return ptrace64(_PT_STEP, int64(pid), 1, 0, 0) }
92 func PtraceAttach(pid int) (err error) { return ptrace64(_PT_ATTACH, int64(pid), 0, 0, 0) }
94 func PtraceDetach(pid int) (err error) { return ptrace64(_PT_DETACH, int64(pid), 0, 0, 0) }
96 //sys reboot(how int) (err error)
97 //__linux_reboot(how _C_int) _C_int
98 func Reboot(how int) (err error) {
99 return reboot(how)
102 //sys Acct(path string) (err error)
103 //acct(path *byte) _C_int
105 //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
106 //faccessat(dirfd _C_int, pathname *byte, mode _C_int, flags _C_int) _C_int
108 //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
109 //fchmodat(dirfd _C_int, pathname *byte, mode Mode_t, flags _C_int) _C_int
111 //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
112 //fchownat(dirfd _C_int, path *byte, owner Uid_t, group Gid_t, flags _C_int) _C_int
114 // On AIX, there is no flock() system call, we emulate it.
115 func Flock(fd int, op int) (err error) {
116 lk := &Flock_t{}
117 if (op & LOCK_UN) != 0 {
118 lk.Type = F_UNLCK
119 } else if (op & LOCK_EX) != 0 {
120 lk.Type = F_WRLCK
121 } else if (op & LOCK_SH) != 0 {
122 lk.Type = F_RDLCK
123 } else {
124 return nil
126 if (op & LOCK_NB) != 0 {
127 err = FcntlFlock(uintptr(fd), F_SETLK, lk)
128 if err != nil && (err == EAGAIN || err == EACCES) {
129 return EWOULDBLOCK
131 return err
133 return FcntlFlock(uintptr(fd), F_SETLKW, lk)
136 //sys Fstatfs(fd int, buf *Statfs_t) (err error)
137 //fstatfs64(fd _C_int, buf *Statfs_t) _C_int
139 //sys Mkdirat(dirfd int, path string, mode uint32) (err error)
140 //mkdirat(dirfd _C_int, path *byte, mode Mode_t) _C_int
142 //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
143 //mknodat(dirfd _C_int, path *byte, mode Mode_t, dev _dev_t) _C_int
145 //sys getdirent(fd int, buf []byte) (n int, err error)
146 //getdirent64(fd _C_int, buf *byte, nbyte Size_t) _C_int
148 func ReadDirent(fd int, buf []byte) (n int, err error) {
149 return getdirent(fd, buf)
152 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
153 //renameat(olddirfd _C_int, oldpath *byte, newdirfd _C_int, newpath *byte) _C_int
155 //sys Statfs(path string, buf *Statfs_t) (err error)
156 //statfs64(path *byte, buf *Statfs_t) _C_int
158 //sys unlinkat(dirfd int, path string, flags int) (err error)
159 //unlinkat(dirfd _C_int, path *byte, flags _C_int) _C_int
161 func Unlinkat(dirfd int, path string) (err error) {
162 return unlinkat(dirfd, path, 0)