diff options
| author | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 | 
|---|---|---|
| committer | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 | 
| commit | f154da9e12608589e8d5f0508f908a0c3e88a1bb (patch) | |
| tree | f8255d51e10c6f1e0ed69702200b966c9556a431 /src/syscall/syscall_dragonfly.go | |
| parent | 8d8329ed5dfb9622c82a9fbec6fd99a580f9c9f6 (diff) | |
| download | golang-f154da9e12608589e8d5f0508f908a0c3e88a1bb.tar.gz | |
Imported Upstream version 1.4upstream/1.4
Diffstat (limited to 'src/syscall/syscall_dragonfly.go')
| -rw-r--r-- | src/syscall/syscall_dragonfly.go | 408 | 
1 files changed, 408 insertions, 0 deletions
| diff --git a/src/syscall/syscall_dragonfly.go b/src/syscall/syscall_dragonfly.go new file mode 100644 index 000000000..39c51df7e --- /dev/null +++ b/src/syscall/syscall_dragonfly.go @@ -0,0 +1,408 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// FreeBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package syscall + +import "unsafe" + +type SockaddrDatalink struct { +	Len    uint8 +	Family uint8 +	Index  uint16 +	Type   uint8 +	Nlen   uint8 +	Alen   uint8 +	Slen   uint8 +	Data   [12]int8 +	Rcf    uint16 +	Route  [16]uint16 +	raw    RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { +	const siz = unsafe.Sizeof(mib[0]) + +	// NOTE(rsc): It seems strange to set the buffer to have +	// size CTL_MAXNAME+2 but use only CTL_MAXNAME +	// as the size.  I don't know why the +2 is here, but the +	// kernel uses +2 for its own implementation of this function. +	// I am scared that if we don't include the +2 here, the kernel +	// will silently write 2 words farther than we specify +	// and we'll get memory corruption. +	var buf [CTL_MAXNAME + 2]_C_int +	n := uintptr(CTL_MAXNAME) * siz + +	p := (*byte)(unsafe.Pointer(&buf[0])) +	bytes, err := ByteSliceFromString(name) +	if err != nil { +		return nil, err +	} + +	// Magic sysctl: "setting" 0.3 to a string name +	// lets you read back the array of integers form. +	if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { +		return nil, err +	} +	return buf[0 : n/siz], nil +} + +// ParseDirent parses up to max directory entries in buf, +// appending the names to names.  It returns the number +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { +	origlen := len(buf) +	for max != 0 && len(buf) > 0 { +		dirent := (*Dirent)(unsafe.Pointer(&buf[0])) +		reclen := int(16+dirent.Namlen+1+7) & ^7 +		buf = buf[reclen:] +		if dirent.Fileno == 0 { // File absent in directory. +			continue +		} +		bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) +		var name = string(bytes[0:dirent.Namlen]) +		if name == "." || name == ".." { // Useless names +			continue +		} +		max-- +		count++ +		names = append(names, name) +	} +	return origlen - len(buf), count, names +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { +	if len(p) != 2 { +		return EINVAL +	} +	p[0], p[1], err = pipe() +	return +} + +//sys	extpread(fd int, p []byte, flags int, offset int64) (n int, err error) +func Pread(fd int, p []byte, offset int64) (n int, err error) { +	return extpread(fd, p, 0, offset) +} + +//sys	extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { +	return extpwrite(fd, p, 0, offset) +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { +	var _p0 unsafe.Pointer +	var bufsize uintptr +	if len(buf) > 0 { +		_p0 = unsafe.Pointer(&buf[0]) +		bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) +	} +	r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) +	n = int(r0) +	if e1 != 0 { +		err = e1 +	} +	return +} + +/* + * Exposed directly + */ +//sys	Access(path string, mode uint32) (err error) +//sys	Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys	Chdir(path string) (err error) +//sys	Chflags(path string, flags int) (err error) +//sys	Chmod(path string, mode uint32) (err error) +//sys	Chown(path string, uid int, gid int) (err error) +//sys	Chroot(path string) (err error) +//sys	Close(fd int) (err error) +//sysnb	Dup(fd int) (nfd int, err error) +//sysnb	Dup2(from int, to int) (err error) +//sys	Exit(code int) +//sys	Fchdir(fd int) (err error) +//sys	Fchflags(fd int, flags int) (err error) +//sys	Fchmod(fd int, mode uint32) (err error) +//sys	Fchown(fd int, uid int, gid int) (err error) +//sys	Flock(fd int, how int) (err error) +//sys	Fpathconf(fd int, name int) (val int, err error) +//sys	Fstat(fd int, stat *Stat_t) (err error) +//sys	Fstatfs(fd int, stat *Statfs_t) (err error) +//sys	Fsync(fd int) (err error) +//sys	Ftruncate(fd int, length int64) (err error) +//sys	Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys	Getdtablesize() (size int) +//sysnb	Getegid() (egid int) +//sysnb	Geteuid() (uid int) +//sysnb	Getgid() (gid int) +//sysnb	Getpgid(pid int) (pgid int, err error) +//sysnb	Getpgrp() (pgrp int) +//sysnb	Getpid() (pid int) +//sysnb	Getppid() (ppid int) +//sys	Getpriority(which int, who int) (prio int, err error) +//sysnb	Getrlimit(which int, lim *Rlimit) (err error) +//sysnb	Getrusage(who int, rusage *Rusage) (err error) +//sysnb	Getsid(pid int) (sid int, err error) +//sysnb	Gettimeofday(tv *Timeval) (err error) +//sysnb	Getuid() (uid int) +//sys	Issetugid() (tainted bool) +//sys	Kill(pid int, signum Signal) (err error) +//sys	Kqueue() (fd int, err error) +//sys	Lchown(path string, uid int, gid int) (err error) +//sys	Link(path string, link string) (err error) +//sys	Listen(s int, backlog int) (err error) +//sys	Lstat(path string, stat *Stat_t) (err error) +//sys	Mkdir(path string, mode uint32) (err error) +//sys	Mkfifo(path string, mode uint32) (err error) +//sys	Mknod(path string, mode uint32, dev int) (err error) +//sys	Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys	Open(path string, mode int, perm uint32) (fd int, err error) +//sys	Pathconf(path string, name int) (val int, err error) +//sys	read(fd int, p []byte) (n int, err error) +//sys	Readlink(path string, buf []byte) (n int, err error) +//sys	Rename(from string, to string) (err error) +//sys	Revoke(path string) (err error) +//sys	Rmdir(path string) (err error) +//sys	Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys	Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb	Setegid(egid int) (err error) +//sysnb	Seteuid(euid int) (err error) +//sysnb	Setgid(gid int) (err error) +//sys	Setlogin(name string) (err error) +//sysnb	Setpgid(pid int, pgid int) (err error) +//sys	Setpriority(which int, who int, prio int) (err error) +//sysnb	Setregid(rgid int, egid int) (err error) +//sysnb	Setreuid(ruid int, euid int) (err error) +//sysnb	Setrlimit(which int, lim *Rlimit) (err error) +//sysnb	Setsid() (pid int, err error) +//sysnb	Settimeofday(tp *Timeval) (err error) +//sysnb	Setuid(uid int) (err error) +//sys	Stat(path string, stat *Stat_t) (err error) +//sys	Statfs(path string, stat *Statfs_t) (err error) +//sys	Symlink(path string, link string) (err error) +//sys	Sync() (err error) +//sys	Truncate(path string, length int64) (err error) +//sys	Umask(newmask int) (oldmask int) +//sys	Undelete(path string) (err error) +//sys	Unlink(path string) (err error) +//sys	Unmount(path string, flags int) (err error) +//sys	write(fd int, p []byte) (n int, err error) +//sys   mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys   munmap(addr uintptr, length uintptr) (err error) +//sys	readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys	writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE + +/* + * Unimplemented + * TODO(jsing): Update this list for DragonFly. + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Mmap +// Mlock +// Munlock +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Poll +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// Mlockall +// Munlockall +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Msync_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat | 
