41 return sysctlMib[i].ctloid, nil |
41 return sysctlMib[i].ctloid, nil |
42 } |
42 } |
43 return nil, EINVAL |
43 return nil, EINVAL |
44 } |
44 } |
45 |
45 |
46 //sysnb pipe(p *[2]_C_int) (err error) |
46 func direntIno(buf []byte) (uint64, bool) { |
|
47 return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno)) |
|
48 } |
|
49 |
|
50 func direntReclen(buf []byte) (uint64, bool) { |
|
51 return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) |
|
52 } |
|
53 |
|
54 func direntNamlen(buf []byte) (uint64, bool) { |
|
55 return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) |
|
56 } |
|
57 |
|
58 func SysctlUvmexp(name string) (*Uvmexp, error) { |
|
59 mib, err := sysctlmib(name) |
|
60 if err != nil { |
|
61 return nil, err |
|
62 } |
|
63 |
|
64 n := uintptr(SizeofUvmexp) |
|
65 var u Uvmexp |
|
66 if err := sysctl(mib, (*byte)(unsafe.Pointer(&u)), &n, nil, 0); err != nil { |
|
67 return nil, err |
|
68 } |
|
69 if n != SizeofUvmexp { |
|
70 return nil, EIO |
|
71 } |
|
72 return &u, nil |
|
73 } |
|
74 |
47 func Pipe(p []int) (err error) { |
75 func Pipe(p []int) (err error) { |
|
76 return Pipe2(p, 0) |
|
77 } |
|
78 |
|
79 //sysnb pipe2(p *[2]_C_int, flags int) (err error) |
|
80 func Pipe2(p []int, flags int) error { |
48 if len(p) != 2 { |
81 if len(p) != 2 { |
49 return EINVAL |
82 return EINVAL |
50 } |
83 } |
51 var pp [2]_C_int |
84 var pp [2]_C_int |
52 err = pipe(&pp) |
85 err := pipe2(&pp, flags) |
53 p[0] = int(pp[0]) |
86 p[0] = int(pp[0]) |
54 p[1] = int(pp[1]) |
87 p[1] = int(pp[1]) |
|
88 return err |
|
89 } |
|
90 |
|
91 //sys Getdents(fd int, buf []byte) (n int, err error) |
|
92 func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { |
|
93 n, err = Getdents(fd, buf) |
|
94 if err != nil || basep == nil { |
|
95 return |
|
96 } |
|
97 |
|
98 var off int64 |
|
99 off, err = Seek(fd, 0, 1 /* SEEK_CUR */) |
|
100 if err != nil { |
|
101 *basep = ^uintptr(0) |
|
102 return |
|
103 } |
|
104 *basep = uintptr(off) |
|
105 if unsafe.Sizeof(*basep) == 8 { |
|
106 return |
|
107 } |
|
108 if off>>32 != 0 { |
|
109 // We can't stuff the offset back into a uintptr, so any |
|
110 // future calls would be suspect. Generate an error. |
|
111 // EIO was allowed by getdirentries. |
|
112 err = EIO |
|
113 } |
55 return |
114 return |
56 } |
|
57 |
|
58 //sys getdents(fd int, buf []byte) (n int, err error) |
|
59 func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { |
|
60 return getdents(fd, buf) |
|
61 } |
115 } |
62 |
116 |
63 const ImplementsGetwd = true |
117 const ImplementsGetwd = true |
64 |
118 |
65 //sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD |
119 //sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD |
102 return ENOSYS |
163 return ENOSYS |
103 } |
164 } |
104 |
165 |
105 //sys ioctl(fd int, req uint, arg uintptr) (err error) |
166 //sys ioctl(fd int, req uint, arg uintptr) (err error) |
106 |
167 |
107 // ioctl itself should not be exposed directly, but additional get/set |
168 //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL |
108 // functions for specific types are permissible. |
169 |
109 |
170 //sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) |
110 // IoctlSetInt performs an ioctl operation which sets an integer value |
171 |
111 // on fd, using the specified request number. |
172 func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { |
112 func IoctlSetInt(fd int, req uint, value int) error { |
173 if len(fds) == 0 { |
113 return ioctl(fd, req, uintptr(value)) |
174 return ppoll(nil, 0, timeout, sigmask) |
114 } |
175 } |
115 |
176 return ppoll(&fds[0], len(fds), timeout, sigmask) |
116 func ioctlSetWinsize(fd int, req uint, value *Winsize) error { |
|
117 return ioctl(fd, req, uintptr(unsafe.Pointer(value))) |
|
118 } |
|
119 |
|
120 func ioctlSetTermios(fd int, req uint, value *Termios) error { |
|
121 return ioctl(fd, req, uintptr(unsafe.Pointer(value))) |
|
122 } |
|
123 |
|
124 // IoctlGetInt performs an ioctl operation which gets an integer value |
|
125 // from fd, using the specified request number. |
|
126 func IoctlGetInt(fd int, req uint) (int, error) { |
|
127 var value int |
|
128 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) |
|
129 return value, err |
|
130 } |
|
131 |
|
132 func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { |
|
133 var value Winsize |
|
134 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) |
|
135 return &value, err |
|
136 } |
|
137 |
|
138 func IoctlGetTermios(fd int, req uint) (*Termios, error) { |
|
139 var value Termios |
|
140 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) |
|
141 return &value, err |
|
142 } |
177 } |
143 |
178 |
144 func Uname(uname *Utsname) error { |
179 func Uname(uname *Utsname) error { |
145 mib := []_C_int{CTL_KERN, KERN_OSTYPE} |
180 mib := []_C_int{CTL_KERN, KERN_OSTYPE} |
146 n := unsafe.Sizeof(uname.Sysname) |
181 n := unsafe.Sizeof(uname.Sysname) |
198 //sys Chown(path string, uid int, gid int) (err error) |
233 //sys Chown(path string, uid int, gid int) (err error) |
199 //sys Chroot(path string) (err error) |
234 //sys Chroot(path string) (err error) |
200 //sys Close(fd int) (err error) |
235 //sys Close(fd int) (err error) |
201 //sys Dup(fd int) (nfd int, err error) |
236 //sys Dup(fd int) (nfd int, err error) |
202 //sys Dup2(from int, to int) (err error) |
237 //sys Dup2(from int, to int) (err error) |
|
238 //sys Dup3(from int, to int, flags int) (err error) |
203 //sys Exit(code int) |
239 //sys Exit(code int) |
204 //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) |
240 //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) |
205 //sys Fchdir(fd int) (err error) |
241 //sys Fchdir(fd int) (err error) |
206 //sys Fchflags(fd int, flags int) (err error) |
242 //sys Fchflags(fd int, flags int) (err error) |
207 //sys Fchmod(fd int, mode uint32) (err error) |
243 //sys Fchmod(fd int, mode uint32) (err error) |
208 //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) |
244 //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) |
209 //sys Fchown(fd int, uid int, gid int) (err error) |
245 //sys Fchown(fd int, uid int, gid int) (err error) |
|
246 //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) |
210 //sys Flock(fd int, how int) (err error) |
247 //sys Flock(fd int, how int) (err error) |
211 //sys Fpathconf(fd int, name int) (val int, err error) |
248 //sys Fpathconf(fd int, name int) (val int, err error) |
212 //sys Fstat(fd int, stat *Stat_t) (err error) |
249 //sys Fstat(fd int, stat *Stat_t) (err error) |
213 //sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) |
250 //sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) |
214 //sys Fstatfs(fd int, stat *Statfs_t) (err error) |
251 //sys Fstatfs(fd int, stat *Statfs_t) (err error) |
231 //sys Issetugid() (tainted bool) |
268 //sys Issetugid() (tainted bool) |
232 //sys Kill(pid int, signum syscall.Signal) (err error) |
269 //sys Kill(pid int, signum syscall.Signal) (err error) |
233 //sys Kqueue() (fd int, err error) |
270 //sys Kqueue() (fd int, err error) |
234 //sys Lchown(path string, uid int, gid int) (err error) |
271 //sys Lchown(path string, uid int, gid int) (err error) |
235 //sys Link(path string, link string) (err error) |
272 //sys Link(path string, link string) (err error) |
|
273 //sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) |
236 //sys Listen(s int, backlog int) (err error) |
274 //sys Listen(s int, backlog int) (err error) |
237 //sys Lstat(path string, stat *Stat_t) (err error) |
275 //sys Lstat(path string, stat *Stat_t) (err error) |
238 //sys Mkdir(path string, mode uint32) (err error) |
276 //sys Mkdir(path string, mode uint32) (err error) |
|
277 //sys Mkdirat(dirfd int, path string, mode uint32) (err error) |
239 //sys Mkfifo(path string, mode uint32) (err error) |
278 //sys Mkfifo(path string, mode uint32) (err error) |
|
279 //sys Mkfifoat(dirfd int, path string, mode uint32) (err error) |
240 //sys Mknod(path string, mode uint32, dev int) (err error) |
280 //sys Mknod(path string, mode uint32, dev int) (err error) |
|
281 //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) |
241 //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) |
282 //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) |
242 //sys Open(path string, mode int, perm uint32) (fd int, err error) |
283 //sys Open(path string, mode int, perm uint32) (fd int, err error) |
|
284 //sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) |
243 //sys Pathconf(path string, name int) (val int, err error) |
285 //sys Pathconf(path string, name int) (val int, err error) |
244 //sys Pread(fd int, p []byte, offset int64) (n int, err error) |
286 //sys Pread(fd int, p []byte, offset int64) (n int, err error) |
245 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) |
287 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) |
246 //sys read(fd int, p []byte) (n int, err error) |
288 //sys read(fd int, p []byte) (n int, err error) |
247 //sys Readlink(path string, buf []byte) (n int, err error) |
289 //sys Readlink(path string, buf []byte) (n int, err error) |
|
290 //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) |
248 //sys Rename(from string, to string) (err error) |
291 //sys Rename(from string, to string) (err error) |
|
292 //sys Renameat(fromfd int, from string, tofd int, to string) (err error) |
249 //sys Revoke(path string) (err error) |
293 //sys Revoke(path string) (err error) |
250 //sys Rmdir(path string) (err error) |
294 //sys Rmdir(path string) (err error) |
251 //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK |
295 //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK |
252 //sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) |
296 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) |
253 //sysnb Setegid(egid int) (err error) |
297 //sysnb Setegid(egid int) (err error) |
254 //sysnb Seteuid(euid int) (err error) |
298 //sysnb Seteuid(euid int) (err error) |
255 //sysnb Setgid(gid int) (err error) |
299 //sysnb Setgid(gid int) (err error) |
256 //sys Setlogin(name string) (err error) |
300 //sys Setlogin(name string) (err error) |
257 //sysnb Setpgid(pid int, pgid int) (err error) |
301 //sysnb Setpgid(pid int, pgid int) (err error) |
266 //sysnb Settimeofday(tp *Timeval) (err error) |
310 //sysnb Settimeofday(tp *Timeval) (err error) |
267 //sysnb Setuid(uid int) (err error) |
311 //sysnb Setuid(uid int) (err error) |
268 //sys Stat(path string, stat *Stat_t) (err error) |
312 //sys Stat(path string, stat *Stat_t) (err error) |
269 //sys Statfs(path string, stat *Statfs_t) (err error) |
313 //sys Statfs(path string, stat *Statfs_t) (err error) |
270 //sys Symlink(path string, link string) (err error) |
314 //sys Symlink(path string, link string) (err error) |
|
315 //sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) |
271 //sys Sync() (err error) |
316 //sys Sync() (err error) |
272 //sys Truncate(path string, length int64) (err error) |
317 //sys Truncate(path string, length int64) (err error) |
273 //sys Umask(newmask int) (oldmask int) |
318 //sys Umask(newmask int) (oldmask int) |
274 //sys Unlink(path string) (err error) |
319 //sys Unlink(path string) (err error) |
|
320 //sys Unlinkat(dirfd int, path string, flags int) (err error) |
275 //sys Unmount(path string, flags int) (err error) |
321 //sys Unmount(path string, flags int) (err error) |
276 //sys write(fd int, p []byte) (n int, err error) |
322 //sys write(fd int, p []byte) (n int, err error) |
277 //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) |
323 //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) |
278 //sys munmap(addr uintptr, length uintptr) (err error) |
324 //sys munmap(addr uintptr, length uintptr) (err error) |
279 //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ |
325 //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ |