1
2
3
4
5
6
7
8 package unix
9
10 import (
11 "syscall"
12 "unsafe"
13 )
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
70 _, _, e1 := Syscall6(SYS_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset>>32), uintptr(offset), uintptr(length>>32), uintptr(length))
71 if e1 != 0 {
72 err = errnoErr(e1)
73 }
74 return
75 }
76
77 func seek(fd int, offset int64, whence int) (int64, syscall.Errno) {
78 var newoffset int64
79 offsetLow := uint32(offset & 0xffffffff)
80 offsetHigh := uint32((offset >> 32) & 0xffffffff)
81 _, _, err := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offsetHigh), uintptr(offsetLow), uintptr(unsafe.Pointer(&newoffset)), uintptr(whence), 0)
82 return newoffset, err
83 }
84
85 func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
86 newoffset, errno := seek(fd, offset, whence)
87 if errno != 0 {
88 return 0, errno
89 }
90 return newoffset, nil
91 }
92
93 func Fstatfs(fd int, buf *Statfs_t) (err error) {
94 _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
95 if e != 0 {
96 err = e
97 }
98 return
99 }
100
101 func Statfs(path string, buf *Statfs_t) (err error) {
102 pathp, err := BytePtrFromString(path)
103 if err != nil {
104 return err
105 }
106 _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
107 if e != 0 {
108 err = e
109 }
110 return
111 }
112
113
114
115 func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
116 page := uintptr(offset / 4096)
117 if offset != int64(page)*4096 {
118 return 0, EINVAL
119 }
120 return mmap2(addr, length, prot, flags, fd, page)
121 }
122
123 func setTimespec(sec, nsec int64) Timespec {
124 return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
125 }
126
127 func setTimeval(sec, usec int64) Timeval {
128 return Timeval{Sec: int32(sec), Usec: int32(usec)}
129 }
130
131 type rlimit32 struct {
132 Cur uint32
133 Max uint32
134 }
135
136
137
138 const rlimInf32 = ^uint32(0)
139 const rlimInf64 = ^uint64(0)
140
141 func Getrlimit(resource int, rlim *Rlimit) (err error) {
142 err = Prlimit(0, resource, nil, rlim)
143 if err != ENOSYS {
144 return err
145 }
146
147 rl := rlimit32{}
148 err = getrlimit(resource, &rl)
149 if err != nil {
150 return
151 }
152
153 if rl.Cur == rlimInf32 {
154 rlim.Cur = rlimInf64
155 } else {
156 rlim.Cur = uint64(rl.Cur)
157 }
158
159 if rl.Max == rlimInf32 {
160 rlim.Max = rlimInf64
161 } else {
162 rlim.Max = uint64(rl.Max)
163 }
164 return
165 }
166
167
168
169 func Setrlimit(resource int, rlim *Rlimit) (err error) {
170 err = Prlimit(0, resource, rlim, nil)
171 if err != ENOSYS {
172 return err
173 }
174
175 rl := rlimit32{}
176 if rlim.Cur == rlimInf64 {
177 rl.Cur = rlimInf32
178 } else if rlim.Cur < uint64(rlimInf32) {
179 rl.Cur = uint32(rlim.Cur)
180 } else {
181 return EINVAL
182 }
183 if rlim.Max == rlimInf64 {
184 rl.Max = rlimInf32
185 } else if rlim.Max < uint64(rlimInf32) {
186 rl.Max = uint32(rlim.Max)
187 } else {
188 return EINVAL
189 }
190
191 return setrlimit(resource, &rl)
192 }
193
194 func (r *PtraceRegs) PC() uint32 { return r.Nip }
195
196 func (r *PtraceRegs) SetPC(pc uint32) { r.Nip = pc }
197
198 func (iov *Iovec) SetLen(length int) {
199 iov.Len = uint32(length)
200 }
201
202 func (msghdr *Msghdr) SetControllen(length int) {
203 msghdr.Controllen = uint32(length)
204 }
205
206 func (msghdr *Msghdr) SetIovlen(length int) {
207 msghdr.Iovlen = uint32(length)
208 }
209
210 func (cmsg *Cmsghdr) SetLen(length int) {
211 cmsg.Len = uint32(length)
212 }
213
214 func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) {
215 rsa.Service_name_len = uint32(length)
216 }
217
218
219
220 func SyncFileRange(fd int, off int64, n int64, flags int) error {
221
222
223 return syncFileRange2(fd, flags, off, n)
224 }
225
226
227
228 func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error {
229 cmdlineLen := len(cmdline)
230 if cmdlineLen > 0 {
231
232
233
234 cmdlineLen++
235 }
236 return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags)
237 }
238
View as plain text