blob: 257d41960fe12959f1aac50a28ebf8c81c9961b0 [file] [log] [blame]
Giles Leanad73de22010-03-26 13:23:54 -07001// Copyright 2009,2010 The Go Authors. All rights reserved.
Devon H. O'Dell0489a262009-11-17 08:20:58 -08002// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// FreeBSD system calls.
6// This file is compiled as ordinary Go code,
7// but it is also input to mksyscall,
8// which parses the //sys lines and generates system call stubs.
Giles Leanad73de22010-03-26 13:23:54 -07009// Note that sometimes we use a lowercase //sys name and wrap
10// it in our own nicer implementation, either here or in
11// syscall_bsd.go or syscall_unix.go.
Devon H. O'Dell0489a262009-11-17 08:20:58 -080012
13package syscall
14
Mikio Harac54ed662011-04-07 12:03:45 -070015import "unsafe"
16
Mikio Hara9c97af92011-02-11 14:34:00 -050017type SockaddrDatalink struct {
18 Len uint8
19 Family uint8
20 Index uint16
21 Type uint8
22 Nlen uint8
23 Alen uint8
24 Slen uint8
25 Data [46]int8
26 raw RawSockaddrDatalink
27}
28
Joel Sing773a9212011-11-17 23:13:49 +110029// Translate "kern.hostname" to []_C_int{0,1,2,3}.
30func nametomib(name string) (mib []_C_int, err error) {
31 const siz = unsafe.Sizeof(mib[0])
32
33 // NOTE(rsc): It seems strange to set the buffer to have
34 // size CTL_MAXNAME+2 but use only CTL_MAXNAME
35 // as the size. I don't know why the +2 is here, but the
36 // kernel uses +2 for its own implementation of this function.
37 // I am scared that if we don't include the +2 here, the kernel
38 // will silently write 2 words farther than we specify
39 // and we'll get memory corruption.
40 var buf [CTL_MAXNAME + 2]_C_int
41 n := uintptr(CTL_MAXNAME) * siz
42
43 p := (*byte)(unsafe.Pointer(&buf[0]))
Alexey Borzenkova1083692012-08-05 17:24:32 -040044 bytes, err := ByteSliceFromString(name)
45 if err != nil {
46 return nil, err
47 }
Joel Sing773a9212011-11-17 23:13:49 +110048
49 // Magic sysctl: "setting" 0.3 to a string name
50 // lets you read back the array of integers form.
51 if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil {
52 return nil, err
53 }
54 return buf[0 : n/siz], nil
55}
56
Mikio Harac54ed662011-04-07 12:03:45 -070057// ParseDirent parses up to max directory entries in buf,
58// appending the names to names. It returns the number
59// bytes consumed from buf, the number of entries added
60// to names, and the new names slice.
61func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) {
62 origlen := len(buf)
63 for max != 0 && len(buf) > 0 {
64 dirent := (*Dirent)(unsafe.Pointer(&buf[0]))
65 if dirent.Reclen == 0 {
66 buf = nil
67 break
68 }
69 buf = buf[dirent.Reclen:]
70 if dirent.Fileno == 0 { // File absent in directory.
71 continue
72 }
73 bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0]))
74 var name = string(bytes[0:dirent.Namlen])
75 if name == "." || name == ".." { // Useless names
76 continue
77 }
78 max--
79 count++
80 names = append(names, name)
81 }
82 return origlen - len(buf), count, names
83}
84
Russ Coxc017a822011-11-13 22:44:52 -050085//sysnb pipe() (r int, w int, err error)
Joel Singeb2b3f52011-07-29 13:47:20 -040086
Russ Coxc017a822011-11-13 22:44:52 -050087func Pipe(p []int) (err error) {
Joel Singeb2b3f52011-07-29 13:47:20 -040088 if len(p) != 2 {
89 return EINVAL
90 }
Russ Coxc017a822011-11-13 22:44:52 -050091 p[0], p[1], err = pipe()
Joel Singeb2b3f52011-07-29 13:47:20 -040092 return
93}
94
Russ Coxc017a822011-11-13 22:44:52 -050095func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {
Mikio Hara3bf75e62014-07-30 10:01:32 +090096 var value IPMreqn
97 vallen := _Socklen(SizeofIPMreqn)
98 errno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
99 return &value, errno
Mikio Hara71517e72011-10-01 18:45:06 +0900100}
101
Mikio Hara3bf75e62014-07-30 10:01:32 +0900102func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {
103 return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq))
Mikio Hara71517e72011-10-01 18:45:06 +0900104}
105
Mikio Haraa918c2c2014-03-04 09:27:48 +0900106func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {
107 var rsa RawSockaddrAny
108 var len _Socklen = SizeofSockaddrAny
109 nfd, err = accept4(fd, &rsa, &len, flags)
110 if err != nil {
111 return
112 }
113 if len > SizeofSockaddrAny {
114 panic("RawSockaddrAny too small")
115 }
116 sa, err = anyToSockaddr(&rsa)
117 if err != nil {
118 Close(nfd)
119 nfd = 0
120 }
121 return
122}
123
Preetam Jinka4abbd4a2014-04-10 13:58:03 +1000124func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
125 var _p0 unsafe.Pointer
126 var bufsize uintptr
127 if len(buf) > 0 {
128 _p0 = unsafe.Pointer(&buf[0])
129 bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
130 }
131 r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))
132 n = int(r0)
133 if e1 != 0 {
134 err = e1
135 }
136 return
137}
138
Devon H. O'Dell0489a262009-11-17 08:20:58 -0800139/*
Devon H. O'Dell0489a262009-11-17 08:20:58 -0800140 * Exposed directly
141 */
Russ Coxc017a822011-11-13 22:44:52 -0500142//sys Access(path string, mode uint32) (err error)
143//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error)
144//sys Chdir(path string) (err error)
145//sys Chflags(path string, flags int) (err error)
146//sys Chmod(path string, mode uint32) (err error)
147//sys Chown(path string, uid int, gid int) (err error)
148//sys Chroot(path string) (err error)
149//sys Close(fd int) (err error)
Ian Lance Taylor28074d52015-03-26 08:02:16 -0700150//sys Dup(fd int) (nfd int, err error)
151//sys Dup2(from int, to int) (err error)
Devon H. O'Dell0489a262009-11-17 08:20:58 -0800152//sys Exit(code int)
Russ Coxc017a822011-11-13 22:44:52 -0500153//sys Fchdir(fd int) (err error)
Shenghou Ma6de184b2013-05-07 05:20:00 +0800154//sys Fchflags(fd int, flags int) (err error)
Russ Coxc017a822011-11-13 22:44:52 -0500155//sys Fchmod(fd int, mode uint32) (err error)
156//sys Fchown(fd int, uid int, gid int) (err error)
157//sys Flock(fd int, how int) (err error)
158//sys Fpathconf(fd int, name int) (val int, err error)
159//sys Fstat(fd int, stat *Stat_t) (err error)
160//sys Fstatfs(fd int, stat *Statfs_t) (err error)
161//sys Fsync(fd int) (err error)
162//sys Ftruncate(fd int, length int64) (err error)
163//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error)
Devon H. O'Dell0489a262009-11-17 08:20:58 -0800164//sys Getdtablesize() (size int)
Ian Lance Taylor4fd41e42011-03-16 19:03:01 -0700165//sysnb Getegid() (egid int)
166//sysnb Geteuid() (uid int)
Ian Lance Taylor4fd41e42011-03-16 19:03:01 -0700167//sysnb Getgid() (gid int)
Russ Coxc017a822011-11-13 22:44:52 -0500168//sysnb Getpgid(pid int) (pgid int, err error)
Ian Lance Taylor4fd41e42011-03-16 19:03:01 -0700169//sysnb Getpgrp() (pgrp int)
170//sysnb Getpid() (pid int)
171//sysnb Getppid() (ppid int)
Russ Coxc017a822011-11-13 22:44:52 -0500172//sys Getpriority(which int, who int) (prio int, err error)
173//sysnb Getrlimit(which int, lim *Rlimit) (err error)
174//sysnb Getrusage(who int, rusage *Rusage) (err error)
175//sysnb Getsid(pid int) (sid int, err error)
176//sysnb Gettimeofday(tv *Timeval) (err error)
Ian Lance Taylor4fd41e42011-03-16 19:03:01 -0700177//sysnb Getuid() (uid int)
Devon H. O'Dell0489a262009-11-17 08:20:58 -0800178//sys Issetugid() (tainted bool)
Mikio Haraadc1e0b2012-02-14 11:20:39 +0900179//sys Kill(pid int, signum Signal) (err error)
Russ Coxc017a822011-11-13 22:44:52 -0500180//sys Kqueue() (fd int, err error)
181//sys Lchown(path string, uid int, gid int) (err error)
182//sys Link(path string, link string) (err error)
183//sys Listen(s int, backlog int) (err error)
184//sys Lstat(path string, stat *Stat_t) (err error)
185//sys Mkdir(path string, mode uint32) (err error)
186//sys Mkfifo(path string, mode uint32) (err error)
187//sys Mknod(path string, mode uint32, dev int) (err error)
188//sys Nanosleep(time *Timespec, leftover *Timespec) (err error)
189//sys Open(path string, mode int, perm uint32) (fd int, err error)
190//sys Pathconf(path string, name int) (val int, err error)
191//sys Pread(fd int, p []byte, offset int64) (n int, err error)
192//sys Pwrite(fd int, p []byte, offset int64) (n int, err error)
Dmitriy Vyukovcffbfae2012-10-09 20:51:58 +0400193//sys read(fd int, p []byte) (n int, err error)
Russ Coxc017a822011-11-13 22:44:52 -0500194//sys Readlink(path string, buf []byte) (n int, err error)
195//sys Rename(from string, to string) (err error)
196//sys Revoke(path string) (err error)
197//sys Rmdir(path string) (err error)
198//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
199//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
200//sysnb Setegid(egid int) (err error)
201//sysnb Seteuid(euid int) (err error)
202//sysnb Setgid(gid int) (err error)
203//sys Setlogin(name string) (err error)
204//sysnb Setpgid(pid int, pgid int) (err error)
205//sys Setpriority(which int, who int, prio int) (err error)
206//sysnb Setregid(rgid int, egid int) (err error)
207//sysnb Setreuid(ruid int, euid int) (err error)
208//sysnb Setrlimit(which int, lim *Rlimit) (err error)
209//sysnb Setsid() (pid int, err error)
210//sysnb Settimeofday(tp *Timeval) (err error)
211//sysnb Setuid(uid int) (err error)
212//sys Stat(path string, stat *Stat_t) (err error)
213//sys Statfs(path string, stat *Statfs_t) (err error)
214//sys Symlink(path string, link string) (err error)
215//sys Sync() (err error)
216//sys Truncate(path string, length int64) (err error)
Giles Lean5aa3a8d2010-02-16 11:43:25 -0800217//sys Umask(newmask int) (oldmask int)
Russ Coxc017a822011-11-13 22:44:52 -0500218//sys Undelete(path string) (err error)
219//sys Unlink(path string) (err error)
220//sys Unmount(path string, flags int) (err error)
Dmitriy Vyukovcffbfae2012-10-09 20:51:58 +0400221//sys write(fd int, p []byte) (n int, err error)
Russ Coxc017a822011-11-13 22:44:52 -0500222//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
223//sys munmap(addr uintptr, length uintptr) (err error)
Dmitriy Vyukovcffbfae2012-10-09 20:51:58 +0400224//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
225//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
Mikio Haraa918c2c2014-03-04 09:27:48 +0900226//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error)
Devon H. O'Dell0489a262009-11-17 08:20:58 -0800227
Devon H. O'Dell0489a262009-11-17 08:20:58 -0800228/*
229 * Unimplemented
230 */
231// Profil
232// Sigaction
233// Sigprocmask
234// Getlogin
235// Sigpending
236// Sigaltstack
237// Ioctl
238// Reboot
239// Execve
240// Vfork
241// Sbrk
242// Sstk
243// Ovadvise
244// Mincore
245// Setitimer
246// Swapon
247// Select
248// Sigsuspend
249// Readv
250// Writev
251// Nfssvc
252// Getfh
253// Quotactl
254// Mount
255// Csops
256// Waitid
257// Add_profil
258// Kdebug_trace
259// Sigreturn
260// Mmap
261// Mlock
262// Munlock
263// Atsocket
264// Kqueue_from_portset_np
265// Kqueue_portset
266// Getattrlist
267// Setattrlist
268// Getdirentriesattr
269// Searchfs
270// Delete
271// Copyfile
272// Poll
273// Watchevent
274// Waitevent
275// Modwatch
276// Getxattr
277// Fgetxattr
278// Setxattr
279// Fsetxattr
280// Removexattr
281// Fremovexattr
282// Listxattr
283// Flistxattr
284// Fsctl
285// Initgroups
286// Posix_spawn
287// Nfsclnt
288// Fhopen
289// Minherit
290// Semsys
291// Msgsys
292// Shmsys
293// Semctl
294// Semget
295// Semop
296// Msgctl
297// Msgget
298// Msgsnd
299// Msgrcv
300// Shmat
301// Shmctl
302// Shmdt
303// Shmget
304// Shm_open
305// Shm_unlink
306// Sem_open
307// Sem_close
308// Sem_unlink
309// Sem_wait
310// Sem_trywait
311// Sem_post
312// Sem_getvalue
313// Sem_init
314// Sem_destroy
315// Open_extended
316// Umask_extended
317// Stat_extended
318// Lstat_extended
319// Fstat_extended
320// Chmod_extended
321// Fchmod_extended
322// Access_extended
323// Settid
324// Gettid
325// Setsgroups
326// Getsgroups
327// Setwgroups
328// Getwgroups
329// Mkfifo_extended
330// Mkdir_extended
331// Identitysvc
332// Shared_region_check_np
333// Shared_region_map_np
334// __pthread_mutex_destroy
335// __pthread_mutex_init
336// __pthread_mutex_lock
337// __pthread_mutex_trylock
338// __pthread_mutex_unlock
339// __pthread_cond_init
340// __pthread_cond_destroy
341// __pthread_cond_broadcast
342// __pthread_cond_signal
343// Setsid_with_pid
344// __pthread_cond_timedwait
345// Aio_fsync
346// Aio_return
347// Aio_suspend
348// Aio_cancel
349// Aio_error
350// Aio_read
351// Aio_write
352// Lio_listio
353// __pthread_cond_wait
354// Iopolicysys
355// Mlockall
356// Munlockall
357// __pthread_kill
358// __pthread_sigmask
359// __sigwait
360// __disable_threadsignal
361// __pthread_markcancel
362// __pthread_canceled
363// __semwait_signal
364// Proc_info
Devon H. O'Dell0489a262009-11-17 08:20:58 -0800365// Stat64_extended
366// Lstat64_extended
367// Fstat64_extended
368// __pthread_chdir
369// __pthread_fchdir
370// Audit
371// Auditon
372// Getauid
373// Setauid
374// Getaudit
375// Setaudit
376// Getaudit_addr
377// Setaudit_addr
378// Auditctl
379// Bsdthread_create
380// Bsdthread_terminate
381// Stack_snapshot
382// Bsdthread_register
383// Workq_open
384// Workq_ops
385// __mac_execve
386// __mac_syscall
387// __mac_get_file
388// __mac_set_file
389// __mac_get_link
390// __mac_set_link
391// __mac_get_proc
392// __mac_set_proc
393// __mac_get_fd
394// __mac_set_fd
395// __mac_get_pid
396// __mac_get_lcid
397// __mac_get_lctx
398// __mac_set_lctx
399// Setlcid
400// Read_nocancel
401// Write_nocancel
402// Open_nocancel
403// Close_nocancel
404// Wait4_nocancel
405// Recvmsg_nocancel
406// Sendmsg_nocancel
407// Recvfrom_nocancel
408// Accept_nocancel
409// Msync_nocancel
410// Fcntl_nocancel
411// Select_nocancel
412// Fsync_nocancel
413// Connect_nocancel
414// Sigsuspend_nocancel
415// Readv_nocancel
416// Writev_nocancel
417// Sendto_nocancel
418// Pread_nocancel
419// Pwrite_nocancel
420// Waitid_nocancel
421// Poll_nocancel
422// Msgsnd_nocancel
423// Msgrcv_nocancel
424// Sem_wait_nocancel
425// Aio_suspend_nocancel
426// __sigwait_nocancel
427// __semwait_signal_nocancel
428// __mac_mount
429// __mac_get_mount
430// __mac_getfsstat