...

Source file src/pkg/cmd/vendor/golang.org/x/sys/unix/syscall_dragonfly.go

     1	// Copyright 2009 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.
     4	
     5	// DragonFly BSD 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.
     9	// 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.
    12	
    13	package unix
    14	
    15	import "unsafe"
    16	
    17	// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets.
    18	type SockaddrDatalink struct {
    19		Len    uint8
    20		Family uint8
    21		Index  uint16
    22		Type   uint8
    23		Nlen   uint8
    24		Alen   uint8
    25		Slen   uint8
    26		Data   [12]int8
    27		Rcf    uint16
    28		Route  [16]uint16
    29		raw    RawSockaddrDatalink
    30	}
    31	
    32	// Translate "kern.hostname" to []_C_int{0,1,2,3}.
    33	func nametomib(name string) (mib []_C_int, err error) {
    34		const siz = unsafe.Sizeof(mib[0])
    35	
    36		// NOTE(rsc): It seems strange to set the buffer to have
    37		// size CTL_MAXNAME+2 but use only CTL_MAXNAME
    38		// as the size. I don't know why the +2 is here, but the
    39		// kernel uses +2 for its own implementation of this function.
    40		// I am scared that if we don't include the +2 here, the kernel
    41		// will silently write 2 words farther than we specify
    42		// and we'll get memory corruption.
    43		var buf [CTL_MAXNAME + 2]_C_int
    44		n := uintptr(CTL_MAXNAME) * siz
    45	
    46		p := (*byte)(unsafe.Pointer(&buf[0]))
    47		bytes, err := ByteSliceFromString(name)
    48		if err != nil {
    49			return nil, err
    50		}
    51	
    52		// Magic sysctl: "setting" 0.3 to a string name
    53		// lets you read back the array of integers form.
    54		if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil {
    55			return nil, err
    56		}
    57		return buf[0 : n/siz], nil
    58	}
    59	
    60	//sysnb pipe() (r int, w int, err error)
    61	
    62	func Pipe(p []int) (err error) {
    63		if len(p) != 2 {
    64			return EINVAL
    65		}
    66		p[0], p[1], err = pipe()
    67		return
    68	}
    69	
    70	//sys	extpread(fd int, p []byte, flags int, offset int64) (n int, err error)
    71	func Pread(fd int, p []byte, offset int64) (n int, err error) {
    72		return extpread(fd, p, 0, offset)
    73	}
    74	
    75	//sys	extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error)
    76	func Pwrite(fd int, p []byte, offset int64) (n int, err error) {
    77		return extpwrite(fd, p, 0, offset)
    78	}
    79	
    80	func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {
    81		var rsa RawSockaddrAny
    82		var len _Socklen = SizeofSockaddrAny
    83		nfd, err = accept4(fd, &rsa, &len, flags)
    84		if err != nil {
    85			return
    86		}
    87		if len > SizeofSockaddrAny {
    88			panic("RawSockaddrAny too small")
    89		}
    90		sa, err = anyToSockaddr(fd, &rsa)
    91		if err != nil {
    92			Close(nfd)
    93			nfd = 0
    94		}
    95		return
    96	}
    97	
    98	const ImplementsGetwd = true
    99	
   100	//sys	Getcwd(buf []byte) (n int, err error) = SYS___GETCWD
   101	
   102	func Getwd() (string, error) {
   103		var buf [PathMax]byte
   104		_, err := Getcwd(buf[0:])
   105		if err != nil {
   106			return "", err
   107		}
   108		n := clen(buf[:])
   109		if n < 1 {
   110			return "", EINVAL
   111		}
   112		return string(buf[:n]), nil
   113	}
   114	
   115	func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
   116		var _p0 unsafe.Pointer
   117		var bufsize uintptr
   118		if len(buf) > 0 {
   119			_p0 = unsafe.Pointer(&buf[0])
   120			bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))
   121		}
   122		r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))
   123		n = int(r0)
   124		if e1 != 0 {
   125			err = e1
   126		}
   127		return
   128	}
   129	
   130	func setattrlistTimes(path string, times []Timespec, flags int) error {
   131		// used on Darwin for UtimesNano
   132		return ENOSYS
   133	}
   134	
   135	//sys	ioctl(fd int, req uint, arg uintptr) (err error)
   136	
   137	// ioctl itself should not be exposed directly, but additional get/set
   138	// functions for specific types are permissible.
   139	
   140	// IoctlSetInt performs an ioctl operation which sets an integer value
   141	// on fd, using the specified request number.
   142	func IoctlSetInt(fd int, req uint, value int) error {
   143		return ioctl(fd, req, uintptr(value))
   144	}
   145	
   146	func ioctlSetWinsize(fd int, req uint, value *Winsize) error {
   147		return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
   148	}
   149	
   150	func ioctlSetTermios(fd int, req uint, value *Termios) error {
   151		return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
   152	}
   153	
   154	// IoctlGetInt performs an ioctl operation which gets an integer value
   155	// from fd, using the specified request number.
   156	func IoctlGetInt(fd int, req uint) (int, error) {
   157		var value int
   158		err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
   159		return value, err
   160	}
   161	
   162	func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
   163		var value Winsize
   164		err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
   165		return &value, err
   166	}
   167	
   168	func IoctlGetTermios(fd int, req uint) (*Termios, error) {
   169		var value Termios
   170		err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
   171		return &value, err
   172	}
   173	
   174	func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error {
   175		err := sysctl(mib, old, oldlen, nil, 0)
   176		if err != nil {
   177			// Utsname members on Dragonfly are only 32 bytes and
   178			// the syscall returns ENOMEM in case the actual value
   179			// is longer.
   180			if err == ENOMEM {
   181				err = nil
   182			}
   183		}
   184		return err
   185	}
   186	
   187	func Uname(uname *Utsname) error {
   188		mib := []_C_int{CTL_KERN, KERN_OSTYPE}
   189		n := unsafe.Sizeof(uname.Sysname)
   190		if err := sysctlUname(mib, &uname.Sysname[0], &n); err != nil {
   191			return err
   192		}
   193		uname.Sysname[unsafe.Sizeof(uname.Sysname)-1] = 0
   194	
   195		mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
   196		n = unsafe.Sizeof(uname.Nodename)
   197		if err := sysctlUname(mib, &uname.Nodename[0], &n); err != nil {
   198			return err
   199		}
   200		uname.Nodename[unsafe.Sizeof(uname.Nodename)-1] = 0
   201	
   202		mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
   203		n = unsafe.Sizeof(uname.Release)
   204		if err := sysctlUname(mib, &uname.Release[0], &n); err != nil {
   205			return err
   206		}
   207		uname.Release[unsafe.Sizeof(uname.Release)-1] = 0
   208	
   209		mib = []_C_int{CTL_KERN, KERN_VERSION}
   210		n = unsafe.Sizeof(uname.Version)
   211		if err := sysctlUname(mib, &uname.Version[0], &n); err != nil {
   212			return err
   213		}
   214	
   215		// The version might have newlines or tabs in it, convert them to
   216		// spaces.
   217		for i, b := range uname.Version {
   218			if b == '\n' || b == '\t' {
   219				if i == len(uname.Version)-1 {
   220					uname.Version[i] = 0
   221				} else {
   222					uname.Version[i] = ' '
   223				}
   224			}
   225		}
   226	
   227		mib = []_C_int{CTL_HW, HW_MACHINE}
   228		n = unsafe.Sizeof(uname.Machine)
   229		if err := sysctlUname(mib, &uname.Machine[0], &n); err != nil {
   230			return err
   231		}
   232		uname.Machine[unsafe.Sizeof(uname.Machine)-1] = 0
   233	
   234		return nil
   235	}
   236	
   237	func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
   238		if raceenabled {
   239			raceReleaseMerge(unsafe.Pointer(&ioSync))
   240		}
   241		return sendfile(outfd, infd, offset, count)
   242	}
   243	
   244	/*
   245	 * Exposed directly
   246	 */
   247	//sys	Access(path string, mode uint32) (err error)
   248	//sys	Adjtime(delta *Timeval, olddelta *Timeval) (err error)
   249	//sys	Chdir(path string) (err error)
   250	//sys	Chflags(path string, flags int) (err error)
   251	//sys	Chmod(path string, mode uint32) (err error)
   252	//sys	Chown(path string, uid int, gid int) (err error)
   253	//sys	Chroot(path string) (err error)
   254	//sys	Close(fd int) (err error)
   255	//sys	Dup(fd int) (nfd int, err error)
   256	//sys	Dup2(from int, to int) (err error)
   257	//sys	Exit(code int)
   258	//sys	Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
   259	//sys	Fchdir(fd int) (err error)
   260	//sys	Fchflags(fd int, flags int) (err error)
   261	//sys	Fchmod(fd int, mode uint32) (err error)
   262	//sys	Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
   263	//sys	Fchown(fd int, uid int, gid int) (err error)
   264	//sys	Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
   265	//sys	Flock(fd int, how int) (err error)
   266	//sys	Fpathconf(fd int, name int) (val int, err error)
   267	//sys	Fstat(fd int, stat *Stat_t) (err error)
   268	//sys	Fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
   269	//sys	Fstatfs(fd int, stat *Statfs_t) (err error)
   270	//sys	Fsync(fd int) (err error)
   271	//sys	Ftruncate(fd int, length int64) (err error)
   272	//sys	Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error)
   273	//sys	Getdtablesize() (size int)
   274	//sysnb	Getegid() (egid int)
   275	//sysnb	Geteuid() (uid int)
   276	//sysnb	Getgid() (gid int)
   277	//sysnb	Getpgid(pid int) (pgid int, err error)
   278	//sysnb	Getpgrp() (pgrp int)
   279	//sysnb	Getpid() (pid int)
   280	//sysnb	Getppid() (ppid int)
   281	//sys	Getpriority(which int, who int) (prio int, err error)
   282	//sysnb	Getrlimit(which int, lim *Rlimit) (err error)
   283	//sysnb	Getrusage(who int, rusage *Rusage) (err error)
   284	//sysnb	Getsid(pid int) (sid int, err error)
   285	//sysnb	Gettimeofday(tv *Timeval) (err error)
   286	//sysnb	Getuid() (uid int)
   287	//sys	Issetugid() (tainted bool)
   288	//sys	Kill(pid int, signum syscall.Signal) (err error)
   289	//sys	Kqueue() (fd int, err error)
   290	//sys	Lchown(path string, uid int, gid int) (err error)
   291	//sys	Link(path string, link string) (err error)
   292	//sys	Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error)
   293	//sys	Listen(s int, backlog int) (err error)
   294	//sys	Lstat(path string, stat *Stat_t) (err error)
   295	//sys	Mkdir(path string, mode uint32) (err error)
   296	//sys	Mkdirat(dirfd int, path string, mode uint32) (err error)
   297	//sys	Mkfifo(path string, mode uint32) (err error)
   298	//sys	Mknod(path string, mode uint32, dev int) (err error)
   299	//sys	Mknodat(fd int, path string, mode uint32, dev int) (err error)
   300	//sys	Nanosleep(time *Timespec, leftover *Timespec) (err error)
   301	//sys	Open(path string, mode int, perm uint32) (fd int, err error)
   302	//sys	Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
   303	//sys	Pathconf(path string, name int) (val int, err error)
   304	//sys	read(fd int, p []byte) (n int, err error)
   305	//sys	Readlink(path string, buf []byte) (n int, err error)
   306	//sys	Rename(from string, to string) (err error)
   307	//sys	Renameat(fromfd int, from string, tofd int, to string) (err error)
   308	//sys	Revoke(path string) (err error)
   309	//sys	Rmdir(path string) (err error)
   310	//sys	Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK
   311	//sys	Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
   312	//sysnb	Setegid(egid int) (err error)
   313	//sysnb	Seteuid(euid int) (err error)
   314	//sysnb	Setgid(gid int) (err error)
   315	//sys	Setlogin(name string) (err error)
   316	//sysnb	Setpgid(pid int, pgid int) (err error)
   317	//sys	Setpriority(which int, who int, prio int) (err error)
   318	//sysnb	Setregid(rgid int, egid int) (err error)
   319	//sysnb	Setreuid(ruid int, euid int) (err error)
   320	//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
   321	//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
   322	//sysnb	Setrlimit(which int, lim *Rlimit) (err error)
   323	//sysnb	Setsid() (pid int, err error)
   324	//sysnb	Settimeofday(tp *Timeval) (err error)
   325	//sysnb	Setuid(uid int) (err error)
   326	//sys	Stat(path string, stat *Stat_t) (err error)
   327	//sys	Statfs(path string, stat *Statfs_t) (err error)
   328	//sys	Symlink(path string, link string) (err error)
   329	//sys	Symlinkat(oldpath string, newdirfd int, newpath string) (err error)
   330	//sys	Sync() (err error)
   331	//sys	Truncate(path string, length int64) (err error)
   332	//sys	Umask(newmask int) (oldmask int)
   333	//sys	Undelete(path string) (err error)
   334	//sys	Unlink(path string) (err error)
   335	//sys	Unlinkat(dirfd int, path string, flags int) (err error)
   336	//sys	Unmount(path string, flags int) (err error)
   337	//sys	write(fd int, p []byte) (n int, err error)
   338	//sys   mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
   339	//sys   munmap(addr uintptr, length uintptr) (err error)
   340	//sys	readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
   341	//sys	writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE
   342	//sys	accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error)
   343	//sys	utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
   344	
   345	/*
   346	 * Unimplemented
   347	 * TODO(jsing): Update this list for DragonFly.
   348	 */
   349	// Profil
   350	// Sigaction
   351	// Sigprocmask
   352	// Getlogin
   353	// Sigpending
   354	// Sigaltstack
   355	// Reboot
   356	// Execve
   357	// Vfork
   358	// Sbrk
   359	// Sstk
   360	// Ovadvise
   361	// Mincore
   362	// Setitimer
   363	// Swapon
   364	// Select
   365	// Sigsuspend
   366	// Readv
   367	// Writev
   368	// Nfssvc
   369	// Getfh
   370	// Quotactl
   371	// Mount
   372	// Csops
   373	// Waitid
   374	// Add_profil
   375	// Kdebug_trace
   376	// Sigreturn
   377	// Atsocket
   378	// Kqueue_from_portset_np
   379	// Kqueue_portset
   380	// Getattrlist
   381	// Setattrlist
   382	// Getdirentriesattr
   383	// Searchfs
   384	// Delete
   385	// Copyfile
   386	// Watchevent
   387	// Waitevent
   388	// Modwatch
   389	// Getxattr
   390	// Fgetxattr
   391	// Setxattr
   392	// Fsetxattr
   393	// Removexattr
   394	// Fremovexattr
   395	// Listxattr
   396	// Flistxattr
   397	// Fsctl
   398	// Initgroups
   399	// Posix_spawn
   400	// Nfsclnt
   401	// Fhopen
   402	// Minherit
   403	// Semsys
   404	// Msgsys
   405	// Shmsys
   406	// Semctl
   407	// Semget
   408	// Semop
   409	// Msgctl
   410	// Msgget
   411	// Msgsnd
   412	// Msgrcv
   413	// Shmat
   414	// Shmctl
   415	// Shmdt
   416	// Shmget
   417	// Shm_open
   418	// Shm_unlink
   419	// Sem_open
   420	// Sem_close
   421	// Sem_unlink
   422	// Sem_wait
   423	// Sem_trywait
   424	// Sem_post
   425	// Sem_getvalue
   426	// Sem_init
   427	// Sem_destroy
   428	// Open_extended
   429	// Umask_extended
   430	// Stat_extended
   431	// Lstat_extended
   432	// Fstat_extended
   433	// Chmod_extended
   434	// Fchmod_extended
   435	// Access_extended
   436	// Settid
   437	// Gettid
   438	// Setsgroups
   439	// Getsgroups
   440	// Setwgroups
   441	// Getwgroups
   442	// Mkfifo_extended
   443	// Mkdir_extended
   444	// Identitysvc
   445	// Shared_region_check_np
   446	// Shared_region_map_np
   447	// __pthread_mutex_destroy
   448	// __pthread_mutex_init
   449	// __pthread_mutex_lock
   450	// __pthread_mutex_trylock
   451	// __pthread_mutex_unlock
   452	// __pthread_cond_init
   453	// __pthread_cond_destroy
   454	// __pthread_cond_broadcast
   455	// __pthread_cond_signal
   456	// Setsid_with_pid
   457	// __pthread_cond_timedwait
   458	// Aio_fsync
   459	// Aio_return
   460	// Aio_suspend
   461	// Aio_cancel
   462	// Aio_error
   463	// Aio_read
   464	// Aio_write
   465	// Lio_listio
   466	// __pthread_cond_wait
   467	// Iopolicysys
   468	// __pthread_kill
   469	// __pthread_sigmask
   470	// __sigwait
   471	// __disable_threadsignal
   472	// __pthread_markcancel
   473	// __pthread_canceled
   474	// __semwait_signal
   475	// Proc_info
   476	// Stat64_extended
   477	// Lstat64_extended
   478	// Fstat64_extended
   479	// __pthread_chdir
   480	// __pthread_fchdir
   481	// Audit
   482	// Auditon
   483	// Getauid
   484	// Setauid
   485	// Getaudit
   486	// Setaudit
   487	// Getaudit_addr
   488	// Setaudit_addr
   489	// Auditctl
   490	// Bsdthread_create
   491	// Bsdthread_terminate
   492	// Stack_snapshot
   493	// Bsdthread_register
   494	// Workq_open
   495	// Workq_ops
   496	// __mac_execve
   497	// __mac_syscall
   498	// __mac_get_file
   499	// __mac_set_file
   500	// __mac_get_link
   501	// __mac_set_link
   502	// __mac_get_proc
   503	// __mac_set_proc
   504	// __mac_get_fd
   505	// __mac_set_fd
   506	// __mac_get_pid
   507	// __mac_get_lcid
   508	// __mac_get_lctx
   509	// __mac_set_lctx
   510	// Setlcid
   511	// Read_nocancel
   512	// Write_nocancel
   513	// Open_nocancel
   514	// Close_nocancel
   515	// Wait4_nocancel
   516	// Recvmsg_nocancel
   517	// Sendmsg_nocancel
   518	// Recvfrom_nocancel
   519	// Accept_nocancel
   520	// Fcntl_nocancel
   521	// Select_nocancel
   522	// Fsync_nocancel
   523	// Connect_nocancel
   524	// Sigsuspend_nocancel
   525	// Readv_nocancel
   526	// Writev_nocancel
   527	// Sendto_nocancel
   528	// Pread_nocancel
   529	// Pwrite_nocancel
   530	// Waitid_nocancel
   531	// Msgsnd_nocancel
   532	// Msgrcv_nocancel
   533	// Sem_wait_nocancel
   534	// Aio_suspend_nocancel
   535	// __sigwait_nocancel
   536	// __semwait_signal_nocancel
   537	// __mac_mount
   538	// __mac_get_mount
   539	// __mac_getfsstat
   540	

View as plain text